@pixeldojo/mcp 0.9.1 → 0.11.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/dist/cli.js.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/generate.ts","../src/skills/edit.ts","../src/skills/character.ts","../src/skills/storyboard.ts","../src/skills/upscale.ts","../src/skills/status.ts","../src/skills/from-url.ts","../src/skills/film.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/workflows.ts","../src/skills/index.ts","../src/client.ts","../src/server.ts","../src/redact.ts","../src/cli.ts"],"names":["buildPayload","run","DEFAULT_MODEL","InputSchema","InputJsonSchema","z","ALLOWED","extractAssetUrls","basename","findSkill"],"mappings":"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","file":"cli.js","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 /** 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 = { kind: 'text'; text: string };\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 /** 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 { PixelDojoClient } from '@pixeldojo/sdk';\n\nconst MAX_IMAGE_BYTES = 50 * 1024 * 1024;\nconst MAX_VIDEO_BYTES = 200 * 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};\n\nexport class SkillUploadError extends Error {\n constructor(public readonly userMessage: string) {\n super(userMessage);\n this.name = 'SkillUploadError';\n }\n}\n\nexport async function uploadLocalFile(\n path: string,\n client: PixelDojoClient,\n): Promise<string> {\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 limit = isImage ? MAX_IMAGE_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' : '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 client.uploadImage(blob, filename);\n return response.url;\n}\n\nexport async function uploadLocalFiles(\n paths: readonly string[],\n client: PixelDojoClient,\n): Promise<string[]> {\n return Promise.all(paths.map((p) => uploadLocalFile(p, client)));\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// 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<FieldConstraints | 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 getFieldConstraints(\n apiId: string,\n client: PixelDojoClient,\n): Promise<FieldConstraints | 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(\n (res) =>\n (res.schema as { properties?: FieldConstraints } | undefined)?.properties ?? {},\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\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.\n *\n * tests/contracts/mcp-reference-field-coverage.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}\n\n/**\n * Which field this model wants a reference image in.\n * - undefined → schema fetch failed; caller keeps its existing behavior.\n * - null → schema fetched, model declares no reference field at all.\n * - {name} → send the image as this key (wrapped in an array if the\n * schema types it as one).\n */\nexport async function resolveReferenceField(\n apiId: string,\n client: PixelDojoClient,\n): Promise<ReferenceField | null | undefined> {\n const props = await getFieldConstraints(apiId, client);\n if (props === null) return undefined;\n for (const name of REFERENCE_FIELD_PRIORITY) {\n const field = 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/** 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}\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 props = await getFieldConstraints(apiId, client);\n if (props === null) return null; // fetch failed — caller falls back\n\n const key = REF_KEYS.find((k) => props[k] !== undefined);\n if (!key) return null; // model declares no reference field\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 };\n }\n return { key, value: urls[0], dropped: urls.length - 1 };\n}\n","/**\n * pixeldojo_generate — generic image/video generation skill.\n *\n * Default routing: text-to-image via `google-nano-banana` (broad capability,\n * stable output). 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 resolveReferenceField,\n snapAspectRatio,\n snapDuration,\n snapResolution,\n} from './schema-snap.js';\n\nconst InputSchema = z.object({\n prompt: z.string().min(1).max(8000).describe('Prompt describing what to generate.'),\n model: z\n .string()\n .optional()\n .describe(\n 'Override the model. Any apiId from /api/v1/models (e.g. \"flux\", \"google-nano-banana\", \"veo-3.1-fast\", \"kling-video-v3-standard-text\"). Omit to use the default.',\n ),\n preset: z\n .string()\n .optional()\n .describe(\n 'Preset slug to seed the params (e.g. \"cinematic-portrait\", \"product-floating-clean\", \"magazine-cover-text\"). Browse the catalog at https://pixeldojo.ai/presets. Explicit fields override preset values.',\n ),\n aspect_ratio: z\n .string()\n .optional()\n .describe('Aspect ratio supported by the chosen model (e.g. \"1:1\", \"16:9\", \"9:16\").'),\n duration: z\n .number()\n .int()\n .positive()\n .optional()\n .describe('Video duration in seconds, when applicable.'),\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 image URL for image-to-image / image-to-video tools.'),\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\nconst DEFAULT_MODEL = 'google-nano-banana';\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.' },\n model: {\n type: 'string',\n description:\n 'Override the model. Any apiId from /api/v1/models (e.g. \"flux\", \"google-nano-banana\", \"veo-3.1-fast\", \"kling-video-v3-standard-text\"). Omit to use the default.',\n },\n preset: {\n type: 'string',\n description:\n 'Preset slug to seed the params (e.g. \"cinematic-portrait\", \"product-floating-clean\"). Explicit fields override preset values.',\n },\n aspect_ratio: { type: 'string' },\n duration: { type: 'integer' },\n resolution: {\n type: 'string',\n description:\n 'Output resolution when supported (e.g. \"480p\", \"720p\", \"1080p\", \"4k\"). Lower tiers cost fewer credits.',\n },\n image_url: { type: 'string', format: 'uri' },\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. Single-reference models use the first.',\n },\n image_paths: {\n type: 'array',\n items: { type: 'string' },\n description:\n 'Multiple absolute local file paths, each uploaded to 24h temp storage and used as a reference.',\n },\n image_path: {\n type: 'string',\n description:\n 'Absolute local file path. The skill uploads it to PixelDojo (24h temp storage) and uses the resulting URL as the reference image. Prefer this over image_url when the user has a local file.',\n },\n },\n required: ['prompt'],\n} as const;\n\n/**\n * Per-model param adapter. Agents only ever give us a generic\n * { image_url, duration, resolution }; each model declares its own field\n * names and schemas reject unknown keys (additionalProperties: false), so a\n * verbatim `image_url` is silently dropped and the model then 400s naming a\n * field the agent had no way to set — an unrecoverable loop. `refField` is\n * resolved from the model's REAL schema (see resolveReferenceField), which\n * is how the reference-driven video engines — seedance-2-reference\n * (reference_images), grok-r2v / wan-reference-to-video /\n * happyhorse-1.0-r2v (reference_urls), kling-reference-to-video\n * (start_image_url) — become reachable without a 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 refField: ReferenceField | null | undefined,\n referenceUrls: string[] = [],\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 (input.image_url) {\n body.video_url = input.image_url;\n body.image_url = input.image_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 (input.image_url) {\n // refField undefined (schema fetch failed) or null (model declares no\n // reference field) → send image_url, i.e. exactly what we sent before\n // this adapter existed. No new failure mode on an unknown schema.\n // An array field takes every reference the caller gave; a scalar field\n // takes the first, because there is nowhere honest to put the rest.\n const refs = referenceUrls.length > 0 ? referenceUrls : [input.image_url];\n if (refField) {\n body[refField.name] = refField.isArray ? refs : refs[0];\n } else {\n body.image_url = refs[0];\n }\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 const apiId = input.model ?? DEFAULT_MODEL;\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.client) : undefined);\n const manyUrls = [...(input.image_urls ?? [])];\n for (const p of input.image_paths ?? []) {\n manyUrls.push(await uploadLocalFile(p, ctx.client));\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 // 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 (!resolved.image_url) {\n return {\n kind: 'text',\n text:\n 'pixeldojo_generate with model=\"grok-video-extend\" requires image_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 if (!VIDEO_INPUT_MODELS.has(apiId)) {\n // One schema fetch, shared by all four lookups (schema-snap caches the\n // in-flight promise per apiId).\n const [aspect_ratio, duration, resolution, ref] = 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 resolved.image_url ? resolveReferenceField(apiId, ctx.client) : Promise.resolve(undefined),\n ]);\n resolved = { ...resolved, aspect_ratio, duration, resolution };\n refField = ref;\n }\n\n const body = buildPayload(apiId, resolved, refField, referenceUrls);\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 : urls.length === 1\n ? `Generated. Asset: ${urls[0]}`\n : `Generated ${urls.length} assets. URLs: ${urls.join(', ')}`,\n );\n}\n\nexport const generateSkill: SkillModule<Input> = {\n name: 'pixeldojo_generate',\n description:\n 'Generate any image or video from a prompt. Auto-routes to a sensible default model; pass `model` to pick a specific apiId from the catalog. For reference-image / image-to-video flows: pass `image_url` if you already have a URL, or `image_path` (absolute local path) and the skill uploads it to 24h temp storage automatically.',\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';\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});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n prompt: { type: 'string', description: 'Edit instruction.' },\n image_url: {\n type: 'string',\n format: 'uri',\n description: 'Single reference image. 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: 'Multiple reference images (1-9).',\n },\n image_path: {\n type: 'string',\n description:\n 'Absolute local file path. Skill uploads it (24h temp storage) and edits the resulting URL. Prefer over image_url when the user has a local file.',\n },\n image_paths: {\n type: 'array',\n items: { type: 'string' },\n minItems: 1,\n maxItems: 9,\n description: 'Multiple absolute local file paths (1-9). Each uploaded before dispatch.',\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: { type: 'string' },\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 schema is 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 return { body, dropped: refs.dropped };\n}\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\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.client);\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.client);\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\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 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}\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 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 * Whitelisted models: seedream-5 (default, Seedream 5 Pro), seedream-4\n * (Seedream 4.5), flux-edit (kontext-style editing), gpt-image-2-edit.\n * User can override `model` but it MUST be in the whitelist; otherwise the\n * skill returns an UnknownModelError with the allowed list (per CEO D5).\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 { snapAspectRatio } from './schema-snap.js';\n\nconst ALLOWED = ['seedream-5', 'seedream-4', 'flux-edit', 'gpt-image-2-edit'] as const;\ntype AllowedModel = (typeof ALLOWED)[number];\nconst DEFAULT_MODEL: AllowedModel = 'seedream-5';\n\n// flux-edit and gpt-image-2-edit are edit-style models — they always need a\n// source image, unlike seedream-5/seedream-4 which can generate from a\n// prompt alone. Without this gate the request reaches the backend and gets\n// rejected downstream (\"input_image_1: Input image is required\" /\n// \"image_urls: Array must contain at least 1 element(s)\"), which loops\n// agents that retry without realizing the input was the issue.\nconst REQUIRES_REFERENCE = new Set<AllowedModel>(['flux-edit', 'gpt-image-2-edit']);\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 'Reference image of the character. Required by flux-edit and gpt-image-2-edit; optional for seedream-5/seedream-4.',\n ),\n aspect_ratio: z.string().optional().describe('Only honored for model=\"flux-edit\".'),\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n prompt: { type: 'string' },\n model: {\n type: 'string',\n enum: ALLOWED,\n description: `One of: ${ALLOWED.join(', ')}. Defaults to ${DEFAULT_MODEL}.`,\n },\n reference_image_url: { type: 'string', format: 'uri' },\n aspect_ratio: { type: 'string' },\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:\n `Unknown model \"${requested}\" for pixeldojo_character. ` +\n `Allowed: ${ALLOWED.join(', ')}.`,\n };\n }\n const apiId = requested as AllowedModel;\n\n if (REQUIRES_REFERENCE.has(apiId) && !input.reference_image_url) {\n return {\n kind: 'text',\n text:\n `pixeldojo_character with model=\"${apiId}\" requires reference_image_url ` +\n `(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 if (input.reference_image_url) {\n if (apiId === 'flux-edit') {\n body.input_image = input.reference_image_url;\n } else {\n // seedream-5, seedream-4, gpt-image-2-edit all key on image_urls.\n body.image_urls = [input.reference_image_url];\n }\n }\n // seedream-5/seedream-4/gpt-image-2-edit key sizing on `image_size`\n // instead of aspect_ratio — snapAspectRatio confirms this from each\n // model's real schema and omits the field entirely for them, rather\n // than relying on a hardcoded per-model allowlist that can go stale.\n // onUnknown 'omit': historically this skill only ever sent aspect_ratio\n // to flux-edit, so when the schema fetch fails we must NOT forward it to\n // models whose strict schemas reject the unrecognized key — omitting\n // matches the pre-snapping behavior for every model in this whitelist.\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 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 : `Character shot ready. Asset: ${urls[0]}`,\n );\n}\n\nexport const characterSkill: SkillModule<Input> = {\n name: 'pixeldojo_character',\n description:\n 'Generate or edit consistent characters across shots. Pass a reference_image_url for identity locking (seedream-5 by default).',\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.\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';\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.\nconst ALLOWED = [\n 'veo-3.1-fast',\n 'veo-3.1-standard',\n 'kling-video-v3-standard-text',\n 'seedance-2-high',\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});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n brief: {\n type: 'string',\n description: 'Storyboard brief: scene, shots, mood, action.',\n },\n model: {\n type: 'string',\n enum: ALLOWED,\n description: `One of: ${ALLOWED.join(', ')}. Defaults to ${DEFAULT_MODEL}.`,\n },\n aspect_ratio: { type: 'string' },\n duration: { type: 'integer' },\n },\n required: ['brief'],\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:\n `Unknown model \"${requested}\" for pixeldojo_storyboard. ` +\n `Allowed: ${ALLOWED.join(', ')}.`,\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\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 : `Storyboard preview ready. Asset: ${urls[0]}`,\n );\n}\n\nexport const storyboardSkill: SkillModule<Input> = {\n name: 'pixeldojo_storyboard',\n description:\n 'Generate a video storyboard preview from a single brief. v1: single-shot preview; multi-shot orchestration coming.',\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n allowedModels: [...ALLOWED],\n defaultModel: DEFAULT_MODEL,\n run,\n};\n","/**\n * pixeldojo_upscale — enhance any image.\n *\n * Whitelisted models: magnific-upscaler (default), creative-upscale,\n * face-enhance. Each keys the source image on `image` (NOT `image_url` —\n * every one of these tool schemas uses `image`; sending `image_url`\n * previously 400'd with \"image: Required\" on every call, confirmed via a\n * live test sweep 2026-07-08). scale_factor also differs by model: magnific\n * wants a string enum ('2x'|'4x'|'8x'|'16x'), the others a plain number —\n * this skill takes a plain number from the caller and converts per model.\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 = ['magnific-upscaler', 'creative-upscale', 'face-enhance'] as const;\ntype AllowedModel = (typeof ALLOWED)[number];\nconst DEFAULT_MODEL: AllowedModel = 'magnific-upscaler';\n\nconst InputSchema = z.object({\n image_url: z.string().url().describe('URL of the source image to upscale.'),\n model: z\n .string()\n .optional()\n .describe(`One of: ${ALLOWED.join(', ')}. Defaults to ${DEFAULT_MODEL}.`),\n scale_factor: z\n .number()\n .min(1)\n .max(16)\n .optional()\n .describe(\n 'Upscale multiplier. 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 .min(0)\n .max(1)\n .optional()\n .describe('Magnific only: 0 (preserve) → 1 (creative). Defaults to 0.'),\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n image_url: { type: 'string', format: 'uri' },\n model: { type: 'string', enum: ALLOWED },\n scale_factor: { type: 'number', minimum: 1, maximum: 16 },\n creativity: { type: 'number', minimum: 0, maximum: 1 },\n },\n required: ['image_url'],\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_upscale. Allowed: ${ALLOWED.join(', ')}.`,\n };\n }\n const apiId = requested as AllowedModel;\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 image: input.image_url,\n };\n 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. Magnific (default) supports configurable scale_factor and creativity; face-enhance for portraits.',\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n allowedModels: [...ALLOWED],\n defaultModel: DEFAULT_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: 'Job id returned from a prior pixeldojo_* skill handoff.',\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 the status of a long-running job after a 30s sync handoff. Returns assets when ready, failure reason if failed, or current state if still running.',\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 * Used as the first step of agentic flows like pixeldojo_campaign and\n * (eventually) pixeldojo_ad / pixeldojo_lookbook — removes the\n * 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 product info (name, description, images) from any product page URL. Use this as the first step before pixeldojo_campaign / :ad / :lookbook so the agent has structured product data instead of a free-text description.',\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, approves\n * finished ones (the server's Frame check auto-reviews each frame,\n * redoes clear mismatches up to 3 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 */\nimport { z } from 'zod';\nimport type { SkillContext, SkillModule, SkillResult } from './types.js';\n\nconst LOOKS = ['live-action', 'anime', '3d-animation', 'noir', 'horror', 'sci-fi', 'documentary', 'western', 'romance', 'romantic-comedy', 'comedy'] as const;\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.enum(LOOKS).default('live-action').describe('Visual style carried through frames, clips, and soundtrack.'),\n aspect: z.enum(['16:9', '9:16']).default('16:9'),\n length: z\n .enum(['30s', '60s', '2-3min', '5min'])\n .default('60s')\n .describe('Target length; drives the shot count (~6/12/24/60 shots).'),\n film_id: z.string().max(40).optional().describe('Existing film id (from a previous call) for produce/status.'),\n action: z\n .enum(['plan', 'produce', 'status'])\n .default('plan')\n .describe(\"'plan' creates + storyboards (free). 'produce' starts charged generation. 'status' advances production and reports progress; poll it every ~30s until it returns the finished 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('Internal: pass back the music job id from a previous status reply so the composing score is attached instead of re-charged.'),\n});\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema: Record<string, unknown> = {\n type: 'object',\n properties: {\n idea: { type: 'string', description: 'One-to-three sentence film idea. The studio writes the screenplay (free).' },\n script: { type: 'string', description: 'A full screenplay to plan instead of an idea.' },\n look: { type: 'string', enum: [...LOOKS], description: 'Visual style. Default live-action.' },\n aspect: { type: 'string', enum: ['16:9', '9:16'], description: 'Default 16:9.' },\n length: { type: 'string', enum: ['30s', '60s', '2-3min', '5min'], description: 'Target length (~6/12/24/60 shots). Default 60s.' },\n film_id: { type: 'string', description: 'Existing film id for produce/status.' },\n action: { type: 'string', enum: ['plan', 'produce', 'status'], description: \"plan (free) | produce (charged) | status (poll every ~30s).\" },\n soundtrack: { type: 'string', enum: ['scene-synced', 'flat', 'none'], description: 'Default scene-synced.' },\n music_job_id: { type: 'string', description: 'Pass back from a previous status reply while the score is composing.' },\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 characterIds: string[];\n elementIds: string[];\n engine: string;\n cameraPreset?: string;\n}\ninterface FilmDto {\n id: string;\n title: string;\n status: string;\n look: string;\n aspect: string;\n script?: string;\n exportUrl?: string;\n exportError?: string;\n audioStems: { kind: string; url: string }[];\n scenes: { id: string; title: string; location?: string; shots: FilmShotDto[] }[];\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);\nconst count = (f: FilmDto, pred: (sh: FilmShotDto) => boolean) => shots(f).filter(pred).length;\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\nasync function plan(input: Input, ctx: SkillContext): Promise<SkillResult> {\n if (!input.idea?.trim() && !input.script?.trim()) {\n return { kind: 'text', text: 'Provide an `idea` (we write the script, free) or a full `script` to plan a film.' };\n }\n const created = await filmApi<{ film?: FilmDto; error?: string }>(ctx, 'POST', '/api/films', {\n aspect: input.aspect,\n look: input.look,\n lengthTarget: input.length,\n assetIds: [],\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\n let script = input.script?.trim() ?? '';\n if (!script) {\n const wrote = await filmApi<{ film?: FilmDto; error?: string }>(ctx, 'POST', `/api/films/${id}/script`, { idea: input.idea!.trim() });\n script = wrote.data.film?.script ?? '';\n if (!script) return { kind: 'text', text: `Script writing failed: ${wrote.data.error ?? wrote.status}` };\n }\n const planned = await filmApi<{ film?: FilmDto; error?: string }>(ctx, 'POST', `/api/films/${id}/plan`, { script });\n const film = planned.data.film;\n if (!film) return { kind: 'text', text: `Shot planning failed: ${planned.data.error ?? planned.status}` };\n\n const total = shots(film).length;\n const sceneLines = film.scenes.map((s, i) => ` Scene ${i + 1} \"${s.title}\"${s.location ? ` [${s.location}]` : ''}: ${s.shots.length} shots`);\n return {\n kind: 'text',\n text: [\n `Planned \"${film.title}\" (film_id: ${film.id}) — ${film.scenes.length} scenes, ${total} shots, ${input.look}, ${input.aspect}.`,\n ...sceneLines,\n '',\n `Nothing has been charged yet. Producing renders every shot (roughly 20-25 credits per 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}\n\nasync function produce(filmId: string, ctx: SkillContext): Promise<SkillResult> {\n const { data } = await filmApi<{ film?: FilmDto; error?: string }>(ctx, 'GET', `/api/films/${filmId}`);\n if (!data.film) return { kind: 'text', text: `Film not found: ${data.error ?? filmId}` };\n const pending = shots(data.film).filter((sh) => sh.status === 'idle' || (sh.status === 'failed' && !sh.frameUrl));\n let fired = 0;\n for (const sh of pending.slice(0, 6)) {\n const r = await filmApi(ctx, 'POST', `/api/films/${filmId}/shots/${sh.id}/generate`, { kind: 'frame' });\n if (r.status === 200) fired += 1;\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). Poll pixeldojo_film with {\"film_id\": \"${filmId}\", \"action\": \"status\"} every ~30 seconds — each poll advances the pipeline.`,\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, scene.shots.reduce((n, sh) => n + (sh.durationSec || 0), 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 + (sh.durationSec || 0), 0);\n const ms = Math.min(600000, Math.max(5000, 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 { data } = await filmApi<{ film?: FilmDto; error?: string }>(ctx, 'GET', `/api/films/${filmId}?refresh=1`);\n const film = data.film;\n if (!film) return { kind: 'text', text: `Film not found: ${data.error ?? filmId}` };\n const all = shots(film);\n\n // Finished?\n if (film.status === 'exported' && film.exportUrl) {\n return {\n kind: 'text',\n text: `Film finished: \"${film.title}\"\\nWatch/download: ${film.exportUrl}\\nWorkspace: ${ctx.baseUrl}/film-studio/${film.id}\\nIt is saved in the Library folder \"Film: ${film.title}\".`,\n };\n }\n if (film.exportError) {\n return { kind: 'text', text: `Export failed: ${film.exportError} Poll again with action \"status\" to retry.` };\n }\n\n // 1) Frames: dispatch idle, approve finished ones.\n const idleFrames = all.filter((sh) => sh.status === 'idle');\n for (const sh of idleFrames.slice(0, 6)) {\n await filmApi(ctx, 'POST', `/api/films/${filmId}/shots/${sh.id}/generate`, { kind: 'frame' });\n }\n const framesDone = all.every((sh) => ['frame-ready', 'clip-generating', 'clip-ready'].includes(sh.status));\n if (framesDone && all.some((sh) => sh.status === 'frame-ready' && !sh.approved)) {\n // Approve everything via the merge-PATCH (server preserves job state).\n await filmApi(ctx, 'PATCH', `/api/films/${filmId}`, {\n scenes: film.scenes.map((s) => ({\n id: s.id,\n title: s.title,\n location: s.location,\n shots: s.shots.map((sh) => ({\n id: sh.id,\n prompt: sh.prompt,\n characterIds: sh.characterIds ?? [],\n elementIds: sh.elementIds ?? [],\n engine: sh.engine,\n cameraPreset: sh.cameraPreset,\n approved: true,\n durationSec: sh.durationSec,\n })),\n })),\n });\n }\n\n // 2) Clips: keep four in flight; retry audio-check failures once per poll.\n const inFlight = count(film, (sh) => sh.status === 'clip-generating');\n const clipQueue = all.filter((sh) => (sh.status === 'frame-ready' || (sh.status === 'failed' && Boolean(sh.frameUrl))) && framesDone);\n for (const sh of clipQueue.slice(0, Math.max(0, 4 - inFlight))) {\n await filmApi(ctx, 'POST', `/api/films/${filmId}/shots/${sh.id}/generate`, { kind: 'clip' });\n }\n\n // 3) All clips ready → soundtrack (once), then export.\n const clipsDone = all.length > 0 && all.every((sh) => sh.status === 'clip-ready');\n if (clipsDone) {\n const hasMusic = film.audioStems.some((st) => st.kind === 'music');\n if (soundtrack !== 'none' && !hasMusic) {\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 await filmApi(ctx, 'POST', `/api/films/${filmId}/export`, {});\n return { kind: 'text', text: `Score attached — export started. Poll again in ~60s with {\"film_id\": \"${filmId}\", \"action\": \"status\"} for the finished film URL.` };\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 { kind: 'text', text: `Score still composing. Poll again in ~20s with {\"film_id\": \"${filmId}\", \"action\": \"status\", \"music_job_id\": \"${musicJobId}\"}.` };\n }\n // Dispatch the score through the public API (same engine as the studio).\n const body = soundtrack === 'scene-synced' ? buildScorePlanBody(film) : buildFlatMusicBody(film, all);\n const dispatch = await ctx.client.run('text-to-music', body as never);\n return { kind: 'text', 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 }\n await filmApi(ctx, 'POST', `/api/films/${filmId}/export`, {});\n return { kind: 'text', text: `All clips ready — export started (${progressLine(film)}). Poll again in ~60s with action \"status\" for the finished film URL.` };\n }\n\n const failed = all.filter((sh) => sh.status === 'failed');\n return {\n kind: 'text',\n text: [\n `In progress: ${progressLine(film)}.`,\n failed.length > 0 ? `${failed.length} shot(s) failed and were re-queued (${failed[0]?.errorMessage?.slice(0, 100) ?? ''}).` : '',\n `Poll again in ~30s with {\"film_id\": \"${filmId}\", \"action\": \"status\"}.`,\n ].filter(Boolean).join('\\n'),\n };\n}\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n const action = input.action === 'plan' && input.film_id ? 'status' : input.action;\n if (action === 'plan') return plan(input, ctx);\n if (!input.film_id) return { kind: 'text', text: 'produce/status need the film_id returned by the plan step.' };\n if (action === 'produce') return produce(input.film_id, 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. Phased: plan is free and returns a cost estimate; produce starts charged generation; status advances production (poll every ~30s).',\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: 'Product page URL. Name, description, and images are extracted automatically.',\n },\n product_name: { type: 'string' },\n product_description: { type: 'string' },\n product_image_urls: { type: 'array', items: { type: 'string', format: 'uri' }, maxItems: 5 },\n product_image_paths: {\n type: 'array',\n items: { type: 'string' },\n maxItems: 5,\n description: 'Absolute local file 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: { type: 'array', items: { type: 'string' }, maxItems: 4 },\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: { type: 'string', format: 'uri' },\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: { type: 'string', enum: ['mini', 'fast', 'high'] },\n resolution: {\n type: 'string',\n enum: ['480p', '720p', '1080p', '4k'],\n description: '1080p/4k require quality \"high\".',\n },\n aspect_ratio: { type: 'string', enum: ['16:9', '4:3', '1:1', '3:4', '9:16', '21:9'] },\n duration: { type: 'integer', minimum: 4, maximum: 15 },\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.client)))),\n ];\n const characterImages = [\n ...(input.character_image_urls ?? []),\n ...(await Promise.all((input.character_image_paths ?? []).map((p) => uploadLocalFile(p, ctx.client)))),\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 any product into a video ad. Pass a product URL (auto-extracted) or product images, pick an ad style (UGC testimonial, unboxing, try-on, showcase, TV spot, and more via GET /api/v1/marketing/presets), optionally add presenter reference images, a location, a hook, and the exact spoken script. Renders with voiceover; returns the video or a statusUrl handoff to poll via pixeldojo_status. Ideal for automated generate-and-post workflows.',\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: 'Product page URL. We extract name + description + images automatically.',\n },\n product: {\n type: 'object',\n properties: {\n name: { type: 'string' },\n description: { type: 'string' },\n images: { type: 'array', items: { type: 'string', format: 'uri' } },\n },\n required: ['name'],\n },\n tone: {\n type: 'string',\n description: 'Creative direction threaded through every prompt.',\n },\n variants: { type: 'integer', minimum: 1, maximum: 8 },\n includeVideo: { type: 'boolean' },\n videoAspectRatio: { type: 'string', enum: ['9:16', '16:9', '1:1'] },\n videoMode: { type: 'string', enum: ['lifestyle', 'cgi', 'ugc', 'skip'] },\n },\n oneOf: [{ required: ['productUrl'] }, { required: ['product'] }],\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}\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 (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) or MP4, WebM, MOV (≤200MB). 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) or MP4, WebM, MOV (≤200MB). 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.client);\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 to :generate or :edit)`,\n };\n}\n\nexport const uploadSkill: SkillModule<Input> = {\n name: 'pixeldojo_upload',\n description:\n 'Upload a local image or video file and get back a public URL you can pass to :generate or :edit as image_url. Use when the user has a reference image on disk (drag-dropped into Claude Code, screenshot, etc.) and you need a URL. Storage auto-expires after 24 hours.',\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 addressed in the\n * prompt as @Audio1..@Audio3; local files go through the upload bridge via\n * audio_paths.\n */\nimport { z } from 'zod';\nimport { pollJobUntilDoneOrHandoff } from '../poll.js';\nimport { SkillUploadError, uploadLocalFiles } from './upload-helpers.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 'A script for speech, or a scene description for cinematic audio (dialogue + effects + music). Reference uploaded clips as @Audio1..@Audio3.',\n ),\n model: z\n .string()\n .optional()\n .describe(`One of: ${ALLOWED.join(', ')}. Defaults to ${DEFAULT_MODEL}.`),\n voice: z\n .string()\n .optional()\n .describe('Optional voice preset name or cloned-voice id (seed-audio) / voice_id (text-to-speech).'),\n audio_urls: z\n .array(z.string().url())\n .max(3)\n .optional()\n .describe('seed-audio only: up to 3 reference audio URLs (30s / 10MB max each).'),\n audio_paths: z\n .array(z.string())\n .max(3)\n .optional()\n .describe('seed-audio only: absolute local paths to reference clips; uploaded automatically (24h temp storage).'),\n output_format: z\n .string()\n .optional()\n .describe('seed-audio: mp3 (default), wav, pcm, ogg_opus. text-to-speech: mp3, wav, flac, pcm.'),\n speed: z.number().min(0.5).max(2).optional().describe('Speech speed multiplier (0.5–2).'),\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n prompt: { type: 'string' },\n model: { type: 'string', enum: ALLOWED },\n voice: { type: 'string' },\n audio_urls: { type: 'array', items: { type: 'string', format: 'uri' }, maxItems: 3 },\n audio_paths: { type: 'array', items: { type: 'string' }, maxItems: 3 },\n output_format: { type: 'string' },\n speed: { type: 'number', minimum: 0.5, maximum: 2 },\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 let audioUrls = input.audio_urls ?? [];\n if (input.audio_paths?.length) {\n try {\n const uploaded = await uploadLocalFiles(input.audio_paths, ctx.client);\n audioUrls = [...audioUrls, ...uploaded].slice(0, 3);\n } catch (err) {\n if (err instanceof SkillUploadError) {\n return { kind: 'text', text: `pixeldojo_audio (upload): ${err.userMessage}` };\n }\n throw err;\n }\n }\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 TTS available).',\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 :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 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 q: { type: 'string' },\n model: { type: 'string' },\n modality: { type: 'string', enum: ['image', 'video', 'audio'] },\n limit: { type: 'integer', minimum: 1, maximum: 50 },\n },\n required: [],\n} as const;\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\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 :generate, :edit, :character, or :upscale as a reference input.`,\n };\n}\n\nexport const librarySkill: SkillModule<Input> = {\n name: 'pixeldojo_library',\n description:\n 'Search your media library: saved My Media items (permanent) and recent API/MCP generations (expire after 24h), newest first. Returns asset URLs to reuse as reference inputs. Keep a result forever with pixeldojo_save.',\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: the file is\n * re-hosted on PixelDojo's permanent CDN (generation outputs otherwise\n * expire after 24 hours) and becomes searchable via pixeldojo_library.\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' },\n prompt: { type: 'string' },\n tool_name: { type: 'string' },\n modality: { type: 'string', enum: ['image', 'video', 'audio'] },\n job_id: { type: 'string' },\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. Generation outputs otherwise expire after 24 hours — call this when the user wants to keep a result.\",\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\nconst stepJson = {\n type: 'object',\n properties: {\n skill: { type: 'string' },\n args: { type: 'object' },\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: { type: 'string', pattern: '^[a-z0-9][a-z0-9-]{1,40}$' },\n description: { type: 'string' },\n steps: { type: 'array', items: stepJson, minItems: 1, maxItems: 8 },\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' },\n inputs: { type: 'object', additionalProperties: { type: 'string' } },\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 { statusSkill } from './status.js';\nimport { fromUrlSkill } from './from-url.js';\nimport { filmSkill } from './film.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 {\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 audioSkill,\n librarySkill,\n saveSkill,\n saveWorkflowSkill,\n runWorkflowSkill,\n listWorkflowsSkill,\n statusSkill,\n fromUrlSkill,\n uploadSkill,\n adSkill,\n campaignSkill,\n campaignStatusSkill,\n filmSkill,\n] as ReadonlyArray<SkillModule<unknown>>;\n\nexport {\n filmSkill,\n generateSkill,\n editSkill,\n characterSkill,\n storyboardSkill,\n upscaleSkill,\n audioSkill,\n librarySkill,\n saveSkill,\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 * 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 } 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\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 },\n );\n\n // tools/list — advertise every named skill.\n server.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: ALL_SKILLS.map((skill) => ({\n name: skill.name,\n description: skill.description,\n inputSchema: skill.inputJsonSchema,\n })),\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 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 * CLI entry — run by the bin shim at `bin/pixeldojo-mcp.js`.\n *\n * Subcommands:\n * - (default, no args) Run the MCP server over stdio. This is what\n * Claude Code / Cursor / OpenClaw spawn when configured.\n * - `init` Print the MCP host config snippet for Claude Code, Cursor,\n * and a generic shape — copy/paste into your editor's mcp config.\n */\nimport { runStdio, PACKAGE_VERSION } from './server.js';\n\nfunction printInit() {\n // eslint-disable-next-line no-console\n console.log(\n [\n `# PixelDojo MCP — install snippets`,\n `# Package version: ${PACKAGE_VERSION}`,\n ``,\n `# 1. Set your API key`,\n `# Get one at https://pixeldojo.ai/api-platform/api-keys`,\n `export PIXELDOJO_API_KEY=pd_your_api_key_here`,\n ``,\n `# 2. Add this MCP entry to your editor / agent config:`,\n ``,\n `# ── Claude Code (~/.config/claude-code/mcp.json) ──`,\n `{`,\n ` \"mcpServers\": {`,\n ` \"pixeldojo\": {`,\n ` \"command\": \"npx\",`,\n ` \"args\": [\"-y\", \"@pixeldojo/mcp\"],`,\n ` \"env\": {`,\n ` \"PIXELDOJO_API_KEY\": \"pd_your_api_key_here\"`,\n ` }`,\n ` }`,\n ` }`,\n `}`,\n ``,\n `# ── Cursor (.cursor/mcp.json in your project) ──`,\n `# Same shape as above.`,\n ``,\n `# 3. Restart your agent. You'll see these tools:`,\n `# pixeldojo_generate Any prompt → image or video.`,\n `# pixeldojo_edit Change an image with a text instruction.`,\n `# pixeldojo_character Consistent characters across shots.`,\n `# pixeldojo_storyboard Multi-shot scenes from one brief.`,\n `# pixeldojo_upscale Enhance any image.`,\n `# pixeldojo_audio Voices + effects + music in one clip.`,\n `# pixeldojo_library Search your saved media + generations.`,\n `# pixeldojo_save Keep a result in My Media permanently.`,\n `# pixeldojo_*_workflow Save / run / list multi-step chains.`,\n `# pixeldojo_upload Local file → temp URL for references.`,\n `# pixeldojo_from_url Product URL → structured product info.`,\n `# pixeldojo_campaign* Product URL → full launch pack.`,\n `# pixeldojo_status Poll long-running jobs.`,\n ``,\n ].join('\\n'),\n );\n}\n\nfunction printVersion() {\n // eslint-disable-next-line no-console\n console.log(`@pixeldojo/mcp v${PACKAGE_VERSION}`);\n}\n\nfunction printHelp() {\n // eslint-disable-next-line no-console\n console.log(\n [\n `@pixeldojo/mcp v${PACKAGE_VERSION} — PixelDojo MCP server`,\n ``,\n `Usage:`,\n ` pixeldojo-mcp Start the MCP server over stdio (default).`,\n ` pixeldojo-mcp init Print install snippets for Claude Code / Cursor.`,\n ` pixeldojo-mcp --version Print package version.`,\n ` pixeldojo-mcp --help Show this message.`,\n ``,\n `Auth: set PIXELDOJO_API_KEY in your environment.`,\n `Get a key at https://pixeldojo.ai/api-platform/api-keys`,\n ].join('\\n'),\n );\n}\n\nexport async function main(): Promise<void> {\n const args = process.argv.slice(2);\n const cmd = args[0];\n\n if (cmd === 'init') {\n printInit();\n return;\n }\n if (cmd === '--version' || cmd === '-v') {\n printVersion();\n return;\n }\n if (cmd === '--help' || cmd === '-h') {\n printHelp();\n return;\n }\n if (cmd && !cmd.startsWith('-')) {\n // eslint-disable-next-line no-console\n console.error(`Unknown command \"${cmd}\". Run 'pixeldojo-mcp --help' for usage.`);\n process.exit(2);\n }\n\n const apiKey = process.env.PIXELDOJO_API_KEY;\n if (!apiKey) {\n // eslint-disable-next-line no-console\n console.error(\n [\n '[pixeldojo-mcp] Missing PIXELDOJO_API_KEY environment variable.',\n '',\n ' 1. Get a key: https://pixeldojo.ai/api-platform/api-keys',\n ' 2. Set: export PIXELDOJO_API_KEY=pd_your_api_key_here',\n ' 3. Restart your agent',\n '',\n 'For copy-paste config snippets: pixeldojo-mcp init',\n ].join('\\n'),\n );\n process.exit(1);\n }\n\n await runStdio({\n apiKey,\n baseUrl: process.env.PIXELDOJO_BASE_URL ?? 'https://pixeldojo.ai',\n });\n}\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/status.ts","../src/skills/from-url.ts","../src/skills/film.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/workflows.ts","../src/skills/index.ts","../src/client.ts","../src/server.ts","../src/redact.ts","../src/cli.ts"],"names":["z","buildPayload","run","DEFAULT_MODEL","InputSchema","InputJsonSchema","ALLOWED","extractAssetUrls","basename","findSkill"],"mappings":"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","file":"cli.js","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 /** 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 = { kind: 'text'; text: string };\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 /** 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 { PixelDojoClient } from '@pixeldojo/sdk';\n\nconst MAX_IMAGE_BYTES = 50 * 1024 * 1024;\nconst MAX_VIDEO_BYTES = 200 * 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};\n\nexport class SkillUploadError extends Error {\n constructor(public readonly userMessage: string) {\n super(userMessage);\n this.name = 'SkillUploadError';\n }\n}\n\nexport async function uploadLocalFile(\n path: string,\n client: PixelDojoClient,\n): Promise<string> {\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 limit = isImage ? MAX_IMAGE_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' : '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 client.uploadImage(blob, filename);\n return response.url;\n}\n\nexport async function uploadLocalFiles(\n paths: readonly string[],\n client: PixelDojoClient,\n): Promise<string[]> {\n return Promise.all(paths.map((p) => uploadLocalFile(p, client)));\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 `google-nano-banana` (broad capability,\n * stable output). 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.'),\n model: z\n .string()\n .optional()\n .describe(\n 'Override the model. Any apiId from /api/v1/models (e.g. \"flux\", \"google-nano-banana\", \"veo-3.1-fast\", \"kling-video-v3-standard-text\"). Omit to use the default.',\n ),\n preset: z\n .string()\n .optional()\n .describe(\n 'Preset slug to seed the params (e.g. \"cinematic-portrait\", \"product-floating-clean\", \"magazine-cover-text\"). Browse the catalog at https://pixeldojo.ai/presets. Explicit fields override preset values.',\n ),\n aspect_ratio: z\n .string()\n .optional()\n .describe('Aspect ratio supported by the chosen model (e.g. \"1:1\", \"16:9\", \"9:16\").'),\n duration: z\n .number()\n .int()\n .positive()\n .optional()\n .describe('Video duration in seconds, when applicable.'),\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 image URL for image-to-image / image-to-video tools.'),\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. A clip routes to a model that can actually read one.',\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\nconst DEFAULT_MODEL = 'google-nano-banana';\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. It handles adult inputs too, so there is no spicy\n * fork to make. */\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.' },\n model: {\n type: 'string',\n description:\n 'Override the model. Any apiId from /api/v1/models (e.g. \"flux\", \"google-nano-banana\", \"veo-3.1-fast\", \"kling-video-v3-standard-text\"). Omit to use the default.',\n },\n preset: {\n type: 'string',\n description:\n 'Preset slug to seed the params (e.g. \"cinematic-portrait\", \"product-floating-clean\"). Explicit fields override preset values.',\n },\n aspect_ratio: { type: 'string' },\n duration: { type: 'integer' },\n resolution: {\n type: 'string',\n description:\n 'Output resolution when supported (e.g. \"480p\", \"720p\", \"1080p\", \"4k\"). Lower tiers cost fewer credits.',\n },\n image_url: { type: 'string', format: 'uri' },\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.',\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. Single-reference models use the first.',\n },\n image_paths: {\n type: 'array',\n items: { type: 'string' },\n description:\n 'Multiple absolute local file paths, each uploaded to 24h temp storage and used as a reference.',\n },\n image_path: {\n type: 'string',\n description:\n 'Absolute local file path. The skill uploads it to PixelDojo (24h temp storage) and uses the resulting URL as the reference image. Prefer this over image_url when the user has a local file.',\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.client) : undefined);\n const manyUrls = [...(input.image_urls ?? [])];\n for (const p of input.image_paths ?? []) {\n manyUrls.push(await uploadLocalFile(p, ctx.client));\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 any image or video from a prompt. Auto-routes to a sensible default model; pass `model` to pick a specific apiId from the catalog. For reference flows: pass `image_url` for a still, `video_url` for a source clip, or `image_path` (absolute local path) and the skill uploads it to 24h temp storage automatically. A clip or an audio reference routes to an engine that can read one. Model-specific settings go in `params` alongside an explicit `model`.',\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.' },\n image_url: {\n type: 'string',\n format: 'uri',\n description: 'Single reference image. 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: 'Multiple reference images (1-9).',\n },\n image_path: {\n type: 'string',\n description:\n 'Absolute local file path. Skill uploads it (24h temp storage) and edits the resulting URL. Prefer over image_url when the user has a local file.',\n },\n image_paths: {\n type: 'array',\n items: { type: 'string' },\n minItems: 1,\n maxItems: 9,\n description: 'Multiple absolute local file paths (1-9). Each uploaded before dispatch.',\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: { type: 'string' },\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.client);\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.client);\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 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 'google-nano-banana',\n 'wan-2.7-image-edit',\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 five are array fields. */\nconst FALLBACK_REF_KEY: Record<AllowedModel, string> = {\n 'seedream-5': 'image_urls',\n 'seedream-4': 'image_urls',\n 'google-nano-banana': 'image_input',\n 'wan-2.7-image-edit': 'image_urls',\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' },\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: 'Single reference. Prefer reference_image_urls.',\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 references for this shot, most important first. Multiple angles of the same person lock the face far better than one photo.',\n },\n aspect_ratio: { type: 'string' },\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: 'Storyboard brief: scene, shots, mood, action.',\n },\n model: {\n type: 'string',\n enum: ALLOWED,\n description: `One of: ${ALLOWED.join(', ')}. Defaults to ${DEFAULT_MODEL}.`,\n },\n aspect_ratio: { type: 'string' },\n duration: { type: 'integer' },\n image_url: {\n type: 'string',\n format: 'uri',\n description: 'Reference still to build the shot from.',\n },\n video_url: {\n type: 'string',\n format: 'uri',\n description: 'Source clip to work from. Use this for videos; image_url is for stills.',\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 a video storyboard preview from a single brief. Pass image_url for a reference still or video_url for a source clip. v1: single-shot preview; multi-shot orchestration coming.',\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 .min(0)\n .max(1)\n .optional()\n .describe('Magnific only: 0 (preserve) → 1 (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: { type: 'string', format: 'uri' },\n video_url: {\n type: 'string',\n format: 'uri',\n description: 'Source video clip — routes to video-upscaler.',\n },\n model: { type: 'string', enum: ALLOWED },\n scale_factor: { type: 'number', minimum: 1, maximum: 16 },\n creativity: { type: 'number', minimum: 0, maximum: 1 },\n video_duration: {\n type: 'number',\n description: 'video-upscaler only, required there: source clip length in seconds.',\n },\n target_resolution: { type: 'string', enum: VIDEO_RESOLUTIONS },\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_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: 'Job id returned from a prior pixeldojo_* skill handoff.',\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 the status of a long-running job after a 30s sync handoff. Returns assets when ready, failure reason if failed, or current state if still running.',\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 * Used as the first step of agentic flows like pixeldojo_campaign and\n * (eventually) pixeldojo_ad / pixeldojo_lookbook — removes the\n * 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 product info (name, description, images) from any product page URL. Use this as the first step before pixeldojo_campaign / :ad / :lookbook so the agent has structured product data instead of a free-text description.',\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 3 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 */\nimport { z } from 'zod';\nimport type { SkillContext, SkillModule, SkillResult } from './types.js';\n\nconst LOOKS = ['live-action', 'anime', '3d-animation', 'noir', 'horror', 'sci-fi', 'documentary', 'western', 'romance', 'romantic-comedy', 'comedy'] as const;\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.enum(LOOKS).default('live-action').describe('Visual style carried through frames, clips, and soundtrack.'),\n aspect: z.enum(['16:9', '9:16']).default('16:9'),\n length: z\n .enum(['30s', '60s', '2-3min', '5min'])\n .default('60s')\n .describe('Target length; drives the shot count (~6/12/24/60 shots).'),\n film_id: z.string().max(40).optional().describe('Existing film id (from a previous call) for produce/status.'),\n action: z\n .enum(['plan', 'produce', 'status'])\n .default('plan')\n .describe(\"'plan' creates + storyboards (free). 'produce' starts charged generation. 'status' advances production and reports progress; poll it every ~30s until it returns the finished 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('Internal: pass back the music job id from a previous status reply so the composing score is attached instead of re-charged.'),\n});\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema: Record<string, unknown> = {\n type: 'object',\n properties: {\n idea: { type: 'string', description: 'One-to-three sentence film idea. The studio writes the screenplay (free).' },\n script: { type: 'string', description: 'A full screenplay to plan instead of an idea.' },\n look: { type: 'string', enum: [...LOOKS], description: 'Visual style. Default live-action.' },\n aspect: { type: 'string', enum: ['16:9', '9:16'], description: 'Default 16:9.' },\n length: { type: 'string', enum: ['30s', '60s', '2-3min', '5min'], description: 'Target length (~6/12/24/60 shots). Default 60s.' },\n film_id: { type: 'string', description: 'Existing film id for produce/status.' },\n action: { type: 'string', enum: ['plan', 'produce', 'status'], description: \"plan (free) | produce (charged) | status (poll every ~30s).\" },\n soundtrack: { type: 'string', enum: ['scene-synced', 'flat', 'none'], description: 'Default scene-synced.' },\n music_job_id: { type: 'string', description: 'Pass back from a previous status reply while the score is composing.' },\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 characterIds: string[];\n elementIds: string[];\n engine: string;\n cameraPreset?: string;\n}\ninterface FilmDto {\n id: string;\n title: string;\n status: string;\n look: string;\n aspect: string;\n script?: string;\n exportUrl?: string;\n exportError?: string;\n audioStems: { kind: string; url: 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);\nconst count = (f: FilmDto, pred: (sh: FilmShotDto) => boolean) => shots(f).filter(pred).length;\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\nasync function plan(input: Input, ctx: SkillContext): Promise<SkillResult> {\n if (!input.idea?.trim() && !input.script?.trim()) {\n return { kind: 'text', text: 'Provide an `idea` (we write the script, free) or a full `script` to plan a film.' };\n }\n const created = await filmApi<{ film?: FilmDto; error?: string }>(ctx, 'POST', '/api/films', {\n aspect: input.aspect,\n look: input.look,\n lengthTarget: input.length,\n assetIds: [],\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\n let script = input.script?.trim() ?? '';\n if (!script) {\n const wrote = await filmApi<{ film?: FilmDto; error?: string }>(ctx, 'POST', `/api/films/${id}/script`, { idea: input.idea!.trim() });\n script = wrote.data.film?.script ?? '';\n if (!script) return { kind: 'text', text: `Script writing failed: ${wrote.data.error ?? wrote.status}` };\n }\n const planned = await filmApi<{ film?: FilmDto; error?: string }>(ctx, 'POST', `/api/films/${id}/plan`, { script });\n const film = planned.data.film;\n if (!film) return { kind: 'text', text: `Shot planning failed: ${planned.data.error ?? planned.status}` };\n\n const total = shots(film).length;\n const sceneLines = film.scenes.map((s, i) => ` Scene ${i + 1} \"${s.title}\"${s.location ? ` [${s.location}]` : ''}: ${s.shots.length} shots`);\n return {\n kind: 'text',\n text: [\n `Planned \"${film.title}\" (film_id: ${film.id}) — ${film.scenes.length} scenes, ${total} shots, ${input.look}, ${input.aspect}.`,\n ...sceneLines,\n '',\n `Nothing has been charged yet. Producing renders every shot (roughly 20-25 credits per 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}\n\nasync function produce(filmId: string, ctx: SkillContext): Promise<SkillResult> {\n const { data } = await filmApi<{ film?: FilmDto; error?: string }>(ctx, 'GET', `/api/films/${filmId}`);\n if (!data.film) return { kind: 'text', text: `Film not found: ${data.error ?? filmId}` };\n const pending = shots(data.film).filter((sh) => sh.status === 'idle' || (sh.status === 'failed' && !sh.frameUrl));\n let fired = 0;\n for (const sh of pending.slice(0, 6)) {\n const r = await filmApi(ctx, 'POST', `/api/films/${filmId}/shots/${sh.id}/generate`, { kind: 'frame' });\n if (r.status === 200) fired += 1;\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). Poll pixeldojo_film with {\"film_id\": \"${filmId}\", \"action\": \"status\"} every ~30 seconds — each poll advances the pipeline.`,\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, scene.shots.reduce((n, sh) => n + (sh.durationSec || 0), 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 + (sh.durationSec || 0), 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 { data } = await filmApi<{ film?: FilmDto; error?: string }>(ctx, 'GET', `/api/films/${filmId}?refresh=1`);\n const film = data.film;\n if (!film) return { kind: 'text', text: `Film not found: ${data.error ?? filmId}` };\n const all = shots(film);\n\n // Finished?\n if (film.status === 'exported' && film.exportUrl) {\n return {\n kind: 'text',\n text: `Film finished: \"${film.title}\"\\nWatch/download: ${film.exportUrl}\\nWorkspace: ${ctx.baseUrl}/film-studio/${film.id}\\nIt is saved in the Library folder \"Film: ${film.title}\".`,\n };\n }\n if (film.exportError) {\n return { kind: 'text', text: `Export failed: ${film.exportError} Poll again with action \"status\" to retry.` };\n }\n\n // 1) Frames: dispatch idle, save finished ones.\n const idleFrames = all.filter((sh) => sh.status === 'idle');\n for (const sh of idleFrames.slice(0, 6)) {\n await filmApi(ctx, 'POST', `/api/films/${filmId}/shots/${sh.id}/generate`, { kind: 'frame' });\n }\n const framesDone = all.every((sh) => ['frame-ready', 'clip-generating', 'clip-ready'].includes(sh.status));\n if (framesDone && all.some((sh) => sh.status === 'frame-ready' && 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.\n await filmApi(ctx, 'POST', `/api/films/${filmId}/save`, { kind: 'frame' });\n }\n\n // 2) Clips: keep four in flight; retry audio-check failures once per poll.\n const inFlight = count(film, (sh) => sh.status === 'clip-generating');\n const clipQueue = all.filter((sh) => (sh.status === 'frame-ready' || (sh.status === 'failed' && Boolean(sh.frameUrl))) && framesDone);\n for (const sh of clipQueue.slice(0, Math.max(0, 4 - inFlight))) {\n await filmApi(ctx, 'POST', `/api/films/${filmId}/shots/${sh.id}/generate`, { kind: 'clip' });\n }\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 if (clipsDone) {\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 if (soundtrack !== 'none' && !hasMusic) {\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 await filmApi(ctx, 'POST', `/api/films/${filmId}/export`, {});\n return { kind: 'text', text: `Score attached — export started. Poll again in ~60s with {\"film_id\": \"${filmId}\", \"action\": \"status\"} for the finished film URL.` };\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 { kind: 'text', text: `Score still composing. Poll again in ~20s with {\"film_id\": \"${filmId}\", \"action\": \"status\", \"music_job_id\": \"${musicJobId}\"}.` };\n }\n // Dispatch the score through the public API (same engine as the studio).\n const body = soundtrack === 'scene-synced' ? buildScorePlanBody(film) : buildFlatMusicBody(film, all);\n const dispatch = await ctx.client.run('text-to-music', body as never);\n return { kind: 'text', 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 }\n await filmApi(ctx, 'POST', `/api/films/${filmId}/export`, {});\n return { kind: 'text', text: `All clips ready — export started (${progressLine(film)}). Poll again in ~60s with action \"status\" for the finished film URL.` };\n }\n\n const failed = all.filter((sh) => sh.status === 'failed');\n return {\n kind: 'text',\n text: [\n `In progress: ${progressLine(film)}.`,\n failed.length > 0 ? `${failed.length} shot(s) failed and were re-queued (${failed[0]?.errorMessage?.slice(0, 100) ?? ''}).` : '',\n `Poll again in ~30s with {\"film_id\": \"${filmId}\", \"action\": \"status\"}.`,\n ].filter(Boolean).join('\\n'),\n };\n}\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n const action = input.action === 'plan' && input.film_id ? 'status' : input.action;\n if (action === 'plan') return plan(input, ctx);\n if (!input.film_id) return { kind: 'text', text: 'produce/status need the film_id returned by the plan step.' };\n if (action === 'produce') return produce(input.film_id, 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. Phased: plan is free and returns a cost estimate; produce starts charged generation; status advances production (poll every ~30s).',\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: 'Product page URL. Name, description, and images are extracted automatically.',\n },\n product_name: { type: 'string' },\n product_description: { type: 'string' },\n product_image_urls: { type: 'array', items: { type: 'string', format: 'uri' }, maxItems: 5 },\n product_image_paths: {\n type: 'array',\n items: { type: 'string' },\n maxItems: 5,\n description: 'Absolute local file 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: { type: 'array', items: { type: 'string' }, maxItems: 4 },\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: { type: 'string', format: 'uri' },\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: { type: 'string', enum: ['mini', 'fast', 'high'] },\n resolution: {\n type: 'string',\n enum: ['480p', '720p', '1080p', '4k'],\n description: '1080p/4k require quality \"high\".',\n },\n aspect_ratio: { type: 'string', enum: ['16:9', '4:3', '1:1', '3:4', '9:16', '21:9'] },\n duration: { type: 'integer', minimum: 4, maximum: 15 },\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.client)))),\n ];\n const characterImages = [\n ...(input.character_image_urls ?? []),\n ...(await Promise.all((input.character_image_paths ?? []).map((p) => uploadLocalFile(p, ctx.client)))),\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 any product into a video ad. Pass a product URL (auto-extracted) or product images, pick an ad style (UGC testimonial, unboxing, try-on, showcase, TV spot, and more via GET /api/v1/marketing/presets), optionally add presenter reference images, a location, a hook, and the exact spoken script. Renders with voiceover; returns the video or a statusUrl handoff to poll via pixeldojo_status. Ideal for automated generate-and-post workflows.',\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: 'Product page URL. We extract name + description + images automatically.',\n },\n product: {\n type: 'object',\n properties: {\n name: { type: 'string' },\n description: { type: 'string' },\n images: { type: 'array', items: { type: 'string', format: 'uri' } },\n },\n required: ['name'],\n },\n tone: {\n type: 'string',\n description: 'Creative direction threaded through every prompt.',\n },\n variants: { type: 'integer', minimum: 1, maximum: 8 },\n includeVideo: { type: 'boolean' },\n videoAspectRatio: { type: 'string', enum: ['9:16', '16:9', '1:1'] },\n videoMode: { type: 'string', enum: ['lifestyle', 'cgi', 'ugc', 'skip'] },\n },\n oneOf: [{ required: ['productUrl'] }, { required: ['product'] }],\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}\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 (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) or MP4, WebM, MOV (≤200MB). 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) or MP4, WebM, MOV (≤200MB). 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.client);\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 to :generate or :edit)`,\n };\n}\n\nexport const uploadSkill: SkillModule<Input> = {\n name: 'pixeldojo_upload',\n description:\n 'Upload a local image or video file and get back a public URL you can pass to :generate or :edit as image_url. Use when the user has a reference image on disk (drag-dropped into Claude Code, screenshot, etc.) and you need a URL. Storage auto-expires after 24 hours.',\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 addressed in the\n * prompt as @Audio1..@Audio3; local files go through the upload bridge via\n * audio_paths.\n */\nimport { z } from 'zod';\nimport { pollJobUntilDoneOrHandoff } from '../poll.js';\nimport { SkillUploadError, uploadLocalFiles } from './upload-helpers.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 'A script for speech, or a scene description for cinematic audio (dialogue + effects + music). Reference uploaded clips as @Audio1..@Audio3.',\n ),\n model: z\n .string()\n .optional()\n .describe(`One of: ${ALLOWED.join(', ')}. Defaults to ${DEFAULT_MODEL}.`),\n voice: z\n .string()\n .optional()\n .describe('Optional voice preset name or cloned-voice id (seed-audio) / voice_id (text-to-speech).'),\n audio_urls: z\n .array(z.string().url())\n .max(3)\n .optional()\n .describe('seed-audio only: up to 3 reference audio URLs (30s / 10MB max each).'),\n audio_paths: z\n .array(z.string())\n .max(3)\n .optional()\n .describe('seed-audio only: absolute local paths to reference clips; uploaded automatically (24h temp storage).'),\n output_format: z\n .string()\n .optional()\n .describe('seed-audio: mp3 (default), wav, pcm, ogg_opus. text-to-speech: mp3, wav, flac, pcm.'),\n speed: z.number().min(0.5).max(2).optional().describe('Speech speed multiplier (0.5–2).'),\n});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst InputJsonSchema = {\n type: 'object',\n properties: {\n prompt: { type: 'string' },\n model: { type: 'string', enum: ALLOWED },\n voice: { type: 'string' },\n audio_urls: { type: 'array', items: { type: 'string', format: 'uri' }, maxItems: 3 },\n audio_paths: { type: 'array', items: { type: 'string' }, maxItems: 3 },\n output_format: { type: 'string' },\n speed: { type: 'number', minimum: 0.5, maximum: 2 },\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 let audioUrls = input.audio_urls ?? [];\n if (input.audio_paths?.length) {\n try {\n const uploaded = await uploadLocalFiles(input.audio_paths, ctx.client);\n audioUrls = [...audioUrls, ...uploaded].slice(0, 3);\n } catch (err) {\n if (err instanceof SkillUploadError) {\n return { kind: 'text', text: `pixeldojo_audio (upload): ${err.userMessage}` };\n }\n throw err;\n }\n }\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 TTS available).',\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 :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 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 q: { type: 'string' },\n model: { type: 'string' },\n modality: { type: 'string', enum: ['image', 'video', 'audio'] },\n limit: { type: 'integer', minimum: 1, maximum: 50 },\n },\n required: [],\n} as const;\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\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 :generate, :edit, :character, or :upscale as a reference input.`,\n };\n}\n\nexport const librarySkill: SkillModule<Input> = {\n name: 'pixeldojo_library',\n description:\n 'Search your media library: saved My Media items (permanent) and recent API/MCP generations (expire after 24h), newest first. Returns asset URLs to reuse as reference inputs. Keep a result forever with pixeldojo_save.',\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: the file is\n * re-hosted on PixelDojo's permanent CDN (generation outputs otherwise\n * expire after 24 hours) and becomes searchable via pixeldojo_library.\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' },\n prompt: { type: 'string' },\n tool_name: { type: 'string' },\n modality: { type: 'string', enum: ['image', 'video', 'audio'] },\n job_id: { type: 'string' },\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. Generation outputs otherwise expire after 24 hours — call this when the user wants to keep a result.\",\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\nconst stepJson = {\n type: 'object',\n properties: {\n skill: { type: 'string' },\n args: { type: 'object' },\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: { type: 'string', pattern: '^[a-z0-9][a-z0-9-]{1,40}$' },\n description: { type: 'string' },\n steps: { type: 'array', items: stepJson, minItems: 1, maxItems: 8 },\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' },\n inputs: { type: 'object', additionalProperties: { type: 'string' } },\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 { statusSkill } from './status.js';\nimport { fromUrlSkill } from './from-url.js';\nimport { filmSkill } from './film.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 {\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 audioSkill,\n librarySkill,\n saveSkill,\n saveWorkflowSkill,\n runWorkflowSkill,\n listWorkflowsSkill,\n statusSkill,\n fromUrlSkill,\n uploadSkill,\n adSkill,\n campaignSkill,\n campaignStatusSkill,\n filmSkill,\n] as ReadonlyArray<SkillModule<unknown>>;\n\nexport {\n filmSkill,\n generateSkill,\n editSkill,\n characterSkill,\n storyboardSkill,\n upscaleSkill,\n audioSkill,\n librarySkill,\n saveSkill,\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 * 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 } 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\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 },\n );\n\n // tools/list — advertise every named skill.\n server.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: ALL_SKILLS.map((skill) => ({\n name: skill.name,\n description: skill.description,\n inputSchema: skill.inputJsonSchema,\n })),\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 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 * CLI entry — run by the bin shim at `bin/pixeldojo-mcp.js`.\n *\n * Subcommands:\n * - (default, no args) Run the MCP server over stdio. This is what\n * Claude Code / Cursor / OpenClaw spawn when configured.\n * - `init` Print the MCP host config snippet for Claude Code, Cursor,\n * and a generic shape — copy/paste into your editor's mcp config.\n */\nimport { runStdio, PACKAGE_VERSION } from './server.js';\n\nfunction printInit() {\n // eslint-disable-next-line no-console\n console.log(\n [\n `# PixelDojo MCP — install snippets`,\n `# Package version: ${PACKAGE_VERSION}`,\n ``,\n `# 1. Set your API key`,\n `# Get one at https://pixeldojo.ai/api-platform/api-keys`,\n `export PIXELDOJO_API_KEY=pd_your_api_key_here`,\n ``,\n `# 2. Add this MCP entry to your editor / agent config:`,\n ``,\n `# ── Claude Code (~/.config/claude-code/mcp.json) ──`,\n `{`,\n ` \"mcpServers\": {`,\n ` \"pixeldojo\": {`,\n ` \"command\": \"npx\",`,\n ` \"args\": [\"-y\", \"@pixeldojo/mcp\"],`,\n ` \"env\": {`,\n ` \"PIXELDOJO_API_KEY\": \"pd_your_api_key_here\"`,\n ` }`,\n ` }`,\n ` }`,\n `}`,\n ``,\n `# ── Cursor (.cursor/mcp.json in your project) ──`,\n `# Same shape as above.`,\n ``,\n `# 3. Restart your agent. You'll see these tools:`,\n `# pixeldojo_generate Any prompt → image or video.`,\n `# pixeldojo_edit Change an image with a text instruction.`,\n `# pixeldojo_character Consistent characters across shots.`,\n `# pixeldojo_storyboard Multi-shot scenes from one brief.`,\n `# pixeldojo_upscale Enhance any image or video.`,\n `# pixeldojo_audio Voices + effects + music in one clip.`,\n `# pixeldojo_library Search your saved media + generations.`,\n `# pixeldojo_save Keep a result in My Media permanently.`,\n `# pixeldojo_*_workflow Save / run / list multi-step chains.`,\n `# pixeldojo_upload Local file → temp URL for references.`,\n `# pixeldojo_from_url Product URL → structured product info.`,\n `# pixeldojo_campaign* Product URL → full launch pack.`,\n `# pixeldojo_status Poll long-running jobs.`,\n ``,\n ].join('\\n'),\n );\n}\n\nfunction printVersion() {\n // eslint-disable-next-line no-console\n console.log(`@pixeldojo/mcp v${PACKAGE_VERSION}`);\n}\n\nfunction printHelp() {\n // eslint-disable-next-line no-console\n console.log(\n [\n `@pixeldojo/mcp v${PACKAGE_VERSION} — PixelDojo MCP server`,\n ``,\n `Usage:`,\n ` pixeldojo-mcp Start the MCP server over stdio (default).`,\n ` pixeldojo-mcp init Print install snippets for Claude Code / Cursor.`,\n ` pixeldojo-mcp --version Print package version.`,\n ` pixeldojo-mcp --help Show this message.`,\n ``,\n `Auth: set PIXELDOJO_API_KEY in your environment.`,\n `Get a key at https://pixeldojo.ai/api-platform/api-keys`,\n ].join('\\n'),\n );\n}\n\nexport async function main(): Promise<void> {\n const args = process.argv.slice(2);\n const cmd = args[0];\n\n if (cmd === 'init') {\n printInit();\n return;\n }\n if (cmd === '--version' || cmd === '-v') {\n printVersion();\n return;\n }\n if (cmd === '--help' || cmd === '-h') {\n printHelp();\n return;\n }\n if (cmd && !cmd.startsWith('-')) {\n // eslint-disable-next-line no-console\n console.error(`Unknown command \"${cmd}\". Run 'pixeldojo-mcp --help' for usage.`);\n process.exit(2);\n }\n\n const apiKey = process.env.PIXELDOJO_API_KEY;\n if (!apiKey) {\n // eslint-disable-next-line no-console\n console.error(\n [\n '[pixeldojo-mcp] Missing PIXELDOJO_API_KEY environment variable.',\n '',\n ' 1. Get a key: https://pixeldojo.ai/api-platform/api-keys',\n ' 2. Set: export PIXELDOJO_API_KEY=pd_your_api_key_here',\n ' 3. Restart your agent',\n '',\n 'For copy-paste config snippets: pixeldojo-mcp init',\n ].join('\\n'),\n );\n process.exit(1);\n }\n\n await runStdio({\n apiKey,\n baseUrl: process.env.PIXELDOJO_BASE_URL ?? 'https://pixeldojo.ai',\n });\n}\n"]}