From 189e514a48e349c64d30c0f9503e2e9fa92526b5 Mon Sep 17 00:00:00 2001 From: ymote Date: Mon, 25 May 2026 17:03:28 -0700 Subject: [PATCH] feat: add make_type field for octos mofa_make dispatcher (RFC-1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Companion to octos PR feat/rfc1-mofa-make-dispatcher (octos#1290 / PR octos-org/octos#1298). The octos runtime now consolidates the N sibling mofa_* content-generator tools behind a single dispatcher: mofa_make({ content_type: "slides" | "podcast" | ..., args: {...} }) This PR adds the manifest metadata the octos plugin loader reads to build the dispatcher's content_type enum + per-type description text. Fields added to each generator skill's manifest.json: - `make_type`: the content_type discriminator the LLM selects (e.g. "slides", "podcast", "site", "publish", "cards", "comic", "frame", "video", "infographic"). - `content_type_description`: short blurb (single sentence) the octos dispatcher surfaces verbatim in its tool description so the LLM has enough context to pick the right content_type. - `make_target_tool` (mofa-podcast only): explicit override pointing at `podcast_generate` since the conventional `mofa_` -> `mofa_podcast` does not exist; without the override the resolver falls back to "first spawn_only:true tool" which is ALSO `podcast_generate`, but the explicit form documents intent and survives future tool additions. Skills updated (9 total) + version bumps: - mofa-cards 0.4.5 -> 0.4.6 - mofa-comic 0.4.5 -> 0.4.6 - mofa-frame 0.1.0 -> 0.1.1 - mofa-infographic 0.4.5 -> 0.4.6 - mofa-podcast 0.4.6 -> 0.4.7 - mofa-publish 0.1.0 -> 0.1.1 - mofa-site 0.1.0 -> 0.1.1 - mofa-slides 0.5.1 -> 0.5.2 - mofa-youtube 0.1.0 -> 0.1.1 NOT updated (intentionally): - mofa-cli: no tools to register. - mofa-fm: voice management (fm_*) is not a make_* content generator — its tools stay top-level on the LLM-visible surface. Effect after both PRs land: - LLM sees ONE `mofa_make` tool (string enum across the 9 content types above) + companion `mofa_describe_content_type`. - Sibling foreground tools next to a make target (`mofa_list_styles` next to `mofa_slides`, `podcast_voices` next to `podcast_generate`) stay visible to the LLM — only the EXACT generator tool is hidden. - The deferred generator tools remain callable internally via `registry.get(name)` so the dispatcher forwards by name and any gateway/test path that calls them directly keeps working. - The "weak model picks wrong sibling" misroute class (PR octos-org/octos#1265, #1283, mini1 k2.6 misroutes 2026-05-24/25, mini2 deepseek hand-rolled-deck 2026-05-25) is structurally eliminated. The octos runtime tolerates manifests WITHOUT these fields — existing deployments continue to expose each mofa_* tool individually until the octos runtime is upgraded. After upgrade, the new fields take effect on the next octos-side load. Cross-link: octos-org/octos#1290 (RFC-1), octos-org/octos#1298 (server). --- mofa-cards/manifest.json | 4 +++- mofa-comic/manifest.json | 4 +++- mofa-frame/manifest.json | 4 +++- mofa-infographic/manifest.json | 4 +++- mofa-podcast/manifest.json | 5 ++++- mofa-publish/manifest.json | 4 +++- mofa-site/manifest.json | 4 +++- mofa-slides/manifest.json | 4 +++- mofa-youtube/manifest.json | 4 +++- 9 files changed, 28 insertions(+), 9 deletions(-) diff --git a/mofa-cards/manifest.json b/mofa-cards/manifest.json index 27a797d..1017b8d 100644 --- a/mofa-cards/manifest.json +++ b/mofa-cards/manifest.json @@ -1,6 +1,8 @@ { "name": "mofa-cards", - "version": "0.4.5", + "version": "0.4.6", + "make_type": "cards", + "content_type_description": "Trading-card / greeting-card / holiday-card style images (PNG). Each card has a prompt and an optional style variant.", "timeout_secs": 1800, "binaries": { "darwin-aarch64": { diff --git a/mofa-comic/manifest.json b/mofa-comic/manifest.json index 810c43b..978c834 100644 --- a/mofa-comic/manifest.json +++ b/mofa-comic/manifest.json @@ -1,6 +1,8 @@ { "name": "mofa-comic", - "version": "0.4.5", + "version": "0.4.6", + "make_type": "comic", + "content_type_description": "Multi-panel comic strips with AI-generated panel art. Layout can be horizontal, vertical, or grid.", "timeout_secs": 1800, "binaries": { "darwin-aarch64": { diff --git a/mofa-frame/manifest.json b/mofa-frame/manifest.json index 8ac6553..4c899e0 100644 --- a/mofa-frame/manifest.json +++ b/mofa-frame/manifest.json @@ -1,6 +1,8 @@ { "name": "mofa-frame", - "version": "0.1.0", + "version": "0.1.1", + "make_type": "frame", + "content_type_description": "Single PNG frame extracted from a video at a specific timestamp. Use after mofa_youtube to capture key moments from a transcript.", "timeout_secs": 60, "sha256": "17a0c424437c8d26251509377760b7a56cca716d627df83ab6f7ffad454564cc", "tools": [ diff --git a/mofa-infographic/manifest.json b/mofa-infographic/manifest.json index 1385369..0db868d 100644 --- a/mofa-infographic/manifest.json +++ b/mofa-infographic/manifest.json @@ -1,6 +1,8 @@ { "name": "mofa-infographic", - "version": "0.4.5", + "version": "0.4.6", + "make_type": "infographic", + "content_type_description": "Multi-section infographic images (PNG) with AI-generated visuals per section. Header/footer/middle variants, configurable style template.", "timeout_secs": 1800, "binaries": { "darwin-aarch64": { diff --git a/mofa-podcast/manifest.json b/mofa-podcast/manifest.json index fbd7b77..95a7ab4 100644 --- a/mofa-podcast/manifest.json +++ b/mofa-podcast/manifest.json @@ -1,6 +1,9 @@ { "name": "mofa-podcast", - "version": "0.4.6", + "version": "0.4.7", + "make_type": "podcast", + "make_target_tool": "podcast_generate", + "content_type_description": "Multi-speaker podcast audio (mp3/wav). Reads a markdown script, synthesizes voices, concatenates segments with pauses.", "author": "hagency", "description": "Multi-speaker podcast generation with TTS voice synthesis and audio assembly", "timeout_secs": 1800, diff --git a/mofa-publish/manifest.json b/mofa-publish/manifest.json index b6391d7..6a7559c 100644 --- a/mofa-publish/manifest.json +++ b/mofa-publish/manifest.json @@ -1,6 +1,8 @@ { "name": "mofa-publish", - "version": "0.1.0", + "version": "0.1.1", + "make_type": "publish", + "content_type_description": "Deploy a built static site to GitHub Pages or Mac Mini hosting. Handles repo creation, branch setup, file transfer, and verification. Returns the live URL.", "author": "hagency", "description": "Deploy a built static site to GitHub Pages or Mac Mini hosting and verify the live URL.", "timeout_secs": 600, diff --git a/mofa-site/manifest.json b/mofa-site/manifest.json index c08533d..91595e9 100644 --- a/mofa-site/manifest.json +++ b/mofa-site/manifest.json @@ -1,6 +1,8 @@ { "name": "mofa-site", - "version": "0.1.0", + "version": "0.1.1", + "make_type": "site", + "content_type_description": "Static websites: Quarto lesson pages, Astro sites, Next.js apps, React/Vite scaffolds. Pulls content_dir contents into a deployable HTML/JS bundle.", "author": "hagency", "description": "Build or scaffold websites from structured content. Quarto lesson generation is fully implemented; astro-site, nextjs-app, and react-vite are extracted starter templates exposed through the bootstrap helper and a server-backed three-panel studio.", "timeout_secs": 3600, diff --git a/mofa-slides/manifest.json b/mofa-slides/manifest.json index 78c01ef..7046dc7 100644 --- a/mofa-slides/manifest.json +++ b/mofa-slides/manifest.json @@ -1,6 +1,8 @@ { "name": "mofa-slides", - "version": "0.5.1", + "version": "0.5.2", + "make_type": "slides", + "content_type_description": "PPTX presentation decks. Generate AI-illustrated slides with images, optional editable text overlays, multiple style templates.", "timeout_secs": 1800, "binaries": { "darwin-aarch64": { diff --git a/mofa-youtube/manifest.json b/mofa-youtube/manifest.json index ab36910..a617253 100644 --- a/mofa-youtube/manifest.json +++ b/mofa-youtube/manifest.json @@ -1,6 +1,8 @@ { "name": "mofa-youtube", - "version": "0.1.0", + "version": "0.1.1", + "make_type": "video", + "content_type_description": "Process a video or audio source. Downloads from a YouTube URL or accepts a local audio path, transcribes via local ASR, returns markdown transcript with timestamps. Keeps the video file for downstream frame extraction.", "timeout_secs": 1800, "sha256": "fff57bb0f420dcb62070d33614f4e4e1337439b57825560ff294ca925f5e9cb2", "tools": [