@pixeldojo/mcp 0.1.0 → 0.1.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.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts","../src/poll.ts","../src/skills/types.ts","../src/skills/generate.ts","../src/skills/character.ts","../src/skills/storyboard.ts","../src/skills/upscale.ts","../src/skills/status.ts","../src/skills/index.ts","../src/redact.ts","../src/server.ts","../src/cli.ts"],"names":["DEFAULT_MODEL","InputSchema","z","InputJsonSchema","run","ALLOWED","extractAssetUrls"],"mappings":"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","file":"cli.js","sourcesContent":["/**\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 * 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 * 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';\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 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});\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 aspect_ratio: { type: 'string' },\n duration: { type: 'integer' },\n image_url: { type: 'string', format: 'uri' },\n },\n required: ['prompt'],\n} as const;\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n const apiId = input.model ?? DEFAULT_MODEL;\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.duration !== undefined) body.duration = input.duration;\n if (input.image_url) body.image_url = input.image_url;\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.',\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n allowedModels: null,\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 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\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 return {\n kind: 'handoff',\n text:\n `Job ${input.jobId} is still ${job.status}. ` +\n `Try again in a few seconds, or follow ${ctx.buildStatusUrl(input.jobId)}.`,\n jobId: input.jobId,\n statusUrl: ctx.buildStatusUrl(input.jobId),\n };\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 * 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 { characterSkill } from './character.js';\nimport { storyboardSkill } from './storyboard.js';\nimport { upscaleSkill } from './upscale.js';\nimport { statusSkill } from './status.js';\nimport type { SkillModule } from './types.js';\n\nexport const ALL_SKILLS: ReadonlyArray<SkillModule<unknown>> = [\n generateSkill,\n characterSkill,\n storyboardSkill,\n upscaleSkill,\n statusSkill,\n] as ReadonlyArray<SkillModule<unknown>>;\n\nexport { generateSkill, characterSkill, storyboardSkill, upscaleSkill, statusSkill };\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 * 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 * 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 */\nfunction 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 */\nfunction 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 * 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:character Consistent characters across shots.`,\n `# pixeldojo:storyboard Multi-shot scenes from one brief.`,\n `# pixeldojo:upscale Enhance any image.`,\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/client.ts","../src/poll.ts","../src/skills/types.ts","../src/skills/generate.ts","../src/skills/character.ts","../src/skills/storyboard.ts","../src/skills/upscale.ts","../src/skills/status.ts","../src/skills/index.ts","../src/redact.ts","../src/server.ts","../src/cli.ts"],"names":["DEFAULT_MODEL","InputSchema","z","InputJsonSchema","run","ALLOWED","extractAssetUrls"],"mappings":"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","file":"cli.js","sourcesContent":["/**\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 * 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 * 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';\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 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});\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 aspect_ratio: { type: 'string' },\n duration: { type: 'integer' },\n image_url: { type: 'string', format: 'uri' },\n },\n required: ['prompt'],\n} as const;\n\nasync function run(input: Input, ctx: SkillContext): Promise<SkillResult> {\n const apiId = input.model ?? DEFAULT_MODEL;\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.duration !== undefined) body.duration = input.duration;\n if (input.image_url) body.image_url = input.image_url;\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.',\n inputZod: InputSchema,\n inputJsonSchema: InputJsonSchema,\n allowedModels: null,\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 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 * 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 { characterSkill } from './character.js';\nimport { storyboardSkill } from './storyboard.js';\nimport { upscaleSkill } from './upscale.js';\nimport { statusSkill } from './status.js';\nimport type { SkillModule } from './types.js';\n\nexport const ALL_SKILLS: ReadonlyArray<SkillModule<unknown>> = [\n generateSkill,\n characterSkill,\n storyboardSkill,\n upscaleSkill,\n statusSkill,\n] as ReadonlyArray<SkillModule<unknown>>;\n\nexport { generateSkill, characterSkill, storyboardSkill, upscaleSkill, statusSkill };\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 * 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 * 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 */\nfunction 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 */\nfunction 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 * 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:character Consistent characters across shots.`,\n `# pixeldojo:storyboard Multi-shot scenes from one brief.`,\n `# pixeldojo:upscale Enhance any image.`,\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"]}
package/dist/index.cjs CHANGED
@@ -360,6 +360,8 @@ var InputJsonSchema5 = {
360
360
  },
361
361
  required: ["jobId"]
362
362
  };
363
+ var STUCK_HINT_MS = 5 * 60 * 1e3;
364
+ var ABANDON_HINT_MS = 12 * 60 * 1e3;
363
365
  async function run5(input, ctx) {
364
366
  const job = await ctx.client.getJob(input.jobId);
365
367
  if (job.status === "completed") {
@@ -377,13 +379,44 @@ async function run5(input, ctx) {
377
379
  text: `Job ${input.jobId} failed: ${errMsg}`
378
380
  };
379
381
  }
382
+ const apiId = job.apiId ?? "unknown";
383
+ const ageMs = jobAgeMs(job);
384
+ const ageLabel = formatAge(ageMs);
385
+ let hint;
386
+ if (ageMs >= ABANDON_HINT_MS) {
387
+ hint = `That's well past the typical generation window for any model on PixelDojo. The job is almost certainly stuck. Submit a fresh request, or open ${ctx.buildStatusUrl(input.jobId)} for the raw record.`;
388
+ } else if (ageMs >= STUCK_HINT_MS) {
389
+ hint = `That's longer than most generations should take. Poll once more, or submit a fresh request if the next check still says ${job.status}.`;
390
+ } else {
391
+ hint = `Try again in a few seconds, or follow ${ctx.buildStatusUrl(input.jobId)}.`;
392
+ }
380
393
  return {
381
394
  kind: "handoff",
382
- text: `Job ${input.jobId} is still ${job.status}. Try again in a few seconds, or follow ${ctx.buildStatusUrl(input.jobId)}.`,
395
+ text: `Job ${input.jobId} (${apiId}) is ${job.status} after ${ageLabel}. ${hint}`,
383
396
  jobId: input.jobId,
384
397
  statusUrl: ctx.buildStatusUrl(input.jobId)
385
398
  };
386
399
  }
400
+ function jobAgeMs(job) {
401
+ const createdAt = job.createdAt;
402
+ if (!createdAt) return 0;
403
+ const t = Date.parse(createdAt);
404
+ if (Number.isNaN(t)) return 0;
405
+ const age = Date.now() - t;
406
+ return age >= 0 ? age : 0;
407
+ }
408
+ function formatAge(ms) {
409
+ if (ms < 6e4) return `${Math.max(1, Math.round(ms / 1e3))}s`;
410
+ const totalSeconds = Math.round(ms / 1e3);
411
+ const minutes = Math.floor(totalSeconds / 60);
412
+ const seconds = totalSeconds % 60;
413
+ if (minutes < 60) {
414
+ return seconds === 0 ? `${minutes}m` : `${minutes}m ${seconds}s`;
415
+ }
416
+ const hours = Math.floor(minutes / 60);
417
+ const remMinutes = minutes % 60;
418
+ return remMinutes === 0 ? `${hours}h` : `${hours}h ${remMinutes}m`;
419
+ }
387
420
  function extractAssetUrls2(job) {
388
421
  if (job.assets && job.assets.length > 0) return job.assets.map((a) => a.url);
389
422
  const output = job.output;