@pixeldojo/mcp 0.5.0 → 0.5.1

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.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/poll.ts","../src/skills/types.ts","../src/skills/upload-helpers.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/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":["path","extname","stat","basename","readFile","z","buildPayload","run","DEFAULT_MODEL","InputSchema","InputJsonSchema","ALLOWED","extractAssetUrls","findSkill","PixelDojoClient","Server","ListToolsRequestSchema","CallToolRequestSchema","StdioServerTransport"],"mappings":"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","file":"cli.cjs","sourcesContent":["/**\n * Exponential-backoff job poller with a 30-second sync window.\n *\n * Per CEO D9 + D14 + Eng E4:\n * - Up to 30 seconds: poll the job synchronously, return assets when complete.\n * - Beyond 30 seconds: hand off — return `{ jobId, statusUrl }` and let the\n * calling LLM follow up via the `pixeldojo:status` tool.\n * - Backoff sequence: 1s → 2s → 4s → 8s → 8s → 8s ... capped at 8s.\n * Halves load on /api/v1/jobs/{id} vs a flat 2s interval.\n *\n * Job-fetcher and clock are dependency-injected so the unit tests can\n * exercise every branch without spinning a real HTTP fetcher or sleeping\n * for real wall-clock time.\n */\n\nexport interface PollableJob {\n jobId: string;\n status: 'pending' | 'queued' | 'processing' | 'completed' | 'failed' | string;\n assets?: Array<{ url: string; type?: string }>;\n output?: unknown;\n /** Provider-side error if the job failed. */\n error?: { code?: string; message?: string } | string;\n}\n\nexport interface PollOptions {\n /** Hard cap on the synchronous wait window. Default: 30_000 ms (per D9). */\n syncBudgetMs?: number;\n /** Override the backoff sequence. Default: [1000, 2000, 4000, 8000]. */\n backoffSequenceMs?: number[];\n /** Cap on the recurring delay once the sequence is exhausted. */\n maxIntervalMs?: number;\n /** Inject a clock for tests. Defaults to `Date.now`. */\n now?: () => number;\n /** Inject a sleeper for tests. Defaults to setTimeout-based wait. */\n sleep?: (ms: number) => Promise<void>;\n /** Optional abort signal — caller can cancel a poll mid-flight. */\n signal?: AbortSignal;\n}\n\nexport type PollResult =\n | { kind: 'completed'; job: PollableJob }\n | { kind: 'failed'; job: PollableJob }\n | { kind: 'handoff'; jobId: string; statusUrl: string };\n\nconst DEFAULT_BACKOFF = [1000, 2000, 4000, 8000];\nconst DEFAULT_MAX_INTERVAL = 8000;\nconst DEFAULT_SYNC_BUDGET_MS = 30_000;\n\nfunction defaultSleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new DOMException('aborted', 'AbortError'));\n return;\n }\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(timer);\n reject(new DOMException('aborted', 'AbortError'));\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n\n/**\n * Poll a job to terminal state OR until the sync budget is exhausted.\n * `fetchJob` returns the latest job snapshot; the poller decides when to\n * call it next.\n */\nexport async function pollJobUntilDoneOrHandoff(\n jobId: string,\n fetchJob: (id: string) => Promise<PollableJob>,\n buildStatusUrl: (id: string) => string,\n options: PollOptions = {},\n): Promise<PollResult> {\n const {\n syncBudgetMs = DEFAULT_SYNC_BUDGET_MS,\n backoffSequenceMs = DEFAULT_BACKOFF,\n maxIntervalMs = DEFAULT_MAX_INTERVAL,\n now = Date.now,\n sleep = (ms) => defaultSleep(ms, options.signal),\n signal,\n } = options;\n\n const start = now();\n let attempt = 0;\n\n while (true) {\n if (signal?.aborted) throw new DOMException('aborted', 'AbortError');\n\n const job = await fetchJob(jobId);\n\n if (job.status === 'completed') return { kind: 'completed', job };\n if (job.status === 'failed') return { kind: 'failed', job };\n\n const elapsed = now() - start;\n const remaining = syncBudgetMs - elapsed;\n if (remaining <= 0) {\n return {\n kind: 'handoff',\n jobId,\n statusUrl: buildStatusUrl(jobId),\n };\n }\n\n const interval =\n attempt < backoffSequenceMs.length ? backoffSequenceMs[attempt] : maxIntervalMs;\n // Don't sleep past the sync deadline — clamp the wait so the next\n // iteration immediately enters the \"remaining <= 0\" branch.\n const wait = Math.min(interval, Math.max(remaining, 0));\n if (wait > 0) await sleep(wait);\n attempt++;\n }\n}\n","/**\n * Shared types for MCP skill modules.\n *\n * Every named skill (pixeldojo:generate, :character, :storyboard, :upscale,\n * :status) exports an object that satisfies `SkillModule`. The server\n * registers them via `registerSkills` in `../server.ts`.\n */\nimport type { z } from 'zod';\nimport type { PixelDojoClient } from '@pixeldojo/sdk';\nimport type { PollResult } from '../poll.js';\n\nexport interface SkillContext {\n /** Header-injected SDK client. Each call has source + skill tag. */\n client: PixelDojoClient;\n /** 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 * 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';\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\", \"kling-video\"). 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 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});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst DEFAULT_MODEL = 'google-nano-banana';\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\", \"kling-video\"). 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 image_url: { type: 'string', format: 'uri' },\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. Most image/I2V models use `image_url` + `duration`,\n * but video-edit / video-extend tools use `video_url` + `video_duration` and\n * the schema rejects the wrong shape. Map per-model so agents calling with\n * generic { image_url, duration } reach the right backend fields.\n */\nfunction buildPayload(\n apiId: string,\n input: Input,\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) body.image_url = input.image_url;\n if (input.duration !== undefined) body.duration = input.duration;\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 if (!input.image_url && input.image_path) {\n try {\n const uploadedUrl = await uploadLocalFile(input.image_path, ctx.client);\n resolved = { ...input, image_url: uploadedUrl };\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\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 const body = buildPayload(apiId, resolved);\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';\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/** Per-model payload shaping. The user gives us {prompt, image_url(s), aspect_ratio}; we\n * emit what the model's schema actually wants. Keep simple and explicit. */\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 case 'xai-image-edit':\n case 'gpt-image-2-edit':\n return {\n prompt: input.prompt,\n image_url: urls[0],\n ...(urls.length > 1 ? { image_urls: urls } : {}),\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\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 const body = buildPayload(apiId, resolved);\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. Asset: ${urls[0]}`\n : `Edit produced ${urls.length} assets. 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: ideogram-character (default), flux-edit (kontext-style\n * editing), gpt-image-2-edit. User can override `model` but it MUST be in\n * the whitelist; otherwise the skill returns an UnknownModelError with the\n * allowed list (per CEO D5).\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 = ['ideogram-character', 'flux-edit', 'gpt-image-2-edit'] as const;\ntype AllowedModel = (typeof ALLOWED)[number];\nconst DEFAULT_MODEL: AllowedModel = 'ideogram-character';\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 ideogram-character.',\n ),\n aspect_ratio: z.string().optional(),\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 // flux-edit and gpt-image-2-edit are edit-style models — they always need a\n // source image. Without this gate the request reaches the backend and gets\n // rejected as `input_image_1: Input image is required`, which loops agents\n // that retry without realizing the input was the issue. ideogram-character\n // can generate from a prompt alone, so it stays optional there.\n if ((apiId === 'flux-edit' || apiId === 'gpt-image-2-edit') && !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=\"ideogram-character\".`,\n };\n }\n\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.reference_image_url) {\n // The two edit-style models expect `image_url`; ideogram-character\n // accepts either. Pass through under both shapes for forward-compat.\n body.image_url = input.reference_image_url;\n body.reference_image_url = input.reference_image_url;\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 : `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 edit-style models.',\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 (default), kling-video, seedance-2.\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 = ['veo-3.1', 'kling-video', 'seedance-2'] as const;\ntype AllowedModel = (typeof ALLOWED)[number];\nconst DEFAULT_MODEL: AllowedModel = 'veo-3.1';\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 body: { prompt: string; [key: string]: unknown } = { prompt: input.brief };\n if (input.aspect_ratio) body.aspect_ratio = input.aspect_ratio;\n if (input.duration !== undefined) body.duration = input.duration;\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 takes an image_url; magnific accepts a scale_factor\n * (1, 2, 4) — pass 2 by default.\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 .int()\n .min(1)\n .max(4)\n .optional()\n .describe('Magnific only: 1, 2, or 4. Defaults to 2.'),\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: 'integer', minimum: 1, maximum: 4 },\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. The server-side schema for these tools doesn't\n // require prompt — Zod ignores unknown/empty extras at the boundary.\n const body: { prompt: string; [key: string]: unknown } = {\n prompt: '',\n image_url: input.image_url,\n };\n if (apiId === 'magnific-upscaler') {\n body.scale_factor = input.scale_factor ?? 2;\n if (input.creativity !== undefined) body.creativity = input.creativity;\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: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 {\n type SkillContext,\n type SkillModule,\n type SkillResult,\n} from './types.js';\n\nconst StepSchema = z.object({\n skill: z\n .string()\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 const result = await skill.run(parsed.data, ctx);\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 {\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 { 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 campaignSkill,\n campaignStatusSkill,\n] as ReadonlyArray<SkillModule<unknown>>;\n\nexport {\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 campaignSkill,\n campaignStatusSkill,\n};\nexport type { SkillModule, SkillContext, SkillResult } from './types.js';\n\nexport function findSkill(name: string): SkillModule<unknown> | undefined {\n return ALL_SKILLS.find((s) => s.name === name);\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\nexport const PACKAGE_VERSION = '0.1.0';\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 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/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/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":["path","extname","stat","basename","readFile","z","buildPayload","run","DEFAULT_MODEL","InputSchema","InputJsonSchema","ALLOWED","extractAssetUrls","findSkill","PixelDojoClient","Server","ListToolsRequestSchema","CallToolRequestSchema","StdioServerTransport"],"mappings":"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","file":"cli.cjs","sourcesContent":["/**\n * Exponential-backoff job poller with a 30-second sync window.\n *\n * Per CEO D9 + D14 + Eng E4:\n * - Up to 30 seconds: poll the job synchronously, return assets when complete.\n * - Beyond 30 seconds: hand off — return `{ jobId, statusUrl }` and let the\n * calling LLM follow up via the `pixeldojo:status` tool.\n * - Backoff sequence: 1s → 2s → 4s → 8s → 8s → 8s ... capped at 8s.\n * Halves load on /api/v1/jobs/{id} vs a flat 2s interval.\n *\n * Job-fetcher and clock are dependency-injected so the unit tests can\n * exercise every branch without spinning a real HTTP fetcher or sleeping\n * for real wall-clock time.\n */\n\nexport interface PollableJob {\n jobId: string;\n status: 'pending' | 'queued' | 'processing' | 'completed' | 'failed' | string;\n assets?: Array<{ url: string; type?: string }>;\n output?: unknown;\n /** Provider-side error if the job failed. */\n error?: { code?: string; message?: string } | string;\n}\n\nexport interface PollOptions {\n /** Hard cap on the synchronous wait window. Default: 30_000 ms (per D9). */\n syncBudgetMs?: number;\n /** Override the backoff sequence. Default: [1000, 2000, 4000, 8000]. */\n backoffSequenceMs?: number[];\n /** Cap on the recurring delay once the sequence is exhausted. */\n maxIntervalMs?: number;\n /** Inject a clock for tests. Defaults to `Date.now`. */\n now?: () => number;\n /** Inject a sleeper for tests. Defaults to setTimeout-based wait. */\n sleep?: (ms: number) => Promise<void>;\n /** Optional abort signal — caller can cancel a poll mid-flight. */\n signal?: AbortSignal;\n}\n\nexport type PollResult =\n | { kind: 'completed'; job: PollableJob }\n | { kind: 'failed'; job: PollableJob }\n | { kind: 'handoff'; jobId: string; statusUrl: string };\n\nconst DEFAULT_BACKOFF = [1000, 2000, 4000, 8000];\nconst DEFAULT_MAX_INTERVAL = 8000;\nconst DEFAULT_SYNC_BUDGET_MS = 30_000;\n\nfunction defaultSleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new DOMException('aborted', 'AbortError'));\n return;\n }\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(timer);\n reject(new DOMException('aborted', 'AbortError'));\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n\n/**\n * Poll a job to terminal state OR until the sync budget is exhausted.\n * `fetchJob` returns the latest job snapshot; the poller decides when to\n * call it next.\n */\nexport async function pollJobUntilDoneOrHandoff(\n jobId: string,\n fetchJob: (id: string) => Promise<PollableJob>,\n buildStatusUrl: (id: string) => string,\n options: PollOptions = {},\n): Promise<PollResult> {\n const {\n syncBudgetMs = DEFAULT_SYNC_BUDGET_MS,\n backoffSequenceMs = DEFAULT_BACKOFF,\n maxIntervalMs = DEFAULT_MAX_INTERVAL,\n now = Date.now,\n sleep = (ms) => defaultSleep(ms, options.signal),\n signal,\n } = options;\n\n const start = now();\n let attempt = 0;\n\n while (true) {\n if (signal?.aborted) throw new DOMException('aborted', 'AbortError');\n\n const job = await fetchJob(jobId);\n\n if (job.status === 'completed') return { kind: 'completed', job };\n if (job.status === 'failed') return { kind: 'failed', job };\n\n const elapsed = now() - start;\n const remaining = syncBudgetMs - elapsed;\n if (remaining <= 0) {\n return {\n kind: 'handoff',\n jobId,\n statusUrl: buildStatusUrl(jobId),\n };\n }\n\n const interval =\n attempt < backoffSequenceMs.length ? backoffSequenceMs[attempt] : maxIntervalMs;\n // Don't sleep past the sync deadline — clamp the wait so the next\n // iteration immediately enters the \"remaining <= 0\" branch.\n const wait = Math.min(interval, Math.max(remaining, 0));\n if (wait > 0) await sleep(wait);\n attempt++;\n }\n}\n","/**\n * Shared types for MCP skill modules.\n *\n * Every named skill (pixeldojo:generate, :character, :storyboard, :upscale,\n * :status) exports an object that satisfies `SkillModule`. The server\n * registers them via `registerSkills` in `../server.ts`.\n */\nimport type { z } from 'zod';\nimport type { PixelDojoClient } from '@pixeldojo/sdk';\nimport type { PollResult } from '../poll.js';\n\nexport interface SkillContext {\n /** Header-injected SDK client. Each call has source + skill tag. */\n client: PixelDojoClient;\n /** 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 * 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';\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\", \"kling-video\"). 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 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});\n\ntype Input = z.infer<typeof InputSchema>;\n\nconst DEFAULT_MODEL = 'google-nano-banana';\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\", \"kling-video\"). 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 image_url: { type: 'string', format: 'uri' },\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. Most image/I2V models use `image_url` + `duration`,\n * but video-edit / video-extend tools use `video_url` + `video_duration` and\n * the schema rejects the wrong shape. Map per-model so agents calling with\n * generic { image_url, duration } reach the right backend fields.\n */\nfunction buildPayload(\n apiId: string,\n input: Input,\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) body.image_url = input.image_url;\n if (input.duration !== undefined) body.duration = input.duration;\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 if (!input.image_url && input.image_path) {\n try {\n const uploadedUrl = await uploadLocalFile(input.image_path, ctx.client);\n resolved = { ...input, image_url: uploadedUrl };\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\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 const body = buildPayload(apiId, resolved);\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';\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/** Per-model payload shaping. The user gives us {prompt, image_url(s), aspect_ratio}; we\n * emit what the model's schema actually wants. Keep simple and explicit. */\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 case 'xai-image-edit':\n case 'gpt-image-2-edit':\n return {\n prompt: input.prompt,\n image_url: urls[0],\n ...(urls.length > 1 ? { image_urls: urls } : {}),\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\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 const body = buildPayload(apiId, resolved);\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. Asset: ${urls[0]}`\n : `Edit produced ${urls.length} assets. 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: ideogram-character (default), flux-edit (kontext-style\n * editing), gpt-image-2-edit. User can override `model` but it MUST be in\n * the whitelist; otherwise the skill returns an UnknownModelError with the\n * allowed list (per CEO D5).\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 = ['ideogram-character', 'flux-edit', 'gpt-image-2-edit'] as const;\ntype AllowedModel = (typeof ALLOWED)[number];\nconst DEFAULT_MODEL: AllowedModel = 'ideogram-character';\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 ideogram-character.',\n ),\n aspect_ratio: z.string().optional(),\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 // flux-edit and gpt-image-2-edit are edit-style models — they always need a\n // source image. Without this gate the request reaches the backend and gets\n // rejected as `input_image_1: Input image is required`, which loops agents\n // that retry without realizing the input was the issue. ideogram-character\n // can generate from a prompt alone, so it stays optional there.\n if ((apiId === 'flux-edit' || apiId === 'gpt-image-2-edit') && !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=\"ideogram-character\".`,\n };\n }\n\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.reference_image_url) {\n // The two edit-style models expect `image_url`; ideogram-character\n // accepts either. Pass through under both shapes for forward-compat.\n body.image_url = input.reference_image_url;\n body.reference_image_url = input.reference_image_url;\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 : `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 edit-style models.',\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 (default), kling-video, seedance-2.\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 = ['veo-3.1', 'kling-video', 'seedance-2'] as const;\ntype AllowedModel = (typeof ALLOWED)[number];\nconst DEFAULT_MODEL: AllowedModel = 'veo-3.1';\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 body: { prompt: string; [key: string]: unknown } = { prompt: input.brief };\n if (input.aspect_ratio) body.aspect_ratio = input.aspect_ratio;\n if (input.duration !== undefined) body.duration = input.duration;\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 takes an image_url; magnific accepts a scale_factor\n * (1, 2, 4) — pass 2 by default.\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 .int()\n .min(1)\n .max(4)\n .optional()\n .describe('Magnific only: 1, 2, or 4. Defaults to 2.'),\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: 'integer', minimum: 1, maximum: 4 },\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. The server-side schema for these tools doesn't\n // require prompt — Zod ignores unknown/empty extras at the boundary.\n const body: { prompt: string; [key: string]: unknown } = {\n prompt: '',\n image_url: input.image_url,\n };\n if (apiId === 'magnific-upscaler') {\n body.scale_factor = input.scale_factor ?? 2;\n if (input.creativity !== undefined) body.creativity = input.creativity;\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: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 {\n type SkillContext,\n type SkillModule,\n type SkillResult,\n} from './types.js';\n\nconst StepSchema = z.object({\n skill: z\n .string()\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 const result = await skill.run(parsed.data, ctx);\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 {\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 { 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 campaignSkill,\n campaignStatusSkill,\n] as ReadonlyArray<SkillModule<unknown>>;\n\nexport {\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 campaignSkill,\n campaignStatusSkill,\n};\nexport type { SkillModule, SkillContext, SkillResult } from './types.js';\n\nexport function findSkill(name: string): SkillModule<unknown> | undefined {\n return ALL_SKILLS.find((s) => s.name === name);\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 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"]}