Concepts, value, and typical clone scenarios — less code.
Concepts, value, and typical clone scenarios — less code.
Preparing Ring content
Preparing Ring content
Preparing Ring content
MediaConductor is Ring Platform's domain facade for multi-step media generation. It does not reimplement providers — it compiles prompts and delegates to VideoConductor, ImageConductor, AudioConductor, and TextConductor. Its most visible surface is docs article media: every docs page can offer Audible (radio-host narration → TTS), Visual (optional member+ walkthrough video), and Agent (minimized NODUS at /docs/.../nodus.json, indexed from /llms.txt).
Use Founder / Developer tabs in the docs sidebar to filter this page. Founders see the article-header buttons and cost controls; developers see enrichment modules, SHA cache contracts, after() background work, and verified routes.
| Surface | Entry | Output |
|---|---|---|
| Docs Audible | Header Audible → generateDocNarration → ensureTtsAudio | Radio-host audible-text → TTS (tts-audio), public, SHA-cached |
| Docs Visual | Header Visual → generateDocWalkthrough | Summary TTS + optional draft video (video = member+) |
| Docs Agent | Header Create / Agent → ensureLlmText | Minimized docs_article NODUS (llm-text) + clipboard |
| Agent index | /llms.txt | Markdown index linking each article's /nodus.json |
| Background enrich | RSC after(ensureDocsArticleEnrichmentBackground) | Audible + Agent warmed on first article load when missing |
| Scripted media | MediaConductor.generateScript / generateClip | Per-clip video from a ScriptedVideoGenerationRequest |
audible-text + MP3 keyed by a full content SHA-256. Later visits reuse the file. Editing the MDX changes the SHA, so narration regenerates (with an align pass that weaves new facts into the prior script)./llms.txt lists docs; each page exposes /nodus.json. The Create button builds the payload once; Agent (+ copy) copies JSON or the absolute NODUS URL when ready.Prerequisite: MDX docs chrome and audience-curated sidebar that host the Audible / Visual / Agent header.
Depends-on: VideoConductor is the draft walkthrough engine MediaConductor calls for Visual.
See-also: Generative Gallery Upload \| Generate — sibling media surface, not docs walkthrough.
Same-workflow: NewsConductor enriches news articles with TTS and images using the same conductor family.
MediaConductor is Ring Platform's domain facade for multi-step media generation. It does not reimplement providers — it compiles prompts and delegates to VideoConductor, ImageConductor, AudioConductor, and TextConductor. Its most visible surface is docs article media: every docs page can offer Audible (radio-host narration → TTS), Visual (optional member+ walkthrough video), and Agent (minimized NODUS at /docs/.../nodus.json, indexed from /llms.txt).
Use Founder / Developer tabs in the docs sidebar to filter this page. Founders see the article-header buttons and cost controls; developers see enrichment modules, SHA cache contracts, after() background work, and verified routes.
| Surface | Entry | Output |
|---|---|---|
| Docs Audible | Header Audible → generateDocNarration → ensureTtsAudio | Radio-host audible-text → TTS (tts-audio), public, SHA-cached |
| Docs Visual | Header Visual → generateDocWalkthrough | Summary TTS + optional draft video (video = member+) |
| Docs Agent | Header Create / Agent → ensureLlmText | Minimized docs_article NODUS (llm-text) + clipboard |
| Agent index | /llms.txt | Markdown index linking each article's /nodus.json |
| Background enrich | RSC after(ensureDocsArticleEnrichmentBackground) | Audible + Agent warmed on first article load when missing |
| Scripted media | MediaConductor.generateScript / generateClip | Per-clip video from a ScriptedVideoGenerationRequest |
audible-text + MP3 keyed by a full content SHA-256. Later visits reuse the file. Editing the MDX changes the SHA, so narration regenerates (with an align pass that weaves new facts into the prior script)./llms.txt lists docs; each page exposes /nodus.json. The Create button builds the payload once; Agent (+ copy) copies JSON or the absolute NODUS URL when ready.Prerequisite: MDX docs chrome and audience-curated sidebar that host the Audible / Visual / Agent header.
Depends-on: VideoConductor is the draft walkthrough engine MediaConductor calls for Visual.
See-also: Generative Gallery Upload \| Generate — sibling media surface, not docs walkthrough.
Same-workflow: NewsConductor enriches news articles with TTS and images using the same conductor family.
MediaConductor is Ring Platform's domain facade for multi-step media generation. It does not reimplement providers — it compiles prompts and delegates to VideoConductor, ImageConductor, AudioConductor, and TextConductor. Its most visible surface is docs article media: every docs page can offer Audible (radio-host narration → TTS), Visual (optional member+ walkthrough video), and Agent (minimized NODUS at /docs/.../nodus.json, indexed from /llms.txt).
Use Founder / Developer tabs in the docs sidebar to filter this page. Founders see the article-header buttons and cost controls; developers see enrichment modules, SHA cache contracts, after() background work, and verified routes.
| Surface | Entry | Output |
|---|---|---|
| Docs Audible | Header Audible → generateDocNarration → ensureTtsAudio | Radio-host audible-text → TTS (tts-audio), public, SHA-cached |
| Docs Visual | Header Visual → generateDocWalkthrough | Summary TTS + optional draft video (video = member+) |
| Docs Agent | Header Create / Agent → ensureLlmText | Minimized docs_article NODUS (llm-text) + clipboard |
| Agent index | /llms.txt | Markdown index linking each article's /nodus.json |
| Background enrich | RSC after(ensureDocsArticleEnrichmentBackground) | Audible + Agent warmed on first article load when missing |
| Scripted media | MediaConductor.generateScript / generateClip | Per-clip video from a ScriptedVideoGenerationRequest |
audible-text + MP3 keyed by a full content SHA-256. Later visits reuse the file. Editing the MDX changes the SHA, so narration regenerates (with an align pass that weaves new facts into the prior script)./llms.txt lists docs; each page exposes /nodus.json. The Create button builds the payload once; Agent (+ copy) copies JSON or the absolute NODUS URL when ready.Prerequisite: MDX docs chrome and audience-curated sidebar that host the Audible / Visual / Agent header.
Depends-on: VideoConductor is the draft walkthrough engine MediaConductor calls for Visual.
See-also: Generative Gallery Upload \| Generate — sibling media surface, not docs walkthrough.
Same-workflow: NewsConductor enriches news articles with TTS and images using the same conductor family.
Look at the top-right of any docs article: Audible · Visual · Create / Agent. If you just opened a page for the first time, wait for Generating… to finish — Play will then hit the cache.
generateDocNarrationcreateOrGetDocAgentNodusgenerateDocWalkthrough| Article chrome | components/docs/docs-article-shell.tsx | Loads status; after() schedules background enrich when shouldEnrich |
| Header buttons | components/docs/docs-article-media-actions.tsx | Audible / Visual / Agent UI; 2s poll while generating |
| Legacy URL mirror | lib/docs/docs-media-cache.ts | generated_docs_media rows (short hash mirror for walkthrough / narration URLs) |
| Agent NODUS API | app/api/docs/nodus/[locale]/[[...slug]]/route.ts | Public JSON via next.config.mjs rewrites |
| LLM index | app/llms.txt/route.ts | /llms.txt curated Markdown index |
| Schema | data/migrations/045_docs_media_and_enrichment.sql | generated_docs_media + docs_article_enrichment (applied local + prod) |
| Delegates | lib/video, lib/images, lib/audio, lib/text | Video / Image / Audio / Text conductors |
docs_article_enrichment (audible-text / tts-audio / llm-text + history) and generated_docs_media (URL mirror for narration/walkthrough) via db() — registered in BackendSelector + PostgreSQLAdapter.hashArticleContentSha256(locale, slug, plain) = full sha256(\$:$:$`). Ready state requires contentSha256match on enrichment +ttsAudio.contentSha256`.docs-enrich-{locale}-{sha256(slug).slice(0,24)} (stable per locale/slug; content SHA lives in the document body).{AUDIO_STORAGE_PREFIX||generated/audio}/docs/{fullSha256}.mp3 — reuse only when URL, objectKey, and SHA all match; otherwise regenerate.ttsAudio / audibleText / llmText pushed to history.audibles / history.llmTexts with status: 'invalidated'. New audible uses TextConductor TASK_MODE: ALIGN_EXISTING_AUDIBLE when a prior script exists.ensureLlmText builds minimized NODUS (object_type: docs_article, source_content_hash). Public URLs: /docs/<slug>/nodus.json and /:locale/docs/.../nodus.json → rewrite → API route.GET /llms.txt lists absolute /nodus.json links (DEFAULT_LOCALE scan).| Control | Missing | Generating | Ready |
|---|---|---|---|
| Audible | Triggers generateDocNarration | Spinner label | Plays [data-docs-audible-player]; optional show/hide transcript |
| Visual | generateDocWalkthrough({ enableVideo: true }) | Spinner | Shows video when returned; member+ gated |
| Agent | Label Create (agentCreate) → createOrGetDocAgentNodus then clipboard | Spinner | Label Agent + copy icon — copies NODUS JSON or absolute URL |
Client fallback: if shouldEnrich and RSC after() did not finish, ensureDocMediaBackground runs from the client; poll interval is 2000 ms.
Audible is public
generateDocNarration has no auth gate — any visitor may trigger it; cost is amortized via the SHA cache / background enrich.
Visual video requires member+
In generateDocWalkthrough, enableVideo: true requires a session (AUTH_REQUIRED) and hasMemberPrivileges(session.user.role) (MEMBER_REQUIRED). Audio-only walkthroughs have no role gate.
Draft quality for docs video
MediaConductor.generateDocWalkthrough requests qualityMode: 'draft', aspectRatio: '16:9', purpose: 'docs-walkthrough', and persists to Filebase.
MediaConductor is one of several thin domain facades that reuse the shared media conductors without duplicating provider logic:
| Conductor | Path | Role |
|---|---|---|
| MediaConductor | lib/media/conductor/media-conductor.ts | Scripted clips + docs walkthroughs |
| NewsConductor | features/news/conductor/news-conductor.ts | Article generation, translation, publish-time media enrichment (TL;DR + TTS + featured image) |
| WalletConductor | features/wallet/conductor/wallet-conductor.ts | Multi-step wallet ops facade over wallet server actions |
Next-step: member roles that unlock Visual video generation.
Look at the top-right of any docs article: Audible · Visual · Create / Agent. If you just opened a page for the first time, wait for Generating… to finish — Play will then hit the cache.
generateDocNarrationcreateOrGetDocAgentNodusgenerateDocWalkthrough| Article chrome | components/docs/docs-article-shell.tsx | Loads status; after() schedules background enrich when shouldEnrich |
| Header buttons | components/docs/docs-article-media-actions.tsx | Audible / Visual / Agent UI; 2s poll while generating |
| Legacy URL mirror | lib/docs/docs-media-cache.ts | generated_docs_media rows (short hash mirror for walkthrough / narration URLs) |
| Agent NODUS API | app/api/docs/nodus/[locale]/[[...slug]]/route.ts | Public JSON via next.config.mjs rewrites |
| LLM index | app/llms.txt/route.ts | /llms.txt curated Markdown index |
| Schema | data/migrations/045_docs_media_and_enrichment.sql | generated_docs_media + docs_article_enrichment (applied local + prod) |
| Delegates | lib/video, lib/images, lib/audio, lib/text | Video / Image / Audio / Text conductors |
docs_article_enrichment (audible-text / tts-audio / llm-text + history) and generated_docs_media (URL mirror for narration/walkthrough) via db() — registered in BackendSelector + PostgreSQLAdapter.hashArticleContentSha256(locale, slug, plain) = full sha256(\$:$:$`). Ready state requires contentSha256match on enrichment +ttsAudio.contentSha256`.docs-enrich-{locale}-{sha256(slug).slice(0,24)} (stable per locale/slug; content SHA lives in the document body).{AUDIO_STORAGE_PREFIX||generated/audio}/docs/{fullSha256}.mp3 — reuse only when URL, objectKey, and SHA all match; otherwise regenerate.ttsAudio / audibleText / llmText pushed to history.audibles / history.llmTexts with status: 'invalidated'. New audible uses TextConductor TASK_MODE: ALIGN_EXISTING_AUDIBLE when a prior script exists.ensureLlmText builds minimized NODUS (object_type: docs_article, source_content_hash). Public URLs: /docs/<slug>/nodus.json and /:locale/docs/.../nodus.json → rewrite → API route.GET /llms.txt lists absolute /nodus.json links (DEFAULT_LOCALE scan).| Control | Missing | Generating | Ready |
|---|---|---|---|
| Audible | Triggers generateDocNarration | Spinner label | Plays [data-docs-audible-player]; optional show/hide transcript |
| Visual | generateDocWalkthrough({ enableVideo: true }) | Spinner | Shows video when returned; member+ gated |
| Agent | Label Create (agentCreate) → createOrGetDocAgentNodus then clipboard | Spinner | Label Agent + copy icon — copies NODUS JSON or absolute URL |
Client fallback: if shouldEnrich and RSC after() did not finish, ensureDocMediaBackground runs from the client; poll interval is 2000 ms.
Audible is public
generateDocNarration has no auth gate — any visitor may trigger it; cost is amortized via the SHA cache / background enrich.
Visual video requires member+
In generateDocWalkthrough, enableVideo: true requires a session (AUTH_REQUIRED) and hasMemberPrivileges(session.user.role) (MEMBER_REQUIRED). Audio-only walkthroughs have no role gate.
Draft quality for docs video
MediaConductor.generateDocWalkthrough requests qualityMode: 'draft', aspectRatio: '16:9', purpose: 'docs-walkthrough', and persists to Filebase.
MediaConductor is one of several thin domain facades that reuse the shared media conductors without duplicating provider logic:
| Conductor | Path | Role |
|---|---|---|
| MediaConductor | lib/media/conductor/media-conductor.ts | Scripted clips + docs walkthroughs |
| NewsConductor | features/news/conductor/news-conductor.ts | Article generation, translation, publish-time media enrichment (TL;DR + TTS + featured image) |
| WalletConductor | features/wallet/conductor/wallet-conductor.ts | Multi-step wallet ops facade over wallet server actions |
Next-step: member roles that unlock Visual video generation.
Look at the top-right of any docs article: Audible · Visual · Create / Agent. If you just opened a page for the first time, wait for Generating… to finish — Play will then hit the cache.
generateDocNarrationcreateOrGetDocAgentNodusgenerateDocWalkthrough| Article chrome | components/docs/docs-article-shell.tsx | Loads status; after() schedules background enrich when shouldEnrich |
| Header buttons | components/docs/docs-article-media-actions.tsx | Audible / Visual / Agent UI; 2s poll while generating |
| Legacy URL mirror | lib/docs/docs-media-cache.ts | generated_docs_media rows (short hash mirror for walkthrough / narration URLs) |
| Agent NODUS API | app/api/docs/nodus/[locale]/[[...slug]]/route.ts | Public JSON via next.config.mjs rewrites |
| LLM index | app/llms.txt/route.ts | /llms.txt curated Markdown index |
| Schema | data/migrations/045_docs_media_and_enrichment.sql | generated_docs_media + docs_article_enrichment (applied local + prod) |
| Delegates | lib/video, lib/images, lib/audio, lib/text | Video / Image / Audio / Text conductors |
docs_article_enrichment (audible-text / tts-audio / llm-text + history) and generated_docs_media (URL mirror for narration/walkthrough) via db() — registered in BackendSelector + PostgreSQLAdapter.hashArticleContentSha256(locale, slug, plain) = full sha256(\$:$:$`). Ready state requires contentSha256match on enrichment +ttsAudio.contentSha256`.docs-enrich-{locale}-{sha256(slug).slice(0,24)} (stable per locale/slug; content SHA lives in the document body).{AUDIO_STORAGE_PREFIX||generated/audio}/docs/{fullSha256}.mp3 — reuse only when URL, objectKey, and SHA all match; otherwise regenerate.ttsAudio / audibleText / llmText pushed to history.audibles / history.llmTexts with status: 'invalidated'. New audible uses TextConductor TASK_MODE: ALIGN_EXISTING_AUDIBLE when a prior script exists.ensureLlmText builds minimized NODUS (object_type: docs_article, source_content_hash). Public URLs: /docs/<slug>/nodus.json and /:locale/docs/.../nodus.json → rewrite → API route.GET /llms.txt lists absolute /nodus.json links (DEFAULT_LOCALE scan).| Control | Missing | Generating | Ready |
|---|---|---|---|
| Audible | Triggers generateDocNarration | Spinner label | Plays [data-docs-audible-player]; optional show/hide transcript |
| Visual | generateDocWalkthrough({ enableVideo: true }) | Spinner | Shows video when returned; member+ gated |
| Agent | Label Create (agentCreate) → createOrGetDocAgentNodus then clipboard | Spinner | Label Agent + copy icon — copies NODUS JSON or absolute URL |
Client fallback: if shouldEnrich and RSC after() did not finish, ensureDocMediaBackground runs from the client; poll interval is 2000 ms.
Audible is public
generateDocNarration has no auth gate — any visitor may trigger it; cost is amortized via the SHA cache / background enrich.
Visual video requires member+
In generateDocWalkthrough, enableVideo: true requires a session (AUTH_REQUIRED) and hasMemberPrivileges(session.user.role) (MEMBER_REQUIRED). Audio-only walkthroughs have no role gate.
Draft quality for docs video
MediaConductor.generateDocWalkthrough requests qualityMode: 'draft', aspectRatio: '16:9', purpose: 'docs-walkthrough', and persists to Filebase.
MediaConductor is one of several thin domain facades that reuse the shared media conductors without duplicating provider logic:
| Conductor | Path | Role |
|---|---|---|
| MediaConductor | lib/media/conductor/media-conductor.ts | Scripted clips + docs walkthroughs |
| NewsConductor | features/news/conductor/news-conductor.ts | Article generation, translation, publish-time media enrichment (TL;DR + TTS + featured image) |
| WalletConductor | features/wallet/conductor/wallet-conductor.ts | Multi-step wallet ops facade over wallet server actions |
Next-step: member roles that unlock Visual video generation.