@pixeldojo/mcp 0.23.0 → 0.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/cli.cjs +57 -5
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +57 -5
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +57 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +57 -5
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/poll.ts","../src/skills/types.ts","../src/skills/upload-helpers.ts","../src/skills/schema-snap.ts","../src/skills/params.ts","../src/skills/generate.ts","../src/skills/edit.ts","../src/skills/character.ts","../src/skills/storyboard.ts","../src/skills/upscale.ts","../src/skills/caption.ts","../src/skills/overlay.ts","../src/skills/status.ts","../src/skills/from-url.ts","../src/skills/film.ts","../src/skills/video.ts","../src/skills/episode.ts","../src/skills/ad.ts","../src/skills/campaign.ts","../src/skills/campaign-status.ts","../src/skills/upload.ts","../src/skills/audio.ts","../src/skills/library.ts","../src/skills/save.ts","../src/skills/save-character.ts","../src/skills/workflows.ts","../src/skills/index.ts","../src/client.ts","../src/server.ts","../src/redact.ts","../src/index.ts"],"names":["path","extname","stat","basename","readFile","z","buildPayload","run","DEFAULT_MODEL","InputSchema","InputJsonSchema","ALLOWED","MODEL","extractAssetUrls","status","where","labels","exportError","dispatch","plan","produce","STYLES","lines","findSkill","ALL_SKILLS","HOSTED_SKILLS","TOOL_ANNOTATIONS","PixelDojoClient","Server","ListToolsRequestSchema","CallToolRequestSchema","StdioServerTransport"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Exponential-backoff job poller with a 30-second sync window.\n *\n * Per CEO D9 + D14 + Eng E4:\n * - Up to 30 seconds: poll the job synchronously, return assets when complete.\n * - Beyond 30 seconds: hand off — return `{ jobId, statusUrl }` and let the\n * calling LLM follow up via the `pixeldojo_status` tool.\n * - Backoff sequence: 1s → 2s → 4s → 8s → 8s → 8s ... capped at 8s.\n * Halves load on /api/v1/jobs/{id} vs a flat 2s interval.\n *\n * Job-fetcher and clock are dependency-injected so the unit tests can\n * exercise every branch without spinning a real HTTP fetcher or sleeping\n * for real wall-clock time.\n */\n\nexport interface PollableJob {\n jobId: string;\n status: 'pending' | 'queued' | 'processing' | 'completed' | 'failed' | string;\n assets?: Array<{ url: string; type?: string }>;\n output?: unknown;\n /** Provider-side error if the job failed. */\n error?: { code?: string; message?: string } | string;\n}\n\nexport interface PollOptions {\n /** Hard cap on the synchronous wait window. Default: 30_000 ms (per D9). */\n syncBudgetMs?: number;\n /** Override the backoff sequence. Default: [1000, 2000, 4000, 8000]. */\n backoffSequenceMs?: number[];\n /** Cap on the recurring delay once the sequence is exhausted. */\n maxIntervalMs?: number;\n /** Inject a clock for tests. Defaults to `Date.now`. */\n now?: () => number;\n /** Inject a sleeper for tests. Defaults to setTimeout-based wait. */\n sleep?: (ms: number) => Promise<void>;\n /** Optional abort signal — caller can cancel a poll mid-flight. */\n signal?: AbortSignal;\n}\n\nexport type PollResult =\n | { kind: 'completed'; job: PollableJob }\n | { kind: 'failed'; job: PollableJob }\n | { kind: 'handoff'; jobId: string; statusUrl: string };\n\nconst DEFAULT_BACKOFF = [1000, 2000, 4000, 8000];\nconst DEFAULT_MAX_INTERVAL = 8000;\nconst DEFAULT_SYNC_BUDGET_MS = 30_000;\n\nfunction defaultSleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new DOMException('aborted', 'AbortError'));\n return;\n }\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(timer);\n reject(new DOMException('aborted', 'AbortError'));\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n\n/**\n * Poll a job to terminal state OR until the sync budget is exhausted.\n * `fetchJob` returns the latest job snapshot; the poller decides when to\n * call it next.\n */\nexport async function pollJobUntilDoneOrHandoff(\n jobId: string,\n fetchJob: (id: string) => Promise<PollableJob>,\n buildStatusUrl: (id: string) => string,\n options: PollOptions = {},\n): Promise<PollResult> {\n const {\n syncBudgetMs = DEFAULT_SYNC_BUDGET_MS,\n backoffSequenceMs = DEFAULT_BACKOFF,\n maxIntervalMs = DEFAULT_MAX_INTERVAL,\n now = Date.now,\n sleep = (ms) => defaultSleep(ms, options.signal),\n signal,\n } = options;\n\n const start = now();\n let attempt = 0;\n\n while (true) {\n if (signal?.aborted) throw new DOMException('aborted', 'AbortError');\n\n const job = await fetchJob(jobId);\n\n if (job.status === 'completed') return { kind: 'completed', job };\n if (job.status === 'failed') return { kind: 'failed', job };\n\n const elapsed = now() - start;\n const remaining = syncBudgetMs - elapsed;\n if (remaining <= 0) {\n return {\n kind: 'handoff',\n jobId,\n statusUrl: buildStatusUrl(jobId),\n };\n }\n\n const interval =\n attempt < backoffSequenceMs.length ? backoffSequenceMs[attempt] : maxIntervalMs;\n // Don't sleep past the sync deadline — clamp the wait so the next\n // iteration immediately enters the \"remaining <= 0\" branch.\n const wait = Math.min(interval, Math.max(remaining, 0));\n if (wait > 0) await sleep(wait);\n attempt++;\n }\n}\n","/**\n * Shared types for MCP skill modules.\n *\n * Every named skill (pixeldojo_generate, :character, :storyboard, :upscale,\n * :status) exports an object that satisfies `SkillModule`. The server\n * registers them via `registerSkills` in `../server.ts`.\n */\nimport type { z } from 'zod';\nimport type { PixelDojoClient } from '@pixeldojo/sdk';\nimport type { PollResult } from '../poll.js';\n\nexport interface SkillContext {\n /** Header-injected SDK client. Each call has source + skill tag. */\n client: PixelDojoClient;\n /** Raw credentials for surfaces outside /api/v1 (the film pipeline). */\n apiKey: string;\n baseUrl: string;\n /** Resolved version string for the source attribution header. */\n mcpVersion: string;\n /**\n * True only where \"local\" means the caller's own machine (the stdio npm\n * server). The hosted /api/mcp route leaves it unset: there `*_path`\n * fields would read the production container's disk. Fail-closed.\n */\n localFiles?: boolean;\n /** Optional logger that already redacts pd_xxx tokens. */\n logger: { error: (msg: string, ...args: unknown[]) => void };\n /** Build a public statusUrl for a job (used in handoffs). */\n buildStatusUrl: (jobId: string) => string;\n /** Inject sleep / now for testability. Optional in production. */\n pollOverrides?: {\n now?: () => number;\n sleep?: (ms: number) => Promise<void>;\n };\n}\n\nexport type SkillResultText = {\n kind: 'text';\n text: string;\n /**\n * The work is still moving and only advances when the skill is called\n * again (a film's status call dispatches the next frames, clips, score and\n * export): call it with `input` after about `afterSec`. Absent means\n * finished, or waiting on a person (a cost to approve, a refused shot).\n * MCP clients only ever see `text`; the in-app agent reads this to keep a\n * film moving inside one reply instead of asking the user to say continue.\n */\n followUp?: { input: Record<string, unknown>; afterSec: number };\n};\nexport type SkillResultAssets = {\n kind: 'assets';\n text: string;\n assetUrls: string[];\n};\nexport type SkillResultHandoff = {\n kind: 'handoff';\n text: string;\n jobId: string;\n statusUrl: string;\n};\nexport type SkillResult = SkillResultText | SkillResultAssets | SkillResultHandoff;\n\n/**\n * One named skill. The MCP server reads `name`, `description`,\n * `inputSchema` (JSON Schema for `tools/list`) and dispatches via `run`.\n */\nexport interface SkillModule<TInput = unknown> {\n /** MCP tool name, e.g. `pixeldojo_generate`. */\n name: string;\n /** One-line description shown in `tools/list` to the LLM host. */\n description: string;\n /** Replaces `description` on the hosted server when it advertises `*_path` fields. */\n hostedDescription?: string;\n /** Zod schema for typed parsing inside the skill. */\n inputZod: z.ZodType<TInput>;\n /** JSON Schema (object) version for the MCP `tools/list` payload. */\n inputJsonSchema: Record<string, unknown>;\n /**\n * Whitelist of `apiId`s this skill is allowed to dispatch to. Treated as\n * a contract: a user-supplied `model` override must be in this list,\n * otherwise the skill returns an `UnknownModelError` with the list.\n * `null` means \"any registered model\" (used by `pixeldojo_generate`).\n */\n allowedModels: string[] | null;\n /** Default `apiId` if the user doesn't pass `model`. */\n defaultModel: string;\n /** Run the skill end-to-end. Returns a structured SkillResult. */\n run(input: TInput, ctx: SkillContext): Promise<SkillResult>;\n}\n\n/**\n * Render a `PollResult` as a `SkillResult`. Centralized so every skill\n * surfaces handoff / completion / failure consistently.\n */\nexport function pollResultToSkillResult(\n result: PollResult,\n successText: (urls: string[]) => string,\n): SkillResult {\n if (result.kind === 'completed') {\n const urls = extractAssetUrls(result.job);\n return {\n kind: 'assets',\n text: successText(urls),\n assetUrls: urls,\n };\n }\n if (result.kind === 'failed') {\n const errMsg =\n typeof result.job.error === 'string'\n ? result.job.error\n : result.job.error?.message ?? 'Unknown provider error';\n return {\n kind: 'text',\n text: `Job ${result.job.jobId} failed: ${errMsg}`,\n };\n }\n return {\n kind: 'handoff',\n text:\n `Job ${result.jobId} is still running after the 30s sync window. ` +\n `Use pixeldojo_status with this jobId to check completion, or follow ${result.statusUrl}.`,\n jobId: result.jobId,\n statusUrl: result.statusUrl,\n };\n}\n\nfunction extractAssetUrls(job: { assets?: Array<{ url: string }>; output?: unknown }): string[] {\n if (job.assets && job.assets.length > 0) return job.assets.map((a) => a.url);\n // Fallback for completed jobs that put outputs on `output.images` /\n // `output.videos` (matches the legacy /api/v1/jobs response shape).\n const output = job.output as\n | { images?: string[]; videos?: string[]; image?: string; video?: string }\n | undefined;\n if (output?.images) return output.images;\n if (output?.videos) return output.videos;\n if (output?.image) return [output.image];\n if (output?.video) return [output.video];\n return [];\n}\n","/**\n * Shared helper: read a local file and upload it to PixelDojo's 24h temp\n * bucket, returning the public URL. Used by `:generate` and `:edit` to\n * accept `image_path` / `image_paths` alongside the URL-based fields so\n * agents can hand off a local file in one step instead of chaining\n * `:upload` first.\n *\n * Throws a `SkillUploadError` on any failure — caller turns it into a\n * SkillResult text response.\n */\nimport { readFile, stat } from 'node:fs/promises';\nimport { extname, basename } from 'node:path';\nimport type { SkillContext } from './types.js';\n\nconst MAX_IMAGE_BYTES = 50 * 1024 * 1024;\nconst MAX_VIDEO_BYTES = 200 * 1024 * 1024;\nconst MAX_AUDIO_BYTES = 50 * 1024 * 1024;\n\nconst EXT_TO_MIME: Record<string, string> = {\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.png': 'image/png',\n '.webp': 'image/webp',\n '.gif': 'image/gif',\n '.mp4': 'video/mp4',\n '.webm': 'video/webm',\n '.mov': 'video/quicktime',\n // Audio: the server checks the bytes match (a Film Studio song, song_path).\n '.mp3': 'audio/mpeg',\n '.wav': 'audio/wav',\n '.m4a': 'audio/mp4',\n '.aac': 'audio/aac',\n '.ogg': 'audio/ogg',\n '.flac': 'audio/flac',\n};\n\nexport class SkillUploadError extends Error {\n constructor(public readonly userMessage: string) {\n super(userMessage);\n this.name = 'SkillUploadError';\n }\n}\n\nexport const HOSTED_LOCAL_PATH_MESSAGE =\n 'Local file paths are not available on the hosted PixelDojo MCP server (it cannot see your disk). ' +\n 'Pass a public http(s) URL instead (image_url / image_urls / video_url / audio_urls / product_image_urls), ' +\n 'or install the local server (npx @pixeldojo/mcp init) to use files on your machine.';\n\ntype UploadCtx = Pick<SkillContext, 'client' | 'localFiles'>;\n\nexport async function uploadLocalFile(path: string, ctx: UploadCtx): Promise<string> {\n // Checked before any fs call: on the hosted server \"local\" is our container.\n if (ctx.localFiles !== true) throw new SkillUploadError(HOSTED_LOCAL_PATH_MESSAGE);\n const ext = extname(path).toLowerCase();\n const mime = EXT_TO_MIME[ext];\n if (!mime) {\n throw new SkillUploadError(\n `Unsupported file extension \"${ext || '(none)'}\" for \"${path}\". Allowed: ${Object.keys(EXT_TO_MIME).join(', ')}.`,\n );\n }\n\n let size: number;\n try {\n const info = await stat(path);\n if (!info.isFile()) {\n throw new SkillUploadError(`\"${path}\" is not a file.`);\n }\n size = info.size;\n } catch (err) {\n if (err instanceof SkillUploadError) throw err;\n const code = (err as NodeJS.ErrnoException)?.code;\n if (code === 'ENOENT') {\n throw new SkillUploadError(\n `File not found at \"${path}\". Pass an absolute path.`,\n );\n }\n throw new SkillUploadError(\n `Cannot read \"${path}\": ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n const isImage = mime.startsWith('image/');\n const isAudio = mime.startsWith('audio/');\n const limit = isImage ? MAX_IMAGE_BYTES : isAudio ? MAX_AUDIO_BYTES : MAX_VIDEO_BYTES;\n if (size > limit) {\n const gotMB = (size / 1024 / 1024).toFixed(1);\n const limitMB = (limit / 1024 / 1024).toFixed(0);\n throw new SkillUploadError(\n `\"${basename(path)}\" is ${gotMB}MB; limit for ${isImage ? 'images' : isAudio ? 'audio' : 'videos'} is ${limitMB}MB. Downscale or re-encode and try again.`,\n );\n }\n\n const buffer = await readFile(path);\n const blob = new Blob([new Uint8Array(buffer)], { type: mime });\n const filename = basename(path);\n const response = await ctx.client.uploadImage(blob, filename);\n return response.url;\n}\n\nexport async function uploadLocalFiles(\n paths: readonly string[],\n ctx: UploadCtx,\n): Promise<string[]> {\n return Promise.all(paths.map((p) => uploadLocalFile(p, ctx)));\n}\n","/**\n * Snap agent-supplied `aspect_ratio` / `duration` values to what a model's\n * real schema accepts, fetched from GET /api/v1/models/{apiId}/schema.\n *\n * The MCP package has no access to the main app's server-side model\n * catalog — it's a separate npm package that only talks to the public API\n * over HTTP — so unlike the in-app chat agent's model-router.ts, there's\n * no local catalog to consult. This does one schema fetch per apiId\n * (cached for the life of the process — the MCP server is a long-lived\n * stdio process for the session) and snaps to the nearest value the\n * schema actually allows, instead of forwarding a value verbatim that a\n * model's Zod schema rejects outright (an LLM guessing \"2:3\" for a\n * portrait against a model that only accepts 1:1/16:9/9:16/4:3/3:4, or a\n * duration of 10s against a model that only accepts 5 or 8).\n *\n * Every schemas-derived tri-state is meaningful and handled distinctly:\n * - schema fetch failed (network hiccup, endpoint down) → pass the\n * caller's value through UNCHANGED. We don't know what the model\n * wants, so this is strictly today's pre-existing behavior, not a\n * regression.\n * - schema fetched OK, field absent from the model's declared\n * properties → return undefined so the caller OMITS the key.\n * Schemas reject unrecognized keys (additionalProperties: false), so\n * forwarding a field a model never declared 400s regardless — this\n * is a genuine improvement, not just a snap.\n * - schema fetched OK, field present with an enum → snap to the\n * numerically-nearest allowed value (aspect ratio) or nearest allowed\n * number (duration).\n * - schema fetched OK, field present with only min/max (duration only)\n * → clamp into range.\n * - schema fetched OK, field present but unconstrained → pass through.\n */\nimport type { PixelDojoClient } from '@pixeldojo/sdk';\n\ninterface FieldConstraint {\n type?: string;\n enum?: string[];\n minimum?: number;\n maximum?: number;\n maxItems?: number;\n minItems?: number;\n}\n\ntype FieldConstraints = Record<string, FieldConstraint>;\n\n/** One declared reference slot from the tool's `media` block, served by\n * GET /api/v1/models/{apiId}/schema alongside the schema itself. `also` is\n * the part no field-name search could ever find — kling's\n * `reference_type: 'video'` is what selects the provider's clip endpoint, so\n * the url alone lands on the still path. */\nexport interface MediaSlot {\n key: string;\n also?: Record<string, string | number | boolean>;\n}\n\nexport type MediaKind = 'image' | 'video' | 'audio';\n\ntype MediaDeclarations = Partial<Record<MediaKind, MediaSlot>>;\n\ninterface ModelSchemaInfo {\n props: FieldConstraints;\n /** Absent when the tool declares no media slots at all. */\n media?: MediaDeclarations;\n}\n\n// Cache the in-flight PROMISE, not the resolved value — generate's\n// Promise.all([snapAspectRatio, snapDuration]) fires both before either\n// resolves, and a value-cache would let two identical GET /schema requests\n// race on first call. Failed fetches resolve null and are evicted so a\n// transient outage doesn't poison the rest of the process's lifetime.\nconst schemaCache = new Map<string, Promise<ModelSchemaInfo | null>>();\n\n/** Test-only: clear the module-level schema cache so tests with different\n * mocked schemas for the same apiId don't see a stale cached result. */\nexport function _resetSchemaCacheForTests(): void {\n schemaCache.clear();\n}\n\n/** Resolves null when the schema fetch itself failed (caller decides\n * whether to fail open or closed) — distinct from a successfully-fetched\n * schema that simply has no properties. */\nfunction getModelInfo(\n apiId: string,\n client: PixelDojoClient,\n): Promise<ModelSchemaInfo | null> {\n const cached = schemaCache.get(apiId);\n if (cached) return cached;\n // An older @pixeldojo/sdk may not have getModelSchema at all, and one that\n // does may throw synchronously — both are the \"constraints unknown\" case,\n // not a crash. The typeof guard states the expectation; the Promise wrapper\n // keeps a synchronous throw inside the .catch() below rather than letting it\n // escape and take the whole skill down.\n if (typeof client?.getModelSchema !== 'function') return Promise.resolve(null);\n const pending = Promise.resolve()\n .then(() => client.getModelSchema(apiId))\n .then((res) => {\n // `media` is served next to `schema` by the same endpoint but is newer\n // than the SDK's ModelSchemaResponse type, hence the cast. An older\n // deployment simply omits it and every lookup falls back to the\n // name-search below, which is the pre-media behavior.\n const body = res as unknown as {\n schema?: { properties?: FieldConstraints };\n media?: MediaDeclarations;\n };\n return { props: body.schema?.properties ?? {}, media: body.media };\n })\n .catch(() => {\n schemaCache.delete(apiId); // don't cache failures\n return null;\n });\n schemaCache.set(apiId, pending);\n return pending;\n}\n\nasync function getFieldConstraints(\n apiId: string,\n client: PixelDojoClient,\n): Promise<FieldConstraints | null> {\n return (await getModelInfo(apiId, client))?.props ?? null;\n}\n\n/** What to do with the caller's value when the model's constraints are\n * UNKNOWN (schema fetch failed):\n * - 'send' (default): pass the value through unchanged — status quo for\n * skills that always forwarded these fields (generate/edit/storyboard).\n * - 'omit': drop the field — for skills that historically only sent it to\n * an allowlist of models (character), where forwarding on a fetch\n * failure would 400 against strict schemas that never took the field. */\nexport interface SnapOptions {\n onUnknown?: 'send' | 'omit';\n}\n\nfunction parseAspectRatio(ar: string): number | null {\n const m = /^\\s*(\\d+)\\s*:\\s*(\\d+)\\s*$/.exec(ar);\n if (!m) return null;\n const w = Number(m[1]);\n const h = Number(m[2]);\n return h > 0 ? w / h : null;\n}\n\nfunction nearestAspectFromEnum(requested: string, allowed: string[]): string {\n if (allowed.includes(requested)) return requested;\n const target = parseAspectRatio(requested);\n if (target === null) return requested;\n let best = requested;\n let bestDiff = Infinity;\n for (const candidate of allowed) {\n const r = parseAspectRatio(candidate);\n if (r === null) continue;\n const diff = Math.abs(r - target);\n if (diff < bestDiff) {\n bestDiff = diff;\n best = candidate;\n }\n }\n return best;\n}\n\n/** Snap `aspect_ratio` to the nearest value the model's schema declares.\n * Returns undefined when there's nothing to send (no value requested, or\n * the model's schema confirms it doesn't take this field at all). */\nexport async function snapAspectRatio(\n apiId: string,\n requested: string | undefined,\n client: PixelDojoClient,\n opts: SnapOptions = {},\n): Promise<string | undefined> {\n if (!requested) return undefined;\n const props = await getFieldConstraints(apiId, client);\n if (props === null) {\n return opts.onUnknown === 'omit' ? undefined : requested; // fetch failed\n }\n const field = props.aspect_ratio;\n if (!field) return undefined; // confirmed: this model doesn't take aspect_ratio\n if (!field.enum || field.enum.length === 0) return requested; // unconstrained string\n return nearestAspectFromEnum(requested, field.enum);\n}\n\n/**\n * Every field name a tool in the registry uses to mean \"here is a reference\n * image\". Agents only ever hand us one generic `image_url`; this is what it\n * gets mapped onto, per model, from the model's own schema.\n *\n * Order is specificity, not popularity: a model that declares several (Kling\n * declares start_image_url + image_urls + end_image_url) gets the field that\n * a SINGLE reference means — the start frame — not the bag of extra refs.\n * Video-input fields (video_url) are deliberately absent; the video-edit /\n * video-extend tools are mapped explicitly in generate.ts because they also\n * remap duration, and every other clip slot arrives declared (see\n * resolveMediaSlot).\n *\n * This is the FALLBACK for models that declare no `media`. A declared slot\n * always wins — see resolveMediaSlot.\n *\n * tests/contracts/film-studio-engines-registered.test.ts fails if any Film\n * Studio clip engine (or any registered reference-capable video tool) grows\n * a reference field that isn't in this list.\n */\nexport const REFERENCE_FIELD_PRIORITY = [\n 'image_url',\n 'start_image_url',\n 'input_image',\n 'image',\n 'reference_images',\n 'reference_urls',\n 'reference_image_urls',\n 'image_urls',\n 'image_input',\n 'images',\n] as const;\n\nexport interface ReferenceField {\n name: string;\n isArray: boolean;\n /** Extra body fields the declared slot pins (kling's `reference_type`). */\n also?: Record<string, string | number | boolean>;\n}\n\n/** Name-search fallback per media kind, for models that declare no `media`.\n * Video and audio are their own short lists, for the same reason the app's\n * model-router keeps them separate: a track or a clip is never a substitute\n * for a frame, so a near-miss on a lookalike image field is worse than no\n * match at all. `image_url` on a clip is exactly how an mp4 reached the\n * provider as \"content-type: video/mp4\" — after the credit deduction.\n *\n * Every name on the video list can only mean a source clip: `video_url` /\n * `video` is how the video-edit/upscale family (video-upscaler,\n * kling-video-edit, video-reframe, xai-video-edit, …) keys its input.\n * Before they were listed, an explicit model override with a video_url was\n * \"proven\" clip-less and substituted with seedance-2-reference — at 4x the\n * credits of the upscaler the caller actually named. */\nconst FALLBACK_KEYS: Record<MediaKind, readonly string[]> = {\n image: REFERENCE_FIELD_PRIORITY,\n video: ['reference_videos', 'video_url', 'video'],\n audio: ['reference_audios', 'audio_url'],\n};\n\n/**\n * Which field this model wants a reference of `kind` in.\n * - undefined → schema fetch failed; caller keeps its existing behavior.\n * - null → schema fetched, model has no slot for this kind.\n * - {name} → send the url as this key (wrapped in an array if the\n * schema types it as one), plus every `also` field.\n *\n * A DECLARED slot always wins: the field names lie, and only the declaration\n * knows it. `reference_urls` is images-only on grok-r2v and images-or-video\n * on wan-reference-to-video — identical name, identical derived shape,\n * opposite meaning — and kling's `start_image_url` (a still anchor) outranks\n * its real `video_url` in the search order, so a clip was filed as an image\n * reference pointing at an .mp4.\n *\n * Mirrors applySourceMedia / applySourceAudio in the app's\n * lib/agent/model-router.ts, including the asymmetry between them: a model\n * that declares `media` but no image/video slot for this kind gets NO name\n * search (the declaration is complete, a hit would be the wrong slot), while\n * audio keeps its search either way because every name on that list is a\n * genuine audio field — wan-2.7-video's `audio_url` is real and undeclared.\n */\nexport async function resolveMediaSlot(\n apiId: string,\n kind: MediaKind,\n client: PixelDojoClient,\n): Promise<ReferenceField | null | undefined> {\n const info = await getModelInfo(apiId, client);\n if (info === null) return undefined;\n const declared = info.media?.[kind];\n if (declared) {\n return {\n name: declared.key,\n isArray: info.props[declared.key]?.type === 'array',\n also: declared.also,\n };\n }\n if (info.media && kind !== 'audio') return null;\n for (const name of FALLBACK_KEYS[kind]) {\n const field = info.props[name];\n if (field) return { name, isArray: field.type === 'array' };\n }\n return null;\n}\n\n/** \"1080p\" / \"1080P\" / \"1080\" are the same tier spelled three ways across\n * tools (WAN r2v takes \"720\", Grok takes \"720p\"); 4k is 2160 lines. */\nfunction resolutionHeight(value: string): number | null {\n const v = value.trim().toLowerCase();\n if (v === '4k') return 2160;\n const n = Number.parseInt(v, 10);\n return Number.isFinite(n) ? n : null;\n}\n\n/** Snap `resolution` to what the model declares. Same tri-state as the other\n * snaps; matches across the p/no-p spelling difference, then falls back to\n * the nearest declared tier by line count. */\nexport async function snapResolution(\n apiId: string,\n requested: string | undefined,\n client: PixelDojoClient,\n opts: SnapOptions = {},\n): Promise<string | undefined> {\n if (!requested) return undefined;\n const props = await getFieldConstraints(apiId, client);\n if (props === null) {\n return opts.onUnknown === 'omit' ? undefined : requested; // fetch failed\n }\n const field = props.resolution;\n if (!field) return undefined; // confirmed: this model doesn't take resolution\n if (!field.enum || field.enum.length === 0) return requested; // unconstrained\n if (field.enum.includes(requested)) return requested;\n const target = resolutionHeight(requested);\n if (target === null) return requested;\n let best = requested;\n let bestDiff = Infinity;\n for (const candidate of field.enum) {\n const h = resolutionHeight(candidate);\n if (h === null) continue;\n const diff = Math.abs(h - target);\n if (diff < bestDiff) {\n bestDiff = diff;\n best = candidate;\n }\n }\n return best;\n}\n\n/** Snap `duration` (seconds) to the model's schema — nearest match for a\n * discrete enum, clamp for a continuous min/max. Returns undefined when\n * there's nothing to send (no value requested, or the model's schema\n * confirms it doesn't take a `duration` field — e.g. the video-input\n * tools that key length as `video_duration` instead). */\nexport async function snapDuration(\n apiId: string,\n requested: number | undefined,\n client: PixelDojoClient,\n opts: SnapOptions = {},\n): Promise<number | undefined> {\n if (requested === undefined) return undefined;\n const props = await getFieldConstraints(apiId, client);\n if (props === null) {\n return opts.onUnknown === 'omit' ? undefined : requested; // fetch failed\n }\n const field = props.duration;\n if (!field) return undefined; // confirmed: this model doesn't take duration\n if (field.enum && field.enum.length > 0) {\n const allowed = field.enum.map(Number).filter((n) => Number.isFinite(n));\n if (allowed.length === 0) return requested;\n if (allowed.includes(requested)) return requested;\n return allowed.reduce((best, candidate) =>\n Math.abs(candidate - requested) < Math.abs(best - requested) ? candidate : best,\n );\n }\n if (typeof field.minimum === 'number' || typeof field.maximum === 'number') {\n let v = requested;\n if (typeof field.minimum === 'number') v = Math.max(field.minimum, v);\n if (typeof field.maximum === 'number') v = Math.min(field.maximum, v);\n return v;\n }\n return requested; // declared but unconstrained\n}\n\n/** A source url that's a clip rather than a still. Signed CDN urls carry\n * query strings, so match on the extension only; an extensionless clip is\n * why the skills take an explicit `video_url` input rather than sniffing\n * everywhere. Same regex as isVideoUrl in the app's model-router.ts. */\nexport function isVideoUrl(url: string): boolean {\n return /\\.(mp4|mov|webm|m4v)(?:[?#]|$)/i.test(url);\n}\n\n/** A source url that's an audio track — neither a frame nor a clip, and it\n * must never ride into a reference-IMAGE field: the provider kills the job\n * (\"does not point to a valid image … content-type: audio/mpeg\") after the\n * credit deduction. Same regex as isAudioUrl in the app's model-router.ts. */\nexport function isAudioUrl(url: string): boolean {\n return /\\.(mp3|wav|m4a|aac|ogg|flac)(?:[?#]|$)/i.test(url);\n}\n\n/** Parameter names a reference image can arrive under, most specific\n * first. Mirrors EDIT_IMAGE_KEYS in the app's lib/agent/model-router.ts —\n * the same list the in-app agent resolves against. */\nconst REF_KEYS = [\n 'image_urls',\n 'images',\n 'image_input',\n 'reference_images',\n 'reference_urls',\n 'image_url',\n 'input_image',\n 'image',\n] as const;\n\nexport interface ResolvedImageRefs {\n /** Schema property to write the reference(s) into. */\n key: string;\n /** Array for array-typed params (clamped to the schema's maxItems),\n * single URL for scalar ones. */\n value: string[] | string;\n /** URLs dropped to fit the model's cap, so the caller can tell the user. */\n dropped: number;\n /** Extra body fields a declared slot pins. */\n also?: Record<string, string | number | boolean>;\n}\n\n/**\n * Resolve WHERE a model wants its reference images, and how many it takes,\n * from its published schema.\n *\n * The previous hardcoded switch was wrong for half the allowlist: flux-edit\n * was sent `image_url` when its schema requires `input_image_1`, so EVERY\n * flux-edit edit failed; gpt-image-2-edit was sent `image_url` when it only\n * accepts `image_urls`, so single-image edits failed while 2-8 worked; and\n * nothing clamped to maxItems, so wan-2.6-image-edit 400'd at 5+ images and\n * gpt-image-2-edit at 9. Schemas strip unknown keys rather than rejecting\n * them, so a wrong key can also mean the reference is silently discarded\n * and the user is billed for a from-scratch image.\n *\n * Returns null when the schema fetch fails or the model declares no\n * reference field — the caller keeps its existing behavior rather than\n * guessing.\n */\nexport async function resolveImageRefs(\n apiId: string,\n urls: string[],\n client: PixelDojoClient,\n): Promise<ResolvedImageRefs | null> {\n if (urls.length === 0) return null;\n const info = await getModelInfo(apiId, client);\n if (info === null) return null; // fetch failed — caller falls back\n\n // Declared image slot first (same rule as resolveMediaSlot); the REF_KEYS\n // search is the fallback for models that declare no `media`.\n const props = info.props;\n const key = info.media\n ? info.media.image?.key\n : REF_KEYS.find((k) => props[k] !== undefined);\n if (!key) return null; // model declares no reference field\n const also = info.media?.image?.also;\n const field = props[key] ?? {};\n\n if (field.type === 'array') {\n const cap = typeof field.maxItems === 'number' ? field.maxItems : urls.length;\n const kept = urls.slice(0, Math.max(1, cap));\n return { key, value: kept, dropped: urls.length - kept.length, also };\n }\n return { key, value: urls[0], dropped: urls.length - 1, also };\n}\n","/**\n * Model-specific `params` passthrough — the MCP twin of `applyParams` in the\n * app's lib/agent/skills.ts.\n *\n * Deliberately an open record. Each model documents its own inputs and there\n * are 100+ of them, so enumerating those fields in a tool description is not\n * an option — but the model's OWN schema already is a validator, and\n * /api/v1/models/{apiId}/run runs it before a single credit is deducted. A\n * wrong field comes back named, with its allowed values, and the calling\n * agent corrects it on the next call. The validation loop is the\n * documentation, which is why nothing here inspects or rewrites the values:\n * a 400 the caller can act on beats a guess we made on its behalf.\n */\nimport { z } from 'zod';\nimport type { SkillResult } from './types.js';\n\nexport const ParamsInput = z.record(z.unknown()).optional();\n\nexport const PARAMS_JSON_SCHEMA: Record<string, unknown> = {\n type: 'object',\n additionalProperties: true,\n description:\n 'Advanced settings for the model that runs this, named exactly as that model documents them (e.g. {\"resolution\": \"1080p\", \"seed\": 42}). Set `model` in the same call: field names differ per model, so params without one are refused. Applied last, so these override anything derived from the other inputs. An invalid field comes back named with its allowed values and nothing is charged, so fix it and call again.',\n};\n\n/** Refusal text when settings arrived with no model to attach them to, else\n * null. Ask rather than guess: the same key means different things on\n * different models, and the skill's own default is not what the caller had\n * in mind when they wrote them. */\nexport function paramsWithoutModel(\n params: Record<string, unknown> | undefined,\n model: string | undefined,\n): string | null {\n if (!params || Object.keys(params).length === 0) return null;\n if (model) return null;\n return 'Those settings are model-specific. Tell me which model to use and I will apply them.';\n}\n\n/** Overlay `params` onto a built body, LAST, so an explicit setting beats\n * anything the skill derived. Returns a note to prepend to the result when\n * we did not apply them verbatim.\n *\n * Two carve-outs, both matching the in-app agent:\n * - A SUBSTITUTED model gets nothing. `paramsModel` is the model those\n * fields were written for; when routing sent the job elsewhere (the clip\n * engine) the keys mean something else on the model that actually ran, or\n * nothing at all. Dropping them keeps the generation alive and the note\n * names the model to ask for.\n * - `prompt` never rides in here. Every skill already takes one, and\n * storyboard wraps it (brief → prompt), so an override would silently\n * discard the caller's own text. */\nexport function applyParams(\n body: Record<string, unknown>,\n params: Record<string, unknown> | undefined,\n paramsModel: string | undefined,\n apiId: string,\n): string | undefined {\n if (!params || Object.keys(params).length === 0) return undefined;\n if (paramsModel !== apiId) {\n return `This ran on ${apiId}, so I left those settings off: they are ${paramsModel}'s fields. Ask again naming ${apiId} if you want them applied.`;\n }\n const rest = { ...params };\n delete rest.prompt;\n Object.assign(body, rest);\n return 'prompt' in params\n ? 'I kept the prompt from the skill call and ignored the one in params.'\n : undefined;\n}\n\n/** Ride a routing/params note out on whatever the job returns — success,\n * handoff, or failure — so the caller never sees a result from a model it\n * never named with no explanation. */\nexport function prefixNote(result: SkillResult, note: string | undefined): SkillResult {\n if (!note) return result;\n return { ...result, text: `${note} ${result.text}`.trim() };\n}\n","/**\n * pixeldojo_generate — generic image/video generation skill.\n *\n * Default routing: text-to-image via `seedream-5` (best quality, fewest\n * provider refusals). Users can override by passing a `model` field; any apiId\n * that exists in the registry is accepted (allowedModels: null).\n */\nimport { z } from 'zod';\nimport { pollJobUntilDoneOrHandoff } from '../poll.js';\nimport {\n type SkillContext,\n type SkillModule,\n type SkillResult,\n pollResultToSkillResult,\n} from './types.js';\nimport { SkillUploadError, uploadLocalFile } from './upload-helpers.js';\nimport {\n type ReferenceField,\n isAudioUrl,\n isVideoUrl,\n resolveMediaSlot,\n snapAspectRatio,\n snapDuration,\n snapResolution,\n} from './schema-snap.js';\nimport {\n PARAMS_JSON_SCHEMA,\n ParamsInput,\n applyParams,\n paramsWithoutModel,\n prefixNote,\n} from './params.js';\n\nconst InputSchema = z.object({\n prompt: z.string().min(1).max(8000).describe('Prompt describing what to generate. Write @Name to use a character or element the user saved in Character Studio (\"@Mara on a beach\"): its photos are attached automatically on models that take reference images. pixeldojo_library source=characters lists them.'),\n model: z\n .string()\n .optional()\n .describe(\n 'Model apiId. Recommended (the models the PixelDojo studios use): \"seedream-5\" for images (the default), \"seedance-2-5\" for video (prompt only or a starting image), \"wan-3-0-video\" for video the others refuse. Use another model only when the user names one. Full catalog: https://pixeldojo.ai/api/v1/models; one model\\'s fields: https://pixeldojo.ai/llm/{apiId}.txt. Omit for seedream-5, which makes still images only; name a video model to get a video.',\n ),\n preset: z\n .string()\n .optional()\n .describe(\n 'Preset slug that seeds the running model\\'s settings; explicit fields and params override it. Each preset belongs to one model (browse them by model at https://pixeldojo.ai/presets), so set `model` to that preset\\'s model: a slug the running model has no preset for is rejected with a 400 before any charge.',\n ),\n aspect_ratio: z\n .string()\n .optional()\n .describe('e.g. \"1:1\", \"16:9\", \"9:16\". Snapped to the nearest ratio the model supports, and dropped if the model has no aspect_ratio field.'),\n duration: z\n .number()\n .int()\n .positive()\n .optional()\n .describe('Video length in seconds. Snapped or clamped to what the model allows, and dropped if the model has no duration field. Required for grok-video-extend (the extension length).'),\n resolution: z\n .string()\n .optional()\n .describe(\n 'Output resolution when the model supports it (e.g. \"480p\", \"720p\", \"1080p\", \"4k\"). Lower tiers cost fewer credits. Omit to use the model default.',\n ),\n image_url: z\n .string()\n .url()\n .optional()\n .describe('Reference still for image-to-image / image-to-video. A clip URL (.mp4/.mov/.webm) or an audio track URL (.mp3/.wav/.m4a/...) here is detected by extension and routed as that kind of media instead.'),\n video_url: z\n .string()\n .url()\n .optional()\n .describe(\n 'Source video clip to animate / restyle / extend. Use this for videos; image_url is for still frames. With no model, a clip runs on seedance-2-reference; a named model with no clip input is swapped for it and the result says so.',\n ),\n params: ParamsInput,\n image_path: z\n .string()\n .min(1)\n .optional()\n .describe(\n 'Absolute local file path to a reference image/video. The skill uploads it to PixelDojo first (24h temp storage) and then dispatches. Prefer this over image_url when the user has the file on disk.',\n ),\n image_urls: z\n .array(z.string().url())\n .optional()\n .describe(\n 'Multiple reference image URLs, for models that accept a reference set (character + wardrobe + location, for example). Models that take only one reference use the first and the rest are ignored.',\n ),\n image_paths: z\n .array(z.string().min(1))\n .optional()\n .describe(\n 'Multiple absolute local file paths. Each is uploaded to PixelDojo (24h temp storage) and used as a reference, same rules as image_urls.',\n ),\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\n// House default for stills (see AGENT_PREFERRED in lib/agent/roster.ts).\nconst DEFAULT_MODEL = 'seedream-5';\n\n/** The one engine on the catalog that reads a video OR an audio reference.\n * Every no-model clip/track path lands here, same as the in-app agent's\n * VIDEO_REFERENCE_APIID. */\nexport const VIDEO_REFERENCE_MODEL = 'seedance-2-reference';\n\n/** Its slots, statically. Only consulted when the schema fetch FAILED: this\n * is the model we substituted TO precisely so a clip lands somewhere honest,\n * and falling back to `image_url` there would reintroduce the exact provider\n * rejection (\"content-type: video/mp4\") the substitution exists to prevent.\n * Contract-tested against the real config by the app's\n * tests/contracts/media-declarations.test.ts. */\nconst VIDEO_REFERENCE_SLOTS: Record<'image' | 'video' | 'audio', ReferenceField> = {\n image: { name: 'reference_images', isArray: true },\n video: { name: 'reference_videos', isArray: true },\n audio: { name: 'reference_audios', isArray: true },\n};\n\nfunction fallbackSlot(\n apiId: string,\n kind: 'image' | 'video' | 'audio',\n): ReferenceField | undefined {\n return apiId === VIDEO_REFERENCE_MODEL ? VIDEO_REFERENCE_SLOTS[kind] : undefined;\n}\n\n// These three key length as `video_duration`, not `duration` — buildPayload\n// below already remaps for them. Schema-snapping against the literal name\n// \"duration\" would find nothing declared and drop the value the\n// grok-video-extend required-field check just confirmed was present, so\n// skip the generic snap for this set and trust the caller's value as-is.\nconst VIDEO_INPUT_MODELS = new Set(['grok-video-extend', 'wan-video-edit', 'seedance-video-edit']);\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n prompt: { type: 'string', description: 'Prompt describing what to generate. Write @Name to use a character or element the user saved in Character Studio (\"@Mara on a beach\"): its photos are attached automatically on models that take reference images. pixeldojo_library source=characters lists them.' },\n model: {\n type: 'string',\n description:\n 'Model apiId. Recommended (the models the PixelDojo studios use): \"seedream-5\" for images (the default), \"seedance-2-5\" for video (prompt only or a starting image), \"wan-3-0-video\" for video the others refuse. Use another model only when the user names one. Full catalog: https://pixeldojo.ai/api/v1/models; one model\\'s fields: https://pixeldojo.ai/llm/{apiId}.txt. Omit for seedream-5, which makes still images only; name a video model to get a video.',\n },\n preset: {\n type: 'string',\n description:\n 'Preset slug that seeds the running model\\'s settings; explicit fields and params override it. Each preset belongs to one model (browse them by model at https://pixeldojo.ai/presets), so set `model` to that preset\\'s model: a slug the running model has no preset for is rejected with a 400 before any charge.',\n },\n aspect_ratio: {\n type: 'string',\n description:\n 'e.g. \"1:1\", \"16:9\", \"9:16\". Snapped to the nearest ratio the model supports, and dropped if the model has no aspect_ratio field.',\n },\n duration: {\n type: 'integer',\n description:\n 'Video length in seconds. Snapped or clamped to what the model allows, and dropped if the model has no duration field. Required for grok-video-extend (the extension length).',\n },\n resolution: {\n type: 'string',\n description:\n 'Output resolution when the model supports it (e.g. \"480p\", \"720p\", \"1080p\", \"4k\"). Snapped to the nearest tier the model offers, and dropped if the model has no resolution field. Lower tiers cost fewer credits.',\n },\n image_url: {\n type: 'string',\n format: 'uri',\n description:\n 'Reference still for image-to-image / image-to-video. A clip URL (.mp4/.mov/.webm) or an audio track URL (.mp3/.wav/.m4a/...) here is detected by extension and routed as that kind of media instead.',\n },\n video_url: {\n type: 'string',\n format: 'uri',\n description:\n 'Source video clip to animate / restyle / extend. Use this for videos; image_url is for still frames. With no model, a clip runs on seedance-2-reference; a named model with no clip input is swapped for it and the result says so.',\n },\n params: PARAMS_JSON_SCHEMA,\n image_urls: {\n type: 'array',\n items: { type: 'string', format: 'uri' },\n description:\n 'Multiple reference image URLs for models that accept a reference set (character + wardrobe + location, for example). Single-reference models use the first and ignore the rest.',\n },\n image_paths: {\n type: 'array',\n items: { type: 'string' },\n description:\n 'Multiple absolute local file paths (JPEG, PNG, WebP, GIF, MP4, WebM, MOV), each uploaded to 24h temp storage and used as a reference, same rules as image_urls.',\n },\n image_path: {\n type: 'string',\n description:\n 'Absolute local file path to a reference image or clip (JPEG, PNG, WebP, GIF, MP4, WebM, MOV; no audio). The skill uploads it to 24h temp storage and uses the URL as image_url. Ignored when image_url is also set.',\n },\n },\n required: ['prompt'],\n} as const;\n\n/** What the caller actually handed us, split by media kind. Mirrors\n * sourceMedia() in the app's lib/agent/skills.ts.\n *\n * `video_url` is the explicit clip slot: an extension is all `isVideoUrl`\n * has to go on, so a signed or extensionless CDN link to an mp4 read as a\n * still and routed to a stills-only engine. A clip dropped into `image_url`\n * (every pre-video_url caller, and the habit of most LLMs) is still caught\n * by the extension check.\n *\n * Audio is NEITHER a frame nor a clip and must never ride into a reference-\n * image field, so it is split out here rather than left in the stills bag. */\ninterface SourceMedia {\n /** The single source frame or clip, if any. */\n url?: string;\n isClip: boolean;\n audioUrl?: string;\n /** Every still reference, in order, for models with an array slot. */\n stills: string[];\n}\n\nfunction sourceMedia(videoUrl: string | undefined, referenceUrls: string[]): SourceMedia {\n const clip = videoUrl && !isAudioUrl(videoUrl) ? videoUrl : undefined;\n const stills = referenceUrls.filter((u) => !isAudioUrl(u));\n const url = clip ?? stills[0];\n return {\n url,\n isClip: Boolean(clip) || (!!url && isVideoUrl(url)),\n audioUrl: [videoUrl, ...referenceUrls].find((u) => u && isAudioUrl(u)),\n stills,\n };\n}\n\n/**\n * Per-model param adapter. Agents only ever give us a generic\n * { image_url, video_url, duration, resolution }; each model declares its own\n * field names and schemas strip unknown keys, so a verbatim `image_url` is\n * silently dropped and the model then 400s naming a field the agent had no\n * way to set — an unrecoverable loop. `slot` is resolved from the model's\n * declared `media` block, falling back to its REAL schema (see\n * resolveMediaSlot), which is how the reference-driven video engines —\n * seedance-2-reference (reference_images / reference_videos /\n * reference_audios), grok-r2v / wan-reference-to-video / happyhorse-1.0-r2v\n * (reference_urls), kling-reference-to-video (start_image_url, or video_url\n * + reference_type='video' for a clip) — become reachable without a\n * per-model switch here.\n *\n * The video-edit / video-extend tools stay explicit: they also remap\n * duration → video_duration, which no schema lookup can infer.\n */\nfunction buildPayload(\n apiId: string,\n input: Input,\n src: SourceMedia,\n slot: ReferenceField | null | undefined,\n audioSlot: ReferenceField | null | undefined,\n): { prompt: string; [key: string]: unknown } {\n const body: { prompt: string; [key: string]: unknown } = { prompt: input.prompt };\n if (input.aspect_ratio) body.aspect_ratio = input.aspect_ratio;\n if (input.preset) body.preset = input.preset;\n\n switch (apiId) {\n case 'grok-video-extend':\n case 'wan-video-edit':\n case 'seedance-video-edit':\n // Video-input tools expect video_url / video_duration. Pass both shapes\n // so we work even if a model's schema later accepts the image_url alias.\n if (src.url) {\n body.video_url = src.url;\n body.image_url = src.url;\n }\n if (input.duration !== undefined) {\n body.video_duration = input.duration;\n body.duration = input.duration;\n }\n break;\n default:\n if (src.url) {\n // slot undefined (schema fetch failed) or null (model declares no\n // slot for this kind) → send image_url, i.e. exactly what we sent\n // before this adapter existed. No new failure mode on an unknown\n // schema. An array field takes every reference the caller gave; a\n // scalar takes the first, because there is nowhere honest to put the\n // rest — and a clip is one thing, so it never brings the stills bag.\n const refs = src.isClip ? [src.url] : src.stills.length > 0 ? src.stills : [src.url];\n if (slot) {\n body[slot.name] = slot.isArray ? refs : refs[0];\n // `also` is the part no key-name search could find: kling's\n // reference_type='video' is what selects the provider's clip\n // endpoint, so the url alone lands on the still path.\n if (slot.also) Object.assign(body, slot.also);\n } else {\n body.image_url = refs[0];\n }\n }\n // A track only ever goes in a declared audio slot. No fallback: a model\n // with none must DROP it rather than fall through to image_url, which\n // is exactly how an mp3 reached the provider as \"content-type:\n // audio/mpeg\" — after the credit deduction.\n if (src.audioUrl && audioSlot) {\n body[audioSlot.name] = audioSlot.isArray ? [src.audioUrl] : src.audioUrl;\n if (audioSlot.also) Object.assign(body, audioSlot.also);\n }\n if (input.duration !== undefined) body.duration = input.duration;\n if (input.resolution) body.resolution = input.resolution;\n break;\n }\n\n return body;\n}\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n // Ask rather than guess: the same key means different things on different\n // models, so settings with nobody to attach them to are refused, not\n // applied to whatever the skill would have picked.\n const paramsGate = paramsWithoutModel(input.params, input.model);\n if (paramsGate) return { kind: 'text', text: paramsGate };\n\n // If the caller passed a local file path, upload it first and treat the\n // resulting URL as image_url for the rest of the dispatch. Explicit\n // image_url wins if both are set (path is for \"I only have a file\").\n let resolved: Input = input;\n // Every reference the caller gave us, in order, singular first. Local paths\n // upload to 24h temp storage and join the list as URLs. image_url stays the\n // head of the list so single-reference models keep their old behaviour.\n let referenceUrls: string[] = [];\n try {\n const singleUrl =\n input.image_url ?? (input.image_path ? await uploadLocalFile(input.image_path, ctx) : undefined);\n const manyUrls = [...(input.image_urls ?? [])];\n for (const p of input.image_paths ?? []) {\n manyUrls.push(await uploadLocalFile(p, ctx));\n }\n referenceUrls = [...(singleUrl ? [singleUrl] : []), ...manyUrls].filter(\n (u, i, all) => all.indexOf(u) === i,\n );\n if (referenceUrls[0] && referenceUrls[0] !== input.image_url) {\n resolved = { ...input, image_url: referenceUrls[0] };\n }\n } catch (err) {\n if (err instanceof SkillUploadError) {\n return { kind: 'text', text: `pixeldojo_generate (upload): ${err.userMessage}` };\n }\n throw err;\n }\n\n const src = sourceMedia(input.video_url, referenceUrls);\n\n // Route the source to a model that can actually read it. A clip or a track\n // with no model named can only go to the one engine that takes either —\n // the same pick the in-app agent makes. A NAMED model gets the same\n // treatment when we can PROVE it has no clip slot: nothing downstream would\n // catch it (an image-to-video capability check is satisfied by every\n // stills-only i2v model), so the mp4 went out as a reference IMAGE and the\n // provider killed the job. Substitute and say so, rather than dead-end.\n //\n // `=== null` and not `!slot` on purpose: undefined means the schema fetch\n // failed, and substituting on a network blip would swap the caller's model\n // AND print a note claiming it can't do something it can.\n let apiId = input.model ?? DEFAULT_MODEL;\n let routeNote: string | undefined;\n if ((src.isClip || src.audioUrl) && !VIDEO_INPUT_MODELS.has(apiId)) {\n if (!input.model) {\n apiId = VIDEO_REFERENCE_MODEL;\n } else if (\n src.isClip &&\n (await resolveMediaSlot(input.model, 'video', ctx.client)) === null\n ) {\n apiId = VIDEO_REFERENCE_MODEL;\n routeNote = `${input.model} can't work from a video clip, so I used ${VIDEO_REFERENCE_MODEL} instead.`;\n }\n }\n\n // Required-field validation for video-extend (the only model with hard\n // per-call requirements above prompt). Without this the request reaches\n // the backend and returns `video_url: Required, video_duration: Required`,\n // which loops agents that don't know to retry with different keys.\n if (apiId === 'grok-video-extend') {\n if (!src.url) {\n return {\n kind: 'text',\n text:\n 'pixeldojo_generate with model=\"grok-video-extend\" requires video_url ' +\n '(the source video URL to extend, or image_path for a local file).',\n };\n }\n if (resolved.duration === undefined) {\n return {\n kind: 'text',\n text:\n 'pixeldojo_generate with model=\"grok-video-extend\" requires duration ' +\n '(extension length in seconds).',\n };\n }\n }\n\n let refField: ReferenceField | null | undefined;\n let audioSlot: ReferenceField | null | undefined;\n if (!VIDEO_INPUT_MODELS.has(apiId)) {\n // One schema fetch, shared by all five lookups (schema-snap caches the\n // in-flight promise per apiId).\n const [aspect_ratio, duration, resolution, ref, audio] = await Promise.all([\n snapAspectRatio(apiId, resolved.aspect_ratio, ctx.client),\n snapDuration(apiId, resolved.duration, ctx.client),\n snapResolution(apiId, resolved.resolution, ctx.client),\n src.url\n ? resolveMediaSlot(apiId, src.isClip ? 'video' : 'image', ctx.client)\n : Promise.resolve(undefined),\n src.audioUrl ? resolveMediaSlot(apiId, 'audio', ctx.client) : Promise.resolve(undefined),\n ]);\n resolved = { ...resolved, aspect_ratio, duration, resolution };\n // The engine every no-model clip/track routes to has static slots, so a\n // schema-fetch outage still files a clip under reference_videos instead\n // of image_url — which the provider rejects after the credit deduction.\n // Only `undefined` (fetch failed) falls back: a fetched `null` is a real\n // answer and must stay one.\n refField = ref === undefined && src.url ? fallbackSlot(apiId, src.isClip ? 'video' : 'image') : ref;\n audioSlot = audio === undefined && src.audioUrl ? fallbackSlot(apiId, 'audio') : audio;\n }\n\n const body = buildPayload(apiId, resolved, src, refField, audioSlot);\n const paramsNote = applyParams(body, input.params, input.model, apiId);\n const note = [routeNote, paramsNote].filter(Boolean).join(' ');\n\n const submitted = await ctx.client.run(apiId, body);\n\n const result = await pollJobUntilDoneOrHandoff(\n submitted.jobId,\n (id) => ctx.client.getJob(id),\n ctx.buildStatusUrl,\n {\n now: ctx.pollOverrides?.now,\n sleep: ctx.pollOverrides?.sleep,\n },\n );\n\n return prefixNote(\n pollResultToSkillResult(result, (urls) =>\n urls.length === 0\n ? `Job ${submitted.jobId} completed but returned no assets.`\n : urls.length === 1\n ? `Generated. Asset: ${urls[0]}`\n : `Generated ${urls.length} assets. URLs: ${urls.join(', ')}`,\n ),\n note,\n );\n}\n\nexport const generateSkill: SkillModule<Input> = {\n name: 'pixeldojo_generate',\n description:\n 'Generate an image or video from a prompt with any model in the PixelDojo catalog. With no `model`, a prompt runs on seedream-5, which makes still images only. For a video, name seedance-2-5, which works from a prompt alone or a starting image. If a provider refuses the content, retry once on wan-3-0-video (video) or seedream-5 (images), the least-restricted models. For a multi-shot film or a music video synced to a song use pixeldojo_film; to change, move or extend an existing clip use pixeldojo_video. These are the models the PixelDojo studios use; name another only when the user asks for it. References: `image_url`/`image_urls` for stills, `video_url` for a source clip, `image_path`/`image_paths` for absolute local files (uploaded to 24h temp storage first). A clip or an audio track URL with no `model` runs on seedance-2-reference; a named model that cannot read a clip is swapped for it and the result says so, while a named model with no audio input drops the track. Model-specific settings go in `params` alongside an explicit `model`. Returns asset URLs, or a jobId for pixeldojo_status when the job outlasts the 30s wait.',\n hostedDescription:\n 'Generate an image or video from a prompt with any model in the PixelDojo catalog. With no `model`, a prompt runs on seedream-5, which makes still images only. For a video, name seedance-2-5, which works from a prompt alone or a starting image. If a provider refuses the content, retry once on wan-3-0-video (video) or seedream-5 (images), the least-restricted models. For a multi-shot film or a music video synced to a song use pixeldojo_film; to change, move or extend an existing clip use pixeldojo_video. These are the models the PixelDojo studios use; name another only when the user asks for it. References: `image_url`/`image_urls` for stills and `video_url` for a source clip, all public http(s) URLs. A clip or an audio track URL with no `model` runs on seedance-2-reference; a named model that cannot read a clip is swapped for it and the result says so, while a named model with no audio input drops the track. Model-specific settings go in `params` alongside an explicit `model`. Returns asset URLs, or a jobId for pixeldojo_status when the job outlasts the 30s wait.',\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n allowedModels: null,\n defaultModel: DEFAULT_MODEL,\n run,\n};\n","/**\n * pixeldojo_edit — instruction-based image editing.\n *\n * Default routing: wan-2.7-image-edit (top Canvas edit model). Users can\n * override `model` from the edit-capable whitelist. Each model has slightly\n * different payload shape (image_urls vs image vs images, size vs\n * aspect_ratio), so the skill normalizes the user-facing input into the\n * model-specific body via a small adapter map.\n */\nimport { z } from 'zod';\nimport { pollJobUntilDoneOrHandoff } from '../poll.js';\nimport {\n type SkillContext,\n type SkillModule,\n type SkillResult,\n pollResultToSkillResult,\n} from './types.js';\nimport {\n SkillUploadError,\n uploadLocalFile,\n uploadLocalFiles,\n} from './upload-helpers.js';\nimport { resolveImageRefs, snapAspectRatio } from './schema-snap.js';\nimport {\n PARAMS_JSON_SCHEMA,\n ParamsInput,\n applyParams,\n paramsWithoutModel,\n prefixNote,\n} from './params.js';\n\nconst DEFAULT_MODEL = 'wan-2.7-image-edit';\n\nconst ALLOWED_MODELS = [\n 'wan-2.7-image-edit',\n 'wan-2.6-image-edit',\n 'flux-edit',\n 'xai-image-edit',\n 'p-image-edit',\n 'gpt-image-2-edit',\n 'google-nano-banana',\n] as const;\n\nconst InputSchema = z.object({\n prompt: z.string().min(1).max(5000).describe('Edit instruction.'),\n image_url: z\n .string()\n .url()\n .optional()\n .describe('Single reference image to edit. Pass image_urls for multi-image edits.'),\n image_urls: z\n .array(z.string().url())\n .min(1)\n .max(9)\n .optional()\n .describe('Multiple reference images (1-9). Used for composition/multi-ref edits.'),\n image_path: z\n .string()\n .min(1)\n .optional()\n .describe(\n 'Absolute local file path. Skill uploads it (24h temp storage) and edits it. Prefer over image_url when the user has the file on disk.',\n ),\n image_paths: z\n .array(z.string().min(1))\n .min(1)\n .max(9)\n .optional()\n .describe(\n 'Multiple absolute local file paths (1-9) for multi-image edits. Each uploaded to 24h temp storage before dispatch.',\n ),\n model: z\n .enum(ALLOWED_MODELS)\n .optional()\n .describe(\n 'Override the default edit model. Defaults to wan-2.7-image-edit (most popular).',\n ),\n aspect_ratio: z\n .string()\n .optional()\n .describe('Aspect ratio when supported (e.g. \"1:1\", \"16:9\", \"match_input_image\").'),\n params: ParamsInput,\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n prompt: { type: 'string', description: 'Edit instruction. Write @Name to use a character or element the user saved in Character Studio (\"@Mara on a beach\"): its photos are attached automatically on models that take reference images. pixeldojo_library source=characters lists them.' },\n image_url: {\n type: 'string',\n format: 'uri',\n description: 'Single image to edit. Ignored when image_urls is set; pass image_urls for multi-image edits.',\n },\n image_urls: {\n type: 'array',\n items: { type: 'string', format: 'uri' },\n minItems: 1,\n maxItems: 9,\n description:\n 'Multiple reference images (1-9), most important first. Models that take fewer keep the first ones and the result says how many were dropped.',\n },\n image_path: {\n type: 'string',\n description:\n 'Absolute local image path (JPEG, PNG, WebP, GIF). Skill uploads it (24h temp storage) and edits the resulting URL. Ignored when image_url or image_paths is set.',\n },\n image_paths: {\n type: 'array',\n items: { type: 'string' },\n minItems: 1,\n maxItems: 9,\n description:\n 'Multiple absolute local image paths (1-9). Each is uploaded to 24h temp storage and appended after any image_urls.',\n },\n model: {\n type: 'string',\n enum: [...ALLOWED_MODELS],\n description: 'Override edit model. Default: wan-2.7-image-edit.',\n },\n aspect_ratio: {\n type: 'string',\n description:\n 'Output aspect ratio, e.g. \"1:1\", \"16:9\", \"match_input_image\". Snapped to the nearest ratio the model supports, and dropped if the model has no aspect_ratio field.',\n },\n params: PARAMS_JSON_SCHEMA,\n },\n required: ['prompt'],\n} as const;\n\n/** OFFLINE FALLBACK ONLY — used when GET /schema is unreachable.\n *\n * This used to be the primary path and it was wrong for half the\n * allowlist: flux-edit got `image_url` when its schema requires\n * `input_image_1` (every flux-edit call failed), gpt-image-2-edit got\n * `image_url` when it only takes `image_urls` (single-image edits failed\n * while 2-8 worked), and nothing clamped to maxItems. buildBody now asks\n * the model's published schema first; this map is the last resort when we\n * cannot reach it, so its entries are best-effort. */\nfunction buildPayload(\n apiId: string,\n input: Input,\n): { prompt: string; [key: string]: unknown } {\n const urls = input.image_urls && input.image_urls.length > 0\n ? input.image_urls\n : input.image_url\n ? [input.image_url]\n : [];\n\n switch (apiId) {\n case 'wan-2.7-image-edit':\n case 'wan-2.6-image-edit':\n return {\n prompt: input.prompt,\n image_urls: urls,\n // wan-edit uses `size` not aspect_ratio. Default 2K, let model defaults handle it otherwise.\n };\n case 'p-image-edit':\n return {\n prompt: input.prompt,\n images: urls.slice(0, 5),\n ...(input.aspect_ratio ? { aspect_ratio: input.aspect_ratio } : {}),\n };\n case 'flux-edit':\n // Schema keys the reference as input_image_1 (legacy alias:\n // input_image). `image_url` is not a field it has.\n return {\n prompt: input.prompt,\n input_image_1: urls[0],\n ...(input.aspect_ratio ? { aspect_ratio: input.aspect_ratio } : {}),\n };\n case 'gpt-image-2-edit':\n // image_urls only, min 1 max 8 — never image_url.\n return {\n prompt: input.prompt,\n image_urls: urls.slice(0, 8),\n ...(input.aspect_ratio ? { aspect_ratio: input.aspect_ratio } : {}),\n };\n case 'xai-image-edit':\n return {\n prompt: input.prompt,\n image_url: urls[0],\n ...(input.aspect_ratio ? { aspect_ratio: input.aspect_ratio } : {}),\n };\n case 'google-nano-banana':\n // Nano Banana accepts image_input as an array of URLs.\n return {\n prompt: input.prompt,\n image_input: urls,\n ...(input.aspect_ratio ? { aspect_ratio: input.aspect_ratio } : {}),\n };\n default:\n return {\n prompt: input.prompt,\n image_url: urls[0],\n };\n }\n}\n\n/** Build the request body, asking the model's published schema where its\n * reference images go and how many it takes. Falls back to the static map\n * above only when the schema is unreachable. */\nasync function buildBody(\n apiId: string,\n input: Input,\n ctx: SkillContext,\n): Promise<{ body: { prompt: string; [key: string]: unknown }; dropped: number }> {\n const urls =\n input.image_urls && input.image_urls.length > 0\n ? input.image_urls\n : input.image_url\n ? [input.image_url]\n : [];\n\n const refs = await resolveImageRefs(apiId, urls, ctx.client);\n if (!refs) return { body: buildPayload(apiId, input), dropped: 0 };\n\n const fallback = buildPayload(apiId, input);\n const body: { prompt: string; [key: string]: unknown } = { ...fallback };\n // Drop whatever key the fallback guessed; the declaration/schema is\n // authoritative.\n for (const key of ['image_url', 'image_urls', 'images', 'image_input', 'input_image_1']) {\n if (key !== refs.key) delete body[key];\n }\n body.prompt = input.prompt;\n body[refs.key] = refs.value;\n if (refs.also) Object.assign(body, refs.also);\n return { body, dropped: refs.dropped };\n}\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n const paramsGate = paramsWithoutModel(input.params, input.model);\n if (paramsGate) return { kind: 'text', text: paramsGate };\n\n // Resolve any local paths into URLs first. image_paths takes precedence\n // over image_path; both merge into the URL list the buildPayload step\n // already understands. Explicit URLs always win — paths are a fallback\n // for \"I only have a local file.\"\n let resolved: Input = input;\n try {\n if (input.image_paths && input.image_paths.length > 0) {\n const urls = await uploadLocalFiles(input.image_paths, ctx);\n resolved = {\n ...input,\n image_urls: [...(input.image_urls ?? []), ...urls],\n };\n } else if (input.image_path && !input.image_url) {\n const url = await uploadLocalFile(input.image_path, ctx);\n resolved = { ...input, image_url: url };\n }\n } catch (err) {\n if (err instanceof SkillUploadError) {\n return { kind: 'text', text: `pixeldojo_edit (upload): ${err.userMessage}` };\n }\n throw err;\n }\n\n if (\n !resolved.image_url &&\n (!resolved.image_urls || resolved.image_urls.length === 0)\n ) {\n return {\n kind: 'text',\n text:\n 'pixeldojo_edit requires at least one reference image. Pass image_url / image_urls (hosted URL) or image_path / image_paths (local file).',\n };\n }\n\n const apiId = resolved.model ?? DEFAULT_MODEL;\n resolved = {\n ...resolved,\n aspect_ratio: await snapAspectRatio(apiId, resolved.aspect_ratio, ctx.client),\n };\n const { body, dropped } = await buildBody(apiId, resolved, ctx);\n const droppedNote =\n dropped > 0\n ? ` (${dropped} reference${dropped === 1 ? '' : 's'} dropped — ${apiId} accepts fewer)`\n : '';\n const paramsNote = applyParams(body, input.params, input.model, apiId);\n\n const submitted = await ctx.client.run(apiId, body);\n const result = await pollJobUntilDoneOrHandoff(\n submitted.jobId,\n (id) => ctx.client.getJob(id),\n ctx.buildStatusUrl,\n {\n now: ctx.pollOverrides?.now,\n sleep: ctx.pollOverrides?.sleep,\n },\n );\n\n return prefixNote(\n pollResultToSkillResult(result, (urls) =>\n urls.length === 0\n ? `Edit job ${submitted.jobId} completed but returned no assets.`\n : urls.length === 1\n ? `Edit complete${droppedNote}. Asset: ${urls[0]}`\n : `Edit produced ${urls.length} assets${droppedNote}. URLs: ${urls.join(', ')}`,\n ),\n paramsNote,\n );\n}\n\nexport const editSkill: SkillModule<Input> = {\n name: 'pixeldojo_edit',\n description:\n 'Edit an existing image with a text instruction. Defaults to wan-2.7-image-edit; pass `model` to pick another edit-capable apiId. Supports up to 9 reference images for multi-image composition. For reference images: pass image_url(s) for hosted URLs or image_path(s) for absolute local file paths (skill uploads to 24h temp storage automatically).',\n hostedDescription:\n 'Edit an existing image with a text instruction. Defaults to wan-2.7-image-edit; pass `model` to pick another edit-capable apiId. Supports up to 9 reference images for multi-image composition. Pass reference images as public http(s) URLs via image_url or image_urls.',\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n allowedModels: [...ALLOWED_MODELS],\n defaultModel: DEFAULT_MODEL,\n run,\n};\n","/**\n * pixeldojo_character — consistent characters across shots.\n *\n * The whitelist MIRRORS `AGENT_CHARACTER_MODELS` in the app's\n * lib/agent/roster.ts — Character Studio's roster, which is the list that was\n * actually verified for likeness retention. This package publishes to npm\n * standalone and cannot import from the app, so the array below is a copy;\n * the app's tests/contracts/mcp-character-roster-parity.test.ts fails if the\n * two drift. That drift is not hypothetical: flux-edit and gpt-image-2-edit\n * sat here for months after the agent dropped them (\"never identity models\"),\n * so MCP callers were routed to models that cannot lock a face.\n *\n * ideogram-character is deliberately NOT offered: its tool schema requires\n * a field named `character_reference_image` (singular) that none of this\n * skill's request shapes produce, so every call to it failed with\n * \"character_reference_image: Required\" — confirmed via a live test sweep\n * 2026-07-08, never caught before because nothing exercised the reference-\n * image path end-to-end.\n */\nimport { z } from 'zod';\nimport { pollJobUntilDoneOrHandoff } from '../poll.js';\nimport {\n type SkillContext,\n type SkillModule,\n type SkillResult,\n pollResultToSkillResult,\n} from './types.js';\nimport { isAudioUrl, isVideoUrl, resolveImageRefs, snapAspectRatio } from './schema-snap.js';\nimport {\n PARAMS_JSON_SCHEMA,\n ParamsInput,\n applyParams,\n paramsWithoutModel,\n prefixNote,\n} from './params.js';\n\nconst ALLOWED = [\n 'seedream-5',\n 'seedream-4',\n 'seedream-5-flash',\n 'google-nano-banana',\n 'wan-2.7-image-edit',\n 'qwen-3-pro',\n 'qwen-image-2.0-pro',\n] as const;\ntype AllowedModel = (typeof ALLOWED)[number];\nconst DEFAULT_MODEL: AllowedModel = 'seedream-5';\n\n/** The agent's own cap on reference images. More angles of the same person\n * lock a face far better than one photo; models with a smaller schema cap\n * get clamped to it by resolveImageRefs, which reads maxItems. */\nconst MAX_REFERENCES = 9;\n\n// wan-2.7-image-edit is an edit model — its schema requires image_urls\n// (min 1), unlike the rest of the roster which can generate from a prompt\n// alone. Without this gate the request reaches the backend and is rejected\n// downstream (\"image_urls: Array must contain at least 1 element(s)\"), which\n// loops agents that retry without realizing the input was the issue.\nconst REQUIRES_REFERENCE = new Set<AllowedModel>(['wan-2.7-image-edit']);\n\n/** OFFLINE FALLBACK ONLY — where each roster model keys its references when\n * GET /schema is unreachable. Copied from each tool.config's `media.image`\n * declaration, which is what resolveImageRefs returns when it CAN reach the\n * endpoint. All are array fields. */\nconst FALLBACK_REF_KEY: Record<AllowedModel, string> = {\n 'seedream-5': 'image_urls',\n 'seedream-4': 'image_urls',\n 'seedream-5-flash': 'image_urls',\n 'google-nano-banana': 'image_input',\n 'wan-2.7-image-edit': 'image_urls',\n 'qwen-3-pro': 'image',\n 'qwen-image-2.0-pro': 'reference_images',\n};\n\nconst InputSchema = z.object({\n prompt: z.string().min(1).max(8000),\n model: z\n .string()\n .optional()\n .describe(`One of: ${ALLOWED.join(', ')}. Defaults to ${DEFAULT_MODEL}.`),\n reference_image_url: z\n .string()\n .url()\n .optional()\n .describe(\n 'Single reference image of the character. Prefer reference_image_urls — more angles lock the face better.',\n ),\n reference_image_urls: z\n .array(z.string().url())\n .min(1)\n .max(MAX_REFERENCES)\n .optional()\n .describe(\n `All references for this shot (1-${MAX_REFERENCES}), most important first. Multiple angles of the same person lock the face far better than one photo. Models that take fewer are clamped to their own cap.`,\n ),\n aspect_ratio: z.string().optional().describe('Honored where the model declares the field.'),\n params: ParamsInput,\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n prompt: { type: 'string', description: 'The shot to render: scene, pose, wardrobe, framing. The references supply the identity.' },\n model: {\n type: 'string',\n enum: ALLOWED,\n description: `One of: ${ALLOWED.join(', ')}. Defaults to ${DEFAULT_MODEL}.`,\n },\n reference_image_url: {\n type: 'string',\n format: 'uri',\n description:\n 'Single still of the character. Ignored when reference_image_urls is set; prefer that, since more angles lock the face better.',\n },\n reference_image_urls: {\n type: 'array',\n items: { type: 'string', format: 'uri' },\n minItems: 1,\n maxItems: MAX_REFERENCES,\n description:\n 'All reference stills for this shot (1-9), most important first. Multiple angles of the same person lock the face far better than one photo. Models that take fewer keep the first ones and the result says how many were dropped. Required for wan-2.7-image-edit; clips and audio are refused.',\n },\n aspect_ratio: {\n type: 'string',\n description:\n 'e.g. \"1:1\", \"16:9\", \"9:16\". Snapped to the nearest ratio the model supports, and dropped for models with no aspect_ratio field (including the default seedream-5, which sizes by image_size: set that in params with an explicit model).',\n },\n params: PARAMS_JSON_SCHEMA,\n },\n required: ['prompt'],\n} as const;\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n const paramsGate = paramsWithoutModel(input.params, input.model);\n if (paramsGate) return { kind: 'text', text: paramsGate };\n\n const requested = (input.model ?? DEFAULT_MODEL) as string;\n if (!(ALLOWED as readonly string[]).includes(requested)) {\n return {\n kind: 'text',\n text:\n `Unknown model \"${requested}\" for pixeldojo_character. ` +\n `Allowed: ${ALLOWED.join(', ')}.`,\n };\n }\n const apiId = requested as AllowedModel;\n\n const refUrls = (\n input.reference_image_urls && input.reference_image_urls.length > 0\n ? input.reference_image_urls\n : input.reference_image_url\n ? [input.reference_image_url]\n : []\n ).filter((u, i, all) => all.indexOf(u) === i);\n\n // Identity work is still-image work. A clip or a track handed to any model\n // on this roster dies at the PROVIDER (\"does not point to a valid image …\n // content-type: video/mp4\"), after the credit deduction, and its rejection\n // tells the caller nothing about where that file could have gone.\n const wrongKind = refUrls.find((u) => isVideoUrl(u) || isAudioUrl(u));\n if (wrongKind) {\n return {\n kind: 'text',\n text:\n `pixeldojo_character works on still images, and ${wrongKind} is not one. ` +\n `Use pixeldojo_generate or pixeldojo_storyboard with video_url to work from a clip ` +\n `(or image_url for an audio track — they route to the reference engine). ` +\n `For this treatment, give me a still frame.`,\n };\n }\n\n if (REQUIRES_REFERENCE.has(apiId) && refUrls.length === 0) {\n return {\n kind: 'text',\n text:\n `pixeldojo_character with model=\"${apiId}\" requires a reference image ` +\n `(reference_image_url / reference_image_urls — the source image of the character to edit). ` +\n `For generation from a prompt alone, use model=\"${DEFAULT_MODEL}\".`,\n };\n }\n\n const body: { prompt: string; [key: string]: unknown } = { prompt: input.prompt };\n let dropped = 0;\n if (refUrls.length > 0) {\n // Where the references go comes from the model's DECLARED media slot,\n // falling back to its published schema, falling back to the static map.\n // The old hardcoded per-model switch is what let flux-edit receive\n // `input_image` when its schema wants `input_image_1` — a wrong key is\n // silently stripped, so the user is billed for an image built from\n // nothing.\n const refs = await resolveImageRefs(apiId, refUrls, ctx.client);\n if (refs) {\n body[refs.key] = refs.value;\n if (refs.also) Object.assign(body, refs.also);\n dropped = refs.dropped;\n } else {\n body[FALLBACK_REF_KEY[apiId]] = refUrls;\n }\n }\n // seedream-5/seedream-4 key sizing on `image_size` instead of aspect_ratio\n // — snapAspectRatio confirms this from each model's real schema and omits\n // the field entirely for them, rather than relying on a hardcoded per-model\n // allowlist that can go stale. onUnknown 'omit': when the schema fetch\n // fails we must NOT forward aspect_ratio to models whose schemas never\n // declared it.\n const snappedAspect = await snapAspectRatio(apiId, input.aspect_ratio, ctx.client, {\n onUnknown: 'omit',\n });\n if (snappedAspect !== undefined) body.aspect_ratio = snappedAspect;\n\n const note = [\n dropped > 0\n ? `${dropped} reference${dropped === 1 ? '' : 's'} dropped — ${apiId} accepts fewer.`\n : undefined,\n applyParams(body, input.params, input.model, apiId),\n ]\n .filter(Boolean)\n .join(' ');\n\n const submitted = await ctx.client.run(apiId, body);\n\n const result = await pollJobUntilDoneOrHandoff(\n submitted.jobId,\n (id) => ctx.client.getJob(id),\n ctx.buildStatusUrl,\n {\n now: ctx.pollOverrides?.now,\n sleep: ctx.pollOverrides?.sleep,\n },\n );\n\n return prefixNote(\n pollResultToSkillResult(result, (urls) =>\n urls.length === 0\n ? `Job ${submitted.jobId} completed but returned no assets.`\n : `Character shot ready. Asset: ${urls[0]}`,\n ),\n note,\n );\n}\n\nexport const characterSkill: SkillModule<Input> = {\n name: 'pixeldojo_character',\n description:\n 'Generate or edit consistent characters across shots. Pass reference_image_urls (up to 9) to lock identity — send every photo of the person you have, since more angles hold the face far better than one. Defaults to seedream-5.',\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n allowedModels: [...ALLOWED],\n defaultModel: DEFAULT_MODEL,\n run,\n};\n","/**\n * pixeldojo_storyboard — multi-shot scenes from one brief.\n *\n * v1 implementation: dispatches a single video generation as the storyboard\n * \"preview\" frame. Full multi-shot orchestration (4+ shots stitched together)\n * is a future enhancement that needs LLM-driven shot decomposition; for now\n * the skill ships as a single-call surface so LLMs can issue it without\n * waiting on that pipeline.\n *\n * Whitelisted models: veo-3.1-fast (default), veo-3.1-standard,\n * kling-video-v3-standard-text, seedance-2-high, seedance-2-reference\n * (the reference engine — see run()).\n *\n * Reference flows (image_url / video_url) delegate to pixeldojo_generate\n * rather than duplicating its media routing; the allowlist and the brief\n * still belong to this skill.\n */\nimport { z } from 'zod';\nimport { pollJobUntilDoneOrHandoff } from '../poll.js';\nimport {\n type SkillContext,\n type SkillModule,\n type SkillResult,\n pollResultToSkillResult,\n} from './types.js';\nimport { snapAspectRatio, snapDuration } from './schema-snap.js';\nimport { VIDEO_REFERENCE_MODEL, generateSkill } from './generate.js';\nimport {\n PARAMS_JSON_SCHEMA,\n ParamsInput,\n applyParams,\n paramsWithoutModel,\n prefixNote,\n} from './params.js';\n\n// Bare family ids ('veo-3.1', 'kling-video', 'seedance-2') are grouping\n// constructs only — none is itself a runnable public apiId (all three\n// 404'd with \"Model '<id>' not found\", confirmed via a live test sweep\n// 2026-07-08). Real variants:\n// - veo-3.1-fast/-standard/-lite — -lite excluded (drops reference-image,\n// audio, 1:1-aspect support an agent caller may reasonably assume).\n// - kling-video splits into separate -text/-image apiIds (a `mode` field\n// baked into each variant's inputDefaults, not a runtime choice on one\n// shared id) — this v1 skill has no image input yet, so -text.\n// - seedance-2 splits into -high (general/default) and -reference\n// (dedicated image-conditioned variant) — same reasoning, -high.\n// Both -text/-high were live-tested end to end 2026-07-08: dispatched,\n// handed off past the 30s sync window, and completed with a real asset.\n// - seedance-2-reference is the reference engine: the only entry here that\n// reads a still, a clip OR an audio track, so every reference-bearing\n// storyboard with no model named goes to it (see run()).\nconst ALLOWED = [\n 'veo-3.1-fast',\n 'veo-3.1-standard',\n 'kling-video-v3-standard-text',\n 'seedance-2-high',\n VIDEO_REFERENCE_MODEL,\n] as const;\ntype AllowedModel = (typeof ALLOWED)[number];\nconst DEFAULT_MODEL: AllowedModel = 'veo-3.1-fast';\n\nconst InputSchema = z.object({\n brief: z.string().min(1).max(8000).describe('Storyboard brief: scene, shots, mood, action.'),\n model: z\n .string()\n .optional()\n .describe(`One of: ${ALLOWED.join(', ')}. Defaults to ${DEFAULT_MODEL}.`),\n aspect_ratio: z.string().optional(),\n duration: z.number().int().positive().optional(),\n image_url: z\n .string()\n .url()\n .optional()\n .describe('Reference still to build the shot from (character, product, location).'),\n video_url: z\n .string()\n .url()\n .optional()\n .describe('Source clip to work from. Use this for videos; image_url is for still frames.'),\n params: ParamsInput,\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n brief: {\n type: 'string',\n description: 'Scene brief: setting, action, camera, mood. Sent to the video model as its prompt.',\n },\n model: {\n type: 'string',\n enum: ALLOWED,\n description: `One of: ${ALLOWED.join(', ')}. Defaults to ${DEFAULT_MODEL}, or ${VIDEO_REFERENCE_MODEL} when image_url or video_url is given.`,\n },\n aspect_ratio: {\n type: 'string',\n description:\n 'e.g. \"16:9\", \"9:16\", \"1:1\". Snapped to the nearest ratio the model supports, and dropped if the model has no aspect_ratio field.',\n },\n duration: {\n type: 'integer',\n description: 'Clip length in seconds. Snapped or clamped to what the model allows.',\n },\n image_url: {\n type: 'string',\n format: 'uri',\n description:\n 'Reference still to build the shot from (character, product, location). A clip or audio URL here is detected by extension and routed as that kind of media.',\n },\n video_url: {\n type: 'string',\n format: 'uri',\n description:\n 'Source clip to work from. Use this for videos; image_url is for stills. A named model with no clip input is swapped for seedance-2-reference and the result says so.',\n },\n params: PARAMS_JSON_SCHEMA,\n },\n required: ['brief'],\n} as const;\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n const paramsGate = paramsWithoutModel(input.params, input.model);\n if (paramsGate) return { kind: 'text', text: paramsGate };\n\n const requested = (input.model ?? DEFAULT_MODEL) as string;\n if (!(ALLOWED as readonly string[]).includes(requested)) {\n return {\n kind: 'text',\n text:\n `Unknown model \"${requested}\" for pixeldojo_storyboard. ` +\n `Allowed: ${ALLOWED.join(', ')}.`,\n };\n }\n\n // A reference-bearing storyboard is exactly what pixeldojo_generate already\n // does: media-kind detection, declared media slots, the clip-engine\n // substitution note, and the params overlay. Delegate instead of growing a\n // second copy of that here — this skill's own job is the brief and the\n // video-model allowlist, both of which still apply above.\n //\n // The unnamed-model default flips to the reference engine rather than\n // generate's text-to-image default: a storyboard shot is a video, and the\n // reference engine is the one entry that reads a still, a clip or a track.\n // Params can't leak onto it unasked — the gate above refuses them without\n // an explicit model.\n if (input.image_url || input.video_url) {\n return generateSkill.run(\n {\n prompt: input.brief,\n model: input.model ?? VIDEO_REFERENCE_MODEL,\n image_url: input.image_url,\n video_url: input.video_url,\n aspect_ratio: input.aspect_ratio,\n duration: input.duration,\n params: input.params,\n },\n ctx,\n );\n }\n\n const apiId = requested as AllowedModel;\n\n const [snappedAspect, snappedDuration] = await Promise.all([\n snapAspectRatio(apiId, input.aspect_ratio, ctx.client),\n snapDuration(apiId, input.duration, ctx.client),\n ]);\n const body: { prompt: string; [key: string]: unknown } = { prompt: input.brief };\n if (snappedAspect !== undefined) body.aspect_ratio = snappedAspect;\n if (snappedDuration !== undefined) body.duration = snappedDuration;\n const note = applyParams(body, input.params, input.model, apiId);\n\n const submitted = await ctx.client.run(apiId, body);\n\n const result = await pollJobUntilDoneOrHandoff(\n submitted.jobId,\n (id) => ctx.client.getJob(id),\n ctx.buildStatusUrl,\n {\n now: ctx.pollOverrides?.now,\n sleep: ctx.pollOverrides?.sleep,\n },\n );\n\n return prefixNote(\n pollResultToSkillResult(result, (urls) =>\n urls.length === 0\n ? `Job ${submitted.jobId} completed but returned no assets.`\n : `Storyboard preview ready. Asset: ${urls[0]}`,\n ),\n note,\n );\n}\n\nexport const storyboardSkill: SkillModule<Input> = {\n name: 'pixeldojo_storyboard',\n description:\n 'Generate one short video clip (a single shot, not a multi-panel storyboard) from a scene brief. A text-only brief runs on veo-3.1-fast unless `model` names another allowed video model. With image_url (reference still) or video_url (source clip) and no `model`, it runs on seedance-2-reference, with the same reference routing as pixeldojo_generate. For a multi-shot film with dialogue and a soundtrack, use pixeldojo_film.',\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n allowedModels: [...ALLOWED],\n defaultModel: DEFAULT_MODEL,\n run,\n};\n","/**\n * pixeldojo_upscale — enhance any image or video.\n *\n * Whitelisted models: magnific-upscaler (default), creative-upscale,\n * face-enhance, video-upscaler. The image models key the source on `image`\n * (NOT `image_url` — every one of those tool schemas uses `image`; sending\n * `image_url` previously 400'd with \"image: Required\" on every call,\n * confirmed via a live test sweep 2026-07-08). scale_factor also differs by\n * model: magnific wants a string enum ('2x'|'4x'|'8x'|'16x'), the others a\n * plain number — this skill takes a plain number from the caller and\n * converts per model. video-upscaler (FlashVSR) keys the clip on `video`\n * and requires `video_duration` (its credit meter); a clip auto-routes to\n * it when no model is named.\n */\nimport { z } from 'zod';\nimport { pollJobUntilDoneOrHandoff } from '../poll.js';\nimport {\n type SkillContext,\n type SkillModule,\n type SkillResult,\n pollResultToSkillResult,\n} from './types.js';\nimport { isVideoUrl } from './schema-snap.js';\n\nconst ALLOWED = ['magnific-upscaler', 'creative-upscale', 'face-enhance', 'video-upscaler'] as const;\ntype AllowedModel = (typeof ALLOWED)[number];\nconst DEFAULT_MODEL: AllowedModel = 'magnific-upscaler';\nconst VIDEO_MODEL: AllowedModel = 'video-upscaler';\n\nconst VIDEO_RESOLUTIONS = ['720p', '1080p', '2k', '4k'] as const;\n\nconst InputSchema = z.object({\n image_url: z.string().url().optional().describe('URL of the source image to upscale.'),\n video_url: z\n .string()\n .url()\n .optional()\n .describe('URL of a source video clip — routes to video-upscaler. MP4 only, max 500 MB.'),\n model: z\n .string()\n .optional()\n .describe(`One of: ${ALLOWED.join(', ')}. Defaults to ${DEFAULT_MODEL} (a clip defaults to ${VIDEO_MODEL}).`),\n scale_factor: z\n .number()\n .min(1)\n .max(16)\n .optional()\n .describe(\n 'Image models only. Magnific snaps to the nearest of 2/4/8/16 (default 2); creative-upscale accepts 1-10 (default 2); face-enhance accepts 1-8 (default 4).',\n ),\n creativity: z\n .number()\n .int()\n .min(-10)\n .max(10)\n .optional()\n .describe('Magnific only: integer -10 (preserve) → 10 (creative). Defaults to 0.'),\n video_duration: z\n .number()\n .positive()\n .optional()\n .describe('video-upscaler only, REQUIRED there: source clip length in seconds (its credit meter).'),\n target_resolution: z\n .enum(VIDEO_RESOLUTIONS)\n .optional()\n .describe('video-upscaler only: target output resolution. Defaults to 1080p.'),\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n image_url: {\n type: 'string',\n format: 'uri',\n description: 'Source image to upscale (image models). A clip URL here (.mp4/.mov/.webm) is treated as video_url.',\n },\n video_url: {\n type: 'string',\n format: 'uri',\n description: 'Source video clip (MP4, max 500 MB). Routes to video-upscaler when no model is named; needs video_duration.',\n },\n model: {\n type: 'string',\n enum: ALLOWED,\n description: `Defaults to ${DEFAULT_MODEL}, or ${VIDEO_MODEL} when the source is a clip. face-enhance is for portraits.`,\n },\n scale_factor: {\n type: 'number',\n minimum: 1,\n maximum: 16,\n description:\n 'Image models only. magnific-upscaler snaps to the nearest of 2/4/8/16 (default 2); creative-upscale clamps to 1-10 (default 2); face-enhance clamps to 1-8 (default 4).',\n },\n creativity: {\n type: 'integer',\n minimum: -10,\n maximum: 10,\n description: 'magnific-upscaler only: sent unchanged as its creativity setting, an integer from -10 to 10 (default 0; lower preserves the source, higher invents more detail).',\n },\n video_duration: {\n type: 'number',\n description: 'video-upscaler only, required there: source clip length in seconds. It sets the cost (1 credit per second).',\n },\n target_resolution: {\n type: 'string',\n enum: VIDEO_RESOLUTIONS,\n description: 'video-upscaler only: output resolution. Defaults to 1080p.',\n },\n },\n} as const;\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n // A clip in either slot (video_url, or an mp4 pasted into image_url — the\n // habit of most LLMs) means the video upscaler; no model named routes there\n // automatically rather than sending an mp4 to an image engine.\n const clipUrl =\n input.video_url ?? (input.image_url && isVideoUrl(input.image_url) ? input.image_url : undefined);\n const requested = (input.model ?? (clipUrl ? VIDEO_MODEL : DEFAULT_MODEL)) as string;\n if (!(ALLOWED as readonly string[]).includes(requested)) {\n return {\n kind: 'text',\n text: `Unknown model \"${requested}\" for pixeldojo_upscale. Allowed: ${ALLOWED.join(', ')}.`,\n };\n }\n const apiId = requested as AllowedModel;\n\n if (apiId === VIDEO_MODEL) {\n if (!clipUrl) {\n return {\n kind: 'text',\n text: 'pixeldojo_upscale with model=\"video-upscaler\" requires video_url (the source clip).',\n };\n }\n if (input.video_duration === undefined) {\n return {\n kind: 'text',\n text:\n 'pixeldojo_upscale with model=\"video-upscaler\" requires video_duration ' +\n '(source clip length in seconds — it sets the credit cost, 1 credit/second).',\n };\n }\n } else if (!input.image_url || input.image_url === clipUrl) {\n // Second clause: an explicitly-named image model whose only source is a\n // clip. Dispatching the mp4 dies at the provider AFTER the credit\n // deduction, so refuse with the correction instead.\n return {\n kind: 'text',\n text: input.image_url\n ? `${apiId} upscales still images, but the source is a video clip. Use model=\"video-upscaler\" with video_url and video_duration (seconds).`\n : `pixeldojo_upscale with model=\"${apiId}\" requires image_url (the source image).`,\n };\n }\n\n // Upscalers have no `prompt` field but the SDK's RunOptions requires one;\n // pass an empty string. Zod strips unrecognized keys by default (no\n // .passthrough() on any tool schema), so the extra field is silently\n // dropped for models that don't declare it.\n const body: { prompt: string; [key: string]: unknown } = {\n prompt: '',\n ...(apiId === VIDEO_MODEL ? { video: clipUrl } : { image: input.image_url }),\n };\n if (apiId === VIDEO_MODEL) {\n body.video_duration = input.video_duration;\n if (input.target_resolution) body.target_resolution = input.target_resolution;\n } else if (apiId === 'magnific-upscaler') {\n const allowed = [2, 4, 8, 16];\n const requestedScale = input.scale_factor ?? 2;\n const nearest = allowed.reduce((a, b) =>\n Math.abs(b - requestedScale) < Math.abs(a - requestedScale) ? b : a,\n );\n body.scale_factor = `${nearest}x`;\n if (input.creativity !== undefined) body.creativity = input.creativity;\n } else if (apiId === 'creative-upscale') {\n body.scale_factor = Math.min(10, Math.max(1, input.scale_factor ?? 2));\n } else if (apiId === 'face-enhance') {\n body.scale_factor = Math.min(8, Math.max(1, input.scale_factor ?? 4));\n }\n\n const submitted = await ctx.client.run(apiId, body);\n\n const result = await pollJobUntilDoneOrHandoff(\n submitted.jobId,\n (id) => ctx.client.getJob(id),\n ctx.buildStatusUrl,\n {\n now: ctx.pollOverrides?.now,\n sleep: ctx.pollOverrides?.sleep,\n },\n );\n\n return pollResultToSkillResult(result, (urls) =>\n urls.length === 0\n ? `Job ${submitted.jobId} completed but returned no assets.`\n : `Upscaled. Asset: ${urls[0]}`,\n );\n}\n\nexport const upscaleSkill: SkillModule<Input> = {\n name: 'pixeldojo_upscale',\n description:\n 'Enhance an image or video. Magnific (default) supports configurable scale_factor and creativity; face-enhance for portraits; video-upscaler (FlashVSR, up to 4K) for clips — pass video_url plus video_duration in seconds.',\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n allowedModels: [...ALLOWED],\n defaultModel: DEFAULT_MODEL,\n run,\n};\n","/**\n * pixeldojo_caption — burn animated word-by-word captions onto a video.\n *\n * One model, `video-autocaption`: it transcribes the speech and burns the\n * captions with the spoken word lit, placed clear of the TikTok/Reels/Shorts\n * buttons. A clip with no speech is refused before any charge.\n */\nimport { z } from 'zod';\nimport { pollJobUntilDoneOrHandoff } from '../poll.js';\nimport {\n type SkillContext,\n type SkillModule,\n type SkillResult,\n pollResultToSkillResult,\n} from './types.js';\n\nconst MODEL = 'video-autocaption';\nconst STYLES = ['pop', 'highlighter', 'clean'] as const;\n\nconst InputSchema = z.object({\n video_url: z.string().url().describe('URL of the video to caption. It must have speech.'),\n style: z.enum(STYLES).optional(),\n highlight_color: z.string().optional(),\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n required: ['video_url'],\n properties: {\n video_url: {\n type: 'string',\n format: 'uri',\n description: 'The video to caption (MP4 or MOV). It must have speech; a silent clip is refused uncharged.',\n },\n style: {\n type: 'string',\n enum: STYLES,\n description:\n 'pop (default): bold caps, the spoken word lit and growing. highlighter: the spoken word on a block of the color. clean: sentence case on a dark box.',\n },\n highlight_color: {\n type: 'string',\n description: 'The highlight as #RRGGBB (a brand color) or a name like yellow, green, pink. Defaults to yellow.',\n },\n },\n} as const;\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n // The SDK's RunOptions requires a prompt; the tool has none and its schema\n // strips the key.\n const submitted = await ctx.client.run(MODEL, {\n prompt: '',\n video: input.video_url,\n ...(input.style ? { caption_style: input.style } : {}),\n ...(input.highlight_color ? { highlight_color: input.highlight_color } : {}),\n });\n\n const result = await pollJobUntilDoneOrHandoff(\n submitted.jobId,\n (id) => ctx.client.getJob(id),\n ctx.buildStatusUrl,\n { now: ctx.pollOverrides?.now, sleep: ctx.pollOverrides?.sleep },\n );\n\n return pollResultToSkillResult(result, (urls) =>\n urls.length === 0\n ? `Job ${submitted.jobId} completed but returned no assets.`\n : `Captioned. Asset: ${urls[0]}`,\n );\n}\n\nexport const captionSkill: SkillModule<Input> = {\n name: 'pixeldojo_caption',\n description:\n 'Burn animated word-by-word captions onto a video with speech, the short-form look for TikTok, Reels and Shorts: the spoken word lights up, placed above the platform buttons. Pass video_url; optional style (pop, highlighter, clean) and highlight_color (#RRGGBB for a brand color). 5 credits.',\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n allowedModels: [MODEL],\n defaultModel: MODEL,\n run,\n};\n","/**\n * pixeldojo_overlay — short-form ad text layouts on a finished video.\n *\n * One model, `brand-overlay`: exact text (never a video model's spelling) in\n * the brand color, kept clear of the platform UI. Layouts: hook title (first\n * seconds), lower-third callout, review card, progress bar, offer badge, and\n * an end card that holds the last frame under a logo, headline and button.\n */\nimport { z } from 'zod';\nimport { pollJobUntilDoneOrHandoff } from '../poll.js';\nimport {\n type SkillContext,\n type SkillModule,\n type SkillResult,\n pollResultToSkillResult,\n} from './types.js';\n\nconst MODEL = 'brand-overlay';\n\nconst InputSchema = z.object({\n video_url: z.string().url(),\n color: z.string().optional(),\n hook: z.object({ text: z.string().max(60), duration_sec: z.number().min(1).max(6).optional() }).optional(),\n callout: z\n .object({\n title: z.string().max(32),\n subtitle: z.string().max(40).optional(),\n start_sec: z.number().min(0).optional(),\n duration_sec: z.number().min(1).max(10).optional(),\n })\n .optional(),\n review: z\n .object({\n quote: z.string().max(90),\n name: z.string().max(30).optional(),\n stars: z.number().int().min(1).max(5).optional(),\n start_sec: z.number().min(0).optional(),\n duration_sec: z.number().min(1).max(10).optional(),\n })\n .optional(),\n progress_bar: z.boolean().optional(),\n offer: z\n .object({\n text: z.string().max(24),\n subtext: z.string().max(40).optional(),\n start_sec: z.number().min(0).optional(),\n duration_sec: z.number().min(1).max(10).optional(),\n position: z.enum(['top', 'bottom']).optional(),\n })\n .optional(),\n end_card: z\n .object({\n headline: z.string().max(40),\n cta: z.string().max(24).optional(),\n url: z.string().max(40).optional(),\n logo_url: z.string().url().optional(),\n duration_sec: z.number().min(2).max(5).optional(),\n })\n .optional(),\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n required: ['video_url'],\n properties: {\n video_url: { type: 'string', format: 'uri', description: 'The video to brand (MP4 or MOV).' },\n color: { type: 'string', description: 'Brand color as #RRGGBB: the badge and the button. Defaults to #FFE500.' },\n hook: {\n type: 'object',\n description: 'Hook title over the first seconds, the overlay that decides whether people keep watching. 5-8 words.',\n required: ['text'],\n properties: {\n text: { type: 'string', maxLength: 60, description: 'e.g. \"Octopuses have THREE hearts?\".' },\n duration_sec: { type: 'number', minimum: 1, maximum: 6, description: 'Default 2.5.' },\n },\n },\n callout: {\n type: 'object',\n description: 'Lower-third label that slides in from the left: a benefit (\"Ships in 24h\") or a name and title.',\n required: ['title'],\n properties: {\n title: { type: 'string', maxLength: 32, description: 'The label.' },\n subtitle: { type: 'string', maxLength: 40, description: 'Optional second line.' },\n start_sec: { type: 'number', description: 'Default 3.' },\n duration_sec: { type: 'number', minimum: 1, maximum: 10, description: 'Default 4.' },\n },\n },\n review: {\n type: 'object',\n description: 'Review card: stars, a short quote and a name.',\n required: ['quote'],\n properties: {\n quote: { type: 'string', maxLength: 90, description: 'The review text, without quote marks.' },\n name: { type: 'string', maxLength: 30, description: 'e.g. \"Jess, verified buyer\".' },\n stars: { type: 'integer', minimum: 1, maximum: 5, description: 'Default 5.' },\n start_sec: { type: 'number', description: 'Default just after the hook.' },\n duration_sec: { type: 'number', minimum: 1, maximum: 10, description: 'Default 4.' },\n },\n },\n progress_bar: { type: 'boolean', description: 'A thin bar in the brand color across the top that fills as the video plays.' },\n offer: {\n type: 'object',\n description: 'Offer callout: a badge that pops in on cue (after the hook when there is one).',\n required: ['text'],\n properties: {\n text: { type: 'string', maxLength: 24, description: 'e.g. \"50% OFF\".' },\n subtext: { type: 'string', maxLength: 40, description: 'Small line under it, e.g. \"This week only\".' },\n start_sec: { type: 'number', description: 'Second it appears. Default 0.5.' },\n duration_sec: { type: 'number', minimum: 1, maximum: 10, description: 'Seconds it stays. Default 3.' },\n position: { type: 'string', enum: ['top', 'bottom'], description: 'Default top.' },\n },\n },\n end_card: {\n type: 'object',\n description: 'End card held after the last frame.',\n required: ['headline'],\n properties: {\n headline: { type: 'string', maxLength: 40, description: 'e.g. \"Your new favorite mug\".' },\n cta: { type: 'string', maxLength: 24, description: 'Button text, e.g. \"Shop now\".' },\n url: { type: 'string', maxLength: 40, description: 'Web address shown under the button.' },\n logo_url: { type: 'string', format: 'uri', description: 'PNG (transparent works best) or JPG.' },\n duration_sec: { type: 'number', minimum: 2, maximum: 5, description: 'Default 3.' },\n },\n },\n },\n} as const;\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n const { hook, callout, review, offer, end_card: card } = input;\n if (!hook && !callout && !review && !input.progress_bar && !offer && !card) {\n return { kind: 'text', text: 'pixeldojo_overlay needs at least one of hook, callout, review, progress_bar, offer or end_card.' };\n }\n const submitted = await ctx.client.run(MODEL, {\n prompt: '',\n video: input.video_url,\n ...(input.color ? { color: input.color } : {}),\n ...(hook ? { hook_text: hook.text, hook_duration: hook.duration_sec } : {}),\n ...(callout\n ? {\n callout_title: callout.title,\n callout_subtitle: callout.subtitle,\n callout_start: callout.start_sec,\n callout_duration: callout.duration_sec,\n }\n : {}),\n ...(review\n ? {\n review_quote: review.quote,\n review_name: review.name,\n review_stars: review.stars,\n review_start: review.start_sec,\n review_duration: review.duration_sec,\n }\n : {}),\n ...(input.progress_bar ? { progress_bar: true } : {}),\n ...(offer\n ? {\n offer_text: offer.text,\n offer_subtext: offer.subtext,\n offer_start: offer.start_sec,\n offer_duration: offer.duration_sec,\n offer_position: offer.position,\n }\n : {}),\n ...(card\n ? {\n end_headline: card.headline,\n end_cta: card.cta,\n end_url: card.url,\n logo_url: card.logo_url,\n end_duration: card.duration_sec,\n }\n : {}),\n });\n\n const result = await pollJobUntilDoneOrHandoff(\n submitted.jobId,\n (id) => ctx.client.getJob(id),\n ctx.buildStatusUrl,\n { now: ctx.pollOverrides?.now, sleep: ctx.pollOverrides?.sleep },\n );\n\n return pollResultToSkillResult(result, (urls) =>\n urls.length === 0 ? `Job ${submitted.jobId} completed but returned no assets.` : `Branded. Asset: ${urls[0]}`,\n );\n}\n\nexport const overlaySkill: SkillModule<Input> = {\n name: 'pixeldojo_overlay',\n description:\n 'Add short-form ad text layouts to a finished video, exact text in the brand color, clear of the TikTok/Reels/Shorts UI: hook (title over the first seconds), callout (lower-third label), review (stars, quote, name), progress_bar, offer (\"50% OFF\" badge) and end_card (logo, headline, button, web address over the held last frame). Pass video_url plus any of them; one call does all. 2 credits.',\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n allowedModels: [MODEL],\n defaultModel: MODEL,\n run,\n};\n","/**\n * pixeldojo_status — poll companion for the 30s sync handoff.\n *\n * Per CEO D9: when a job exceeds the synchronous wait budget, the calling\n * skill returns `{ jobId, statusUrl }` and the LLM follows up by calling\n * this tool with the same jobId. The skill polls once and surfaces the\n * current state — completed (with assets), failed (with error), or still\n * processing (with eta).\n */\nimport { z } from 'zod';\nimport {\n type SkillContext,\n type SkillModule,\n type SkillResult,\n} from './types.js';\n\nconst InputSchema = z.object({\n jobId: z\n .string()\n .min(1)\n .max(200)\n .describe('Job id returned from a prior pixeldojo_* skill handoff.'),\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n jobId: {\n type: 'string',\n description: 'The jobId a generation tool returned instead of an asset (a job_... id).',\n },\n },\n required: ['jobId'],\n} as const;\n\n/** Threshold (ms) past which we tell the agent the job is unusually slow. */\nconst STUCK_HINT_MS = 5 * 60 * 1000;\n/** Threshold (ms) past which we tell the agent the job is almost certainly stuck. */\nconst ABANDON_HINT_MS = 12 * 60 * 1000;\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n const job = await ctx.client.getJob(input.jobId);\n\n if (job.status === 'completed') {\n const urls = extractAssetUrls(job);\n return {\n kind: 'assets',\n text:\n urls.length === 0\n ? `Job ${input.jobId} completed but returned no assets.`\n : urls.length === 1\n ? `Job ${input.jobId} completed. Asset: ${urls[0]}`\n : `Job ${input.jobId} completed. Assets: ${urls.join(', ')}`,\n assetUrls: urls,\n };\n }\n\n if (job.status === 'failed') {\n const errMsg =\n typeof job.error === 'string'\n ? job.error\n : (job.error as { message?: string } | undefined)?.message ?? 'Unknown provider error';\n return {\n kind: 'text',\n text: `Job ${input.jobId} failed: ${errMsg}`,\n };\n }\n\n // Pending or processing — surface job age + a hint when the wait is\n // unusually long, so the agent stops blindly polling forever.\n const apiId = (job as { apiId?: string }).apiId ?? 'unknown';\n const ageMs = jobAgeMs(job);\n const ageLabel = formatAge(ageMs);\n\n let hint: string;\n if (ageMs >= ABANDON_HINT_MS) {\n hint =\n `That's well past the typical generation window for any model on PixelDojo. ` +\n `The job is almost certainly stuck. Submit a fresh request, or open ${ctx.buildStatusUrl(input.jobId)} for the raw record.`;\n } else if (ageMs >= STUCK_HINT_MS) {\n hint =\n `That's longer than most generations should take. ` +\n `Poll once more, or submit a fresh request if the next check still says ${job.status}.`;\n } else {\n hint = `Try again in a few seconds, or follow ${ctx.buildStatusUrl(input.jobId)}.`;\n }\n\n return {\n kind: 'handoff',\n text:\n `Job ${input.jobId} (${apiId}) is ${job.status} after ${ageLabel}. ${hint}`,\n jobId: input.jobId,\n statusUrl: ctx.buildStatusUrl(input.jobId),\n };\n}\n\nfunction jobAgeMs(job: unknown): number {\n const createdAt = (job as { createdAt?: string }).createdAt;\n if (!createdAt) return 0;\n const t = Date.parse(createdAt);\n if (Number.isNaN(t)) return 0;\n const age = Date.now() - t;\n return age >= 0 ? age : 0;\n}\n\nfunction formatAge(ms: number): string {\n if (ms < 60_000) return `${Math.max(1, Math.round(ms / 1000))}s`;\n const totalSeconds = Math.round(ms / 1000);\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n if (minutes < 60) {\n return seconds === 0 ? `${minutes}m` : `${minutes}m ${seconds}s`;\n }\n const hours = Math.floor(minutes / 60);\n const remMinutes = minutes % 60;\n return remMinutes === 0 ? `${hours}h` : `${hours}h ${remMinutes}m`;\n}\n\nfunction extractAssetUrls(job: {\n assets?: Array<{ url: string }>;\n output?: unknown;\n}): string[] {\n if (job.assets && job.assets.length > 0) return job.assets.map((a) => a.url);\n const output = job.output as\n | { images?: string[]; videos?: string[]; image?: string; video?: string }\n | undefined;\n if (output?.images) return output.images;\n if (output?.videos) return output.videos;\n if (output?.image) return [output.image];\n if (output?.video) return [output.video];\n return [];\n}\n\nexport const statusSkill: SkillModule<Input> = {\n name: 'pixeldojo_status',\n description:\n 'Check once, without waiting, on a jobId that a generation tool returned instead of an asset after its 30s wait. Free. Returns asset URLs when complete, the failure reason if it failed, or the current state and job age if still running. Campaign ids go to pixeldojo_campaign_status; films report progress through pixeldojo_film with action \"status\".',\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n // status is special — it doesn't dispatch to a model\n allowedModels: [],\n defaultModel: '',\n run,\n};\n","/**\n * pixeldojo_from_url — paste a product URL, get back a ResolvedProduct.\n *\n * Hits the public /api/v1/extract-product endpoint. No credits consumed.\n * pixeldojo_campaign and pixeldojo_ad run the same extraction themselves\n * when handed a product URL; this is the standalone view of it — removes\n * the cold-start problem of \"describe your product to me first.\"\n */\nimport { z } from 'zod';\nimport {\n type SkillContext,\n type SkillModule,\n type SkillResult,\n} from './types.js';\n\nconst InputSchema = z.object({\n url: z\n .string()\n .min(1)\n .max(2048)\n .describe('Product page URL. Shopify, BigCommerce, WooCommerce, or any page with JSON-LD / OpenGraph product metadata.'),\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n url: {\n type: 'string',\n description:\n 'Product page URL. Shopify, BigCommerce, WooCommerce, or any page with JSON-LD / OpenGraph product metadata.',\n },\n },\n required: ['url'],\n} as const;\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n const product = await ctx.client.extractProduct(input.url);\n\n const summary = [\n `Product: ${product.name}`,\n product.description ? `Description: ${truncate(product.description, 280)}` : null,\n `Images (${product.images.length}): ${product.images.slice(0, 3).join(', ')}${\n product.images.length > 3 ? `, +${product.images.length - 3} more` : ''\n }`,\n `Source strategy: ${product.source}`,\n ]\n .filter(Boolean)\n .join('\\n');\n\n return {\n kind: 'text',\n text: summary,\n };\n}\n\nfunction truncate(input: string, max: number): string {\n if (input.length <= max) return input;\n return input.slice(0, max - 3) + '...';\n}\n\nexport const fromUrlSkill: SkillModule<Input> = {\n name: 'pixeldojo_from_url',\n description:\n 'Extract a product profile from a product page URL: name, description, image URLs (the first three are listed), and the extraction method used. Works on Shopify, BigCommerce, WooCommerce, or any page with JSON-LD / OpenGraph product metadata. Free. pixeldojo_campaign and pixeldojo_ad accept a product URL and run this extraction themselves; call this directly to check the product data first, or to reuse its images in other tools.',\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n // No model dispatch — this skill calls a server-side scrape, not a generation.\n allowedModels: [],\n defaultModel: '',\n run,\n};\n","/**\n * pixeldojo_film — one idea in, a finished scored short film out.\n *\n * Drives the real Film Studio pipeline (the same /api/films routes the web\n * app uses; they accept the MCP's Bearer credential). Films are long-running\n * and charged per shot, so the skill is deliberately phased:\n *\n * 1. PLAN (free): { idea } or { script } → writes the screenplay,\n * plans scenes/shots, returns film_id + a cost estimate. Nothing charged.\n * 2. PRODUCE (charged): { film_id, action: 'produce' } → dispatches the\n * first frame batch. Each frame/clip is charged as it renders.\n * 3. STATUS (advances): { film_id, action: 'status' } → call every ~30s.\n * Each call advances the pipeline: dispatches remaining frames, SAVES\n * finished ones (a render lives 24h on the temp CDN until it is saved;\n * the server's Frame check auto-reviews each frame,\n * redoes clear mismatches up to 4 times with rewritten prompts, then\n * flags still-mismatched shots for review), rolls clips four at a\n * time, composes\n * the scene-synced soundtrack, starts the export, and finally returns\n * the finished film URL.\n *\n * MUSIC VIDEO mode ({ song_url, song_duration_sec }): the same routes the web\n * composer's \"Music video\" mode calls. POST /api/films with musicVideoMode +\n * the song (stored as the film's music stem) and the music clip engine, then\n * POST /plan straight from concept + lyrics (no script step: the song is the\n * runtime), then POST /music/slice to cut one song chunk per shot. Clips\n * lip-sync to their chunk; the export lays the original song, so no score is\n * ever composed for a music video.\n */\nimport { z } from 'zod';\nimport type { SkillContext, SkillModule, SkillResult, SkillResultText } from './types.js';\nimport { SkillUploadError, uploadLocalFile } from './upload-helpers.js';\n\nconst STORY_LOOKS = ['live-action', 'anime', '3d-animation', 'noir', 'horror', 'sci-fi', 'documentary', 'western', 'romance', 'romantic-comedy', 'comedy'] as const;\nconst MUSIC_VIDEO_LOOKS = ['rap-video', 'neon-club', 'stage-performance', 'retro-camcorder', 'y2k-pop', 'moody-rnb', 'rock-grit', 'dream-pop', 'k-pop'] as const;\n// Mirrors ALL_FILM_LOOKS in lib/film-studio/shared.ts (this package cannot\n// import app code); tests/contracts/mcp-film-music-parity.test.ts pins it.\nconst LOOKS = [...STORY_LOOKS, ...MUSIC_VIDEO_LOOKS] as const;\n\n/** Mirrors DEFAULT_MUSIC_CLIP_ENGINE_ID in lib/film-studio/engines.ts, the\n * engine the web composer selects in music video mode (pinned by\n * tests/contracts/mcp-film-music-parity.test.ts). Sent as the film's\n * clipEngine at creation; the planner stamps it on every shot. */\nexport const MUSIC_CLIP_ENGINE_ID = 'minimax-h3-reference';\n\nconst InputSchema = z.object({\n idea: z\n .string()\n .max(2000)\n .optional()\n .describe('One-to-three sentence film idea. The studio writes the screenplay (free). Provide idea OR script for planning.'),\n script: z\n .string()\n .max(20000)\n .optional()\n .describe('A full screenplay to plan instead of an idea (sluglines, action lines, dialogue).'),\n look: z\n .enum(LOOKS)\n .optional()\n .describe('Visual style carried through frames, clips, and soundtrack. Default live-action, or rap-video for a music video.'),\n song_url: z\n .string()\n .url()\n .startsWith('https://')\n .max(2000)\n .optional()\n .describe('Music video mode: URL of the song, which must be your own PixelDojo upload (from pixeldojo_upload), not a third-party link. The film is cut to the song and every clip lip-syncs to its slice of it. idea describes the visuals.'),\n song_path: z\n .string()\n .max(4096)\n .optional()\n .describe('Music video mode, local server only: absolute path to the song file (MP3, WAV, M4A, AAC, OGG, FLAC up to 50MB). Uploaded for you; use instead of song_url.'),\n song_duration_sec: z\n .number()\n .positive()\n .max(7200)\n .optional()\n .describe('Music video mode (optional): the song length in seconds. Omit it and the studio measures the song.'),\n lyrics: z\n .string()\n .max(10000)\n .optional()\n .describe('Music video mode: the song lyrics, so shots land on the right lines. Optional.'),\n aspect: z.enum(['16:9', '9:16']).default('16:9'),\n pacing: z\n .enum(['story', 'trailer'])\n .default('story')\n .describe(\"'story' (default) plays every shot's action whole. 'trailer' cuts it like a trailer or promo: most shots keep only their first 1.5-3 seconds.\"),\n length: z\n .enum(['30s', '60s', '2-3min', '5min'])\n .default('60s')\n .describe('Target length of the finished film.'),\n film_id: z.string().max(40).optional().describe('Existing film id (from a previous call) for produce/status/cast/redo.'),\n action: z\n .enum(['plan', 'produce', 'status', 'cast', 'redo'])\n .default('plan')\n .describe(\"'plan' creates + storyboards (free). 'cast' casts, replaces or removes characters on an existing film. 'produce' starts charged generation. 'status' advances production and reports progress; poll it every ~30s until it returns the finished film. 'redo' renders a new take of the listed shots (charged), then status re-saves and re-exports.\"),\n shots: z\n .array(z.string().trim().min(1).max(40))\n .min(1)\n .max(12)\n .optional()\n .describe('Redo: the shots to render again, by the labels status reports (\"2.3\" is scene 2, shot 3) or shot id.'),\n redo: z\n .enum(['clip', 'frame'])\n .default('clip')\n .describe(\"Redo: 'clip' (default) renders a new take of the clip from the same frame; 'frame' paints a new storyboard frame, then a new clip from it.\"),\n cast: z\n .array(\n z.object({\n name: z.string().trim().min(1).max(60),\n image_urls: z.array(z.string().url().startsWith('https://').max(2048)).min(1).max(8).optional(),\n prompt: z.string().trim().min(1).max(600).optional(),\n character_id: z.string().max(40).optional(),\n replace: z.boolean().optional(),\n remove: z.boolean().optional(),\n }),\n )\n .max(8)\n .optional()\n .describe('Cast members, one per named character. Each gives image_urls (your own photos), a prompt (a portrait is generated, charged), or a character_id (a Character Studio character); with none of these the Character Studio character of that name is used. replace: true swaps out whoever already plays that name; remove: true takes them off the film.'),\n soundtrack: z\n .enum(['scene-synced', 'flat', 'none'])\n .default('scene-synced')\n .describe('scene-synced composes one musical section per scene, pinned to the scene lengths (default). flat is a single cohesive bed. none skips music.'),\n music_job_id: z\n .string()\n .max(80)\n .optional()\n .describe('The music_job_id from the previous status reply while the score is composing, so that score is attached. A status call without it, once all clips are ready and no score is attached, starts and charges for a new score.'),\n});\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema: Record<string, unknown> = {\n type: 'object',\n properties: {\n idea: { type: 'string', description: \"Plan step: one-to-three sentence film idea. The studio writes the screenplay (free). Provide idea or script. Keep the user's own words for who each character is, including their gender and pronouns (\\\"she\\\", \\\"he\\\") and species; the writer has nothing else to go on.\" },\n script: { type: 'string', description: 'Plan step: a full screenplay (sluglines, action lines, dialogue) to plan instead of an idea.' },\n look: { type: 'string', enum: [...LOOKS], description: `Plan step: visual style carried through frames, clips and soundtrack. Story looks: ${STORY_LOOKS.join(', ')} (default live-action). Music video looks: ${MUSIC_VIDEO_LOOKS.join(', ')} (default rap-video).` },\n song_url: {\n type: 'string',\n description:\n 'Plan step, music video mode: URL of the song. It must be your own PixelDojo upload (from pixeldojo_upload or /api/v1/upload); a third-party link is refused. Makes a music video cut to this song, every clip lip-synced to its slice of it, rendered on the studio music video engine. idea (or script) describes the visuals. No score is composed: the song is the soundtrack.',\n },\n song_path: {\n type: 'string',\n description:\n 'Plan step, music video mode: absolute local path to the song (MP3, WAV, M4A, AAC, OGG, FLAC up to 50MB). Uploaded for you; use instead of song_url.',\n },\n song_duration_sec: {\n type: 'number',\n description: 'Plan step, music video mode (optional): the song length in seconds. Omit it and the studio measures the song.',\n },\n lyrics: { type: 'string', description: 'Plan step, music video mode (optional): the song lyrics, so shots land on the right lines.' },\n aspect: { type: 'string', enum: ['16:9', '9:16'], description: 'Plan step: frame aspect ratio. Default 16:9.' },\n length: { type: 'string', enum: ['30s', '60s', '2-3min', '5min'], description: 'Plan step: target length. Default 60s. Ignored for a music video, whose length is the song.' },\n pacing: {\n type: 'string',\n enum: ['story', 'trailer'],\n description: \"Plan step: 'story' (default) plays every shot's action whole, for any narrative film. 'trailer' cuts it like a trailer, promo or sizzle: most shots stay on screen 1.5-3 seconds. Ignored for a music video.\",\n },\n film_id: { type: 'string', description: 'The film_id returned by the plan step. Required for produce, status and redo; with it, action \"plan\" is treated as \"status\".' },\n action: {\n type: 'string',\n enum: ['plan', 'produce', 'status', 'cast', 'redo'],\n description:\n 'plan (default, free): writes the script and plans shots, returns film_id, a cost estimate, and any characters still to cast. cast: casts, replaces or removes characters on an existing film (pass film_id and cast). produce (charged): starts rendering frames; refused until every named character is cast. status: advances production one step and reports progress; call it every ~30s until it returns the finished film URL. redo (charged): renders a new take of the shots listed in `shots`, on a film in production or already finished; then call status, which saves the new take and cuts a new export with it.',\n },\n shots: {\n type: 'array',\n items: { type: 'string' },\n maxItems: 12,\n description: 'Redo only: the shots to render again, by the labels status and the finished film report (\"2.3\" is scene 2, shot 3), or by shot id.',\n },\n redo: {\n type: 'string',\n enum: ['clip', 'frame'],\n description:\n \"Redo only: 'clip' (default) renders a new take of the clip from the same storyboard frame, the fix for a glitch, bad motion or lip sync. 'frame' paints a new frame first (and then a new clip from it), the fix for a wrong look, face or composition. Each is charged like any render of that shot. To change what a shot shows, edit it on the storyboard.\",\n },\n cast: {\n type: 'array',\n maxItems: 8,\n description:\n 'Cast members, one per named character. Every named character must be cast before frames render, so faces, ages and species hold in every shot. Pass them on the plan call (the script then stars them by name) or later with action \"cast\" using the names the plan reports. Each entry: name, plus ONE of image_urls (your own photos of an adult, made into a character), prompt (a portrait is generated from it, charged like any image), or character_id (a Character Studio character). An entry with only a name uses your Character Studio character of that name. A name that is already cast is left alone unless the entry sets replace: true, which hands that part (every shot, outfit and voice) to the new cast member. remove: true with only the name takes that cast member off the film; the part then needs a new cast member before frames render. replace and remove work until the shots of that cast member are rendered; after that, recast on the storyboard, where the frames that show them can be redone.',\n items: {\n type: 'object',\n properties: {\n name: { type: 'string', description: 'The character name as the film uses it (e.g. \"Harlan\").' },\n image_urls: { type: 'array', items: { type: 'string' }, description: 'Your own https photos of the character (1-8). PixelDojo uploads work; they are copied to permanent storage.' },\n prompt: {\n type: 'string',\n description: 'A description to generate the portrait from: species if not human, gender, adult age, look and outfit (e.g. \"man in his late 50s, grey mustache, sunburnt, red windbreaker\").',\n },\n character_id: { type: 'string', description: 'A Character Studio character id.' },\n replace: {\n type: 'boolean',\n description: 'Swap out whoever already plays this name for the image_urls, prompt or character_id given here, before their shots are rendered. Without it, an already-cast name is left unchanged.',\n },\n remove: {\n type: 'boolean',\n description: 'Take whoever plays this name off the film and every shot (free), before their shots are rendered. Give only the name.',\n },\n },\n required: ['name'],\n },\n },\n soundtrack: {\n type: 'string',\n enum: ['scene-synced', 'flat', 'none'],\n description:\n 'Read on status calls once all clips are ready. scene-synced (default): one musical section per scene. flat: one cohesive bed. none: export without music. Ignored for a music video, which always exports with its song.',\n },\n music_job_id: {\n type: 'string',\n description:\n 'The music_job_id from the previous status reply while the score is composing. A status call without it, once all clips are ready and no score is attached, starts and charges for a new score.',\n },\n },\n};\n\ninterface FilmShotDto {\n id: string;\n prompt: string;\n status: string;\n approved: boolean;\n frameUrl?: string;\n videoUrl?: string;\n errorMessage?: string;\n durationSec: number;\n musicChunkUrl?: string;\n characterIds: string[];\n elementIds: string[];\n engine: string;\n cameraPreset?: string;\n /** The clip check's verdict on a delivered clip (it judged `url`). */\n clipQa?: { url: string; ok: boolean; issues: string[]; note: string };\n /** Re-renders of a clip this shot already had (the studio counts them). */\n manualClipRedos?: number;\n /** The rendered clip's length and the cut's trims, in seconds. */\n videoDurationSec?: number;\n trimStartSec?: number;\n trimEndSec?: number;\n /** The studio editor's suggested in/out points for the clip in `url`\n * (pending while it is still reviewing a fresh clip). */\n editSuggestion?: { url: string; pending?: boolean; inSec?: number; outSec?: number; checkedAt: string; appliedAt?: string; skipped?: boolean };\n /** The editor's cut on this shot: plays faster, or is left out of the film. */\n speed?: number;\n leftOut?: boolean;\n}\ninterface FilmDto {\n id: string;\n title: string;\n status: string;\n /** The studio editor's whole-film cut (pending while it is being made). */\n editorCut?: { pending?: boolean; startedAt: string; builtAt?: string; shots?: unknown[]; appliedAt?: string; skipped?: boolean; note?: string };\n look: string;\n aspect: string;\n script?: string;\n exportUrl?: string;\n exportError?: string;\n audioStems: { kind: string; url: string }[];\n musicVideoMode?: boolean;\n musicDurationSec?: number;\n /** The planner run (script writer / shot planner). Both answer 202 with a\n * job id and finish in the background; this is what settles it. */\n llmJob?: { id: string; kind: string; status: 'running' | 'done' | 'error'; error?: string };\n scenes: { id: string; title: string; location?: string; shots: FilmShotDto[] }[];\n}\n\n/**\n * A rendered frame/clip that is still a draft. Film Studio writes fresh\n * renders to the 24h temp CDN and only an explicit save copies them to the\n * permanent one, so the host is the flag (mirrors isDraftFilmMedia in the\n * app's lib/film-studio/shared.ts — this package cannot import from it).\n */\nfunction needsSave(url: string | undefined): boolean {\n return Boolean(url && url.startsWith('https://temp.pixeldojo.ai/'));\n}\n\nasync function filmApi<T>(\n ctx: SkillContext,\n method: string,\n path: string,\n body?: unknown,\n): Promise<{ status: number; data: T }> {\n const res = await fetch(`${ctx.baseUrl}${path}`, {\n method,\n headers: {\n Authorization: `Bearer ${ctx.apiKey}`,\n 'Content-Type': 'application/json',\n 'x-pixeldojo-source': `mcp/${ctx.mcpVersion}`,\n 'x-pixeldojo-skill': 'film',\n },\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n });\n const data = (await res.json().catch(() => ({}))) as T;\n return { status: res.status, data };\n}\n\nconst shots = (f: FilmDto) => f.scenes.flatMap((s) => s.shots);\n\n/**\n * No film came back. Only a 404 means it is gone. A deploy restart or a proxy\n * error answers 502/503 with no JSON, and reading that as \"not found\" made\n * Sensei plan and pay for the same film a second time (2026-10-03). `retry`\n * is the call to make again; a status check is followed up automatically.\n */\nfunction noFilm(status: number, data: { error?: string }, filmId: string, retry: Record<string, unknown>): SkillResult {\n if (status === 404) return { kind: 'text', text: `Film not found: ${data.error ?? filmId}` };\n const input: Record<string, unknown> = { film_id: filmId, ...Object.fromEntries(Object.entries(retry).filter(([, v]) => v !== undefined)) };\n return {\n kind: 'text',\n text: `Could not reach film ${filmId} just now (${status ? `HTTP ${status}` : 'no response'}). The film is safe and nothing changed. Call pixeldojo_film with ${JSON.stringify(input)} again in about 30 seconds. Do not plan or start a new film.`,\n ...(input.action === 'status' ? { followUp: { input, afterSec: 30 } } : {}),\n };\n}\n\n/** Call status again in about `afterSec` to keep the film moving (see\n * SkillResultText.followUp). Only set while something is rendering or\n * about to be started by that call, never while a person is needed. */\nfunction keepGoing(filmId: string, afterSec: number, extra: Record<string, unknown> = {}): NonNullable<SkillResultText['followUp']> {\n const set = Object.fromEntries(Object.entries(extra).filter(([, v]) => v !== undefined));\n return { input: { film_id: filmId, action: 'status', ...set }, afterSec };\n}\n\n/** \"2.3\" = scene 2, shot 3: the label every reply uses for a shot. */\n/** The clip check flagged the clip this shot holds now: it judged this file\n * (Save keeps the draft's file name, only the host changes). */\nfunction flaggedClip(sh: FilmShotDto): boolean {\n const qa = sh.clipQa;\n const file = (u?: string) => u?.split('/').pop();\n return Boolean(qa && qa.ok === false && sh.videoUrl && file(qa.url) === file(sh.videoUrl));\n}\n\n/** The editor is still reviewing the clip this shot holds. Mirrors\n * editReviewPending in the app (4 minutes, then the cut goes without it). */\nfunction editReviewing(sh: FilmShotDto, nowMs: number): boolean {\n const e = sh.editSuggestion;\n const file = (u?: string) => u?.split('/').pop();\n return Boolean(e?.pending && sh.videoUrl && file(e.url) === file(sh.videoUrl) && nowMs - Date.parse(e.checkedAt) < 4 * 60_000);\n}\n\n/** The editor marked a cut on this shot's clip that nobody has applied or skipped. */\nfunction openEdit(sh: FilmShotDto): boolean {\n const e = sh.editSuggestion;\n const file = (u?: string) => u?.split('/').pop();\n return Boolean(e && !e.pending && !e.appliedAt && !e.skipped && e.inSec !== undefined && sh.videoUrl && file(e.url) === file(sh.videoUrl));\n}\n\n/** What a shot runs in the cut: the rendered clip less its trims, at its\n * speed; nothing for a shot left out. */\nfunction cutSec(sh: FilmShotDto): number {\n if (sh.leftOut) return 0;\n const speed = sh.speed && sh.speed > 1 ? sh.speed : 1;\n return Math.max(1, (sh.videoDurationSec ?? sh.durationSec ?? 0) - (sh.trimStartSec ?? 0) - (sh.trimEndSec ?? 0)) / speed;\n}\n\n/** The whole-film editor is still cutting, or about to: every clip review is\n * in and no cut has been built since the last one landed. Gives up after 4\n * minutes, like the per-clip wait. */\nfunction editorCutting(f: FilmDto, nowMs: number): boolean {\n const c = f.editorCut;\n const fresh = (iso?: string) => Boolean(iso && nowMs - Date.parse(iso) < 4 * 60_000);\n if (c?.pending) return fresh(c.startedAt);\n const lastReview = shots(f)\n .map((sh) => sh.editSuggestion?.checkedAt)\n .filter((t): t is string => Boolean(t))\n .sort()\n .pop();\n if (!lastReview || !fresh(lastReview)) return false;\n return !(c?.builtAt && c.builtAt >= lastReview);\n}\n\nfunction runtimeText(f: FilmDto): string {\n const sec = Math.round(shots(f).reduce((n, sh) => n + cutSec(sh), 0));\n return sec < 90 ? `${sec}s` : `${Math.floor(sec / 60)}m ${sec % 60}s`;\n}\n\nfunction shotLabels(f: FilmDto): Map<string, string> {\n return new Map(f.scenes.flatMap((s, si) => s.shots.map((sh, i) => [sh.id, `${si + 1}.${i + 1}`] as const)));\n}\n\n/** A dispatch refusal that clears on its own: the shot is already rendering,\n * or the frame slots are full and free up as frames land. */\nconst benignDispatchRefusal = (status: number, error?: string) =>\n status === 429 || (status === 409 && /already generating/i.test(error ?? ''));\n\ninterface UncastRoleDto {\n name: string;\n suggestedPrompt: string;\n}\n\n/** Cast each entry onto the film (POST /api/films/[id]/cast), in parallel: a\n * generated portrait takes 10-25s, and one after another they would run the\n * tool call far past its sync window. One reply line per entry. */\nasync function applyCast(\n ctx: SkillContext,\n filmId: string,\n cast: NonNullable<Input['cast']>,\n): Promise<{ lines: string[]; charged: boolean }> {\n let charged = false;\n const lines = await Promise.all(cast.map(async (c) => {\n const r = await filmApi<{\n character?: { id?: string; name: string };\n replaced?: { name: string };\n removed?: { name: string };\n boundShots?: number;\n creditCost?: number;\n alreadyCast?: boolean;\n error?: string;\n code?: string;\n }>(\n ctx,\n 'POST',\n `/api/films/${filmId}/cast`,\n {\n role: c.name,\n ...(c.character_id ? { characterId: c.character_id } : {}),\n ...(c.image_urls ? { imageUrls: c.image_urls } : {}),\n ...(c.prompt ? { prompt: c.prompt } : {}),\n ...(c.replace ? { replace: true } : {}),\n ...(c.remove ? { remove: true } : {}),\n },\n );\n // A portrait can be paid for even when the call then refuses (the shots\n // started rendering meanwhile); the reply must not claim nothing was charged.\n if (r.data.creditCost) charged = true;\n if (r.status !== 200) {\n // Shots already rendered with this cast member: the storyboard is where\n // the frames that show them get redone, so hand the caller its link.\n const where = r.data.code === 'cast-rendered' ? ` Storyboard: ${ctx.baseUrl}/film-studio/${filmId}` : '';\n return `Could not ${c.remove ? 'remove' : c.replace ? 'replace' : 'cast'} ${c.name}: ${r.data.error ?? r.status}${where}`;\n }\n if (r.data.removed) return `Removed ${c.name} from the film and every shot.`;\n if (r.data.alreadyCast) {\n return c.replace\n ? `${c.name} is already played by that character; nothing changed.`\n : `${c.name} is already cast; nothing changed. To swap who plays ${c.name}, send the entry again with replace: true.`;\n }\n const cost = r.data.creditCost ? ` (portrait, ${r.data.creditCost} credits)` : '';\n const where = r.data.boundShots ? `, in ${r.data.boundShots} shot(s)` : '';\n return r.data.replaced\n ? `Replaced ${r.data.replaced.name} with ${r.data.character?.name ?? 'the new cast member'}${r.data.character?.id ? ` (character_id ${r.data.character.id})` : ''} as ${c.name}${cost}${where}.`\n : `Cast ${c.name}${cost}${where}.`;\n }));\n return { lines, charged };\n}\n\nasync function uncastRolesOf(ctx: SkillContext, filmId: string): Promise<UncastRoleDto[]> {\n const r = await filmApi<{ uncastRoles?: UncastRoleDto[] }>(ctx, 'GET', `/api/films/${filmId}/cast`);\n return r.data.uncastRoles ?? [];\n}\n\n/** What to tell the caller while characters are uncast: frames refuse to\n * render until each one has a cast member. */\nfunction castNeededText(filmId: string, roles: UncastRoleDto[]): string {\n const example = roles.map((r) => ({ name: r.name, prompt: r.suggestedPrompt || `describe ${r.name}` }));\n return [\n `Cast these characters before production (every named character needs a cast member so faces, ages and species hold in every shot):`,\n ...roles.map((r) => ` ${r.name}${r.suggestedPrompt ? `: ${r.suggestedPrompt}` : ''}`),\n `Call pixeldojo_film with {\"film_id\": \"${filmId}\", \"action\": \"cast\", \"cast\": ${JSON.stringify(example)}}, giving each one a prompt (a portrait is generated, charged), image_urls of your own photos, or a character_id from Character Studio.`,\n ].join('\\n');\n}\nconst count = (f: FilmDto, pred: (sh: FilmShotDto) => boolean) => shots(f).filter(pred).length;\n\n/** The shot has its storyboard frame. Status alone is not enough: a shot whose\n * CLIP failed reads 'failed' with its frame still on it, and gating clips on\n * status held every other clip of the film back behind it. */\nconst frameDone = (sh: FilmShotDto) => Boolean(sh.frameUrl) && sh.status !== 'idle' && sh.status !== 'frame-generating';\n\n/**\n * A failure the provider repeats on the same input: a copyright, content or\n * likeness filter. Every automatic retry is a charged render refused again (a\n * Seedance copyright block, 2026-09-30), so status stops resending the shot\n * and asks for a new frame or prompt. Stems mirror CONTENT_MODERATION_INDICATORS\n * in the app's lib/utils/moderation-refund-message.ts, which this package\n * cannot import. Still retried: Seedance's output-audio check, a known false\n * positive that usually clears (MODERATION_AUDIO_RETRY_MESSAGE there), and a\n * safety service that was down.\n */\n// A soundtrack copyright refusal is resent too: the studio re-renders that\n// shot once with audio off (generate route, clipAudioOff), which the check\n// cannot refuse again.\nconst RETRY_CLEARS =\n /automatic audio check flagged|output audio\\b[\\s\\S]*?sensitive information|temporarily unavailable|output audio\\b[\\s\\S]*?copyright|soundtrack was blocked by the model provider/i;\nconst REFUSED = /copyright|infringement|content filter|safety filter|moderation|blocked|flagged|sensitive|real (?:person|human)|nsfw|content policy|policy violation|inappropriate/i;\nconst isRefused = (sh: FilmShotDto) =>\n sh.status === 'failed' && Boolean(sh.errorMessage) && !RETRY_CLEARS.test(sh.errorMessage!) && REFUSED.test(sh.errorMessage!);\n\nfunction progressLine(f: FilmDto): string {\n const all = shots(f);\n const frames = all.filter((sh) => ['frame-ready', 'approved', 'clip-generating', 'clip-ready'].includes(sh.status) || sh.frameUrl).length;\n const clips = all.filter((sh) => sh.status === 'clip-ready').length;\n const rendering = all.filter((sh) => sh.status === 'clip-generating').length;\n return `frames ${frames}/${all.length}, clips ${clips}/${all.length}${rendering > 0 ? ` (${rendering} rendering)` : ''}`;\n}\n\n/** Planner polling inside one tool call: ~24s, under the 30s sync window the\n * rest of the package uses. A longer run hands off to action \"status\". */\nconst PLANNER_POLL_MS = 3000;\nconst PLANNER_MAX_POLLS = 8;\n\ntype PlannerOutcome = { film: FilmDto } | { error: string } | { pending: true };\n\n/** Submit a planner run (/script or /plan answer 202 { jobId }) and wait for\n * the film's llmJob with that id to settle, like runPlannerJob in the app. */\n/** `maxPolls` 0 = submit and return (a status call must answer fast; the next\n * status picks the result up). */\nasync function runPlanner(\n ctx: SkillContext,\n filmId: string,\n path: string,\n body: Record<string, unknown>,\n maxPolls = PLANNER_MAX_POLLS,\n): Promise<PlannerOutcome> {\n const submit = await filmApi<{ jobId?: string; film?: FilmDto; error?: string }>(ctx, 'POST', path, body);\n if (submit.data.film) return { film: submit.data.film };\n const jobId = submit.data.jobId;\n if (!jobId) return { error: submit.data.error ?? `HTTP ${submit.status}` };\n const sleep = ctx.pollOverrides?.sleep ?? ((ms: number) => new Promise<void>((r) => setTimeout(r, ms)));\n for (let i = 0; i < maxPolls; i += 1) {\n await sleep(PLANNER_POLL_MS);\n const { data } = await filmApi<{ film?: FilmDto }>(ctx, 'GET', `/api/films/${filmId}`);\n const job = data.film?.llmJob;\n if (!data.film || job?.id !== jobId) continue;\n if (job.status === 'error') return { error: job.error ?? 'the run failed' };\n if (job.status === 'done') return { film: data.film };\n }\n return { pending: true };\n}\n\n/** Cut the song into one chunk per shot (free, hosted ffmpeg; can take a\n * couple of minutes). Returns an error line, or null on success. */\nasync function sliceSong(ctx: SkillContext, film: FilmDto): Promise<string | null> {\n const r = await filmApi<{ error?: string }>(ctx, 'POST', `/api/films/${film.id}/music/slice`, {\n songDurationSec: film.musicDurationSec,\n });\n return r.status === 200 ? null : `Could not cut the song into shots: ${r.data.error ?? r.status}`;\n}\n\nconst isMusicVideo = (f: FilmDto) => f.musicVideoMode === true;\n/** Mirrors musicSyncStatus 'unsynced' in the app: no shot carries a chunk yet. */\nconst needsSlice = (f: FilmDto) => isMusicVideo(f) && shots(f).length > 0 && !shots(f).some((sh) => sh.musicChunkUrl);\n\nfunction plannedText(film: FilmDto, ctx: SkillContext): string {\n const total = shots(film).length;\n const music = isMusicVideo(film);\n const sceneLines = film.scenes.map((s, i) => ` Scene ${i + 1} \"${s.title}\"${s.location ? ` [${s.location}]` : ''}: ${s.shots.length} shots`);\n return [\n `Planned ${music ? 'music video ' : ''}\"${film.title}\" (film_id: ${film.id}): ${film.scenes.length} scenes, ${total} shots, ${film.look}, ${film.aspect}.`,\n ...sceneLines,\n '',\n music\n ? `Nothing has been charged yet. The song is cut into one slice per shot and each clip lip-syncs to its slice on the studio music video engine. Producing renders every shot, charged as each renders. No score is composed: the export plays your song.`\n : `Nothing has been charged yet. Producing renders every shot (roughly 35-40 credits per 5-second shot at default engines, charged as each renders) plus a few credits for the soundtrack.`,\n `Review or edit at ${ctx.baseUrl}/film-studio/${film.id}, or call pixeldojo_film with {\"film_id\": \"${film.id}\", \"action\": \"produce\"} to start production.`,\n ].join('\\n');\n}\n\nconst stillPlanningText = (filmId: string, stage: 'script' | 'plan' = 'plan') =>\n `${stage === 'script' ? 'Still writing the script' : 'Still planning the shots'} for film_id ${filmId}. Nothing has been charged. Call pixeldojo_film with {\"film_id\": \"${filmId}\", \"action\": \"status\"} in ~30s; it returns the plan once it is ready.`;\n\nasync function plan(input: Input, ctx: SkillContext): Promise<SkillResult> {\n const music = Boolean(input.song_url || input.song_path);\n if (!input.idea?.trim() && !input.script?.trim()) {\n return {\n kind: 'text',\n text: music\n ? 'Provide an `idea` describing the visuals of the music video (plus optional `lyrics`).'\n : 'Provide an `idea` (we write the script, free) or a full `script` to plan a film.',\n };\n }\n if (input.song_path && !input.song_url) {\n try {\n input = { ...input, song_url: await uploadLocalFile(input.song_path, ctx) };\n } catch (err) {\n if (err instanceof SkillUploadError) return { kind: 'text', text: `Could not upload the song: ${err.userMessage}` };\n throw err;\n }\n }\n const created = await filmApi<{ film?: FilmDto; error?: string }>(ctx, 'POST', '/api/films', {\n aspect: input.aspect,\n look: input.look ?? (music ? MUSIC_VIDEO_LOOKS[0] : 'live-action'),\n lengthTarget: input.length,\n ...(!music && input.pacing === 'trailer' ? { pacing: 'trailer' } : {}),\n assetIds: [],\n ...(music\n ? {\n // No script step names a music video, so it would stay \"Untitled film\".\n ...(input.idea?.trim() ? { title: input.idea.trim().slice(0, 80) } : {}),\n musicVideoMode: true,\n musicUrl: input.song_url,\n ...(input.song_duration_sec ? { musicDurationSec: input.song_duration_sec } : {}),\n clipEngine: MUSIC_CLIP_ENGINE_ID,\n }\n : {}),\n });\n if (!created.data.film) return { kind: 'text', text: `Could not create the film: ${created.data.error ?? created.status}` };\n const id = created.data.film.id;\n // Cast before writing: the script writer stars attached characters by name\n // and the planner binds them, exactly like the web composer's cast chip.\n const castStarted = Date.now();\n const cast = input.cast?.length ? await applyCast(ctx, id, input.cast) : { lines: [], charged: false };\n // The portraits' time comes out of the planner wait, so the call stays in\n // its sync window; a plan that is not done by then hands off to \"status\".\n const pollBudget = Math.max(0, PLANNER_MAX_POLLS - Math.ceil((Date.now() - castStarted) / PLANNER_POLL_MS));\n // Every reply of this call carries the cast results, and never claims\n // nothing was charged after a portrait was.\n const reply = (text: string, followUp?: SkillResultText['followUp']): SkillResult => ({\n kind: 'text',\n text: [\n ...cast.lines,\n cast.charged ? text.replace(/Nothing has been charged( yet)?\\./g, 'Only the cast portraits above have been charged.') : text,\n ].join('\\n'),\n ...(followUp ? { followUp } : {}),\n });\n\n let planned: PlannerOutcome;\n if (music) {\n // No script step: the planner reads the concept + lyrics directly, and\n // no fitToScript, since the SONG sets the runtime (web composer parity).\n const brief = [input.idea?.trim() || input.script!.trim(), input.lyrics?.trim() ? `Lyrics:\\n${input.lyrics.trim()}` : '']\n .filter(Boolean)\n .join('\\n\\n');\n planned = await runPlanner(ctx, id, `/api/films/${id}/plan`, { script: brief }, pollBudget);\n } else {\n let script = input.script?.trim() ?? '';\n if (!script) {\n const wrote = await runPlanner(ctx, id, `/api/films/${id}/script`, { idea: input.idea!.trim() }, pollBudget);\n if ('pending' in wrote) return reply(stillPlanningText(id, 'script'), keepGoing(id, 30, { soundtrack: input.soundtrack }));\n if ('error' in wrote) return reply(`Script writing failed: ${wrote.error}`);\n script = wrote.film.script ?? '';\n if (!script) return reply('Script writing failed: the studio returned an empty script.');\n }\n planned = await runPlanner(ctx, id, `/api/films/${id}/plan`, { script });\n }\n if ('pending' in planned) return reply(stillPlanningText(id), keepGoing(id, 30, { soundtrack: input.soundtrack }));\n if ('error' in planned) return reply(`Shot planning failed: ${planned.error}`);\n\n const film = planned.film;\n if (needsSlice(film)) {\n const err = await sliceSong(ctx, film);\n if (err) return reply(`${plannedText(film, ctx)}\\n\\n${err} Call action \"status\" to retry the cut.`);\n }\n const uncast = await uncastRolesOf(ctx, id);\n return reply([plannedText(film, ctx), uncast.length ? `\\n${castNeededText(id, uncast)}` : ''].filter(Boolean).join('\\n'));\n}\n\n/** A film whose planning has not landed a storyboard yet: report the running\n * run, or (re)submit the shot plan from the stored script. Null = planned. */\nasync function resumePlanning(film: FilmDto, ctx: SkillContext, soundtrack?: Input['soundtrack']): Promise<SkillResult | null> {\n if (film.scenes.length > 0 && film.llmJob?.status !== 'running') return null;\n if (film.llmJob?.status === 'running') {\n return { kind: 'text', text: stillPlanningText(film.id, film.llmJob.kind === 'script' ? 'script' : 'plan'), followUp: keepGoing(film.id, 30, { soundtrack }) };\n }\n const prior = film.llmJob?.status === 'error' ? `The last planning run failed (${film.llmJob.error ?? 'unknown'}). ` : '';\n if (!film.script?.trim()) {\n return { kind: 'text', text: `${prior}This film has nothing to plan from. Start a new one with action \"plan\".` };\n }\n const planned = await runPlanner(ctx, film.id, `/api/films/${film.id}/plan`, { script: film.script }, 0);\n if ('pending' in planned) return { kind: 'text', text: `${prior}${stillPlanningText(film.id)}`, followUp: keepGoing(film.id, 30, { soundtrack }) };\n if ('error' in planned) return { kind: 'text', text: `Shot planning failed: ${planned.error} Call action \"status\" to retry.` };\n if (needsSlice(planned.film)) {\n const err = await sliceSong(ctx, planned.film);\n if (err) return { kind: 'text', text: `${plannedText(planned.film, ctx)}\\n\\n${err} Call action \"status\" to retry the cut.` };\n }\n return { kind: 'text', text: plannedText(planned.film, ctx) };\n}\n\nasync function produce(filmId: string, soundtrack: Input['soundtrack'], ctx: SkillContext): Promise<SkillResult> {\n const { status, data } = await filmApi<{ film?: FilmDto; error?: string }>(ctx, 'GET', `/api/films/${filmId}`);\n if (!data.film) return noFilm(status, data, filmId, { action: 'produce', soundtrack });\n const planning = await resumePlanning(data.film, ctx, soundtrack);\n if (planning) return planning;\n const uncast = await uncastRolesOf(ctx, filmId);\n if (uncast.length) return { kind: 'text', text: `Nothing was charged. ${castNeededText(filmId, uncast)}` };\n // Before the first frame: a reference for every prop that recurs across\n // shots, or each shot draws its own (the kimchi jar changed shot to shot,\n // 2026-10-03). Only on a film with nothing rendered yet; a failure here\n // never blocks production.\n let propsNote = '';\n if (!shots(data.film).some((sh) => sh.frameUrl)) {\n const locked = await filmApi<{ created?: Array<{ name: string; shots: number }>; creditCost?: number; error?: string }>(\n ctx,\n 'POST',\n `/api/films/${filmId}/props`,\n {},\n ).catch(() => null);\n const made = locked?.status === 200 ? (locked.data.created ?? []) : [];\n if (made.length) {\n propsNote = ` Locked in ${made.length} recurring prop${made.length === 1 ? '' : 's'} first so ${made.length === 1 ? 'it looks' : 'they look'} the same in every shot: ${made.map((m) => `${m.name} (${m.shots} shots)`).join(', ')}${locked?.data.creditCost ? `, ${locked.data.creditCost} credits` : ''}.`;\n }\n }\n const pending = shots(data.film).filter((sh) => sh.status === 'idle' || (sh.status === 'failed' && !sh.frameUrl));\n let fired = 0;\n let refused: string | undefined;\n for (const sh of pending.slice(0, 6)) {\n const r = await filmApi<{ error?: string }>(ctx, 'POST', `/api/films/${filmId}/shots/${sh.id}/generate`, { kind: 'frame' });\n if (r.status === 200) fired += 1;\n else if (!benignDispatchRefusal(r.status, r.data.error)) refused ??= r.data.error ?? `HTTP ${r.status}`;\n }\n // Nothing started and nothing will on its own (credits, a refused shot):\n // say why instead of promising progress a poll can never make.\n if (fired === 0 && refused) {\n return { kind: 'text', text: `Production could not start on \"${data.film.title}\": ${refused}` };\n }\n return {\n kind: 'text',\n text: `Production started on \"${data.film.title}\": ${fired} frame(s) dispatched (each is a normal frame charge; the server's Frame check reviews every one).${propsNote}${refused ? ` Some could not start: ${refused}` : ''} Poll pixeldojo_film with {\"film_id\": \"${filmId}\", \"action\": \"status\"} every ~30 seconds — each poll advances the pipeline.`,\n // The caller's soundtrack choice rides along: the follow-up status calls\n // are the ones that reach the score.\n followUp: keepGoing(filmId, 30, { soundtrack }),\n };\n}\n\nconst LOOK_MUSIC: Record<string, string> = {\n 'live-action': 'modern cinematic underscore, warm strings and soft felt piano, subtle rhythmic pulse, slow emotional build',\n anime: 'sweeping anime film score, lush strings and piano, taiko drum accents, soaring heartfelt theme',\n '3d-animation': 'playful heartfelt family-animation score, pizzicato strings, celesta and warm woodwinds, gentle sense of wonder',\n noir: 'smoky film-noir jazz underscore, brushed drums, upright bass, distant muted trumpet, slow simmering tension',\n horror: 'sparse horror underscore, low cello drones, dissonant string swells, creeping heartbeat pulse, unsettling quiet',\n 'sci-fi': 'atmospheric science-fiction score, analog synth pads, deep sub-bass pulses, shimmering arpeggios, vast and cold',\n documentary: 'understated documentary score, felt piano, soft string beds, organic percussion textures, reflective and true',\n western: 'cinematic western score, lonely twangy guitar, dusty strings, distant horns, wide-open desert tension',\n romance: 'tender romantic score, felt piano and warm strings, soft acoustic guitar, intimate and unhurried, gently swelling',\n 'romantic-comedy': 'bright romantic-comedy score, plucky ukulele and handclaps, warm brushed drums, sunny and flirtatious',\n comedy: 'playful comedy score, bouncy pizzicato strings, cheeky woodwinds, light percussion hits punctuating the gags',\n};\nconst ARC = {\n opening: ['establishing the theme', 'restrained', 'quiet anticipation'],\n middle: ['building tension', 'rising intensity', 'forward motion'],\n finale: ['climactic', 'full arrangement', 'emotional peak resolving to stillness'],\n};\n\n/** Mirrors the studio's scene-synced plan: one section per scene, pinned to\n * the scene runtime, arc styles by position. */\nfunction buildScorePlanBody(film: FilmDto): Record<string, unknown> {\n const scenes = film.scenes.filter((s) => s.shots.length > 0);\n const sections = scenes.flatMap((scene, i) => {\n const runtime = Math.max(3000, Math.round(scene.shots.reduce((n, sh) => n + cutSec(sh), 0) * 1000));\n const styles = i === 0 ? ARC.opening : i === scenes.length - 1 ? ARC.finale : ARC.middle;\n const parts = Math.max(1, Math.ceil(runtime / 120000));\n const partMs = Math.round(runtime / parts);\n return Array.from({ length: parts }, (_, part) => ({\n section_name: parts > 1 ? `${scene.title} (part ${part + 1})` : scene.title,\n positive_local_styles: styles,\n negative_local_styles: [],\n duration_ms: part === parts - 1 ? runtime - partMs * (parts - 1) : partMs,\n lines: [],\n }));\n });\n return {\n composition_plan: {\n positive_global_styles: (LOOK_MUSIC[film.look] ?? LOOK_MUSIC['live-action']).split(', '),\n negative_global_styles: ['vocals', 'singing', 'lyrics'],\n sections,\n },\n respect_sections_durations: true,\n output_format: 'mp3_standard',\n };\n}\n\nfunction buildFlatMusicBody(film: FilmDto, all: FilmShotDto[]): Record<string, unknown> {\n const runtimeSec = all.reduce((n, sh) => n + cutSec(sh), 0);\n // The tool's window is 30s–5min; outside it the schema 400s.\n const ms = Math.min(300000, Math.max(30000, Math.ceil((runtimeSec * 1000) / 5000) * 5000));\n return {\n prompt: `${LOOK_MUSIC[film.look] ?? LOOK_MUSIC['live-action']}. Instrumental only, no vocals. One consistent theme, loopable as a background bed under dialogue.`,\n music_length_ms: ms,\n force_instrumental: true,\n output_format: 'mp3_standard',\n };\n}\n\nasync function advance(filmId: string, soundtrack: Input['soundtrack'], musicJobId: string | undefined, ctx: SkillContext): Promise<SkillResult> {\n const { status, data } = await filmApi<{ film?: FilmDto; error?: string }>(ctx, 'GET', `/api/films/${filmId}?refresh=1`);\n const film = data.film;\n if (!film) return noFilm(status, data, filmId, { action: 'status', soundtrack });\n const all = shots(film);\n\n // Finished?\n if (film.status === 'exported' && film.exportUrl) {\n return {\n kind: 'text',\n text: [\n `Film finished: \"${film.title}\" (${runtimeText(film)})\\nWatch/download: ${film.exportUrl}\\nWorkspace: ${ctx.baseUrl}/film-studio/${film.id}\\nIt is saved in the Library folder \"Film: ${film.title}\".`,\n stillFlagged(film),\n shotIndex(film),\n ].filter(Boolean).join('\\n'),\n };\n }\n const startExport = async (): Promise<string | null> => {\n const r = await filmApi<{ error?: string }>(ctx, 'POST', `/api/films/${filmId}/export`, {});\n // 409: this film's export is already running, which is what we want.\n return r.status === 200 || r.status === 409 ? null : (r.data.error ?? `HTTP ${r.status}`);\n };\n // A failed export with every clip ready: start it again (exports are free\n // and a new one clears the error), with no follow-up, so a cut that keeps\n // failing costs a decision rather than a loop. While shots render again (a\n // redo) the stale error is ignored: the export restarts once they land.\n if (film.exportError && all.length > 0 && all.every((sh) => sh.status === 'clip-ready')) {\n const again = await startExport();\n return {\n kind: 'text',\n text: again\n ? `Export failed: ${film.exportError} Starting it again failed too: ${again}`\n : `The last export failed (${film.exportError}). Started it again; exports are free. Call pixeldojo_film with {\"film_id\": \"${filmId}\", \"action\": \"status\"} in about a minute for the finished film.`,\n };\n }\n const planning = await resumePlanning(film, ctx, soundtrack);\n if (planning) return planning;\n // A music video's clips lip-sync to their slice of the song, and a clip\n // rendered before the cut has no slice to sing to. The cut is free.\n if (needsSlice(film)) {\n const err = await sliceSong(ctx, film);\n if (err) return { kind: 'text', text: `${err} Poll again with action \"status\" to retry.` };\n return {\n kind: 'text',\n text: `Song cut into one slice per shot. Poll again with {\"film_id\": \"${filmId}\", \"action\": \"status\"} to keep production moving.`,\n followUp: keepGoing(filmId, 5, { soundtrack }),\n };\n }\n // Planned but never produced: report the plan. Only `produce` starts\n // charging, so a status poll on a fresh plan must not dispatch frames.\n if (shots(film).length > 0 && shots(film).every((sh) => sh.status === 'idle')) {\n return { kind: 'text', text: plannedText(film, ctx) };\n }\n\n let started = 0;\n const resent = new Set<string>();\n // Dispatches the server refused for a reason that will not clear by\n // itself (credits, an uncast role, an unsaved frame). Reported, and they\n // stop the agent's follow-up: polling again would only be refused again.\n const refusedStarts: string[] = [];\n const dispatch = async (sh: FilmShotDto, kind: 'frame' | 'clip') => {\n const r = await filmApi<{ error?: string }>(ctx, 'POST', `/api/films/${filmId}/shots/${sh.id}/generate`, { kind });\n if (r.status !== 200) {\n if (!benignDispatchRefusal(r.status, r.data.error)) refusedStarts.push(r.data.error ?? `HTTP ${r.status}`);\n return;\n }\n started += 1;\n if (sh.status === 'failed') resent.add(sh.id);\n };\n\n\n // 1) Frames: dispatch idle and failed ones, save finished ones. Frames\n // refuse to paint while a named character is uncast, so say who instead of\n // polling forever (clips wait on every frame anyway).\n const pendingFrames = all.filter((sh) => sh.status === 'idle' || (sh.status === 'failed' && !sh.frameUrl && !isRefused(sh)));\n if (pendingFrames.length > 0) {\n const uncast = await uncastRolesOf(ctx, filmId);\n if (uncast.length) return { kind: 'text', text: castNeededText(filmId, uncast) };\n }\n for (const sh of pendingFrames.slice(0, 6)) await dispatch(sh, 'frame');\n const framesDone = all.every(frameDone);\n if (all.some((sh) => frameDone(sh) && needsSave(sh.frameUrl))) {\n // Save every rendered frame. A frame renders onto the 24h temp CDN and is\n // deleted unless it is saved, and the clip dispatch below refuses to start\n // from a draft — this is the step that keeps the storyboard. The old\n // `approved: true` merge-PATCH no longer does it: approval is a flag, and\n // saving moves bytes. Not held for the last frame: a film paused on one\n // refused shot would otherwise lose every other frame after a day.\n await filmApi(ctx, 'POST', `/api/films/${filmId}/save`, { kind: 'frame' });\n }\n\n // 2) Clips, once every frame is done: keep four in flight, and send failed\n // clips again unless the provider refused them.\n const inFlight = count(film, (sh) => sh.status === 'clip-generating');\n const clipQueue = framesDone\n ? all.filter((sh) => sh.status === 'frame-ready' || (sh.status === 'failed' && frameDone(sh) && !isRefused(sh)))\n : [];\n for (const sh of clipQueue.slice(0, Math.max(0, 4 - inFlight))) await dispatch(sh, 'clip');\n\n // 3) All clips ready → save them, then soundtrack (once), then export.\n const clipsDone = all.length > 0 && all.every((sh) => sh.status === 'clip-ready');\n // A clip the clip check flagged (a face that drifts, a doubled person) gets\n // ONE more take before the cut, never more: Sensei's film exported eight\n // \"check clip\" shots as they were (2026-10-03). Still flagged after its\n // redo, it is exported and named in the finished reply.\n const toRedo = clipsDone ? all.filter((sh) => flaggedClip(sh) && !(sh.manualClipRedos ?? 0)) : [];\n if (toRedo.length) {\n const labels = shotLabels(film);\n const redone: string[] = [];\n let refusedRedo: string | undefined;\n for (const sh of toRedo) {\n const r = await filmApi<{ error?: string }>(ctx, 'POST', `/api/films/${filmId}/shots/${sh.id}/generate`, { kind: 'clip' });\n if (r.status === 200) redone.push(`${labels.get(sh.id)} (${sh.clipQa!.note || sh.clipQa!.issues.join(', ')})`);\n else if (!benignDispatchRefusal(r.status, r.data.error)) refusedRedo ??= r.data.error ?? `HTTP ${r.status}`;\n }\n if (redone.length) {\n return {\n kind: 'text',\n text: `All ${all.length} clips rendered. The clip check flagged ${redone.length}, so each gets one more take before the final cut (a normal clip charge each): ${redone.join('; ')}.${refusedRedo ? ` Another could not start: ${refusedRedo}` : ''} Poll again in ~30s with {\"film_id\": \"${filmId}\", \"action\": \"status\"}.`,\n followUp: keepGoing(filmId, 30, { soundtrack }),\n };\n }\n }\n if (clipsDone) {\n // The studio's editor marks where each clip's action starts and lands\n // about a minute after it arrives. No one is at the storyboard here, so\n // the agent applies the cut as the editor would, before the score is\n // timed to it; it stays undoable in the storyboard.\n const reviewing = all.filter((sh) => editReviewing(sh, Date.now())).length;\n if (reviewing) {\n return {\n kind: 'text',\n text: `All ${all.length} clips ready. The editor is marking where ${reviewing === 1 ? 'the last clip starts and lands' : `${reviewing} clips start and land`} so the cut drops the waiting. Poll again in ~20s with {\"film_id\": \"${filmId}\", \"action\": \"status\"}.`,\n followUp: keepGoing(filmId, 20, { soundtrack }),\n };\n }\n // Then the whole-film pass: keep or leave out, tighter windows, a\n // speed-up for a soft stunt.\n if (editorCutting(film, Date.now())) {\n return {\n kind: 'text',\n text: `All ${all.length} clips ready. The editor is watching the whole film and making the cut. Poll again in ~30s with {\"film_id\": \"${filmId}\", \"action\": \"status\"}.`,\n followUp: keepGoing(filmId, 30, { soundtrack }),\n };\n }\n const openCut = Boolean(film.editorCut?.shots?.length && !film.editorCut.appliedAt && !film.editorCut.skipped);\n if (openCut || all.some(openEdit)) {\n const cut = await filmApi<{ film?: FilmDto }>(ctx, 'POST', `/api/films/${filmId}/edit`, { action: 'apply' });\n if (cut.data.film) film.scenes = cut.data.film.scenes;\n }\n // Same 24h clock as frames, and the export refuses to stitch a draft clip\n // (blocker reason 'needs-save'). Saving also files each clip into the\n // film's Library folder, which is where this skill tells the caller to\n // look for them.\n if (all.some((sh) => needsSave(sh.videoUrl))) {\n await filmApi(ctx, 'POST', `/api/films/${filmId}/save`, { kind: 'clip' });\n }\n const hasMusic = film.audioStems.some((st) => st.kind === 'music');\n // A music video's song IS the soundtrack (the export mutes the clips and\n // lays it): never compose, and never charge, a score for one.\n if (soundtrack !== 'none' && !hasMusic && !isMusicVideo(film)) {\n // A previous poll started the score — attach it when done.\n if (musicJobId) {\n const job = await ctx.client.getJob(musicJobId);\n // `audio` is in the live API response; older @pixeldojo/sdk type\n // versions predate the field, so read it structurally.\n const out = job.output as { audio?: string; video?: string; images?: string[] } | undefined;\n const outUrl = out?.audio ?? out?.video ?? out?.images?.[0];\n if (job.status === 'completed' && typeof outUrl === 'string') {\n await filmApi(ctx, 'PATCH', `/api/films/${filmId}`, { audioStems: [{ kind: 'music', url: outUrl }] });\n const exportError = await startExport();\n if (exportError) return { kind: 'text', text: `Score attached, but the export could not start: ${exportError}` };\n return {\n kind: 'text',\n text: `Score attached — export started. Poll again in ~60s with {\"film_id\": \"${filmId}\", \"action\": \"status\"} for the finished film URL.`,\n followUp: keepGoing(filmId, 60, { soundtrack }),\n };\n }\n if (job.status === 'failed') {\n return { kind: 'text', text: `The score failed (${job.error ?? 'unknown'}) and was refunded. Poll again to retry, or pass soundtrack \"none\" to export without music.` };\n }\n return {\n kind: 'text',\n text: `Score still composing. Poll again in ~20s with {\"film_id\": \"${filmId}\", \"action\": \"status\", \"music_job_id\": \"${musicJobId}\"}.`,\n followUp: keepGoing(filmId, 20, { soundtrack, music_job_id: musicJobId }),\n };\n }\n // Dispatch the score through the public API (same engine as the studio).\n const body = soundtrack === 'scene-synced' ? buildScorePlanBody(film) : buildFlatMusicBody(film, shots(film));\n const dispatch = await ctx.client.run('text-to-music', body as never);\n return {\n kind: 'text',\n text: `All ${all.length} clips ready — the ${soundtrack} score is composing (charged like any music generation). Poll again in ~20s with {\"film_id\": \"${filmId}\", \"action\": \"status\", \"music_job_id\": \"${dispatch.jobId}\"}.`,\n followUp: keepGoing(filmId, 20, { soundtrack, music_job_id: dispatch.jobId }),\n };\n }\n const exportError = await startExport();\n if (exportError) return { kind: 'text', text: `All clips ready, but the export could not start: ${exportError}` };\n return {\n kind: 'text',\n text: `All clips ready — export started (${progressLine(film)}). Poll again in ~60s with action \"status\" for the finished film URL.`,\n followUp: keepGoing(filmId, 60, { soundtrack }),\n };\n }\n\n const failed = all.filter((sh) => sh.status === 'failed');\n const refused = failed.filter(isRefused);\n const retrying = failed.filter((sh) => !isRefused(sh));\n const sentAgain = retrying.filter((sh) => resent.has(sh.id)).length;\n // Nothing rendering and nothing left to start: only a person can move it.\n const rendering = all.some((sh) => sh.status === 'frame-generating' || sh.status === 'clip-generating');\n const paused = refused.length > 0 && started === 0 && !rendering;\n // Moving = a later status call has something to collect or start. A film\n // where every start was refused is not moving, whatever the counts say.\n const moving = started > 0 || rendering;\n const labels = shotLabels(film);\n // The studio ends every failure with \"Retry the shot.\", advice meant for its\n // own button, which reads as a contradiction next to \"not resent\".\n const reason = (sh: FilmShotDto) => {\n const text = (sh.errorMessage ?? 'no reason given').replace(/\\s*Retry (?:the shot|it)\\.\\s*$/i, '');\n return text.length > 300 ? `${text.slice(0, 297)}...` : text;\n };\n const one = refused.length === 1;\n return {\n kind: 'text',\n text: [\n `${paused ? 'Paused' : 'In progress'}: ${progressLine(film)}.`,\n refused.length > 0\n ? `${one ? 'Shot' : 'Shots'} ${refused.map((sh) => labels.get(sh.id)).join(', ')} need${one ? 's' : ''} a new frame or prompt. The provider refused ${one ? 'it' : 'them'} (${reason(refused[0])}) and usually refuses the same input again, so status does not resend ${one ? 'it' : 'them'}: every retry is a charged render. Change ${one ? 'it' : 'them'} and render again at ${ctx.baseUrl}/film-studio/${filmId}.`\n : '',\n retrying.length > 0\n ? `${retrying.length} shot(s) failed (${reason(retrying[0])}): ${sentAgain === retrying.length ? 'sent again' : sentAgain > 0 ? `${sentAgain} sent again, the rest on a later poll` : 'sent again on a later poll'}.`\n : '',\n refusedStarts.length > 0 ? `${refusedStarts.length} render(s) could not start: ${refusedStarts[0]}` : '',\n paused\n ? `Nothing else is rendering. Once the shot${one ? '' : 's'} render${one ? 's' : ''} again, call pixeldojo_film with {\"film_id\": \"${filmId}\", \"action\": \"status\"} to carry on.`\n : moving\n ? `Poll again in ~30s with {\"film_id\": \"${filmId}\", \"action\": \"status\"}.`\n : `Nothing is rendering. Fix what is above, then call pixeldojo_film with {\"film_id\": \"${filmId}\", \"action\": \"status\"} to carry on.`,\n ].filter(Boolean).join('\\n'),\n ...(moving && !paused ? { followUp: keepGoing(filmId, 30, { soundtrack }) } : {}),\n };\n}\n\n/** One line per shot, so a caller can name the shot to redo. Long films are\n * left to the storyboard: 60 lines would drown the reply. */\n/** Clips still flagged after their one automatic redo: named, so the user\n * decides whether another take is worth a clip charge. */\nfunction stillFlagged(f: FilmDto): string {\n const labels = shotLabels(f);\n const flagged = shots(f).filter(flaggedClip);\n if (!flagged.length) return '';\n return `The clip check still flags ${flagged.length} after one redo each: ${flagged\n .map((sh) => `${labels.get(sh.id)} (${sh.clipQa!.note || sh.clipQa!.issues.join(', ')})`)\n .join('; ')}. Ask the user before another take (action \"redo\", a clip charge each).`;\n}\n\nfunction shotIndex(f: FilmDto): string {\n const all = shots(f);\n if (all.length === 0 || all.length > 24) return '';\n const labels = shotLabels(f);\n let at = 0;\n const clock = (sec: number) => `${Math.floor(sec / 60)}:${String(Math.round(sec % 60)).padStart(2, '0')}`;\n const lines = all.map((sh) => {\n const from = at;\n at += cutSec(sh);\n const what = sh.prompt.replace(/\\s+/g, ' ').trim();\n const when = sh.leftOut ? 'left out of the cut' : `about ${clock(from)}-${clock(at)}`;\n return ` ${labels.get(sh.id)} (${when}): ${what.length > 70 ? `${what.slice(0, 67)}...` : what}`;\n });\n return ['Shots (redo any with action \"redo\" and its label):', ...lines].join('\\n');\n}\n\n/** Render a new take of chosen shots: the clip again from the same frame, or\n * a new frame and then its clip. Charged per render, like the storyboard's\n * own Redo. Status then saves the take and cuts a new export with it. */\nasync function redoShots(input: Input, ctx: SkillContext): Promise<SkillResult> {\n const filmId = input.film_id!;\n if (!input.shots?.length) {\n return { kind: 'text', text: 'Pass shots: the labels status reports, like [\"2.3\"] for scene 2, shot 3.' };\n }\n const { status, data } = await filmApi<{ film?: FilmDto; error?: string }>(ctx, 'GET', `/api/films/${filmId}`);\n const film = data.film;\n if (!film) return noFilm(status, data, filmId, { action: 'redo', shots: input.shots, redo: input.redo });\n const labels = shotLabels(film);\n const byLabel = new Map(shots(film).map((sh) => [labels.get(sh.id)!, sh] as const));\n const byId = new Map(shots(film).map((sh) => [sh.id, sh] as const));\n const kind = input.redo;\n const lines: string[] = [];\n let started = 0;\n let credits = 0;\n for (const ref of Array.from(new Set(input.shots))) {\n const sh = byLabel.get(ref) ?? byId.get(ref);\n if (!sh) {\n lines.push(`No shot ${ref} in this film (shots run 1.1 to ${Array.from(byLabel.keys()).pop()}).`);\n continue;\n }\n const label = labels.get(sh.id)!;\n if (kind === 'clip' && !sh.frameUrl) {\n lines.push(`Shot ${label} has no frame yet, so there is no clip to redo. Redo it with redo \"frame\".`);\n continue;\n }\n const r = await filmApi<{ creditCost?: number; error?: string }>(ctx, 'POST', `/api/films/${filmId}/shots/${sh.id}/generate`, { kind });\n if (r.status === 200) {\n started += 1;\n credits += r.data.creditCost ?? 0;\n lines.push(`Shot ${label}: new ${kind} rendering${r.data.creditCost ? ` (${r.data.creditCost} credits)` : ''}.`);\n } else {\n lines.push(`Shot ${label}: could not start: ${r.data.error ?? `HTTP ${r.status}`}`);\n }\n }\n if (started === 0) return { kind: 'text', text: [...lines, 'Nothing was started.'].join('\\n') };\n return {\n kind: 'text',\n text: [\n ...lines,\n `${credits ? `${credits} credits charged for the new take${started > 1 ? 's' : ''}. ` : ''}${kind === 'frame' ? 'Each new frame gets the Frame check, then a new clip. ' : ''}The new take replaces the old one; keep calling pixeldojo_film with {\"film_id\": \"${filmId}\", \"action\": \"status\"}, which saves it and cuts a new export with it.`,\n ].join('\\n'),\n followUp: keepGoing(filmId, 30, { soundtrack: input.soundtrack }),\n };\n}\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n const action =\n input.action === 'plan' && input.film_id ? (input.cast?.length ? 'cast' : 'status') : input.action;\n if (action === 'plan') return plan(input, ctx);\n if (!input.film_id) return { kind: 'text', text: 'produce/status/cast/redo need the film_id returned by the plan step.' };\n if (action === 'cast') {\n if (!input.cast?.length) return { kind: 'text', text: 'Pass cast: [{ name, prompt | image_urls | character_id }] to cast characters (add replace: true to swap someone already cast, or remove: true to take them off).' };\n const { lines } = await applyCast(ctx, input.film_id, input.cast);\n const uncast = await uncastRolesOf(ctx, input.film_id);\n return {\n kind: 'text',\n text: [\n ...lines,\n uncast.length\n ? castNeededText(input.film_id, uncast)\n : `Everyone is cast. Call pixeldojo_film with {\"film_id\": \"${input.film_id}\", \"action\": \"produce\"} to start production.`,\n ].join('\\n'),\n };\n }\n if (action === 'produce') return produce(input.film_id, input.soundtrack, ctx);\n if (action === 'redo') return redoShots(input, ctx);\n return advance(input.film_id, input.soundtrack, input.music_job_id, ctx);\n}\n\nexport const filmSkill: SkillModule<Input> = {\n name: 'pixeldojo_film',\n description:\n 'Make a finished short film from one idea: screenplay, storyboard frames (AI-reviewed), video clips with spoken dialogue, scene-synced soundtrack, stitched export. Or a music video: pass song_path (a local file) or song_url (your own PixelDojo upload from pixeldojo_upload, never a third-party link) with optional lyrics; the film is cut to that song, each clip lip-synced to its slice on the studio music video engine, and no score is composed: the export plays the song. Every named character must be cast (cast: your own images, a portrait prompt, or a Character Studio character) before frames render; cast entries can also replace or remove someone. Phased: plan is free; cast; produce starts charged generation; status advances production (poll every ~30s); redo renders a new take of chosen shots and status re-exports.',\n hostedDescription:\n 'Make a finished short film from one idea: screenplay, storyboard frames (AI-reviewed), video clips with spoken dialogue, scene-synced soundtrack, stitched export. Or a music video: pass song_url (your own PixelDojo upload made with POST /api/v1/upload, never a third-party link) with optional lyrics; the film is cut to that song, each clip lip-synced to its slice on the studio music video engine, and no score is composed: the export plays the song. Every named character must be cast (cast: your own images, a portrait prompt, or a Character Studio character) before frames render; cast entries can also replace or remove someone. Phased: plan is free; cast; produce starts charged generation; status advances production (poll every ~30s); redo renders a new take of chosen shots and status re-exports.',\n inputZod: InputSchema as unknown as z.ZodType<Input>,\n inputJsonSchema: InputJsonSchema,\n allowedModels: [],\n defaultModel: '',\n run,\n};\n","/**\n * pixeldojo_video: Video Studio's Change / Move / Extend verbs for agents.\n *\n * (\"Make\" is pixeldojo_generate.) Every engine choice here is Video Studio's\n * own: the per-verb lists below are a hand-copy of `enginesFor(verb)` in the\n * app's lib/video-studio/engines.ts (default first, public apiIds), and each\n * payload mirrors that engine's `buildPayload` there. The package cannot\n * import app code, so tests/contracts/mcp-video-studio-parity.test.ts pins\n * both: the lists must equal the studio's, and every payload built here must\n * pass the real tool schema and use the tool's declared `media` keys.\n *\n * ponytail: payload keys are static per engine rather than resolved from\n * GET /schema at runtime. The contract test checks them against each tool's\n * declared `media` block, so drift fails CI instead of a paid job, and a\n * call costs no schema fetch.\n */\nimport { z } from 'zod';\nimport { pollJobUntilDoneOrHandoff } from '../poll.js';\nimport {\n type SkillContext,\n type SkillModule,\n type SkillResult,\n pollResultToSkillResult,\n} from './types.js';\nimport { SkillUploadError, uploadLocalFile } from './upload-helpers.js';\nimport { PARAMS_JSON_SCHEMA, ParamsInput, applyParams, paramsWithoutModel, prefixNote } from './params.js';\n\nexport type VideoVerb = 'change' | 'move' | 'extend';\n\n/** Mirror of enginesFor(verb).map(e => e.apiModelId ?? e.apiId). Default first. */\nexport const VIDEO_STUDIO_ENGINES: Record<VideoVerb, readonly string[]> = {\n change: [\n 'seedance-2-5-video-edit',\n 'flux-video-edit',\n 'kling-video-edit',\n 'wan-video-edit',\n 'seedance-video-edit',\n 'happyhorse-1.0-video-edit',\n 'xai-video-edit',\n ],\n move: ['kling-motion-control', 'wan-video-character-swap'],\n extend: ['seedance-2-5-video-edit', 'wan-2.7-i2v', 'grok-video-extend'],\n};\n\nconst VERBS = ['change', 'move', 'extend'] as const;\n\n/** Only one extend engine can run a clip backwards (engines.ts `directions`). */\nconst BACKWARD_ENGINES = new Set(['seedance-2-5-video-edit']);\n\nexport interface VideoPayloadInput {\n prompt?: string;\n videoUrl: string;\n images: string[];\n /** Source clip length in seconds. */\n videoDuration?: number;\n duration?: number;\n direction?: 'forward' | 'backward';\n}\n\ntype Built = { body: { prompt: string; [key: string]: unknown }; note?: string } | { error: string };\n\nconst clamp = (n: number, min: number, max: number) => Math.min(max, Math.max(min, Math.round(n)));\n\n/** Engines whose schema requires the source length (their credit meter). */\nconst NEEDS_VIDEO_DURATION = new Set([\n 'flux-video-edit',\n 'kling-video-edit',\n 'wan-video-edit',\n 'seedance-video-edit',\n 'happyhorse-1.0-video-edit',\n 'xai-video-edit',\n 'kling-motion-control',\n 'wan-video-character-swap',\n]);\n\n/** Change engines with no reference-image slot. */\nconst NO_IMAGE_ENGINES = new Set(['flux-video-edit', 'xai-video-edit']);\n\n/** Each engine's payload, mirroring buildPayload in lib/video-studio/engines.ts. */\nexport function buildVideoPayload(verb: VideoVerb, apiId: string, i: VideoPayloadInput): Built {\n const prompt = i.prompt ?? '';\n const vd = i.videoDuration;\n if (NEEDS_VIDEO_DURATION.has(apiId) && vd === undefined) {\n return {\n error: `${apiId} needs video_duration: the source clip's length in seconds (it sets the credit cost).`,\n };\n }\n if (verb === 'move' && !i.images[0]) {\n return { error: `The move verb needs image_url: the character image to put into the video.` };\n }\n const droppedImages =\n i.images.length > 0 && (verb === 'extend' || NO_IMAGE_ENGINES.has(apiId))\n ? `${apiId} takes no reference images, so I left them off.`\n : undefined;\n\n if (verb === 'change') {\n switch (apiId) {\n case 'seedance-2-5-video-edit':\n return {\n body: {\n mode: 'edit',\n prompt,\n video_url: i.videoUrl,\n reference_images: i.images,\n ...(vd !== undefined ? { source_duration_seconds: vd } : {}),\n },\n };\n case 'flux-video-edit':\n // Schema is .int(); a probed 7.4s float is rejected.\n return { body: { prompt, video: i.videoUrl, video_duration: Math.ceil(vd!) }, note: droppedImages };\n case 'xai-video-edit':\n return { body: { prompt, video_url: i.videoUrl, video_duration: vd }, note: droppedImages };\n case 'happyhorse-1.0-video-edit':\n return { body: { prompt, video_url: i.videoUrl, video_duration: vd, reference_urls: i.images } };\n default: // kling-video-edit, wan-video-edit, seedance-video-edit\n return { body: { prompt, video_url: i.videoUrl, video_duration: vd, image_urls: i.images } };\n }\n }\n\n if (verb === 'move') {\n if (apiId === 'wan-video-character-swap') {\n // No prompt field on this tool; the SDK needs the key and the schema strips it.\n return { body: { prompt: '', image_url: i.images[0], video_url: i.videoUrl, video_duration: vd } };\n }\n return {\n body: {\n prompt,\n video: i.videoUrl,\n video_duration: vd,\n character_image: i.images[0],\n // Not a background toggle: 'video' is the 30s duration cap.\n character_orientation: 'video',\n },\n };\n }\n\n // extend\n switch (apiId) {\n case 'seedance-2-5-video-edit':\n return {\n body: {\n mode: 'extend',\n prompt,\n video_url: i.videoUrl,\n direction: i.direction ?? 'forward',\n duration: clamp(i.duration ?? 5, 4, 30),\n ...(vd !== undefined ? { source_duration_seconds: vd } : {}),\n },\n note: droppedImages,\n };\n case 'wan-2.7-i2v': {\n const chosen = clamp(i.duration ?? 5, 2, 15);\n return {\n body: {\n mode: 'video-extend',\n prompt,\n video_url: i.videoUrl,\n // A continuation shorter than its own source is rejected outright.\n duration: vd ? Math.min(15, Math.max(chosen, Math.ceil(vd) + 1)) : chosen,\n ...(vd ? { source_video_duration: vd } : {}),\n },\n note: droppedImages,\n };\n }\n default: // grok-video-extend: duration is the seconds ADDED; the server measures the source.\n return {\n body: { prompt, video_url: i.videoUrl, extension_duration: clamp(i.duration ?? 6, 2, 10) },\n note: droppedImages,\n };\n }\n}\n\nconst InputSchema = z.object({\n verb: z.enum(VERBS),\n prompt: z.string().max(8000).optional(),\n video_url: z.string().url().optional(),\n video_path: z.string().min(1).optional(),\n image_url: z.string().url().optional(),\n image_urls: z.array(z.string().url()).optional(),\n image_path: z.string().min(1).optional(),\n model: z.string().optional(),\n video_duration: z.number().positive().optional(),\n duration: z.number().int().positive().optional(),\n direction: z.enum(['forward', 'backward']).optional(),\n params: ParamsInput,\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst engineList = (verb: VideoVerb) =>\n `${verb}: ${VIDEO_STUDIO_ENGINES[verb].join(', ')} (default ${VIDEO_STUDIO_ENGINES[verb][0]})`;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n verb: {\n type: 'string',\n enum: VERBS,\n description:\n 'change = restyle or edit an existing clip; move = put a character image into a driving video (motion transfer / character swap); extend = continue a clip forward (or backward on the default engine).',\n },\n prompt: {\n type: 'string',\n description:\n 'What to change, how the character should move, or what happens next. Required for change and extend. Optional for move (wan-video-character-swap ignores it). @Name uses a character or element the user saved in Character Studio (photos attached automatically).',\n },\n video_url: {\n type: 'string',\n format: 'uri',\n description: 'The source clip (change, extend) or the driving motion clip (move). Required.',\n },\n video_path: {\n type: 'string',\n description: 'Absolute local path to the source clip (MP4, WebM, MOV). Uploaded to 24h temp storage and used as video_url.',\n },\n image_url: {\n type: 'string',\n format: 'uri',\n description: 'The character image (move, required) or a reference image (change, optional; some engines take none).',\n },\n image_urls: {\n type: 'array',\n items: { type: 'string', format: 'uri' },\n description: 'More reference images for change engines that take a set. Move uses the first image only.',\n },\n image_path: {\n type: 'string',\n description: 'Absolute local path to the character or reference image. Uploaded to 24h temp storage and used as image_url.',\n },\n model: {\n type: 'string',\n description: `Video Studio engine for this verb. Omit for the default. ${VERBS.map((v) => engineList(v)).join('; ')}. A model not on the verb's list is replaced by the default and the result says so.`,\n },\n video_duration: {\n type: 'number',\n description:\n \"The source clip's length in seconds. Required by every engine except the change/extend default and grok-video-extend, since it sets their credit cost.\",\n },\n duration: {\n type: 'integer',\n description:\n 'Extend only: output length in seconds (default engine 4-30, wan-2.7-i2v 2-15 total), or seconds added on grok-video-extend (2-10). Ignored by change and move, which keep the source length.',\n },\n direction: {\n type: 'string',\n enum: ['forward', 'backward'],\n description: 'Extend only. backward adds footage before the clip; only the default engine supports it.',\n },\n params: PARAMS_JSON_SCHEMA,\n },\n required: ['verb'],\n} as const;\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n const paramsGate = paramsWithoutModel(input.params, input.model);\n if (paramsGate) return { kind: 'text', text: paramsGate };\n\n const verb = input.verb;\n const engines = VIDEO_STUDIO_ENGINES[verb];\n const notes: string[] = [];\n\n // Substitute, never dead-end: a model that is not one of this verb's\n // Video Studio engines runs on the verb default instead.\n let apiId = input.model ?? engines[0];\n if (!engines.includes(apiId)) {\n notes.push(`${apiId} is not a Video Studio ${verb} engine, so I used ${engines[0]} instead.`);\n apiId = engines[0];\n }\n if (verb === 'extend' && input.direction === 'backward' && !BACKWARD_ENGINES.has(apiId)) {\n notes.push(`${apiId} only extends forward, so I used ${engines[0]} to extend backward.`);\n apiId = engines[0];\n }\n\n let videoUrl = input.video_url;\n const images = [...(input.image_url ? [input.image_url] : []), ...(input.image_urls ?? [])];\n try {\n if (!videoUrl && input.video_path) videoUrl = await uploadLocalFile(input.video_path, ctx);\n if (!input.image_url && input.image_path) images.unshift(await uploadLocalFile(input.image_path, ctx));\n } catch (err) {\n if (err instanceof SkillUploadError) {\n return { kind: 'text', text: `pixeldojo_video (upload): ${err.userMessage}` };\n }\n throw err;\n }\n\n if (!videoUrl) {\n return {\n kind: 'text',\n text: `pixeldojo_video ${verb} needs video_url: the ${verb === 'move' ? 'driving motion clip' : 'source clip'}.`,\n };\n }\n if (verb !== 'move' && !input.prompt?.trim()) {\n return { kind: 'text', text: `pixeldojo_video ${verb} needs a prompt.` };\n }\n\n const built = buildVideoPayload(verb, apiId, {\n prompt: input.prompt,\n videoUrl,\n images: images.filter((u, i, all) => all.indexOf(u) === i),\n videoDuration: input.video_duration,\n duration: input.duration,\n direction: input.direction,\n });\n if ('error' in built) return { kind: 'text', text: `pixeldojo_video: ${built.error}` };\n if (built.note) notes.push(built.note);\n\n const body = built.body;\n const paramsNote = applyParams(body, input.params, input.model, apiId);\n if (paramsNote) notes.push(paramsNote);\n\n const submitted = await ctx.client.run(apiId, body);\n const result = await pollJobUntilDoneOrHandoff(\n submitted.jobId,\n (id) => ctx.client.getJob(id),\n ctx.buildStatusUrl,\n { now: ctx.pollOverrides?.now, sleep: ctx.pollOverrides?.sleep },\n );\n\n return prefixNote(\n pollResultToSkillResult(result, (urls) =>\n urls.length === 0\n ? `Job ${submitted.jobId} completed but returned no assets.`\n : `Video ready (${verb} on ${apiId}). Asset: ${urls.join(', ')}`,\n ),\n notes.join(' '),\n );\n}\n\nconst BASE_DESCRIPTION =\n \"Video Studio verbs for an existing clip, on the same engines the studio uses. verb=change restyles or edits a clip (prompt + video_url, optional reference images). verb=move puts a character image into a driving video's motion (video_url + image_url + video_duration). verb=extend continues a clip forward, or backward on the default engine (prompt + video_url, optional duration and direction). Omit `model` for the studio default; engine-specific settings go in `params` with an explicit `model`. To make a new video, use pixeldojo_generate. Returns asset URLs, or a jobId for pixeldojo_status when the job outlasts the 30s wait.\";\n\nexport const videoSkill: SkillModule<Input> = {\n name: 'pixeldojo_video',\n description: `${BASE_DESCRIPTION} Local files: video_path / image_path (uploaded to 24h temp storage first).`,\n hostedDescription: `${BASE_DESCRIPTION} Media must be public http(s) URLs.`,\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n allowedModels: Array.from(new Set(VERBS.flatMap((v) => VIDEO_STUDIO_ENGINES[v]))),\n defaultModel: VIDEO_STUDIO_ENGINES.change[0],\n run,\n};\n","/**\n * pixeldojo_episode — one topic in, a finished narrated faceless video out.\n *\n * Drives the real Faceless Studio pipeline (the same\n * /api/faceless-studio/episodes routes the web app uses; they accept the\n * MCP's Bearer credential). Phased like pixeldojo_film:\n *\n * 1. CREATE (free): { topic } → creates the episode, writes the script and\n * scene plan, returns episode_id and the credit quote. Nothing charged.\n * 2. PRODUCE (charged, advances one step per call):\n * narration → scene renders (four at a time) → music bed → export →\n * save. Every charged step says what it cost. Call it every ~30s until it\n * returns the finished video URL.\n * 3. STATUS (free, read-only): progress and the current quote.\n *\n * Rendering happens server-side (the `.../generate` routes), so the charge\n * for each render is the same tool at the same price the web app uses.\n */\nimport { z } from 'zod';\nimport type { SkillContext, SkillModule, SkillResult } from './types.js';\n\n// Mirrors of the studio's constants (lib/faceless-studio/shared.ts). This\n// package cannot import the app, so tests/contracts/mcp-episode-parity.test.ts\n// pins these to the originals.\nconst STYLES = ['editorial-motion', 'paper-diorama', 'hand-drawn', 'storybook', 'poster-vector', 'soft-3d'] as const;\nconst CATEGORIES = ['education', 'history', 'kids', 'storytelling', 'custom'] as const;\nconst ENGINES = ['omni-draft', 'omni-final', 'still-motion'] as const;\nconst MIN_SECONDS = 60;\nconst MAX_SECONDS = 300;\n\n/** Scene renders in flight at once, same as the web page's queue. */\nconst MAX_IN_FLIGHT = 4;\n\nconst InputSchema = z.object({\n action: z.enum(['create', 'produce', 'status']).default('create'),\n topic: z.string().min(8).max(400).optional(),\n episode_id: z.string().max(40).optional(),\n category: z.enum(CATEGORIES).default('education'),\n style: z.enum(STYLES).default('editorial-motion'),\n aspect: z.enum(['16:9', '9:16']).default('16:9'),\n length_seconds: z.number().int().min(MIN_SECONDS).max(MAX_SECONDS).default(120),\n voice: z.string().min(1).max(80).default('Wise_Woman'),\n engine: z.enum(ENGINES).optional(),\n music: z.boolean().default(true),\n title: z.string().max(120).optional(),\n});\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema: Record<string, unknown> = {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['create', 'produce', 'status'],\n description:\n 'create (default, free): writes the script and scene plan, returns episode_id and the credit quote. produce (charged): advances production one step (narration, scene renders, music, export, save) and reports what that step cost; call it every ~30s until it returns the finished video URL. status (free): progress only.',\n },\n topic: { type: 'string', description: 'Create step: what the episode is about, 8 to 400 characters.' },\n episode_id: { type: 'string', description: 'The episode_id from the create step. Required for produce and status.' },\n category: { type: 'string', enum: [...CATEGORIES], description: 'Create step: tone of the script. Default education.' },\n style: { type: 'string', enum: [...STYLES], description: 'Create step: visual style of every scene. Default editorial-motion.' },\n aspect: { type: 'string', enum: ['16:9', '9:16'], description: 'Create step: 16:9 landscape (default) or 9:16 vertical.' },\n length_seconds: { type: 'integer', minimum: MIN_SECONDS, maximum: MAX_SECONDS, description: 'Create step: target length in seconds. Default 120.' },\n voice: { type: 'string', description: 'Create step: narrator voice id from the text-to-speech tool (e.g. Wise_Woman, Deep_Voice_Man, Friendly_Person). Default Wise_Woman.' },\n engine: {\n type: 'string',\n enum: [...ENGINES],\n description:\n 'Create step (optional): render every scene with one engine. omni-draft: fast, cheap motion preview. omni-final: full quality motion with sound. still-motion: one illustration per scene, gently panned, cheapest. Default: the style picks.',\n },\n music: { type: 'boolean', description: 'Create step: add a music bed under the narration. Default true.' },\n title: { type: 'string', description: 'Create step (optional): episode title. Defaults to the topic.' },\n },\n};\n\ninterface Render {\n status: 'idle' | 'running' | 'done' | 'failed';\n url: string | null;\n error?: string;\n stale?: boolean;\n}\ninterface SceneDto {\n id: string;\n narration: string;\n visualPrompt: string;\n engine: string;\n shotSeconds: number;\n render: Render;\n}\ninterface EpisodeDto {\n id: string;\n title: string;\n plan: { job: { status: 'running' | 'done' | 'error'; error?: string } | null; script: unknown | null };\n narration: { status: Render['status']; audioUrl: string | null; error?: string } | null;\n scenes: SceneDto[];\n music: { status: Render['status']; url: string | null; error?: string } | null;\n musicEnabled: boolean;\n export: { status: 'idle' | 'running' | 'done' | 'failed'; url: string | null; error?: string; stale?: boolean } | null;\n savedAt: string | null;\n}\ninterface Price {\n scenes: number;\n narration: number;\n music: number;\n total: number;\n}\ntype EpisodeReply = { episode?: EpisodeDto; price?: Price; error?: string; creditCost?: number };\n\nasync function episodeApi(\n ctx: SkillContext,\n method: string,\n path: string,\n body?: unknown,\n): Promise<{ status: number; data: EpisodeReply }> {\n const res = await fetch(`${ctx.baseUrl}/api/faceless-studio/episodes${path}`, {\n method,\n headers: {\n Authorization: `Bearer ${ctx.apiKey}`,\n 'Content-Type': 'application/json',\n 'x-pixeldojo-source': `mcp/${ctx.mcpVersion}`,\n 'x-pixeldojo-skill': 'episode',\n },\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n });\n const data = (await res.json().catch(() => ({}))) as EpisodeReply;\n return { status: res.status, data };\n}\n\nconst call = (id: string, action: 'produce' | 'status') =>\n `pixeldojo_episode with {\"episode_id\": \"${id}\", \"action\": \"${action}\"}`;\nconst next = (id: string, action: 'produce' | 'status', wait: string) => `Call ${call(id, action)} in ${wait}.`;\n\n/** Same test as the web page's queue: what still has to be rendered. */\nconst needsRender = (s: SceneDto) =>\n s.render.status !== 'running' &&\n (s.render.status === 'idle' || s.render.status === 'failed' || Boolean(s.render.stale) || !s.render.url);\n\nfunction quoteText(ep: EpisodeDto, price: Price | undefined, ctx: SkillContext): string {\n const engines = [...new Set(ep.scenes.map((s) => s.engine))].join(', ');\n const seconds = ep.scenes.reduce((n, s) => n + s.shotSeconds, 0);\n return [\n `Planned \"${ep.title}\" (episode_id: ${ep.id}): ${ep.scenes.length} scenes, about ${Math.round(seconds)}s of picture, engine ${engines}.`,\n ...ep.scenes.slice(0, 12).map((s, i) => ` ${i + 1}. ${s.narration.slice(0, 110)}`),\n ...(ep.scenes.length > 12 ? [` ... and ${ep.scenes.length - 12} more.`] : []),\n '',\n price\n ? `Nothing has been charged yet. Producing it costs about ${price.total} credits at list price: scenes ${price.scenes}, narration ${price.narration}, music ${price.music}. Each part is charged as it renders; an active sale can make it lower.`\n : 'Nothing has been charged yet.',\n `Review or edit at ${ctx.baseUrl}/faceless-studio?episode=${ep.id}, or call ${call(ep.id, 'produce')} to start production.`,\n ].join('\\n');\n}\n\nconst PLAN_POLL_MS = 3000;\nconst PLAN_MAX_POLLS = 8;\n\n/** Wait for the plan job inside one tool call (~24s, under the 30s window). */\nasync function waitForPlan(ctx: SkillContext, id: string): Promise<EpisodeReply | null> {\n const sleep = ctx.pollOverrides?.sleep ?? ((ms: number) => new Promise<void>((r) => setTimeout(r, ms)));\n for (let i = 0; i < PLAN_MAX_POLLS; i += 1) {\n await sleep(PLAN_POLL_MS);\n const { data } = await episodeApi(ctx, 'GET', `/${id}`);\n if (data.episode?.plan.job?.status !== 'running') return data;\n }\n return null;\n}\n\nconst stillPlanning = (id: string) =>\n `The script is still being written (episode_id: ${id}). Nothing has been charged. ${next(id, 'status', '~30s')}`;\n\nasync function setEngine(ctx: SkillContext, ep: EpisodeDto, engine: string): Promise<EpisodeReply> {\n const { data } = await episodeApi(ctx, 'PATCH', `/${ep.id}`, {\n scenes: ep.scenes.map((s) => ({ id: s.id, narration: s.narration, visualPrompt: s.visualPrompt, engine })),\n });\n if (!data.episode) return {};\n // The PATCH answers without a quote; the GET carries the re-priced one.\n return (await episodeApi(ctx, 'GET', `/${ep.id}`)).data;\n}\n\nasync function create(input: Input, ctx: SkillContext): Promise<SkillResult> {\n if (!input.topic?.trim()) {\n return { kind: 'text', text: 'Provide a `topic` (8 to 400 characters) to create an episode.' };\n }\n const created = await episodeApi(ctx, 'POST', '', {\n topic: input.topic.trim(),\n category: input.category,\n format: input.aspect,\n targetSeconds: input.length_seconds,\n style: input.style,\n voiceId: input.voice,\n ...(input.title?.trim() ? { title: input.title.trim() } : {}),\n });\n const ep = created.data.episode;\n if (!ep) return { kind: 'text', text: `Could not create the episode: ${created.data.error ?? created.status}` };\n\n if (!input.music) await episodeApi(ctx, 'PATCH', `/${ep.id}`, { musicEnabled: false });\n\n const plan = await episodeApi(ctx, 'POST', `/${ep.id}/plan`, { scope: 'episode' });\n if (plan.status !== 202) {\n return { kind: 'text', text: `Episode created (episode_id: ${ep.id}) but planning did not start: ${plan.data.error ?? plan.status}` };\n }\n let planned = await waitForPlan(ctx, ep.id);\n if (!planned) return { kind: 'text', text: stillPlanning(ep.id) };\n if (!planned.episode || planned.episode.plan.job?.status === 'error' || planned.episode.scenes.length === 0) {\n return { kind: 'text', text: `Planning failed: ${planned.episode?.plan.job?.error ?? planned.error ?? 'no scenes came back'}` };\n }\n if (input.engine) {\n const switched = await setEngine(ctx, planned.episode, input.engine);\n if (switched.episode) planned = switched;\n }\n return { kind: 'text', text: quoteText(planned.episode!, planned.price, ctx) };\n}\n\nfunction progress(ep: EpisodeDto): string {\n const done = ep.scenes.filter((s) => s.render.status === 'done' && s.render.url && !s.render.stale).length;\n const running = ep.scenes.filter((s) => s.render.status === 'running').length;\n const narr = ep.narration?.audioUrl ? 'recorded' : ep.narration?.status === 'running' ? 'recording' : 'not recorded';\n const music = !ep.musicEnabled ? 'off' : ep.music?.url ? 'ready' : ep.music?.status ?? 'not started';\n const exp = ep.export?.status ?? 'not started';\n return `narration ${narr}, scenes ${done}/${ep.scenes.length}${running ? ` (${running} rendering)` : ''}, music ${music}, export ${exp}`;\n}\n\nasync function status(id: string, ctx: SkillContext): Promise<SkillResult> {\n const { data, status: code } = await episodeApi(ctx, 'GET', `/${id}`);\n const ep = data.episode;\n if (!ep) return { kind: 'text', text: `Episode not found: ${data.error ?? code}` };\n if (ep.plan.job?.status === 'running') return { kind: 'text', text: stillPlanning(id) };\n if (ep.scenes.length === 0) {\n return { kind: 'text', text: `\"${ep.title}\" has no scene plan yet${ep.plan.job?.error ? ` (${ep.plan.job.error})` : ''}. Create a new episode with action \"create\".` };\n }\n if (ep.export?.status === 'done' && ep.export.url && ep.savedAt && !ep.export.stale) {\n return { kind: 'text', text: `\"${ep.title}\" is finished: ${ep.export.url}` };\n }\n const quote = data.price ? ` Plan quote: about ${data.price.total} credits at list price.` : '';\n return { kind: 'text', text: `\"${ep.title}\": ${progress(ep)}.${quote} Call ${call(id, 'produce')} to keep production moving.` };\n}\n\n/** One charged dispatch. Returns a line for the reply. */\nasync function generate(ctx: SkillContext, id: string, path: string, label: string, regenerate = false): Promise<{ ok: boolean; line: string }> {\n const r = await episodeApi(ctx, 'POST', `/${id}${path}`, regenerate ? { regenerate: true } : {});\n if (r.status === 200) {\n return { ok: true, line: `${label} started (${r.data.creditCost ?? '?'} credits).` };\n }\n return { ok: false, line: `${label} did not start: ${r.data.error ?? r.status}` };\n}\n\nasync function produce(id: string, ctx: SkillContext): Promise<SkillResult> {\n const { data, status: code } = await episodeApi(ctx, 'GET', `/${id}`);\n const ep = data.episode;\n if (!ep) return { kind: 'text', text: `Episode not found: ${data.error ?? code}` };\n if (ep.plan.job?.status === 'running') return { kind: 'text', text: stillPlanning(id) };\n if (ep.scenes.length === 0) {\n return { kind: 'text', text: `\"${ep.title}\" has no scene plan to produce. Create a new episode with action \"create\".` };\n }\n\n // 1) Narration first: every scene is cut against the recorded voice, so a\n // scene rendered before it would be re-cut and rendered twice.\n if (!ep.narration?.audioUrl) {\n if (ep.narration?.status === 'running') {\n return { kind: 'text', text: `Narration is recording. ${next(id, 'produce', '~20s')}` };\n }\n const g = await generate(ctx, id, '/narration/generate', 'Narration');\n const failed = ep.narration?.status === 'failed' ? ` (the last take failed: ${ep.narration.error ?? 'unknown'})` : '';\n return { kind: 'text', text: `${g.line}${failed} ${next(id, 'produce', '~20s')}` };\n }\n\n // 2) Scenes, four in flight.\n const running = ep.scenes.filter((s) => s.render.status === 'running').length;\n const queue = ep.scenes.filter(needsRender);\n if (queue.length > 0 || running > 0) {\n const lines: string[] = [];\n let spent = 0;\n for (const s of queue.slice(0, Math.max(0, MAX_IN_FLIGHT - running))) {\n const r = await episodeApi(ctx, 'POST', `/${id}/scenes/${s.id}/generate`, {});\n if (r.status === 200) spent += r.data.creditCost ?? 0;\n else {\n lines.push(`Scene ${ep.scenes.indexOf(s) + 1} did not start: ${r.data.error ?? r.status}`);\n // Out of credits or suspended: stop, the rest would fail the same way.\n if (r.status === 402 || r.status === 403) break;\n }\n }\n const failed = ep.scenes.filter((s) => s.render.status === 'failed');\n return {\n kind: 'text',\n text: [\n `In progress: ${progress(ep)}.`,\n spent > 0 ? `Started scene renders for ${Math.round(spent * 10) / 10} credits.` : '',\n failed.length > 0 ? `${failed.length} scene(s) failed and were re-queued (${failed[0]?.render.error?.slice(0, 100) ?? ''}).` : '',\n ...lines,\n next(id, 'produce', '~30s'),\n ].filter(Boolean).join('\\n'),\n };\n }\n\n // 3) Music. A failed bed never blocks the export: it ships without one.\n if (ep.musicEnabled && !ep.music?.url && ep.music?.status !== 'failed') {\n if (ep.music?.status === 'running') {\n return { kind: 'text', text: `All scenes rendered; the music bed is composing. ${next(id, 'produce', '~20s')}` };\n }\n const g = await generate(ctx, id, '/music/generate', 'Music bed');\n return { kind: 'text', text: `All scenes rendered. ${g.line} ${next(id, 'produce', '~20s')}` };\n }\n\n // 4) Export, then save.\n const exp = ep.export;\n if (exp?.status === 'running') {\n return { kind: 'text', text: `Export is stitching the episode. ${next(id, 'produce', '~60s')}` };\n }\n if (exp?.status === 'done' && exp.url && !exp.stale) {\n if (ep.savedAt) return { kind: 'text', text: `\"${ep.title}\" is finished: ${exp.url}` };\n const saved = await episodeApi(ctx, 'POST', `/${id}/save`, {});\n const url = saved.data.episode?.export?.url;\n if (saved.status !== 200 || !url) {\n return { kind: 'text', text: `The export is ready but could not be saved: ${saved.data.error ?? saved.status}. The draft (kept 24h): ${exp.url}. ${next(id, 'produce', '~30s')}` };\n }\n return { kind: 'text', text: `\"${ep.title}\" is finished and saved to your Library: ${url}` };\n }\n const started = await episodeApi(ctx, 'POST', `/${id}/export`, {});\n if (started.status !== 202) {\n return { kind: 'text', text: `Export did not start: ${started.data.error ?? started.status}. ${next(id, 'produce', '~30s')}` };\n }\n const prior = exp?.status === 'failed' ? ` (the last export failed: ${exp.error ?? 'unknown'})` : '';\n const musicNote = ep.musicEnabled && ep.music?.status === 'failed' ? ' The music bed failed, so this cut has no music.' : '';\n return { kind: 'text', text: `Export started, free${prior}.${musicNote} ${next(id, 'produce', '~60s')}` };\n}\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n const action = input.action === 'create' && input.episode_id ? 'status' : input.action;\n if (action === 'create') return create(input, ctx);\n if (!input.episode_id) return { kind: 'text', text: 'produce and status need the episode_id returned by the create step.' };\n if (action === 'produce') return produce(input.episode_id, ctx);\n return status(input.episode_id, ctx);\n}\n\nexport const episodeSkill: SkillModule<Input> = {\n name: 'pixeldojo_episode',\n description:\n 'Make a finished narrated faceless video (explainer, history, kids story) from one topic: script, scene visuals, AI narration, music bed, stitched export saved to the Library. Phased: create is free and returns a credit quote; produce is charged and advances one step per call (poll every ~30s until it returns the video URL); status is free.',\n inputZod: InputSchema as unknown as z.ZodType<Input>,\n inputJsonSchema: InputJsonSchema,\n allowedModels: [],\n defaultModel: '',\n run,\n};\n","/**\n * pixeldojo_ad — the Marketing Studio as an agent skill.\n *\n * One call: a product (URL or images) + an ad style → a rendered product\n * video ad with voiceover, on the same backbone and prompt assembly the\n * /marketing-studio composer uses. Prompt assembly happens server-side\n * (POST /api/v1/ads/run), so new styles ship without a package release.\n *\n * Built for automation: agents can pull a store URL, render an ad in a\n * chosen style, and hand the video to a posting workflow (their own app,\n * Cowork, a scheduler). Style catalog: GET /api/v1/marketing/presets.\n */\nimport { z } from 'zod';\nimport {\n pollResultToSkillResult,\n type SkillContext,\n type SkillModule,\n type SkillResult,\n} from './types.js';\nimport { pollJobUntilDoneOrHandoff } from '../poll.js';\nimport { uploadLocalFile } from './upload-helpers.js';\n\nconst InputSchema = z\n .object({\n style: z\n .string()\n .max(80)\n .optional()\n .describe(\n 'Ad style slug (default ugc-testimonial). Catalog: GET /api/v1/marketing/presets — e.g. ugc-testimonial, unboxing-reveal, unboxing-asmr, virtual-try-on, street-style, product-showcase, macro-details, crush-test, hyper-motion, before-after, day-in-the-life, the-gift, tv-spot.',\n ),\n product_url: z\n .string()\n .url()\n .optional()\n .describe('Product page URL. Name, description, and images are extracted automatically.'),\n product_name: z.string().max(200).optional(),\n product_description: z.string().max(2000).optional(),\n product_image_urls: z.array(z.string().url()).max(5).optional(),\n product_image_paths: z\n .array(z.string())\n .max(5)\n .optional()\n .describe('Absolute local paths; uploaded to 24h temp storage automatically.'),\n character_image_urls: z\n .array(z.string().url())\n .max(4)\n .optional()\n .describe('Presenter reference images for a consistent on-camera character.'),\n character_image_paths: z.array(z.string()).max(4).optional(),\n location_description: z\n .string()\n .max(1500)\n .optional()\n .describe('Where the ad takes place (\"a sunlit Parisian cafe\"). Text is enough; no image needed.'),\n location_image_url: z.string().url().optional(),\n hook: z\n .string()\n .max(1000)\n .optional()\n .describe('The opening visual beat (first 1-2 seconds). Omit to use the style default.'),\n script: z\n .string()\n .max(1000)\n .optional()\n .describe('The exact spoken line, voiced word for word. Omit and the presenter improvises.'),\n quality: z.enum(['mini', 'fast', 'high']).optional(),\n resolution: z\n .enum(['480p', '720p', '1080p', '4k'])\n .optional()\n .describe('1080p/4k require quality \"high\".'),\n aspect_ratio: z.enum(['16:9', '4:3', '1:1', '3:4', '9:16', '21:9']).optional(),\n duration: z.number().int().min(4).max(15).optional(),\n })\n .refine(\n (v) => v.product_url || ((v.product_image_urls?.length || v.product_image_paths?.length) && v.product_name),\n {\n message: 'Pass product_url, OR product_name plus product_image_urls/product_image_paths.',\n path: ['product_url'],\n },\n );\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n style: {\n type: 'string',\n description:\n 'Ad style slug (default ugc-testimonial). Catalog: GET /api/v1/marketing/presets — e.g. ugc-testimonial, unboxing-reveal, unboxing-asmr, virtual-try-on, street-style, mirror-fit-check, pro-try-on, product-showcase, macro-details, secret-hack-reveal, crush-test, hyper-motion, before-after, day-in-the-life, the-gift, tv-spot, gadget-saved-me, selfie-testimonial, direct-to-camera, pack-an-order, mystery-box.',\n },\n product_url: {\n type: 'string',\n format: 'uri',\n description:\n 'Product page URL. Name, description, and images are extracted automatically. Pass this, or product_name plus product images; when set, the product_* fields are ignored.',\n },\n product_name: {\n type: 'string',\n description: 'Product name. Required with product images when there is no product_url.',\n },\n product_description: { type: 'string', description: 'Optional product description (no product_url case).' },\n product_image_urls: {\n type: 'array',\n items: { type: 'string', format: 'uri' },\n maxItems: 5,\n description: 'Up to 5 hosted product photos (no product_url case).',\n },\n product_image_paths: {\n type: 'array',\n items: { type: 'string' },\n maxItems: 5,\n description: 'Up to 5 absolute local product image paths; uploaded to 24h temp storage automatically.',\n },\n character_image_urls: {\n type: 'array',\n items: { type: 'string', format: 'uri' },\n maxItems: 4,\n description: 'Presenter reference images for a consistent on-camera character.',\n },\n character_image_paths: {\n type: 'array',\n items: { type: 'string' },\n maxItems: 4,\n description: 'Absolute local presenter image paths; uploaded to 24h temp storage automatically.',\n },\n location_description: {\n type: 'string',\n description: 'Where the ad takes place (\"a sunlit Parisian cafe\"). Text is enough.',\n },\n location_image_url: {\n type: 'string',\n format: 'uri',\n description: 'Optional reference photo of the location.',\n },\n hook: {\n type: 'string',\n description: 'The opening visual beat (first 1-2 seconds). Omit to use the style default.',\n },\n script: {\n type: 'string',\n description: 'The exact spoken line, voiced word for word. Omit and the presenter improvises.',\n },\n quality: {\n type: 'string',\n enum: ['mini', 'fast', 'high'],\n description: \"Render tier. Omitted or unsupported by the ad engine, the engine's default tier is used.\",\n },\n resolution: {\n type: 'string',\n enum: ['480p', '720p', '1080p', '4k'],\n description:\n '1080p/4k require quality \"high\"; without it, or when the engine lacks the value, the engine default resolution is used.',\n },\n aspect_ratio: {\n type: 'string',\n enum: ['16:9', '4:3', '1:1', '3:4', '9:16', '21:9'],\n description: \"Defaults to the style's own aspect ratio; a value the engine does not support falls back to it.\",\n },\n duration: {\n type: 'integer',\n minimum: 4,\n maximum: 15,\n description: \"Ad length in seconds. Defaults to the style's length; clamped to what the engine allows.\",\n },\n },\n // \"product_url OR product_name+images\" is enforced by the server and the\n // Zod refine; no root-level oneOf (Grok rejects non-object root unions).\n} as const;\n\ninterface AdRunResponseShape {\n jobId: string;\n status: string;\n statusUrl: string;\n creditCost?: number;\n ad?: { style: string; prompt: string; product?: { name: string } };\n}\n\ninterface ClientWithAd {\n runAd: (input: Record<string, unknown>) => Promise<AdRunResponseShape>;\n}\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n // Local files → 24h temp URLs, same affordance as pixeldojo_generate.\n const productImages = [\n ...(input.product_image_urls ?? []),\n ...(await Promise.all((input.product_image_paths ?? []).map((p) => uploadLocalFile(p, ctx)))),\n ];\n const characterImages = [\n ...(input.character_image_urls ?? []),\n ...(await Promise.all((input.character_image_paths ?? []).map((p) => uploadLocalFile(p, ctx)))),\n ];\n\n const body: Record<string, unknown> = {\n style: input.style,\n product_url: input.product_url,\n product:\n !input.product_url && input.product_name\n ? {\n name: input.product_name,\n description: input.product_description,\n images: productImages,\n }\n : undefined,\n character_images: characterImages.length > 0 ? characterImages : undefined,\n location:\n input.location_description || input.location_image_url\n ? { description: input.location_description, image_url: input.location_image_url }\n : undefined,\n hook: input.hook,\n script: input.script,\n quality: input.quality,\n resolution: input.resolution,\n aspect_ratio: input.aspect_ratio,\n duration: input.duration,\n };\n\n const client = ctx.client as unknown as ClientWithAd;\n const submitted = await client.runAd(body);\n\n const result = await pollJobUntilDoneOrHandoff(\n submitted.jobId,\n (id) => ctx.client.getJob(id),\n ctx.buildStatusUrl,\n {\n now: ctx.pollOverrides?.now,\n sleep: ctx.pollOverrides?.sleep,\n },\n );\n\n const styleLabel = submitted.ad?.style ?? input.style ?? 'ugc-testimonial';\n return pollResultToSkillResult(result, (urls) =>\n urls.length === 0\n ? `Ad job ${submitted.jobId} completed but returned no assets.`\n : `Ad rendered (style: ${styleLabel}${submitted.ad?.product?.name ? `, product: ${submitted.ad.product.name}` : ''}). Video: ${urls[0]}`,\n );\n}\n\nexport const adSkill: SkillModule<Input> = {\n name: 'pixeldojo_ad',\n description:\n 'Marketing Studio: turn a product into a rendered video ad with voiceover. Requires `product_url` (name, description and images are extracted), or `product_name` plus product_image_urls / product_image_paths. Pick a `style` slug (default ugc-testimonial; full catalog at GET https://pixeldojo.ai/api/v1/marketing/presets), and optionally add presenter reference images, a location, a hook, and the exact spoken script. Returns the video URL, or a jobId to check with pixeldojo_status.',\n hostedDescription:\n 'Marketing Studio: turn a product into a rendered video ad with voiceover. Requires `product_url` (name, description and images are extracted), or `product_name` plus product_image_urls (public http(s) URLs). Pick a `style` slug (default ugc-testimonial; full catalog at GET https://pixeldojo.ai/api/v1/marketing/presets), and optionally add presenter reference images, a location, a hook, and the exact spoken script. Returns the video URL, or a jobId to check with pixeldojo_status.',\n inputZod: InputSchema as z.ZodType<Input>,\n inputJsonSchema: InputJsonSchema as unknown as Record<string, unknown>,\n // Composition skill — the server routes to the ad engine internally.\n allowedModels: [],\n defaultModel: '',\n run,\n};\n","/**\n * pixeldojo_campaign — agentic skill that turns one URL (or a product\n * profile) into a coherent multi-asset launch package.\n *\n * Composes existing PixelDojo tools server-side:\n * 1. Resolve product (via /api/v1/extract-product if `productUrl`).\n * 2. Generate hero (Seedream 4 / GPT Image 2 / Flux 2 by mode).\n * 3. Generate N lifestyle variants in parallel.\n * 4. Generate one vertical video off the hero (Seedance 2 / Kling).\n *\n * Returns a CampaignResult: full asset list when everything resolves in\n * the 30s sync window, or a handoff with campaignId to poll via\n * `pixeldojo_campaign_status`.\n */\nimport { z } from 'zod';\nimport {\n type SkillContext,\n type SkillModule,\n type SkillResult,\n} from './types.js';\n\nconst InputSchema = z\n .object({\n productUrl: z\n .string()\n .url()\n .optional()\n .describe('Product page URL. We extract name + description + images automatically.'),\n product: z\n .object({\n name: z.string().min(1).max(200),\n description: z.string().max(2000).optional(),\n images: z.array(z.string().url()).max(5).optional(),\n })\n .optional()\n .describe('Manual product fields, used when productUrl is omitted.'),\n tone: z\n .string()\n .max(120)\n .optional()\n .describe('Optional creative direction (\"premium minimalist\", \"playful Y2K\"). Threaded through every prompt.'),\n variants: z\n .number()\n .int()\n .min(1)\n .max(8)\n .optional()\n .describe('Lifestyle shots in addition to the hero (default 4, max 8).'),\n includeVideo: z\n .boolean()\n .optional()\n .describe('Whether to also generate a vertical launch video (default true).'),\n videoAspectRatio: z\n .enum(['9:16', '16:9', '1:1'])\n .optional()\n .describe('Aspect ratio of the launch video (default 9:16 for Reels/TikTok).'),\n videoMode: z\n .enum(['lifestyle', 'cgi', 'ugc', 'skip'])\n .optional()\n .describe('Video styling — lifestyle (default), cgi, ugc, or skip to omit video.'),\n })\n .refine((v) => v.productUrl || v.product, {\n message: 'productUrl or product is required',\n path: ['productUrl'],\n });\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n productUrl: {\n type: 'string',\n format: 'uri',\n description:\n 'Product page URL; name, description and images are extracted automatically. Pass this or `product` (one is required); when both are set, productUrl wins.',\n },\n product: {\n type: 'object',\n description: 'Manual product profile, used when productUrl is omitted.',\n properties: {\n name: { type: 'string', description: 'Product name (required).' },\n description: { type: 'string', description: 'Optional product description.' },\n images: {\n type: 'array',\n items: { type: 'string', format: 'uri' },\n maxItems: 5,\n description: 'Up to 5 hosted product photo URLs.',\n },\n },\n required: ['name'],\n },\n tone: {\n type: 'string',\n description: 'Optional creative direction (\"premium minimalist\", \"playful Y2K\"), threaded through every prompt.',\n },\n variants: {\n type: 'integer',\n minimum: 1,\n maximum: 8,\n description: 'Lifestyle shots in addition to the hero (default 4).',\n },\n includeVideo: { type: 'boolean', description: 'Also render a launch video (default true).' },\n videoAspectRatio: {\n type: 'string',\n enum: ['9:16', '16:9', '1:1'],\n description: 'Launch video aspect ratio (default 9:16).',\n },\n videoMode: {\n type: 'string',\n enum: ['lifestyle', 'cgi', 'ugc', 'skip'],\n description: 'Launch video styling: lifestyle (default), cgi, ugc, or skip for no video.',\n },\n },\n // productUrl-or-product is enforced by the Zod refine and the server; no\n // root-level oneOf (some clients reject root unions — see ad.ts).\n} as const;\n\ninterface CampaignAsset {\n role: string;\n kind: 'image' | 'video';\n url: string;\n apiId: string;\n jobId: string;\n variantIndex?: number;\n}\n\ninterface CampaignResultShape {\n kind: 'campaign' | 'handoff';\n campaignId: string;\n assets?: CampaignAsset[];\n product?: { name: string; description?: string; sourceUrl?: string };\n totalCreditCost?: number;\n warnings?: string[];\n message?: string;\n statusUrl?: string;\n subJobs?: Array<{ jobId: string; role: string; status: string }>;\n}\n\ninterface ClientWithCampaign {\n runCampaign: (input: Input) => Promise<CampaignResultShape>;\n}\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n // The SDK exposes `runCampaign` on PixelDojoClient; we narrow via a\n // structural cast so this skill compiles even before the SDK type\n // updates land in the consuming app.\n const client = ctx.client as unknown as ClientWithCampaign;\n const result = await client.runCampaign(input);\n\n if (result.kind === 'campaign') {\n const assets = result.assets ?? [];\n const lines = [\n `Campaign ${result.campaignId} for \"${result.product?.name ?? 'product'}\":`,\n ...assets.map(\n (a) =>\n ` - ${a.role}${a.variantIndex !== undefined ? ` #${a.variantIndex}` : ''} (${a.kind}, ${a.apiId}): ${a.url}`,\n ),\n '',\n `Total credits: ${result.totalCreditCost ?? 0}.`,\n ...(result.warnings && result.warnings.length > 0\n ? [`Warnings: ${result.warnings.join('; ')}`]\n : []),\n ];\n return {\n kind: 'assets',\n text: lines.join('\\n'),\n assetUrls: assets.map((a) => a.url),\n };\n }\n\n // Handoff path — campaign exceeded 30 s sync budget.\n return {\n kind: 'handoff',\n text:\n result.message ??\n `Campaign ${result.campaignId} queued. Poll via pixeldojo_campaign_status.`,\n jobId: result.campaignId,\n statusUrl: result.statusUrl ?? ctx.buildStatusUrl(result.campaignId),\n };\n}\n\nexport const campaignSkill: SkillModule<Input> = {\n name: 'pixeldojo_campaign',\n description:\n 'Generate a coherent product launch package (hero image + N lifestyle variants + optional vertical video) from one URL or product profile. Composes hero / lifestyle / video models server-side; returns assets in one call or a handoff with campaignId to poll via pixeldojo_campaign_status.',\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n // Composition skill — internal sub-jobs route to per-tool models, no\n // single allowed-models list applies here.\n allowedModels: [],\n defaultModel: '',\n run,\n};\n","/**\n * pixeldojo_campaign_status — poll companion for a long-running campaign.\n *\n * Same conceptual role as pixeldojo_status (which is per-job), but at the\n * campaign envelope level: returns either the full asset list when every\n * sub-job is terminal, or a handoff with the still-running sub-jobs.\n */\nimport { z } from 'zod';\nimport {\n type SkillContext,\n type SkillModule,\n type SkillResult,\n} from './types.js';\n\nconst InputSchema = z.object({\n campaignId: z\n .string()\n .min(1)\n .max(200)\n .describe('Campaign id returned from a prior pixeldojo_campaign handoff.'),\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n campaignId: {\n type: 'string',\n description: 'Campaign id returned from a prior pixeldojo_campaign handoff.',\n },\n },\n required: ['campaignId'],\n} as const;\n\ninterface CampaignAsset {\n role: string;\n kind: 'image' | 'video';\n url: string;\n apiId: string;\n jobId: string;\n variantIndex?: number;\n}\n\ninterface CampaignResultShape {\n kind: 'campaign' | 'handoff';\n campaignId: string;\n assets?: CampaignAsset[];\n product?: { name: string; description?: string; sourceUrl?: string };\n totalCreditCost?: number;\n warnings?: string[];\n message?: string;\n statusUrl?: string;\n subJobs?: Array<{ jobId: string; role: string; status: string }>;\n /** Per-job one-liner, e.g. \"hero done; 4 lifestyle running 2m10s\" (servers from 2026-10-01). */\n progress?: string;\n}\n\ninterface ClientWithCampaign {\n getCampaign: (id: string) => Promise<CampaignResultShape>;\n}\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n const client = ctx.client as unknown as ClientWithCampaign;\n const result = await client.getCampaign(input.campaignId);\n\n if (result.kind === 'campaign') {\n const assets = result.assets ?? [];\n const lines = [\n `Campaign ${result.campaignId} complete (${assets.length} assets):`,\n ...assets.map(\n (a) =>\n ` - ${a.role}${a.variantIndex !== undefined ? ` #${a.variantIndex}` : ''} (${a.kind}, ${a.apiId}): ${a.url}`,\n ),\n '',\n `Total credits: ${result.totalCreditCost ?? 0}.`,\n ...(result.warnings && result.warnings.length > 0\n ? [`Warnings: ${result.warnings.join('; ')}`]\n : []),\n ];\n return {\n kind: 'assets',\n text: lines.join('\\n'),\n assetUrls: assets.map((a) => a.url),\n };\n }\n\n const stillRunning = (result.subJobs ?? []).filter(\n (s) => s.status !== 'completed' && s.status !== 'failed',\n );\n return {\n kind: 'handoff',\n text:\n `Campaign ${result.campaignId}: ` +\n (result.progress\n ? `${result.progress}. Wait a few seconds, then poll again.`\n : stillRunning.length > 0\n ? `${stillRunning.length} of ${result.subJobs?.length ?? 0} sub-jobs still ${stillRunning[0].status}. ` +\n `Wait a few seconds, then poll again.`\n : `aggregate state pending. Poll again shortly.`),\n jobId: result.campaignId,\n statusUrl: result.statusUrl ?? ctx.buildStatusUrl(result.campaignId),\n };\n}\n\nexport const campaignStatusSkill: SkillModule<Input> = {\n name: 'pixeldojo_campaign_status',\n description:\n 'Poll a campaign by campaignId returned from pixeldojo_campaign. Returns assets when every sub-job is done, or a handoff describing what is still in flight.',\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n allowedModels: [],\n defaultModel: '',\n run,\n};\n","/**\n * pixeldojo_upload — turn a local file path into a hosted URL.\n *\n * Bridges the \"user has a local image/video\" → \"API needs a URL\" gap that\n * blocks reference-image workflows in Claude Code, Cursor, etc. The MCP\n * runs in the user's environment so it has fs access; we read the bytes,\n * POST them to /api/v1/upload, and return the temp CDN URL. Storage\n * auto-expires after 24h (R2 lifecycle policy on `pixeldojotemp`).\n *\n * No credits consumed.\n */\nimport { z } from 'zod';\nimport { basename } from 'node:path';\nimport {\n type SkillContext,\n type SkillModule,\n type SkillResult,\n} from './types.js';\nimport { SkillUploadError, uploadLocalFile } from './upload-helpers.js';\n\nconst InputSchema = z.object({\n path: z\n .string()\n .min(1)\n .max(4096)\n .describe(\n 'Absolute local file path to upload. JPEG, PNG, WebP, GIF (≤50MB), MP4, WebM, MOV (≤200MB) or MP3, WAV, M4A, AAC, OGG, FLAC audio (≤50MB). Returns a public URL on the temp CDN; storage auto-expires after 24 hours.',\n ),\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n description:\n 'Absolute local file path. Allowed: JPEG, PNG, WebP, GIF (≤50MB), MP4, WebM, MOV (≤200MB) or MP3, WAV, M4A, AAC, OGG, FLAC audio (≤50MB). Returns a public URL on the temp CDN; auto-expires after 24h.',\n },\n },\n required: ['path'],\n} as const;\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n let url: string;\n try {\n url = await uploadLocalFile(input.path, ctx);\n } catch (err) {\n if (err instanceof SkillUploadError) {\n return { kind: 'text', text: `pixeldojo_upload: ${err.userMessage}` };\n }\n throw err;\n }\n return {\n kind: 'text',\n text:\n `Uploaded ${basename(input.path)} → ${url}\\n` +\n `(temp storage; auto-deletes in ~24h. Pass this URL as image_url, video_url for a clip, or song_url on pixeldojo_film for a song, to any pixeldojo tool that takes one.)`,\n };\n}\n\nexport const uploadSkill: SkillModule<Input> = {\n name: 'pixeldojo_upload',\n description:\n 'Upload a local image, video or audio file (JPEG, PNG, WebP, GIF up to 50MB; MP4, WebM, MOV up to 200MB; MP3, WAV, M4A, AAC, OGG, FLAC up to 50MB) and get back a public URL that expires after 24 hours. Free. Pass an audio URL as song_url to pixeldojo_film for a music video. Pass the URL as image_url (stills) or video_url (clips) to tools that take hosted URLs only, such as pixeldojo_character, pixeldojo_storyboard and pixeldojo_upscale. pixeldojo_generate, pixeldojo_edit and pixeldojo_ad take local paths directly and need no separate upload.',\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n allowedModels: [],\n defaultModel: '',\n run,\n};\n","/**\n * pixeldojo_audio — speech, dialogue, sound effects, and music from a prompt.\n *\n * Whitelisted models: seed-audio (default; ByteDance Seed Audio 1.0 —\n * multi-character dialogue + SFX + music in one pass, up to 2 minutes) and\n * text-to-speech (plain narration). Reference clips are hosted URLs\n * addressed in the prompt as @Audio1..@Audio3. There is no local-file input:\n * /api/v1/upload accepts images and video only, so an `audio_paths` field\n * could never work and was removed (0.13.0).\n */\nimport { z } from 'zod';\nimport { pollJobUntilDoneOrHandoff } from '../poll.js';\nimport {\n type SkillContext,\n type SkillModule,\n type SkillResult,\n pollResultToSkillResult,\n} from './types.js';\n\nconst ALLOWED = ['seed-audio', 'text-to-speech'] as const;\ntype AllowedModel = (typeof ALLOWED)[number];\nconst DEFAULT_MODEL: AllowedModel = 'seed-audio';\n\nconst InputSchema = z.object({\n prompt: z\n .string()\n .min(1)\n .describe(\n 'seed-audio: a script to speak, or a scene description (dialogue, sound effects, music), up to 2048 characters; refer to audio_urls clips in order as @Audio1..@Audio3. text-to-speech: the exact text to speak, up to 10,000 characters.',\n ),\n model: z\n .string()\n .optional()\n .describe(`${DEFAULT_MODEL} (default): speech, multi-voice dialogue, effects and music in one clip, and voice cloning from audio_urls. text-to-speech: plain narration with preset voices.`),\n voice: z\n .string()\n .optional()\n .describe('text-to-speech only: voice preset (e.g. Wise_Woman, Calm_Woman, Friendly_Person; default Wise_Woman). seed-audio ignores it: describe the voice in the prompt, or clone one with audio_urls.'),\n audio_urls: z\n .array(z.string().url())\n .max(3)\n .optional()\n .describe('seed-audio only: up to 3 hosted reference clips (wav, mp3, pcm or ogg_opus, 30s / 10MB max each) for voice cloning, referenced in the prompt as @Audio1..@Audio3. Local audio files cannot be uploaded; pass URLs. Ignored by text-to-speech.'),\n output_format: z\n .string()\n .optional()\n .describe('Output format. seed-audio: mp3 (default), wav, pcm, ogg_opus. text-to-speech: mp3 (default), wav, flac, pcm.'),\n speed: z.number().min(0.5).max(2).optional().describe('Speech speed multiplier, 0.5-2 (default 1). Both models.'),\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n prompt: {\n type: 'string',\n description:\n 'seed-audio: a script to speak, or a scene description (dialogue, sound effects, music), up to 2048 characters; refer to audio_urls clips in order as @Audio1..@Audio3. text-to-speech: the exact text to speak, up to 10,000 characters.',\n },\n model: {\n type: 'string',\n enum: ALLOWED,\n description:\n `${DEFAULT_MODEL} (default): speech, multi-voice dialogue, effects and music in one clip, and voice cloning from audio_urls. text-to-speech: plain narration with preset voices.`,\n },\n voice: {\n type: 'string',\n description:\n 'text-to-speech only: voice preset (e.g. Wise_Woman, Calm_Woman, Friendly_Person; default Wise_Woman). seed-audio ignores it: describe the voice in the prompt, or clone one with audio_urls.',\n },\n audio_urls: {\n type: 'array',\n items: { type: 'string', format: 'uri' },\n maxItems: 3,\n description:\n 'seed-audio only: up to 3 hosted reference clips (wav, mp3, pcm or ogg_opus, 30s / 10MB max each) for voice cloning, referenced in the prompt as @Audio1..@Audio3. Local audio files cannot be uploaded; pass URLs. Ignored by text-to-speech.',\n },\n output_format: {\n type: 'string',\n description: 'Output format. seed-audio: mp3 (default), wav, pcm, ogg_opus. text-to-speech: mp3 (default), wav, flac, pcm.',\n },\n speed: {\n type: 'number',\n minimum: 0.5,\n maximum: 2,\n description: 'Speech speed multiplier, 0.5-2 (default 1). Both models.',\n },\n },\n required: ['prompt'],\n} as const;\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n const requested = (input.model ?? DEFAULT_MODEL) as string;\n if (!(ALLOWED as readonly string[]).includes(requested)) {\n return {\n kind: 'text',\n text: `Unknown model \"${requested}\" for pixeldojo_audio. Allowed: ${ALLOWED.join(', ')}.`,\n };\n }\n const apiId = requested as AllowedModel;\n\n const audioUrls = input.audio_urls ?? [];\n\n const body: { prompt: string; [key: string]: unknown } = { prompt: input.prompt };\n if (apiId === 'seed-audio') {\n if (input.voice) body.voice = input.voice;\n if (audioUrls.length) body.audio_urls = audioUrls;\n if (input.output_format) body.output_format = input.output_format;\n if (input.speed !== undefined) body.speed = input.speed;\n } else {\n // text-to-speech takes `text` + `voice_id` instead of prompt/voice.\n body.text = input.prompt;\n delete (body as Record<string, unknown>).prompt;\n if (input.voice) body.voice_id = input.voice;\n if (input.output_format) body.audio_format = input.output_format;\n if (input.speed !== undefined) body.speed = input.speed;\n }\n\n const submitted = await ctx.client.run(apiId, body as { prompt: string });\n\n const result = await pollJobUntilDoneOrHandoff(\n submitted.jobId,\n (id) => ctx.client.getJob(id),\n ctx.buildStatusUrl,\n {\n now: ctx.pollOverrides?.now,\n sleep: ctx.pollOverrides?.sleep,\n },\n );\n\n return pollResultToSkillResult(result, (urls) =>\n urls.length === 0\n ? `Job ${submitted.jobId} completed but returned no assets.`\n : `Audio ready. Asset: ${urls[0]}`,\n );\n}\n\nexport const audioSkill: SkillModule<Input> = {\n name: 'pixeldojo_audio',\n description:\n 'Generate audio: speech, multi-character dialogue, sound effects, and background music from one prompt (Seed Audio 1.0 by default; plain text-to-speech available). Voice cloning takes hosted reference clip URLs in audio_urls; local audio files are not accepted. Returns an audio URL, or a jobId for pixeldojo_status.',\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n allowedModels: [...ALLOWED],\n defaultModel: DEFAULT_MODEL,\n run,\n};\n","/**\n * pixeldojo_library — search your own generation history.\n *\n * Every asset the agent generated via API/MCP, plus results the user kept\n * (saved or downloaded) in the web app. Returns URLs that can be passed\n * straight back into pixeldojo_generate, _edit, _character, or _upscale as\n * reference inputs — \"find yesterday's hero shot and make three variants.\"\n */\nimport { z } from 'zod';\nimport {\n type SkillContext,\n type SkillModule,\n type SkillResult,\n} from './types.js';\n\nconst InputSchema = z.object({\n source: z\n .enum(['media', 'characters'])\n .optional()\n .describe('media (default): saved and recent results. characters: saved Character Studio characters and elements, usable as @Name in prompts.'),\n q: z\n .string()\n .optional()\n .describe('Substring match against the prompt that produced the asset.'),\n model: z.string().optional().describe('Restrict to a single model (apiId).'),\n modality: z\n .enum(['image', 'video', 'audio'])\n .optional()\n .describe('Restrict to one output type.'),\n limit: z.number().int().min(1).max(50).optional().describe('Max results (default 10).'),\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n source: {\n type: 'string',\n enum: ['media', 'characters'],\n description:\n 'media (default): saved media and recent generations. characters: the saved Character Studio characters, products, outfits, locations, props and styles. Write @Name in any prompt to use one.',\n },\n q: {\n type: 'string',\n description: 'Substring match against the prompt that produced the asset. Omit to list the newest items.',\n },\n model: { type: 'string', description: 'Only assets from this model apiId.' },\n modality: {\n type: 'string',\n enum: ['image', 'video', 'audio'],\n description: 'Only this output type.',\n },\n limit: { type: 'integer', minimum: 1, maximum: 50, description: 'Max results (default 10).' },\n },\n required: [],\n} as const;\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n if (input.source === 'characters') {\n const { characters } = await ctx.client.listCharacters({ q: input.q, limit: input.limit ?? 25 });\n if (characters.length === 0) {\n return {\n kind: 'text',\n text: input.q\n ? `No saved character or element matches \"${input.q}\".`\n : 'No saved characters or elements yet. Save one from photos with pixeldojo_save_character.',\n };\n }\n const lines = characters.map(\n (c) =>\n `- ${c.mention} (${c.kind})${c.description ? `: ${c.description.slice(0, 100)}` : ''}\\n images: ${c.image_urls.slice(0, 4).join(' ')}`,\n );\n return {\n kind: 'text',\n text: `${characters.length} saved character(s)/element(s):\\n${lines.join('\\n')}\\n\\nWrite the @Name in a pixeldojo_generate / pixeldojo_video / pixeldojo_edit prompt and their photos are attached automatically (models that take reference images).`,\n };\n }\n const res = await ctx.client.listLibrary({\n q: input.q,\n model: input.model,\n modality: input.modality,\n limit: input.limit ?? 10,\n });\n\n if (res.items.length === 0) {\n return {\n kind: 'text',\n text: input.q\n ? `No library items match \"${input.q}\". Try a broader query, or omit q to list recent generations.`\n : 'Your library is empty. Generate something with pixeldojo_generate first.',\n };\n }\n\n const lines = res.items.map((it) => {\n const parts = [\n `- ${it.url}`,\n it.modality ? `[${it.modality}]` : null,\n it.model ? `model=${it.model}` : null,\n `(${it.source}, ${it.createdAt.slice(0, 10)})`,\n it.prompt ? `\"${it.prompt.slice(0, 90)}${it.prompt.length > 90 ? '…' : ''}\"` : null,\n ].filter(Boolean);\n return parts.join(' ');\n });\n\n return {\n kind: 'text',\n text: `${res.items.length} library item(s):\\n${lines.join('\\n')}\\n\\nPass any URL back into pixeldojo_generate, pixeldojo_edit, pixeldojo_character, or pixeldojo_upscale as a reference input.`,\n };\n}\n\nexport const librarySkill: SkillModule<Input> = {\n name: 'pixeldojo_library',\n description:\n 'Search your Library, newest first. source=media (default): saved media (permanent) and recent API/MCP generations (deleted 1 hour after they finish), as URLs to reuse as references. source=characters: saved Character Studio characters and elements, each usable as @Name in any prompt.',\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n allowedModels: [],\n defaultModel: '',\n run,\n};\n","/**\n * pixeldojo_save — keep a result forever.\n *\n * Saves a generated asset URL into the user's My Media library: it passes\n * the same content-safety check as every save on the site, then the file is\n * re-hosted on PixelDojo's permanent CDN (API/MCP outputs otherwise expire\n * one hour after they finish) and becomes searchable via pixeldojo_library.\n * Removed 2026-09-02, restored 2026-10-02 (founder decision).\n */\nimport { z } from 'zod';\nimport { type SkillContext, type SkillModule, type SkillResult } from './types.js';\n\nconst InputSchema = z.object({\n url: z.string().url().describe('The asset URL to save (image or video).'),\n prompt: z\n .string()\n .optional()\n .describe('The prompt that produced it — makes it findable in the library later.'),\n tool_name: z.string().optional().describe('Tool/model slug that produced it.'),\n modality: z.enum(['image', 'video', 'audio']).optional(),\n job_id: z\n .string()\n .optional()\n .describe('The jobId that produced this asset, when known.'),\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n url: { type: 'string', format: 'uri', description: 'The result URL to keep (image or video from a PixelDojo job).' },\n prompt: { type: 'string', description: 'The prompt that produced it, so it is findable in the library later.' },\n tool_name: { type: 'string', description: 'Model apiId that produced it, when known.' },\n modality: { type: 'string', enum: ['image', 'video', 'audio'], description: 'Output type, when the URL does not make it obvious.' },\n job_id: { type: 'string', description: 'The jobId that produced it, when known.' },\n },\n required: ['url'],\n} as const;\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n const res = await ctx.client.saveMedia({\n url: input.url,\n prompt: input.prompt,\n tool_name: input.tool_name,\n modality: input.modality,\n job_id: input.job_id,\n });\n return {\n kind: 'text',\n text: `Saved to My Media (permanent): ${res.url}\\nIt will appear at https://pixeldojo.ai/my-images and in pixeldojo_library searches.`,\n };\n}\n\nexport const saveSkill: SkillModule<Input> = {\n name: 'pixeldojo_save',\n description:\n \"Save a generated image or video into the user's My Media library permanently (\\\"save this\\\", \\\"keep it\\\"). Results otherwise expire 1 hour after they finish. Pass the result URL; it is safety-checked before it is kept.\",\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n allowedModels: [],\n defaultModel: '',\n run,\n};\n","/**\n * pixeldojo_save_character — add a character, product, outfit, location, prop\n * or style to the user's Character Studio from image URLs. Every image passes\n * the site's upload safety check before anything is stored. The saved name\n * then works as @Name in any prompt on any tool.\n */\nimport { z } from 'zod';\nimport { type SkillContext, type SkillModule, type SkillResult } from './types.js';\n\nconst KINDS = ['character', 'product', 'outfit', 'location', 'object', 'style'] as const;\n\nconst InputSchema = z.object({\n name: z.string().min(1).max(60).describe('What to call it. Used as @Name in prompts.'),\n kind: z.enum(KINDS).optional().describe('Default character.'),\n image_urls: z.array(z.string().url()).max(8).optional().describe('3 to 5 photos from different angles works best for a character.'),\n description: z.string().max(1500).optional().describe('Appearance notes, or the scene text for an element.'),\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n name: { type: 'string', description: 'What to call it. Used as @Name in prompts afterwards.' },\n kind: { type: 'string', enum: KINDS, description: 'character (default), product, outfit, location, object (a prop) or style.' },\n image_urls: {\n type: 'array',\n items: { type: 'string', format: 'uri' },\n maxItems: 8,\n description: 'Photos of it. For a person, 3 to 5 clear photos from different angles. Required for a character.',\n },\n description: { type: 'string', description: 'Optional appearance notes, or the scene text for an element without photos.' },\n },\n required: ['name'],\n} as const;\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n const res = await ctx.client.saveCharacter({\n name: input.name,\n kind: input.kind ?? 'character',\n image_urls: input.image_urls,\n description: input.description,\n });\n return {\n kind: 'text',\n text: `Saved ${res.kind} \"${res.name}\" to Character Studio (${res.image_urls.length} image${res.image_urls.length === 1 ? '' : 's'}). Use it in any prompt as ${res.mention}, for example \"${res.mention} walking on a beach at sunset\". It also appears at https://pixeldojo.ai/characters.`,\n };\n}\n\nexport const saveCharacterSkill: SkillModule<Input> = {\n name: 'pixeldojo_save_character',\n description:\n \"Save a character (a person, from 3-5 photos) or an element (product, outfit, location, prop, style) to the user's Character Studio library. Afterwards write @Name in any prompt to use it. List saved ones with pixeldojo_library source=characters.\",\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n allowedModels: [],\n defaultModel: '',\n run,\n};\n","/**\n * pixeldojo_save_workflow / :run_workflow / :list_workflows — named, saved\n * skill chains (\"describe a workflow once, run it by name from any chat\").\n *\n * Definitions live server-side (/api/v1/workflows, per user). Execution\n * happens HERE: run_workflow fetches the definition and dispatches each\n * step to the local skill registry, so every step benefits from the same\n * polling, upload-bridge, and error handling as a direct skill call.\n *\n * Chaining placeholders inside step args (string values only):\n * {{input.<key>}} → value from run_workflow's `inputs` object\n * {{prev}} → first asset URL produced by the previous step\n */\nimport { z } from 'zod';\nimport { pollJobUntilDoneOrHandoff } from '../poll.js';\nimport {\n type SkillContext,\n type SkillModule,\n type SkillResult,\n pollResultToSkillResult,\n} from './types.js';\n\n// Each step's own skill.run() already burns up to 30s (D9's sync window)\n// before returning a handoff. A multi-step workflow's whole point is\n// chaining outputs, so a step that's merely slow — not stuck — shouldn't\n// silently break the chain. Poll for another 60s past that before giving\n// up and reporting the step as still-processing.\nconst WORKFLOW_STEP_EXTRA_BUDGET_MS = 60_000;\n\nconst StepSchema = z.object({\n skill: z\n .string()\n // `pixeldojo:` accepted alongside `pixeldojo_` — workflows saved before the\n // 2026-07-29 rename still carry colon step names.\n .regex(/^pixeldojo[:_](generate|edit|character|storyboard|upscale|audio|upload|from_url)$/, {\n message:\n 'Runnable skills only: generate, edit, character, storyboard, upscale, audio, upload, from_url.',\n }),\n args: z.record(z.string(), z.unknown()).optional(),\n});\n\nconst SaveInputSchema = z.object({\n name: z\n .string()\n .regex(/^[a-z0-9][a-z0-9-]{1,40}$/, {\n message: 'Kebab-case, 2-41 chars, e.g. \"product-launch-pack\".',\n })\n .describe('Workflow handle. Saving to an existing name overwrites it.'),\n description: z.string().max(500).optional(),\n steps: z.array(StepSchema).min(1).max(8),\n});\ntype SaveInput = z.infer<typeof SaveInputSchema>;\n\nconst RunInputSchema = z.object({\n name: z.string().describe('Saved workflow name.'),\n inputs: z\n .record(z.string(), z.string())\n .optional()\n .describe('Values for {{input.<key>}} placeholders in the workflow steps.'),\n});\ntype RunInput = z.infer<typeof RunInputSchema>;\n\nconst ListInputSchema = z.object({});\ntype ListInput = z.infer<typeof ListInputSchema>;\n\n/** Fill {{input.<key>}} and {{prev}} placeholders in string arg values. */\nexport function substitutePlaceholders(\n args: Record<string, unknown>,\n inputs: Record<string, string>,\n prevUrl: string | undefined,\n): { resolved: Record<string, unknown>; missing: string[] } {\n const missing: string[] = [];\n const fill = (value: unknown): unknown => {\n if (typeof value === 'string') {\n return value.replace(/\\{\\{(prev|input\\.[a-zA-Z0-9_-]+)\\}\\}/g, (_, token: string) => {\n if (token === 'prev') {\n if (!prevUrl) missing.push('{{prev}}');\n return prevUrl ?? '';\n }\n const key = token.slice('input.'.length);\n if (!(key in inputs)) missing.push(`{{${token}}}`);\n return inputs[key] ?? '';\n });\n }\n if (Array.isArray(value)) return value.map(fill);\n if (value && typeof value === 'object') {\n return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, fill(v)]));\n }\n return value;\n };\n return { resolved: fill(args) as Record<string, unknown>, missing };\n}\n\n/** Pull the first URL out of a skill result (assets or a URL in text). */\nfunction firstUrl(result: SkillResult): string | undefined {\n if (result.kind === 'assets' && result.assetUrls.length > 0) return result.assetUrls[0];\n if (result.kind === 'text') {\n const m = result.text.match(/https?:\\/\\/\\S+/);\n return m?.[0].replace(/[).,]+$/, '');\n }\n return undefined;\n}\n\nasync function runSave(input: SaveInput, ctx: SkillContext): Promise<SkillResult> {\n const res = await ctx.client.saveWorkflow({\n name: input.name,\n description: input.description,\n steps: input.steps.map((s) => ({ skill: s.skill, args: s.args ?? {} })),\n });\n return {\n kind: 'text',\n text: res.created\n ? `Saved workflow \"${res.name}\" (${res.steps} step${res.steps === 1 ? '' : 's'}). Run it with pixeldojo_run_workflow { name: \"${res.name}\" }.`\n : `Overwrote workflow \"${res.name}\" (${res.steps} step${res.steps === 1 ? '' : 's'}).`,\n };\n}\n\nasync function runList(_input: ListInput, ctx: SkillContext): Promise<SkillResult> {\n const res = await ctx.client.listWorkflows();\n if (res.count === 0) {\n return {\n kind: 'text',\n text: 'No saved workflows yet. Save one with pixeldojo_save_workflow { name, steps: [{ skill, args }] }.',\n };\n }\n const lines = res.workflows.map(\n (w) =>\n `- ${w.name} (${w.steps.length} steps, ${w.runs} runs)${w.description ? `: ${w.description}` : ''}`,\n );\n return { kind: 'text', text: `${res.count} saved workflow(s):\\n${lines.join('\\n')}` };\n}\n\nasync function runWorkflow(input: RunInput, ctx: SkillContext): Promise<SkillResult> {\n const workflow = await ctx.client.getWorkflow(input.name.toLowerCase(), { countRun: true });\n\n // Late import to avoid a static cycle (index.ts imports this module).\n const { findSkill } = await import('./index.js');\n\n const inputs = input.inputs ?? {};\n const outputs: string[] = [];\n let prevUrl: string | undefined;\n\n for (let i = 0; i < workflow.steps.length; i++) {\n const step = workflow.steps[i];\n const skill = findSkill(step.skill);\n if (!skill) {\n return {\n kind: 'text',\n text: `Step ${i + 1} names unknown skill \"${step.skill}\". Re-save the workflow.`,\n };\n }\n const { resolved, missing } = substitutePlaceholders(step.args, inputs, prevUrl);\n if (missing.length > 0) {\n return {\n kind: 'text',\n text: `Step ${i + 1} (${step.skill}) is missing ${Array.from(new Set(missing)).join(', ')}. ${\n missing.some((m) => m.includes('input.'))\n ? 'Pass the value via run_workflow inputs.'\n : 'A previous step produced no asset URL.'\n }`,\n };\n }\n\n const parsed = skill.inputZod.safeParse(resolved);\n if (!parsed.success) {\n const issue = parsed.error.issues[0];\n return {\n kind: 'text',\n text: `Step ${i + 1} (${step.skill}) has invalid args: ${issue?.path.join('.') || 'input'} ${issue?.message || 'invalid'}.`,\n };\n }\n\n let result = await skill.run(parsed.data, ctx);\n if (result.kind === 'handoff') {\n // The step's own 30s sync window wasn't enough — keep polling the\n // SAME job rather than treating \"still running\" as \"produced\n // nothing\" (that used to silently break any chain with a slow\n // intermediate step: firstUrl() had no case for 'handoff' at all).\n const handoffJobId = result.jobId;\n const polled = await pollJobUntilDoneOrHandoff(\n handoffJobId,\n (id) => ctx.client.getJob(id),\n ctx.buildStatusUrl,\n {\n syncBudgetMs: WORKFLOW_STEP_EXTRA_BUDGET_MS,\n now: ctx.pollOverrides?.now,\n sleep: ctx.pollOverrides?.sleep,\n },\n );\n result = pollResultToSkillResult(polled, (urls) =>\n urls.length === 0\n ? `Job ${handoffJobId} completed but returned no assets.`\n : `Done. Asset: ${urls[0]}`,\n );\n }\n const url = firstUrl(result);\n if (url) {\n prevUrl = url;\n outputs.push(`step ${i + 1} (${step.skill}): ${url}`);\n } else if (result.kind === 'text' && /fail|error|invalid|unknown/i.test(result.text)) {\n return {\n kind: 'text',\n text: `Workflow \"${workflow.name}\" stopped at step ${i + 1} (${step.skill}): ${result.text}`,\n };\n } else if (result.kind === 'handoff') {\n // Still running after the extended wait — stop the chain here (no\n // URL to feed the next step) but hand the caller everything needed\n // to follow up instead of a dead-end \"no asset URL\".\n return {\n kind: 'text',\n text:\n `Workflow \"${workflow.name}\" is still on step ${i + 1} (${step.skill}) after an extended wait. ` +\n `Poll with pixeldojo_status { jobId: \"${result.jobId}\" }, then re-run the workflow once it completes.`,\n };\n } else {\n outputs.push(`step ${i + 1} (${step.skill}): done (no asset URL)`);\n }\n }\n\n return {\n kind: 'text',\n text: `Workflow \"${workflow.name}\" completed ${workflow.steps.length} step(s):\\n${outputs.join('\\n')}`,\n };\n}\n\n/** Tools a workflow step may run; mirrors the StepSchema regex above. */\nconst STEP_SKILLS = [\n 'pixeldojo_generate',\n 'pixeldojo_edit',\n 'pixeldojo_character',\n 'pixeldojo_storyboard',\n 'pixeldojo_upscale',\n 'pixeldojo_audio',\n 'pixeldojo_upload',\n 'pixeldojo_from_url',\n];\n\nconst stepJson = {\n type: 'object',\n properties: {\n skill: {\n type: 'string',\n enum: STEP_SKILLS,\n description:\n \"Tool this step runs. Steps run in order when the workflow runs, and each is charged at that tool's own rate.\",\n },\n args: {\n type: 'object',\n description:\n \"That tool's own arguments, exactly as you would pass them calling it directly. Any string value, at any depth, may contain {{input.<key>}} (filled from pixeldojo_run_workflow inputs) or {{prev}} (the first asset URL the previous step produced).\",\n },\n },\n required: ['skill'],\n} as const;\n\nexport const saveWorkflowSkill: SkillModule<SaveInput> = {\n name: 'pixeldojo_save_workflow',\n description:\n 'Save a named multi-step skill chain (generate → edit → upscale …). String args may contain {{input.<key>}} and {{prev}} placeholders. Saving to an existing name overwrites it.',\n inputZod: SaveInputSchema,\n inputJsonSchema: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n pattern: '^[a-z0-9][a-z0-9-]{1,40}$',\n description: 'Kebab-case handle, 2-41 chars (e.g. \"product-launch-pack\"). Saving to an existing name overwrites it.',\n },\n description: { type: 'string', description: 'Optional note on what the workflow does (max 500 chars).' },\n steps: {\n type: 'array',\n items: stepJson,\n minItems: 1,\n maxItems: 8,\n description: 'The chain, 1-8 steps, run in order. Saving charges nothing; running charges each step.',\n },\n },\n required: ['name', 'steps'],\n },\n allowedModels: [],\n defaultModel: '',\n run: runSave,\n};\n\nexport const runWorkflowSkill: SkillModule<RunInput> = {\n name: 'pixeldojo_run_workflow',\n description:\n 'Run a saved workflow by name. Pass inputs for its {{input.<key>}} placeholders; each step feeds the next via {{prev}}.',\n inputZod: RunInputSchema,\n inputJsonSchema: {\n type: 'object',\n properties: {\n name: { type: 'string', description: 'Saved workflow name (see pixeldojo_list_workflows).' },\n inputs: {\n type: 'object',\n additionalProperties: { type: 'string' },\n description:\n 'String values for the workflow\\'s {{input.<key>}} placeholders, e.g. {\"product\": \"red sneaker\"}. A step whose placeholder has no value stops the run before that step.',\n },\n },\n required: ['name'],\n },\n allowedModels: [],\n defaultModel: '',\n run: runWorkflow,\n};\n\nexport const listWorkflowsSkill: SkillModule<ListInput> = {\n name: 'pixeldojo_list_workflows',\n description: 'List your saved workflows with step counts and run totals.',\n inputZod: ListInputSchema,\n inputJsonSchema: { type: 'object', properties: {}, required: [] },\n allowedModels: [],\n defaultModel: '',\n run: runList,\n};\n","/**\n * Registry of all named MCP skills shipped by `@pixeldojo/mcp`.\n *\n * Adding a new skill: drop a file in this directory exporting a\n * `SkillModule`, then append it to `ALL_SKILLS` here. The server reads\n * from this list to populate `tools/list` and route `tools/call`.\n */\nimport { generateSkill } from './generate.js';\nimport { editSkill } from './edit.js';\nimport { characterSkill } from './character.js';\nimport { storyboardSkill } from './storyboard.js';\nimport { upscaleSkill } from './upscale.js';\nimport { captionSkill } from './caption.js';\nimport { overlaySkill } from './overlay.js';\nimport { statusSkill } from './status.js';\nimport { fromUrlSkill } from './from-url.js';\nimport { filmSkill } from './film.js';\nimport { videoSkill } from './video.js';\nimport { episodeSkill } from './episode.js';\nimport { adSkill } from './ad.js';\nimport { campaignSkill } from './campaign.js';\nimport { campaignStatusSkill } from './campaign-status.js';\nimport { uploadSkill } from './upload.js';\nimport { audioSkill } from './audio.js';\nimport { librarySkill } from './library.js';\nimport { saveSkill } from './save.js';\nimport { saveCharacterSkill } from './save-character.js';\nimport {\n saveWorkflowSkill,\n runWorkflowSkill,\n listWorkflowsSkill,\n} from './workflows.js';\nimport type { SkillModule } from './types.js';\n\nexport const ALL_SKILLS: ReadonlyArray<SkillModule<unknown>> = [\n generateSkill,\n editSkill,\n characterSkill,\n storyboardSkill,\n upscaleSkill,\n captionSkill,\n overlaySkill,\n audioSkill,\n librarySkill,\n saveSkill,\n saveCharacterSkill,\n saveWorkflowSkill,\n runWorkflowSkill,\n listWorkflowsSkill,\n statusSkill,\n fromUrlSkill,\n uploadSkill,\n adSkill,\n campaignSkill,\n campaignStatusSkill,\n filmSkill,\n videoSkill,\n episodeSkill,\n] as ReadonlyArray<SkillModule<unknown>>;\n\nexport {\n filmSkill,\n videoSkill,\n episodeSkill,\n generateSkill,\n editSkill,\n characterSkill,\n storyboardSkill,\n upscaleSkill,\n captionSkill,\n overlaySkill,\n audioSkill,\n librarySkill,\n saveSkill,\n saveCharacterSkill,\n saveWorkflowSkill,\n runWorkflowSkill,\n listWorkflowsSkill,\n statusSkill,\n fromUrlSkill,\n uploadSkill,\n adSkill,\n campaignSkill,\n campaignStatusSkill,\n};\nexport type { SkillModule, SkillContext, SkillResult } from './types.js';\n\n/**\n * The skill set the hosted https://pixeldojo.ai/mcp route serves. The server\n * there runs in our production container, so \"a local file\" would be ITS\n * disk: pixeldojo_upload is dropped and every `*_path` / `*_paths` field is\n * stripped from the advertised schemas. uploadLocalFile also refuses unless\n * ctx.localFiles is true, which covers args that arrive anyway (a client\n * with a cached schema, a saved run_workflow step).\n */\nconst isLocalPathField = (key: string) => /_paths?$/.test(key);\n\nexport const HOSTED_SKILLS: ReadonlyArray<SkillModule<unknown>> = ALL_SKILLS.filter(\n (s) => s.name !== uploadSkill.name,\n).map((s) => {\n const props = (s.inputJsonSchema.properties ?? {}) as Record<string, unknown>;\n return {\n ...s,\n description: s.hostedDescription ?? s.description,\n inputJsonSchema: {\n ...s.inputJsonSchema,\n properties: Object.fromEntries(Object.entries(props).filter(([k]) => !isLocalPathField(k))),\n },\n };\n});\n\n/**\n * MCP tool annotations for every skill. ChatGPT's plugin review rejects tools\n * without readOnlyHint / destructiveHint / openWorldHint, and clients use them\n * to decide when to ask before a call. Rationale per hint:\n * - readOnlyHint: false for anything that renders, spends credits or saves.\n * - destructiveHint: renders are additive (new media, nothing of the user's\n * is changed or deleted; failed jobs refund), so false. save_workflow\n * overwrites a same-named workflow, so true.\n * - openWorldHint: everything stays inside the user's own account, except\n * from_url, which fetches an arbitrary public page.\n */\ntype Hints = { title: string; readOnlyHint: boolean; destructiveHint: boolean; openWorldHint: boolean };\nconst render = (title: string): Hints => ({ title, readOnlyHint: false, destructiveHint: false, openWorldHint: false });\nconst read = (title: string): Hints => ({ title, readOnlyHint: true, destructiveHint: false, openWorldHint: false });\n\nexport const TOOL_ANNOTATIONS: Record<string, Hints> = {\n pixeldojo_generate: render('Generate image or video'),\n pixeldojo_edit: render('Edit image'),\n pixeldojo_character: render('Consistent character image'),\n pixeldojo_storyboard: render('Storyboard preview video'),\n pixeldojo_upscale: render('Upscale image or video'),\n pixeldojo_caption: render('Caption video'),\n pixeldojo_overlay: render('Add offer or end card'),\n pixeldojo_audio: render('Generate music, speech or sound'),\n pixeldojo_video: render('Change, animate or extend video'),\n pixeldojo_ad: render('Make video ad'),\n pixeldojo_campaign: render('Make product launch campaign'),\n pixeldojo_film: render('Make short film'),\n pixeldojo_episode: render('Make faceless video'),\n pixeldojo_run_workflow: render('Run saved workflow'),\n pixeldojo_upload: render('Upload local file'),\n pixeldojo_save_workflow: { ...render('Save workflow'), destructiveHint: true },\n pixeldojo_status: read('Check job status'),\n pixeldojo_campaign_status: read('Check campaign status'),\n pixeldojo_library: read('Search media library'),\n pixeldojo_save: render('Save to My Media'),\n pixeldojo_save_character: render('Save character or element'),\n pixeldojo_list_workflows: read('List saved workflows'),\n pixeldojo_from_url: { ...read('Read product page'), openWorldHint: true },\n};\n\n/** The tools/list entry for a skill, shared by the stdio server and the hosted /mcp route. */\nexport function toolListing(skill: SkillModule<unknown>) {\n const { title, ...hints } = TOOL_ANNOTATIONS[skill.name];\n return {\n name: skill.name,\n title,\n description: skill.description,\n inputSchema: skill.inputJsonSchema,\n annotations: { title, ...hints },\n };\n}\n\nexport function findHostedSkill(name: string): SkillModule<unknown> | undefined {\n const wanted = name.replace(/^pixeldojo:/, 'pixeldojo_');\n return HOSTED_SKILLS.find((s) => s.name === wanted);\n}\n\n/**\n * Skill names were `pixeldojo:<x>` until 2026-07-29. A colon is illegal in a\n * tool name per Anthropic's `^[a-zA-Z0-9_-]{1,64}$`, so claude.ai's remote-MCP\n * connector rejected the whole tools array and every tool call in the\n * conversation failed (Claude Code silently sanitized, which hid it). Names are\n * underscored now; the old form still resolves for callers that memorized it\n * and for workflow steps saved under the colon names.\n */\nexport function findSkill(name: string): SkillModule<unknown> | undefined {\n const wanted = name.replace(/^pixeldojo:/, 'pixeldojo_');\n return ALL_SKILLS.find((s) => s.name === wanted);\n}\n","/**\n * Header-injecting wrapper around `@pixeldojo/sdk`'s PixelDojoClient.\n *\n * Per Eng review E2 + E3:\n * - Depends on @pixeldojo/sdk for run/getJob/listModels/getModelSchema\n * (DRY — no /api/v1 client duplication).\n * - Injects `x-pixeldojo-source: mcp/<version>` and `x-pixeldojo-skill:\n * <skill-name>` headers on every API call so Tool Health can attribute\n * MCP traffic separately from raw REST.\n *\n * The SDK exposes a `fetch` injection point in its constructor — we wrap\n * the global `fetch` to add headers without monkey-patching anything.\n */\nimport { PixelDojoClient } from '@pixeldojo/sdk';\nimport type { PixelDojoClientOptions } from '@pixeldojo/sdk';\n\nexport interface MakeClientOptions extends PixelDojoClientOptions {\n /** MCP package version for the `x-pixeldojo-source` header value. */\n mcpVersion: string;\n /** Optional skill name; if set, written to `x-pixeldojo-skill`. */\n skillName?: string;\n /** Optional fetch override (tests). Defaults to `globalThis.fetch`. */\n baseFetch?: typeof globalThis.fetch;\n}\n\n/**\n * Build a PixelDojoClient with attribution headers baked in.\n *\n * Each call's headers include both the source tag and the requesting\n * skill so the server can record per-skill error rates without the\n * client passing skill metadata explicitly through every call.\n */\nexport function makeAttributedClient(options: MakeClientOptions): PixelDojoClient {\n const { mcpVersion, skillName, baseFetch, ...sdkOptions } = options;\n const real = baseFetch ?? globalThis.fetch.bind(globalThis);\n\n const wrappedFetch: typeof globalThis.fetch = (input, init) => {\n const headers = new Headers(init?.headers);\n headers.set('x-pixeldojo-source', `mcp/${mcpVersion}`);\n if (skillName) headers.set('x-pixeldojo-skill', skillName);\n return real(input, { ...init, headers });\n };\n\n return new PixelDojoClient({\n ...sdkOptions,\n fetch: wrappedFetch,\n });\n}\n","/**\n * MCP server bootstrap. Wires the named skills to the MCP `tools/list` +\n * `tools/call` handlers and runs over stdio.\n *\n * Architecture:\n * - tools/list: returns every skill's name + description + inputSchema.\n * - tools/call: parses input via Zod, dispatches to the skill module,\n * converts the SkillResult into MCP content blocks, returns to host.\n * - errors are translated at the boundary: provider failures, missing\n * API keys, unknown skills all surface as actionable MCP error\n * payloads (never raw stack traces).\n */\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport { makeAttributedClient } from './client.js';\nimport { ALL_SKILLS, findSkill, toolListing } from './skills/index.js';\nimport type { SkillContext, SkillResult } from './skills/types.js';\nimport { makeRedactedLogger } from './redact.js';\n\n// Stamped from package.json at build time (tsup define) so the MCP\n// handshake and telemetry headers can't drift from the published version.\n// The '0.0.0-dev' fallback only appears when running un-built source.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const PACKAGE_VERSION =\n typeof __PACKAGE_VERSION__ === 'string' ? __PACKAGE_VERSION__ : '0.0.0-dev';\n\n/**\n * Server-level context sent on `initialize`, shared by this stdio server and\n * the hosted /api/mcp route. Facts that span tools only: tool choice belongs\n * in each tool's own description. API/MCP outputs live under the temp\n * bucket's api-outputs/ folder and are swept one hour after they land;\n * finished films are saved to the account library, so they stay.\n */\nexport const SERVER_INSTRUCTIONS =\n 'Pixel Dojo generates images, video, audio and short films from one catalog of AI models, billed in credits from the connected Pixel Dojo account. A job that runs past the 30-second wait returns a jobId to check later; check it rather than submitting again, since every new submission is charged. Generated asset URLs are deleted one hour after they are created: pixeldojo_save keeps one in the user\\'s My Media permanently (after a safety check), and finished films stay in the account library. In any prompt, @Name uses a character, product, outfit, location, prop or style the user saved in Character Studio: its photos are attached automatically. pixeldojo_library source=characters lists them, and pixeldojo_save_character saves a new one from 3 to 5 photos.';\n\nexport interface ServerOptions {\n apiKey: string;\n baseUrl?: string;\n packageVersion?: string;\n /** Inject for tests. Defaults to the real fetch. */\n baseFetch?: typeof globalThis.fetch;\n}\n\n/**\n * Build the configured MCP `Server` instance with handlers wired in.\n * Caller is responsible for connecting it to a transport (stdio in\n * production, mock in tests).\n */\nexport function buildServer(options: ServerOptions): Server {\n if (!options.apiKey) {\n throw new Error(\n 'apiKey is required. Set PIXELDOJO_API_KEY env var or pass apiKey to buildServer().',\n );\n }\n\n const version = options.packageVersion ?? PACKAGE_VERSION;\n const baseUrl = options.baseUrl ?? 'https://pixeldojo.ai';\n const logger = makeRedactedLogger();\n\n const server = new Server(\n {\n name: 'pixeldojo',\n version,\n },\n {\n capabilities: {\n tools: {},\n },\n instructions: SERVER_INSTRUCTIONS,\n },\n );\n\n // tools/list — advertise every named skill.\n server.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: ALL_SKILLS.map(toolListing),\n };\n });\n\n // tools/call — parse input, dispatch, translate result.\n server.setRequestHandler(CallToolRequestSchema, async (req) => {\n const skillName = req.params.name;\n const skill = findSkill(skillName);\n if (!skill) {\n const available = ALL_SKILLS.map((s) => s.name).join(', ');\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: `Unknown skill \"${skillName}\". Available: ${available}.`,\n },\n ],\n };\n }\n\n const parsed = skill.inputZod.safeParse(req.params.arguments ?? {});\n if (!parsed.success) {\n const issues = parsed.error.issues\n .map((i) => `${i.path.join('.') || '(root)'}: ${i.message}`)\n .join('; ');\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: `Invalid input for ${skillName}: ${issues}`,\n },\n ],\n };\n }\n\n // Build a client with skill-tagged headers for this call.\n const client = makeAttributedClient({\n apiKey: options.apiKey,\n baseUrl,\n mcpVersion: version,\n skillName,\n baseFetch: options.baseFetch,\n });\n\n const ctx: SkillContext = {\n client,\n apiKey: options.apiKey,\n baseUrl,\n mcpVersion: version,\n localFiles: true, // stdio: the caller's own machine\n logger,\n buildStatusUrl: (jobId) => `${baseUrl}/api/v1/jobs/${encodeURIComponent(jobId)}`,\n };\n\n try {\n const result = await skill.run(parsed.data, ctx);\n return skillResultToMcpResponse(result);\n } catch (err) {\n const message = errorToActionableMessage(err);\n logger.error(`Skill ${skillName} failed`, message);\n return {\n isError: true,\n content: [{ type: 'text', text: message }],\n };\n }\n });\n\n return server;\n}\n\n/**\n * Translate a SkillResult into MCP content blocks.\n * The host renders these to the LLM; URLs in `assets` are surfaced as\n * extra text blocks so the LLM can quote them directly without needing\n * a separate `assets` shape (no MCP standard for that yet).\n */\nexport function skillResultToMcpResponse(result: SkillResult): {\n isError?: boolean;\n content: Array<{ type: 'text'; text: string }>;\n} {\n if (result.kind === 'assets') {\n return {\n content: [\n { type: 'text', text: result.text },\n // Each URL on its own line so an LLM can copy individually.\n ...result.assetUrls.map((url) => ({ type: 'text' as const, text: url })),\n ],\n };\n }\n if (result.kind === 'handoff') {\n return {\n content: [\n { type: 'text', text: result.text },\n { type: 'text', text: `jobId: ${result.jobId}` },\n { type: 'text', text: `statusUrl: ${result.statusUrl}` },\n ],\n };\n }\n return {\n content: [{ type: 'text', text: result.text }],\n };\n}\n\n/**\n * Convert SDK / network errors to a single actionable line. Per Eng review:\n * users should never see raw provider stack traces; errors must include\n * what to do next.\n */\nexport function errorToActionableMessage(err: unknown): string {\n if (err == null) return 'Unknown error';\n if (typeof err === 'string') return err;\n const e = err as {\n name?: string;\n code?: string;\n status?: number;\n message?: string;\n };\n // Auth errors → tell the user where to fix it.\n if (e.status === 401 || e.code === 'auth_required' || e.name === 'AuthenticationError') {\n return (\n 'Authentication failed. Check PIXELDOJO_API_KEY. ' +\n 'Get a key at https://pixeldojo.ai/api-platform/api-keys.'\n );\n }\n if (e.status === 402 || e.code === 'insufficient_credits') {\n return (\n 'Insufficient credits. Top up at https://pixeldojo.ai/api-platform/buy-credits.'\n );\n }\n if (e.status === 429 || e.code === 'rate_limit') {\n return 'Rate limit hit. Try again in a few seconds.';\n }\n if (e.status === 404 || e.code === 'not_found') {\n return e.message ?? 'Resource not found.';\n }\n if (e.name === 'TimeoutError') {\n return e.message ?? 'Request timed out. Try again.';\n }\n return e.message ?? 'Unknown error';\n}\n\n/**\n * Run the server over stdio. Used by the CLI; tests use buildServer\n * directly with a mock transport.\n */\nexport async function runStdio(options: ServerOptions): Promise<void> {\n const server = buildServer(options);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n","/**\n * Log-boundary redaction. Strips PixelDojo API keys (`pd_<alphanumerics>`)\n * from any string passed through the logger so a debug message can never\n * leak a customer's key into MCP-host logs.\n *\n * Per Eng review: redaction is not optional, even for \"internal\" log\n * lines — the MCP host (Claude Code, Cursor) controls the log destination\n * and we cannot assume it is private.\n */\n\nconst PD_KEY_RE = /pd_[A-Za-z0-9_-]{8,}/g;\nconst REDACTED = '[redacted]';\n\n/**\n * Replace any pd_xxx token in a string with `[redacted]`. Returns the\n * original input unchanged when no token is present, so the common case\n * is a no-op allocation-wise.\n */\nexport function redactKeys(input: string): string {\n if (!input || typeof input !== 'string') return input;\n if (!input.includes('pd_')) return input;\n return input.replace(PD_KEY_RE, REDACTED);\n}\n\n/**\n * Recursively redact a value before sending it to a logger. Strings are\n * scrubbed via `redactKeys`. Plain objects and arrays are walked. Symbols,\n * functions, and primitives other than string pass through unchanged.\n *\n * Cycle-safe via WeakSet: an object that references itself is replaced\n * with `[circular]` rather than crashing the logger.\n */\nexport function redactValue(value: unknown, seen: WeakSet<object> = new WeakSet()): unknown {\n if (value == null) return value;\n if (typeof value === 'string') return redactKeys(value);\n if (typeof value !== 'object') return value;\n if (seen.has(value as object)) return '[circular]';\n seen.add(value as object);\n\n if (Array.isArray(value)) {\n return value.map((v) => redactValue(v, seen));\n }\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[k] = redactValue(v, seen);\n }\n return out;\n}\n\n/**\n * Build a logger that wraps `console.error` (the conventional place for\n * MCP server logs — stdout is reserved for JSON-RPC framing). Every\n * message and arg is passed through `redactValue` first.\n */\nexport function makeRedactedLogger(target: Pick<Console, 'error'> = console) {\n return {\n error(msg: string, ...args: unknown[]) {\n const redactedArgs = args.map((a) => redactValue(a));\n target.error(`[pixeldojo-mcp] ${redactKeys(msg)}`, ...redactedArgs);\n },\n };\n}\n","/**\n * Public entry — programmatic access to the MCP server. Most consumers\n * use the CLI instead (`npx @pixeldojo/mcp`), but the building blocks\n * are exported here so embedders can build their own MCP host.\n */\nexport {\n buildServer,\n runStdio,\n PACKAGE_VERSION,\n SERVER_INSTRUCTIONS,\n skillResultToMcpResponse,\n errorToActionableMessage,\n} from './server.js';\nexport type { ServerOptions } from './server.js';\nexport { makeAttributedClient } from './client.js';\nexport type { MakeClientOptions } from './client.js';\nexport { ALL_SKILLS, findSkill, HOSTED_SKILLS, findHostedSkill, toolListing, TOOL_ANNOTATIONS } from './skills/index.js';\nexport type { SkillModule, SkillContext, SkillResult } from './skills/types.js';\nexport { redactKeys, redactValue, makeRedactedLogger } from './redact.js';\nexport {\n pollJobUntilDoneOrHandoff,\n type PollResult,\n type PollableJob,\n type PollOptions,\n} from './poll.js';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/poll.ts","../src/skills/types.ts","../src/skills/upload-helpers.ts","../src/skills/schema-snap.ts","../src/skills/params.ts","../src/skills/generate.ts","../src/skills/edit.ts","../src/skills/character.ts","../src/skills/storyboard.ts","../src/skills/upscale.ts","../src/skills/caption.ts","../src/skills/overlay.ts","../src/skills/status.ts","../src/skills/from-url.ts","../src/skills/film.ts","../src/skills/video.ts","../src/skills/episode.ts","../src/skills/ad.ts","../src/skills/campaign.ts","../src/skills/campaign-status.ts","../src/skills/upload.ts","../src/skills/audio.ts","../src/skills/library.ts","../src/skills/save.ts","../src/skills/save-character.ts","../src/skills/workflows.ts","../src/skills/index.ts","../src/client.ts","../src/server.ts","../src/redact.ts","../src/index.ts"],"names":["path","extname","stat","basename","readFile","z","buildPayload","run","DEFAULT_MODEL","InputSchema","InputJsonSchema","ALLOWED","MODEL","extractAssetUrls","status","where","labels","exportError","dispatch","plan","produce","STYLES","lines","findSkill","ALL_SKILLS","HOSTED_SKILLS","TOOL_ANNOTATIONS","PixelDojoClient","Server","ListToolsRequestSchema","CallToolRequestSchema","StdioServerTransport"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Exponential-backoff job poller with a 30-second sync window.\n *\n * Per CEO D9 + D14 + Eng E4:\n * - Up to 30 seconds: poll the job synchronously, return assets when complete.\n * - Beyond 30 seconds: hand off — return `{ jobId, statusUrl }` and let the\n * calling LLM follow up via the `pixeldojo_status` tool.\n * - Backoff sequence: 1s → 2s → 4s → 8s → 8s → 8s ... capped at 8s.\n * Halves load on /api/v1/jobs/{id} vs a flat 2s interval.\n *\n * Job-fetcher and clock are dependency-injected so the unit tests can\n * exercise every branch without spinning a real HTTP fetcher or sleeping\n * for real wall-clock time.\n */\n\nexport interface PollableJob {\n jobId: string;\n status: 'pending' | 'queued' | 'processing' | 'completed' | 'failed' | string;\n assets?: Array<{ url: string; type?: string }>;\n output?: unknown;\n /** Provider-side error if the job failed. */\n error?: { code?: string; message?: string } | string;\n}\n\nexport interface PollOptions {\n /** Hard cap on the synchronous wait window. Default: 30_000 ms (per D9). */\n syncBudgetMs?: number;\n /** Override the backoff sequence. Default: [1000, 2000, 4000, 8000]. */\n backoffSequenceMs?: number[];\n /** Cap on the recurring delay once the sequence is exhausted. */\n maxIntervalMs?: number;\n /** Inject a clock for tests. Defaults to `Date.now`. */\n now?: () => number;\n /** Inject a sleeper for tests. Defaults to setTimeout-based wait. */\n sleep?: (ms: number) => Promise<void>;\n /** Optional abort signal — caller can cancel a poll mid-flight. */\n signal?: AbortSignal;\n}\n\nexport type PollResult =\n | { kind: 'completed'; job: PollableJob }\n | { kind: 'failed'; job: PollableJob }\n | { kind: 'handoff'; jobId: string; statusUrl: string };\n\nconst DEFAULT_BACKOFF = [1000, 2000, 4000, 8000];\nconst DEFAULT_MAX_INTERVAL = 8000;\nconst DEFAULT_SYNC_BUDGET_MS = 30_000;\n\nfunction defaultSleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new DOMException('aborted', 'AbortError'));\n return;\n }\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(timer);\n reject(new DOMException('aborted', 'AbortError'));\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n\n/**\n * Poll a job to terminal state OR until the sync budget is exhausted.\n * `fetchJob` returns the latest job snapshot; the poller decides when to\n * call it next.\n */\nexport async function pollJobUntilDoneOrHandoff(\n jobId: string,\n fetchJob: (id: string) => Promise<PollableJob>,\n buildStatusUrl: (id: string) => string,\n options: PollOptions = {},\n): Promise<PollResult> {\n const {\n syncBudgetMs = DEFAULT_SYNC_BUDGET_MS,\n backoffSequenceMs = DEFAULT_BACKOFF,\n maxIntervalMs = DEFAULT_MAX_INTERVAL,\n now = Date.now,\n sleep = (ms) => defaultSleep(ms, options.signal),\n signal,\n } = options;\n\n const start = now();\n let attempt = 0;\n\n while (true) {\n if (signal?.aborted) throw new DOMException('aborted', 'AbortError');\n\n const job = await fetchJob(jobId);\n\n if (job.status === 'completed') return { kind: 'completed', job };\n if (job.status === 'failed') return { kind: 'failed', job };\n\n const elapsed = now() - start;\n const remaining = syncBudgetMs - elapsed;\n if (remaining <= 0) {\n return {\n kind: 'handoff',\n jobId,\n statusUrl: buildStatusUrl(jobId),\n };\n }\n\n const interval =\n attempt < backoffSequenceMs.length ? backoffSequenceMs[attempt] : maxIntervalMs;\n // Don't sleep past the sync deadline — clamp the wait so the next\n // iteration immediately enters the \"remaining <= 0\" branch.\n const wait = Math.min(interval, Math.max(remaining, 0));\n if (wait > 0) await sleep(wait);\n attempt++;\n }\n}\n","/**\n * Shared types for MCP skill modules.\n *\n * Every named skill (pixeldojo_generate, :character, :storyboard, :upscale,\n * :status) exports an object that satisfies `SkillModule`. The server\n * registers them via `registerSkills` in `../server.ts`.\n */\nimport type { z } from 'zod';\nimport type { PixelDojoClient } from '@pixeldojo/sdk';\nimport type { PollResult } from '../poll.js';\n\nexport interface SkillContext {\n /** Header-injected SDK client. Each call has source + skill tag. */\n client: PixelDojoClient;\n /** Raw credentials for surfaces outside /api/v1 (the film pipeline). */\n apiKey: string;\n baseUrl: string;\n /** Resolved version string for the source attribution header. */\n mcpVersion: string;\n /**\n * True only where \"local\" means the caller's own machine (the stdio npm\n * server). The hosted /api/mcp route leaves it unset: there `*_path`\n * fields would read the production container's disk. Fail-closed.\n */\n localFiles?: boolean;\n /** Optional logger that already redacts pd_xxx tokens. */\n logger: { error: (msg: string, ...args: unknown[]) => void };\n /** Build a public statusUrl for a job (used in handoffs). */\n buildStatusUrl: (jobId: string) => string;\n /** Inject sleep / now for testability. Optional in production. */\n pollOverrides?: {\n now?: () => number;\n sleep?: (ms: number) => Promise<void>;\n };\n}\n\nexport type SkillResultText = {\n kind: 'text';\n text: string;\n /**\n * The work is still moving and only advances when the skill is called\n * again (a film's status call dispatches the next frames, clips, score and\n * export): call it with `input` after about `afterSec`. Absent means\n * finished, or waiting on a person (a cost to approve, a refused shot).\n * MCP clients only ever see `text`; the in-app agent reads this to keep a\n * film moving inside one reply instead of asking the user to say continue.\n */\n followUp?: { input: Record<string, unknown>; afterSec: number };\n};\nexport type SkillResultAssets = {\n kind: 'assets';\n text: string;\n assetUrls: string[];\n};\nexport type SkillResultHandoff = {\n kind: 'handoff';\n text: string;\n jobId: string;\n statusUrl: string;\n};\nexport type SkillResult = SkillResultText | SkillResultAssets | SkillResultHandoff;\n\n/**\n * One named skill. The MCP server reads `name`, `description`,\n * `inputSchema` (JSON Schema for `tools/list`) and dispatches via `run`.\n */\nexport interface SkillModule<TInput = unknown> {\n /** MCP tool name, e.g. `pixeldojo_generate`. */\n name: string;\n /** One-line description shown in `tools/list` to the LLM host. */\n description: string;\n /** Replaces `description` on the hosted server when it advertises `*_path` fields. */\n hostedDescription?: string;\n /** Zod schema for typed parsing inside the skill. */\n inputZod: z.ZodType<TInput>;\n /** JSON Schema (object) version for the MCP `tools/list` payload. */\n inputJsonSchema: Record<string, unknown>;\n /**\n * Whitelist of `apiId`s this skill is allowed to dispatch to. Treated as\n * a contract: a user-supplied `model` override must be in this list,\n * otherwise the skill returns an `UnknownModelError` with the list.\n * `null` means \"any registered model\" (used by `pixeldojo_generate`).\n */\n allowedModels: string[] | null;\n /** Default `apiId` if the user doesn't pass `model`. */\n defaultModel: string;\n /** Run the skill end-to-end. Returns a structured SkillResult. */\n run(input: TInput, ctx: SkillContext): Promise<SkillResult>;\n}\n\n/**\n * Render a `PollResult` as a `SkillResult`. Centralized so every skill\n * surfaces handoff / completion / failure consistently.\n */\nexport function pollResultToSkillResult(\n result: PollResult,\n successText: (urls: string[]) => string,\n): SkillResult {\n if (result.kind === 'completed') {\n const urls = extractAssetUrls(result.job);\n return {\n kind: 'assets',\n text: successText(urls),\n assetUrls: urls,\n };\n }\n if (result.kind === 'failed') {\n const errMsg =\n typeof result.job.error === 'string'\n ? result.job.error\n : result.job.error?.message ?? 'Unknown provider error';\n return {\n kind: 'text',\n text: `Job ${result.job.jobId} failed: ${errMsg}`,\n };\n }\n return {\n kind: 'handoff',\n text:\n `Job ${result.jobId} is still running after the 30s sync window. ` +\n `Use pixeldojo_status with this jobId to check completion, or follow ${result.statusUrl}.`,\n jobId: result.jobId,\n statusUrl: result.statusUrl,\n };\n}\n\nfunction extractAssetUrls(job: { assets?: Array<{ url: string }>; output?: unknown }): string[] {\n if (job.assets && job.assets.length > 0) return job.assets.map((a) => a.url);\n // Fallback for completed jobs that put outputs on `output.images` /\n // `output.videos` (matches the legacy /api/v1/jobs response shape).\n const output = job.output as\n | { images?: string[]; videos?: string[]; image?: string; video?: string }\n | undefined;\n if (output?.images) return output.images;\n if (output?.videos) return output.videos;\n if (output?.image) return [output.image];\n if (output?.video) return [output.video];\n return [];\n}\n","/**\n * Shared helper: read a local file and upload it to PixelDojo's 24h temp\n * bucket, returning the public URL. Used by `:generate` and `:edit` to\n * accept `image_path` / `image_paths` alongside the URL-based fields so\n * agents can hand off a local file in one step instead of chaining\n * `:upload` first.\n *\n * Throws a `SkillUploadError` on any failure — caller turns it into a\n * SkillResult text response.\n */\nimport { readFile, stat } from 'node:fs/promises';\nimport { extname, basename } from 'node:path';\nimport type { SkillContext } from './types.js';\n\nconst MAX_IMAGE_BYTES = 50 * 1024 * 1024;\nconst MAX_VIDEO_BYTES = 200 * 1024 * 1024;\nconst MAX_AUDIO_BYTES = 50 * 1024 * 1024;\n\nconst EXT_TO_MIME: Record<string, string> = {\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.png': 'image/png',\n '.webp': 'image/webp',\n '.gif': 'image/gif',\n '.mp4': 'video/mp4',\n '.webm': 'video/webm',\n '.mov': 'video/quicktime',\n // Audio: the server checks the bytes match (a Film Studio song, song_path).\n '.mp3': 'audio/mpeg',\n '.wav': 'audio/wav',\n '.m4a': 'audio/mp4',\n '.aac': 'audio/aac',\n '.ogg': 'audio/ogg',\n '.flac': 'audio/flac',\n};\n\nexport class SkillUploadError extends Error {\n constructor(public readonly userMessage: string) {\n super(userMessage);\n this.name = 'SkillUploadError';\n }\n}\n\nexport const HOSTED_LOCAL_PATH_MESSAGE =\n 'Local file paths are not available on the hosted PixelDojo MCP server (it cannot see your disk). ' +\n 'Pass a public http(s) URL instead (image_url / image_urls / video_url / audio_urls / product_image_urls), ' +\n 'or install the local server (npx @pixeldojo/mcp init) to use files on your machine.';\n\ntype UploadCtx = Pick<SkillContext, 'client' | 'localFiles'>;\n\nexport async function uploadLocalFile(path: string, ctx: UploadCtx): Promise<string> {\n // Checked before any fs call: on the hosted server \"local\" is our container.\n if (ctx.localFiles !== true) throw new SkillUploadError(HOSTED_LOCAL_PATH_MESSAGE);\n const ext = extname(path).toLowerCase();\n const mime = EXT_TO_MIME[ext];\n if (!mime) {\n throw new SkillUploadError(\n `Unsupported file extension \"${ext || '(none)'}\" for \"${path}\". Allowed: ${Object.keys(EXT_TO_MIME).join(', ')}.`,\n );\n }\n\n let size: number;\n try {\n const info = await stat(path);\n if (!info.isFile()) {\n throw new SkillUploadError(`\"${path}\" is not a file.`);\n }\n size = info.size;\n } catch (err) {\n if (err instanceof SkillUploadError) throw err;\n const code = (err as NodeJS.ErrnoException)?.code;\n if (code === 'ENOENT') {\n throw new SkillUploadError(\n `File not found at \"${path}\". Pass an absolute path.`,\n );\n }\n throw new SkillUploadError(\n `Cannot read \"${path}\": ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n const isImage = mime.startsWith('image/');\n const isAudio = mime.startsWith('audio/');\n const limit = isImage ? MAX_IMAGE_BYTES : isAudio ? MAX_AUDIO_BYTES : MAX_VIDEO_BYTES;\n if (size > limit) {\n const gotMB = (size / 1024 / 1024).toFixed(1);\n const limitMB = (limit / 1024 / 1024).toFixed(0);\n throw new SkillUploadError(\n `\"${basename(path)}\" is ${gotMB}MB; limit for ${isImage ? 'images' : isAudio ? 'audio' : 'videos'} is ${limitMB}MB. Downscale or re-encode and try again.`,\n );\n }\n\n const buffer = await readFile(path);\n const blob = new Blob([new Uint8Array(buffer)], { type: mime });\n const filename = basename(path);\n const response = await ctx.client.uploadImage(blob, filename);\n return response.url;\n}\n\nexport async function uploadLocalFiles(\n paths: readonly string[],\n ctx: UploadCtx,\n): Promise<string[]> {\n return Promise.all(paths.map((p) => uploadLocalFile(p, ctx)));\n}\n","/**\n * Snap agent-supplied `aspect_ratio` / `duration` values to what a model's\n * real schema accepts, fetched from GET /api/v1/models/{apiId}/schema.\n *\n * The MCP package has no access to the main app's server-side model\n * catalog — it's a separate npm package that only talks to the public API\n * over HTTP — so unlike the in-app chat agent's model-router.ts, there's\n * no local catalog to consult. This does one schema fetch per apiId\n * (cached for the life of the process — the MCP server is a long-lived\n * stdio process for the session) and snaps to the nearest value the\n * schema actually allows, instead of forwarding a value verbatim that a\n * model's Zod schema rejects outright (an LLM guessing \"2:3\" for a\n * portrait against a model that only accepts 1:1/16:9/9:16/4:3/3:4, or a\n * duration of 10s against a model that only accepts 5 or 8).\n *\n * Every schemas-derived tri-state is meaningful and handled distinctly:\n * - schema fetch failed (network hiccup, endpoint down) → pass the\n * caller's value through UNCHANGED. We don't know what the model\n * wants, so this is strictly today's pre-existing behavior, not a\n * regression.\n * - schema fetched OK, field absent from the model's declared\n * properties → return undefined so the caller OMITS the key.\n * Schemas reject unrecognized keys (additionalProperties: false), so\n * forwarding a field a model never declared 400s regardless — this\n * is a genuine improvement, not just a snap.\n * - schema fetched OK, field present with an enum → snap to the\n * numerically-nearest allowed value (aspect ratio) or nearest allowed\n * number (duration).\n * - schema fetched OK, field present with only min/max (duration only)\n * → clamp into range.\n * - schema fetched OK, field present but unconstrained → pass through.\n */\nimport type { PixelDojoClient } from '@pixeldojo/sdk';\n\ninterface FieldConstraint {\n type?: string;\n enum?: string[];\n minimum?: number;\n maximum?: number;\n maxItems?: number;\n minItems?: number;\n}\n\ntype FieldConstraints = Record<string, FieldConstraint>;\n\n/** One declared reference slot from the tool's `media` block, served by\n * GET /api/v1/models/{apiId}/schema alongside the schema itself. `also` is\n * the part no field-name search could ever find — kling's\n * `reference_type: 'video'` is what selects the provider's clip endpoint, so\n * the url alone lands on the still path. */\nexport interface MediaSlot {\n key: string;\n also?: Record<string, string | number | boolean>;\n}\n\nexport type MediaKind = 'image' | 'video' | 'audio';\n\ntype MediaDeclarations = Partial<Record<MediaKind, MediaSlot>>;\n\ninterface ModelSchemaInfo {\n props: FieldConstraints;\n /** Absent when the tool declares no media slots at all. */\n media?: MediaDeclarations;\n}\n\n// Cache the in-flight PROMISE, not the resolved value — generate's\n// Promise.all([snapAspectRatio, snapDuration]) fires both before either\n// resolves, and a value-cache would let two identical GET /schema requests\n// race on first call. Failed fetches resolve null and are evicted so a\n// transient outage doesn't poison the rest of the process's lifetime.\nconst schemaCache = new Map<string, Promise<ModelSchemaInfo | null>>();\n\n/** Test-only: clear the module-level schema cache so tests with different\n * mocked schemas for the same apiId don't see a stale cached result. */\nexport function _resetSchemaCacheForTests(): void {\n schemaCache.clear();\n}\n\n/** Resolves null when the schema fetch itself failed (caller decides\n * whether to fail open or closed) — distinct from a successfully-fetched\n * schema that simply has no properties. */\nfunction getModelInfo(\n apiId: string,\n client: PixelDojoClient,\n): Promise<ModelSchemaInfo | null> {\n const cached = schemaCache.get(apiId);\n if (cached) return cached;\n // An older @pixeldojo/sdk may not have getModelSchema at all, and one that\n // does may throw synchronously — both are the \"constraints unknown\" case,\n // not a crash. The typeof guard states the expectation; the Promise wrapper\n // keeps a synchronous throw inside the .catch() below rather than letting it\n // escape and take the whole skill down.\n if (typeof client?.getModelSchema !== 'function') return Promise.resolve(null);\n const pending = Promise.resolve()\n .then(() => client.getModelSchema(apiId))\n .then((res) => {\n // `media` is served next to `schema` by the same endpoint but is newer\n // than the SDK's ModelSchemaResponse type, hence the cast. An older\n // deployment simply omits it and every lookup falls back to the\n // name-search below, which is the pre-media behavior.\n const body = res as unknown as {\n schema?: { properties?: FieldConstraints };\n media?: MediaDeclarations;\n };\n return { props: body.schema?.properties ?? {}, media: body.media };\n })\n .catch(() => {\n schemaCache.delete(apiId); // don't cache failures\n return null;\n });\n schemaCache.set(apiId, pending);\n return pending;\n}\n\nasync function getFieldConstraints(\n apiId: string,\n client: PixelDojoClient,\n): Promise<FieldConstraints | null> {\n return (await getModelInfo(apiId, client))?.props ?? null;\n}\n\n/** What to do with the caller's value when the model's constraints are\n * UNKNOWN (schema fetch failed):\n * - 'send' (default): pass the value through unchanged — status quo for\n * skills that always forwarded these fields (generate/edit/storyboard).\n * - 'omit': drop the field — for skills that historically only sent it to\n * an allowlist of models (character), where forwarding on a fetch\n * failure would 400 against strict schemas that never took the field. */\nexport interface SnapOptions {\n onUnknown?: 'send' | 'omit';\n}\n\nfunction parseAspectRatio(ar: string): number | null {\n const m = /^\\s*(\\d+)\\s*:\\s*(\\d+)\\s*$/.exec(ar);\n if (!m) return null;\n const w = Number(m[1]);\n const h = Number(m[2]);\n return h > 0 ? w / h : null;\n}\n\nfunction nearestAspectFromEnum(requested: string, allowed: string[]): string {\n if (allowed.includes(requested)) return requested;\n const target = parseAspectRatio(requested);\n if (target === null) return requested;\n let best = requested;\n let bestDiff = Infinity;\n for (const candidate of allowed) {\n const r = parseAspectRatio(candidate);\n if (r === null) continue;\n const diff = Math.abs(r - target);\n if (diff < bestDiff) {\n bestDiff = diff;\n best = candidate;\n }\n }\n return best;\n}\n\n/** Snap `aspect_ratio` to the nearest value the model's schema declares.\n * Returns undefined when there's nothing to send (no value requested, or\n * the model's schema confirms it doesn't take this field at all). */\nexport async function snapAspectRatio(\n apiId: string,\n requested: string | undefined,\n client: PixelDojoClient,\n opts: SnapOptions = {},\n): Promise<string | undefined> {\n if (!requested) return undefined;\n const props = await getFieldConstraints(apiId, client);\n if (props === null) {\n return opts.onUnknown === 'omit' ? undefined : requested; // fetch failed\n }\n const field = props.aspect_ratio;\n if (!field) return undefined; // confirmed: this model doesn't take aspect_ratio\n if (!field.enum || field.enum.length === 0) return requested; // unconstrained string\n return nearestAspectFromEnum(requested, field.enum);\n}\n\n/**\n * Every field name a tool in the registry uses to mean \"here is a reference\n * image\". Agents only ever hand us one generic `image_url`; this is what it\n * gets mapped onto, per model, from the model's own schema.\n *\n * Order is specificity, not popularity: a model that declares several (Kling\n * declares start_image_url + image_urls + end_image_url) gets the field that\n * a SINGLE reference means — the start frame — not the bag of extra refs.\n * Video-input fields (video_url) are deliberately absent; the video-edit /\n * video-extend tools are mapped explicitly in generate.ts because they also\n * remap duration, and every other clip slot arrives declared (see\n * resolveMediaSlot).\n *\n * This is the FALLBACK for models that declare no `media`. A declared slot\n * always wins — see resolveMediaSlot.\n *\n * tests/contracts/film-studio-engines-registered.test.ts fails if any Film\n * Studio clip engine (or any registered reference-capable video tool) grows\n * a reference field that isn't in this list.\n */\nexport const REFERENCE_FIELD_PRIORITY = [\n 'image_url',\n 'start_image_url',\n 'input_image',\n 'image',\n 'reference_images',\n 'reference_urls',\n 'reference_image_urls',\n 'image_urls',\n 'image_input',\n 'images',\n] as const;\n\nexport interface ReferenceField {\n name: string;\n isArray: boolean;\n /** Extra body fields the declared slot pins (kling's `reference_type`). */\n also?: Record<string, string | number | boolean>;\n}\n\n/** Name-search fallback per media kind, for models that declare no `media`.\n * Video and audio are their own short lists, for the same reason the app's\n * model-router keeps them separate: a track or a clip is never a substitute\n * for a frame, so a near-miss on a lookalike image field is worse than no\n * match at all. `image_url` on a clip is exactly how an mp4 reached the\n * provider as \"content-type: video/mp4\" — after the credit deduction.\n *\n * Every name on the video list can only mean a source clip: `video_url` /\n * `video` is how the video-edit/upscale family (video-upscaler,\n * kling-video-edit, video-reframe, xai-video-edit, …) keys its input.\n * Before they were listed, an explicit model override with a video_url was\n * \"proven\" clip-less and substituted with seedance-2-reference — at 4x the\n * credits of the upscaler the caller actually named. */\nconst FALLBACK_KEYS: Record<MediaKind, readonly string[]> = {\n image: REFERENCE_FIELD_PRIORITY,\n video: ['reference_videos', 'video_url', 'video'],\n audio: ['reference_audios', 'audio_url'],\n};\n\n/**\n * Which field this model wants a reference of `kind` in.\n * - undefined → schema fetch failed; caller keeps its existing behavior.\n * - null → schema fetched, model has no slot for this kind.\n * - {name} → send the url as this key (wrapped in an array if the\n * schema types it as one), plus every `also` field.\n *\n * A DECLARED slot always wins: the field names lie, and only the declaration\n * knows it. `reference_urls` is images-only on grok-r2v and images-or-video\n * on wan-reference-to-video — identical name, identical derived shape,\n * opposite meaning — and kling's `start_image_url` (a still anchor) outranks\n * its real `video_url` in the search order, so a clip was filed as an image\n * reference pointing at an .mp4.\n *\n * Mirrors applySourceMedia / applySourceAudio in the app's\n * lib/agent/model-router.ts, including the asymmetry between them: a model\n * that declares `media` but no image/video slot for this kind gets NO name\n * search (the declaration is complete, a hit would be the wrong slot), while\n * audio keeps its search either way because every name on that list is a\n * genuine audio field — wan-2.7-video's `audio_url` is real and undeclared.\n */\nexport async function resolveMediaSlot(\n apiId: string,\n kind: MediaKind,\n client: PixelDojoClient,\n): Promise<ReferenceField | null | undefined> {\n const info = await getModelInfo(apiId, client);\n if (info === null) return undefined;\n const declared = info.media?.[kind];\n if (declared) {\n return {\n name: declared.key,\n isArray: info.props[declared.key]?.type === 'array',\n also: declared.also,\n };\n }\n if (info.media && kind !== 'audio') return null;\n for (const name of FALLBACK_KEYS[kind]) {\n const field = info.props[name];\n if (field) return { name, isArray: field.type === 'array' };\n }\n return null;\n}\n\n/** \"1080p\" / \"1080P\" / \"1080\" are the same tier spelled three ways across\n * tools (WAN r2v takes \"720\", Grok takes \"720p\"); 4k is 2160 lines. */\nfunction resolutionHeight(value: string): number | null {\n const v = value.trim().toLowerCase();\n if (v === '4k') return 2160;\n const n = Number.parseInt(v, 10);\n return Number.isFinite(n) ? n : null;\n}\n\n/** Snap `resolution` to what the model declares. Same tri-state as the other\n * snaps; matches across the p/no-p spelling difference, then falls back to\n * the nearest declared tier by line count. */\nexport async function snapResolution(\n apiId: string,\n requested: string | undefined,\n client: PixelDojoClient,\n opts: SnapOptions = {},\n): Promise<string | undefined> {\n if (!requested) return undefined;\n const props = await getFieldConstraints(apiId, client);\n if (props === null) {\n return opts.onUnknown === 'omit' ? undefined : requested; // fetch failed\n }\n const field = props.resolution;\n if (!field) return undefined; // confirmed: this model doesn't take resolution\n if (!field.enum || field.enum.length === 0) return requested; // unconstrained\n if (field.enum.includes(requested)) return requested;\n const target = resolutionHeight(requested);\n if (target === null) return requested;\n let best = requested;\n let bestDiff = Infinity;\n for (const candidate of field.enum) {\n const h = resolutionHeight(candidate);\n if (h === null) continue;\n const diff = Math.abs(h - target);\n if (diff < bestDiff) {\n bestDiff = diff;\n best = candidate;\n }\n }\n return best;\n}\n\n/** Snap `duration` (seconds) to the model's schema — nearest match for a\n * discrete enum, clamp for a continuous min/max. Returns undefined when\n * there's nothing to send (no value requested, or the model's schema\n * confirms it doesn't take a `duration` field — e.g. the video-input\n * tools that key length as `video_duration` instead). */\nexport async function snapDuration(\n apiId: string,\n requested: number | undefined,\n client: PixelDojoClient,\n opts: SnapOptions = {},\n): Promise<number | undefined> {\n if (requested === undefined) return undefined;\n const props = await getFieldConstraints(apiId, client);\n if (props === null) {\n return opts.onUnknown === 'omit' ? undefined : requested; // fetch failed\n }\n const field = props.duration;\n if (!field) return undefined; // confirmed: this model doesn't take duration\n if (field.enum && field.enum.length > 0) {\n const allowed = field.enum.map(Number).filter((n) => Number.isFinite(n));\n if (allowed.length === 0) return requested;\n if (allowed.includes(requested)) return requested;\n return allowed.reduce((best, candidate) =>\n Math.abs(candidate - requested) < Math.abs(best - requested) ? candidate : best,\n );\n }\n if (typeof field.minimum === 'number' || typeof field.maximum === 'number') {\n let v = requested;\n if (typeof field.minimum === 'number') v = Math.max(field.minimum, v);\n if (typeof field.maximum === 'number') v = Math.min(field.maximum, v);\n return v;\n }\n return requested; // declared but unconstrained\n}\n\n/** A source url that's a clip rather than a still. Signed CDN urls carry\n * query strings, so match on the extension only; an extensionless clip is\n * why the skills take an explicit `video_url` input rather than sniffing\n * everywhere. Same regex as isVideoUrl in the app's model-router.ts. */\nexport function isVideoUrl(url: string): boolean {\n return /\\.(mp4|mov|webm|m4v)(?:[?#]|$)/i.test(url);\n}\n\n/** A source url that's an audio track — neither a frame nor a clip, and it\n * must never ride into a reference-IMAGE field: the provider kills the job\n * (\"does not point to a valid image … content-type: audio/mpeg\") after the\n * credit deduction. Same regex as isAudioUrl in the app's model-router.ts. */\nexport function isAudioUrl(url: string): boolean {\n return /\\.(mp3|wav|m4a|aac|ogg|flac)(?:[?#]|$)/i.test(url);\n}\n\n/** Parameter names a reference image can arrive under, most specific\n * first. Mirrors EDIT_IMAGE_KEYS in the app's lib/agent/model-router.ts —\n * the same list the in-app agent resolves against. */\nconst REF_KEYS = [\n 'image_urls',\n 'images',\n 'image_input',\n 'reference_images',\n 'reference_urls',\n 'image_url',\n 'input_image',\n 'image',\n] as const;\n\nexport interface ResolvedImageRefs {\n /** Schema property to write the reference(s) into. */\n key: string;\n /** Array for array-typed params (clamped to the schema's maxItems),\n * single URL for scalar ones. */\n value: string[] | string;\n /** URLs dropped to fit the model's cap, so the caller can tell the user. */\n dropped: number;\n /** Extra body fields a declared slot pins. */\n also?: Record<string, string | number | boolean>;\n}\n\n/**\n * Resolve WHERE a model wants its reference images, and how many it takes,\n * from its published schema.\n *\n * The previous hardcoded switch was wrong for half the allowlist: flux-edit\n * was sent `image_url` when its schema requires `input_image_1`, so EVERY\n * flux-edit edit failed; gpt-image-2-edit was sent `image_url` when it only\n * accepts `image_urls`, so single-image edits failed while 2-8 worked; and\n * nothing clamped to maxItems, so wan-2.6-image-edit 400'd at 5+ images and\n * gpt-image-2-edit at 9. Schemas strip unknown keys rather than rejecting\n * them, so a wrong key can also mean the reference is silently discarded\n * and the user is billed for a from-scratch image.\n *\n * Returns null when the schema fetch fails or the model declares no\n * reference field — the caller keeps its existing behavior rather than\n * guessing.\n */\nexport async function resolveImageRefs(\n apiId: string,\n urls: string[],\n client: PixelDojoClient,\n): Promise<ResolvedImageRefs | null> {\n if (urls.length === 0) return null;\n const info = await getModelInfo(apiId, client);\n if (info === null) return null; // fetch failed — caller falls back\n\n // Declared image slot first (same rule as resolveMediaSlot); the REF_KEYS\n // search is the fallback for models that declare no `media`.\n const props = info.props;\n const key = info.media\n ? info.media.image?.key\n : REF_KEYS.find((k) => props[k] !== undefined);\n if (!key) return null; // model declares no reference field\n const also = info.media?.image?.also;\n const field = props[key] ?? {};\n\n if (field.type === 'array') {\n const cap = typeof field.maxItems === 'number' ? field.maxItems : urls.length;\n const kept = urls.slice(0, Math.max(1, cap));\n return { key, value: kept, dropped: urls.length - kept.length, also };\n }\n return { key, value: urls[0], dropped: urls.length - 1, also };\n}\n","/**\n * Model-specific `params` passthrough — the MCP twin of `applyParams` in the\n * app's lib/agent/skills.ts.\n *\n * Deliberately an open record. Each model documents its own inputs and there\n * are 100+ of them, so enumerating those fields in a tool description is not\n * an option — but the model's OWN schema already is a validator, and\n * /api/v1/models/{apiId}/run runs it before a single credit is deducted. A\n * wrong field comes back named, with its allowed values, and the calling\n * agent corrects it on the next call. The validation loop is the\n * documentation, which is why nothing here inspects or rewrites the values:\n * a 400 the caller can act on beats a guess we made on its behalf.\n */\nimport { z } from 'zod';\nimport type { SkillResult } from './types.js';\n\nexport const ParamsInput = z.record(z.unknown()).optional();\n\nexport const PARAMS_JSON_SCHEMA: Record<string, unknown> = {\n type: 'object',\n additionalProperties: true,\n description:\n 'Advanced settings for the model that runs this, named exactly as that model documents them (e.g. {\"resolution\": \"1080p\", \"seed\": 42}). Set `model` in the same call: field names differ per model, so params without one are refused. Applied last, so these override anything derived from the other inputs. An invalid field comes back named with its allowed values and nothing is charged, so fix it and call again.',\n};\n\n/** Refusal text when settings arrived with no model to attach them to, else\n * null. Ask rather than guess: the same key means different things on\n * different models, and the skill's own default is not what the caller had\n * in mind when they wrote them. */\nexport function paramsWithoutModel(\n params: Record<string, unknown> | undefined,\n model: string | undefined,\n): string | null {\n if (!params || Object.keys(params).length === 0) return null;\n if (model) return null;\n return 'Those settings are model-specific. Tell me which model to use and I will apply them.';\n}\n\n/** Overlay `params` onto a built body, LAST, so an explicit setting beats\n * anything the skill derived. Returns a note to prepend to the result when\n * we did not apply them verbatim.\n *\n * Two carve-outs, both matching the in-app agent:\n * - A SUBSTITUTED model gets nothing. `paramsModel` is the model those\n * fields were written for; when routing sent the job elsewhere (the clip\n * engine) the keys mean something else on the model that actually ran, or\n * nothing at all. Dropping them keeps the generation alive and the note\n * names the model to ask for.\n * - `prompt` never rides in here. Every skill already takes one, and\n * storyboard wraps it (brief → prompt), so an override would silently\n * discard the caller's own text. */\nexport function applyParams(\n body: Record<string, unknown>,\n params: Record<string, unknown> | undefined,\n paramsModel: string | undefined,\n apiId: string,\n): string | undefined {\n if (!params || Object.keys(params).length === 0) return undefined;\n if (paramsModel !== apiId) {\n return `This ran on ${apiId}, so I left those settings off: they are ${paramsModel}'s fields. Ask again naming ${apiId} if you want them applied.`;\n }\n const rest = { ...params };\n delete rest.prompt;\n Object.assign(body, rest);\n return 'prompt' in params\n ? 'I kept the prompt from the skill call and ignored the one in params.'\n : undefined;\n}\n\n/** Ride a routing/params note out on whatever the job returns — success,\n * handoff, or failure — so the caller never sees a result from a model it\n * never named with no explanation. */\nexport function prefixNote(result: SkillResult, note: string | undefined): SkillResult {\n if (!note) return result;\n return { ...result, text: `${note} ${result.text}`.trim() };\n}\n","/**\n * pixeldojo_generate — generic image/video generation skill.\n *\n * Default routing: text-to-image via `seedream-5` (best quality, fewest\n * provider refusals). Users can override by passing a `model` field; any apiId\n * that exists in the registry is accepted (allowedModels: null).\n */\nimport { z } from 'zod';\nimport { pollJobUntilDoneOrHandoff } from '../poll.js';\nimport {\n type SkillContext,\n type SkillModule,\n type SkillResult,\n pollResultToSkillResult,\n} from './types.js';\nimport { SkillUploadError, uploadLocalFile } from './upload-helpers.js';\nimport {\n type ReferenceField,\n isAudioUrl,\n isVideoUrl,\n resolveMediaSlot,\n snapAspectRatio,\n snapDuration,\n snapResolution,\n} from './schema-snap.js';\nimport {\n PARAMS_JSON_SCHEMA,\n ParamsInput,\n applyParams,\n paramsWithoutModel,\n prefixNote,\n} from './params.js';\n\nconst InputSchema = z.object({\n prompt: z.string().min(1).max(8000).describe('Prompt describing what to generate. Write @Name to use a character or element the user saved in Character Studio (\"@Mara on a beach\"): its photos are attached automatically on models that take reference images. pixeldojo_library source=characters lists them.'),\n model: z\n .string()\n .optional()\n .describe(\n 'Model apiId. Recommended (the models the PixelDojo studios use): \"seedream-5\" for images (the default), \"seedance-2-5\" for video (prompt only or a starting image), \"wan-3-0-video\" for video the others refuse. Use another model only when the user names one. Full catalog: https://pixeldojo.ai/api/v1/models; one model\\'s fields: https://pixeldojo.ai/llm/{apiId}.txt. Omit for seedream-5, which makes still images only; name a video model to get a video.',\n ),\n preset: z\n .string()\n .optional()\n .describe(\n 'Preset slug that seeds the running model\\'s settings; explicit fields and params override it. Each preset belongs to one model (browse them by model at https://pixeldojo.ai/presets), so set `model` to that preset\\'s model: a slug the running model has no preset for is rejected with a 400 before any charge.',\n ),\n aspect_ratio: z\n .string()\n .optional()\n .describe('e.g. \"1:1\", \"16:9\", \"9:16\". Snapped to the nearest ratio the model supports, and dropped if the model has no aspect_ratio field.'),\n duration: z\n .number()\n .int()\n .positive()\n .optional()\n .describe('Video length in seconds. Snapped or clamped to what the model allows, and dropped if the model has no duration field. Required for grok-video-extend (the extension length).'),\n resolution: z\n .string()\n .optional()\n .describe(\n 'Output resolution when the model supports it (e.g. \"480p\", \"720p\", \"1080p\", \"4k\"). Lower tiers cost fewer credits. Omit to use the model default.',\n ),\n image_url: z\n .string()\n .url()\n .optional()\n .describe('Reference still for image-to-image / image-to-video. A clip URL (.mp4/.mov/.webm) or an audio track URL (.mp3/.wav/.m4a/...) here is detected by extension and routed as that kind of media instead.'),\n video_url: z\n .string()\n .url()\n .optional()\n .describe(\n 'Source video clip to animate / restyle / extend. Use this for videos; image_url is for still frames. With no model, a clip runs on seedance-2-reference; a named model with no clip input is swapped for it and the result says so.',\n ),\n params: ParamsInput,\n image_path: z\n .string()\n .min(1)\n .optional()\n .describe(\n 'Absolute local file path to a reference image/video. The skill uploads it to PixelDojo first (24h temp storage) and then dispatches. Prefer this over image_url when the user has the file on disk.',\n ),\n image_urls: z\n .array(z.string().url())\n .optional()\n .describe(\n 'Multiple reference image URLs, for models that accept a reference set (character + wardrobe + location, for example). Models that take only one reference use the first and the rest are ignored.',\n ),\n image_paths: z\n .array(z.string().min(1))\n .optional()\n .describe(\n 'Multiple absolute local file paths. Each is uploaded to PixelDojo (24h temp storage) and used as a reference, same rules as image_urls.',\n ),\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\n// House default for stills (see AGENT_PREFERRED in lib/agent/roster.ts).\nconst DEFAULT_MODEL = 'seedream-5';\n\n/** The one engine on the catalog that reads a video OR an audio reference.\n * Every no-model clip/track path lands here, same as the in-app agent's\n * VIDEO_REFERENCE_APIID. */\nexport const VIDEO_REFERENCE_MODEL = 'seedance-2-reference';\n\n/** Its slots, statically. Only consulted when the schema fetch FAILED: this\n * is the model we substituted TO precisely so a clip lands somewhere honest,\n * and falling back to `image_url` there would reintroduce the exact provider\n * rejection (\"content-type: video/mp4\") the substitution exists to prevent.\n * Contract-tested against the real config by the app's\n * tests/contracts/media-declarations.test.ts. */\nconst VIDEO_REFERENCE_SLOTS: Record<'image' | 'video' | 'audio', ReferenceField> = {\n image: { name: 'reference_images', isArray: true },\n video: { name: 'reference_videos', isArray: true },\n audio: { name: 'reference_audios', isArray: true },\n};\n\nfunction fallbackSlot(\n apiId: string,\n kind: 'image' | 'video' | 'audio',\n): ReferenceField | undefined {\n return apiId === VIDEO_REFERENCE_MODEL ? VIDEO_REFERENCE_SLOTS[kind] : undefined;\n}\n\n// These three key length as `video_duration`, not `duration` — buildPayload\n// below already remaps for them. Schema-snapping against the literal name\n// \"duration\" would find nothing declared and drop the value the\n// grok-video-extend required-field check just confirmed was present, so\n// skip the generic snap for this set and trust the caller's value as-is.\nconst VIDEO_INPUT_MODELS = new Set(['grok-video-extend', 'wan-video-edit', 'seedance-video-edit']);\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n prompt: { type: 'string', description: 'Prompt describing what to generate. Write @Name to use a character or element the user saved in Character Studio (\"@Mara on a beach\"): its photos are attached automatically on models that take reference images. pixeldojo_library source=characters lists them.' },\n model: {\n type: 'string',\n description:\n 'Model apiId. Recommended (the models the PixelDojo studios use): \"seedream-5\" for images (the default), \"seedance-2-5\" for video (prompt only or a starting image), \"wan-3-0-video\" for video the others refuse. Use another model only when the user names one. Full catalog: https://pixeldojo.ai/api/v1/models; one model\\'s fields: https://pixeldojo.ai/llm/{apiId}.txt. Omit for seedream-5, which makes still images only; name a video model to get a video.',\n },\n preset: {\n type: 'string',\n description:\n 'Preset slug that seeds the running model\\'s settings; explicit fields and params override it. Each preset belongs to one model (browse them by model at https://pixeldojo.ai/presets), so set `model` to that preset\\'s model: a slug the running model has no preset for is rejected with a 400 before any charge.',\n },\n aspect_ratio: {\n type: 'string',\n description:\n 'e.g. \"1:1\", \"16:9\", \"9:16\". Snapped to the nearest ratio the model supports, and dropped if the model has no aspect_ratio field.',\n },\n duration: {\n type: 'integer',\n description:\n 'Video length in seconds. Snapped or clamped to what the model allows, and dropped if the model has no duration field. Required for grok-video-extend (the extension length).',\n },\n resolution: {\n type: 'string',\n description:\n 'Output resolution when the model supports it (e.g. \"480p\", \"720p\", \"1080p\", \"4k\"). Snapped to the nearest tier the model offers, and dropped if the model has no resolution field. Lower tiers cost fewer credits.',\n },\n image_url: {\n type: 'string',\n format: 'uri',\n description:\n 'Reference still for image-to-image / image-to-video. A clip URL (.mp4/.mov/.webm) or an audio track URL (.mp3/.wav/.m4a/...) here is detected by extension and routed as that kind of media instead.',\n },\n video_url: {\n type: 'string',\n format: 'uri',\n description:\n 'Source video clip to animate / restyle / extend. Use this for videos; image_url is for still frames. With no model, a clip runs on seedance-2-reference; a named model with no clip input is swapped for it and the result says so.',\n },\n params: PARAMS_JSON_SCHEMA,\n image_urls: {\n type: 'array',\n items: { type: 'string', format: 'uri' },\n description:\n 'Multiple reference image URLs for models that accept a reference set (character + wardrobe + location, for example). Single-reference models use the first and ignore the rest.',\n },\n image_paths: {\n type: 'array',\n items: { type: 'string' },\n description:\n 'Multiple absolute local file paths (JPEG, PNG, WebP, GIF, MP4, WebM, MOV), each uploaded to 24h temp storage and used as a reference, same rules as image_urls.',\n },\n image_path: {\n type: 'string',\n description:\n 'Absolute local file path to a reference image or clip (JPEG, PNG, WebP, GIF, MP4, WebM, MOV; no audio). The skill uploads it to 24h temp storage and uses the URL as image_url. Ignored when image_url is also set.',\n },\n },\n required: ['prompt'],\n} as const;\n\n/** What the caller actually handed us, split by media kind. Mirrors\n * sourceMedia() in the app's lib/agent/skills.ts.\n *\n * `video_url` is the explicit clip slot: an extension is all `isVideoUrl`\n * has to go on, so a signed or extensionless CDN link to an mp4 read as a\n * still and routed to a stills-only engine. A clip dropped into `image_url`\n * (every pre-video_url caller, and the habit of most LLMs) is still caught\n * by the extension check.\n *\n * Audio is NEITHER a frame nor a clip and must never ride into a reference-\n * image field, so it is split out here rather than left in the stills bag. */\ninterface SourceMedia {\n /** The single source frame or clip, if any. */\n url?: string;\n isClip: boolean;\n audioUrl?: string;\n /** Every still reference, in order, for models with an array slot. */\n stills: string[];\n}\n\nfunction sourceMedia(videoUrl: string | undefined, referenceUrls: string[]): SourceMedia {\n const clip = videoUrl && !isAudioUrl(videoUrl) ? videoUrl : undefined;\n const stills = referenceUrls.filter((u) => !isAudioUrl(u));\n const url = clip ?? stills[0];\n return {\n url,\n isClip: Boolean(clip) || (!!url && isVideoUrl(url)),\n audioUrl: [videoUrl, ...referenceUrls].find((u) => u && isAudioUrl(u)),\n stills,\n };\n}\n\n/**\n * Per-model param adapter. Agents only ever give us a generic\n * { image_url, video_url, duration, resolution }; each model declares its own\n * field names and schemas strip unknown keys, so a verbatim `image_url` is\n * silently dropped and the model then 400s naming a field the agent had no\n * way to set — an unrecoverable loop. `slot` is resolved from the model's\n * declared `media` block, falling back to its REAL schema (see\n * resolveMediaSlot), which is how the reference-driven video engines —\n * seedance-2-reference (reference_images / reference_videos /\n * reference_audios), grok-r2v / wan-reference-to-video / happyhorse-1.0-r2v\n * (reference_urls), kling-reference-to-video (start_image_url, or video_url\n * + reference_type='video' for a clip) — become reachable without a\n * per-model switch here.\n *\n * The video-edit / video-extend tools stay explicit: they also remap\n * duration → video_duration, which no schema lookup can infer.\n */\nfunction buildPayload(\n apiId: string,\n input: Input,\n src: SourceMedia,\n slot: ReferenceField | null | undefined,\n audioSlot: ReferenceField | null | undefined,\n): { prompt: string; [key: string]: unknown } {\n const body: { prompt: string; [key: string]: unknown } = { prompt: input.prompt };\n if (input.aspect_ratio) body.aspect_ratio = input.aspect_ratio;\n if (input.preset) body.preset = input.preset;\n\n switch (apiId) {\n case 'grok-video-extend':\n case 'wan-video-edit':\n case 'seedance-video-edit':\n // Video-input tools expect video_url / video_duration. Pass both shapes\n // so we work even if a model's schema later accepts the image_url alias.\n if (src.url) {\n body.video_url = src.url;\n body.image_url = src.url;\n }\n if (input.duration !== undefined) {\n body.video_duration = input.duration;\n body.duration = input.duration;\n }\n break;\n default:\n if (src.url) {\n // slot undefined (schema fetch failed) or null (model declares no\n // slot for this kind) → send image_url, i.e. exactly what we sent\n // before this adapter existed. No new failure mode on an unknown\n // schema. An array field takes every reference the caller gave; a\n // scalar takes the first, because there is nowhere honest to put the\n // rest — and a clip is one thing, so it never brings the stills bag.\n const refs = src.isClip ? [src.url] : src.stills.length > 0 ? src.stills : [src.url];\n if (slot) {\n body[slot.name] = slot.isArray ? refs : refs[0];\n // `also` is the part no key-name search could find: kling's\n // reference_type='video' is what selects the provider's clip\n // endpoint, so the url alone lands on the still path.\n if (slot.also) Object.assign(body, slot.also);\n } else {\n body.image_url = refs[0];\n }\n }\n // A track only ever goes in a declared audio slot. No fallback: a model\n // with none must DROP it rather than fall through to image_url, which\n // is exactly how an mp3 reached the provider as \"content-type:\n // audio/mpeg\" — after the credit deduction.\n if (src.audioUrl && audioSlot) {\n body[audioSlot.name] = audioSlot.isArray ? [src.audioUrl] : src.audioUrl;\n if (audioSlot.also) Object.assign(body, audioSlot.also);\n }\n if (input.duration !== undefined) body.duration = input.duration;\n if (input.resolution) body.resolution = input.resolution;\n break;\n }\n\n return body;\n}\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n // Ask rather than guess: the same key means different things on different\n // models, so settings with nobody to attach them to are refused, not\n // applied to whatever the skill would have picked.\n const paramsGate = paramsWithoutModel(input.params, input.model);\n if (paramsGate) return { kind: 'text', text: paramsGate };\n\n // If the caller passed a local file path, upload it first and treat the\n // resulting URL as image_url for the rest of the dispatch. Explicit\n // image_url wins if both are set (path is for \"I only have a file\").\n let resolved: Input = input;\n // Every reference the caller gave us, in order, singular first. Local paths\n // upload to 24h temp storage and join the list as URLs. image_url stays the\n // head of the list so single-reference models keep their old behaviour.\n let referenceUrls: string[] = [];\n try {\n const singleUrl =\n input.image_url ?? (input.image_path ? await uploadLocalFile(input.image_path, ctx) : undefined);\n const manyUrls = [...(input.image_urls ?? [])];\n for (const p of input.image_paths ?? []) {\n manyUrls.push(await uploadLocalFile(p, ctx));\n }\n referenceUrls = [...(singleUrl ? [singleUrl] : []), ...manyUrls].filter(\n (u, i, all) => all.indexOf(u) === i,\n );\n if (referenceUrls[0] && referenceUrls[0] !== input.image_url) {\n resolved = { ...input, image_url: referenceUrls[0] };\n }\n } catch (err) {\n if (err instanceof SkillUploadError) {\n return { kind: 'text', text: `pixeldojo_generate (upload): ${err.userMessage}` };\n }\n throw err;\n }\n\n const src = sourceMedia(input.video_url, referenceUrls);\n\n // Route the source to a model that can actually read it. A clip or a track\n // with no model named can only go to the one engine that takes either —\n // the same pick the in-app agent makes. A NAMED model gets the same\n // treatment when we can PROVE it has no clip slot: nothing downstream would\n // catch it (an image-to-video capability check is satisfied by every\n // stills-only i2v model), so the mp4 went out as a reference IMAGE and the\n // provider killed the job. Substitute and say so, rather than dead-end.\n //\n // `=== null` and not `!slot` on purpose: undefined means the schema fetch\n // failed, and substituting on a network blip would swap the caller's model\n // AND print a note claiming it can't do something it can.\n let apiId = input.model ?? DEFAULT_MODEL;\n let routeNote: string | undefined;\n if ((src.isClip || src.audioUrl) && !VIDEO_INPUT_MODELS.has(apiId)) {\n if (!input.model) {\n apiId = VIDEO_REFERENCE_MODEL;\n } else if (\n src.isClip &&\n (await resolveMediaSlot(input.model, 'video', ctx.client)) === null\n ) {\n apiId = VIDEO_REFERENCE_MODEL;\n routeNote = `${input.model} can't work from a video clip, so I used ${VIDEO_REFERENCE_MODEL} instead.`;\n }\n }\n\n // Required-field validation for video-extend (the only model with hard\n // per-call requirements above prompt). Without this the request reaches\n // the backend and returns `video_url: Required, video_duration: Required`,\n // which loops agents that don't know to retry with different keys.\n if (apiId === 'grok-video-extend') {\n if (!src.url) {\n return {\n kind: 'text',\n text:\n 'pixeldojo_generate with model=\"grok-video-extend\" requires video_url ' +\n '(the source video URL to extend, or image_path for a local file).',\n };\n }\n if (resolved.duration === undefined) {\n return {\n kind: 'text',\n text:\n 'pixeldojo_generate with model=\"grok-video-extend\" requires duration ' +\n '(extension length in seconds).',\n };\n }\n }\n\n let refField: ReferenceField | null | undefined;\n let audioSlot: ReferenceField | null | undefined;\n if (!VIDEO_INPUT_MODELS.has(apiId)) {\n // One schema fetch, shared by all five lookups (schema-snap caches the\n // in-flight promise per apiId).\n const [aspect_ratio, duration, resolution, ref, audio] = await Promise.all([\n snapAspectRatio(apiId, resolved.aspect_ratio, ctx.client),\n snapDuration(apiId, resolved.duration, ctx.client),\n snapResolution(apiId, resolved.resolution, ctx.client),\n src.url\n ? resolveMediaSlot(apiId, src.isClip ? 'video' : 'image', ctx.client)\n : Promise.resolve(undefined),\n src.audioUrl ? resolveMediaSlot(apiId, 'audio', ctx.client) : Promise.resolve(undefined),\n ]);\n resolved = { ...resolved, aspect_ratio, duration, resolution };\n // The engine every no-model clip/track routes to has static slots, so a\n // schema-fetch outage still files a clip under reference_videos instead\n // of image_url — which the provider rejects after the credit deduction.\n // Only `undefined` (fetch failed) falls back: a fetched `null` is a real\n // answer and must stay one.\n refField = ref === undefined && src.url ? fallbackSlot(apiId, src.isClip ? 'video' : 'image') : ref;\n audioSlot = audio === undefined && src.audioUrl ? fallbackSlot(apiId, 'audio') : audio;\n }\n\n const body = buildPayload(apiId, resolved, src, refField, audioSlot);\n const paramsNote = applyParams(body, input.params, input.model, apiId);\n const note = [routeNote, paramsNote].filter(Boolean).join(' ');\n\n const submitted = await ctx.client.run(apiId, body);\n\n const result = await pollJobUntilDoneOrHandoff(\n submitted.jobId,\n (id) => ctx.client.getJob(id),\n ctx.buildStatusUrl,\n {\n now: ctx.pollOverrides?.now,\n sleep: ctx.pollOverrides?.sleep,\n },\n );\n\n return prefixNote(\n pollResultToSkillResult(result, (urls) =>\n urls.length === 0\n ? `Job ${submitted.jobId} completed but returned no assets.`\n : urls.length === 1\n ? `Generated. Asset: ${urls[0]}`\n : `Generated ${urls.length} assets. URLs: ${urls.join(', ')}`,\n ),\n note,\n );\n}\n\nexport const generateSkill: SkillModule<Input> = {\n name: 'pixeldojo_generate',\n description:\n 'Generate an image or video from a prompt with any model in the PixelDojo catalog. With no `model`, a prompt runs on seedream-5, which makes still images only. For a video, name seedance-2-5, which works from a prompt alone or a starting image. If a provider refuses the content, retry once on wan-3-0-video (video) or seedream-5 (images), the least-restricted models. For a multi-shot film or a music video synced to a song use pixeldojo_film; to change, move or extend an existing clip use pixeldojo_video. These are the models the PixelDojo studios use; name another only when the user asks for it. References: `image_url`/`image_urls` for stills, `video_url` for a source clip, `image_path`/`image_paths` for absolute local files (uploaded to 24h temp storage first). A clip or an audio track URL with no `model` runs on seedance-2-reference; a named model that cannot read a clip is swapped for it and the result says so, while a named model with no audio input drops the track. Model-specific settings go in `params` alongside an explicit `model`. Returns asset URLs, or a jobId for pixeldojo_status when the job outlasts the 30s wait.',\n hostedDescription:\n 'Generate an image or video from a prompt with any model in the PixelDojo catalog. With no `model`, a prompt runs on seedream-5, which makes still images only. For a video, name seedance-2-5, which works from a prompt alone or a starting image. If a provider refuses the content, retry once on wan-3-0-video (video) or seedream-5 (images), the least-restricted models. For a multi-shot film or a music video synced to a song use pixeldojo_film; to change, move or extend an existing clip use pixeldojo_video. These are the models the PixelDojo studios use; name another only when the user asks for it. References: `image_url`/`image_urls` for stills and `video_url` for a source clip, all public http(s) URLs. A clip or an audio track URL with no `model` runs on seedance-2-reference; a named model that cannot read a clip is swapped for it and the result says so, while a named model with no audio input drops the track. Model-specific settings go in `params` alongside an explicit `model`. Returns asset URLs, or a jobId for pixeldojo_status when the job outlasts the 30s wait.',\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n allowedModels: null,\n defaultModel: DEFAULT_MODEL,\n run,\n};\n","/**\n * pixeldojo_edit — instruction-based image editing.\n *\n * Default routing: wan-2.7-image-edit (top Canvas edit model). Users can\n * override `model` from the edit-capable whitelist. Each model has slightly\n * different payload shape (image_urls vs image vs images, size vs\n * aspect_ratio), so the skill normalizes the user-facing input into the\n * model-specific body via a small adapter map.\n */\nimport { z } from 'zod';\nimport { pollJobUntilDoneOrHandoff } from '../poll.js';\nimport {\n type SkillContext,\n type SkillModule,\n type SkillResult,\n pollResultToSkillResult,\n} from './types.js';\nimport {\n SkillUploadError,\n uploadLocalFile,\n uploadLocalFiles,\n} from './upload-helpers.js';\nimport { resolveImageRefs, snapAspectRatio } from './schema-snap.js';\nimport {\n PARAMS_JSON_SCHEMA,\n ParamsInput,\n applyParams,\n paramsWithoutModel,\n prefixNote,\n} from './params.js';\n\nconst DEFAULT_MODEL = 'wan-2.7-image-edit';\n\nconst ALLOWED_MODELS = [\n 'wan-2.7-image-edit',\n 'wan-2.6-image-edit',\n 'flux-edit',\n 'xai-image-edit',\n 'p-image-edit',\n 'gpt-image-2-edit',\n 'google-nano-banana',\n] as const;\n\nconst InputSchema = z.object({\n prompt: z.string().min(1).max(5000).describe('Edit instruction.'),\n image_url: z\n .string()\n .url()\n .optional()\n .describe('Single reference image to edit. Pass image_urls for multi-image edits.'),\n image_urls: z\n .array(z.string().url())\n .min(1)\n .max(9)\n .optional()\n .describe('Multiple reference images (1-9). Used for composition/multi-ref edits.'),\n image_path: z\n .string()\n .min(1)\n .optional()\n .describe(\n 'Absolute local file path. Skill uploads it (24h temp storage) and edits it. Prefer over image_url when the user has the file on disk.',\n ),\n image_paths: z\n .array(z.string().min(1))\n .min(1)\n .max(9)\n .optional()\n .describe(\n 'Multiple absolute local file paths (1-9) for multi-image edits. Each uploaded to 24h temp storage before dispatch.',\n ),\n model: z\n .enum(ALLOWED_MODELS)\n .optional()\n .describe(\n 'Override the default edit model. Defaults to wan-2.7-image-edit (most popular).',\n ),\n aspect_ratio: z\n .string()\n .optional()\n .describe('Aspect ratio when supported (e.g. \"1:1\", \"16:9\", \"match_input_image\").'),\n params: ParamsInput,\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n prompt: { type: 'string', description: 'Edit instruction. Write @Name to use a character or element the user saved in Character Studio (\"@Mara on a beach\"): its photos are attached automatically on models that take reference images. pixeldojo_library source=characters lists them.' },\n image_url: {\n type: 'string',\n format: 'uri',\n description: 'Single image to edit. Ignored when image_urls is set; pass image_urls for multi-image edits.',\n },\n image_urls: {\n type: 'array',\n items: { type: 'string', format: 'uri' },\n minItems: 1,\n maxItems: 9,\n description:\n 'Multiple reference images (1-9), most important first. Models that take fewer keep the first ones and the result says how many were dropped.',\n },\n image_path: {\n type: 'string',\n description:\n 'Absolute local image path (JPEG, PNG, WebP, GIF). Skill uploads it (24h temp storage) and edits the resulting URL. Ignored when image_url or image_paths is set.',\n },\n image_paths: {\n type: 'array',\n items: { type: 'string' },\n minItems: 1,\n maxItems: 9,\n description:\n 'Multiple absolute local image paths (1-9). Each is uploaded to 24h temp storage and appended after any image_urls.',\n },\n model: {\n type: 'string',\n enum: [...ALLOWED_MODELS],\n description: 'Override edit model. Default: wan-2.7-image-edit.',\n },\n aspect_ratio: {\n type: 'string',\n description:\n 'Output aspect ratio, e.g. \"1:1\", \"16:9\", \"match_input_image\". Snapped to the nearest ratio the model supports, and dropped if the model has no aspect_ratio field.',\n },\n params: PARAMS_JSON_SCHEMA,\n },\n required: ['prompt'],\n} as const;\n\n/** OFFLINE FALLBACK ONLY — used when GET /schema is unreachable.\n *\n * This used to be the primary path and it was wrong for half the\n * allowlist: flux-edit got `image_url` when its schema requires\n * `input_image_1` (every flux-edit call failed), gpt-image-2-edit got\n * `image_url` when it only takes `image_urls` (single-image edits failed\n * while 2-8 worked), and nothing clamped to maxItems. buildBody now asks\n * the model's published schema first; this map is the last resort when we\n * cannot reach it, so its entries are best-effort. */\nfunction buildPayload(\n apiId: string,\n input: Input,\n): { prompt: string; [key: string]: unknown } {\n const urls = input.image_urls && input.image_urls.length > 0\n ? input.image_urls\n : input.image_url\n ? [input.image_url]\n : [];\n\n switch (apiId) {\n case 'wan-2.7-image-edit':\n case 'wan-2.6-image-edit':\n return {\n prompt: input.prompt,\n image_urls: urls,\n // wan-edit uses `size` not aspect_ratio. Default 2K, let model defaults handle it otherwise.\n };\n case 'p-image-edit':\n return {\n prompt: input.prompt,\n images: urls.slice(0, 5),\n ...(input.aspect_ratio ? { aspect_ratio: input.aspect_ratio } : {}),\n };\n case 'flux-edit':\n // Schema keys the reference as input_image_1 (legacy alias:\n // input_image). `image_url` is not a field it has.\n return {\n prompt: input.prompt,\n input_image_1: urls[0],\n ...(input.aspect_ratio ? { aspect_ratio: input.aspect_ratio } : {}),\n };\n case 'gpt-image-2-edit':\n // image_urls only, min 1 max 8 — never image_url.\n return {\n prompt: input.prompt,\n image_urls: urls.slice(0, 8),\n ...(input.aspect_ratio ? { aspect_ratio: input.aspect_ratio } : {}),\n };\n case 'xai-image-edit':\n return {\n prompt: input.prompt,\n image_url: urls[0],\n ...(input.aspect_ratio ? { aspect_ratio: input.aspect_ratio } : {}),\n };\n case 'google-nano-banana':\n // Nano Banana accepts image_input as an array of URLs.\n return {\n prompt: input.prompt,\n image_input: urls,\n ...(input.aspect_ratio ? { aspect_ratio: input.aspect_ratio } : {}),\n };\n default:\n return {\n prompt: input.prompt,\n image_url: urls[0],\n };\n }\n}\n\n/** Build the request body, asking the model's published schema where its\n * reference images go and how many it takes. Falls back to the static map\n * above only when the schema is unreachable. */\nasync function buildBody(\n apiId: string,\n input: Input,\n ctx: SkillContext,\n): Promise<{ body: { prompt: string; [key: string]: unknown }; dropped: number }> {\n const urls =\n input.image_urls && input.image_urls.length > 0\n ? input.image_urls\n : input.image_url\n ? [input.image_url]\n : [];\n\n const refs = await resolveImageRefs(apiId, urls, ctx.client);\n if (!refs) return { body: buildPayload(apiId, input), dropped: 0 };\n\n const fallback = buildPayload(apiId, input);\n const body: { prompt: string; [key: string]: unknown } = { ...fallback };\n // Drop whatever key the fallback guessed; the declaration/schema is\n // authoritative.\n for (const key of ['image_url', 'image_urls', 'images', 'image_input', 'input_image_1']) {\n if (key !== refs.key) delete body[key];\n }\n body.prompt = input.prompt;\n body[refs.key] = refs.value;\n if (refs.also) Object.assign(body, refs.also);\n return { body, dropped: refs.dropped };\n}\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n const paramsGate = paramsWithoutModel(input.params, input.model);\n if (paramsGate) return { kind: 'text', text: paramsGate };\n\n // Resolve any local paths into URLs first. image_paths takes precedence\n // over image_path; both merge into the URL list the buildPayload step\n // already understands. Explicit URLs always win — paths are a fallback\n // for \"I only have a local file.\"\n let resolved: Input = input;\n try {\n if (input.image_paths && input.image_paths.length > 0) {\n const urls = await uploadLocalFiles(input.image_paths, ctx);\n resolved = {\n ...input,\n image_urls: [...(input.image_urls ?? []), ...urls],\n };\n } else if (input.image_path && !input.image_url) {\n const url = await uploadLocalFile(input.image_path, ctx);\n resolved = { ...input, image_url: url };\n }\n } catch (err) {\n if (err instanceof SkillUploadError) {\n return { kind: 'text', text: `pixeldojo_edit (upload): ${err.userMessage}` };\n }\n throw err;\n }\n\n if (\n !resolved.image_url &&\n (!resolved.image_urls || resolved.image_urls.length === 0)\n ) {\n return {\n kind: 'text',\n text:\n 'pixeldojo_edit requires at least one reference image. Pass image_url / image_urls (hosted URL) or image_path / image_paths (local file).',\n };\n }\n\n const apiId = resolved.model ?? DEFAULT_MODEL;\n resolved = {\n ...resolved,\n aspect_ratio: await snapAspectRatio(apiId, resolved.aspect_ratio, ctx.client),\n };\n const { body, dropped } = await buildBody(apiId, resolved, ctx);\n const droppedNote =\n dropped > 0\n ? ` (${dropped} reference${dropped === 1 ? '' : 's'} dropped — ${apiId} accepts fewer)`\n : '';\n const paramsNote = applyParams(body, input.params, input.model, apiId);\n\n const submitted = await ctx.client.run(apiId, body);\n const result = await pollJobUntilDoneOrHandoff(\n submitted.jobId,\n (id) => ctx.client.getJob(id),\n ctx.buildStatusUrl,\n {\n now: ctx.pollOverrides?.now,\n sleep: ctx.pollOverrides?.sleep,\n },\n );\n\n return prefixNote(\n pollResultToSkillResult(result, (urls) =>\n urls.length === 0\n ? `Edit job ${submitted.jobId} completed but returned no assets.`\n : urls.length === 1\n ? `Edit complete${droppedNote}. Asset: ${urls[0]}`\n : `Edit produced ${urls.length} assets${droppedNote}. URLs: ${urls.join(', ')}`,\n ),\n paramsNote,\n );\n}\n\nexport const editSkill: SkillModule<Input> = {\n name: 'pixeldojo_edit',\n description:\n 'Edit an existing image with a text instruction. Defaults to wan-2.7-image-edit; pass `model` to pick another edit-capable apiId. Supports up to 9 reference images for multi-image composition. For reference images: pass image_url(s) for hosted URLs or image_path(s) for absolute local file paths (skill uploads to 24h temp storage automatically).',\n hostedDescription:\n 'Edit an existing image with a text instruction. Defaults to wan-2.7-image-edit; pass `model` to pick another edit-capable apiId. Supports up to 9 reference images for multi-image composition. Pass reference images as public http(s) URLs via image_url or image_urls.',\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n allowedModels: [...ALLOWED_MODELS],\n defaultModel: DEFAULT_MODEL,\n run,\n};\n","/**\n * pixeldojo_character — consistent characters across shots.\n *\n * The whitelist MIRRORS `AGENT_CHARACTER_MODELS` in the app's\n * lib/agent/roster.ts — Character Studio's roster, which is the list that was\n * actually verified for likeness retention. This package publishes to npm\n * standalone and cannot import from the app, so the array below is a copy;\n * the app's tests/contracts/mcp-character-roster-parity.test.ts fails if the\n * two drift. That drift is not hypothetical: flux-edit and gpt-image-2-edit\n * sat here for months after the agent dropped them (\"never identity models\"),\n * so MCP callers were routed to models that cannot lock a face.\n *\n * ideogram-character is deliberately NOT offered: its tool schema requires\n * a field named `character_reference_image` (singular) that none of this\n * skill's request shapes produce, so every call to it failed with\n * \"character_reference_image: Required\" — confirmed via a live test sweep\n * 2026-07-08, never caught before because nothing exercised the reference-\n * image path end-to-end.\n */\nimport { z } from 'zod';\nimport { pollJobUntilDoneOrHandoff } from '../poll.js';\nimport {\n type SkillContext,\n type SkillModule,\n type SkillResult,\n pollResultToSkillResult,\n} from './types.js';\nimport { isAudioUrl, isVideoUrl, resolveImageRefs, snapAspectRatio } from './schema-snap.js';\nimport {\n PARAMS_JSON_SCHEMA,\n ParamsInput,\n applyParams,\n paramsWithoutModel,\n prefixNote,\n} from './params.js';\n\nconst ALLOWED = [\n 'seedream-5',\n 'seedream-4',\n 'seedream-5-flash',\n 'google-nano-banana',\n 'wan-2.7-image-edit',\n 'qwen-3-pro',\n 'qwen-image-2.0-pro',\n] as const;\ntype AllowedModel = (typeof ALLOWED)[number];\nconst DEFAULT_MODEL: AllowedModel = 'seedream-5';\n\n/** The agent's own cap on reference images. More angles of the same person\n * lock a face far better than one photo; models with a smaller schema cap\n * get clamped to it by resolveImageRefs, which reads maxItems. */\nconst MAX_REFERENCES = 9;\n\n// wan-2.7-image-edit is an edit model — its schema requires image_urls\n// (min 1), unlike the rest of the roster which can generate from a prompt\n// alone. Without this gate the request reaches the backend and is rejected\n// downstream (\"image_urls: Array must contain at least 1 element(s)\"), which\n// loops agents that retry without realizing the input was the issue.\nconst REQUIRES_REFERENCE = new Set<AllowedModel>(['wan-2.7-image-edit']);\n\n/** OFFLINE FALLBACK ONLY — where each roster model keys its references when\n * GET /schema is unreachable. Copied from each tool.config's `media.image`\n * declaration, which is what resolveImageRefs returns when it CAN reach the\n * endpoint. All are array fields. */\nconst FALLBACK_REF_KEY: Record<AllowedModel, string> = {\n 'seedream-5': 'image_urls',\n 'seedream-4': 'image_urls',\n 'seedream-5-flash': 'image_urls',\n 'google-nano-banana': 'image_input',\n 'wan-2.7-image-edit': 'image_urls',\n 'qwen-3-pro': 'image',\n 'qwen-image-2.0-pro': 'reference_images',\n};\n\nconst InputSchema = z.object({\n prompt: z.string().min(1).max(8000),\n model: z\n .string()\n .optional()\n .describe(`One of: ${ALLOWED.join(', ')}. Defaults to ${DEFAULT_MODEL}.`),\n reference_image_url: z\n .string()\n .url()\n .optional()\n .describe(\n 'Single reference image of the character. Prefer reference_image_urls — more angles lock the face better.',\n ),\n reference_image_urls: z\n .array(z.string().url())\n .min(1)\n .max(MAX_REFERENCES)\n .optional()\n .describe(\n `All references for this shot (1-${MAX_REFERENCES}), most important first. Multiple angles of the same person lock the face far better than one photo. Models that take fewer are clamped to their own cap.`,\n ),\n aspect_ratio: z.string().optional().describe('Honored where the model declares the field.'),\n params: ParamsInput,\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n prompt: { type: 'string', description: 'The shot to render: scene, pose, wardrobe, framing. The references supply the identity.' },\n model: {\n type: 'string',\n enum: ALLOWED,\n description: `One of: ${ALLOWED.join(', ')}. Defaults to ${DEFAULT_MODEL}.`,\n },\n reference_image_url: {\n type: 'string',\n format: 'uri',\n description:\n 'Single still of the character. Ignored when reference_image_urls is set; prefer that, since more angles lock the face better.',\n },\n reference_image_urls: {\n type: 'array',\n items: { type: 'string', format: 'uri' },\n minItems: 1,\n maxItems: MAX_REFERENCES,\n description:\n 'All reference stills for this shot (1-9), most important first. Multiple angles of the same person lock the face far better than one photo. Models that take fewer keep the first ones and the result says how many were dropped. Required for wan-2.7-image-edit; clips and audio are refused.',\n },\n aspect_ratio: {\n type: 'string',\n description:\n 'e.g. \"1:1\", \"16:9\", \"9:16\". Snapped to the nearest ratio the model supports, and dropped for models with no aspect_ratio field (including the default seedream-5, which sizes by image_size: set that in params with an explicit model).',\n },\n params: PARAMS_JSON_SCHEMA,\n },\n required: ['prompt'],\n} as const;\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n const paramsGate = paramsWithoutModel(input.params, input.model);\n if (paramsGate) return { kind: 'text', text: paramsGate };\n\n const requested = (input.model ?? DEFAULT_MODEL) as string;\n if (!(ALLOWED as readonly string[]).includes(requested)) {\n return {\n kind: 'text',\n text:\n `Unknown model \"${requested}\" for pixeldojo_character. ` +\n `Allowed: ${ALLOWED.join(', ')}.`,\n };\n }\n const apiId = requested as AllowedModel;\n\n const refUrls = (\n input.reference_image_urls && input.reference_image_urls.length > 0\n ? input.reference_image_urls\n : input.reference_image_url\n ? [input.reference_image_url]\n : []\n ).filter((u, i, all) => all.indexOf(u) === i);\n\n // Identity work is still-image work. A clip or a track handed to any model\n // on this roster dies at the PROVIDER (\"does not point to a valid image …\n // content-type: video/mp4\"), after the credit deduction, and its rejection\n // tells the caller nothing about where that file could have gone.\n const wrongKind = refUrls.find((u) => isVideoUrl(u) || isAudioUrl(u));\n if (wrongKind) {\n return {\n kind: 'text',\n text:\n `pixeldojo_character works on still images, and ${wrongKind} is not one. ` +\n `Use pixeldojo_generate or pixeldojo_storyboard with video_url to work from a clip ` +\n `(or image_url for an audio track — they route to the reference engine). ` +\n `For this treatment, give me a still frame.`,\n };\n }\n\n if (REQUIRES_REFERENCE.has(apiId) && refUrls.length === 0) {\n return {\n kind: 'text',\n text:\n `pixeldojo_character with model=\"${apiId}\" requires a reference image ` +\n `(reference_image_url / reference_image_urls — the source image of the character to edit). ` +\n `For generation from a prompt alone, use model=\"${DEFAULT_MODEL}\".`,\n };\n }\n\n const body: { prompt: string; [key: string]: unknown } = { prompt: input.prompt };\n let dropped = 0;\n if (refUrls.length > 0) {\n // Where the references go comes from the model's DECLARED media slot,\n // falling back to its published schema, falling back to the static map.\n // The old hardcoded per-model switch is what let flux-edit receive\n // `input_image` when its schema wants `input_image_1` — a wrong key is\n // silently stripped, so the user is billed for an image built from\n // nothing.\n const refs = await resolveImageRefs(apiId, refUrls, ctx.client);\n if (refs) {\n body[refs.key] = refs.value;\n if (refs.also) Object.assign(body, refs.also);\n dropped = refs.dropped;\n } else {\n body[FALLBACK_REF_KEY[apiId]] = refUrls;\n }\n }\n // seedream-5/seedream-4 key sizing on `image_size` instead of aspect_ratio\n // — snapAspectRatio confirms this from each model's real schema and omits\n // the field entirely for them, rather than relying on a hardcoded per-model\n // allowlist that can go stale. onUnknown 'omit': when the schema fetch\n // fails we must NOT forward aspect_ratio to models whose schemas never\n // declared it.\n const snappedAspect = await snapAspectRatio(apiId, input.aspect_ratio, ctx.client, {\n onUnknown: 'omit',\n });\n if (snappedAspect !== undefined) body.aspect_ratio = snappedAspect;\n\n const note = [\n dropped > 0\n ? `${dropped} reference${dropped === 1 ? '' : 's'} dropped — ${apiId} accepts fewer.`\n : undefined,\n applyParams(body, input.params, input.model, apiId),\n ]\n .filter(Boolean)\n .join(' ');\n\n const submitted = await ctx.client.run(apiId, body);\n\n const result = await pollJobUntilDoneOrHandoff(\n submitted.jobId,\n (id) => ctx.client.getJob(id),\n ctx.buildStatusUrl,\n {\n now: ctx.pollOverrides?.now,\n sleep: ctx.pollOverrides?.sleep,\n },\n );\n\n return prefixNote(\n pollResultToSkillResult(result, (urls) =>\n urls.length === 0\n ? `Job ${submitted.jobId} completed but returned no assets.`\n : `Character shot ready. Asset: ${urls[0]}`,\n ),\n note,\n );\n}\n\nexport const characterSkill: SkillModule<Input> = {\n name: 'pixeldojo_character',\n description:\n 'Generate or edit consistent characters across shots. Pass reference_image_urls (up to 9) to lock identity — send every photo of the person you have, since more angles hold the face far better than one. Defaults to seedream-5.',\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n allowedModels: [...ALLOWED],\n defaultModel: DEFAULT_MODEL,\n run,\n};\n","/**\n * pixeldojo_storyboard — multi-shot scenes from one brief.\n *\n * v1 implementation: dispatches a single video generation as the storyboard\n * \"preview\" frame. Full multi-shot orchestration (4+ shots stitched together)\n * is a future enhancement that needs LLM-driven shot decomposition; for now\n * the skill ships as a single-call surface so LLMs can issue it without\n * waiting on that pipeline.\n *\n * Whitelisted models: veo-3.1-fast (default), veo-3.1-standard,\n * kling-video-v3-standard-text, seedance-2-high, seedance-2-reference\n * (the reference engine — see run()).\n *\n * Reference flows (image_url / video_url) delegate to pixeldojo_generate\n * rather than duplicating its media routing; the allowlist and the brief\n * still belong to this skill.\n */\nimport { z } from 'zod';\nimport { pollJobUntilDoneOrHandoff } from '../poll.js';\nimport {\n type SkillContext,\n type SkillModule,\n type SkillResult,\n pollResultToSkillResult,\n} from './types.js';\nimport { snapAspectRatio, snapDuration } from './schema-snap.js';\nimport { VIDEO_REFERENCE_MODEL, generateSkill } from './generate.js';\nimport {\n PARAMS_JSON_SCHEMA,\n ParamsInput,\n applyParams,\n paramsWithoutModel,\n prefixNote,\n} from './params.js';\n\n// Bare family ids ('veo-3.1', 'kling-video', 'seedance-2') are grouping\n// constructs only — none is itself a runnable public apiId (all three\n// 404'd with \"Model '<id>' not found\", confirmed via a live test sweep\n// 2026-07-08). Real variants:\n// - veo-3.1-fast/-standard/-lite — -lite excluded (drops reference-image,\n// audio, 1:1-aspect support an agent caller may reasonably assume).\n// - kling-video splits into separate -text/-image apiIds (a `mode` field\n// baked into each variant's inputDefaults, not a runtime choice on one\n// shared id) — this v1 skill has no image input yet, so -text.\n// - seedance-2 splits into -high (general/default) and -reference\n// (dedicated image-conditioned variant) — same reasoning, -high.\n// Both -text/-high were live-tested end to end 2026-07-08: dispatched,\n// handed off past the 30s sync window, and completed with a real asset.\n// - seedance-2-reference is the reference engine: the only entry here that\n// reads a still, a clip OR an audio track, so every reference-bearing\n// storyboard with no model named goes to it (see run()).\nconst ALLOWED = [\n 'veo-3.1-fast',\n 'veo-3.1-standard',\n 'kling-video-v3-standard-text',\n 'seedance-2-high',\n VIDEO_REFERENCE_MODEL,\n] as const;\ntype AllowedModel = (typeof ALLOWED)[number];\nconst DEFAULT_MODEL: AllowedModel = 'veo-3.1-fast';\n\nconst InputSchema = z.object({\n brief: z.string().min(1).max(8000).describe('Storyboard brief: scene, shots, mood, action.'),\n model: z\n .string()\n .optional()\n .describe(`One of: ${ALLOWED.join(', ')}. Defaults to ${DEFAULT_MODEL}.`),\n aspect_ratio: z.string().optional(),\n duration: z.number().int().positive().optional(),\n image_url: z\n .string()\n .url()\n .optional()\n .describe('Reference still to build the shot from (character, product, location).'),\n video_url: z\n .string()\n .url()\n .optional()\n .describe('Source clip to work from. Use this for videos; image_url is for still frames.'),\n params: ParamsInput,\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n brief: {\n type: 'string',\n description: 'Scene brief: setting, action, camera, mood. Sent to the video model as its prompt.',\n },\n model: {\n type: 'string',\n enum: ALLOWED,\n description: `One of: ${ALLOWED.join(', ')}. Defaults to ${DEFAULT_MODEL}, or ${VIDEO_REFERENCE_MODEL} when image_url or video_url is given.`,\n },\n aspect_ratio: {\n type: 'string',\n description:\n 'e.g. \"16:9\", \"9:16\", \"1:1\". Snapped to the nearest ratio the model supports, and dropped if the model has no aspect_ratio field.',\n },\n duration: {\n type: 'integer',\n description: 'Clip length in seconds. Snapped or clamped to what the model allows.',\n },\n image_url: {\n type: 'string',\n format: 'uri',\n description:\n 'Reference still to build the shot from (character, product, location). A clip or audio URL here is detected by extension and routed as that kind of media.',\n },\n video_url: {\n type: 'string',\n format: 'uri',\n description:\n 'Source clip to work from. Use this for videos; image_url is for stills. A named model with no clip input is swapped for seedance-2-reference and the result says so.',\n },\n params: PARAMS_JSON_SCHEMA,\n },\n required: ['brief'],\n} as const;\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n const paramsGate = paramsWithoutModel(input.params, input.model);\n if (paramsGate) return { kind: 'text', text: paramsGate };\n\n const requested = (input.model ?? DEFAULT_MODEL) as string;\n if (!(ALLOWED as readonly string[]).includes(requested)) {\n return {\n kind: 'text',\n text:\n `Unknown model \"${requested}\" for pixeldojo_storyboard. ` +\n `Allowed: ${ALLOWED.join(', ')}.`,\n };\n }\n\n // A reference-bearing storyboard is exactly what pixeldojo_generate already\n // does: media-kind detection, declared media slots, the clip-engine\n // substitution note, and the params overlay. Delegate instead of growing a\n // second copy of that here — this skill's own job is the brief and the\n // video-model allowlist, both of which still apply above.\n //\n // The unnamed-model default flips to the reference engine rather than\n // generate's text-to-image default: a storyboard shot is a video, and the\n // reference engine is the one entry that reads a still, a clip or a track.\n // Params can't leak onto it unasked — the gate above refuses them without\n // an explicit model.\n if (input.image_url || input.video_url) {\n return generateSkill.run(\n {\n prompt: input.brief,\n model: input.model ?? VIDEO_REFERENCE_MODEL,\n image_url: input.image_url,\n video_url: input.video_url,\n aspect_ratio: input.aspect_ratio,\n duration: input.duration,\n params: input.params,\n },\n ctx,\n );\n }\n\n const apiId = requested as AllowedModel;\n\n const [snappedAspect, snappedDuration] = await Promise.all([\n snapAspectRatio(apiId, input.aspect_ratio, ctx.client),\n snapDuration(apiId, input.duration, ctx.client),\n ]);\n const body: { prompt: string; [key: string]: unknown } = { prompt: input.brief };\n if (snappedAspect !== undefined) body.aspect_ratio = snappedAspect;\n if (snappedDuration !== undefined) body.duration = snappedDuration;\n const note = applyParams(body, input.params, input.model, apiId);\n\n const submitted = await ctx.client.run(apiId, body);\n\n const result = await pollJobUntilDoneOrHandoff(\n submitted.jobId,\n (id) => ctx.client.getJob(id),\n ctx.buildStatusUrl,\n {\n now: ctx.pollOverrides?.now,\n sleep: ctx.pollOverrides?.sleep,\n },\n );\n\n return prefixNote(\n pollResultToSkillResult(result, (urls) =>\n urls.length === 0\n ? `Job ${submitted.jobId} completed but returned no assets.`\n : `Storyboard preview ready. Asset: ${urls[0]}`,\n ),\n note,\n );\n}\n\nexport const storyboardSkill: SkillModule<Input> = {\n name: 'pixeldojo_storyboard',\n description:\n 'Generate one short video clip (a single shot, not a multi-panel storyboard) from a scene brief. A text-only brief runs on veo-3.1-fast unless `model` names another allowed video model. With image_url (reference still) or video_url (source clip) and no `model`, it runs on seedance-2-reference, with the same reference routing as pixeldojo_generate. For a multi-shot film with dialogue and a soundtrack, use pixeldojo_film.',\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n allowedModels: [...ALLOWED],\n defaultModel: DEFAULT_MODEL,\n run,\n};\n","/**\n * pixeldojo_upscale — enhance any image or video.\n *\n * Whitelisted models: magnific-upscaler (default), creative-upscale,\n * face-enhance, video-upscaler. The image models key the source on `image`\n * (NOT `image_url` — every one of those tool schemas uses `image`; sending\n * `image_url` previously 400'd with \"image: Required\" on every call,\n * confirmed via a live test sweep 2026-07-08). scale_factor also differs by\n * model: magnific wants a string enum ('2x'|'4x'|'8x'|'16x'), the others a\n * plain number — this skill takes a plain number from the caller and\n * converts per model. video-upscaler (FlashVSR) keys the clip on `video`\n * and requires `video_duration` (its credit meter); a clip auto-routes to\n * it when no model is named.\n */\nimport { z } from 'zod';\nimport { pollJobUntilDoneOrHandoff } from '../poll.js';\nimport {\n type SkillContext,\n type SkillModule,\n type SkillResult,\n pollResultToSkillResult,\n} from './types.js';\nimport { isVideoUrl } from './schema-snap.js';\n\nconst ALLOWED = ['magnific-upscaler', 'creative-upscale', 'face-enhance', 'video-upscaler'] as const;\ntype AllowedModel = (typeof ALLOWED)[number];\nconst DEFAULT_MODEL: AllowedModel = 'magnific-upscaler';\nconst VIDEO_MODEL: AllowedModel = 'video-upscaler';\n\nconst VIDEO_RESOLUTIONS = ['720p', '1080p', '2k', '4k'] as const;\n\nconst InputSchema = z.object({\n image_url: z.string().url().optional().describe('URL of the source image to upscale.'),\n video_url: z\n .string()\n .url()\n .optional()\n .describe('URL of a source video clip — routes to video-upscaler. MP4 only, max 500 MB.'),\n model: z\n .string()\n .optional()\n .describe(`One of: ${ALLOWED.join(', ')}. Defaults to ${DEFAULT_MODEL} (a clip defaults to ${VIDEO_MODEL}).`),\n scale_factor: z\n .number()\n .min(1)\n .max(16)\n .optional()\n .describe(\n 'Image models only. Magnific snaps to the nearest of 2/4/8/16 (default 2); creative-upscale accepts 1-10 (default 2); face-enhance accepts 1-8 (default 4).',\n ),\n creativity: z\n .number()\n .int()\n .min(-10)\n .max(10)\n .optional()\n .describe('Magnific only: integer -10 (preserve) → 10 (creative). Defaults to 0.'),\n video_duration: z\n .number()\n .positive()\n .optional()\n .describe('video-upscaler only, REQUIRED there: source clip length in seconds (its credit meter).'),\n target_resolution: z\n .enum(VIDEO_RESOLUTIONS)\n .optional()\n .describe('video-upscaler only: target output resolution. Defaults to 1080p.'),\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n image_url: {\n type: 'string',\n format: 'uri',\n description: 'Source image to upscale (image models). A clip URL here (.mp4/.mov/.webm) is treated as video_url.',\n },\n video_url: {\n type: 'string',\n format: 'uri',\n description: 'Source video clip (MP4, max 500 MB). Routes to video-upscaler when no model is named; needs video_duration.',\n },\n model: {\n type: 'string',\n enum: ALLOWED,\n description: `Defaults to ${DEFAULT_MODEL}, or ${VIDEO_MODEL} when the source is a clip. face-enhance is for portraits.`,\n },\n scale_factor: {\n type: 'number',\n minimum: 1,\n maximum: 16,\n description:\n 'Image models only. magnific-upscaler snaps to the nearest of 2/4/8/16 (default 2); creative-upscale clamps to 1-10 (default 2); face-enhance clamps to 1-8 (default 4).',\n },\n creativity: {\n type: 'integer',\n minimum: -10,\n maximum: 10,\n description: 'magnific-upscaler only: sent unchanged as its creativity setting, an integer from -10 to 10 (default 0; lower preserves the source, higher invents more detail).',\n },\n video_duration: {\n type: 'number',\n description: 'video-upscaler only, required there: source clip length in seconds. It sets the cost (1 credit per second).',\n },\n target_resolution: {\n type: 'string',\n enum: VIDEO_RESOLUTIONS,\n description: 'video-upscaler only: output resolution. Defaults to 1080p.',\n },\n },\n} as const;\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n // A clip in either slot (video_url, or an mp4 pasted into image_url — the\n // habit of most LLMs) means the video upscaler; no model named routes there\n // automatically rather than sending an mp4 to an image engine.\n const clipUrl =\n input.video_url ?? (input.image_url && isVideoUrl(input.image_url) ? input.image_url : undefined);\n const requested = (input.model ?? (clipUrl ? VIDEO_MODEL : DEFAULT_MODEL)) as string;\n if (!(ALLOWED as readonly string[]).includes(requested)) {\n return {\n kind: 'text',\n text: `Unknown model \"${requested}\" for pixeldojo_upscale. Allowed: ${ALLOWED.join(', ')}.`,\n };\n }\n const apiId = requested as AllowedModel;\n\n if (apiId === VIDEO_MODEL) {\n if (!clipUrl) {\n return {\n kind: 'text',\n text: 'pixeldojo_upscale with model=\"video-upscaler\" requires video_url (the source clip).',\n };\n }\n if (input.video_duration === undefined) {\n return {\n kind: 'text',\n text:\n 'pixeldojo_upscale with model=\"video-upscaler\" requires video_duration ' +\n '(source clip length in seconds — it sets the credit cost, 1 credit/second).',\n };\n }\n } else if (!input.image_url || input.image_url === clipUrl) {\n // Second clause: an explicitly-named image model whose only source is a\n // clip. Dispatching the mp4 dies at the provider AFTER the credit\n // deduction, so refuse with the correction instead.\n return {\n kind: 'text',\n text: input.image_url\n ? `${apiId} upscales still images, but the source is a video clip. Use model=\"video-upscaler\" with video_url and video_duration (seconds).`\n : `pixeldojo_upscale with model=\"${apiId}\" requires image_url (the source image).`,\n };\n }\n\n // Upscalers have no `prompt` field but the SDK's RunOptions requires one;\n // pass an empty string. Zod strips unrecognized keys by default (no\n // .passthrough() on any tool schema), so the extra field is silently\n // dropped for models that don't declare it.\n const body: { prompt: string; [key: string]: unknown } = {\n prompt: '',\n ...(apiId === VIDEO_MODEL ? { video: clipUrl } : { image: input.image_url }),\n };\n if (apiId === VIDEO_MODEL) {\n body.video_duration = input.video_duration;\n if (input.target_resolution) body.target_resolution = input.target_resolution;\n } else if (apiId === 'magnific-upscaler') {\n const allowed = [2, 4, 8, 16];\n const requestedScale = input.scale_factor ?? 2;\n const nearest = allowed.reduce((a, b) =>\n Math.abs(b - requestedScale) < Math.abs(a - requestedScale) ? b : a,\n );\n body.scale_factor = `${nearest}x`;\n if (input.creativity !== undefined) body.creativity = input.creativity;\n } else if (apiId === 'creative-upscale') {\n body.scale_factor = Math.min(10, Math.max(1, input.scale_factor ?? 2));\n } else if (apiId === 'face-enhance') {\n body.scale_factor = Math.min(8, Math.max(1, input.scale_factor ?? 4));\n }\n\n const submitted = await ctx.client.run(apiId, body);\n\n const result = await pollJobUntilDoneOrHandoff(\n submitted.jobId,\n (id) => ctx.client.getJob(id),\n ctx.buildStatusUrl,\n {\n now: ctx.pollOverrides?.now,\n sleep: ctx.pollOverrides?.sleep,\n },\n );\n\n return pollResultToSkillResult(result, (urls) =>\n urls.length === 0\n ? `Job ${submitted.jobId} completed but returned no assets.`\n : `Upscaled. Asset: ${urls[0]}`,\n );\n}\n\nexport const upscaleSkill: SkillModule<Input> = {\n name: 'pixeldojo_upscale',\n description:\n 'Enhance an image or video. Magnific (default) supports configurable scale_factor and creativity; face-enhance for portraits; video-upscaler (FlashVSR, up to 4K) for clips — pass video_url plus video_duration in seconds.',\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n allowedModels: [...ALLOWED],\n defaultModel: DEFAULT_MODEL,\n run,\n};\n","/**\n * pixeldojo_caption — burn animated word-by-word captions onto a video.\n *\n * One model, `video-autocaption`: it transcribes the speech and burns the\n * captions with the spoken word lit, placed clear of the TikTok/Reels/Shorts\n * buttons. A clip with no speech is refused before any charge.\n */\nimport { z } from 'zod';\nimport { pollJobUntilDoneOrHandoff } from '../poll.js';\nimport {\n type SkillContext,\n type SkillModule,\n type SkillResult,\n pollResultToSkillResult,\n} from './types.js';\n\nconst MODEL = 'video-autocaption';\nconst STYLES = ['pop', 'highlighter', 'clean'] as const;\n\nconst InputSchema = z.object({\n video_url: z.string().url().describe('URL of the video to caption. It must have speech.'),\n style: z.enum(STYLES).optional(),\n highlight_color: z.string().optional(),\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n required: ['video_url'],\n properties: {\n video_url: {\n type: 'string',\n format: 'uri',\n description: 'The video to caption (MP4 or MOV). It must have speech; a silent clip is refused uncharged.',\n },\n style: {\n type: 'string',\n enum: STYLES,\n description:\n 'pop (default): bold caps, the spoken word lit and growing. highlighter: the spoken word on a block of the color. clean: sentence case on a dark box.',\n },\n highlight_color: {\n type: 'string',\n description: 'The highlight as #RRGGBB (a brand color) or a name like yellow, green, pink. Defaults to yellow.',\n },\n },\n} as const;\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n // The SDK's RunOptions requires a prompt; the tool has none and its schema\n // strips the key.\n const submitted = await ctx.client.run(MODEL, {\n prompt: '',\n video: input.video_url,\n ...(input.style ? { caption_style: input.style } : {}),\n ...(input.highlight_color ? { highlight_color: input.highlight_color } : {}),\n });\n\n const result = await pollJobUntilDoneOrHandoff(\n submitted.jobId,\n (id) => ctx.client.getJob(id),\n ctx.buildStatusUrl,\n { now: ctx.pollOverrides?.now, sleep: ctx.pollOverrides?.sleep },\n );\n\n return pollResultToSkillResult(result, (urls) =>\n urls.length === 0\n ? `Job ${submitted.jobId} completed but returned no assets.`\n : `Captioned. Asset: ${urls[0]}`,\n );\n}\n\nexport const captionSkill: SkillModule<Input> = {\n name: 'pixeldojo_caption',\n description:\n 'Burn animated word-by-word captions onto a video with speech, the short-form look for TikTok, Reels and Shorts: the spoken word lights up, placed above the platform buttons. Pass video_url; optional style (pop, highlighter, clean) and highlight_color (#RRGGBB for a brand color). 5 credits.',\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n allowedModels: [MODEL],\n defaultModel: MODEL,\n run,\n};\n","/**\n * pixeldojo_overlay — short-form ad text layouts on a finished video.\n *\n * One model, `brand-overlay`: exact text (never a video model's spelling) in\n * the brand color, kept clear of the platform UI. Layouts: hook title (first\n * seconds), lower-third callout, review card, progress bar, countdown timer,\n * price tag, offer badge, and\n * an end card that holds the last frame under a logo, headline and button.\n */\nimport { z } from 'zod';\nimport { pollJobUntilDoneOrHandoff } from '../poll.js';\nimport {\n type SkillContext,\n type SkillModule,\n type SkillResult,\n pollResultToSkillResult,\n} from './types.js';\n\nconst MODEL = 'brand-overlay';\n\nconst InputSchema = z.object({\n video_url: z.string().url(),\n color: z.string().optional(),\n hook: z.object({ text: z.string().max(60), duration_sec: z.number().min(1).max(6).optional() }).optional(),\n callout: z\n .object({\n title: z.string().max(32),\n subtitle: z.string().max(40).optional(),\n start_sec: z.number().min(0).optional(),\n duration_sec: z.number().min(1).max(10).optional(),\n })\n .optional(),\n review: z\n .object({\n quote: z.string().max(90),\n name: z.string().max(30).optional(),\n stars: z.number().int().min(1).max(5).optional(),\n start_sec: z.number().min(0).optional(),\n duration_sec: z.number().min(1).max(10).optional(),\n })\n .optional(),\n progress_bar: z.boolean().optional(),\n countdown: z\n .object({\n from: z.string(),\n label: z.string().max(16).optional(),\n start_sec: z.number().min(0).optional(),\n duration_sec: z.number().min(1).max(10).optional(),\n })\n .optional(),\n price_tag: z\n .object({\n now: z.string().max(12),\n was: z.string().max(12).optional(),\n label: z.string().max(16).optional(),\n start_sec: z.number().min(0).optional(),\n duration_sec: z.number().min(1).max(10).optional(),\n })\n .optional(),\n offer: z\n .object({\n text: z.string().max(24),\n subtext: z.string().max(40).optional(),\n start_sec: z.number().min(0).optional(),\n duration_sec: z.number().min(1).max(10).optional(),\n position: z.enum(['top', 'bottom']).optional(),\n })\n .optional(),\n end_card: z\n .object({\n headline: z.string().max(40),\n cta: z.string().max(24).optional(),\n url: z.string().max(40).optional(),\n logo_url: z.string().url().optional(),\n duration_sec: z.number().min(2).max(5).optional(),\n })\n .optional(),\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n required: ['video_url'],\n properties: {\n video_url: { type: 'string', format: 'uri', description: 'The video to brand (MP4 or MOV).' },\n color: { type: 'string', description: 'Brand color as #RRGGBB: the badge and the button. Defaults to #FFE500.' },\n hook: {\n type: 'object',\n description: 'Hook title over the first seconds, the overlay that decides whether people keep watching. 5-8 words.',\n required: ['text'],\n properties: {\n text: { type: 'string', maxLength: 60, description: 'e.g. \"Octopuses have THREE hearts?\".' },\n duration_sec: { type: 'number', minimum: 1, maximum: 6, description: 'Default 2.5.' },\n },\n },\n callout: {\n type: 'object',\n description: 'Lower-third label that slides in from the left: a benefit (\"Ships in 24h\") or a name and title.',\n required: ['title'],\n properties: {\n title: { type: 'string', maxLength: 32, description: 'The label.' },\n subtitle: { type: 'string', maxLength: 40, description: 'Optional second line.' },\n start_sec: { type: 'number', description: 'Default 3.' },\n duration_sec: { type: 'number', minimum: 1, maximum: 10, description: 'Default 4.' },\n },\n },\n review: {\n type: 'object',\n description: 'Review card: stars, a short quote and a name.',\n required: ['quote'],\n properties: {\n quote: { type: 'string', maxLength: 90, description: 'The review text, without quote marks.' },\n name: { type: 'string', maxLength: 30, description: 'e.g. \"Jess, verified buyer\".' },\n stars: { type: 'integer', minimum: 1, maximum: 5, description: 'Default 5.' },\n start_sec: { type: 'number', description: 'Default just after the hook.' },\n duration_sec: { type: 'number', minimum: 1, maximum: 10, description: 'Default 4.' },\n },\n },\n progress_bar: { type: 'boolean', description: 'A thin bar in the brand color across the top that fills as the video plays.' },\n countdown: {\n type: 'object',\n description: 'Urgency timer under the offer badge; the digits tick down each second.',\n required: ['from'],\n properties: {\n from: { type: 'string', description: 'Start time, \"23:59:59\" or \"04:59\".' },\n label: { type: 'string', maxLength: 16, description: 'Words above the timer. Default \"Ends in\".' },\n start_sec: { type: 'number', description: 'Default just after the hook.' },\n duration_sec: { type: 'number', minimum: 1, maximum: 10, description: 'Default 4.' },\n },\n },\n price_tag: {\n type: 'object',\n description: 'Tilted sticker on the left: new price big, old price struck through.',\n required: ['now'],\n properties: {\n now: { type: 'string', maxLength: 12, description: 'e.g. \"$49\".' },\n was: { type: 'string', maxLength: 12, description: 'Old price, struck through, e.g. \"$79\".' },\n label: { type: 'string', maxLength: 16, description: 'e.g. \"Today only\".' },\n start_sec: { type: 'number', description: 'Default just after the hook.' },\n duration_sec: { type: 'number', minimum: 1, maximum: 10, description: 'Default 4.' },\n },\n },\n offer: {\n type: 'object',\n description: 'Offer callout: a badge that pops in on cue (after the hook when there is one).',\n required: ['text'],\n properties: {\n text: { type: 'string', maxLength: 24, description: 'e.g. \"50% OFF\".' },\n subtext: { type: 'string', maxLength: 40, description: 'Small line under it, e.g. \"This week only\".' },\n start_sec: { type: 'number', description: 'Second it appears. Default 0.5.' },\n duration_sec: { type: 'number', minimum: 1, maximum: 10, description: 'Seconds it stays. Default 3.' },\n position: { type: 'string', enum: ['top', 'bottom'], description: 'Default top.' },\n },\n },\n end_card: {\n type: 'object',\n description: 'End card held after the last frame.',\n required: ['headline'],\n properties: {\n headline: { type: 'string', maxLength: 40, description: 'e.g. \"Your new favorite mug\".' },\n cta: { type: 'string', maxLength: 24, description: 'Button text, e.g. \"Shop now\".' },\n url: { type: 'string', maxLength: 40, description: 'Web address shown under the button.' },\n logo_url: { type: 'string', format: 'uri', description: 'PNG (transparent works best) or JPG.' },\n duration_sec: { type: 'number', minimum: 2, maximum: 5, description: 'Default 3.' },\n },\n },\n },\n} as const;\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n const { hook, callout, review, countdown, price_tag: price, offer, end_card: card } = input;\n if (!hook && !callout && !review && !input.progress_bar && !countdown && !price && !offer && !card) {\n return {\n kind: 'text',\n text: 'pixeldojo_overlay needs at least one of hook, callout, review, progress_bar, countdown, price_tag, offer or end_card.',\n };\n }\n const submitted = await ctx.client.run(MODEL, {\n prompt: '',\n video: input.video_url,\n ...(input.color ? { color: input.color } : {}),\n ...(hook ? { hook_text: hook.text, hook_duration: hook.duration_sec } : {}),\n ...(callout\n ? {\n callout_title: callout.title,\n callout_subtitle: callout.subtitle,\n callout_start: callout.start_sec,\n callout_duration: callout.duration_sec,\n }\n : {}),\n ...(review\n ? {\n review_quote: review.quote,\n review_name: review.name,\n review_stars: review.stars,\n review_start: review.start_sec,\n review_duration: review.duration_sec,\n }\n : {}),\n ...(input.progress_bar ? { progress_bar: true } : {}),\n ...(countdown\n ? {\n countdown_from: countdown.from,\n countdown_label: countdown.label,\n countdown_start: countdown.start_sec,\n countdown_duration: countdown.duration_sec,\n }\n : {}),\n ...(price\n ? {\n price_now: price.now,\n price_was: price.was,\n price_label: price.label,\n price_start: price.start_sec,\n price_duration: price.duration_sec,\n }\n : {}),\n ...(offer\n ? {\n offer_text: offer.text,\n offer_subtext: offer.subtext,\n offer_start: offer.start_sec,\n offer_duration: offer.duration_sec,\n offer_position: offer.position,\n }\n : {}),\n ...(card\n ? {\n end_headline: card.headline,\n end_cta: card.cta,\n end_url: card.url,\n logo_url: card.logo_url,\n end_duration: card.duration_sec,\n }\n : {}),\n });\n\n const result = await pollJobUntilDoneOrHandoff(\n submitted.jobId,\n (id) => ctx.client.getJob(id),\n ctx.buildStatusUrl,\n { now: ctx.pollOverrides?.now, sleep: ctx.pollOverrides?.sleep },\n );\n\n return pollResultToSkillResult(result, (urls) =>\n urls.length === 0 ? `Job ${submitted.jobId} completed but returned no assets.` : `Branded. Asset: ${urls[0]}`,\n );\n}\n\nexport const overlaySkill: SkillModule<Input> = {\n name: 'pixeldojo_overlay',\n description:\n 'Add short-form ad text layouts to a finished video, exact text in the brand color, clear of the TikTok/Reels/Shorts UI: hook (title over the first seconds), callout (lower-third label), review (stars, quote, name), progress_bar, countdown (ticking timer), price_tag (new price, old one struck through), offer (\"50% OFF\" badge) and end_card (logo, headline, button, web address over the held last frame). Pass video_url plus any of them; one call does all. 2 credits.',\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n allowedModels: [MODEL],\n defaultModel: MODEL,\n run,\n};\n","/**\n * pixeldojo_status — poll companion for the 30s sync handoff.\n *\n * Per CEO D9: when a job exceeds the synchronous wait budget, the calling\n * skill returns `{ jobId, statusUrl }` and the LLM follows up by calling\n * this tool with the same jobId. The skill polls once and surfaces the\n * current state — completed (with assets), failed (with error), or still\n * processing (with eta).\n */\nimport { z } from 'zod';\nimport {\n type SkillContext,\n type SkillModule,\n type SkillResult,\n} from './types.js';\n\nconst InputSchema = z.object({\n jobId: z\n .string()\n .min(1)\n .max(200)\n .describe('Job id returned from a prior pixeldojo_* skill handoff.'),\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n jobId: {\n type: 'string',\n description: 'The jobId a generation tool returned instead of an asset (a job_... id).',\n },\n },\n required: ['jobId'],\n} as const;\n\n/** Threshold (ms) past which we tell the agent the job is unusually slow. */\nconst STUCK_HINT_MS = 5 * 60 * 1000;\n/** Threshold (ms) past which we tell the agent the job is almost certainly stuck. */\nconst ABANDON_HINT_MS = 12 * 60 * 1000;\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n const job = await ctx.client.getJob(input.jobId);\n\n if (job.status === 'completed') {\n const urls = extractAssetUrls(job);\n return {\n kind: 'assets',\n text:\n urls.length === 0\n ? `Job ${input.jobId} completed but returned no assets.`\n : urls.length === 1\n ? `Job ${input.jobId} completed. Asset: ${urls[0]}`\n : `Job ${input.jobId} completed. Assets: ${urls.join(', ')}`,\n assetUrls: urls,\n };\n }\n\n if (job.status === 'failed') {\n const errMsg =\n typeof job.error === 'string'\n ? job.error\n : (job.error as { message?: string } | undefined)?.message ?? 'Unknown provider error';\n return {\n kind: 'text',\n text: `Job ${input.jobId} failed: ${errMsg}`,\n };\n }\n\n // Pending or processing — surface job age + a hint when the wait is\n // unusually long, so the agent stops blindly polling forever.\n const apiId = (job as { apiId?: string }).apiId ?? 'unknown';\n const ageMs = jobAgeMs(job);\n const ageLabel = formatAge(ageMs);\n\n let hint: string;\n if (ageMs >= ABANDON_HINT_MS) {\n hint =\n `That's well past the typical generation window for any model on PixelDojo. ` +\n `The job is almost certainly stuck. Submit a fresh request, or open ${ctx.buildStatusUrl(input.jobId)} for the raw record.`;\n } else if (ageMs >= STUCK_HINT_MS) {\n hint =\n `That's longer than most generations should take. ` +\n `Poll once more, or submit a fresh request if the next check still says ${job.status}.`;\n } else {\n hint = `Try again in a few seconds, or follow ${ctx.buildStatusUrl(input.jobId)}.`;\n }\n\n return {\n kind: 'handoff',\n text:\n `Job ${input.jobId} (${apiId}) is ${job.status} after ${ageLabel}. ${hint}`,\n jobId: input.jobId,\n statusUrl: ctx.buildStatusUrl(input.jobId),\n };\n}\n\nfunction jobAgeMs(job: unknown): number {\n const createdAt = (job as { createdAt?: string }).createdAt;\n if (!createdAt) return 0;\n const t = Date.parse(createdAt);\n if (Number.isNaN(t)) return 0;\n const age = Date.now() - t;\n return age >= 0 ? age : 0;\n}\n\nfunction formatAge(ms: number): string {\n if (ms < 60_000) return `${Math.max(1, Math.round(ms / 1000))}s`;\n const totalSeconds = Math.round(ms / 1000);\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n if (minutes < 60) {\n return seconds === 0 ? `${minutes}m` : `${minutes}m ${seconds}s`;\n }\n const hours = Math.floor(minutes / 60);\n const remMinutes = minutes % 60;\n return remMinutes === 0 ? `${hours}h` : `${hours}h ${remMinutes}m`;\n}\n\nfunction extractAssetUrls(job: {\n assets?: Array<{ url: string }>;\n output?: unknown;\n}): string[] {\n if (job.assets && job.assets.length > 0) return job.assets.map((a) => a.url);\n const output = job.output as\n | { images?: string[]; videos?: string[]; image?: string; video?: string }\n | undefined;\n if (output?.images) return output.images;\n if (output?.videos) return output.videos;\n if (output?.image) return [output.image];\n if (output?.video) return [output.video];\n return [];\n}\n\nexport const statusSkill: SkillModule<Input> = {\n name: 'pixeldojo_status',\n description:\n 'Check once, without waiting, on a jobId that a generation tool returned instead of an asset after its 30s wait. Free. Returns asset URLs when complete, the failure reason if it failed, or the current state and job age if still running. Campaign ids go to pixeldojo_campaign_status; films report progress through pixeldojo_film with action \"status\".',\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n // status is special — it doesn't dispatch to a model\n allowedModels: [],\n defaultModel: '',\n run,\n};\n","/**\n * pixeldojo_from_url — paste a product URL, get back a ResolvedProduct.\n *\n * Hits the public /api/v1/extract-product endpoint. No credits consumed.\n * pixeldojo_campaign and pixeldojo_ad run the same extraction themselves\n * when handed a product URL; this is the standalone view of it — removes\n * the cold-start problem of \"describe your product to me first.\"\n */\nimport { z } from 'zod';\nimport {\n type SkillContext,\n type SkillModule,\n type SkillResult,\n} from './types.js';\n\nconst InputSchema = z.object({\n url: z\n .string()\n .min(1)\n .max(2048)\n .describe('Product page URL. Shopify, BigCommerce, WooCommerce, or any page with JSON-LD / OpenGraph product metadata.'),\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n url: {\n type: 'string',\n description:\n 'Product page URL. Shopify, BigCommerce, WooCommerce, or any page with JSON-LD / OpenGraph product metadata.',\n },\n },\n required: ['url'],\n} as const;\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n const product = await ctx.client.extractProduct(input.url);\n\n const summary = [\n `Product: ${product.name}`,\n product.description ? `Description: ${truncate(product.description, 280)}` : null,\n `Images (${product.images.length}): ${product.images.slice(0, 3).join(', ')}${\n product.images.length > 3 ? `, +${product.images.length - 3} more` : ''\n }`,\n `Source strategy: ${product.source}`,\n ]\n .filter(Boolean)\n .join('\\n');\n\n return {\n kind: 'text',\n text: summary,\n };\n}\n\nfunction truncate(input: string, max: number): string {\n if (input.length <= max) return input;\n return input.slice(0, max - 3) + '...';\n}\n\nexport const fromUrlSkill: SkillModule<Input> = {\n name: 'pixeldojo_from_url',\n description:\n 'Extract a product profile from a product page URL: name, description, image URLs (the first three are listed), and the extraction method used. Works on Shopify, BigCommerce, WooCommerce, or any page with JSON-LD / OpenGraph product metadata. Free. pixeldojo_campaign and pixeldojo_ad accept a product URL and run this extraction themselves; call this directly to check the product data first, or to reuse its images in other tools.',\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n // No model dispatch — this skill calls a server-side scrape, not a generation.\n allowedModels: [],\n defaultModel: '',\n run,\n};\n","/**\n * pixeldojo_film — one idea in, a finished scored short film out.\n *\n * Drives the real Film Studio pipeline (the same /api/films routes the web\n * app uses; they accept the MCP's Bearer credential). Films are long-running\n * and charged per shot, so the skill is deliberately phased:\n *\n * 1. PLAN (free): { idea } or { script } → writes the screenplay,\n * plans scenes/shots, returns film_id + a cost estimate. Nothing charged.\n * 2. PRODUCE (charged): { film_id, action: 'produce' } → dispatches the\n * first frame batch. Each frame/clip is charged as it renders.\n * 3. STATUS (advances): { film_id, action: 'status' } → call every ~30s.\n * Each call advances the pipeline: dispatches remaining frames, SAVES\n * finished ones (a render lives 24h on the temp CDN until it is saved;\n * the server's Frame check auto-reviews each frame,\n * redoes clear mismatches up to 4 times with rewritten prompts, then\n * flags still-mismatched shots for review), rolls clips four at a\n * time, composes\n * the scene-synced soundtrack, starts the export, and finally returns\n * the finished film URL.\n *\n * MUSIC VIDEO mode ({ song_url, song_duration_sec }): the same routes the web\n * composer's \"Music video\" mode calls. POST /api/films with musicVideoMode +\n * the song (stored as the film's music stem) and the music clip engine, then\n * POST /plan straight from concept + lyrics (no script step: the song is the\n * runtime), then POST /music/slice to cut one song chunk per shot. Clips\n * lip-sync to their chunk; the export lays the original song, so no score is\n * ever composed for a music video.\n */\nimport { z } from 'zod';\nimport type { SkillContext, SkillModule, SkillResult, SkillResultText } from './types.js';\nimport { SkillUploadError, uploadLocalFile } from './upload-helpers.js';\n\nconst STORY_LOOKS = ['live-action', 'anime', '3d-animation', 'noir', 'horror', 'sci-fi', 'documentary', 'western', 'romance', 'romantic-comedy', 'comedy'] as const;\nconst MUSIC_VIDEO_LOOKS = ['rap-video', 'neon-club', 'stage-performance', 'retro-camcorder', 'y2k-pop', 'moody-rnb', 'rock-grit', 'dream-pop', 'k-pop'] as const;\n// Mirrors ALL_FILM_LOOKS in lib/film-studio/shared.ts (this package cannot\n// import app code); tests/contracts/mcp-film-music-parity.test.ts pins it.\nconst LOOKS = [...STORY_LOOKS, ...MUSIC_VIDEO_LOOKS] as const;\n\n/** Mirrors DEFAULT_MUSIC_CLIP_ENGINE_ID in lib/film-studio/engines.ts, the\n * engine the web composer selects in music video mode (pinned by\n * tests/contracts/mcp-film-music-parity.test.ts). Sent as the film's\n * clipEngine at creation; the planner stamps it on every shot. */\nexport const MUSIC_CLIP_ENGINE_ID = 'minimax-h3-reference';\n\nconst InputSchema = z.object({\n idea: z\n .string()\n .max(2000)\n .optional()\n .describe('One-to-three sentence film idea. The studio writes the screenplay (free). Provide idea OR script for planning.'),\n script: z\n .string()\n .max(20000)\n .optional()\n .describe('A full screenplay to plan instead of an idea (sluglines, action lines, dialogue).'),\n look: z\n .enum(LOOKS)\n .optional()\n .describe('Visual style carried through frames, clips, and soundtrack. Default live-action, or rap-video for a music video.'),\n song_url: z\n .string()\n .url()\n .startsWith('https://')\n .max(2000)\n .optional()\n .describe('Music video mode: URL of the song, which must be your own PixelDojo upload (from pixeldojo_upload), not a third-party link. The film is cut to the song and every clip lip-syncs to its slice of it. idea describes the visuals.'),\n song_path: z\n .string()\n .max(4096)\n .optional()\n .describe('Music video mode, local server only: absolute path to the song file (MP3, WAV, M4A, AAC, OGG, FLAC up to 50MB). Uploaded for you; use instead of song_url.'),\n song_duration_sec: z\n .number()\n .positive()\n .max(7200)\n .optional()\n .describe('Music video mode (optional): the song length in seconds. Omit it and the studio measures the song.'),\n lyrics: z\n .string()\n .max(10000)\n .optional()\n .describe('Music video mode: the song lyrics, so shots land on the right lines. Optional.'),\n aspect: z.enum(['16:9', '9:16']).default('16:9'),\n pacing: z\n .enum(['story', 'trailer'])\n .default('story')\n .describe(\"'story' (default) plays every shot's action whole. 'trailer' cuts it like a trailer or promo: most shots keep only their first 1.5-3 seconds.\"),\n length: z\n .enum(['30s', '60s', '2-3min', '5min'])\n .default('60s')\n .describe('Target length of the finished film.'),\n film_id: z.string().max(40).optional().describe('Existing film id (from a previous call) for produce/status/cast/redo.'),\n action: z\n .enum(['plan', 'produce', 'status', 'cast', 'redo'])\n .default('plan')\n .describe(\"'plan' creates + storyboards (free). 'cast' casts, replaces or removes characters on an existing film. 'produce' starts charged generation. 'status' advances production and reports progress; poll it every ~30s until it returns the finished film. 'redo' renders a new take of the listed shots (charged), then status re-saves and re-exports.\"),\n shots: z\n .array(z.string().trim().min(1).max(40))\n .min(1)\n .max(12)\n .optional()\n .describe('Redo: the shots to render again, by the labels status reports (\"2.3\" is scene 2, shot 3) or shot id.'),\n redo: z\n .enum(['clip', 'frame'])\n .default('clip')\n .describe(\"Redo: 'clip' (default) renders a new take of the clip from the same frame; 'frame' paints a new storyboard frame, then a new clip from it.\"),\n cast: z\n .array(\n z.object({\n name: z.string().trim().min(1).max(60),\n image_urls: z.array(z.string().url().startsWith('https://').max(2048)).min(1).max(8).optional(),\n prompt: z.string().trim().min(1).max(600).optional(),\n character_id: z.string().max(40).optional(),\n replace: z.boolean().optional(),\n remove: z.boolean().optional(),\n }),\n )\n .max(8)\n .optional()\n .describe('Cast members, one per named character. Each gives image_urls (your own photos), a prompt (a portrait is generated, charged), or a character_id (a Character Studio character); with none of these the Character Studio character of that name is used. replace: true swaps out whoever already plays that name; remove: true takes them off the film.'),\n soundtrack: z\n .enum(['scene-synced', 'flat', 'none'])\n .default('scene-synced')\n .describe('scene-synced composes one musical section per scene, pinned to the scene lengths (default). flat is a single cohesive bed. none skips music.'),\n music_job_id: z\n .string()\n .max(80)\n .optional()\n .describe('The music_job_id from the previous status reply while the score is composing, so that score is attached. A status call without it, once all clips are ready and no score is attached, starts and charges for a new score.'),\n});\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema: Record<string, unknown> = {\n type: 'object',\n properties: {\n idea: { type: 'string', description: \"Plan step: one-to-three sentence film idea. The studio writes the screenplay (free). Provide idea or script. Keep the user's own words for who each character is, including their gender and pronouns (\\\"she\\\", \\\"he\\\") and species; the writer has nothing else to go on.\" },\n script: { type: 'string', description: 'Plan step: a full screenplay (sluglines, action lines, dialogue) to plan instead of an idea.' },\n look: { type: 'string', enum: [...LOOKS], description: `Plan step: visual style carried through frames, clips and soundtrack. Story looks: ${STORY_LOOKS.join(', ')} (default live-action). Music video looks: ${MUSIC_VIDEO_LOOKS.join(', ')} (default rap-video).` },\n song_url: {\n type: 'string',\n description:\n 'Plan step, music video mode: URL of the song. It must be your own PixelDojo upload (from pixeldojo_upload or /api/v1/upload); a third-party link is refused. Makes a music video cut to this song, every clip lip-synced to its slice of it, rendered on the studio music video engine. idea (or script) describes the visuals. No score is composed: the song is the soundtrack.',\n },\n song_path: {\n type: 'string',\n description:\n 'Plan step, music video mode: absolute local path to the song (MP3, WAV, M4A, AAC, OGG, FLAC up to 50MB). Uploaded for you; use instead of song_url.',\n },\n song_duration_sec: {\n type: 'number',\n description: 'Plan step, music video mode (optional): the song length in seconds. Omit it and the studio measures the song.',\n },\n lyrics: { type: 'string', description: 'Plan step, music video mode (optional): the song lyrics, so shots land on the right lines.' },\n aspect: { type: 'string', enum: ['16:9', '9:16'], description: 'Plan step: frame aspect ratio. Default 16:9.' },\n length: { type: 'string', enum: ['30s', '60s', '2-3min', '5min'], description: 'Plan step: target length. Default 60s. Ignored for a music video, whose length is the song.' },\n pacing: {\n type: 'string',\n enum: ['story', 'trailer'],\n description: \"Plan step: 'story' (default) plays every shot's action whole, for any narrative film. 'trailer' cuts it like a trailer, promo or sizzle: most shots stay on screen 1.5-3 seconds. Ignored for a music video.\",\n },\n film_id: { type: 'string', description: 'The film_id returned by the plan step. Required for produce, status and redo; with it, action \"plan\" is treated as \"status\".' },\n action: {\n type: 'string',\n enum: ['plan', 'produce', 'status', 'cast', 'redo'],\n description:\n 'plan (default, free): writes the script and plans shots, returns film_id, a cost estimate, and any characters still to cast. cast: casts, replaces or removes characters on an existing film (pass film_id and cast). produce (charged): starts rendering frames; refused until every named character is cast. status: advances production one step and reports progress; call it every ~30s until it returns the finished film URL. redo (charged): renders a new take of the shots listed in `shots`, on a film in production or already finished; then call status, which saves the new take and cuts a new export with it.',\n },\n shots: {\n type: 'array',\n items: { type: 'string' },\n maxItems: 12,\n description: 'Redo only: the shots to render again, by the labels status and the finished film report (\"2.3\" is scene 2, shot 3), or by shot id.',\n },\n redo: {\n type: 'string',\n enum: ['clip', 'frame'],\n description:\n \"Redo only: 'clip' (default) renders a new take of the clip from the same storyboard frame, the fix for a glitch, bad motion or lip sync. 'frame' paints a new frame first (and then a new clip from it), the fix for a wrong look, face or composition. Each is charged like any render of that shot. To change what a shot shows, edit it on the storyboard.\",\n },\n cast: {\n type: 'array',\n maxItems: 8,\n description:\n 'Cast members, one per named character. Every named character must be cast before frames render, so faces, ages and species hold in every shot. Pass them on the plan call (the script then stars them by name) or later with action \"cast\" using the names the plan reports. Each entry: name, plus ONE of image_urls (your own photos of an adult, made into a character), prompt (a portrait is generated from it, charged like any image), or character_id (a Character Studio character). An entry with only a name uses your Character Studio character of that name. A name that is already cast is left alone unless the entry sets replace: true, which hands that part (every shot, outfit and voice) to the new cast member. remove: true with only the name takes that cast member off the film; the part then needs a new cast member before frames render. replace and remove work until the shots of that cast member are rendered; after that, recast on the storyboard, where the frames that show them can be redone.',\n items: {\n type: 'object',\n properties: {\n name: { type: 'string', description: 'The character name as the film uses it (e.g. \"Harlan\").' },\n image_urls: { type: 'array', items: { type: 'string' }, description: 'Your own https photos of the character (1-8). PixelDojo uploads work; they are copied to permanent storage.' },\n prompt: {\n type: 'string',\n description: 'A description to generate the portrait from: species if not human, gender, adult age, look and outfit (e.g. \"man in his late 50s, grey mustache, sunburnt, red windbreaker\").',\n },\n character_id: { type: 'string', description: 'A Character Studio character id.' },\n replace: {\n type: 'boolean',\n description: 'Swap out whoever already plays this name for the image_urls, prompt or character_id given here, before their shots are rendered. Without it, an already-cast name is left unchanged.',\n },\n remove: {\n type: 'boolean',\n description: 'Take whoever plays this name off the film and every shot (free), before their shots are rendered. Give only the name.',\n },\n },\n required: ['name'],\n },\n },\n soundtrack: {\n type: 'string',\n enum: ['scene-synced', 'flat', 'none'],\n description:\n 'Read on status calls once all clips are ready. scene-synced (default): one musical section per scene. flat: one cohesive bed. none: export without music. Ignored for a music video, which always exports with its song.',\n },\n music_job_id: {\n type: 'string',\n description:\n 'The music_job_id from the previous status reply while the score is composing. A status call without it, once all clips are ready and no score is attached, starts and charges for a new score.',\n },\n },\n};\n\ninterface FilmShotDto {\n id: string;\n prompt: string;\n status: string;\n approved: boolean;\n frameUrl?: string;\n videoUrl?: string;\n errorMessage?: string;\n durationSec: number;\n musicChunkUrl?: string;\n characterIds: string[];\n elementIds: string[];\n engine: string;\n cameraPreset?: string;\n /** The clip check's verdict on a delivered clip (it judged `url`). */\n clipQa?: { url: string; ok: boolean; issues: string[]; note: string };\n /** Re-renders of a clip this shot already had (the studio counts them). */\n manualClipRedos?: number;\n /** The rendered clip's length and the cut's trims, in seconds. */\n videoDurationSec?: number;\n trimStartSec?: number;\n trimEndSec?: number;\n /** The studio editor's suggested in/out points for the clip in `url`\n * (pending while it is still reviewing a fresh clip). */\n editSuggestion?: { url: string; pending?: boolean; inSec?: number; outSec?: number; checkedAt: string; appliedAt?: string; skipped?: boolean };\n /** The editor's cut on this shot: plays faster, or is left out of the film. */\n speed?: number;\n leftOut?: boolean;\n}\ninterface FilmDto {\n id: string;\n title: string;\n status: string;\n /** The studio editor's whole-film cut (pending while it is being made). */\n editorCut?: { pending?: boolean; startedAt: string; builtAt?: string; shots?: unknown[]; appliedAt?: string; skipped?: boolean; note?: string };\n look: string;\n aspect: string;\n script?: string;\n exportUrl?: string;\n exportError?: string;\n audioStems: { kind: string; url: string }[];\n musicVideoMode?: boolean;\n musicDurationSec?: number;\n /** The planner run (script writer / shot planner). Both answer 202 with a\n * job id and finish in the background; this is what settles it. */\n llmJob?: { id: string; kind: string; status: 'running' | 'done' | 'error'; error?: string };\n scenes: { id: string; title: string; location?: string; shots: FilmShotDto[] }[];\n}\n\n/**\n * A rendered frame/clip that is still a draft. Film Studio writes fresh\n * renders to the 24h temp CDN and only an explicit save copies them to the\n * permanent one, so the host is the flag (mirrors isDraftFilmMedia in the\n * app's lib/film-studio/shared.ts — this package cannot import from it).\n */\nfunction needsSave(url: string | undefined): boolean {\n return Boolean(url && url.startsWith('https://temp.pixeldojo.ai/'));\n}\n\nasync function filmApi<T>(\n ctx: SkillContext,\n method: string,\n path: string,\n body?: unknown,\n): Promise<{ status: number; data: T }> {\n const res = await fetch(`${ctx.baseUrl}${path}`, {\n method,\n headers: {\n Authorization: `Bearer ${ctx.apiKey}`,\n 'Content-Type': 'application/json',\n 'x-pixeldojo-source': `mcp/${ctx.mcpVersion}`,\n 'x-pixeldojo-skill': 'film',\n },\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n });\n const data = (await res.json().catch(() => ({}))) as T;\n return { status: res.status, data };\n}\n\nconst shots = (f: FilmDto) => f.scenes.flatMap((s) => s.shots);\n\n/**\n * No film came back. Only a 404 means it is gone. A deploy restart or a proxy\n * error answers 502/503 with no JSON, and reading that as \"not found\" made\n * Sensei plan and pay for the same film a second time (2026-10-03). `retry`\n * is the call to make again; a status check is followed up automatically.\n */\nfunction noFilm(status: number, data: { error?: string }, filmId: string, retry: Record<string, unknown>): SkillResult {\n if (status === 404) return { kind: 'text', text: `Film not found: ${data.error ?? filmId}` };\n const input: Record<string, unknown> = { film_id: filmId, ...Object.fromEntries(Object.entries(retry).filter(([, v]) => v !== undefined)) };\n return {\n kind: 'text',\n text: `Could not reach film ${filmId} just now (${status ? `HTTP ${status}` : 'no response'}). The film is safe and nothing changed. Call pixeldojo_film with ${JSON.stringify(input)} again in about 30 seconds. Do not plan or start a new film.`,\n ...(input.action === 'status' ? { followUp: { input, afterSec: 30 } } : {}),\n };\n}\n\n/** Call status again in about `afterSec` to keep the film moving (see\n * SkillResultText.followUp). Only set while something is rendering or\n * about to be started by that call, never while a person is needed. */\nfunction keepGoing(filmId: string, afterSec: number, extra: Record<string, unknown> = {}): NonNullable<SkillResultText['followUp']> {\n const set = Object.fromEntries(Object.entries(extra).filter(([, v]) => v !== undefined));\n return { input: { film_id: filmId, action: 'status', ...set }, afterSec };\n}\n\n/** \"2.3\" = scene 2, shot 3: the label every reply uses for a shot. */\n/** The clip check flagged the clip this shot holds now: it judged this file\n * (Save keeps the draft's file name, only the host changes). */\nfunction flaggedClip(sh: FilmShotDto): boolean {\n const qa = sh.clipQa;\n const file = (u?: string) => u?.split('/').pop();\n return Boolean(qa && qa.ok === false && sh.videoUrl && file(qa.url) === file(sh.videoUrl));\n}\n\n/** The editor is still reviewing the clip this shot holds. Mirrors\n * editReviewPending in the app (4 minutes, then the cut goes without it). */\nfunction editReviewing(sh: FilmShotDto, nowMs: number): boolean {\n const e = sh.editSuggestion;\n const file = (u?: string) => u?.split('/').pop();\n return Boolean(e?.pending && sh.videoUrl && file(e.url) === file(sh.videoUrl) && nowMs - Date.parse(e.checkedAt) < 4 * 60_000);\n}\n\n/** The editor marked a cut on this shot's clip that nobody has applied or skipped. */\nfunction openEdit(sh: FilmShotDto): boolean {\n const e = sh.editSuggestion;\n const file = (u?: string) => u?.split('/').pop();\n return Boolean(e && !e.pending && !e.appliedAt && !e.skipped && e.inSec !== undefined && sh.videoUrl && file(e.url) === file(sh.videoUrl));\n}\n\n/** What a shot runs in the cut: the rendered clip less its trims, at its\n * speed; nothing for a shot left out. */\nfunction cutSec(sh: FilmShotDto): number {\n if (sh.leftOut) return 0;\n const speed = sh.speed && sh.speed > 1 ? sh.speed : 1;\n return Math.max(1, (sh.videoDurationSec ?? sh.durationSec ?? 0) - (sh.trimStartSec ?? 0) - (sh.trimEndSec ?? 0)) / speed;\n}\n\n/** The whole-film editor is still cutting, or about to: every clip review is\n * in and no cut has been built since the last one landed. Gives up after 4\n * minutes, like the per-clip wait. */\nfunction editorCutting(f: FilmDto, nowMs: number): boolean {\n const c = f.editorCut;\n const fresh = (iso?: string) => Boolean(iso && nowMs - Date.parse(iso) < 4 * 60_000);\n if (c?.pending) return fresh(c.startedAt);\n const lastReview = shots(f)\n .map((sh) => sh.editSuggestion?.checkedAt)\n .filter((t): t is string => Boolean(t))\n .sort()\n .pop();\n if (!lastReview || !fresh(lastReview)) return false;\n return !(c?.builtAt && c.builtAt >= lastReview);\n}\n\nfunction runtimeText(f: FilmDto): string {\n const sec = Math.round(shots(f).reduce((n, sh) => n + cutSec(sh), 0));\n return sec < 90 ? `${sec}s` : `${Math.floor(sec / 60)}m ${sec % 60}s`;\n}\n\nfunction shotLabels(f: FilmDto): Map<string, string> {\n return new Map(f.scenes.flatMap((s, si) => s.shots.map((sh, i) => [sh.id, `${si + 1}.${i + 1}`] as const)));\n}\n\n/** A dispatch refusal that clears on its own: the shot is already rendering,\n * or the frame slots are full and free up as frames land. */\nconst benignDispatchRefusal = (status: number, error?: string) =>\n status === 429 || (status === 409 && /already generating/i.test(error ?? ''));\n\ninterface UncastRoleDto {\n name: string;\n suggestedPrompt: string;\n}\n\n/** Cast each entry onto the film (POST /api/films/[id]/cast), in parallel: a\n * generated portrait takes 10-25s, and one after another they would run the\n * tool call far past its sync window. One reply line per entry. */\nasync function applyCast(\n ctx: SkillContext,\n filmId: string,\n cast: NonNullable<Input['cast']>,\n): Promise<{ lines: string[]; charged: boolean }> {\n let charged = false;\n const lines = await Promise.all(cast.map(async (c) => {\n const r = await filmApi<{\n character?: { id?: string; name: string };\n replaced?: { name: string };\n removed?: { name: string };\n boundShots?: number;\n creditCost?: number;\n alreadyCast?: boolean;\n error?: string;\n code?: string;\n }>(\n ctx,\n 'POST',\n `/api/films/${filmId}/cast`,\n {\n role: c.name,\n ...(c.character_id ? { characterId: c.character_id } : {}),\n ...(c.image_urls ? { imageUrls: c.image_urls } : {}),\n ...(c.prompt ? { prompt: c.prompt } : {}),\n ...(c.replace ? { replace: true } : {}),\n ...(c.remove ? { remove: true } : {}),\n },\n );\n // A portrait can be paid for even when the call then refuses (the shots\n // started rendering meanwhile); the reply must not claim nothing was charged.\n if (r.data.creditCost) charged = true;\n if (r.status !== 200) {\n // Shots already rendered with this cast member: the storyboard is where\n // the frames that show them get redone, so hand the caller its link.\n const where = r.data.code === 'cast-rendered' ? ` Storyboard: ${ctx.baseUrl}/film-studio/${filmId}` : '';\n return `Could not ${c.remove ? 'remove' : c.replace ? 'replace' : 'cast'} ${c.name}: ${r.data.error ?? r.status}${where}`;\n }\n if (r.data.removed) return `Removed ${c.name} from the film and every shot.`;\n if (r.data.alreadyCast) {\n return c.replace\n ? `${c.name} is already played by that character; nothing changed.`\n : `${c.name} is already cast; nothing changed. To swap who plays ${c.name}, send the entry again with replace: true.`;\n }\n const cost = r.data.creditCost ? ` (portrait, ${r.data.creditCost} credits)` : '';\n const where = r.data.boundShots ? `, in ${r.data.boundShots} shot(s)` : '';\n return r.data.replaced\n ? `Replaced ${r.data.replaced.name} with ${r.data.character?.name ?? 'the new cast member'}${r.data.character?.id ? ` (character_id ${r.data.character.id})` : ''} as ${c.name}${cost}${where}.`\n : `Cast ${c.name}${cost}${where}.`;\n }));\n return { lines, charged };\n}\n\nasync function uncastRolesOf(ctx: SkillContext, filmId: string): Promise<UncastRoleDto[]> {\n const r = await filmApi<{ uncastRoles?: UncastRoleDto[] }>(ctx, 'GET', `/api/films/${filmId}/cast`);\n return r.data.uncastRoles ?? [];\n}\n\n/** What to tell the caller while characters are uncast: frames refuse to\n * render until each one has a cast member. */\nfunction castNeededText(filmId: string, roles: UncastRoleDto[]): string {\n const example = roles.map((r) => ({ name: r.name, prompt: r.suggestedPrompt || `describe ${r.name}` }));\n return [\n `Cast these characters before production (every named character needs a cast member so faces, ages and species hold in every shot):`,\n ...roles.map((r) => ` ${r.name}${r.suggestedPrompt ? `: ${r.suggestedPrompt}` : ''}`),\n `Call pixeldojo_film with {\"film_id\": \"${filmId}\", \"action\": \"cast\", \"cast\": ${JSON.stringify(example)}}, giving each one a prompt (a portrait is generated, charged), image_urls of your own photos, or a character_id from Character Studio.`,\n ].join('\\n');\n}\nconst count = (f: FilmDto, pred: (sh: FilmShotDto) => boolean) => shots(f).filter(pred).length;\n\n/** The shot has its storyboard frame. Status alone is not enough: a shot whose\n * CLIP failed reads 'failed' with its frame still on it, and gating clips on\n * status held every other clip of the film back behind it. */\nconst frameDone = (sh: FilmShotDto) => Boolean(sh.frameUrl) && sh.status !== 'idle' && sh.status !== 'frame-generating';\n\n/**\n * A failure the provider repeats on the same input: a copyright, content or\n * likeness filter. Every automatic retry is a charged render refused again (a\n * Seedance copyright block, 2026-09-30), so status stops resending the shot\n * and asks for a new frame or prompt. Stems mirror CONTENT_MODERATION_INDICATORS\n * in the app's lib/utils/moderation-refund-message.ts, which this package\n * cannot import. Still retried: Seedance's output-audio check, a known false\n * positive that usually clears (MODERATION_AUDIO_RETRY_MESSAGE there), and a\n * safety service that was down.\n */\n// A soundtrack copyright refusal is resent too: the studio re-renders that\n// shot once with audio off (generate route, clipAudioOff), which the check\n// cannot refuse again.\nconst RETRY_CLEARS =\n /automatic audio check flagged|output audio\\b[\\s\\S]*?sensitive information|temporarily unavailable|output audio\\b[\\s\\S]*?copyright|soundtrack was blocked by the model provider/i;\nconst REFUSED = /copyright|infringement|content filter|safety filter|moderation|blocked|flagged|sensitive|real (?:person|human)|nsfw|content policy|policy violation|inappropriate/i;\nconst isRefused = (sh: FilmShotDto) =>\n sh.status === 'failed' && Boolean(sh.errorMessage) && !RETRY_CLEARS.test(sh.errorMessage!) && REFUSED.test(sh.errorMessage!);\n\nfunction progressLine(f: FilmDto): string {\n const all = shots(f);\n const frames = all.filter((sh) => ['frame-ready', 'approved', 'clip-generating', 'clip-ready'].includes(sh.status) || sh.frameUrl).length;\n const clips = all.filter((sh) => sh.status === 'clip-ready').length;\n const rendering = all.filter((sh) => sh.status === 'clip-generating').length;\n return `frames ${frames}/${all.length}, clips ${clips}/${all.length}${rendering > 0 ? ` (${rendering} rendering)` : ''}`;\n}\n\n/** Planner polling inside one tool call: ~24s, under the 30s sync window the\n * rest of the package uses. A longer run hands off to action \"status\". */\nconst PLANNER_POLL_MS = 3000;\nconst PLANNER_MAX_POLLS = 8;\n\ntype PlannerOutcome = { film: FilmDto } | { error: string } | { pending: true };\n\n/** Submit a planner run (/script or /plan answer 202 { jobId }) and wait for\n * the film's llmJob with that id to settle, like runPlannerJob in the app. */\n/** `maxPolls` 0 = submit and return (a status call must answer fast; the next\n * status picks the result up). */\nasync function runPlanner(\n ctx: SkillContext,\n filmId: string,\n path: string,\n body: Record<string, unknown>,\n maxPolls = PLANNER_MAX_POLLS,\n): Promise<PlannerOutcome> {\n const submit = await filmApi<{ jobId?: string; film?: FilmDto; error?: string }>(ctx, 'POST', path, body);\n if (submit.data.film) return { film: submit.data.film };\n const jobId = submit.data.jobId;\n if (!jobId) return { error: submit.data.error ?? `HTTP ${submit.status}` };\n const sleep = ctx.pollOverrides?.sleep ?? ((ms: number) => new Promise<void>((r) => setTimeout(r, ms)));\n for (let i = 0; i < maxPolls; i += 1) {\n await sleep(PLANNER_POLL_MS);\n const { data } = await filmApi<{ film?: FilmDto }>(ctx, 'GET', `/api/films/${filmId}`);\n const job = data.film?.llmJob;\n if (!data.film || job?.id !== jobId) continue;\n if (job.status === 'error') return { error: job.error ?? 'the run failed' };\n if (job.status === 'done') return { film: data.film };\n }\n return { pending: true };\n}\n\n/** Cut the song into one chunk per shot (free, hosted ffmpeg; can take a\n * couple of minutes). Returns an error line, or null on success. */\nasync function sliceSong(ctx: SkillContext, film: FilmDto): Promise<string | null> {\n const r = await filmApi<{ error?: string }>(ctx, 'POST', `/api/films/${film.id}/music/slice`, {\n songDurationSec: film.musicDurationSec,\n });\n return r.status === 200 ? null : `Could not cut the song into shots: ${r.data.error ?? r.status}`;\n}\n\nconst isMusicVideo = (f: FilmDto) => f.musicVideoMode === true;\n/** Mirrors musicSyncStatus 'unsynced' in the app: no shot carries a chunk yet. */\nconst needsSlice = (f: FilmDto) => isMusicVideo(f) && shots(f).length > 0 && !shots(f).some((sh) => sh.musicChunkUrl);\n\nfunction plannedText(film: FilmDto, ctx: SkillContext): string {\n const total = shots(film).length;\n const music = isMusicVideo(film);\n const sceneLines = film.scenes.map((s, i) => ` Scene ${i + 1} \"${s.title}\"${s.location ? ` [${s.location}]` : ''}: ${s.shots.length} shots`);\n return [\n `Planned ${music ? 'music video ' : ''}\"${film.title}\" (film_id: ${film.id}): ${film.scenes.length} scenes, ${total} shots, ${film.look}, ${film.aspect}.`,\n ...sceneLines,\n '',\n music\n ? `Nothing has been charged yet. The song is cut into one slice per shot and each clip lip-syncs to its slice on the studio music video engine. Producing renders every shot, charged as each renders. No score is composed: the export plays your song.`\n : `Nothing has been charged yet. Producing renders every shot (roughly 35-40 credits per 5-second shot at default engines, charged as each renders) plus a few credits for the soundtrack.`,\n `Review or edit at ${ctx.baseUrl}/film-studio/${film.id}, or call pixeldojo_film with {\"film_id\": \"${film.id}\", \"action\": \"produce\"} to start production.`,\n ].join('\\n');\n}\n\nconst stillPlanningText = (filmId: string, stage: 'script' | 'plan' = 'plan') =>\n `${stage === 'script' ? 'Still writing the script' : 'Still planning the shots'} for film_id ${filmId}. Nothing has been charged. Call pixeldojo_film with {\"film_id\": \"${filmId}\", \"action\": \"status\"} in ~30s; it returns the plan once it is ready.`;\n\nasync function plan(input: Input, ctx: SkillContext): Promise<SkillResult> {\n const music = Boolean(input.song_url || input.song_path);\n if (!input.idea?.trim() && !input.script?.trim()) {\n return {\n kind: 'text',\n text: music\n ? 'Provide an `idea` describing the visuals of the music video (plus optional `lyrics`).'\n : 'Provide an `idea` (we write the script, free) or a full `script` to plan a film.',\n };\n }\n if (input.song_path && !input.song_url) {\n try {\n input = { ...input, song_url: await uploadLocalFile(input.song_path, ctx) };\n } catch (err) {\n if (err instanceof SkillUploadError) return { kind: 'text', text: `Could not upload the song: ${err.userMessage}` };\n throw err;\n }\n }\n const created = await filmApi<{ film?: FilmDto; error?: string }>(ctx, 'POST', '/api/films', {\n aspect: input.aspect,\n look: input.look ?? (music ? MUSIC_VIDEO_LOOKS[0] : 'live-action'),\n lengthTarget: input.length,\n ...(!music && input.pacing === 'trailer' ? { pacing: 'trailer' } : {}),\n assetIds: [],\n ...(music\n ? {\n // No script step names a music video, so it would stay \"Untitled film\".\n ...(input.idea?.trim() ? { title: input.idea.trim().slice(0, 80) } : {}),\n musicVideoMode: true,\n musicUrl: input.song_url,\n ...(input.song_duration_sec ? { musicDurationSec: input.song_duration_sec } : {}),\n clipEngine: MUSIC_CLIP_ENGINE_ID,\n }\n : {}),\n });\n if (!created.data.film) return { kind: 'text', text: `Could not create the film: ${created.data.error ?? created.status}` };\n const id = created.data.film.id;\n // Cast before writing: the script writer stars attached characters by name\n // and the planner binds them, exactly like the web composer's cast chip.\n const castStarted = Date.now();\n const cast = input.cast?.length ? await applyCast(ctx, id, input.cast) : { lines: [], charged: false };\n // The portraits' time comes out of the planner wait, so the call stays in\n // its sync window; a plan that is not done by then hands off to \"status\".\n const pollBudget = Math.max(0, PLANNER_MAX_POLLS - Math.ceil((Date.now() - castStarted) / PLANNER_POLL_MS));\n // Every reply of this call carries the cast results, and never claims\n // nothing was charged after a portrait was.\n const reply = (text: string, followUp?: SkillResultText['followUp']): SkillResult => ({\n kind: 'text',\n text: [\n ...cast.lines,\n cast.charged ? text.replace(/Nothing has been charged( yet)?\\./g, 'Only the cast portraits above have been charged.') : text,\n ].join('\\n'),\n ...(followUp ? { followUp } : {}),\n });\n\n let planned: PlannerOutcome;\n if (music) {\n // No script step: the planner reads the concept + lyrics directly, and\n // no fitToScript, since the SONG sets the runtime (web composer parity).\n const brief = [input.idea?.trim() || input.script!.trim(), input.lyrics?.trim() ? `Lyrics:\\n${input.lyrics.trim()}` : '']\n .filter(Boolean)\n .join('\\n\\n');\n planned = await runPlanner(ctx, id, `/api/films/${id}/plan`, { script: brief }, pollBudget);\n } else {\n let script = input.script?.trim() ?? '';\n if (!script) {\n const wrote = await runPlanner(ctx, id, `/api/films/${id}/script`, { idea: input.idea!.trim() }, pollBudget);\n if ('pending' in wrote) return reply(stillPlanningText(id, 'script'), keepGoing(id, 30, { soundtrack: input.soundtrack }));\n if ('error' in wrote) return reply(`Script writing failed: ${wrote.error}`);\n script = wrote.film.script ?? '';\n if (!script) return reply('Script writing failed: the studio returned an empty script.');\n }\n planned = await runPlanner(ctx, id, `/api/films/${id}/plan`, { script });\n }\n if ('pending' in planned) return reply(stillPlanningText(id), keepGoing(id, 30, { soundtrack: input.soundtrack }));\n if ('error' in planned) return reply(`Shot planning failed: ${planned.error}`);\n\n const film = planned.film;\n if (needsSlice(film)) {\n const err = await sliceSong(ctx, film);\n if (err) return reply(`${plannedText(film, ctx)}\\n\\n${err} Call action \"status\" to retry the cut.`);\n }\n const uncast = await uncastRolesOf(ctx, id);\n return reply([plannedText(film, ctx), uncast.length ? `\\n${castNeededText(id, uncast)}` : ''].filter(Boolean).join('\\n'));\n}\n\n/** A film whose planning has not landed a storyboard yet: report the running\n * run, or (re)submit the shot plan from the stored script. Null = planned. */\nasync function resumePlanning(film: FilmDto, ctx: SkillContext, soundtrack?: Input['soundtrack']): Promise<SkillResult | null> {\n if (film.scenes.length > 0 && film.llmJob?.status !== 'running') return null;\n if (film.llmJob?.status === 'running') {\n return { kind: 'text', text: stillPlanningText(film.id, film.llmJob.kind === 'script' ? 'script' : 'plan'), followUp: keepGoing(film.id, 30, { soundtrack }) };\n }\n const prior = film.llmJob?.status === 'error' ? `The last planning run failed (${film.llmJob.error ?? 'unknown'}). ` : '';\n if (!film.script?.trim()) {\n return { kind: 'text', text: `${prior}This film has nothing to plan from. Start a new one with action \"plan\".` };\n }\n const planned = await runPlanner(ctx, film.id, `/api/films/${film.id}/plan`, { script: film.script }, 0);\n if ('pending' in planned) return { kind: 'text', text: `${prior}${stillPlanningText(film.id)}`, followUp: keepGoing(film.id, 30, { soundtrack }) };\n if ('error' in planned) return { kind: 'text', text: `Shot planning failed: ${planned.error} Call action \"status\" to retry.` };\n if (needsSlice(planned.film)) {\n const err = await sliceSong(ctx, planned.film);\n if (err) return { kind: 'text', text: `${plannedText(planned.film, ctx)}\\n\\n${err} Call action \"status\" to retry the cut.` };\n }\n return { kind: 'text', text: plannedText(planned.film, ctx) };\n}\n\nasync function produce(filmId: string, soundtrack: Input['soundtrack'], ctx: SkillContext): Promise<SkillResult> {\n const { status, data } = await filmApi<{ film?: FilmDto; error?: string }>(ctx, 'GET', `/api/films/${filmId}`);\n if (!data.film) return noFilm(status, data, filmId, { action: 'produce', soundtrack });\n const planning = await resumePlanning(data.film, ctx, soundtrack);\n if (planning) return planning;\n const uncast = await uncastRolesOf(ctx, filmId);\n if (uncast.length) return { kind: 'text', text: `Nothing was charged. ${castNeededText(filmId, uncast)}` };\n // Before the first frame: a reference for every prop that recurs across\n // shots, or each shot draws its own (the kimchi jar changed shot to shot,\n // 2026-10-03). Only on a film with nothing rendered yet; a failure here\n // never blocks production.\n let propsNote = '';\n if (!shots(data.film).some((sh) => sh.frameUrl)) {\n const locked = await filmApi<{ created?: Array<{ name: string; shots: number }>; creditCost?: number; error?: string }>(\n ctx,\n 'POST',\n `/api/films/${filmId}/props`,\n {},\n ).catch(() => null);\n const made = locked?.status === 200 ? (locked.data.created ?? []) : [];\n if (made.length) {\n propsNote = ` Locked in ${made.length} recurring prop${made.length === 1 ? '' : 's'} first so ${made.length === 1 ? 'it looks' : 'they look'} the same in every shot: ${made.map((m) => `${m.name} (${m.shots} shots)`).join(', ')}${locked?.data.creditCost ? `, ${locked.data.creditCost} credits` : ''}.`;\n }\n }\n const pending = shots(data.film).filter((sh) => sh.status === 'idle' || (sh.status === 'failed' && !sh.frameUrl));\n let fired = 0;\n let refused: string | undefined;\n for (const sh of pending.slice(0, 6)) {\n const r = await filmApi<{ error?: string }>(ctx, 'POST', `/api/films/${filmId}/shots/${sh.id}/generate`, { kind: 'frame' });\n if (r.status === 200) fired += 1;\n else if (!benignDispatchRefusal(r.status, r.data.error)) refused ??= r.data.error ?? `HTTP ${r.status}`;\n }\n // Nothing started and nothing will on its own (credits, a refused shot):\n // say why instead of promising progress a poll can never make.\n if (fired === 0 && refused) {\n return { kind: 'text', text: `Production could not start on \"${data.film.title}\": ${refused}` };\n }\n return {\n kind: 'text',\n text: `Production started on \"${data.film.title}\": ${fired} frame(s) dispatched (each is a normal frame charge; the server's Frame check reviews every one).${propsNote}${refused ? ` Some could not start: ${refused}` : ''} Poll pixeldojo_film with {\"film_id\": \"${filmId}\", \"action\": \"status\"} every ~30 seconds — each poll advances the pipeline.`,\n // The caller's soundtrack choice rides along: the follow-up status calls\n // are the ones that reach the score.\n followUp: keepGoing(filmId, 30, { soundtrack }),\n };\n}\n\nconst LOOK_MUSIC: Record<string, string> = {\n 'live-action': 'modern cinematic underscore, warm strings and soft felt piano, subtle rhythmic pulse, slow emotional build',\n anime: 'sweeping anime film score, lush strings and piano, taiko drum accents, soaring heartfelt theme',\n '3d-animation': 'playful heartfelt family-animation score, pizzicato strings, celesta and warm woodwinds, gentle sense of wonder',\n noir: 'smoky film-noir jazz underscore, brushed drums, upright bass, distant muted trumpet, slow simmering tension',\n horror: 'sparse horror underscore, low cello drones, dissonant string swells, creeping heartbeat pulse, unsettling quiet',\n 'sci-fi': 'atmospheric science-fiction score, analog synth pads, deep sub-bass pulses, shimmering arpeggios, vast and cold',\n documentary: 'understated documentary score, felt piano, soft string beds, organic percussion textures, reflective and true',\n western: 'cinematic western score, lonely twangy guitar, dusty strings, distant horns, wide-open desert tension',\n romance: 'tender romantic score, felt piano and warm strings, soft acoustic guitar, intimate and unhurried, gently swelling',\n 'romantic-comedy': 'bright romantic-comedy score, plucky ukulele and handclaps, warm brushed drums, sunny and flirtatious',\n comedy: 'playful comedy score, bouncy pizzicato strings, cheeky woodwinds, light percussion hits punctuating the gags',\n};\nconst ARC = {\n opening: ['establishing the theme', 'restrained', 'quiet anticipation'],\n middle: ['building tension', 'rising intensity', 'forward motion'],\n finale: ['climactic', 'full arrangement', 'emotional peak resolving to stillness'],\n};\n\n/** Mirrors the studio's scene-synced plan: one section per scene, pinned to\n * the scene runtime, arc styles by position. */\nfunction buildScorePlanBody(film: FilmDto): Record<string, unknown> {\n const scenes = film.scenes.filter((s) => s.shots.length > 0);\n const sections = scenes.flatMap((scene, i) => {\n const runtime = Math.max(3000, Math.round(scene.shots.reduce((n, sh) => n + cutSec(sh), 0) * 1000));\n const styles = i === 0 ? ARC.opening : i === scenes.length - 1 ? ARC.finale : ARC.middle;\n const parts = Math.max(1, Math.ceil(runtime / 120000));\n const partMs = Math.round(runtime / parts);\n return Array.from({ length: parts }, (_, part) => ({\n section_name: parts > 1 ? `${scene.title} (part ${part + 1})` : scene.title,\n positive_local_styles: styles,\n negative_local_styles: [],\n duration_ms: part === parts - 1 ? runtime - partMs * (parts - 1) : partMs,\n lines: [],\n }));\n });\n return {\n composition_plan: {\n positive_global_styles: (LOOK_MUSIC[film.look] ?? LOOK_MUSIC['live-action']).split(', '),\n negative_global_styles: ['vocals', 'singing', 'lyrics'],\n sections,\n },\n respect_sections_durations: true,\n output_format: 'mp3_standard',\n };\n}\n\nfunction buildFlatMusicBody(film: FilmDto, all: FilmShotDto[]): Record<string, unknown> {\n const runtimeSec = all.reduce((n, sh) => n + cutSec(sh), 0);\n // The tool's window is 30s–5min; outside it the schema 400s.\n const ms = Math.min(300000, Math.max(30000, Math.ceil((runtimeSec * 1000) / 5000) * 5000));\n return {\n prompt: `${LOOK_MUSIC[film.look] ?? LOOK_MUSIC['live-action']}. Instrumental only, no vocals. One consistent theme, loopable as a background bed under dialogue.`,\n music_length_ms: ms,\n force_instrumental: true,\n output_format: 'mp3_standard',\n };\n}\n\nasync function advance(filmId: string, soundtrack: Input['soundtrack'], musicJobId: string | undefined, ctx: SkillContext): Promise<SkillResult> {\n const { status, data } = await filmApi<{ film?: FilmDto; error?: string }>(ctx, 'GET', `/api/films/${filmId}?refresh=1`);\n const film = data.film;\n if (!film) return noFilm(status, data, filmId, { action: 'status', soundtrack });\n const all = shots(film);\n\n // Finished?\n if (film.status === 'exported' && film.exportUrl) {\n return {\n kind: 'text',\n text: [\n `Film finished: \"${film.title}\" (${runtimeText(film)})\\nWatch/download: ${film.exportUrl}\\nWorkspace: ${ctx.baseUrl}/film-studio/${film.id}\\nIt is saved in the Library folder \"Film: ${film.title}\".`,\n stillFlagged(film),\n shotIndex(film),\n ].filter(Boolean).join('\\n'),\n };\n }\n const startExport = async (): Promise<string | null> => {\n const r = await filmApi<{ error?: string }>(ctx, 'POST', `/api/films/${filmId}/export`, {});\n // 409: this film's export is already running, which is what we want.\n return r.status === 200 || r.status === 409 ? null : (r.data.error ?? `HTTP ${r.status}`);\n };\n // A failed export with every clip ready: start it again (exports are free\n // and a new one clears the error), with no follow-up, so a cut that keeps\n // failing costs a decision rather than a loop. While shots render again (a\n // redo) the stale error is ignored: the export restarts once they land.\n if (film.exportError && all.length > 0 && all.every((sh) => sh.status === 'clip-ready')) {\n const again = await startExport();\n return {\n kind: 'text',\n text: again\n ? `Export failed: ${film.exportError} Starting it again failed too: ${again}`\n : `The last export failed (${film.exportError}). Started it again; exports are free. Call pixeldojo_film with {\"film_id\": \"${filmId}\", \"action\": \"status\"} in about a minute for the finished film.`,\n };\n }\n const planning = await resumePlanning(film, ctx, soundtrack);\n if (planning) return planning;\n // A music video's clips lip-sync to their slice of the song, and a clip\n // rendered before the cut has no slice to sing to. The cut is free.\n if (needsSlice(film)) {\n const err = await sliceSong(ctx, film);\n if (err) return { kind: 'text', text: `${err} Poll again with action \"status\" to retry.` };\n return {\n kind: 'text',\n text: `Song cut into one slice per shot. Poll again with {\"film_id\": \"${filmId}\", \"action\": \"status\"} to keep production moving.`,\n followUp: keepGoing(filmId, 5, { soundtrack }),\n };\n }\n // Planned but never produced: report the plan. Only `produce` starts\n // charging, so a status poll on a fresh plan must not dispatch frames.\n if (shots(film).length > 0 && shots(film).every((sh) => sh.status === 'idle')) {\n return { kind: 'text', text: plannedText(film, ctx) };\n }\n\n let started = 0;\n const resent = new Set<string>();\n // Dispatches the server refused for a reason that will not clear by\n // itself (credits, an uncast role, an unsaved frame). Reported, and they\n // stop the agent's follow-up: polling again would only be refused again.\n const refusedStarts: string[] = [];\n const dispatch = async (sh: FilmShotDto, kind: 'frame' | 'clip') => {\n const r = await filmApi<{ error?: string }>(ctx, 'POST', `/api/films/${filmId}/shots/${sh.id}/generate`, { kind });\n if (r.status !== 200) {\n if (!benignDispatchRefusal(r.status, r.data.error)) refusedStarts.push(r.data.error ?? `HTTP ${r.status}`);\n return;\n }\n started += 1;\n if (sh.status === 'failed') resent.add(sh.id);\n };\n\n\n // 1) Frames: dispatch idle and failed ones, save finished ones. Frames\n // refuse to paint while a named character is uncast, so say who instead of\n // polling forever (clips wait on every frame anyway).\n const pendingFrames = all.filter((sh) => sh.status === 'idle' || (sh.status === 'failed' && !sh.frameUrl && !isRefused(sh)));\n if (pendingFrames.length > 0) {\n const uncast = await uncastRolesOf(ctx, filmId);\n if (uncast.length) return { kind: 'text', text: castNeededText(filmId, uncast) };\n }\n for (const sh of pendingFrames.slice(0, 6)) await dispatch(sh, 'frame');\n const framesDone = all.every(frameDone);\n if (all.some((sh) => frameDone(sh) && needsSave(sh.frameUrl))) {\n // Save every rendered frame. A frame renders onto the 24h temp CDN and is\n // deleted unless it is saved, and the clip dispatch below refuses to start\n // from a draft — this is the step that keeps the storyboard. The old\n // `approved: true` merge-PATCH no longer does it: approval is a flag, and\n // saving moves bytes. Not held for the last frame: a film paused on one\n // refused shot would otherwise lose every other frame after a day.\n await filmApi(ctx, 'POST', `/api/films/${filmId}/save`, { kind: 'frame' });\n }\n\n // 2) Clips, once every frame is done: keep four in flight, and send failed\n // clips again unless the provider refused them.\n const inFlight = count(film, (sh) => sh.status === 'clip-generating');\n const clipQueue = framesDone\n ? all.filter((sh) => sh.status === 'frame-ready' || (sh.status === 'failed' && frameDone(sh) && !isRefused(sh)))\n : [];\n for (const sh of clipQueue.slice(0, Math.max(0, 4 - inFlight))) await dispatch(sh, 'clip');\n\n // 3) All clips ready → save them, then soundtrack (once), then export.\n const clipsDone = all.length > 0 && all.every((sh) => sh.status === 'clip-ready');\n // A clip the clip check flagged (a face that drifts, a doubled person) gets\n // ONE more take before the cut, never more: Sensei's film exported eight\n // \"check clip\" shots as they were (2026-10-03). Still flagged after its\n // redo, it is exported and named in the finished reply.\n const toRedo = clipsDone ? all.filter((sh) => flaggedClip(sh) && !(sh.manualClipRedos ?? 0)) : [];\n if (toRedo.length) {\n const labels = shotLabels(film);\n const redone: string[] = [];\n let refusedRedo: string | undefined;\n for (const sh of toRedo) {\n const r = await filmApi<{ error?: string }>(ctx, 'POST', `/api/films/${filmId}/shots/${sh.id}/generate`, { kind: 'clip' });\n if (r.status === 200) redone.push(`${labels.get(sh.id)} (${sh.clipQa!.note || sh.clipQa!.issues.join(', ')})`);\n else if (!benignDispatchRefusal(r.status, r.data.error)) refusedRedo ??= r.data.error ?? `HTTP ${r.status}`;\n }\n if (redone.length) {\n return {\n kind: 'text',\n text: `All ${all.length} clips rendered. The clip check flagged ${redone.length}, so each gets one more take before the final cut (a normal clip charge each): ${redone.join('; ')}.${refusedRedo ? ` Another could not start: ${refusedRedo}` : ''} Poll again in ~30s with {\"film_id\": \"${filmId}\", \"action\": \"status\"}.`,\n followUp: keepGoing(filmId, 30, { soundtrack }),\n };\n }\n }\n if (clipsDone) {\n // The studio's editor marks where each clip's action starts and lands\n // about a minute after it arrives. No one is at the storyboard here, so\n // the agent applies the cut as the editor would, before the score is\n // timed to it; it stays undoable in the storyboard.\n const reviewing = all.filter((sh) => editReviewing(sh, Date.now())).length;\n if (reviewing) {\n return {\n kind: 'text',\n text: `All ${all.length} clips ready. The editor is marking where ${reviewing === 1 ? 'the last clip starts and lands' : `${reviewing} clips start and land`} so the cut drops the waiting. Poll again in ~20s with {\"film_id\": \"${filmId}\", \"action\": \"status\"}.`,\n followUp: keepGoing(filmId, 20, { soundtrack }),\n };\n }\n // Then the whole-film pass: keep or leave out, tighter windows, a\n // speed-up for a soft stunt.\n if (editorCutting(film, Date.now())) {\n return {\n kind: 'text',\n text: `All ${all.length} clips ready. The editor is watching the whole film and making the cut. Poll again in ~30s with {\"film_id\": \"${filmId}\", \"action\": \"status\"}.`,\n followUp: keepGoing(filmId, 30, { soundtrack }),\n };\n }\n const openCut = Boolean(film.editorCut?.shots?.length && !film.editorCut.appliedAt && !film.editorCut.skipped);\n if (openCut || all.some(openEdit)) {\n const cut = await filmApi<{ film?: FilmDto }>(ctx, 'POST', `/api/films/${filmId}/edit`, { action: 'apply' });\n if (cut.data.film) film.scenes = cut.data.film.scenes;\n }\n // Same 24h clock as frames, and the export refuses to stitch a draft clip\n // (blocker reason 'needs-save'). Saving also files each clip into the\n // film's Library folder, which is where this skill tells the caller to\n // look for them.\n if (all.some((sh) => needsSave(sh.videoUrl))) {\n await filmApi(ctx, 'POST', `/api/films/${filmId}/save`, { kind: 'clip' });\n }\n const hasMusic = film.audioStems.some((st) => st.kind === 'music');\n // A music video's song IS the soundtrack (the export mutes the clips and\n // lays it): never compose, and never charge, a score for one.\n if (soundtrack !== 'none' && !hasMusic && !isMusicVideo(film)) {\n // A previous poll started the score — attach it when done.\n if (musicJobId) {\n const job = await ctx.client.getJob(musicJobId);\n // `audio` is in the live API response; older @pixeldojo/sdk type\n // versions predate the field, so read it structurally.\n const out = job.output as { audio?: string; video?: string; images?: string[] } | undefined;\n const outUrl = out?.audio ?? out?.video ?? out?.images?.[0];\n if (job.status === 'completed' && typeof outUrl === 'string') {\n await filmApi(ctx, 'PATCH', `/api/films/${filmId}`, { audioStems: [{ kind: 'music', url: outUrl }] });\n const exportError = await startExport();\n if (exportError) return { kind: 'text', text: `Score attached, but the export could not start: ${exportError}` };\n return {\n kind: 'text',\n text: `Score attached — export started. Poll again in ~60s with {\"film_id\": \"${filmId}\", \"action\": \"status\"} for the finished film URL.`,\n followUp: keepGoing(filmId, 60, { soundtrack }),\n };\n }\n if (job.status === 'failed') {\n return { kind: 'text', text: `The score failed (${job.error ?? 'unknown'}) and was refunded. Poll again to retry, or pass soundtrack \"none\" to export without music.` };\n }\n return {\n kind: 'text',\n text: `Score still composing. Poll again in ~20s with {\"film_id\": \"${filmId}\", \"action\": \"status\", \"music_job_id\": \"${musicJobId}\"}.`,\n followUp: keepGoing(filmId, 20, { soundtrack, music_job_id: musicJobId }),\n };\n }\n // Dispatch the score through the public API (same engine as the studio).\n const body = soundtrack === 'scene-synced' ? buildScorePlanBody(film) : buildFlatMusicBody(film, shots(film));\n const dispatch = await ctx.client.run('text-to-music', body as never);\n return {\n kind: 'text',\n text: `All ${all.length} clips ready — the ${soundtrack} score is composing (charged like any music generation). Poll again in ~20s with {\"film_id\": \"${filmId}\", \"action\": \"status\", \"music_job_id\": \"${dispatch.jobId}\"}.`,\n followUp: keepGoing(filmId, 20, { soundtrack, music_job_id: dispatch.jobId }),\n };\n }\n const exportError = await startExport();\n if (exportError) return { kind: 'text', text: `All clips ready, but the export could not start: ${exportError}` };\n return {\n kind: 'text',\n text: `All clips ready — export started (${progressLine(film)}). Poll again in ~60s with action \"status\" for the finished film URL.`,\n followUp: keepGoing(filmId, 60, { soundtrack }),\n };\n }\n\n const failed = all.filter((sh) => sh.status === 'failed');\n const refused = failed.filter(isRefused);\n const retrying = failed.filter((sh) => !isRefused(sh));\n const sentAgain = retrying.filter((sh) => resent.has(sh.id)).length;\n // Nothing rendering and nothing left to start: only a person can move it.\n const rendering = all.some((sh) => sh.status === 'frame-generating' || sh.status === 'clip-generating');\n const paused = refused.length > 0 && started === 0 && !rendering;\n // Moving = a later status call has something to collect or start. A film\n // where every start was refused is not moving, whatever the counts say.\n const moving = started > 0 || rendering;\n const labels = shotLabels(film);\n // The studio ends every failure with \"Retry the shot.\", advice meant for its\n // own button, which reads as a contradiction next to \"not resent\".\n const reason = (sh: FilmShotDto) => {\n const text = (sh.errorMessage ?? 'no reason given').replace(/\\s*Retry (?:the shot|it)\\.\\s*$/i, '');\n return text.length > 300 ? `${text.slice(0, 297)}...` : text;\n };\n const one = refused.length === 1;\n return {\n kind: 'text',\n text: [\n `${paused ? 'Paused' : 'In progress'}: ${progressLine(film)}.`,\n refused.length > 0\n ? `${one ? 'Shot' : 'Shots'} ${refused.map((sh) => labels.get(sh.id)).join(', ')} need${one ? 's' : ''} a new frame or prompt. The provider refused ${one ? 'it' : 'them'} (${reason(refused[0])}) and usually refuses the same input again, so status does not resend ${one ? 'it' : 'them'}: every retry is a charged render. Change ${one ? 'it' : 'them'} and render again at ${ctx.baseUrl}/film-studio/${filmId}.`\n : '',\n retrying.length > 0\n ? `${retrying.length} shot(s) failed (${reason(retrying[0])}): ${sentAgain === retrying.length ? 'sent again' : sentAgain > 0 ? `${sentAgain} sent again, the rest on a later poll` : 'sent again on a later poll'}.`\n : '',\n refusedStarts.length > 0 ? `${refusedStarts.length} render(s) could not start: ${refusedStarts[0]}` : '',\n paused\n ? `Nothing else is rendering. Once the shot${one ? '' : 's'} render${one ? 's' : ''} again, call pixeldojo_film with {\"film_id\": \"${filmId}\", \"action\": \"status\"} to carry on.`\n : moving\n ? `Poll again in ~30s with {\"film_id\": \"${filmId}\", \"action\": \"status\"}.`\n : `Nothing is rendering. Fix what is above, then call pixeldojo_film with {\"film_id\": \"${filmId}\", \"action\": \"status\"} to carry on.`,\n ].filter(Boolean).join('\\n'),\n ...(moving && !paused ? { followUp: keepGoing(filmId, 30, { soundtrack }) } : {}),\n };\n}\n\n/** One line per shot, so a caller can name the shot to redo. Long films are\n * left to the storyboard: 60 lines would drown the reply. */\n/** Clips still flagged after their one automatic redo: named, so the user\n * decides whether another take is worth a clip charge. */\nfunction stillFlagged(f: FilmDto): string {\n const labels = shotLabels(f);\n const flagged = shots(f).filter(flaggedClip);\n if (!flagged.length) return '';\n return `The clip check still flags ${flagged.length} after one redo each: ${flagged\n .map((sh) => `${labels.get(sh.id)} (${sh.clipQa!.note || sh.clipQa!.issues.join(', ')})`)\n .join('; ')}. Ask the user before another take (action \"redo\", a clip charge each).`;\n}\n\nfunction shotIndex(f: FilmDto): string {\n const all = shots(f);\n if (all.length === 0 || all.length > 24) return '';\n const labels = shotLabels(f);\n let at = 0;\n const clock = (sec: number) => `${Math.floor(sec / 60)}:${String(Math.round(sec % 60)).padStart(2, '0')}`;\n const lines = all.map((sh) => {\n const from = at;\n at += cutSec(sh);\n const what = sh.prompt.replace(/\\s+/g, ' ').trim();\n const when = sh.leftOut ? 'left out of the cut' : `about ${clock(from)}-${clock(at)}`;\n return ` ${labels.get(sh.id)} (${when}): ${what.length > 70 ? `${what.slice(0, 67)}...` : what}`;\n });\n return ['Shots (redo any with action \"redo\" and its label):', ...lines].join('\\n');\n}\n\n/** Render a new take of chosen shots: the clip again from the same frame, or\n * a new frame and then its clip. Charged per render, like the storyboard's\n * own Redo. Status then saves the take and cuts a new export with it. */\nasync function redoShots(input: Input, ctx: SkillContext): Promise<SkillResult> {\n const filmId = input.film_id!;\n if (!input.shots?.length) {\n return { kind: 'text', text: 'Pass shots: the labels status reports, like [\"2.3\"] for scene 2, shot 3.' };\n }\n const { status, data } = await filmApi<{ film?: FilmDto; error?: string }>(ctx, 'GET', `/api/films/${filmId}`);\n const film = data.film;\n if (!film) return noFilm(status, data, filmId, { action: 'redo', shots: input.shots, redo: input.redo });\n const labels = shotLabels(film);\n const byLabel = new Map(shots(film).map((sh) => [labels.get(sh.id)!, sh] as const));\n const byId = new Map(shots(film).map((sh) => [sh.id, sh] as const));\n const kind = input.redo;\n const lines: string[] = [];\n let started = 0;\n let credits = 0;\n for (const ref of Array.from(new Set(input.shots))) {\n const sh = byLabel.get(ref) ?? byId.get(ref);\n if (!sh) {\n lines.push(`No shot ${ref} in this film (shots run 1.1 to ${Array.from(byLabel.keys()).pop()}).`);\n continue;\n }\n const label = labels.get(sh.id)!;\n if (kind === 'clip' && !sh.frameUrl) {\n lines.push(`Shot ${label} has no frame yet, so there is no clip to redo. Redo it with redo \"frame\".`);\n continue;\n }\n const r = await filmApi<{ creditCost?: number; error?: string }>(ctx, 'POST', `/api/films/${filmId}/shots/${sh.id}/generate`, { kind });\n if (r.status === 200) {\n started += 1;\n credits += r.data.creditCost ?? 0;\n lines.push(`Shot ${label}: new ${kind} rendering${r.data.creditCost ? ` (${r.data.creditCost} credits)` : ''}.`);\n } else {\n lines.push(`Shot ${label}: could not start: ${r.data.error ?? `HTTP ${r.status}`}`);\n }\n }\n if (started === 0) return { kind: 'text', text: [...lines, 'Nothing was started.'].join('\\n') };\n return {\n kind: 'text',\n text: [\n ...lines,\n `${credits ? `${credits} credits charged for the new take${started > 1 ? 's' : ''}. ` : ''}${kind === 'frame' ? 'Each new frame gets the Frame check, then a new clip. ' : ''}The new take replaces the old one; keep calling pixeldojo_film with {\"film_id\": \"${filmId}\", \"action\": \"status\"}, which saves it and cuts a new export with it.`,\n ].join('\\n'),\n followUp: keepGoing(filmId, 30, { soundtrack: input.soundtrack }),\n };\n}\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n const action =\n input.action === 'plan' && input.film_id ? (input.cast?.length ? 'cast' : 'status') : input.action;\n if (action === 'plan') return plan(input, ctx);\n if (!input.film_id) return { kind: 'text', text: 'produce/status/cast/redo need the film_id returned by the plan step.' };\n if (action === 'cast') {\n if (!input.cast?.length) return { kind: 'text', text: 'Pass cast: [{ name, prompt | image_urls | character_id }] to cast characters (add replace: true to swap someone already cast, or remove: true to take them off).' };\n const { lines } = await applyCast(ctx, input.film_id, input.cast);\n const uncast = await uncastRolesOf(ctx, input.film_id);\n return {\n kind: 'text',\n text: [\n ...lines,\n uncast.length\n ? castNeededText(input.film_id, uncast)\n : `Everyone is cast. Call pixeldojo_film with {\"film_id\": \"${input.film_id}\", \"action\": \"produce\"} to start production.`,\n ].join('\\n'),\n };\n }\n if (action === 'produce') return produce(input.film_id, input.soundtrack, ctx);\n if (action === 'redo') return redoShots(input, ctx);\n return advance(input.film_id, input.soundtrack, input.music_job_id, ctx);\n}\n\nexport const filmSkill: SkillModule<Input> = {\n name: 'pixeldojo_film',\n description:\n 'Make a finished short film from one idea: screenplay, storyboard frames (AI-reviewed), video clips with spoken dialogue, scene-synced soundtrack, stitched export. Or a music video: pass song_path (a local file) or song_url (your own PixelDojo upload from pixeldojo_upload, never a third-party link) with optional lyrics; the film is cut to that song, each clip lip-synced to its slice on the studio music video engine, and no score is composed: the export plays the song. Every named character must be cast (cast: your own images, a portrait prompt, or a Character Studio character) before frames render; cast entries can also replace or remove someone. Phased: plan is free; cast; produce starts charged generation; status advances production (poll every ~30s); redo renders a new take of chosen shots and status re-exports.',\n hostedDescription:\n 'Make a finished short film from one idea: screenplay, storyboard frames (AI-reviewed), video clips with spoken dialogue, scene-synced soundtrack, stitched export. Or a music video: pass song_url (your own PixelDojo upload made with POST /api/v1/upload, never a third-party link) with optional lyrics; the film is cut to that song, each clip lip-synced to its slice on the studio music video engine, and no score is composed: the export plays the song. Every named character must be cast (cast: your own images, a portrait prompt, or a Character Studio character) before frames render; cast entries can also replace or remove someone. Phased: plan is free; cast; produce starts charged generation; status advances production (poll every ~30s); redo renders a new take of chosen shots and status re-exports.',\n inputZod: InputSchema as unknown as z.ZodType<Input>,\n inputJsonSchema: InputJsonSchema,\n allowedModels: [],\n defaultModel: '',\n run,\n};\n","/**\n * pixeldojo_video: Video Studio's Change / Move / Extend verbs for agents.\n *\n * (\"Make\" is pixeldojo_generate.) Every engine choice here is Video Studio's\n * own: the per-verb lists below are a hand-copy of `enginesFor(verb)` in the\n * app's lib/video-studio/engines.ts (default first, public apiIds), and each\n * payload mirrors that engine's `buildPayload` there. The package cannot\n * import app code, so tests/contracts/mcp-video-studio-parity.test.ts pins\n * both: the lists must equal the studio's, and every payload built here must\n * pass the real tool schema and use the tool's declared `media` keys.\n *\n * ponytail: payload keys are static per engine rather than resolved from\n * GET /schema at runtime. The contract test checks them against each tool's\n * declared `media` block, so drift fails CI instead of a paid job, and a\n * call costs no schema fetch.\n */\nimport { z } from 'zod';\nimport { pollJobUntilDoneOrHandoff } from '../poll.js';\nimport {\n type SkillContext,\n type SkillModule,\n type SkillResult,\n pollResultToSkillResult,\n} from './types.js';\nimport { SkillUploadError, uploadLocalFile } from './upload-helpers.js';\nimport { PARAMS_JSON_SCHEMA, ParamsInput, applyParams, paramsWithoutModel, prefixNote } from './params.js';\n\nexport type VideoVerb = 'change' | 'move' | 'extend';\n\n/** Mirror of enginesFor(verb).map(e => e.apiModelId ?? e.apiId). Default first. */\nexport const VIDEO_STUDIO_ENGINES: Record<VideoVerb, readonly string[]> = {\n change: [\n 'seedance-2-5-video-edit',\n 'flux-video-edit',\n 'kling-video-edit',\n 'wan-video-edit',\n 'seedance-video-edit',\n 'happyhorse-1.0-video-edit',\n 'xai-video-edit',\n ],\n move: ['kling-motion-control', 'wan-video-character-swap'],\n extend: ['seedance-2-5-video-edit', 'wan-2.7-i2v', 'grok-video-extend'],\n};\n\nconst VERBS = ['change', 'move', 'extend'] as const;\n\n/** Only one extend engine can run a clip backwards (engines.ts `directions`). */\nconst BACKWARD_ENGINES = new Set(['seedance-2-5-video-edit']);\n\nexport interface VideoPayloadInput {\n prompt?: string;\n videoUrl: string;\n images: string[];\n /** Source clip length in seconds. */\n videoDuration?: number;\n duration?: number;\n direction?: 'forward' | 'backward';\n}\n\ntype Built = { body: { prompt: string; [key: string]: unknown }; note?: string } | { error: string };\n\nconst clamp = (n: number, min: number, max: number) => Math.min(max, Math.max(min, Math.round(n)));\n\n/** Engines whose schema requires the source length (their credit meter). */\nconst NEEDS_VIDEO_DURATION = new Set([\n 'flux-video-edit',\n 'kling-video-edit',\n 'wan-video-edit',\n 'seedance-video-edit',\n 'happyhorse-1.0-video-edit',\n 'xai-video-edit',\n 'kling-motion-control',\n 'wan-video-character-swap',\n]);\n\n/** Change engines with no reference-image slot. */\nconst NO_IMAGE_ENGINES = new Set(['flux-video-edit', 'xai-video-edit']);\n\n/** Each engine's payload, mirroring buildPayload in lib/video-studio/engines.ts. */\nexport function buildVideoPayload(verb: VideoVerb, apiId: string, i: VideoPayloadInput): Built {\n const prompt = i.prompt ?? '';\n const vd = i.videoDuration;\n if (NEEDS_VIDEO_DURATION.has(apiId) && vd === undefined) {\n return {\n error: `${apiId} needs video_duration: the source clip's length in seconds (it sets the credit cost).`,\n };\n }\n if (verb === 'move' && !i.images[0]) {\n return { error: `The move verb needs image_url: the character image to put into the video.` };\n }\n const droppedImages =\n i.images.length > 0 && (verb === 'extend' || NO_IMAGE_ENGINES.has(apiId))\n ? `${apiId} takes no reference images, so I left them off.`\n : undefined;\n\n if (verb === 'change') {\n switch (apiId) {\n case 'seedance-2-5-video-edit':\n return {\n body: {\n mode: 'edit',\n prompt,\n video_url: i.videoUrl,\n reference_images: i.images,\n ...(vd !== undefined ? { source_duration_seconds: vd } : {}),\n },\n };\n case 'flux-video-edit':\n // Schema is .int(); a probed 7.4s float is rejected.\n return { body: { prompt, video: i.videoUrl, video_duration: Math.ceil(vd!) }, note: droppedImages };\n case 'xai-video-edit':\n return { body: { prompt, video_url: i.videoUrl, video_duration: vd }, note: droppedImages };\n case 'happyhorse-1.0-video-edit':\n return { body: { prompt, video_url: i.videoUrl, video_duration: vd, reference_urls: i.images } };\n default: // kling-video-edit, wan-video-edit, seedance-video-edit\n return { body: { prompt, video_url: i.videoUrl, video_duration: vd, image_urls: i.images } };\n }\n }\n\n if (verb === 'move') {\n if (apiId === 'wan-video-character-swap') {\n // No prompt field on this tool; the SDK needs the key and the schema strips it.\n return { body: { prompt: '', image_url: i.images[0], video_url: i.videoUrl, video_duration: vd } };\n }\n return {\n body: {\n prompt,\n video: i.videoUrl,\n video_duration: vd,\n character_image: i.images[0],\n // Not a background toggle: 'video' is the 30s duration cap.\n character_orientation: 'video',\n },\n };\n }\n\n // extend\n switch (apiId) {\n case 'seedance-2-5-video-edit':\n return {\n body: {\n mode: 'extend',\n prompt,\n video_url: i.videoUrl,\n direction: i.direction ?? 'forward',\n duration: clamp(i.duration ?? 5, 4, 30),\n ...(vd !== undefined ? { source_duration_seconds: vd } : {}),\n },\n note: droppedImages,\n };\n case 'wan-2.7-i2v': {\n const chosen = clamp(i.duration ?? 5, 2, 15);\n return {\n body: {\n mode: 'video-extend',\n prompt,\n video_url: i.videoUrl,\n // A continuation shorter than its own source is rejected outright.\n duration: vd ? Math.min(15, Math.max(chosen, Math.ceil(vd) + 1)) : chosen,\n ...(vd ? { source_video_duration: vd } : {}),\n },\n note: droppedImages,\n };\n }\n default: // grok-video-extend: duration is the seconds ADDED; the server measures the source.\n return {\n body: { prompt, video_url: i.videoUrl, extension_duration: clamp(i.duration ?? 6, 2, 10) },\n note: droppedImages,\n };\n }\n}\n\nconst InputSchema = z.object({\n verb: z.enum(VERBS),\n prompt: z.string().max(8000).optional(),\n video_url: z.string().url().optional(),\n video_path: z.string().min(1).optional(),\n image_url: z.string().url().optional(),\n image_urls: z.array(z.string().url()).optional(),\n image_path: z.string().min(1).optional(),\n model: z.string().optional(),\n video_duration: z.number().positive().optional(),\n duration: z.number().int().positive().optional(),\n direction: z.enum(['forward', 'backward']).optional(),\n params: ParamsInput,\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst engineList = (verb: VideoVerb) =>\n `${verb}: ${VIDEO_STUDIO_ENGINES[verb].join(', ')} (default ${VIDEO_STUDIO_ENGINES[verb][0]})`;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n verb: {\n type: 'string',\n enum: VERBS,\n description:\n 'change = restyle or edit an existing clip; move = put a character image into a driving video (motion transfer / character swap); extend = continue a clip forward (or backward on the default engine).',\n },\n prompt: {\n type: 'string',\n description:\n 'What to change, how the character should move, or what happens next. Required for change and extend. Optional for move (wan-video-character-swap ignores it). @Name uses a character or element the user saved in Character Studio (photos attached automatically).',\n },\n video_url: {\n type: 'string',\n format: 'uri',\n description: 'The source clip (change, extend) or the driving motion clip (move). Required.',\n },\n video_path: {\n type: 'string',\n description: 'Absolute local path to the source clip (MP4, WebM, MOV). Uploaded to 24h temp storage and used as video_url.',\n },\n image_url: {\n type: 'string',\n format: 'uri',\n description: 'The character image (move, required) or a reference image (change, optional; some engines take none).',\n },\n image_urls: {\n type: 'array',\n items: { type: 'string', format: 'uri' },\n description: 'More reference images for change engines that take a set. Move uses the first image only.',\n },\n image_path: {\n type: 'string',\n description: 'Absolute local path to the character or reference image. Uploaded to 24h temp storage and used as image_url.',\n },\n model: {\n type: 'string',\n description: `Video Studio engine for this verb. Omit for the default. ${VERBS.map((v) => engineList(v)).join('; ')}. A model not on the verb's list is replaced by the default and the result says so.`,\n },\n video_duration: {\n type: 'number',\n description:\n \"The source clip's length in seconds. Required by every engine except the change/extend default and grok-video-extend, since it sets their credit cost.\",\n },\n duration: {\n type: 'integer',\n description:\n 'Extend only: output length in seconds (default engine 4-30, wan-2.7-i2v 2-15 total), or seconds added on grok-video-extend (2-10). Ignored by change and move, which keep the source length.',\n },\n direction: {\n type: 'string',\n enum: ['forward', 'backward'],\n description: 'Extend only. backward adds footage before the clip; only the default engine supports it.',\n },\n params: PARAMS_JSON_SCHEMA,\n },\n required: ['verb'],\n} as const;\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n const paramsGate = paramsWithoutModel(input.params, input.model);\n if (paramsGate) return { kind: 'text', text: paramsGate };\n\n const verb = input.verb;\n const engines = VIDEO_STUDIO_ENGINES[verb];\n const notes: string[] = [];\n\n // Substitute, never dead-end: a model that is not one of this verb's\n // Video Studio engines runs on the verb default instead.\n let apiId = input.model ?? engines[0];\n if (!engines.includes(apiId)) {\n notes.push(`${apiId} is not a Video Studio ${verb} engine, so I used ${engines[0]} instead.`);\n apiId = engines[0];\n }\n if (verb === 'extend' && input.direction === 'backward' && !BACKWARD_ENGINES.has(apiId)) {\n notes.push(`${apiId} only extends forward, so I used ${engines[0]} to extend backward.`);\n apiId = engines[0];\n }\n\n let videoUrl = input.video_url;\n const images = [...(input.image_url ? [input.image_url] : []), ...(input.image_urls ?? [])];\n try {\n if (!videoUrl && input.video_path) videoUrl = await uploadLocalFile(input.video_path, ctx);\n if (!input.image_url && input.image_path) images.unshift(await uploadLocalFile(input.image_path, ctx));\n } catch (err) {\n if (err instanceof SkillUploadError) {\n return { kind: 'text', text: `pixeldojo_video (upload): ${err.userMessage}` };\n }\n throw err;\n }\n\n if (!videoUrl) {\n return {\n kind: 'text',\n text: `pixeldojo_video ${verb} needs video_url: the ${verb === 'move' ? 'driving motion clip' : 'source clip'}.`,\n };\n }\n if (verb !== 'move' && !input.prompt?.trim()) {\n return { kind: 'text', text: `pixeldojo_video ${verb} needs a prompt.` };\n }\n\n const built = buildVideoPayload(verb, apiId, {\n prompt: input.prompt,\n videoUrl,\n images: images.filter((u, i, all) => all.indexOf(u) === i),\n videoDuration: input.video_duration,\n duration: input.duration,\n direction: input.direction,\n });\n if ('error' in built) return { kind: 'text', text: `pixeldojo_video: ${built.error}` };\n if (built.note) notes.push(built.note);\n\n const body = built.body;\n const paramsNote = applyParams(body, input.params, input.model, apiId);\n if (paramsNote) notes.push(paramsNote);\n\n const submitted = await ctx.client.run(apiId, body);\n const result = await pollJobUntilDoneOrHandoff(\n submitted.jobId,\n (id) => ctx.client.getJob(id),\n ctx.buildStatusUrl,\n { now: ctx.pollOverrides?.now, sleep: ctx.pollOverrides?.sleep },\n );\n\n return prefixNote(\n pollResultToSkillResult(result, (urls) =>\n urls.length === 0\n ? `Job ${submitted.jobId} completed but returned no assets.`\n : `Video ready (${verb} on ${apiId}). Asset: ${urls.join(', ')}`,\n ),\n notes.join(' '),\n );\n}\n\nconst BASE_DESCRIPTION =\n \"Video Studio verbs for an existing clip, on the same engines the studio uses. verb=change restyles or edits a clip (prompt + video_url, optional reference images). verb=move puts a character image into a driving video's motion (video_url + image_url + video_duration). verb=extend continues a clip forward, or backward on the default engine (prompt + video_url, optional duration and direction). Omit `model` for the studio default; engine-specific settings go in `params` with an explicit `model`. To make a new video, use pixeldojo_generate. Returns asset URLs, or a jobId for pixeldojo_status when the job outlasts the 30s wait.\";\n\nexport const videoSkill: SkillModule<Input> = {\n name: 'pixeldojo_video',\n description: `${BASE_DESCRIPTION} Local files: video_path / image_path (uploaded to 24h temp storage first).`,\n hostedDescription: `${BASE_DESCRIPTION} Media must be public http(s) URLs.`,\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n allowedModels: Array.from(new Set(VERBS.flatMap((v) => VIDEO_STUDIO_ENGINES[v]))),\n defaultModel: VIDEO_STUDIO_ENGINES.change[0],\n run,\n};\n","/**\n * pixeldojo_episode — one topic in, a finished narrated faceless video out.\n *\n * Drives the real Faceless Studio pipeline (the same\n * /api/faceless-studio/episodes routes the web app uses; they accept the\n * MCP's Bearer credential). Phased like pixeldojo_film:\n *\n * 1. CREATE (free): { topic } → creates the episode, writes the script and\n * scene plan, returns episode_id and the credit quote. Nothing charged.\n * 2. PRODUCE (charged, advances one step per call):\n * narration → scene renders (four at a time) → music bed → export →\n * save. Every charged step says what it cost. Call it every ~30s until it\n * returns the finished video URL.\n * 3. STATUS (free, read-only): progress and the current quote.\n *\n * Rendering happens server-side (the `.../generate` routes), so the charge\n * for each render is the same tool at the same price the web app uses.\n */\nimport { z } from 'zod';\nimport type { SkillContext, SkillModule, SkillResult } from './types.js';\n\n// Mirrors of the studio's constants (lib/faceless-studio/shared.ts). This\n// package cannot import the app, so tests/contracts/mcp-episode-parity.test.ts\n// pins these to the originals.\nconst STYLES = ['editorial-motion', 'paper-diorama', 'hand-drawn', 'storybook', 'poster-vector', 'soft-3d'] as const;\nconst CATEGORIES = ['education', 'history', 'kids', 'storytelling', 'custom'] as const;\nconst ENGINES = ['omni-draft', 'omni-final', 'still-motion'] as const;\nconst MIN_SECONDS = 60;\nconst MAX_SECONDS = 300;\n\n/** Scene renders in flight at once, same as the web page's queue. */\nconst MAX_IN_FLIGHT = 4;\n\nconst InputSchema = z.object({\n action: z.enum(['create', 'produce', 'status']).default('create'),\n topic: z.string().min(8).max(400).optional(),\n episode_id: z.string().max(40).optional(),\n category: z.enum(CATEGORIES).default('education'),\n style: z.enum(STYLES).default('editorial-motion'),\n aspect: z.enum(['16:9', '9:16']).default('16:9'),\n length_seconds: z.number().int().min(MIN_SECONDS).max(MAX_SECONDS).default(120),\n voice: z.string().min(1).max(80).default('Wise_Woman'),\n engine: z.enum(ENGINES).optional(),\n music: z.boolean().default(true),\n title: z.string().max(120).optional(),\n});\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema: Record<string, unknown> = {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['create', 'produce', 'status'],\n description:\n 'create (default, free): writes the script and scene plan, returns episode_id and the credit quote. produce (charged): advances production one step (narration, scene renders, music, export, save) and reports what that step cost; call it every ~30s until it returns the finished video URL. status (free): progress only.',\n },\n topic: { type: 'string', description: 'Create step: what the episode is about, 8 to 400 characters.' },\n episode_id: { type: 'string', description: 'The episode_id from the create step. Required for produce and status.' },\n category: { type: 'string', enum: [...CATEGORIES], description: 'Create step: tone of the script. Default education.' },\n style: { type: 'string', enum: [...STYLES], description: 'Create step: visual style of every scene. Default editorial-motion.' },\n aspect: { type: 'string', enum: ['16:9', '9:16'], description: 'Create step: 16:9 landscape (default) or 9:16 vertical.' },\n length_seconds: { type: 'integer', minimum: MIN_SECONDS, maximum: MAX_SECONDS, description: 'Create step: target length in seconds. Default 120.' },\n voice: { type: 'string', description: 'Create step: narrator voice id from the text-to-speech tool (e.g. Wise_Woman, Deep_Voice_Man, Friendly_Person). Default Wise_Woman.' },\n engine: {\n type: 'string',\n enum: [...ENGINES],\n description:\n 'Create step (optional): render every scene with one engine. omni-draft: fast, cheap motion preview. omni-final: full quality motion with sound. still-motion: one illustration per scene, gently panned, cheapest. Default: the style picks.',\n },\n music: { type: 'boolean', description: 'Create step: add a music bed under the narration. Default true.' },\n title: { type: 'string', description: 'Create step (optional): episode title. Defaults to the topic.' },\n },\n};\n\ninterface Render {\n status: 'idle' | 'running' | 'done' | 'failed';\n url: string | null;\n error?: string;\n stale?: boolean;\n}\ninterface SceneDto {\n id: string;\n narration: string;\n visualPrompt: string;\n engine: string;\n shotSeconds: number;\n render: Render;\n}\ninterface EpisodeDto {\n id: string;\n title: string;\n plan: { job: { status: 'running' | 'done' | 'error'; error?: string } | null; script: unknown | null };\n narration: { status: Render['status']; audioUrl: string | null; error?: string } | null;\n scenes: SceneDto[];\n music: { status: Render['status']; url: string | null; error?: string } | null;\n musicEnabled: boolean;\n export: { status: 'idle' | 'running' | 'done' | 'failed'; url: string | null; error?: string; stale?: boolean } | null;\n savedAt: string | null;\n}\ninterface Price {\n scenes: number;\n narration: number;\n music: number;\n total: number;\n}\ntype EpisodeReply = { episode?: EpisodeDto; price?: Price; error?: string; creditCost?: number };\n\nasync function episodeApi(\n ctx: SkillContext,\n method: string,\n path: string,\n body?: unknown,\n): Promise<{ status: number; data: EpisodeReply }> {\n const res = await fetch(`${ctx.baseUrl}/api/faceless-studio/episodes${path}`, {\n method,\n headers: {\n Authorization: `Bearer ${ctx.apiKey}`,\n 'Content-Type': 'application/json',\n 'x-pixeldojo-source': `mcp/${ctx.mcpVersion}`,\n 'x-pixeldojo-skill': 'episode',\n },\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n });\n const data = (await res.json().catch(() => ({}))) as EpisodeReply;\n return { status: res.status, data };\n}\n\nconst call = (id: string, action: 'produce' | 'status') =>\n `pixeldojo_episode with {\"episode_id\": \"${id}\", \"action\": \"${action}\"}`;\nconst next = (id: string, action: 'produce' | 'status', wait: string) => `Call ${call(id, action)} in ${wait}.`;\n\n/** Same test as the web page's queue: what still has to be rendered. */\nconst needsRender = (s: SceneDto) =>\n s.render.status !== 'running' &&\n (s.render.status === 'idle' || s.render.status === 'failed' || Boolean(s.render.stale) || !s.render.url);\n\nfunction quoteText(ep: EpisodeDto, price: Price | undefined, ctx: SkillContext): string {\n const engines = [...new Set(ep.scenes.map((s) => s.engine))].join(', ');\n const seconds = ep.scenes.reduce((n, s) => n + s.shotSeconds, 0);\n return [\n `Planned \"${ep.title}\" (episode_id: ${ep.id}): ${ep.scenes.length} scenes, about ${Math.round(seconds)}s of picture, engine ${engines}.`,\n ...ep.scenes.slice(0, 12).map((s, i) => ` ${i + 1}. ${s.narration.slice(0, 110)}`),\n ...(ep.scenes.length > 12 ? [` ... and ${ep.scenes.length - 12} more.`] : []),\n '',\n price\n ? `Nothing has been charged yet. Producing it costs about ${price.total} credits at list price: scenes ${price.scenes}, narration ${price.narration}, music ${price.music}. Each part is charged as it renders; an active sale can make it lower.`\n : 'Nothing has been charged yet.',\n `Review or edit at ${ctx.baseUrl}/faceless-studio?episode=${ep.id}, or call ${call(ep.id, 'produce')} to start production.`,\n ].join('\\n');\n}\n\nconst PLAN_POLL_MS = 3000;\nconst PLAN_MAX_POLLS = 8;\n\n/** Wait for the plan job inside one tool call (~24s, under the 30s window). */\nasync function waitForPlan(ctx: SkillContext, id: string): Promise<EpisodeReply | null> {\n const sleep = ctx.pollOverrides?.sleep ?? ((ms: number) => new Promise<void>((r) => setTimeout(r, ms)));\n for (let i = 0; i < PLAN_MAX_POLLS; i += 1) {\n await sleep(PLAN_POLL_MS);\n const { data } = await episodeApi(ctx, 'GET', `/${id}`);\n if (data.episode?.plan.job?.status !== 'running') return data;\n }\n return null;\n}\n\nconst stillPlanning = (id: string) =>\n `The script is still being written (episode_id: ${id}). Nothing has been charged. ${next(id, 'status', '~30s')}`;\n\nasync function setEngine(ctx: SkillContext, ep: EpisodeDto, engine: string): Promise<EpisodeReply> {\n const { data } = await episodeApi(ctx, 'PATCH', `/${ep.id}`, {\n scenes: ep.scenes.map((s) => ({ id: s.id, narration: s.narration, visualPrompt: s.visualPrompt, engine })),\n });\n if (!data.episode) return {};\n // The PATCH answers without a quote; the GET carries the re-priced one.\n return (await episodeApi(ctx, 'GET', `/${ep.id}`)).data;\n}\n\nasync function create(input: Input, ctx: SkillContext): Promise<SkillResult> {\n if (!input.topic?.trim()) {\n return { kind: 'text', text: 'Provide a `topic` (8 to 400 characters) to create an episode.' };\n }\n const created = await episodeApi(ctx, 'POST', '', {\n topic: input.topic.trim(),\n category: input.category,\n format: input.aspect,\n targetSeconds: input.length_seconds,\n style: input.style,\n voiceId: input.voice,\n ...(input.title?.trim() ? { title: input.title.trim() } : {}),\n });\n const ep = created.data.episode;\n if (!ep) return { kind: 'text', text: `Could not create the episode: ${created.data.error ?? created.status}` };\n\n if (!input.music) await episodeApi(ctx, 'PATCH', `/${ep.id}`, { musicEnabled: false });\n\n const plan = await episodeApi(ctx, 'POST', `/${ep.id}/plan`, { scope: 'episode' });\n if (plan.status !== 202) {\n return { kind: 'text', text: `Episode created (episode_id: ${ep.id}) but planning did not start: ${plan.data.error ?? plan.status}` };\n }\n let planned = await waitForPlan(ctx, ep.id);\n if (!planned) return { kind: 'text', text: stillPlanning(ep.id) };\n if (!planned.episode || planned.episode.plan.job?.status === 'error' || planned.episode.scenes.length === 0) {\n return { kind: 'text', text: `Planning failed: ${planned.episode?.plan.job?.error ?? planned.error ?? 'no scenes came back'}` };\n }\n if (input.engine) {\n const switched = await setEngine(ctx, planned.episode, input.engine);\n if (switched.episode) planned = switched;\n }\n return { kind: 'text', text: quoteText(planned.episode!, planned.price, ctx) };\n}\n\nfunction progress(ep: EpisodeDto): string {\n const done = ep.scenes.filter((s) => s.render.status === 'done' && s.render.url && !s.render.stale).length;\n const running = ep.scenes.filter((s) => s.render.status === 'running').length;\n const narr = ep.narration?.audioUrl ? 'recorded' : ep.narration?.status === 'running' ? 'recording' : 'not recorded';\n const music = !ep.musicEnabled ? 'off' : ep.music?.url ? 'ready' : ep.music?.status ?? 'not started';\n const exp = ep.export?.status ?? 'not started';\n return `narration ${narr}, scenes ${done}/${ep.scenes.length}${running ? ` (${running} rendering)` : ''}, music ${music}, export ${exp}`;\n}\n\nasync function status(id: string, ctx: SkillContext): Promise<SkillResult> {\n const { data, status: code } = await episodeApi(ctx, 'GET', `/${id}`);\n const ep = data.episode;\n if (!ep) return { kind: 'text', text: `Episode not found: ${data.error ?? code}` };\n if (ep.plan.job?.status === 'running') return { kind: 'text', text: stillPlanning(id) };\n if (ep.scenes.length === 0) {\n return { kind: 'text', text: `\"${ep.title}\" has no scene plan yet${ep.plan.job?.error ? ` (${ep.plan.job.error})` : ''}. Create a new episode with action \"create\".` };\n }\n if (ep.export?.status === 'done' && ep.export.url && ep.savedAt && !ep.export.stale) {\n return { kind: 'text', text: `\"${ep.title}\" is finished: ${ep.export.url}` };\n }\n const quote = data.price ? ` Plan quote: about ${data.price.total} credits at list price.` : '';\n return { kind: 'text', text: `\"${ep.title}\": ${progress(ep)}.${quote} Call ${call(id, 'produce')} to keep production moving.` };\n}\n\n/** One charged dispatch. Returns a line for the reply. */\nasync function generate(ctx: SkillContext, id: string, path: string, label: string, regenerate = false): Promise<{ ok: boolean; line: string }> {\n const r = await episodeApi(ctx, 'POST', `/${id}${path}`, regenerate ? { regenerate: true } : {});\n if (r.status === 200) {\n return { ok: true, line: `${label} started (${r.data.creditCost ?? '?'} credits).` };\n }\n return { ok: false, line: `${label} did not start: ${r.data.error ?? r.status}` };\n}\n\nasync function produce(id: string, ctx: SkillContext): Promise<SkillResult> {\n const { data, status: code } = await episodeApi(ctx, 'GET', `/${id}`);\n const ep = data.episode;\n if (!ep) return { kind: 'text', text: `Episode not found: ${data.error ?? code}` };\n if (ep.plan.job?.status === 'running') return { kind: 'text', text: stillPlanning(id) };\n if (ep.scenes.length === 0) {\n return { kind: 'text', text: `\"${ep.title}\" has no scene plan to produce. Create a new episode with action \"create\".` };\n }\n\n // 1) Narration first: every scene is cut against the recorded voice, so a\n // scene rendered before it would be re-cut and rendered twice.\n if (!ep.narration?.audioUrl) {\n if (ep.narration?.status === 'running') {\n return { kind: 'text', text: `Narration is recording. ${next(id, 'produce', '~20s')}` };\n }\n const g = await generate(ctx, id, '/narration/generate', 'Narration');\n const failed = ep.narration?.status === 'failed' ? ` (the last take failed: ${ep.narration.error ?? 'unknown'})` : '';\n return { kind: 'text', text: `${g.line}${failed} ${next(id, 'produce', '~20s')}` };\n }\n\n // 2) Scenes, four in flight.\n const running = ep.scenes.filter((s) => s.render.status === 'running').length;\n const queue = ep.scenes.filter(needsRender);\n if (queue.length > 0 || running > 0) {\n const lines: string[] = [];\n let spent = 0;\n for (const s of queue.slice(0, Math.max(0, MAX_IN_FLIGHT - running))) {\n const r = await episodeApi(ctx, 'POST', `/${id}/scenes/${s.id}/generate`, {});\n if (r.status === 200) spent += r.data.creditCost ?? 0;\n else {\n lines.push(`Scene ${ep.scenes.indexOf(s) + 1} did not start: ${r.data.error ?? r.status}`);\n // Out of credits or suspended: stop, the rest would fail the same way.\n if (r.status === 402 || r.status === 403) break;\n }\n }\n const failed = ep.scenes.filter((s) => s.render.status === 'failed');\n return {\n kind: 'text',\n text: [\n `In progress: ${progress(ep)}.`,\n spent > 0 ? `Started scene renders for ${Math.round(spent * 10) / 10} credits.` : '',\n failed.length > 0 ? `${failed.length} scene(s) failed and were re-queued (${failed[0]?.render.error?.slice(0, 100) ?? ''}).` : '',\n ...lines,\n next(id, 'produce', '~30s'),\n ].filter(Boolean).join('\\n'),\n };\n }\n\n // 3) Music. A failed bed never blocks the export: it ships without one.\n if (ep.musicEnabled && !ep.music?.url && ep.music?.status !== 'failed') {\n if (ep.music?.status === 'running') {\n return { kind: 'text', text: `All scenes rendered; the music bed is composing. ${next(id, 'produce', '~20s')}` };\n }\n const g = await generate(ctx, id, '/music/generate', 'Music bed');\n return { kind: 'text', text: `All scenes rendered. ${g.line} ${next(id, 'produce', '~20s')}` };\n }\n\n // 4) Export, then save.\n const exp = ep.export;\n if (exp?.status === 'running') {\n return { kind: 'text', text: `Export is stitching the episode. ${next(id, 'produce', '~60s')}` };\n }\n if (exp?.status === 'done' && exp.url && !exp.stale) {\n if (ep.savedAt) return { kind: 'text', text: `\"${ep.title}\" is finished: ${exp.url}` };\n const saved = await episodeApi(ctx, 'POST', `/${id}/save`, {});\n const url = saved.data.episode?.export?.url;\n if (saved.status !== 200 || !url) {\n return { kind: 'text', text: `The export is ready but could not be saved: ${saved.data.error ?? saved.status}. The draft (kept 24h): ${exp.url}. ${next(id, 'produce', '~30s')}` };\n }\n return { kind: 'text', text: `\"${ep.title}\" is finished and saved to your Library: ${url}` };\n }\n const started = await episodeApi(ctx, 'POST', `/${id}/export`, {});\n if (started.status !== 202) {\n return { kind: 'text', text: `Export did not start: ${started.data.error ?? started.status}. ${next(id, 'produce', '~30s')}` };\n }\n const prior = exp?.status === 'failed' ? ` (the last export failed: ${exp.error ?? 'unknown'})` : '';\n const musicNote = ep.musicEnabled && ep.music?.status === 'failed' ? ' The music bed failed, so this cut has no music.' : '';\n return { kind: 'text', text: `Export started, free${prior}.${musicNote} ${next(id, 'produce', '~60s')}` };\n}\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n const action = input.action === 'create' && input.episode_id ? 'status' : input.action;\n if (action === 'create') return create(input, ctx);\n if (!input.episode_id) return { kind: 'text', text: 'produce and status need the episode_id returned by the create step.' };\n if (action === 'produce') return produce(input.episode_id, ctx);\n return status(input.episode_id, ctx);\n}\n\nexport const episodeSkill: SkillModule<Input> = {\n name: 'pixeldojo_episode',\n description:\n 'Make a finished narrated faceless video (explainer, history, kids story) from one topic: script, scene visuals, AI narration, music bed, stitched export saved to the Library. Phased: create is free and returns a credit quote; produce is charged and advances one step per call (poll every ~30s until it returns the video URL); status is free.',\n inputZod: InputSchema as unknown as z.ZodType<Input>,\n inputJsonSchema: InputJsonSchema,\n allowedModels: [],\n defaultModel: '',\n run,\n};\n","/**\n * pixeldojo_ad — the Marketing Studio as an agent skill.\n *\n * One call: a product (URL or images) + an ad style → a rendered product\n * video ad with voiceover, on the same backbone and prompt assembly the\n * /marketing-studio composer uses. Prompt assembly happens server-side\n * (POST /api/v1/ads/run), so new styles ship without a package release.\n *\n * Built for automation: agents can pull a store URL, render an ad in a\n * chosen style, and hand the video to a posting workflow (their own app,\n * Cowork, a scheduler). Style catalog: GET /api/v1/marketing/presets.\n */\nimport { z } from 'zod';\nimport {\n pollResultToSkillResult,\n type SkillContext,\n type SkillModule,\n type SkillResult,\n} from './types.js';\nimport { pollJobUntilDoneOrHandoff } from '../poll.js';\nimport { uploadLocalFile } from './upload-helpers.js';\n\nconst InputSchema = z\n .object({\n style: z\n .string()\n .max(80)\n .optional()\n .describe(\n 'Ad style slug (default ugc-testimonial). Catalog: GET /api/v1/marketing/presets — e.g. ugc-testimonial, unboxing-reveal, unboxing-asmr, virtual-try-on, street-style, product-showcase, macro-details, crush-test, hyper-motion, before-after, day-in-the-life, the-gift, tv-spot.',\n ),\n product_url: z\n .string()\n .url()\n .optional()\n .describe('Product page URL. Name, description, and images are extracted automatically.'),\n product_name: z.string().max(200).optional(),\n product_description: z.string().max(2000).optional(),\n product_image_urls: z.array(z.string().url()).max(5).optional(),\n product_image_paths: z\n .array(z.string())\n .max(5)\n .optional()\n .describe('Absolute local paths; uploaded to 24h temp storage automatically.'),\n character_image_urls: z\n .array(z.string().url())\n .max(4)\n .optional()\n .describe('Presenter reference images for a consistent on-camera character.'),\n character_image_paths: z.array(z.string()).max(4).optional(),\n location_description: z\n .string()\n .max(1500)\n .optional()\n .describe('Where the ad takes place (\"a sunlit Parisian cafe\"). Text is enough; no image needed.'),\n location_image_url: z.string().url().optional(),\n hook: z\n .string()\n .max(1000)\n .optional()\n .describe('The opening visual beat (first 1-2 seconds). Omit to use the style default.'),\n script: z\n .string()\n .max(1000)\n .optional()\n .describe('The exact spoken line, voiced word for word. Omit and the presenter improvises.'),\n quality: z.enum(['mini', 'fast', 'high']).optional(),\n resolution: z\n .enum(['480p', '720p', '1080p', '4k'])\n .optional()\n .describe('1080p/4k require quality \"high\".'),\n aspect_ratio: z.enum(['16:9', '4:3', '1:1', '3:4', '9:16', '21:9']).optional(),\n duration: z.number().int().min(4).max(15).optional(),\n })\n .refine(\n (v) => v.product_url || ((v.product_image_urls?.length || v.product_image_paths?.length) && v.product_name),\n {\n message: 'Pass product_url, OR product_name plus product_image_urls/product_image_paths.',\n path: ['product_url'],\n },\n );\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n style: {\n type: 'string',\n description:\n 'Ad style slug (default ugc-testimonial). Catalog: GET /api/v1/marketing/presets — e.g. ugc-testimonial, unboxing-reveal, unboxing-asmr, virtual-try-on, street-style, mirror-fit-check, pro-try-on, product-showcase, macro-details, secret-hack-reveal, crush-test, hyper-motion, before-after, day-in-the-life, the-gift, tv-spot, gadget-saved-me, selfie-testimonial, direct-to-camera, pack-an-order, mystery-box.',\n },\n product_url: {\n type: 'string',\n format: 'uri',\n description:\n 'Product page URL. Name, description, and images are extracted automatically. Pass this, or product_name plus product images; when set, the product_* fields are ignored.',\n },\n product_name: {\n type: 'string',\n description: 'Product name. Required with product images when there is no product_url.',\n },\n product_description: { type: 'string', description: 'Optional product description (no product_url case).' },\n product_image_urls: {\n type: 'array',\n items: { type: 'string', format: 'uri' },\n maxItems: 5,\n description: 'Up to 5 hosted product photos (no product_url case).',\n },\n product_image_paths: {\n type: 'array',\n items: { type: 'string' },\n maxItems: 5,\n description: 'Up to 5 absolute local product image paths; uploaded to 24h temp storage automatically.',\n },\n character_image_urls: {\n type: 'array',\n items: { type: 'string', format: 'uri' },\n maxItems: 4,\n description: 'Presenter reference images for a consistent on-camera character.',\n },\n character_image_paths: {\n type: 'array',\n items: { type: 'string' },\n maxItems: 4,\n description: 'Absolute local presenter image paths; uploaded to 24h temp storage automatically.',\n },\n location_description: {\n type: 'string',\n description: 'Where the ad takes place (\"a sunlit Parisian cafe\"). Text is enough.',\n },\n location_image_url: {\n type: 'string',\n format: 'uri',\n description: 'Optional reference photo of the location.',\n },\n hook: {\n type: 'string',\n description: 'The opening visual beat (first 1-2 seconds). Omit to use the style default.',\n },\n script: {\n type: 'string',\n description: 'The exact spoken line, voiced word for word. Omit and the presenter improvises.',\n },\n quality: {\n type: 'string',\n enum: ['mini', 'fast', 'high'],\n description: \"Render tier. Omitted or unsupported by the ad engine, the engine's default tier is used.\",\n },\n resolution: {\n type: 'string',\n enum: ['480p', '720p', '1080p', '4k'],\n description:\n '1080p/4k require quality \"high\"; without it, or when the engine lacks the value, the engine default resolution is used.',\n },\n aspect_ratio: {\n type: 'string',\n enum: ['16:9', '4:3', '1:1', '3:4', '9:16', '21:9'],\n description: \"Defaults to the style's own aspect ratio; a value the engine does not support falls back to it.\",\n },\n duration: {\n type: 'integer',\n minimum: 4,\n maximum: 15,\n description: \"Ad length in seconds. Defaults to the style's length; clamped to what the engine allows.\",\n },\n },\n // \"product_url OR product_name+images\" is enforced by the server and the\n // Zod refine; no root-level oneOf (Grok rejects non-object root unions).\n} as const;\n\ninterface AdRunResponseShape {\n jobId: string;\n status: string;\n statusUrl: string;\n creditCost?: number;\n ad?: { style: string; prompt: string; product?: { name: string } };\n}\n\ninterface ClientWithAd {\n runAd: (input: Record<string, unknown>) => Promise<AdRunResponseShape>;\n}\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n // Local files → 24h temp URLs, same affordance as pixeldojo_generate.\n const productImages = [\n ...(input.product_image_urls ?? []),\n ...(await Promise.all((input.product_image_paths ?? []).map((p) => uploadLocalFile(p, ctx)))),\n ];\n const characterImages = [\n ...(input.character_image_urls ?? []),\n ...(await Promise.all((input.character_image_paths ?? []).map((p) => uploadLocalFile(p, ctx)))),\n ];\n\n const body: Record<string, unknown> = {\n style: input.style,\n product_url: input.product_url,\n product:\n !input.product_url && input.product_name\n ? {\n name: input.product_name,\n description: input.product_description,\n images: productImages,\n }\n : undefined,\n character_images: characterImages.length > 0 ? characterImages : undefined,\n location:\n input.location_description || input.location_image_url\n ? { description: input.location_description, image_url: input.location_image_url }\n : undefined,\n hook: input.hook,\n script: input.script,\n quality: input.quality,\n resolution: input.resolution,\n aspect_ratio: input.aspect_ratio,\n duration: input.duration,\n };\n\n const client = ctx.client as unknown as ClientWithAd;\n const submitted = await client.runAd(body);\n\n const result = await pollJobUntilDoneOrHandoff(\n submitted.jobId,\n (id) => ctx.client.getJob(id),\n ctx.buildStatusUrl,\n {\n now: ctx.pollOverrides?.now,\n sleep: ctx.pollOverrides?.sleep,\n },\n );\n\n const styleLabel = submitted.ad?.style ?? input.style ?? 'ugc-testimonial';\n return pollResultToSkillResult(result, (urls) =>\n urls.length === 0\n ? `Ad job ${submitted.jobId} completed but returned no assets.`\n : `Ad rendered (style: ${styleLabel}${submitted.ad?.product?.name ? `, product: ${submitted.ad.product.name}` : ''}). Video: ${urls[0]}`,\n );\n}\n\nexport const adSkill: SkillModule<Input> = {\n name: 'pixeldojo_ad',\n description:\n 'Marketing Studio: turn a product into a rendered video ad with voiceover. Requires `product_url` (name, description and images are extracted), or `product_name` plus product_image_urls / product_image_paths. Pick a `style` slug (default ugc-testimonial; full catalog at GET https://pixeldojo.ai/api/v1/marketing/presets), and optionally add presenter reference images, a location, a hook, and the exact spoken script. Returns the video URL, or a jobId to check with pixeldojo_status.',\n hostedDescription:\n 'Marketing Studio: turn a product into a rendered video ad with voiceover. Requires `product_url` (name, description and images are extracted), or `product_name` plus product_image_urls (public http(s) URLs). Pick a `style` slug (default ugc-testimonial; full catalog at GET https://pixeldojo.ai/api/v1/marketing/presets), and optionally add presenter reference images, a location, a hook, and the exact spoken script. Returns the video URL, or a jobId to check with pixeldojo_status.',\n inputZod: InputSchema as z.ZodType<Input>,\n inputJsonSchema: InputJsonSchema as unknown as Record<string, unknown>,\n // Composition skill — the server routes to the ad engine internally.\n allowedModels: [],\n defaultModel: '',\n run,\n};\n","/**\n * pixeldojo_campaign — agentic skill that turns one URL (or a product\n * profile) into a coherent multi-asset launch package.\n *\n * Composes existing PixelDojo tools server-side:\n * 1. Resolve product (via /api/v1/extract-product if `productUrl`).\n * 2. Generate hero (Seedream 4 / GPT Image 2 / Flux 2 by mode).\n * 3. Generate N lifestyle variants in parallel.\n * 4. Generate one vertical video off the hero (Seedance 2 / Kling).\n *\n * Returns a CampaignResult: full asset list when everything resolves in\n * the 30s sync window, or a handoff with campaignId to poll via\n * `pixeldojo_campaign_status`.\n */\nimport { z } from 'zod';\nimport {\n type SkillContext,\n type SkillModule,\n type SkillResult,\n} from './types.js';\n\nconst InputSchema = z\n .object({\n productUrl: z\n .string()\n .url()\n .optional()\n .describe('Product page URL. We extract name + description + images automatically.'),\n product: z\n .object({\n name: z.string().min(1).max(200),\n description: z.string().max(2000).optional(),\n images: z.array(z.string().url()).max(5).optional(),\n })\n .optional()\n .describe('Manual product fields, used when productUrl is omitted.'),\n tone: z\n .string()\n .max(120)\n .optional()\n .describe('Optional creative direction (\"premium minimalist\", \"playful Y2K\"). Threaded through every prompt.'),\n variants: z\n .number()\n .int()\n .min(1)\n .max(8)\n .optional()\n .describe('Lifestyle shots in addition to the hero (default 4, max 8).'),\n includeVideo: z\n .boolean()\n .optional()\n .describe('Whether to also generate a vertical launch video (default true).'),\n videoAspectRatio: z\n .enum(['9:16', '16:9', '1:1'])\n .optional()\n .describe('Aspect ratio of the launch video (default 9:16 for Reels/TikTok).'),\n videoMode: z\n .enum(['lifestyle', 'cgi', 'ugc', 'skip'])\n .optional()\n .describe('Video styling — lifestyle (default), cgi, ugc, or skip to omit video.'),\n })\n .refine((v) => v.productUrl || v.product, {\n message: 'productUrl or product is required',\n path: ['productUrl'],\n });\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n productUrl: {\n type: 'string',\n format: 'uri',\n description:\n 'Product page URL; name, description and images are extracted automatically. Pass this or `product` (one is required); when both are set, productUrl wins.',\n },\n product: {\n type: 'object',\n description: 'Manual product profile, used when productUrl is omitted.',\n properties: {\n name: { type: 'string', description: 'Product name (required).' },\n description: { type: 'string', description: 'Optional product description.' },\n images: {\n type: 'array',\n items: { type: 'string', format: 'uri' },\n maxItems: 5,\n description: 'Up to 5 hosted product photo URLs.',\n },\n },\n required: ['name'],\n },\n tone: {\n type: 'string',\n description: 'Optional creative direction (\"premium minimalist\", \"playful Y2K\"), threaded through every prompt.',\n },\n variants: {\n type: 'integer',\n minimum: 1,\n maximum: 8,\n description: 'Lifestyle shots in addition to the hero (default 4).',\n },\n includeVideo: { type: 'boolean', description: 'Also render a launch video (default true).' },\n videoAspectRatio: {\n type: 'string',\n enum: ['9:16', '16:9', '1:1'],\n description: 'Launch video aspect ratio (default 9:16).',\n },\n videoMode: {\n type: 'string',\n enum: ['lifestyle', 'cgi', 'ugc', 'skip'],\n description: 'Launch video styling: lifestyle (default), cgi, ugc, or skip for no video.',\n },\n },\n // productUrl-or-product is enforced by the Zod refine and the server; no\n // root-level oneOf (some clients reject root unions — see ad.ts).\n} as const;\n\ninterface CampaignAsset {\n role: string;\n kind: 'image' | 'video';\n url: string;\n apiId: string;\n jobId: string;\n variantIndex?: number;\n}\n\ninterface CampaignResultShape {\n kind: 'campaign' | 'handoff';\n campaignId: string;\n assets?: CampaignAsset[];\n product?: { name: string; description?: string; sourceUrl?: string };\n totalCreditCost?: number;\n warnings?: string[];\n message?: string;\n statusUrl?: string;\n subJobs?: Array<{ jobId: string; role: string; status: string }>;\n}\n\ninterface ClientWithCampaign {\n runCampaign: (input: Input) => Promise<CampaignResultShape>;\n}\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n // The SDK exposes `runCampaign` on PixelDojoClient; we narrow via a\n // structural cast so this skill compiles even before the SDK type\n // updates land in the consuming app.\n const client = ctx.client as unknown as ClientWithCampaign;\n const result = await client.runCampaign(input);\n\n if (result.kind === 'campaign') {\n const assets = result.assets ?? [];\n const lines = [\n `Campaign ${result.campaignId} for \"${result.product?.name ?? 'product'}\":`,\n ...assets.map(\n (a) =>\n ` - ${a.role}${a.variantIndex !== undefined ? ` #${a.variantIndex}` : ''} (${a.kind}, ${a.apiId}): ${a.url}`,\n ),\n '',\n `Total credits: ${result.totalCreditCost ?? 0}.`,\n ...(result.warnings && result.warnings.length > 0\n ? [`Warnings: ${result.warnings.join('; ')}`]\n : []),\n ];\n return {\n kind: 'assets',\n text: lines.join('\\n'),\n assetUrls: assets.map((a) => a.url),\n };\n }\n\n // Handoff path — campaign exceeded 30 s sync budget.\n return {\n kind: 'handoff',\n text:\n result.message ??\n `Campaign ${result.campaignId} queued. Poll via pixeldojo_campaign_status.`,\n jobId: result.campaignId,\n statusUrl: result.statusUrl ?? ctx.buildStatusUrl(result.campaignId),\n };\n}\n\nexport const campaignSkill: SkillModule<Input> = {\n name: 'pixeldojo_campaign',\n description:\n 'Generate a coherent product launch package (hero image + N lifestyle variants + optional vertical video) from one URL or product profile. Composes hero / lifestyle / video models server-side; returns assets in one call or a handoff with campaignId to poll via pixeldojo_campaign_status.',\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n // Composition skill — internal sub-jobs route to per-tool models, no\n // single allowed-models list applies here.\n allowedModels: [],\n defaultModel: '',\n run,\n};\n","/**\n * pixeldojo_campaign_status — poll companion for a long-running campaign.\n *\n * Same conceptual role as pixeldojo_status (which is per-job), but at the\n * campaign envelope level: returns either the full asset list when every\n * sub-job is terminal, or a handoff with the still-running sub-jobs.\n */\nimport { z } from 'zod';\nimport {\n type SkillContext,\n type SkillModule,\n type SkillResult,\n} from './types.js';\n\nconst InputSchema = z.object({\n campaignId: z\n .string()\n .min(1)\n .max(200)\n .describe('Campaign id returned from a prior pixeldojo_campaign handoff.'),\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n campaignId: {\n type: 'string',\n description: 'Campaign id returned from a prior pixeldojo_campaign handoff.',\n },\n },\n required: ['campaignId'],\n} as const;\n\ninterface CampaignAsset {\n role: string;\n kind: 'image' | 'video';\n url: string;\n apiId: string;\n jobId: string;\n variantIndex?: number;\n}\n\ninterface CampaignResultShape {\n kind: 'campaign' | 'handoff';\n campaignId: string;\n assets?: CampaignAsset[];\n product?: { name: string; description?: string; sourceUrl?: string };\n totalCreditCost?: number;\n warnings?: string[];\n message?: string;\n statusUrl?: string;\n subJobs?: Array<{ jobId: string; role: string; status: string }>;\n /** Per-job one-liner, e.g. \"hero done; 4 lifestyle running 2m10s\" (servers from 2026-10-01). */\n progress?: string;\n}\n\ninterface ClientWithCampaign {\n getCampaign: (id: string) => Promise<CampaignResultShape>;\n}\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n const client = ctx.client as unknown as ClientWithCampaign;\n const result = await client.getCampaign(input.campaignId);\n\n if (result.kind === 'campaign') {\n const assets = result.assets ?? [];\n const lines = [\n `Campaign ${result.campaignId} complete (${assets.length} assets):`,\n ...assets.map(\n (a) =>\n ` - ${a.role}${a.variantIndex !== undefined ? ` #${a.variantIndex}` : ''} (${a.kind}, ${a.apiId}): ${a.url}`,\n ),\n '',\n `Total credits: ${result.totalCreditCost ?? 0}.`,\n ...(result.warnings && result.warnings.length > 0\n ? [`Warnings: ${result.warnings.join('; ')}`]\n : []),\n ];\n return {\n kind: 'assets',\n text: lines.join('\\n'),\n assetUrls: assets.map((a) => a.url),\n };\n }\n\n const stillRunning = (result.subJobs ?? []).filter(\n (s) => s.status !== 'completed' && s.status !== 'failed',\n );\n return {\n kind: 'handoff',\n text:\n `Campaign ${result.campaignId}: ` +\n (result.progress\n ? `${result.progress}. Wait a few seconds, then poll again.`\n : stillRunning.length > 0\n ? `${stillRunning.length} of ${result.subJobs?.length ?? 0} sub-jobs still ${stillRunning[0].status}. ` +\n `Wait a few seconds, then poll again.`\n : `aggregate state pending. Poll again shortly.`),\n jobId: result.campaignId,\n statusUrl: result.statusUrl ?? ctx.buildStatusUrl(result.campaignId),\n };\n}\n\nexport const campaignStatusSkill: SkillModule<Input> = {\n name: 'pixeldojo_campaign_status',\n description:\n 'Poll a campaign by campaignId returned from pixeldojo_campaign. Returns assets when every sub-job is done, or a handoff describing what is still in flight.',\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n allowedModels: [],\n defaultModel: '',\n run,\n};\n","/**\n * pixeldojo_upload — turn a local file path into a hosted URL.\n *\n * Bridges the \"user has a local image/video\" → \"API needs a URL\" gap that\n * blocks reference-image workflows in Claude Code, Cursor, etc. The MCP\n * runs in the user's environment so it has fs access; we read the bytes,\n * POST them to /api/v1/upload, and return the temp CDN URL. Storage\n * auto-expires after 24h (R2 lifecycle policy on `pixeldojotemp`).\n *\n * No credits consumed.\n */\nimport { z } from 'zod';\nimport { basename } from 'node:path';\nimport {\n type SkillContext,\n type SkillModule,\n type SkillResult,\n} from './types.js';\nimport { SkillUploadError, uploadLocalFile } from './upload-helpers.js';\n\nconst InputSchema = z.object({\n path: z\n .string()\n .min(1)\n .max(4096)\n .describe(\n 'Absolute local file path to upload. JPEG, PNG, WebP, GIF (≤50MB), MP4, WebM, MOV (≤200MB) or MP3, WAV, M4A, AAC, OGG, FLAC audio (≤50MB). Returns a public URL on the temp CDN; storage auto-expires after 24 hours.',\n ),\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n description:\n 'Absolute local file path. Allowed: JPEG, PNG, WebP, GIF (≤50MB), MP4, WebM, MOV (≤200MB) or MP3, WAV, M4A, AAC, OGG, FLAC audio (≤50MB). Returns a public URL on the temp CDN; auto-expires after 24h.',\n },\n },\n required: ['path'],\n} as const;\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n let url: string;\n try {\n url = await uploadLocalFile(input.path, ctx);\n } catch (err) {\n if (err instanceof SkillUploadError) {\n return { kind: 'text', text: `pixeldojo_upload: ${err.userMessage}` };\n }\n throw err;\n }\n return {\n kind: 'text',\n text:\n `Uploaded ${basename(input.path)} → ${url}\\n` +\n `(temp storage; auto-deletes in ~24h. Pass this URL as image_url, video_url for a clip, or song_url on pixeldojo_film for a song, to any pixeldojo tool that takes one.)`,\n };\n}\n\nexport const uploadSkill: SkillModule<Input> = {\n name: 'pixeldojo_upload',\n description:\n 'Upload a local image, video or audio file (JPEG, PNG, WebP, GIF up to 50MB; MP4, WebM, MOV up to 200MB; MP3, WAV, M4A, AAC, OGG, FLAC up to 50MB) and get back a public URL that expires after 24 hours. Free. Pass an audio URL as song_url to pixeldojo_film for a music video. Pass the URL as image_url (stills) or video_url (clips) to tools that take hosted URLs only, such as pixeldojo_character, pixeldojo_storyboard and pixeldojo_upscale. pixeldojo_generate, pixeldojo_edit and pixeldojo_ad take local paths directly and need no separate upload.',\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n allowedModels: [],\n defaultModel: '',\n run,\n};\n","/**\n * pixeldojo_audio — speech, dialogue, sound effects, and music from a prompt.\n *\n * Whitelisted models: seed-audio (default; ByteDance Seed Audio 1.0 —\n * multi-character dialogue + SFX + music in one pass, up to 2 minutes) and\n * text-to-speech (plain narration). Reference clips are hosted URLs\n * addressed in the prompt as @Audio1..@Audio3. There is no local-file input:\n * /api/v1/upload accepts images and video only, so an `audio_paths` field\n * could never work and was removed (0.13.0).\n */\nimport { z } from 'zod';\nimport { pollJobUntilDoneOrHandoff } from '../poll.js';\nimport {\n type SkillContext,\n type SkillModule,\n type SkillResult,\n pollResultToSkillResult,\n} from './types.js';\n\nconst ALLOWED = ['seed-audio', 'text-to-speech'] as const;\ntype AllowedModel = (typeof ALLOWED)[number];\nconst DEFAULT_MODEL: AllowedModel = 'seed-audio';\n\nconst InputSchema = z.object({\n prompt: z\n .string()\n .min(1)\n .describe(\n 'seed-audio: a script to speak, or a scene description (dialogue, sound effects, music), up to 2048 characters; refer to audio_urls clips in order as @Audio1..@Audio3. text-to-speech: the exact text to speak, up to 10,000 characters.',\n ),\n model: z\n .string()\n .optional()\n .describe(`${DEFAULT_MODEL} (default): speech, multi-voice dialogue, effects and music in one clip, and voice cloning from audio_urls. text-to-speech: plain narration with preset voices.`),\n voice: z\n .string()\n .optional()\n .describe('text-to-speech only: voice preset (e.g. Wise_Woman, Calm_Woman, Friendly_Person; default Wise_Woman). seed-audio ignores it: describe the voice in the prompt, or clone one with audio_urls.'),\n audio_urls: z\n .array(z.string().url())\n .max(3)\n .optional()\n .describe('seed-audio only: up to 3 hosted reference clips (wav, mp3, pcm or ogg_opus, 30s / 10MB max each) for voice cloning, referenced in the prompt as @Audio1..@Audio3. Local audio files cannot be uploaded; pass URLs. Ignored by text-to-speech.'),\n output_format: z\n .string()\n .optional()\n .describe('Output format. seed-audio: mp3 (default), wav, pcm, ogg_opus. text-to-speech: mp3 (default), wav, flac, pcm.'),\n speed: z.number().min(0.5).max(2).optional().describe('Speech speed multiplier, 0.5-2 (default 1). Both models.'),\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n prompt: {\n type: 'string',\n description:\n 'seed-audio: a script to speak, or a scene description (dialogue, sound effects, music), up to 2048 characters; refer to audio_urls clips in order as @Audio1..@Audio3. text-to-speech: the exact text to speak, up to 10,000 characters.',\n },\n model: {\n type: 'string',\n enum: ALLOWED,\n description:\n `${DEFAULT_MODEL} (default): speech, multi-voice dialogue, effects and music in one clip, and voice cloning from audio_urls. text-to-speech: plain narration with preset voices.`,\n },\n voice: {\n type: 'string',\n description:\n 'text-to-speech only: voice preset (e.g. Wise_Woman, Calm_Woman, Friendly_Person; default Wise_Woman). seed-audio ignores it: describe the voice in the prompt, or clone one with audio_urls.',\n },\n audio_urls: {\n type: 'array',\n items: { type: 'string', format: 'uri' },\n maxItems: 3,\n description:\n 'seed-audio only: up to 3 hosted reference clips (wav, mp3, pcm or ogg_opus, 30s / 10MB max each) for voice cloning, referenced in the prompt as @Audio1..@Audio3. Local audio files cannot be uploaded; pass URLs. Ignored by text-to-speech.',\n },\n output_format: {\n type: 'string',\n description: 'Output format. seed-audio: mp3 (default), wav, pcm, ogg_opus. text-to-speech: mp3 (default), wav, flac, pcm.',\n },\n speed: {\n type: 'number',\n minimum: 0.5,\n maximum: 2,\n description: 'Speech speed multiplier, 0.5-2 (default 1). Both models.',\n },\n },\n required: ['prompt'],\n} as const;\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n const requested = (input.model ?? DEFAULT_MODEL) as string;\n if (!(ALLOWED as readonly string[]).includes(requested)) {\n return {\n kind: 'text',\n text: `Unknown model \"${requested}\" for pixeldojo_audio. Allowed: ${ALLOWED.join(', ')}.`,\n };\n }\n const apiId = requested as AllowedModel;\n\n const audioUrls = input.audio_urls ?? [];\n\n const body: { prompt: string; [key: string]: unknown } = { prompt: input.prompt };\n if (apiId === 'seed-audio') {\n if (input.voice) body.voice = input.voice;\n if (audioUrls.length) body.audio_urls = audioUrls;\n if (input.output_format) body.output_format = input.output_format;\n if (input.speed !== undefined) body.speed = input.speed;\n } else {\n // text-to-speech takes `text` + `voice_id` instead of prompt/voice.\n body.text = input.prompt;\n delete (body as Record<string, unknown>).prompt;\n if (input.voice) body.voice_id = input.voice;\n if (input.output_format) body.audio_format = input.output_format;\n if (input.speed !== undefined) body.speed = input.speed;\n }\n\n const submitted = await ctx.client.run(apiId, body as { prompt: string });\n\n const result = await pollJobUntilDoneOrHandoff(\n submitted.jobId,\n (id) => ctx.client.getJob(id),\n ctx.buildStatusUrl,\n {\n now: ctx.pollOverrides?.now,\n sleep: ctx.pollOverrides?.sleep,\n },\n );\n\n return pollResultToSkillResult(result, (urls) =>\n urls.length === 0\n ? `Job ${submitted.jobId} completed but returned no assets.`\n : `Audio ready. Asset: ${urls[0]}`,\n );\n}\n\nexport const audioSkill: SkillModule<Input> = {\n name: 'pixeldojo_audio',\n description:\n 'Generate audio: speech, multi-character dialogue, sound effects, and background music from one prompt (Seed Audio 1.0 by default; plain text-to-speech available). Voice cloning takes hosted reference clip URLs in audio_urls; local audio files are not accepted. Returns an audio URL, or a jobId for pixeldojo_status.',\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n allowedModels: [...ALLOWED],\n defaultModel: DEFAULT_MODEL,\n run,\n};\n","/**\n * pixeldojo_library — search your own generation history.\n *\n * Every asset the agent generated via API/MCP, plus results the user kept\n * (saved or downloaded) in the web app. Returns URLs that can be passed\n * straight back into pixeldojo_generate, _edit, _character, or _upscale as\n * reference inputs — \"find yesterday's hero shot and make three variants.\"\n */\nimport { z } from 'zod';\nimport {\n type SkillContext,\n type SkillModule,\n type SkillResult,\n} from './types.js';\n\nconst InputSchema = z.object({\n source: z\n .enum(['media', 'characters'])\n .optional()\n .describe('media (default): saved and recent results. characters: saved Character Studio characters and elements, usable as @Name in prompts.'),\n q: z\n .string()\n .optional()\n .describe('Substring match against the prompt that produced the asset.'),\n model: z.string().optional().describe('Restrict to a single model (apiId).'),\n modality: z\n .enum(['image', 'video', 'audio'])\n .optional()\n .describe('Restrict to one output type.'),\n limit: z.number().int().min(1).max(50).optional().describe('Max results (default 10).'),\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n source: {\n type: 'string',\n enum: ['media', 'characters'],\n description:\n 'media (default): saved media and recent generations. characters: the saved Character Studio characters, products, outfits, locations, props and styles. Write @Name in any prompt to use one.',\n },\n q: {\n type: 'string',\n description: 'Substring match against the prompt that produced the asset. Omit to list the newest items.',\n },\n model: { type: 'string', description: 'Only assets from this model apiId.' },\n modality: {\n type: 'string',\n enum: ['image', 'video', 'audio'],\n description: 'Only this output type.',\n },\n limit: { type: 'integer', minimum: 1, maximum: 50, description: 'Max results (default 10).' },\n },\n required: [],\n} as const;\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n if (input.source === 'characters') {\n const { characters } = await ctx.client.listCharacters({ q: input.q, limit: input.limit ?? 25 });\n if (characters.length === 0) {\n return {\n kind: 'text',\n text: input.q\n ? `No saved character or element matches \"${input.q}\".`\n : 'No saved characters or elements yet. Save one from photos with pixeldojo_save_character.',\n };\n }\n const lines = characters.map(\n (c) =>\n `- ${c.mention} (${c.kind})${c.description ? `: ${c.description.slice(0, 100)}` : ''}\\n images: ${c.image_urls.slice(0, 4).join(' ')}`,\n );\n return {\n kind: 'text',\n text: `${characters.length} saved character(s)/element(s):\\n${lines.join('\\n')}\\n\\nWrite the @Name in a pixeldojo_generate / pixeldojo_video / pixeldojo_edit prompt and their photos are attached automatically (models that take reference images).`,\n };\n }\n const res = await ctx.client.listLibrary({\n q: input.q,\n model: input.model,\n modality: input.modality,\n limit: input.limit ?? 10,\n });\n\n if (res.items.length === 0) {\n return {\n kind: 'text',\n text: input.q\n ? `No library items match \"${input.q}\". Try a broader query, or omit q to list recent generations.`\n : 'Your library is empty. Generate something with pixeldojo_generate first.',\n };\n }\n\n const lines = res.items.map((it) => {\n const parts = [\n `- ${it.url}`,\n it.modality ? `[${it.modality}]` : null,\n it.model ? `model=${it.model}` : null,\n `(${it.source}, ${it.createdAt.slice(0, 10)})`,\n it.prompt ? `\"${it.prompt.slice(0, 90)}${it.prompt.length > 90 ? '…' : ''}\"` : null,\n ].filter(Boolean);\n return parts.join(' ');\n });\n\n return {\n kind: 'text',\n text: `${res.items.length} library item(s):\\n${lines.join('\\n')}\\n\\nPass any URL back into pixeldojo_generate, pixeldojo_edit, pixeldojo_character, or pixeldojo_upscale as a reference input.`,\n };\n}\n\nexport const librarySkill: SkillModule<Input> = {\n name: 'pixeldojo_library',\n description:\n 'Search your Library, newest first. source=media (default): saved media (permanent) and recent API/MCP generations (deleted 1 hour after they finish), as URLs to reuse as references. source=characters: saved Character Studio characters and elements, each usable as @Name in any prompt.',\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n allowedModels: [],\n defaultModel: '',\n run,\n};\n","/**\n * pixeldojo_save — keep a result forever.\n *\n * Saves a generated asset URL into the user's My Media library: it passes\n * the same content-safety check as every save on the site, then the file is\n * re-hosted on PixelDojo's permanent CDN (API/MCP outputs otherwise expire\n * one hour after they finish) and becomes searchable via pixeldojo_library.\n * Removed 2026-09-02, restored 2026-10-02 (founder decision).\n */\nimport { z } from 'zod';\nimport { type SkillContext, type SkillModule, type SkillResult } from './types.js';\n\nconst InputSchema = z.object({\n url: z.string().url().describe('The asset URL to save (image or video).'),\n prompt: z\n .string()\n .optional()\n .describe('The prompt that produced it — makes it findable in the library later.'),\n tool_name: z.string().optional().describe('Tool/model slug that produced it.'),\n modality: z.enum(['image', 'video', 'audio']).optional(),\n job_id: z\n .string()\n .optional()\n .describe('The jobId that produced this asset, when known.'),\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n url: { type: 'string', format: 'uri', description: 'The result URL to keep (image or video from a PixelDojo job).' },\n prompt: { type: 'string', description: 'The prompt that produced it, so it is findable in the library later.' },\n tool_name: { type: 'string', description: 'Model apiId that produced it, when known.' },\n modality: { type: 'string', enum: ['image', 'video', 'audio'], description: 'Output type, when the URL does not make it obvious.' },\n job_id: { type: 'string', description: 'The jobId that produced it, when known.' },\n },\n required: ['url'],\n} as const;\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n const res = await ctx.client.saveMedia({\n url: input.url,\n prompt: input.prompt,\n tool_name: input.tool_name,\n modality: input.modality,\n job_id: input.job_id,\n });\n return {\n kind: 'text',\n text: `Saved to My Media (permanent): ${res.url}\\nIt will appear at https://pixeldojo.ai/my-images and in pixeldojo_library searches.`,\n };\n}\n\nexport const saveSkill: SkillModule<Input> = {\n name: 'pixeldojo_save',\n description:\n \"Save a generated image or video into the user's My Media library permanently (\\\"save this\\\", \\\"keep it\\\"). Results otherwise expire 1 hour after they finish. Pass the result URL; it is safety-checked before it is kept.\",\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n allowedModels: [],\n defaultModel: '',\n run,\n};\n","/**\n * pixeldojo_save_character — add a character, product, outfit, location, prop\n * or style to the user's Character Studio from image URLs. Every image passes\n * the site's upload safety check before anything is stored. The saved name\n * then works as @Name in any prompt on any tool.\n */\nimport { z } from 'zod';\nimport { type SkillContext, type SkillModule, type SkillResult } from './types.js';\n\nconst KINDS = ['character', 'product', 'outfit', 'location', 'object', 'style'] as const;\n\nconst InputSchema = z.object({\n name: z.string().min(1).max(60).describe('What to call it. Used as @Name in prompts.'),\n kind: z.enum(KINDS).optional().describe('Default character.'),\n image_urls: z.array(z.string().url()).max(8).optional().describe('3 to 5 photos from different angles works best for a character.'),\n description: z.string().max(1500).optional().describe('Appearance notes, or the scene text for an element.'),\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n name: { type: 'string', description: 'What to call it. Used as @Name in prompts afterwards.' },\n kind: { type: 'string', enum: KINDS, description: 'character (default), product, outfit, location, object (a prop) or style.' },\n image_urls: {\n type: 'array',\n items: { type: 'string', format: 'uri' },\n maxItems: 8,\n description: 'Photos of it. For a person, 3 to 5 clear photos from different angles. Required for a character.',\n },\n description: { type: 'string', description: 'Optional appearance notes, or the scene text for an element without photos.' },\n },\n required: ['name'],\n} as const;\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n const res = await ctx.client.saveCharacter({\n name: input.name,\n kind: input.kind ?? 'character',\n image_urls: input.image_urls,\n description: input.description,\n });\n return {\n kind: 'text',\n text: `Saved ${res.kind} \"${res.name}\" to Character Studio (${res.image_urls.length} image${res.image_urls.length === 1 ? '' : 's'}). Use it in any prompt as ${res.mention}, for example \"${res.mention} walking on a beach at sunset\". It also appears at https://pixeldojo.ai/characters.`,\n };\n}\n\nexport const saveCharacterSkill: SkillModule<Input> = {\n name: 'pixeldojo_save_character',\n description:\n \"Save a character (a person, from 3-5 photos) or an element (product, outfit, location, prop, style) to the user's Character Studio library. Afterwards write @Name in any prompt to use it. List saved ones with pixeldojo_library source=characters.\",\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n allowedModels: [],\n defaultModel: '',\n run,\n};\n","/**\n * pixeldojo_save_workflow / :run_workflow / :list_workflows — named, saved\n * skill chains (\"describe a workflow once, run it by name from any chat\").\n *\n * Definitions live server-side (/api/v1/workflows, per user). Execution\n * happens HERE: run_workflow fetches the definition and dispatches each\n * step to the local skill registry, so every step benefits from the same\n * polling, upload-bridge, and error handling as a direct skill call.\n *\n * Chaining placeholders inside step args (string values only):\n * {{input.<key>}} → value from run_workflow's `inputs` object\n * {{prev}} → first asset URL produced by the previous step\n */\nimport { z } from 'zod';\nimport { pollJobUntilDoneOrHandoff } from '../poll.js';\nimport {\n type SkillContext,\n type SkillModule,\n type SkillResult,\n pollResultToSkillResult,\n} from './types.js';\n\n// Each step's own skill.run() already burns up to 30s (D9's sync window)\n// before returning a handoff. A multi-step workflow's whole point is\n// chaining outputs, so a step that's merely slow — not stuck — shouldn't\n// silently break the chain. Poll for another 60s past that before giving\n// up and reporting the step as still-processing.\nconst WORKFLOW_STEP_EXTRA_BUDGET_MS = 60_000;\n\nconst StepSchema = z.object({\n skill: z\n .string()\n // `pixeldojo:` accepted alongside `pixeldojo_` — workflows saved before the\n // 2026-07-29 rename still carry colon step names.\n .regex(/^pixeldojo[:_](generate|edit|character|storyboard|upscale|audio|upload|from_url)$/, {\n message:\n 'Runnable skills only: generate, edit, character, storyboard, upscale, audio, upload, from_url.',\n }),\n args: z.record(z.string(), z.unknown()).optional(),\n});\n\nconst SaveInputSchema = z.object({\n name: z\n .string()\n .regex(/^[a-z0-9][a-z0-9-]{1,40}$/, {\n message: 'Kebab-case, 2-41 chars, e.g. \"product-launch-pack\".',\n })\n .describe('Workflow handle. Saving to an existing name overwrites it.'),\n description: z.string().max(500).optional(),\n steps: z.array(StepSchema).min(1).max(8),\n});\ntype SaveInput = z.infer<typeof SaveInputSchema>;\n\nconst RunInputSchema = z.object({\n name: z.string().describe('Saved workflow name.'),\n inputs: z\n .record(z.string(), z.string())\n .optional()\n .describe('Values for {{input.<key>}} placeholders in the workflow steps.'),\n});\ntype RunInput = z.infer<typeof RunInputSchema>;\n\nconst ListInputSchema = z.object({});\ntype ListInput = z.infer<typeof ListInputSchema>;\n\n/** Fill {{input.<key>}} and {{prev}} placeholders in string arg values. */\nexport function substitutePlaceholders(\n args: Record<string, unknown>,\n inputs: Record<string, string>,\n prevUrl: string | undefined,\n): { resolved: Record<string, unknown>; missing: string[] } {\n const missing: string[] = [];\n const fill = (value: unknown): unknown => {\n if (typeof value === 'string') {\n return value.replace(/\\{\\{(prev|input\\.[a-zA-Z0-9_-]+)\\}\\}/g, (_, token: string) => {\n if (token === 'prev') {\n if (!prevUrl) missing.push('{{prev}}');\n return prevUrl ?? '';\n }\n const key = token.slice('input.'.length);\n if (!(key in inputs)) missing.push(`{{${token}}}`);\n return inputs[key] ?? '';\n });\n }\n if (Array.isArray(value)) return value.map(fill);\n if (value && typeof value === 'object') {\n return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, fill(v)]));\n }\n return value;\n };\n return { resolved: fill(args) as Record<string, unknown>, missing };\n}\n\n/** Pull the first URL out of a skill result (assets or a URL in text). */\nfunction firstUrl(result: SkillResult): string | undefined {\n if (result.kind === 'assets' && result.assetUrls.length > 0) return result.assetUrls[0];\n if (result.kind === 'text') {\n const m = result.text.match(/https?:\\/\\/\\S+/);\n return m?.[0].replace(/[).,]+$/, '');\n }\n return undefined;\n}\n\nasync function runSave(input: SaveInput, ctx: SkillContext): Promise<SkillResult> {\n const res = await ctx.client.saveWorkflow({\n name: input.name,\n description: input.description,\n steps: input.steps.map((s) => ({ skill: s.skill, args: s.args ?? {} })),\n });\n return {\n kind: 'text',\n text: res.created\n ? `Saved workflow \"${res.name}\" (${res.steps} step${res.steps === 1 ? '' : 's'}). Run it with pixeldojo_run_workflow { name: \"${res.name}\" }.`\n : `Overwrote workflow \"${res.name}\" (${res.steps} step${res.steps === 1 ? '' : 's'}).`,\n };\n}\n\nasync function runList(_input: ListInput, ctx: SkillContext): Promise<SkillResult> {\n const res = await ctx.client.listWorkflows();\n if (res.count === 0) {\n return {\n kind: 'text',\n text: 'No saved workflows yet. Save one with pixeldojo_save_workflow { name, steps: [{ skill, args }] }.',\n };\n }\n const lines = res.workflows.map(\n (w) =>\n `- ${w.name} (${w.steps.length} steps, ${w.runs} runs)${w.description ? `: ${w.description}` : ''}`,\n );\n return { kind: 'text', text: `${res.count} saved workflow(s):\\n${lines.join('\\n')}` };\n}\n\nasync function runWorkflow(input: RunInput, ctx: SkillContext): Promise<SkillResult> {\n const workflow = await ctx.client.getWorkflow(input.name.toLowerCase(), { countRun: true });\n\n // Late import to avoid a static cycle (index.ts imports this module).\n const { findSkill } = await import('./index.js');\n\n const inputs = input.inputs ?? {};\n const outputs: string[] = [];\n let prevUrl: string | undefined;\n\n for (let i = 0; i < workflow.steps.length; i++) {\n const step = workflow.steps[i];\n const skill = findSkill(step.skill);\n if (!skill) {\n return {\n kind: 'text',\n text: `Step ${i + 1} names unknown skill \"${step.skill}\". Re-save the workflow.`,\n };\n }\n const { resolved, missing } = substitutePlaceholders(step.args, inputs, prevUrl);\n if (missing.length > 0) {\n return {\n kind: 'text',\n text: `Step ${i + 1} (${step.skill}) is missing ${Array.from(new Set(missing)).join(', ')}. ${\n missing.some((m) => m.includes('input.'))\n ? 'Pass the value via run_workflow inputs.'\n : 'A previous step produced no asset URL.'\n }`,\n };\n }\n\n const parsed = skill.inputZod.safeParse(resolved);\n if (!parsed.success) {\n const issue = parsed.error.issues[0];\n return {\n kind: 'text',\n text: `Step ${i + 1} (${step.skill}) has invalid args: ${issue?.path.join('.') || 'input'} ${issue?.message || 'invalid'}.`,\n };\n }\n\n let result = await skill.run(parsed.data, ctx);\n if (result.kind === 'handoff') {\n // The step's own 30s sync window wasn't enough — keep polling the\n // SAME job rather than treating \"still running\" as \"produced\n // nothing\" (that used to silently break any chain with a slow\n // intermediate step: firstUrl() had no case for 'handoff' at all).\n const handoffJobId = result.jobId;\n const polled = await pollJobUntilDoneOrHandoff(\n handoffJobId,\n (id) => ctx.client.getJob(id),\n ctx.buildStatusUrl,\n {\n syncBudgetMs: WORKFLOW_STEP_EXTRA_BUDGET_MS,\n now: ctx.pollOverrides?.now,\n sleep: ctx.pollOverrides?.sleep,\n },\n );\n result = pollResultToSkillResult(polled, (urls) =>\n urls.length === 0\n ? `Job ${handoffJobId} completed but returned no assets.`\n : `Done. Asset: ${urls[0]}`,\n );\n }\n const url = firstUrl(result);\n if (url) {\n prevUrl = url;\n outputs.push(`step ${i + 1} (${step.skill}): ${url}`);\n } else if (result.kind === 'text' && /fail|error|invalid|unknown/i.test(result.text)) {\n return {\n kind: 'text',\n text: `Workflow \"${workflow.name}\" stopped at step ${i + 1} (${step.skill}): ${result.text}`,\n };\n } else if (result.kind === 'handoff') {\n // Still running after the extended wait — stop the chain here (no\n // URL to feed the next step) but hand the caller everything needed\n // to follow up instead of a dead-end \"no asset URL\".\n return {\n kind: 'text',\n text:\n `Workflow \"${workflow.name}\" is still on step ${i + 1} (${step.skill}) after an extended wait. ` +\n `Poll with pixeldojo_status { jobId: \"${result.jobId}\" }, then re-run the workflow once it completes.`,\n };\n } else {\n outputs.push(`step ${i + 1} (${step.skill}): done (no asset URL)`);\n }\n }\n\n return {\n kind: 'text',\n text: `Workflow \"${workflow.name}\" completed ${workflow.steps.length} step(s):\\n${outputs.join('\\n')}`,\n };\n}\n\n/** Tools a workflow step may run; mirrors the StepSchema regex above. */\nconst STEP_SKILLS = [\n 'pixeldojo_generate',\n 'pixeldojo_edit',\n 'pixeldojo_character',\n 'pixeldojo_storyboard',\n 'pixeldojo_upscale',\n 'pixeldojo_audio',\n 'pixeldojo_upload',\n 'pixeldojo_from_url',\n];\n\nconst stepJson = {\n type: 'object',\n properties: {\n skill: {\n type: 'string',\n enum: STEP_SKILLS,\n description:\n \"Tool this step runs. Steps run in order when the workflow runs, and each is charged at that tool's own rate.\",\n },\n args: {\n type: 'object',\n description:\n \"That tool's own arguments, exactly as you would pass them calling it directly. Any string value, at any depth, may contain {{input.<key>}} (filled from pixeldojo_run_workflow inputs) or {{prev}} (the first asset URL the previous step produced).\",\n },\n },\n required: ['skill'],\n} as const;\n\nexport const saveWorkflowSkill: SkillModule<SaveInput> = {\n name: 'pixeldojo_save_workflow',\n description:\n 'Save a named multi-step skill chain (generate → edit → upscale …). String args may contain {{input.<key>}} and {{prev}} placeholders. Saving to an existing name overwrites it.',\n inputZod: SaveInputSchema,\n inputJsonSchema: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n pattern: '^[a-z0-9][a-z0-9-]{1,40}$',\n description: 'Kebab-case handle, 2-41 chars (e.g. \"product-launch-pack\"). Saving to an existing name overwrites it.',\n },\n description: { type: 'string', description: 'Optional note on what the workflow does (max 500 chars).' },\n steps: {\n type: 'array',\n items: stepJson,\n minItems: 1,\n maxItems: 8,\n description: 'The chain, 1-8 steps, run in order. Saving charges nothing; running charges each step.',\n },\n },\n required: ['name', 'steps'],\n },\n allowedModels: [],\n defaultModel: '',\n run: runSave,\n};\n\nexport const runWorkflowSkill: SkillModule<RunInput> = {\n name: 'pixeldojo_run_workflow',\n description:\n 'Run a saved workflow by name. Pass inputs for its {{input.<key>}} placeholders; each step feeds the next via {{prev}}.',\n inputZod: RunInputSchema,\n inputJsonSchema: {\n type: 'object',\n properties: {\n name: { type: 'string', description: 'Saved workflow name (see pixeldojo_list_workflows).' },\n inputs: {\n type: 'object',\n additionalProperties: { type: 'string' },\n description:\n 'String values for the workflow\\'s {{input.<key>}} placeholders, e.g. {\"product\": \"red sneaker\"}. A step whose placeholder has no value stops the run before that step.',\n },\n },\n required: ['name'],\n },\n allowedModels: [],\n defaultModel: '',\n run: runWorkflow,\n};\n\nexport const listWorkflowsSkill: SkillModule<ListInput> = {\n name: 'pixeldojo_list_workflows',\n description: 'List your saved workflows with step counts and run totals.',\n inputZod: ListInputSchema,\n inputJsonSchema: { type: 'object', properties: {}, required: [] },\n allowedModels: [],\n defaultModel: '',\n run: runList,\n};\n","/**\n * Registry of all named MCP skills shipped by `@pixeldojo/mcp`.\n *\n * Adding a new skill: drop a file in this directory exporting a\n * `SkillModule`, then append it to `ALL_SKILLS` here. The server reads\n * from this list to populate `tools/list` and route `tools/call`.\n */\nimport { generateSkill } from './generate.js';\nimport { editSkill } from './edit.js';\nimport { characterSkill } from './character.js';\nimport { storyboardSkill } from './storyboard.js';\nimport { upscaleSkill } from './upscale.js';\nimport { captionSkill } from './caption.js';\nimport { overlaySkill } from './overlay.js';\nimport { statusSkill } from './status.js';\nimport { fromUrlSkill } from './from-url.js';\nimport { filmSkill } from './film.js';\nimport { videoSkill } from './video.js';\nimport { episodeSkill } from './episode.js';\nimport { adSkill } from './ad.js';\nimport { campaignSkill } from './campaign.js';\nimport { campaignStatusSkill } from './campaign-status.js';\nimport { uploadSkill } from './upload.js';\nimport { audioSkill } from './audio.js';\nimport { librarySkill } from './library.js';\nimport { saveSkill } from './save.js';\nimport { saveCharacterSkill } from './save-character.js';\nimport {\n saveWorkflowSkill,\n runWorkflowSkill,\n listWorkflowsSkill,\n} from './workflows.js';\nimport type { SkillModule } from './types.js';\n\nexport const ALL_SKILLS: ReadonlyArray<SkillModule<unknown>> = [\n generateSkill,\n editSkill,\n characterSkill,\n storyboardSkill,\n upscaleSkill,\n captionSkill,\n overlaySkill,\n audioSkill,\n librarySkill,\n saveSkill,\n saveCharacterSkill,\n saveWorkflowSkill,\n runWorkflowSkill,\n listWorkflowsSkill,\n statusSkill,\n fromUrlSkill,\n uploadSkill,\n adSkill,\n campaignSkill,\n campaignStatusSkill,\n filmSkill,\n videoSkill,\n episodeSkill,\n] as ReadonlyArray<SkillModule<unknown>>;\n\nexport {\n filmSkill,\n videoSkill,\n episodeSkill,\n generateSkill,\n editSkill,\n characterSkill,\n storyboardSkill,\n upscaleSkill,\n captionSkill,\n overlaySkill,\n audioSkill,\n librarySkill,\n saveSkill,\n saveCharacterSkill,\n saveWorkflowSkill,\n runWorkflowSkill,\n listWorkflowsSkill,\n statusSkill,\n fromUrlSkill,\n uploadSkill,\n adSkill,\n campaignSkill,\n campaignStatusSkill,\n};\nexport type { SkillModule, SkillContext, SkillResult } from './types.js';\n\n/**\n * The skill set the hosted https://pixeldojo.ai/mcp route serves. The server\n * there runs in our production container, so \"a local file\" would be ITS\n * disk: pixeldojo_upload is dropped and every `*_path` / `*_paths` field is\n * stripped from the advertised schemas. uploadLocalFile also refuses unless\n * ctx.localFiles is true, which covers args that arrive anyway (a client\n * with a cached schema, a saved run_workflow step).\n */\nconst isLocalPathField = (key: string) => /_paths?$/.test(key);\n\nexport const HOSTED_SKILLS: ReadonlyArray<SkillModule<unknown>> = ALL_SKILLS.filter(\n (s) => s.name !== uploadSkill.name,\n).map((s) => {\n const props = (s.inputJsonSchema.properties ?? {}) as Record<string, unknown>;\n return {\n ...s,\n description: s.hostedDescription ?? s.description,\n inputJsonSchema: {\n ...s.inputJsonSchema,\n properties: Object.fromEntries(Object.entries(props).filter(([k]) => !isLocalPathField(k))),\n },\n };\n});\n\n/**\n * MCP tool annotations for every skill. ChatGPT's plugin review rejects tools\n * without readOnlyHint / destructiveHint / openWorldHint, and clients use them\n * to decide when to ask before a call. Rationale per hint:\n * - readOnlyHint: false for anything that renders, spends credits or saves.\n * - destructiveHint: renders are additive (new media, nothing of the user's\n * is changed or deleted; failed jobs refund), so false. save_workflow\n * overwrites a same-named workflow, so true.\n * - openWorldHint: everything stays inside the user's own account, except\n * from_url, which fetches an arbitrary public page.\n */\ntype Hints = { title: string; readOnlyHint: boolean; destructiveHint: boolean; openWorldHint: boolean };\nconst render = (title: string): Hints => ({ title, readOnlyHint: false, destructiveHint: false, openWorldHint: false });\nconst read = (title: string): Hints => ({ title, readOnlyHint: true, destructiveHint: false, openWorldHint: false });\n\nexport const TOOL_ANNOTATIONS: Record<string, Hints> = {\n pixeldojo_generate: render('Generate image or video'),\n pixeldojo_edit: render('Edit image'),\n pixeldojo_character: render('Consistent character image'),\n pixeldojo_storyboard: render('Storyboard preview video'),\n pixeldojo_upscale: render('Upscale image or video'),\n pixeldojo_caption: render('Caption video'),\n pixeldojo_overlay: render('Add offer or end card'),\n pixeldojo_audio: render('Generate music, speech or sound'),\n pixeldojo_video: render('Change, animate or extend video'),\n pixeldojo_ad: render('Make video ad'),\n pixeldojo_campaign: render('Make product launch campaign'),\n pixeldojo_film: render('Make short film'),\n pixeldojo_episode: render('Make faceless video'),\n pixeldojo_run_workflow: render('Run saved workflow'),\n pixeldojo_upload: render('Upload local file'),\n pixeldojo_save_workflow: { ...render('Save workflow'), destructiveHint: true },\n pixeldojo_status: read('Check job status'),\n pixeldojo_campaign_status: read('Check campaign status'),\n pixeldojo_library: read('Search media library'),\n pixeldojo_save: render('Save to My Media'),\n pixeldojo_save_character: render('Save character or element'),\n pixeldojo_list_workflows: read('List saved workflows'),\n pixeldojo_from_url: { ...read('Read product page'), openWorldHint: true },\n};\n\n/** The tools/list entry for a skill, shared by the stdio server and the hosted /mcp route. */\nexport function toolListing(skill: SkillModule<unknown>) {\n const { title, ...hints } = TOOL_ANNOTATIONS[skill.name];\n return {\n name: skill.name,\n title,\n description: skill.description,\n inputSchema: skill.inputJsonSchema,\n annotations: { title, ...hints },\n };\n}\n\nexport function findHostedSkill(name: string): SkillModule<unknown> | undefined {\n const wanted = name.replace(/^pixeldojo:/, 'pixeldojo_');\n return HOSTED_SKILLS.find((s) => s.name === wanted);\n}\n\n/**\n * Skill names were `pixeldojo:<x>` until 2026-07-29. A colon is illegal in a\n * tool name per Anthropic's `^[a-zA-Z0-9_-]{1,64}$`, so claude.ai's remote-MCP\n * connector rejected the whole tools array and every tool call in the\n * conversation failed (Claude Code silently sanitized, which hid it). Names are\n * underscored now; the old form still resolves for callers that memorized it\n * and for workflow steps saved under the colon names.\n */\nexport function findSkill(name: string): SkillModule<unknown> | undefined {\n const wanted = name.replace(/^pixeldojo:/, 'pixeldojo_');\n return ALL_SKILLS.find((s) => s.name === wanted);\n}\n","/**\n * Header-injecting wrapper around `@pixeldojo/sdk`'s PixelDojoClient.\n *\n * Per Eng review E2 + E3:\n * - Depends on @pixeldojo/sdk for run/getJob/listModels/getModelSchema\n * (DRY — no /api/v1 client duplication).\n * - Injects `x-pixeldojo-source: mcp/<version>` and `x-pixeldojo-skill:\n * <skill-name>` headers on every API call so Tool Health can attribute\n * MCP traffic separately from raw REST.\n *\n * The SDK exposes a `fetch` injection point in its constructor — we wrap\n * the global `fetch` to add headers without monkey-patching anything.\n */\nimport { PixelDojoClient } from '@pixeldojo/sdk';\nimport type { PixelDojoClientOptions } from '@pixeldojo/sdk';\n\nexport interface MakeClientOptions extends PixelDojoClientOptions {\n /** MCP package version for the `x-pixeldojo-source` header value. */\n mcpVersion: string;\n /** Optional skill name; if set, written to `x-pixeldojo-skill`. */\n skillName?: string;\n /** Optional fetch override (tests). Defaults to `globalThis.fetch`. */\n baseFetch?: typeof globalThis.fetch;\n}\n\n/**\n * Build a PixelDojoClient with attribution headers baked in.\n *\n * Each call's headers include both the source tag and the requesting\n * skill so the server can record per-skill error rates without the\n * client passing skill metadata explicitly through every call.\n */\nexport function makeAttributedClient(options: MakeClientOptions): PixelDojoClient {\n const { mcpVersion, skillName, baseFetch, ...sdkOptions } = options;\n const real = baseFetch ?? globalThis.fetch.bind(globalThis);\n\n const wrappedFetch: typeof globalThis.fetch = (input, init) => {\n const headers = new Headers(init?.headers);\n headers.set('x-pixeldojo-source', `mcp/${mcpVersion}`);\n if (skillName) headers.set('x-pixeldojo-skill', skillName);\n return real(input, { ...init, headers });\n };\n\n return new PixelDojoClient({\n ...sdkOptions,\n fetch: wrappedFetch,\n });\n}\n","/**\n * MCP server bootstrap. Wires the named skills to the MCP `tools/list` +\n * `tools/call` handlers and runs over stdio.\n *\n * Architecture:\n * - tools/list: returns every skill's name + description + inputSchema.\n * - tools/call: parses input via Zod, dispatches to the skill module,\n * converts the SkillResult into MCP content blocks, returns to host.\n * - errors are translated at the boundary: provider failures, missing\n * API keys, unknown skills all surface as actionable MCP error\n * payloads (never raw stack traces).\n */\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport { makeAttributedClient } from './client.js';\nimport { ALL_SKILLS, findSkill, toolListing } from './skills/index.js';\nimport type { SkillContext, SkillResult } from './skills/types.js';\nimport { makeRedactedLogger } from './redact.js';\n\n// Stamped from package.json at build time (tsup define) so the MCP\n// handshake and telemetry headers can't drift from the published version.\n// The '0.0.0-dev' fallback only appears when running un-built source.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const PACKAGE_VERSION =\n typeof __PACKAGE_VERSION__ === 'string' ? __PACKAGE_VERSION__ : '0.0.0-dev';\n\n/**\n * Server-level context sent on `initialize`, shared by this stdio server and\n * the hosted /api/mcp route. Facts that span tools only: tool choice belongs\n * in each tool's own description. API/MCP outputs live under the temp\n * bucket's api-outputs/ folder and are swept one hour after they land;\n * finished films are saved to the account library, so they stay.\n */\nexport const SERVER_INSTRUCTIONS =\n 'Pixel Dojo generates images, video, audio and short films from one catalog of AI models, billed in credits from the connected Pixel Dojo account. A job that runs past the 30-second wait returns a jobId to check later; check it rather than submitting again, since every new submission is charged. Generated asset URLs are deleted one hour after they are created: pixeldojo_save keeps one in the user\\'s My Media permanently (after a safety check), and finished films stay in the account library. In any prompt, @Name uses a character, product, outfit, location, prop or style the user saved in Character Studio: its photos are attached automatically. pixeldojo_library source=characters lists them, and pixeldojo_save_character saves a new one from 3 to 5 photos.';\n\nexport interface ServerOptions {\n apiKey: string;\n baseUrl?: string;\n packageVersion?: string;\n /** Inject for tests. Defaults to the real fetch. */\n baseFetch?: typeof globalThis.fetch;\n}\n\n/**\n * Build the configured MCP `Server` instance with handlers wired in.\n * Caller is responsible for connecting it to a transport (stdio in\n * production, mock in tests).\n */\nexport function buildServer(options: ServerOptions): Server {\n if (!options.apiKey) {\n throw new Error(\n 'apiKey is required. Set PIXELDOJO_API_KEY env var or pass apiKey to buildServer().',\n );\n }\n\n const version = options.packageVersion ?? PACKAGE_VERSION;\n const baseUrl = options.baseUrl ?? 'https://pixeldojo.ai';\n const logger = makeRedactedLogger();\n\n const server = new Server(\n {\n name: 'pixeldojo',\n version,\n },\n {\n capabilities: {\n tools: {},\n },\n instructions: SERVER_INSTRUCTIONS,\n },\n );\n\n // tools/list — advertise every named skill.\n server.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: ALL_SKILLS.map(toolListing),\n };\n });\n\n // tools/call — parse input, dispatch, translate result.\n server.setRequestHandler(CallToolRequestSchema, async (req) => {\n const skillName = req.params.name;\n const skill = findSkill(skillName);\n if (!skill) {\n const available = ALL_SKILLS.map((s) => s.name).join(', ');\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: `Unknown skill \"${skillName}\". Available: ${available}.`,\n },\n ],\n };\n }\n\n const parsed = skill.inputZod.safeParse(req.params.arguments ?? {});\n if (!parsed.success) {\n const issues = parsed.error.issues\n .map((i) => `${i.path.join('.') || '(root)'}: ${i.message}`)\n .join('; ');\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: `Invalid input for ${skillName}: ${issues}`,\n },\n ],\n };\n }\n\n // Build a client with skill-tagged headers for this call.\n const client = makeAttributedClient({\n apiKey: options.apiKey,\n baseUrl,\n mcpVersion: version,\n skillName,\n baseFetch: options.baseFetch,\n });\n\n const ctx: SkillContext = {\n client,\n apiKey: options.apiKey,\n baseUrl,\n mcpVersion: version,\n localFiles: true, // stdio: the caller's own machine\n logger,\n buildStatusUrl: (jobId) => `${baseUrl}/api/v1/jobs/${encodeURIComponent(jobId)}`,\n };\n\n try {\n const result = await skill.run(parsed.data, ctx);\n return skillResultToMcpResponse(result);\n } catch (err) {\n const message = errorToActionableMessage(err);\n logger.error(`Skill ${skillName} failed`, message);\n return {\n isError: true,\n content: [{ type: 'text', text: message }],\n };\n }\n });\n\n return server;\n}\n\n/**\n * Translate a SkillResult into MCP content blocks.\n * The host renders these to the LLM; URLs in `assets` are surfaced as\n * extra text blocks so the LLM can quote them directly without needing\n * a separate `assets` shape (no MCP standard for that yet).\n */\nexport function skillResultToMcpResponse(result: SkillResult): {\n isError?: boolean;\n content: Array<{ type: 'text'; text: string }>;\n} {\n if (result.kind === 'assets') {\n return {\n content: [\n { type: 'text', text: result.text },\n // Each URL on its own line so an LLM can copy individually.\n ...result.assetUrls.map((url) => ({ type: 'text' as const, text: url })),\n ],\n };\n }\n if (result.kind === 'handoff') {\n return {\n content: [\n { type: 'text', text: result.text },\n { type: 'text', text: `jobId: ${result.jobId}` },\n { type: 'text', text: `statusUrl: ${result.statusUrl}` },\n ],\n };\n }\n return {\n content: [{ type: 'text', text: result.text }],\n };\n}\n\n/**\n * Convert SDK / network errors to a single actionable line. Per Eng review:\n * users should never see raw provider stack traces; errors must include\n * what to do next.\n */\nexport function errorToActionableMessage(err: unknown): string {\n if (err == null) return 'Unknown error';\n if (typeof err === 'string') return err;\n const e = err as {\n name?: string;\n code?: string;\n status?: number;\n message?: string;\n };\n // Auth errors → tell the user where to fix it.\n if (e.status === 401 || e.code === 'auth_required' || e.name === 'AuthenticationError') {\n return (\n 'Authentication failed. Check PIXELDOJO_API_KEY. ' +\n 'Get a key at https://pixeldojo.ai/api-platform/api-keys.'\n );\n }\n if (e.status === 402 || e.code === 'insufficient_credits') {\n return (\n 'Insufficient credits. Top up at https://pixeldojo.ai/api-platform/buy-credits.'\n );\n }\n if (e.status === 429 || e.code === 'rate_limit') {\n return 'Rate limit hit. Try again in a few seconds.';\n }\n if (e.status === 404 || e.code === 'not_found') {\n return e.message ?? 'Resource not found.';\n }\n if (e.name === 'TimeoutError') {\n return e.message ?? 'Request timed out. Try again.';\n }\n return e.message ?? 'Unknown error';\n}\n\n/**\n * Run the server over stdio. Used by the CLI; tests use buildServer\n * directly with a mock transport.\n */\nexport async function runStdio(options: ServerOptions): Promise<void> {\n const server = buildServer(options);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n","/**\n * Log-boundary redaction. Strips PixelDojo API keys (`pd_<alphanumerics>`)\n * from any string passed through the logger so a debug message can never\n * leak a customer's key into MCP-host logs.\n *\n * Per Eng review: redaction is not optional, even for \"internal\" log\n * lines — the MCP host (Claude Code, Cursor) controls the log destination\n * and we cannot assume it is private.\n */\n\nconst PD_KEY_RE = /pd_[A-Za-z0-9_-]{8,}/g;\nconst REDACTED = '[redacted]';\n\n/**\n * Replace any pd_xxx token in a string with `[redacted]`. Returns the\n * original input unchanged when no token is present, so the common case\n * is a no-op allocation-wise.\n */\nexport function redactKeys(input: string): string {\n if (!input || typeof input !== 'string') return input;\n if (!input.includes('pd_')) return input;\n return input.replace(PD_KEY_RE, REDACTED);\n}\n\n/**\n * Recursively redact a value before sending it to a logger. Strings are\n * scrubbed via `redactKeys`. Plain objects and arrays are walked. Symbols,\n * functions, and primitives other than string pass through unchanged.\n *\n * Cycle-safe via WeakSet: an object that references itself is replaced\n * with `[circular]` rather than crashing the logger.\n */\nexport function redactValue(value: unknown, seen: WeakSet<object> = new WeakSet()): unknown {\n if (value == null) return value;\n if (typeof value === 'string') return redactKeys(value);\n if (typeof value !== 'object') return value;\n if (seen.has(value as object)) return '[circular]';\n seen.add(value as object);\n\n if (Array.isArray(value)) {\n return value.map((v) => redactValue(v, seen));\n }\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[k] = redactValue(v, seen);\n }\n return out;\n}\n\n/**\n * Build a logger that wraps `console.error` (the conventional place for\n * MCP server logs — stdout is reserved for JSON-RPC framing). Every\n * message and arg is passed through `redactValue` first.\n */\nexport function makeRedactedLogger(target: Pick<Console, 'error'> = console) {\n return {\n error(msg: string, ...args: unknown[]) {\n const redactedArgs = args.map((a) => redactValue(a));\n target.error(`[pixeldojo-mcp] ${redactKeys(msg)}`, ...redactedArgs);\n },\n };\n}\n","/**\n * Public entry — programmatic access to the MCP server. Most consumers\n * use the CLI instead (`npx @pixeldojo/mcp`), but the building blocks\n * are exported here so embedders can build their own MCP host.\n */\nexport {\n buildServer,\n runStdio,\n PACKAGE_VERSION,\n SERVER_INSTRUCTIONS,\n skillResultToMcpResponse,\n errorToActionableMessage,\n} from './server.js';\nexport type { ServerOptions } from './server.js';\nexport { makeAttributedClient } from './client.js';\nexport type { MakeClientOptions } from './client.js';\nexport { ALL_SKILLS, findSkill, HOSTED_SKILLS, findHostedSkill, toolListing, TOOL_ANNOTATIONS } from './skills/index.js';\nexport type { SkillModule, SkillContext, SkillResult } from './skills/types.js';\nexport { redactKeys, redactValue, makeRedactedLogger } from './redact.js';\nexport {\n pollJobUntilDoneOrHandoff,\n type PollResult,\n type PollableJob,\n type PollOptions,\n} from './poll.js';\n"]}
|