@mediaruntime/cli 1.3.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/README.md +14 -1
- package/dist/cli.js +184 -8
- package/dist/cli.js.map +1 -1
- package/docs/CLI_SDD.md +13 -0
- package/docs/clipping.md +113 -0
- package/package.json +3 -3
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/errors.ts","../src/auth/api.ts","../src/commands/auth.ts","../src/auth/browser.ts","../src/auth/credential-store.ts","../src/commands/capabilities.ts","../src/commands/jobs.ts","../src/commands/run.ts","../src/commands/recipes.ts","../src/commands/stickers.ts","../src/commands/trigger.ts","../src/trigger/destination.ts","../src/trigger/event.ts","../src/trigger/signature.ts","../src/ui/activity.ts"],"sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport { constants, realpathSync } from \"node:fs\";\nimport {\n access,\n link,\n rename,\n rm,\n} from \"node:fs/promises\";\nimport { createWriteStream } from \"node:fs\";\nimport { basename, dirname, resolve } from \"node:path\";\nimport { Readable, Transform } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport type { ReadableStream as NodeReadableStream } from \"node:stream/web\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n JobWaitTimeoutError,\n MediaRuntime,\n MediaRuntimeApiError,\n MediaRuntimeConnectionError,\n} from \"@mediaruntime/node\";\nimport * as MediaRuntimeSdk from \"@mediaruntime/node\";\nimport { PRODUCTION_ORIGIN } from \"./auth/api.js\";\nimport type { CredentialStore } from \"./auth/credential-store.js\";\nimport {\n resolveCredential,\n runAuthCommand,\n runLoginCommand,\n runLogoutCommand,\n type AuthCommandDependencies,\n} from \"./commands/auth.js\";\nimport {\n runCapabilitiesCommand,\n runPresetsCommand,\n type CapabilitiesReadClient,\n} from \"./commands/capabilities.js\";\nimport {\n runJobsCommand,\n type JobsReadClient,\n} from \"./commands/jobs.js\";\nimport {\n runCommand,\n type RunJobsClient,\n} from \"./commands/run.js\";\nimport { runRecipesCommand, type RecipesClient } from \"./commands/recipes.js\";\nimport {\n isScopedStickerRuntimeCommand,\n runStickersCommand,\n stickerCollectionOption,\n type HostedStickersCommandClient,\n type StickerRuntimeReadClient,\n} from \"./commands/stickers.js\";\nimport { runTriggerCommand } from \"./commands/trigger.js\";\nimport { BundleDownloadError, CliError, UsageError } from \"./errors.js\";\nimport { isLoopbackDestination } from \"./trigger/destination.js\";\nimport { createActivityIndicator } from \"./ui/activity.js\";\n\nexport { parseTriggerArguments, runTriggerCommand } from \"./commands/trigger.js\";\nexport { createSyntheticTerminalEvent } from \"./trigger/event.js\";\nexport { signSyntheticWebhook } from \"./trigger/signature.js\";\nexport {\n resolveCredential,\n runAuthCommand,\n runAuthStatusCommand,\n runLoginCommand,\n runLogoutCommand,\n} from \"./commands/auth.js\";\n\nconst VERSION = \"1.2.0\";\nconst HELP = `MediaRuntime CLI\n\nUsage:\n mediaruntime run <source> (--recipe <name[@version]> | --output <alias> | --preset <name>) [...] [--wait]\n Animation presets: [--animation-width N] [--animation-fps N] [--animation-start SEC]\n [--animation-duration SEC] [--animation-loop N] [--animation-quality N]\n Placeholder preset: [--placeholder-max-dimension N] [--placeholder-time SEC]\n [--lqip-quality N] [--lqip-max-bytes N]\n Contact-sheet preset: [--contact-columns N] [--contact-rows N]\n [--contact-tile-width N] [--contact-tile-height N] [--contact-interval SEC]\n [--contact-start SEC] [--contact-duration SEC] [--contact-max-sheets N]\n [--contact-format jpg|png|webp] [--contact-quality N]\n [--image-width PX] [--image-height PX] [--image-mode fit|fill|cover|contain]\n [--image-format jpg|png|webp|avif] [--image-quality N]\n [--image-max-bytes N] [--image-min-quality N]\n Audiogram preset: --audiogram-artwork <source> [--audiogram-captions <source>]\n [--audiogram-layout square|portrait|landscape]\n [--audiogram-fit contain|cover|blurred_background]\n [--audiogram-background #RRGGBB] [--audiogram-waveform #RRGGBB]\n [--audiogram-waveform-gain 0.5..4]\n [--audiogram-caption-position top|bottom] [--audiogram-caption-scale 0.75..1.5]\n [--audiogram-normalize] [--audiogram-loudness-target -24..-12]\n [--audiogram-start SEC] [--audiogram-duration SEC] [--audiogram-fps 15..30]\n Privacy redaction Preview (still-image input + image output only):\n --privacy-detector face|license_plate|text\n [--privacy-style blur|pixelate|solid] [--privacy-failure-mode fail_closed|report_only]\n [--privacy-min-confidence 0.30..0.99] [--privacy-sample-interval 0.1..30]\n [--privacy-max-frames 1..18000] [--privacy-padding 0..0.5]\n [--privacy-solid-color #RRGGBB] [--privacy-pixel-block-size 4..128]\n [--privacy-strength standard|strong] [--privacy-debug-observations]\n mediaruntime capabilities [--json]\n mediaruntime presets list [--json]\n mediaruntime jobs list [--status <status>] [--limit <n>] [--cursor <cursor>]\n mediaruntime jobs get <job_id> [--download <bundle.zip>] [--force]\n mediaruntime recipes <list|get|create|version|archive>\n mediaruntime stickers collections <list|create|get|update|archive|packs>\n mediaruntime stickers packs list --collection <collection_id>\n mediaruntime stickers search <query> --collection <collection_id>\n mediaruntime stickers typeahead <prefix> --collection <collection_id>\n mediaruntime stickers get <sticker_id> --collection <collection_id>\n mediaruntime stickers resolve <sticker_id> --variant <name> --collection <collection_id>\n mediaruntime stickers usage\n mediaruntime stickers token create --collection <collection_id>\n mediaruntime trigger <job.completed|job.failed|job.rejected> --to <local-url>\n mediaruntime login [--no-browser]\n mediaruntime auth status\n mediaruntime logout [--local-only]\n\nGlobal options:\n --base-url <url> Developer override; normally leave unset\n --help Show help\n --version Show version\n\nRun/jobs options:\n --json Machine-readable, URL-redacted output\n\nAuthentication uses a secure login or MEDIARUNTIME_API_KEY.\nSticker commands use that API key by default. MEDIARUNTIME_STICKER_CLIENT_TOKEN may\nreplace it only for collection-bound packs/search/typeahead/get/resolve reads; it cannot\nmanage collections, inspect workspace usage, or mint another token.\n`;\n\ntype CliJobsClient = RunJobsClient & JobsReadClient;\n\nexport interface CliClient {\n jobs: CliJobsClient;\n capabilities: CapabilitiesReadClient;\n uploads?: {\n resolveSource(source: string): Promise<string>;\n };\n recipes?: RecipesClient;\n stickers?: HostedStickersCommandClient;\n}\n\nexport interface CliDependencies {\n createClient?(options: { baseUrl?: string; apiKey?: string }): CliClient;\n createStickerRuntime?(options: {\n accessToken: string;\n collectionId: string;\n baseUrl?: string;\n }): StickerRuntimeReadClient;\n downloadBundle?(\n url: string,\n destination: string,\n options: {\n force: boolean;\n expectedSizeBytes?: number | null;\n expectedSha256?: string | null;\n },\n ): Promise<void>;\n writeStdout?(text: string): void;\n writeStderr?(text: string): void;\n isStderrTTY?: boolean;\n credentialStore?: CredentialStore;\n openBrowser?(url: string): Promise<void>;\n sleep?(milliseconds: number): Promise<void>;\n now?(): number;\n randomVerifier?(): string;\n}\n\nfunction isFileExistsError(error: unknown): boolean {\n return error instanceof Error && \"code\" in error && error.code === \"EEXIST\";\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function downloadBundleAtomically(\n url: string,\n destination: string,\n options: {\n force: boolean;\n expectedSizeBytes?: number | null;\n expectedSha256?: string | null;\n },\n): Promise<void> {\n // Stream into a private sibling file so an interrupted transfer never appears complete.\n const target = resolve(destination);\n if (!options.force && await exists(target)) {\n throw new BundleDownloadError(`Refusing to overwrite existing file: ${destination}`);\n }\n const temporary = resolve(\n dirname(target),\n `.${basename(target)}.${randomUUID()}.part`,\n );\n\n try {\n let response: Response;\n try {\n response = await fetch(url);\n } catch (error) {\n throw new BundleDownloadError(\"Bundle download failed before receiving a response\", { cause: error });\n }\n if (!response.ok) {\n await response.body?.cancel();\n throw new BundleDownloadError(`Bundle download failed with HTTP ${response.status}`);\n }\n if (!response.body) throw new BundleDownloadError(\"Bundle download returned an empty response body\");\n const hash = createHash(\"sha256\");\n let sizeBytes = 0;\n const integrity = new Transform({\n transform(chunk: Buffer, _encoding, callback) {\n sizeBytes += chunk.length;\n hash.update(chunk);\n callback(null, chunk);\n },\n });\n await pipeline(\n Readable.fromWeb(response.body as unknown as NodeReadableStream<Uint8Array>),\n integrity,\n createWriteStream(temporary, { flags: \"wx\", mode: 0o600 }),\n );\n const sha256 = hash.digest(\"hex\");\n // Validate before the temporary file becomes visible at the requested destination.\n if (options.expectedSizeBytes !== undefined && options.expectedSizeBytes !== null &&\n sizeBytes !== options.expectedSizeBytes) {\n throw new BundleDownloadError(\n `Bundle size mismatch: expected ${options.expectedSizeBytes} bytes, received ${sizeBytes}`,\n );\n }\n if (options.expectedSha256 && sha256 !== options.expectedSha256.toLowerCase()) {\n throw new BundleDownloadError(\"Bundle SHA-256 mismatch\");\n }\n\n if (options.force) {\n await rename(temporary, target);\n } else {\n try {\n // A hard link publishes the completed same-filesystem temporary file atomically\n // and fails rather than replacing a destination created during the download.\n await link(temporary, target);\n } catch (error) {\n if (isFileExistsError(error)) {\n throw new BundleDownloadError(`Refusing to overwrite existing file: ${destination}`);\n }\n throw error;\n }\n await rm(temporary);\n }\n } catch (error) {\n await rm(temporary, { force: true });\n if (error instanceof BundleDownloadError) throw error;\n throw new BundleDownloadError(`Could not write bundle to ${destination}`, { cause: error });\n }\n}\n\nfunction normalizeBaseUrl(raw: string): string {\n let value: URL;\n try {\n value = new URL(raw);\n } catch {\n throw new UsageError(\"--base-url must be an absolute HTTP(S) origin\");\n }\n if (value.username || value.password || value.search || value.hash || value.pathname !== \"/\") {\n throw new UsageError(\"--base-url must be an origin without credentials, path, query, or fragment\");\n }\n // Plain HTTP is acceptable only for a developer-controlled loopback gateway.\n if (value.protocol !== \"https:\" && !(value.protocol === \"http:\" && isLoopbackDestination(value))) {\n throw new UsageError(\"--base-url must use HTTPS unless it points to loopback\");\n }\n return value.origin;\n}\n\nfunction extractGlobalOptions(argv: string[]): { baseUrl?: string; args: string[] } {\n const args = [...argv];\n let baseUrl: string | undefined;\n while (args[0] === \"--base-url\") {\n const value = args[1];\n if (!value || value.startsWith(\"--\")) throw new UsageError(\"--base-url requires a value\");\n baseUrl = normalizeBaseUrl(value);\n args.splice(0, 2);\n }\n return { ...(baseUrl === undefined ? {} : { baseUrl }), args };\n}\n\nfunction safeApiError(error: MediaRuntimeApiError): Record<string, unknown> {\n return {\n name: error.name,\n message: error.message,\n code: error.code,\n status: error.status,\n retryable: error.retryable,\n requestId: error.requestId ?? null,\n field: error.field ?? null,\n };\n}\n\nfunction exitCodeFor(error: unknown): number {\n if (error instanceof CliError) return error.exitCode;\n if (error instanceof JobWaitTimeoutError) return 7;\n if (error instanceof MediaRuntimeConnectionError) return 5;\n if (error instanceof MediaRuntimeApiError) {\n if ([401, 402, 403].includes(error.status)) return 3;\n if (error.status >= 500) return 5;\n return 4;\n }\n if (error instanceof DOMException && error.name === \"AbortError\") return 130;\n if (error instanceof TypeError && /fetch|network|socket|connect/i.test(error.message)) return 5;\n return 1;\n}\n\nfunction safeError(error: unknown, exitCode: number): Record<string, unknown> {\n if (error instanceof MediaRuntimeApiError) return { ...safeApiError(error), exitCode };\n return {\n code: error instanceof CliError ? error.code : \"cli_error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n exitCode,\n };\n}\n\nexport async function executeCli(\n argv: string[],\n dependencies: CliDependencies = {},\n): Promise<number> {\n const writeStdout = dependencies.writeStdout ?? ((text: string) => process.stdout.write(text));\n const writeStderr = dependencies.writeStderr ?? ((text: string) => process.stderr.write(text));\n const json = argv.includes(\"--json\");\n const isStderrTTY = dependencies.isStderrTTY ??\n (dependencies.writeStderr === undefined && process.stderr.isTTY === true);\n try {\n const global = extractGlobalOptions(argv);\n const command = global.args[0];\n if (!command || command === \"--help\" || command === \"-h\") {\n writeStdout(HELP);\n return 0;\n }\n if (command === \"--version\" || command === \"-v\") {\n writeStdout(`${VERSION}\\n`);\n return 0;\n }\n if (command === \"trigger\") {\n return await runTriggerCommand(global.args.slice(1), { writeStdout });\n }\n\n const configuredBaseUrl = global.baseUrl ?? process.env.MEDIARUNTIME_API_URL;\n const baseUrl = configuredBaseUrl ? normalizeBaseUrl(configuredBaseUrl) : undefined;\n const authBaseUrl = baseUrl ?? PRODUCTION_ORIGIN;\n const authDependencies: AuthCommandDependencies = {\n ...(dependencies.credentialStore ? { credentialStore: dependencies.credentialStore } : {}),\n ...(dependencies.openBrowser ? { openBrowser: dependencies.openBrowser } : {}),\n ...(dependencies.sleep ? { sleep: dependencies.sleep } : {}),\n ...(dependencies.now ? { now: dependencies.now } : {}),\n ...(dependencies.randomVerifier ? { randomVerifier: dependencies.randomVerifier } : {}),\n writeStdout,\n };\n if (command === \"login\") return await runLoginCommand(global.args.slice(1), authBaseUrl, authDependencies);\n if (command === \"auth\") return await runAuthCommand(global.args.slice(1), authBaseUrl, authDependencies);\n if (command === \"logout\") return await runLogoutCommand(global.args.slice(1), authBaseUrl, authDependencies);\n\n if (command === \"capabilities\" || command === \"presets\") {\n // Discovery is public, so these commands work before login and in setup scripts.\n const publicClient = dependencies.createClient?.({\n ...(baseUrl === undefined ? {} : { baseUrl }),\n }) ?? new MediaRuntime({\n ...(baseUrl === undefined ? {} : { baseUrl }),\n });\n const publicDependencies = { capabilities: publicClient.capabilities, writeStdout };\n if (command === \"capabilities\") {\n return await runCapabilitiesCommand(global.args.slice(1), publicDependencies);\n }\n return await runPresetsCommand(global.args.slice(1), publicDependencies);\n }\n\n const stickerArguments = global.args.slice(1);\n const stickerClientToken = process.env.MEDIARUNTIME_STICKER_CLIENT_TOKEN?.trim();\n if (command === \"stickers\" &&\n (!stickerArguments[0] || stickerArguments.includes(\"--help\") || stickerArguments.includes(\"-h\"))) {\n // Help is local and must remain available before login, including on clean machines.\n return await runStickersCommand(stickerArguments, { writeStdout });\n }\n if (command === \"stickers\" && stickerClientToken && isScopedStickerRuntimeCommand(stickerArguments)) {\n // Scoped mode is dispatched before master-key resolution so an untrusted client\n // credential can never silently fall back to a more privileged stored login.\n const selectedCollectionId = stickerCollectionOption(stickerArguments);\n const options = {\n accessToken: stickerClientToken,\n collectionId: selectedCollectionId,\n ...(baseUrl === undefined ? {} : { baseUrl }),\n };\n const constructor = (MediaRuntimeSdk as unknown as {\n StickerRuntime?: new (value: typeof options) => StickerRuntimeReadClient;\n }).StickerRuntime;\n const runtime = dependencies.createStickerRuntime?.(options) ??\n (constructor ? new constructor(options) : undefined);\n if (!runtime) {\n throw new UsageError(\"The installed @mediaruntime/node SDK does not support scoped Sticker Runtime tokens\");\n }\n return await runStickersCommand(stickerArguments, {\n runtime: () => runtime,\n writeStdout,\n });\n }\n\n // Preserve the documented precedence: explicit environment key, then browser login.\n let apiKey = process.env.MEDIARUNTIME_API_KEY?.trim();\n if (!apiKey && (!dependencies.createClient || dependencies.credentialStore)) {\n apiKey = (await resolveCredential(authBaseUrl, authDependencies))?.apiKey;\n }\n if (!dependencies.createClient && !apiKey) {\n throw new UsageError(\"Run mediaruntime login or set MEDIARUNTIME_API_KEY before using this command\");\n }\n const client = dependencies.createClient?.({\n ...(baseUrl === undefined ? {} : { baseUrl }),\n ...(apiKey === undefined ? {} : { apiKey }),\n }) ?? new MediaRuntime({\n ...(baseUrl === undefined ? {} : { baseUrl }),\n ...(apiKey === undefined ? {} : { apiKey }),\n });\n const downloadBundle = dependencies.downloadBundle ?? downloadBundleAtomically;\n const commandDependencies = {\n jobs: client.jobs,\n capabilities: client.capabilities,\n ...(client.uploads ? { uploads: client.uploads } : {}),\n writeStdout,\n downloadBundle,\n activity: createActivityIndicator(writeStderr, isStderrTTY && !json),\n };\n if (command === \"run\") return await runCommand(global.args.slice(1), commandDependencies);\n if (command === \"jobs\") {\n return await runJobsCommand(global.args.slice(1), commandDependencies);\n }\n if (command === \"recipes\") {\n if (!client.recipes) throw new UsageError(\"This MediaRuntime client does not support hosted recipes\");\n return await runRecipesCommand(global.args.slice(1), {\n recipes: client.recipes,\n writeStdout,\n });\n }\n if (command === \"stickers\") {\n // The structural cast keeps local builds compatible while the additive SDK\n // release carrying the stickers resource moves through package publication.\n const stickers = (client as unknown as CliClient).stickers;\n if (!stickers) throw new UsageError(\"This MediaRuntime client does not support Hosted Sticker Runtime\");\n return await runStickersCommand(stickerArguments, {\n hosted: stickers,\n writeStdout,\n });\n }\n throw new UsageError(`Unknown command: ${command}`);\n } catch (error) {\n const exitCode = exitCodeFor(error);\n if (json) {\n writeStderr(`${JSON.stringify({ error: safeError(error, exitCode) })}\\n`);\n } else {\n const requestId = error instanceof MediaRuntimeApiError && error.requestId\n ? ` (request ${error.requestId})`\n : \"\";\n writeStderr(`Error: ${error instanceof Error ? error.message : \"Unknown error\"}${requestId}\\n`);\n }\n return exitCode;\n }\n}\n\nlet isEntrypoint = false;\nif (process.argv[1] !== undefined) {\n try {\n // npm exposes binaries through a symlink. Resolve both sides so the installed command\n // executes while importing dist/cli.js in tests remains side-effect free.\n isEntrypoint = realpathSync(process.argv[1]) === realpathSync(fileURLToPath(import.meta.url));\n } catch {\n isEntrypoint = false;\n }\n}\nif (isEntrypoint) process.exitCode = await executeCli(process.argv.slice(2));\n","export class CliError extends Error {\n readonly code: string;\n readonly exitCode: number;\n\n constructor(code: string, message: string, exitCode: number, options?: { cause?: unknown }) {\n // Stable codes and exit statuses let shell scripts distinguish usage, API, and I/O failures.\n super(message, options);\n this.name = \"CliError\";\n this.code = code;\n this.exitCode = exitCode;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class UsageError extends CliError {\n constructor(message: string, options?: { cause?: unknown }) {\n super(\"usage_error\", message, 2, options);\n this.name = \"UsageError\";\n }\n}\n\nexport class TriggerDeliveryError extends CliError {\n constructor(message: string, options?: { cause?: unknown }) {\n super(\"trigger_delivery_error\", message, 8, options);\n this.name = \"TriggerDeliveryError\";\n }\n}\n\nexport class BundleDownloadError extends CliError {\n constructor(message: string, options?: { cause?: unknown }) {\n super(\"bundle_download_error\", message, 9, options);\n this.name = \"BundleDownloadError\";\n }\n}\n","import { CliError } from \"../errors.js\";\n\n// Browser login uses a dedicated application route rather than the public /v1 API.\nexport const PRODUCTION_ORIGIN = \"https://mediaruntime.com\";\n\ninterface ErrorPayload {\n error?: unknown;\n detail?: unknown;\n}\n\nexport interface DeviceAuthorization {\n deviceCode: string;\n userCode: string;\n verificationUri: string;\n verificationUriComplete: string;\n expiresIn: number;\n interval: number;\n}\n\nexport interface IssuedCredential {\n apiKey: string;\n accountId: string;\n keyId: string;\n credentialType: \"cli\";\n}\n\nexport interface CredentialStatus {\n status: \"authenticated\";\n accountId: string;\n keyId: string;\n credentialType: \"cli\" | \"api_key\";\n}\n\nexport class AuthApiError extends CliError {\n readonly status: number;\n\n constructor(code: string, message: string, status: number) {\n super(code, message, status >= 500 ? 5 : 3);\n this.name = \"AuthApiError\";\n this.status = status;\n }\n}\n\nfunction endpoint(baseUrl: string, path: string): string {\n return `${baseUrl.replace(/\\/+$/, \"\")}/api/cli/auth/${path}`;\n}\n\nasync function responsePayload(response: Response): Promise<Record<string, unknown>> {\n try {\n const value: unknown = await response.json();\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? value as Record<string, unknown>\n : {};\n } catch {\n return {};\n }\n}\n\nasync function post(\n baseUrl: string,\n path: string,\n body: Record<string, unknown>,\n apiKey?: string,\n): Promise<Record<string, unknown>> {\n let response: Response;\n try {\n response = await fetch(endpoint(baseUrl, path), {\n method: \"POST\",\n // Never forward a credential or device code through an unexpected redirect.\n redirect: \"error\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(apiKey ? { \"X-API-Key\": apiKey } : {}),\n },\n body: JSON.stringify(body),\n });\n } catch (error) {\n throw new CliError(\"auth_connection_error\", \"Could not reach MediaRuntime authentication\", 5, { cause: error });\n }\n const payload = await responsePayload(response);\n if (!response.ok) {\n const errorPayload = payload as ErrorPayload;\n throw new AuthApiError(\n typeof errorPayload.error === \"string\" ? errorPayload.error : \"authorization_failed\",\n typeof errorPayload.detail === \"string\" ? errorPayload.detail : `Authentication failed with HTTP ${response.status}`,\n response.status,\n );\n }\n return payload;\n}\n\nfunction requireString(payload: Record<string, unknown>, key: string): string {\n // Treat malformed success responses as a service failure, not as usable credentials.\n const value = payload[key];\n if (typeof value !== \"string\" || !value) throw new CliError(\"invalid_auth_response\", \"MediaRuntime returned an invalid authentication response\", 5);\n return value;\n}\n\nexport async function startAuthorization(baseUrl: string, codeChallenge: string): Promise<DeviceAuthorization> {\n const payload = await post(baseUrl, \"start\", { codeChallenge, clientName: \"MediaRuntime CLI\" });\n return {\n deviceCode: requireString(payload, \"deviceCode\"),\n userCode: requireString(payload, \"userCode\"),\n verificationUri: requireString(payload, \"verificationUri\"),\n verificationUriComplete: requireString(payload, \"verificationUriComplete\"),\n expiresIn: Number(payload.expiresIn),\n interval: Number(payload.interval),\n };\n}\n\nexport async function exchangeAuthorization(baseUrl: string, deviceCode: string, codeVerifier: string): Promise<IssuedCredential> {\n const payload = await post(baseUrl, \"token\", { deviceCode, codeVerifier });\n const credentialType = requireString(payload, \"credentialType\");\n if (credentialType !== \"cli\") throw new CliError(\"invalid_auth_response\", \"MediaRuntime returned the wrong credential type\", 5);\n return {\n apiKey: requireString(payload, \"apiKey\"),\n accountId: requireString(payload, \"accountId\"),\n keyId: requireString(payload, \"keyId\"),\n credentialType,\n };\n}\n\nexport async function inspectCredential(baseUrl: string, apiKey: string): Promise<CredentialStatus> {\n const payload = await post(baseUrl, \"status\", {}, apiKey);\n const credentialType = requireString(payload, \"credentialType\");\n if (credentialType !== \"cli\" && credentialType !== \"api_key\") {\n throw new CliError(\"invalid_auth_response\", \"MediaRuntime returned the wrong credential type\", 5);\n }\n return {\n status: \"authenticated\",\n accountId: requireString(payload, \"accountId\"),\n keyId: requireString(payload, \"keyId\"),\n credentialType,\n };\n}\n\nexport async function revokeCredential(baseUrl: string, apiKey: string): Promise<void> {\n await post(baseUrl, \"revoke\", {}, apiKey);\n}\n","import { createHash, randomBytes } from \"node:crypto\";\nimport {\n AuthApiError,\n exchangeAuthorization,\n inspectCredential,\n revokeCredential,\n startAuthorization,\n} from \"../auth/api.js\";\nimport { openBrowser } from \"../auth/browser.js\";\nimport {\n OsCredentialStore,\n type CredentialStore,\n type StoredCredential,\n} from \"../auth/credential-store.js\";\nimport { CliError, UsageError } from \"../errors.js\";\n\nexport interface AuthCommandDependencies {\n credentialStore?: CredentialStore;\n openBrowser?: (url: string) => Promise<void>;\n sleep?: (milliseconds: number) => Promise<void>;\n now?: () => number;\n randomVerifier?: () => string;\n writeStdout?: (text: string) => void;\n}\n\nconst defaultSleep = (milliseconds: number) => new Promise<void>((resolve) => setTimeout(resolve, milliseconds));\n\nfunction verifierChallenge(verifier: string): string {\n return createHash(\"sha256\").update(verifier).digest(\"base64url\");\n}\n\nfunction defaultVerifier(): string {\n return randomBytes(32).toString(\"base64url\");\n}\n\nfunction store(dependencies: AuthCommandDependencies): CredentialStore {\n return dependencies.credentialStore ?? new OsCredentialStore();\n}\n\nfunction assertOnly(args: string[], allowed: string[]): void {\n const unexpected = args.find((arg) => !allowed.includes(arg));\n if (unexpected) throw new UsageError(`Unknown authentication option: ${unexpected}`);\n}\n\nexport async function resolveCredential(\n baseUrl: string,\n dependencies: AuthCommandDependencies = {},\n): Promise<{ apiKey: string; source: \"environment\" | \"keychain\"; stored?: StoredCredential } | null> {\n // Environment authentication is permanently supported and deliberately overrides login.\n const environment = process.env.MEDIARUNTIME_API_KEY?.trim();\n if (environment) return { apiKey: environment, source: \"environment\" };\n const stored = await store(dependencies).get(baseUrl);\n return stored ? { apiKey: stored.apiKey, source: \"keychain\", stored } : null;\n}\n\nexport async function runLoginCommand(\n args: string[],\n baseUrl: string,\n dependencies: AuthCommandDependencies = {},\n): Promise<number> {\n assertOnly(args, [\"--no-browser\"]);\n const noBrowser = args.includes(\"--no-browser\");\n const write = dependencies.writeStdout ?? ((text: string) => process.stdout.write(text));\n const existing = await store(dependencies).get(baseUrl);\n if (existing) {\n try {\n await inspectCredential(baseUrl, existing.apiKey);\n write(`Already logged in to ${baseUrl} (account ${existing.accountId}).\\n`);\n return 0;\n } catch (error) {\n if (!(error instanceof AuthApiError) || error.status >= 500) throw error;\n }\n }\n\n const verifier = dependencies.randomVerifier?.() ?? defaultVerifier();\n if (verifier.length < 43 || verifier.length > 128) {\n throw new CliError(\"invalid_verifier\", \"Generated PKCE verifier is invalid\", 1);\n }\n // Only the challenge leaves this process; the PKCE verifier stays local until exchange.\n const authorization = await startAuthorization(baseUrl, verifierChallenge(verifier));\n if (!Number.isFinite(authorization.expiresIn) || authorization.expiresIn <= 0 ||\n !Number.isFinite(authorization.interval) || authorization.interval < 1) {\n throw new CliError(\"invalid_auth_response\", \"MediaRuntime returned invalid authorization timing\", 5);\n }\n\n write(`Open this URL to authorize MediaRuntime CLI:\\n${authorization.verificationUriComplete}\\n\\n`);\n write(`Confirm code: ${authorization.userCode}\\n`);\n if (!noBrowser) await (dependencies.openBrowser ?? openBrowser)(authorization.verificationUriComplete);\n write(\"Waiting for browser approval…\\n\");\n\n const now = dependencies.now ?? Date.now;\n const sleep = dependencies.sleep ?? defaultSleep;\n const deadline = now() + authorization.expiresIn * 1000;\n let credential;\n while (now() < deadline) {\n try {\n credential = await exchangeAuthorization(baseUrl, authorization.deviceCode, verifier);\n break;\n } catch (error) {\n if (error instanceof AuthApiError && error.code === \"authorization_pending\") {\n // Respect the server-provided polling interval to avoid a busy device-flow loop.\n await sleep(authorization.interval * 1000);\n continue;\n }\n throw error;\n }\n }\n if (!credential) throw new CliError(\"authorization_timeout\", \"Browser authorization expired; run mediaruntime login again\", 7);\n\n try {\n await inspectCredential(baseUrl, credential.apiKey);\n await store(dependencies).set({\n apiKey: credential.apiKey,\n accountId: credential.accountId,\n keyId: credential.keyId,\n baseUrl,\n createdAt: new Date(now()).toISOString(),\n });\n } catch (error) {\n // Do not leave an active server credential behind when local persistence fails.\n await revokeCredential(baseUrl, credential.apiKey).catch(() => undefined);\n throw error;\n }\n\n write(`Logged in to ${baseUrl} (account ${credential.accountId}).\\n`);\n if (process.env.MEDIARUNTIME_API_KEY?.trim()) {\n write(\"MEDIARUNTIME_API_KEY is set and will take precedence over this login.\\n\");\n }\n return 0;\n}\n\nexport async function runAuthStatusCommand(\n args: string[],\n baseUrl: string,\n dependencies: AuthCommandDependencies = {},\n): Promise<number> {\n assertOnly(args, [\"--json\"]);\n const json = args.includes(\"--json\");\n const write = dependencies.writeStdout ?? ((text: string) => process.stdout.write(text));\n const resolved = await resolveCredential(baseUrl, dependencies);\n if (!resolved) throw new CliError(\"authentication_required\", \"Run mediaruntime login or set MEDIARUNTIME_API_KEY\", 3);\n const status = await inspectCredential(baseUrl, resolved.apiKey);\n if (json) {\n write(`${JSON.stringify({ authenticated: true, source: resolved.source, ...status })}\\n`);\n } else {\n write(`Authenticated via ${resolved.source} (account ${status.accountId}, key ${status.keyId}).\\n`);\n }\n return 0;\n}\n\nexport async function runLogoutCommand(\n args: string[],\n baseUrl: string,\n dependencies: AuthCommandDependencies = {},\n): Promise<number> {\n assertOnly(args, [\"--local-only\"]);\n const localOnly = args.includes(\"--local-only\");\n const write = dependencies.writeStdout ?? ((text: string) => process.stdout.write(text));\n const credentialStore = store(dependencies);\n const credential = await credentialStore.get(baseUrl);\n if (!credential) {\n write(`No stored login for ${baseUrl}.\\n`);\n if (process.env.MEDIARUNTIME_API_KEY?.trim()) write(\"MEDIARUNTIME_API_KEY remains active in this shell.\\n\");\n return 0;\n }\n if (!localOnly) await revokeCredential(baseUrl, credential.apiKey);\n await credentialStore.delete(baseUrl);\n write(localOnly ? \"Removed the local CLI login without server revocation.\\n\" : \"Logged out and revoked the CLI credential.\\n\");\n if (process.env.MEDIARUNTIME_API_KEY?.trim()) write(\"MEDIARUNTIME_API_KEY remains active in this shell.\\n\");\n return 0;\n}\n\nexport async function runAuthCommand(\n args: string[],\n baseUrl: string,\n dependencies: AuthCommandDependencies = {},\n): Promise<number> {\n const subcommand = args[0];\n if (subcommand !== \"status\") throw new UsageError(\"Usage: mediaruntime auth status [--json]\");\n return runAuthStatusCommand(args.slice(1), baseUrl, dependencies);\n}\n","import { spawn } from \"node:child_process\";\nimport { CliError } from \"../errors.js\";\n\nexport async function openBrowser(url: string): Promise<void> {\n // Use the operating system URL handler so the CLI does not depend on a browser package.\n const command = process.platform === \"darwin\"\n ? { executable: \"open\", args: [url] }\n : process.platform === \"win32\"\n ? { executable: \"rundll32\", args: [\"url.dll,FileProtocolHandler\", url] }\n : { executable: \"xdg-open\", args: [url] };\n\n await new Promise<void>((resolve, reject) => {\n const child = spawn(command.executable, command.args, {\n detached: true,\n stdio: \"ignore\",\n });\n child.once(\"error\", (error) => reject(new CliError(\n \"browser_open_failed\",\n \"Could not open a browser; rerun with --no-browser and open the printed URL\",\n 2,\n { cause: error },\n )));\n child.once(\"spawn\", () => {\n // The browser owns its lifecycle after launch; the CLI can continue polling approval.\n child.unref();\n resolve();\n });\n });\n}\n","import { CliError } from \"../errors.js\";\n\nconst SERVICE = \"mediaruntime-cli\";\n\nexport interface StoredCredential {\n apiKey: string;\n accountId: string;\n keyId: string;\n baseUrl: string;\n createdAt: string;\n}\n\nexport interface CredentialStore {\n get(baseUrl: string): Promise<StoredCredential | null>;\n set(credential: StoredCredential): Promise<void>;\n delete(baseUrl: string): Promise<void>;\n}\n\nfunction vaultAccount(baseUrl: string): string {\n // One vault entry per host keeps production and local/development logins isolated.\n return new URL(baseUrl).host.toLowerCase();\n}\n\nfunction validCredential(value: unknown): value is StoredCredential {\n if (!value || typeof value !== \"object\") return false;\n const item = value as Record<string, unknown>;\n return typeof item.apiKey === \"string\" && item.apiKey.startsWith(\"sk_\") &&\n typeof item.accountId === \"string\" && item.accountId.length > 0 &&\n typeof item.keyId === \"string\" && item.keyId.length > 0 &&\n typeof item.baseUrl === \"string\" && item.baseUrl.length > 0 &&\n typeof item.createdAt === \"string\" && item.createdAt.length > 0;\n}\n\nasync function entry(baseUrl: string) {\n try {\n // Load keyring lazily so MEDIARUNTIME_API_KEY remains usable on unsupported systems.\n const { Entry } = await import(\"@napi-rs/keyring\");\n return new Entry(SERVICE, vaultAccount(baseUrl));\n } catch (error) {\n throw new CliError(\n \"credential_store_unavailable\",\n \"The operating-system credential vault is unavailable; use MEDIARUNTIME_API_KEY on this machine\",\n 2,\n { cause: error },\n );\n }\n}\n\nexport class OsCredentialStore implements CredentialStore {\n async get(baseUrl: string): Promise<StoredCredential | null> {\n try {\n const raw = (await entry(baseUrl)).getPassword();\n if (!raw) return null;\n const parsed: unknown = JSON.parse(raw);\n if (!validCredential(parsed) || parsed.baseUrl !== baseUrl) {\n throw new Error(\"Stored credential has an invalid shape\");\n }\n return parsed;\n } catch (error) {\n if (error instanceof SyntaxError || (error instanceof Error && error.message.includes(\"invalid shape\"))) {\n throw new CliError(\"credential_store_invalid\", \"The stored MediaRuntime credential is invalid; run mediaruntime logout --local-only\", 3);\n }\n if (error instanceof CliError) throw error;\n // Keyring implementations return a not-found error rather than null on some platforms.\n if (error instanceof Error && /not found|no entry|no matching|item.*exist/i.test(error.message)) return null;\n throw new CliError(\"credential_store_error\", \"Could not read the operating-system credential vault\", 2, { cause: error });\n }\n }\n\n async set(credential: StoredCredential): Promise<void> {\n try {\n (await entry(credential.baseUrl)).setPassword(JSON.stringify(credential));\n } catch (error) {\n if (error instanceof CliError) throw error;\n throw new CliError(\"credential_store_error\", \"Could not save the login in the operating-system credential vault\", 2, { cause: error });\n }\n }\n\n async delete(baseUrl: string): Promise<void> {\n try {\n (await entry(baseUrl)).deletePassword();\n } catch (error) {\n if (error instanceof CliError) throw error;\n if (error instanceof Error && /not found|no entry|no matching|item.*exist/i.test(error.message)) return;\n throw new CliError(\"credential_store_error\", \"Could not remove the login from the operating-system credential vault\", 2, { cause: error });\n }\n }\n}\n","import type { Capabilities } from \"@mediaruntime/node\";\nimport { UsageError } from \"../errors.js\";\n\nexport interface CapabilitiesReadClient {\n retrieve(): Promise<Capabilities>;\n}\n\nexport interface CapabilitiesCommandDependencies {\n capabilities: CapabilitiesReadClient;\n writeStdout(text: string): void;\n}\n\nexport interface PublicPresetRow {\n name: string;\n outputType: string;\n tier: string;\n sourceKinds: string[];\n artifacts: string[];\n description: string;\n codec: string | null;\n container: string | null;\n}\n\nfunction cell(value: string): string {\n return value || \"-\";\n}\n\nfunction table(headings: string[], rows: string[][]): string {\n const widths = headings.map((heading, index) =>\n Math.max(heading.length, ...rows.map((row) => row[index]?.length ?? 0)),\n );\n const render = (row: string[]): string =>\n row.map((value, index) => value.padEnd(widths[index] ?? value.length)).join(\" \").trimEnd();\n return `${[\n render(headings),\n render(widths.map((width) => \"-\".repeat(width))),\n ...rows.map(render),\n ].join(\"\\n\")}\\n`;\n}\n\nexport function publicPresetRows(capabilities: Capabilities): PublicPresetRow[] {\n // Preserve the gateway's public ordering and never expose metadata for private presets.\n return capabilities.publicPresets.map((name) => {\n const preset = capabilities.presets[name];\n if (!preset) {\n throw new Error(`Gateway capability contract is missing public preset metadata for ${name}`);\n }\n return {\n name,\n outputType: preset.outputType,\n tier: preset.baseTier,\n sourceKinds: preset.sourceKinds,\n artifacts: preset.artifacts,\n description: preset.description,\n codec: preset.codec ?? null,\n container: preset.container ?? null,\n };\n });\n}\n\nfunction parseJsonOnly(args: string[], command: string): boolean {\n let json = false;\n for (const argument of args) {\n if (argument === \"--json\") json = true;\n else throw new UsageError(`Unknown ${command} option: ${argument}`);\n }\n return json;\n}\n\nexport async function runCapabilitiesCommand(\n args: string[],\n dependencies: CapabilitiesCommandDependencies,\n): Promise<number> {\n const json = parseJsonOnly(args, \"capabilities\");\n const capabilities = await dependencies.capabilities.retrieve();\n if (json) {\n dependencies.writeStdout(`${JSON.stringify(capabilities)}\\n`);\n return 0;\n }\n\n const aliases = Object.entries(capabilities.outputAliases).map(([name, value]) => [\n name,\n value.type,\n value.preset,\n value.tier,\n ]);\n dependencies.writeStdout(\n `Public presets: ${capabilities.publicPresets.length}\\n` +\n `Optional features: ${Object.keys(capabilities.features).sort().join(\", \") || \"none\"}\\n\\n` +\n table([\"ALIAS\", \"TYPE\", \"PRESET\", \"TIER\"], aliases) +\n \"\\nRun `mediaruntime presets list` for the complete public preset catalog.\\n\",\n );\n return 0;\n}\n\nexport async function runPresetsCommand(\n args: string[],\n dependencies: CapabilitiesCommandDependencies,\n): Promise<number> {\n const subcommand = args[0];\n if (subcommand !== \"list\") throw new UsageError(\"Usage: mediaruntime presets list [--json]\");\n const json = parseJsonOnly(args.slice(1), \"presets list\");\n const capabilities = await dependencies.capabilities.retrieve();\n const presets = publicPresetRows(capabilities);\n if (json) dependencies.writeStdout(`${JSON.stringify({ presets })}\\n`);\n else {\n dependencies.writeStdout(table(\n [\"PRESET\", \"TYPE\", \"TIER\", \"INPUTS\", \"ARTIFACTS\"],\n presets.map((preset) => [\n preset.name,\n cell(preset.outputType),\n cell(preset.tier),\n preset.sourceKinds.join(\",\"),\n preset.artifacts.join(\", \"),\n ]),\n ));\n }\n return 0;\n}\n","import type { JobDetails, JobPage, JobStatus, ListJobsParams } from \"@mediaruntime/node\";\nimport { BundleDownloadError, UsageError } from \"../errors.js\";\n\nconst UNSUCCESSFUL_TERMINAL_STATUSES = new Set([\"FAILED\", \"REJECTED\", \"PARTIAL\"]);\n\nexport interface JobsReadClient {\n list(params?: ListJobsParams): Promise<JobPage>;\n get(jobId: string): Promise<JobDetails>;\n}\n\nexport interface JobsCommandDependencies {\n jobs: JobsReadClient;\n writeStdout(text: string): void;\n downloadBundle(\n url: string,\n destination: string,\n options: { force: boolean; expectedSizeBytes?: number | null; expectedSha256?: string | null },\n ): Promise<void>;\n}\n\nfunction optionValue(args: string[], index: number, option: string): string {\n const value = args[index + 1];\n if (!value || value.startsWith(\"--\")) throw new UsageError(`${option} requires a value`);\n return value;\n}\n\nfunction detailsProjection(job: JobDetails): Record<string, unknown> {\n // Keep machine-readable output useful while omitting the signed bundle URL from JSON logs.\n return {\n id: job.id,\n status: job.status,\n tier: job.tier,\n usage: job.usage,\n billing: job.billing,\n bundle: {\n available: job.bundle.available,\n expiresAt: job.bundle.expiresAt,\n sizeBytes: job.bundle.sizeBytes,\n sha256: job.bundle.sha256,\n retentionDays: job.bundle.retentionDays,\n },\n media: job.media,\n recipe: job.recipe,\n metadata: job.metadata,\n error: job.error,\n createdAt: job.createdAt,\n updatedAt: job.updatedAt,\n startedAt: job.startedAt,\n completedAt: job.completedAt,\n };\n}\n\nfunction humanDetails(job: JobDetails): string {\n const lines = [\n `Job: ${job.id}`,\n `Status: ${job.status}`,\n `Tier: ${job.tier.billed ?? job.tier.effective ?? job.tier.requested ?? \"-\"}`,\n `Bundle: ${job.bundle.available ? \"available\" : \"unavailable\"}`,\n ];\n if (job.bundle.sizeBytes !== null) lines.push(`Bundle size: ${job.bundle.sizeBytes} bytes`);\n if (job.error) lines.push(`Error: ${job.error}`);\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction cell(value: unknown): string {\n if (value === null || value === undefined || value === \"\") return \"-\";\n return String(value);\n}\n\nfunction humanList(page: JobPage): string {\n const rows = page.jobs.map((job) => [\n job.id,\n job.status,\n cell(job.tierBilled),\n cell(job.unitsTotal),\n job.bundleAvailable ? \"yes\" : \"no\",\n cell(job.updatedAt),\n ]);\n const headings = [\"ID\", \"STATUS\", \"TIER\", \"UNITS\", \"BUNDLE\", \"UPDATED\"];\n const widths = headings.map((heading, index) =>\n Math.max(heading.length, ...rows.map((row) => row[index]?.length ?? 0)),\n );\n const render = (row: string[]): string =>\n row.map((value, index) => value.padEnd(widths[index] ?? value.length)).join(\" \").trimEnd();\n const lines = [render(headings), render(widths.map((width) => \"-\".repeat(width))), ...rows.map(render)];\n if (page.nextCursor) lines.push(`Next cursor: ${page.nextCursor}`);\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nasync function listCommand(args: string[], dependencies: JobsCommandDependencies): Promise<number> {\n let status: string | undefined;\n let limit: number | undefined;\n let cursor: string | undefined;\n let json = false;\n for (let index = 0; index < args.length; index += 1) {\n const argument = args[index];\n if (argument === \"--status\") {\n status = optionValue(args, index, argument).toUpperCase();\n index += 1;\n } else if (argument === \"--limit\") {\n const value = Number(optionValue(args, index, argument));\n if (!Number.isSafeInteger(value) || value < 1 || value > 100) {\n throw new UsageError(\"--limit must be an integer between 1 and 100\");\n }\n limit = value;\n index += 1;\n } else if (argument === \"--cursor\") {\n cursor = optionValue(args, index, argument);\n index += 1;\n } else if (argument === \"--json\") {\n json = true;\n } else {\n throw new UsageError(`Unknown jobs list option: ${argument}`);\n }\n }\n const params: ListJobsParams = {\n ...(status === undefined ? {} : { status: status as JobStatus }),\n ...(limit === undefined ? {} : { limit }),\n ...(cursor === undefined ? {} : { cursor }),\n };\n const page = await dependencies.jobs.list(params);\n dependencies.writeStdout(json ? `${JSON.stringify(page)}\\n` : humanList(page));\n return 0;\n}\n\nasync function getCommand(args: string[], dependencies: JobsCommandDependencies): Promise<number> {\n let jobId: string | undefined;\n let download: string | undefined;\n let force = false;\n let json = false;\n for (let index = 0; index < args.length; index += 1) {\n const argument = args[index];\n if (argument === \"--download\") {\n download = optionValue(args, index, argument);\n index += 1;\n } else if (argument === \"--force\") {\n force = true;\n } else if (argument === \"--json\") {\n json = true;\n } else if (argument?.startsWith(\"-\")) {\n throw new UsageError(`Unknown jobs get option: ${argument}`);\n } else if (!jobId) {\n jobId = argument;\n } else {\n throw new UsageError(\"jobs get accepts exactly one job ID\");\n }\n }\n if (!jobId) throw new UsageError(\"Usage: mediaruntime jobs get <job_id>\");\n if (force && !download) throw new UsageError(\"--force requires --download\");\n const job = await dependencies.jobs.get(jobId);\n if (!json) dependencies.writeStdout(humanDetails(job));\n\n if (UNSUCCESSFUL_TERMINAL_STATUSES.has(String(job.status).toUpperCase())) {\n // A retrieved failed job is a successful API call but an unsuccessful automation result.\n if (json) dependencies.writeStdout(`${JSON.stringify(detailsProjection(job))}\\n`);\n return 6;\n }\n if (download) {\n if (String(job.status).toUpperCase() !== \"COMPLETED\" ||\n !job.bundle.available || !job.bundle.downloadUrl) {\n throw new BundleDownloadError(\"Bundle download requires a COMPLETED job with an available canonical bundle\");\n }\n try {\n // Verify gateway-provided size and digest before publishing the downloaded bundle.\n await dependencies.downloadBundle(job.bundle.downloadUrl, download, {\n force,\n expectedSizeBytes: job.bundle.sizeBytes,\n expectedSha256: job.bundle.sha256,\n });\n } catch (error) {\n if (error instanceof BundleDownloadError) throw error;\n throw new BundleDownloadError(`Could not download bundle to ${download}`, { cause: error });\n }\n if (!json) dependencies.writeStdout(`Downloaded bundle to ${download}\\n`);\n }\n if (json) dependencies.writeStdout(`${JSON.stringify(detailsProjection(job))}\\n`);\n return 0;\n}\n\nexport async function runJobsCommand(\n args: string[],\n dependencies: JobsCommandDependencies,\n): Promise<number> {\n const subcommand = args[0];\n if (subcommand === \"list\") return listCommand(args.slice(1), dependencies);\n if (subcommand === \"get\") return getCommand(args.slice(1), dependencies);\n throw new UsageError(\"Usage: mediaruntime jobs <list|get>\");\n}\n","import type {\n Capabilities,\n CreateJobParams,\n JobDetails,\n JobOutput,\n JobReceiptData,\n Metadata,\n OutputAlias,\n WaitForJobOptions,\n} from \"@mediaruntime/node\";\nimport type { CapabilitiesReadClient } from \"./capabilities.js\";\nimport { BundleDownloadError, UsageError } from \"../errors.js\";\nimport type { ActivityIndicator } from \"../ui/activity.js\";\n\nconst UNSUCCESSFUL_TERMINAL_STATUSES = new Set([\"FAILED\", \"REJECTED\", \"PARTIAL\"]);\n// Fast-path aliases are stable CLI inputs; preset metadata is still fetched from capabilities.\nconst OUTPUT_ALIASES = new Set([\n \"video.web\",\n \"video.streaming\",\n \"video.social\",\n \"audio.web\",\n \"audio.transcription\",\n \"image.web\",\n]);\n\ninterface SubmittedJob extends JobReceiptData {\n wait(options?: WaitForJobOptions): Promise<JobDetails>;\n}\n\nexport interface RunJobsClient {\n create(params: CreateJobParams): Promise<SubmittedJob>;\n}\n\nexport interface RunUploadsClient {\n resolveSource(source: string): Promise<string>;\n}\n\nexport interface RunCommandDependencies {\n jobs: RunJobsClient;\n capabilities: CapabilitiesReadClient;\n uploads?: RunUploadsClient;\n writeStdout(text: string): void;\n activity: ActivityIndicator;\n downloadBundle(\n url: string,\n destination: string,\n options: { force: boolean; expectedSizeBytes?: number | null; expectedSha256?: string | null },\n ): Promise<void>;\n}\n\ninterface RunOptions {\n source: string;\n outputs: Array<{ kind: \"alias\" | \"preset\"; value: string }>;\n recipe?: string;\n metadata?: Metadata;\n idempotencyKey?: string;\n wait: boolean;\n timeoutMs?: number;\n download?: string;\n force: boolean;\n json: boolean;\n animation?: {\n width?: number;\n fps?: number;\n startTime?: number;\n duration?: number;\n loop?: number;\n quality?: number;\n };\n placeholders?: {\n maxDimension?: number;\n sourceTimeSec?: number;\n lqipQuality?: number;\n lqipMaxBytes?: number;\n };\n contactSheet?: {\n columns?: number;\n rows?: number;\n tileWidth?: number;\n tileHeight?: number;\n intervalSec?: number;\n startTimeSec?: number;\n durationSec?: number;\n maxSheets?: number;\n format?: \"jpg\" | \"png\" | \"webp\";\n quality?: number;\n };\n image?: {\n width?: number;\n height?: number;\n mode?: \"fit\" | \"fill\" | \"cover\" | \"contain\";\n format?: \"jpg\" | \"png\" | \"webp\" | \"avif\";\n quality?: number;\n maxBytes?: number;\n minQuality?: number;\n };\n audiogram?: {\n artworkSource: string;\n captionsSource?: string;\n layout?: \"square\" | \"portrait\" | \"landscape\";\n artworkFit?: \"contain\" | \"cover\" | \"blurred_background\";\n backgroundColor?: string;\n waveformColor?: string;\n waveformGain?: number;\n startTimeSec?: number;\n durationSec?: number;\n fps?: number;\n burnCaptions?: boolean;\n captionPosition?: \"top\" | \"bottom\";\n captionFontScale?: number;\n normalizeAudio?: boolean;\n loudnessTargetLufs?: number;\n };\n privacyRedaction?: {\n detectors: Array<\"face\" | \"license_plate\" | \"text\">;\n style?: \"blur\" | \"pixelate\" | \"solid\";\n failureMode?: \"fail_closed\" | \"report_only\";\n minConfidence?: number;\n sampleIntervalSec?: number;\n maxFrames?: number;\n boxPaddingRatio?: number;\n solidColor?: string;\n pixelBlockSize?: number;\n privacyStrength?: \"standard\" | \"strong\";\n includeDebugObservations?: boolean;\n };\n}\n\nfunction optionValue(args: string[], index: number, option: string): string {\n const value = args[index + 1];\n if (!value || value.startsWith(\"--\")) throw new UsageError(`${option} requires a value`);\n return value;\n}\n\nfunction parseMetadata(value: string): Metadata {\n let parsed: unknown;\n try {\n parsed = JSON.parse(value) as unknown;\n } catch {\n throw new UsageError(\"--metadata must be a valid JSON object\");\n }\n if (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new UsageError(\"--metadata must be a JSON object\");\n }\n return parsed as Metadata;\n}\n\nfunction boundedNumber(\n args: string[],\n index: number,\n option: string,\n minimum: number,\n maximum: number,\n integer = false,\n): number {\n const value = Number(optionValue(args, index, option));\n if (!Number.isFinite(value) || value < minimum || value > maximum || (integer && !Number.isInteger(value))) {\n throw new UsageError(`${option} must be ${integer ? \"an integer \" : \"\"}between ${minimum} and ${maximum}`);\n }\n return value;\n}\n\nfunction hexColor(args: string[], index: number, option: string): string {\n const value = optionValue(args, index, option);\n if (!/^#[0-9A-Fa-f]{6}$/.test(value)) {\n throw new UsageError(`${option} must be a six-digit hex colour such as #5B5CFF`);\n }\n return value;\n}\n\nfunction parseRunOptions(args: string[]): RunOptions {\n let source: string | undefined;\n const outputs: RunOptions[\"outputs\"] = [];\n let metadata: Metadata | undefined;\n let recipe: string | undefined;\n let idempotencyKey: string | undefined;\n let wait = false;\n let timeoutMs: number | undefined;\n let download: string | undefined;\n let force = false;\n let json = false;\n const animation: NonNullable<RunOptions[\"animation\"]> = {};\n const placeholders: NonNullable<RunOptions[\"placeholders\"]> = {};\n const contactSheet: NonNullable<RunOptions[\"contactSheet\"]> = {};\n const image: NonNullable<RunOptions[\"image\"]> = {};\n const audiogram: Partial<NonNullable<RunOptions[\"audiogram\"]>> = {};\n const privacyRedaction: Partial<NonNullable<RunOptions[\"privacyRedaction\"]>> = {};\n const privacyDetectors: Array<\"face\" | \"license_plate\" | \"text\"> = [];\n\n for (let index = 0; index < args.length; index += 1) {\n const argument = args[index];\n if (argument === \"--output\" || argument === \"-o\") {\n outputs.push({ kind: \"alias\", value: optionValue(args, index, argument) });\n index += 1;\n } else if (argument === \"--preset\") {\n outputs.push({ kind: \"preset\", value: optionValue(args, index, argument) });\n index += 1;\n } else if (argument === \"--recipe\") {\n recipe = optionValue(args, index, argument);\n index += 1;\n } else if (argument === \"--metadata\") {\n metadata = parseMetadata(optionValue(args, index, argument));\n index += 1;\n } else if (argument === \"--idempotency-key\") {\n idempotencyKey = optionValue(args, index, argument);\n index += 1;\n } else if (argument === \"--wait\") {\n wait = true;\n } else if (argument === \"--timeout-ms\") {\n const value = Number(optionValue(args, index, argument));\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new UsageError(\"--timeout-ms must be a positive integer\");\n }\n timeoutMs = value;\n index += 1;\n } else if (argument === \"--download\") {\n download = optionValue(args, index, argument);\n wait = true;\n index += 1;\n } else if (argument === \"--force\") {\n force = true;\n } else if (argument === \"--json\") {\n json = true;\n } else if (argument === \"--animation-width\") {\n animation.width = boundedNumber(args, index, argument, 1, 1920, true);\n index += 1;\n } else if (argument === \"--animation-fps\") {\n animation.fps = boundedNumber(args, index, argument, 0.01, 30);\n index += 1;\n } else if (argument === \"--animation-start\") {\n animation.startTime = boundedNumber(args, index, argument, 0, 604800);\n index += 1;\n } else if (argument === \"--animation-duration\") {\n animation.duration = boundedNumber(args, index, argument, 0.01, 30);\n index += 1;\n } else if (argument === \"--animation-loop\") {\n animation.loop = boundedNumber(args, index, argument, 0, 65535, true);\n index += 1;\n } else if (argument === \"--animation-quality\") {\n animation.quality = boundedNumber(args, index, argument, 1, 100, true);\n index += 1;\n } else if (argument === \"--placeholder-max-dimension\") {\n placeholders.maxDimension = boundedNumber(args, index, argument, 8, 100, true);\n index += 1;\n } else if (argument === \"--placeholder-time\") {\n placeholders.sourceTimeSec = boundedNumber(args, index, argument, 0, 604800);\n index += 1;\n } else if (argument === \"--lqip-quality\") {\n placeholders.lqipQuality = boundedNumber(args, index, argument, 1, 100, true);\n index += 1;\n } else if (argument === \"--lqip-max-bytes\") {\n placeholders.lqipMaxBytes = boundedNumber(args, index, argument, 256, 16384, true);\n index += 1;\n } else if (argument === \"--contact-columns\") {\n contactSheet.columns = boundedNumber(args, index, argument, 1, 10, true);\n index += 1;\n } else if (argument === \"--contact-rows\") {\n contactSheet.rows = boundedNumber(args, index, argument, 1, 10, true);\n index += 1;\n } else if (argument === \"--contact-tile-width\") {\n contactSheet.tileWidth = boundedNumber(args, index, argument, 64, 640, true);\n index += 1;\n } else if (argument === \"--contact-tile-height\") {\n contactSheet.tileHeight = boundedNumber(args, index, argument, 36, 640, true);\n index += 1;\n } else if (argument === \"--contact-interval\") {\n contactSheet.intervalSec = boundedNumber(args, index, argument, 0.5, 3600);\n index += 1;\n } else if (argument === \"--contact-start\") {\n contactSheet.startTimeSec = boundedNumber(args, index, argument, 0, 604800);\n index += 1;\n } else if (argument === \"--contact-duration\") {\n contactSheet.durationSec = boundedNumber(args, index, argument, 0, 21600);\n index += 1;\n } else if (argument === \"--contact-max-sheets\") {\n contactSheet.maxSheets = boundedNumber(args, index, argument, 1, 20, true);\n index += 1;\n } else if (argument === \"--contact-format\") {\n const value = optionValue(args, index, argument);\n if (value !== \"jpg\" && value !== \"png\" && value !== \"webp\") {\n throw new UsageError(\"--contact-format must be jpg, png, or webp\");\n }\n contactSheet.format = value;\n index += 1;\n } else if (argument === \"--contact-quality\") {\n contactSheet.quality = boundedNumber(args, index, argument, 1, 100, true);\n index += 1;\n } else if (argument === \"--image-width\") {\n image.width = boundedNumber(args, index, argument, 1, 16384, true);\n index += 1;\n } else if (argument === \"--image-height\") {\n image.height = boundedNumber(args, index, argument, 1, 16384, true);\n index += 1;\n } else if (argument === \"--image-mode\") {\n const value = optionValue(args, index, argument);\n if (value !== \"fit\" && value !== \"fill\" && value !== \"cover\" && value !== \"contain\") {\n throw new UsageError(\"--image-mode must be fit, fill, cover, or contain\");\n }\n image.mode = value;\n index += 1;\n } else if (argument === \"--image-format\") {\n const value = optionValue(args, index, argument);\n if (value !== \"jpg\" && value !== \"png\" && value !== \"webp\" && value !== \"avif\") {\n throw new UsageError(\"--image-format must be jpg, png, webp, or avif\");\n }\n image.format = value;\n index += 1;\n } else if (argument === \"--image-quality\") {\n image.quality = boundedNumber(args, index, argument, 1, 100, true);\n index += 1;\n } else if (argument === \"--image-max-bytes\") {\n image.maxBytes = boundedNumber(args, index, argument, 256, 100_000_000, true);\n index += 1;\n } else if (argument === \"--image-min-quality\") {\n image.minQuality = boundedNumber(args, index, argument, 1, 100, true);\n index += 1;\n } else if (argument === \"--audiogram-artwork\") {\n audiogram.artworkSource = optionValue(args, index, argument);\n index += 1;\n } else if (argument === \"--audiogram-captions\") {\n audiogram.captionsSource = optionValue(args, index, argument);\n audiogram.burnCaptions = true;\n index += 1;\n } else if (argument === \"--audiogram-layout\") {\n const value = optionValue(args, index, argument);\n if (value !== \"square\" && value !== \"portrait\" && value !== \"landscape\") {\n throw new UsageError(\"--audiogram-layout must be square, portrait, or landscape\");\n }\n audiogram.layout = value;\n index += 1;\n } else if (argument === \"--audiogram-background\") {\n audiogram.backgroundColor = hexColor(args, index, argument);\n index += 1;\n } else if (argument === \"--audiogram-waveform\") {\n audiogram.waveformColor = hexColor(args, index, argument);\n index += 1;\n } else if (argument === \"--audiogram-fit\") {\n const value = optionValue(args, index, argument);\n if (value !== \"contain\" && value !== \"cover\" && value !== \"blurred_background\") {\n throw new UsageError(\"--audiogram-fit must be contain, cover, or blurred_background\");\n }\n audiogram.artworkFit = value;\n index += 1;\n } else if (argument === \"--audiogram-waveform-gain\") {\n audiogram.waveformGain = boundedNumber(args, index, argument, 0.5, 4);\n index += 1;\n } else if (argument === \"--audiogram-caption-position\") {\n const value = optionValue(args, index, argument);\n if (value !== \"top\" && value !== \"bottom\") {\n throw new UsageError(\"--audiogram-caption-position must be top or bottom\");\n }\n audiogram.captionPosition = value;\n index += 1;\n } else if (argument === \"--audiogram-caption-scale\") {\n audiogram.captionFontScale = boundedNumber(args, index, argument, 0.75, 1.5);\n index += 1;\n } else if (argument === \"--audiogram-normalize\") {\n audiogram.normalizeAudio = true;\n } else if (argument === \"--audiogram-loudness-target\") {\n audiogram.loudnessTargetLufs = boundedNumber(args, index, argument, -24, -12);\n index += 1;\n } else if (argument === \"--audiogram-start\") {\n audiogram.startTimeSec = boundedNumber(args, index, argument, 0, 604800);\n index += 1;\n } else if (argument === \"--audiogram-duration\") {\n audiogram.durationSec = boundedNumber(args, index, argument, 0.1, 300);\n index += 1;\n } else if (argument === \"--audiogram-fps\") {\n audiogram.fps = boundedNumber(args, index, argument, 15, 30, true);\n index += 1;\n } else if (argument === \"--privacy-detector\") {\n const value = optionValue(args, index, argument);\n if (value !== \"face\" && value !== \"license_plate\" && value !== \"text\") {\n throw new UsageError(\"--privacy-detector must be face, license_plate, or text\");\n }\n if (privacyDetectors.includes(value)) {\n throw new UsageError(`Duplicate --privacy-detector: ${value}`);\n }\n privacyDetectors.push(value);\n index += 1;\n } else if (argument === \"--privacy-style\") {\n const value = optionValue(args, index, argument);\n if (value !== \"blur\" && value !== \"pixelate\" && value !== \"solid\") {\n throw new UsageError(\"--privacy-style must be blur, pixelate, or solid\");\n }\n privacyRedaction.style = value;\n index += 1;\n } else if (argument === \"--privacy-failure-mode\") {\n const value = optionValue(args, index, argument);\n if (value !== \"fail_closed\" && value !== \"report_only\") {\n throw new UsageError(\"--privacy-failure-mode must be fail_closed or report_only\");\n }\n privacyRedaction.failureMode = value;\n index += 1;\n } else if (argument === \"--privacy-min-confidence\") {\n privacyRedaction.minConfidence = boundedNumber(args, index, argument, 0.3, 0.99);\n index += 1;\n } else if (argument === \"--privacy-sample-interval\") {\n privacyRedaction.sampleIntervalSec = boundedNumber(args, index, argument, 0.1, 30);\n index += 1;\n } else if (argument === \"--privacy-max-frames\") {\n privacyRedaction.maxFrames = boundedNumber(args, index, argument, 1, 18000, true);\n index += 1;\n } else if (argument === \"--privacy-padding\") {\n privacyRedaction.boxPaddingRatio = boundedNumber(args, index, argument, 0, 0.5);\n index += 1;\n } else if (argument === \"--privacy-solid-color\") {\n privacyRedaction.solidColor = hexColor(args, index, argument);\n index += 1;\n } else if (argument === \"--privacy-pixel-block-size\") {\n privacyRedaction.pixelBlockSize = boundedNumber(args, index, argument, 4, 128, true);\n index += 1;\n } else if (argument === \"--privacy-strength\") {\n const value = optionValue(args, index, argument);\n if (value !== \"standard\" && value !== \"strong\") {\n throw new UsageError(\"--privacy-strength must be standard or strong\");\n }\n privacyRedaction.privacyStrength = value;\n index += 1;\n } else if (argument === \"--privacy-debug-observations\") {\n privacyRedaction.includeDebugObservations = true;\n } else if (argument?.startsWith(\"-\")) {\n throw new UsageError(`Unknown run option: ${argument}`);\n } else if (source === undefined) {\n source = argument;\n } else {\n throw new UsageError(\"run accepts exactly one source\");\n }\n }\n\n if (!source) {\n throw new UsageError(\"Usage: mediaruntime run <source> (--recipe <name[@version]> | --output <alias> | --preset <name>) [--wait]\");\n }\n if (recipe && outputs.length > 0) throw new UsageError(\"--recipe cannot be combined with --output or --preset\");\n if (!recipe && outputs.length === 0) throw new UsageError(\"run requires --recipe or at least one --output or --preset\");\n const unsupported = outputs.find(\n (output) => output.kind === \"alias\" && !OUTPUT_ALIASES.has(output.value),\n );\n if (unsupported) throw new UsageError(`Unsupported output alias: ${unsupported.value}`);\n if (force && !download) throw new UsageError(\"--force requires --download\");\n if (timeoutMs !== undefined && !wait) throw new UsageError(\"--timeout-ms requires --wait or --download\");\n const hasAnimationOptions = Object.keys(animation).length > 0;\n if (hasAnimationOptions) {\n const animationSelections = outputs.filter(\n (output) => output.kind === \"preset\" &&\n (output.value === \"image_animated_webp_v1\" || output.value === \"image_animated_apng_v1\"),\n );\n if (recipe || outputs.length !== 1 || animationSelections.length !== 1) {\n throw new UsageError(\"animation options require exactly one animated WebP or APNG --preset\");\n }\n if (animation.quality !== undefined && animationSelections[0]?.value === \"image_animated_apng_v1\") {\n throw new UsageError(\"--animation-quality applies to animated WebP only; APNG is lossless\");\n }\n }\n const hasPlaceholderOptions = Object.keys(placeholders).length > 0;\n if (hasPlaceholderOptions) {\n const placeholderSelections = outputs.filter(\n (output) => output.kind === \"preset\" && output.value === \"image_placeholders_v1\",\n );\n if (recipe || outputs.length !== 1 || placeholderSelections.length !== 1) {\n throw new UsageError(\"placeholder options require exactly one image_placeholders_v1 --preset\");\n }\n }\n const hasContactSheetOptions = Object.keys(contactSheet).length > 0;\n if (hasContactSheetOptions) {\n const selections = outputs.filter(\n (output) => output.kind === \"preset\" && output.value === \"contact_sheet_v1\",\n );\n if (recipe || outputs.length !== 1 || selections.length !== 1) {\n throw new UsageError(\"contact-sheet options require exactly one contact_sheet_v1 --preset\");\n }\n const geometry = {\n columns: 4,\n rows: 4,\n tileWidth: 320,\n tileHeight: 180,\n ...contactSheet,\n };\n if (geometry.columns * geometry.tileWidth > 4096 || geometry.rows * geometry.tileHeight > 4096) {\n throw new UsageError(\"contact-sheet width and height must each be at most 4096 pixels\");\n }\n if (contactSheet.format === \"png\" && contactSheet.quality !== undefined) {\n throw new UsageError(\"--contact-quality applies to JPG and WebP only; PNG is lossless\");\n }\n }\n const hasImageOptions = Object.keys(image).length > 0;\n if (hasImageOptions) {\n const selections = outputs.filter(\n (output) => output.kind === \"preset\" && output.value === \"image_multi_v1\",\n );\n if (recipe || outputs.length !== 1 || selections.length !== 1) {\n throw new UsageError(\"image rendition options require exactly one image_multi_v1 --preset\");\n }\n if (image.minQuality !== undefined && image.maxBytes === undefined) {\n throw new UsageError(\"--image-min-quality requires --image-max-bytes\");\n }\n const quality = image.quality ?? 80;\n if ((image.minQuality ?? 1) > quality) {\n throw new UsageError(\"--image-min-quality must not exceed --image-quality\");\n }\n const format = image.format ?? \"webp\";\n if (image.maxBytes !== undefined && format !== \"jpg\" && format !== \"webp\") {\n throw new UsageError(\"--image-max-bytes currently supports --image-format jpg or webp only\");\n }\n }\n const audiogramSelections = outputs.filter(\n (output) => output.kind === \"preset\" && output.value === \"audiogram_v1\",\n );\n const hasAudiogramOptions = Object.keys(audiogram).length > 0;\n if (hasAudiogramOptions || audiogramSelections.length > 0) {\n if (recipe || outputs.length !== 1 || audiogramSelections.length !== 1) {\n throw new UsageError(\"audiogram options require exactly one audiogram_v1 --preset\");\n }\n if (!audiogram.artworkSource) {\n throw new UsageError(\"audiogram_v1 requires --audiogram-artwork <PNG|JPEG|WebP source>\");\n }\n }\n const hasPrivacyOptions = privacyDetectors.length > 0 || Object.keys(privacyRedaction).length > 0;\n if (hasPrivacyOptions) {\n if (recipe) throw new UsageError(\"privacy-redaction options cannot be combined with --recipe\");\n if (privacyDetectors.length === 0) {\n throw new UsageError(\"privacy redaction requires at least one --privacy-detector\");\n }\n if (/\\.(?:mp4|mov|mkv|webm|gif|apng)(?:$|[?#])/i.test(source)) {\n throw new UsageError(\n \"privacy redaction Preview accepts still-image inputs only; video and animated images are not available\",\n );\n }\n privacyRedaction.detectors = privacyDetectors;\n }\n return {\n source,\n outputs,\n ...(recipe === undefined ? {} : { recipe }),\n ...(metadata === undefined ? {} : { metadata }),\n ...(idempotencyKey === undefined ? {} : { idempotencyKey }),\n wait,\n ...(timeoutMs === undefined ? {} : { timeoutMs }),\n ...(download === undefined ? {} : { download }),\n force,\n json,\n ...(hasAnimationOptions ? { animation } : {}),\n ...(hasPlaceholderOptions ? { placeholders } : {}),\n ...(hasContactSheetOptions ? { contactSheet } : {}),\n ...(hasImageOptions ? { image } : {}),\n ...(hasAudiogramOptions || audiogramSelections.length > 0\n ? { audiogram: audiogram as NonNullable<RunOptions[\"audiogram\"]> }\n : {}),\n ...(hasPrivacyOptions\n ? { privacyRedaction: privacyRedaction as NonNullable<RunOptions[\"privacyRedaction\"]> }\n : {}),\n };\n}\n\nfunction isHostedAsset(source: string): boolean {\n return /^(?:https?|gs):\\/\\//i.test(source);\n}\n\nasync function resolveAudiogramAsset(\n source: string,\n label: \"artwork\" | \"captions\",\n uploads?: RunUploadsClient,\n): Promise<string> {\n if (isHostedAsset(source)) return source;\n if (/^[a-z][a-z0-9+.-]*:/i.test(source) && !/^file:\\/\\//i.test(source)) {\n throw new UsageError(`Audiogram ${label} must be an HTTP(S) URL, gs:// URI, or local file path`);\n }\n if (!uploads) {\n throw new UsageError(`This client cannot upload local Audiogram ${label}; use an HTTP(S) URL or gs:// URI`);\n }\n // Upload local artwork/captions through the SDK before embedding their private source URI.\n return await uploads.resolveSource(source);\n}\n\nasync function resolveAudiogram(\n value: NonNullable<RunOptions[\"audiogram\"]>,\n uploads?: RunUploadsClient,\n): Promise<NonNullable<RunOptions[\"audiogram\"]>> {\n const artworkSource = await resolveAudiogramAsset(value.artworkSource, \"artwork\", uploads);\n const captionsSource = value.captionsSource === undefined\n ? undefined\n : await resolveAudiogramAsset(value.captionsSource, \"captions\", uploads);\n return {\n ...value,\n artworkSource,\n ...(captionsSource === undefined ? {} : { captionsSource, burnCaptions: true }),\n };\n}\n\nasync function resolveOutputs(\n selections: RunOptions[\"outputs\"],\n capabilitiesClient: CapabilitiesReadClient,\n animation?: RunOptions[\"animation\"],\n placeholders?: RunOptions[\"placeholders\"],\n contactSheet?: RunOptions[\"contactSheet\"],\n image?: RunOptions[\"image\"],\n audiogram?: RunOptions[\"audiogram\"],\n privacyRedaction?: RunOptions[\"privacyRedaction\"],\n): Promise<Array<OutputAlias | JobOutput>> {\n // Plain aliases need no expansion; preset-specific options require authoritative metadata.\n if (!privacyRedaction && !selections.some((selection) => selection.kind === \"preset\")) {\n return selections.map((selection) => selection.value as OutputAlias);\n }\n const capabilities: Capabilities = await capabilitiesClient.retrieve();\n const publicPresets = new Set(capabilities.publicPresets);\n return selections.map((selection) => {\n if (selection.kind === \"alias\" && !privacyRedaction) {\n return selection.value as OutputAlias;\n }\n const selectedName = selection.kind === \"alias\"\n ? capabilities.outputAliases[selection.value]?.preset\n : selection.value;\n const preset = selectedName ? capabilities.presets[selectedName] : undefined;\n if (!selectedName || !publicPresets.has(selectedName) || !preset) {\n throw new UsageError(selection.kind === \"alias\"\n ? `Gateway did not provide a public expansion for alias: ${selection.value}`\n : `Unknown or non-public preset: ${selection.value}`);\n }\n if (privacyRedaction && preset.outputType !== \"image\") {\n throw new UsageError(\n \"privacy redaction Preview can be attached to image outputs only\",\n );\n }\n const output = { type: preset.outputType, preset: selectedName } as JobOutput & {\n animation?: RunOptions[\"animation\"];\n placeholders?: RunOptions[\"placeholders\"];\n contactSheet?: RunOptions[\"contactSheet\"];\n images?: Array<{\n width: number;\n height: number;\n mode: \"fit\" | \"fill\" | \"cover\" | \"contain\";\n format: \"jpg\" | \"png\" | \"webp\" | \"avif\";\n quality: number;\n maxBytes?: number;\n minQuality?: number;\n }>;\n audiogram?: RunOptions[\"audiogram\"];\n privacyRedaction?: RunOptions[\"privacyRedaction\"];\n };\n if (animation) output.animation = animation;\n if (placeholders) output.placeholders = placeholders;\n if (contactSheet) output.contactSheet = contactSheet;\n if (image) {\n output.images = [{\n width: image.width ?? 1280,\n height: image.height ?? 720,\n mode: image.mode ?? \"fit\",\n format: image.format ?? \"webp\",\n quality: image.quality ?? 80,\n ...(image.maxBytes === undefined ? {} : { maxBytes: image.maxBytes }),\n ...(image.maxBytes === undefined ? {} : { minQuality: image.minQuality ?? 1 }),\n }];\n }\n if (audiogram) output.audiogram = audiogram;\n if (privacyRedaction) output.privacyRedaction = privacyRedaction;\n return output;\n });\n}\n\nfunction receiptProjection(job: SubmittedJob): JobReceiptData {\n return {\n id: job.id,\n status: job.status,\n tier: job.tier,\n requiredTier: job.requiredTier,\n outputs: job.outputs,\n recipe: job.recipe,\n message: job.message,\n };\n}\n\nfunction detailsProjection(job: JobDetails): Record<string, unknown> {\n // Redact the signed bundle URL from --json; expose only lifecycle and integrity metadata.\n return {\n id: job.id,\n status: job.status,\n tier: job.tier,\n usage: job.usage,\n billing: job.billing,\n bundle: {\n available: job.bundle.available,\n expiresAt: job.bundle.expiresAt,\n sizeBytes: job.bundle.sizeBytes,\n sha256: job.bundle.sha256,\n retentionDays: job.bundle.retentionDays,\n },\n media: job.media,\n recipe: job.recipe,\n metadata: job.metadata,\n error: job.error,\n createdAt: job.createdAt,\n updatedAt: job.updatedAt,\n startedAt: job.startedAt,\n completedAt: job.completedAt,\n };\n}\n\nfunction writeHumanReceipt(job: SubmittedJob, write: (text: string) => void): void {\n write(`Job: ${job.id}\\nStatus: ${job.status}\\nTier: ${job.tier || \"-\"}\\n`);\n}\n\nfunction writeHumanDetails(job: JobDetails, write: (text: string) => void): void {\n const error = job.error ? `\\nError: ${job.error}` : \"\";\n write(\n `Job: ${job.id}\\nStatus: ${job.status}\\n` +\n `Bundle: ${job.bundle.available ? \"available\" : \"unavailable\"}${error}\\n`,\n );\n}\n\nexport async function runCommand(\n args: string[],\n dependencies: RunCommandDependencies,\n): Promise<number> {\n const options = parseRunOptions(args);\n const hasLocalAudiogramAsset = options.audiogram !== undefined &&\n (!isHostedAsset(options.audiogram.artworkSource) ||\n (options.audiogram.captionsSource !== undefined && !isHostedAsset(options.audiogram.captionsSource)));\n const isLocalSource = !isHostedAsset(options.source);\n dependencies.activity.start(\n isLocalSource || hasLocalAudiogramAsset\n ? \"Uploading local media and creating job…\"\n : \"Creating job…\",\n );\n\n try {\n // Auxiliary local files are resolved first so the submitted job contains durable sources.\n const audiogram = options.audiogram === undefined\n ? undefined\n : await resolveAudiogram(options.audiogram, dependencies.uploads);\n const outputs = options.recipe\n ? undefined\n : await resolveOutputs(\n options.outputs,\n dependencies.capabilities,\n options.animation,\n options.placeholders,\n options.contactSheet,\n options.image,\n audiogram,\n options.privacyRedaction,\n );\n const params: CreateJobParams = {\n source: options.source,\n ...(outputs === undefined ? {} : { outputs }),\n ...(options.recipe === undefined ? {} : { recipe: options.recipe }),\n ...(options.metadata === undefined ? {} : { metadata: options.metadata }),\n ...(options.idempotencyKey === undefined ? {} : { idempotencyKey: options.idempotencyKey }),\n };\n const submitted = await dependencies.jobs.create(params);\n\n if (!options.wait) {\n // Submission-only mode returns immediately; production services should prefer webhooks.\n dependencies.activity.stop();\n if (options.json) dependencies.writeStdout(`${JSON.stringify(receiptProjection(submitted))}\\n`);\n else writeHumanReceipt(submitted, dependencies.writeStdout);\n return UNSUCCESSFUL_TERMINAL_STATUSES.has(String(submitted.status).toUpperCase()) ? 6 : 0;\n }\n\n dependencies.activity.update(`Waiting for job ${submitted.id} to complete…`);\n const details = await submitted.wait(\n options.timeoutMs === undefined ? {} : { timeoutMs: options.timeoutMs },\n );\n if (String(details.status).toUpperCase() !== \"COMPLETED\") {\n dependencies.activity.stop();\n if (!options.json) writeHumanDetails(details, dependencies.writeStdout);\n if (options.json) dependencies.writeStdout(`${JSON.stringify(detailsProjection(details))}\\n`);\n return 6;\n }\n if (options.download) {\n const url = details.bundle.downloadUrl;\n if (!details.bundle.available || !url) {\n throw new BundleDownloadError(\"Completed job does not have an available canonical bundle\");\n }\n dependencies.activity.update(\"Downloading and verifying ZIP bundle…\");\n try {\n await dependencies.downloadBundle(url, options.download, {\n force: options.force,\n expectedSizeBytes: details.bundle.sizeBytes,\n expectedSha256: details.bundle.sha256,\n });\n } catch (error) {\n if (error instanceof BundleDownloadError) throw error;\n throw new BundleDownloadError(`Could not download bundle to ${options.download}`, { cause: error });\n }\n }\n dependencies.activity.stop();\n if (!options.json) {\n writeHumanDetails(details, dependencies.writeStdout);\n if (options.download) dependencies.writeStdout(`Downloaded bundle to ${options.download}\\n`);\n }\n if (options.json) dependencies.writeStdout(`${JSON.stringify(detailsProjection(details))}\\n`);\n return 0;\n } finally {\n dependencies.activity.stop();\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport type {\n CreateRecipeParams,\n CreateRecipeVersionParams,\n HostedRecipe,\n} from \"@mediaruntime/node\";\nimport { UsageError } from \"../errors.js\";\n\nexport interface RecipesClient {\n list(): Promise<HostedRecipe[]>;\n get(name: string, options?: { version?: number }): Promise<HostedRecipe>;\n create(params: CreateRecipeParams): Promise<HostedRecipe>;\n createVersion(name: string, params: CreateRecipeVersionParams): Promise<HostedRecipe>;\n archive(name: string): Promise<void>;\n}\n\nexport interface RecipesCommandDependencies {\n recipes: RecipesClient;\n writeStdout(text: string): void;\n}\n\nfunction optionValue(args: string[], index: number, option: string): string {\n const value = args[index + 1];\n if (!value || value.startsWith(\"--\")) throw new UsageError(`${option} requires a value`);\n return value;\n}\n\nfunction positiveInteger(value: string, option: string): number {\n const parsed = Number(value);\n if (!Number.isSafeInteger(parsed) || parsed < 1) {\n throw new UsageError(`${option} must be a positive integer`);\n }\n return parsed;\n}\n\nasync function recipeFile(path: string): Promise<Record<string, unknown>> {\n let raw: string;\n try {\n raw = await readFile(path, \"utf8\");\n } catch (error) {\n throw new UsageError(`Could not read recipe file: ${path}`, { cause: error });\n }\n try {\n // Perform only structural parsing here; the gateway remains authoritative for templates.\n const parsed = JSON.parse(raw) as unknown;\n if (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed)) throw new Error();\n return parsed as Record<string, unknown>;\n } catch {\n throw new UsageError(\"Recipe file must contain one JSON object\");\n }\n}\n\nfunction humanRecipe(recipe: HostedRecipe): string {\n const kind = recipe.builtIn ? \"built-in\" : \"custom\";\n return `${recipe.reference}\\n${recipe.description || \"No description\"}\\nType: ${kind}\\nStatus: ${recipe.status}\\n`;\n}\n\nfunction humanList(recipes: HostedRecipe[]): string {\n const headings = [\"REFERENCE\", \"TYPE\", \"DESCRIPTION\"];\n const rows = recipes.map((recipe) => [\n recipe.reference,\n recipe.builtIn ? \"built-in\" : \"custom\",\n recipe.description || \"-\",\n ]);\n const widths = headings.map((heading, index) =>\n Math.max(heading.length, ...rows.map((row) => row[index]?.length ?? 0)),\n );\n const render = (row: string[]): string =>\n row.map((value, index) => value.padEnd(widths[index] ?? value.length)).join(\" \").trimEnd();\n return `${[render(headings), render(widths.map((width) => \"-\".repeat(width))), ...rows.map(render)].join(\"\\n\")}\\n`;\n}\n\nfunction output(recipe: HostedRecipe, json: boolean, write: (text: string) => void): void {\n write(json ? `${JSON.stringify(recipe)}\\n` : humanRecipe(recipe));\n}\n\nexport async function runRecipesCommand(\n args: string[],\n dependencies: RecipesCommandDependencies,\n): Promise<number> {\n const subcommand = args[0];\n const rest = args.slice(1);\n const json = rest.includes(\"--json\");\n\n if (subcommand === \"list\") {\n if (rest.some((value) => value !== \"--json\")) throw new UsageError(\"Usage: mediaruntime recipes list [--json]\");\n const recipes = await dependencies.recipes.list();\n dependencies.writeStdout(json ? `${JSON.stringify({ recipes })}\\n` : humanList(recipes));\n return 0;\n }\n\n if (subcommand === \"get\") {\n let name: string | undefined;\n let version: number | undefined;\n for (let index = 0; index < rest.length; index += 1) {\n const value = rest[index];\n if (value === \"--version\") {\n version = positiveInteger(optionValue(rest, index, value), value);\n index += 1;\n } else if (value !== \"--json\" && !name) name = value;\n else if (value !== \"--json\") throw new UsageError(\"recipes get accepts one name\");\n }\n if (!name) throw new UsageError(\"Usage: mediaruntime recipes get <name> [--version <n>]\");\n output(await dependencies.recipes.get(name, version ? { version } : {}), json, dependencies.writeStdout);\n return 0;\n }\n\n if (subcommand === \"create\") {\n let file: string | undefined;\n for (let index = 0; index < rest.length; index += 1) {\n if (rest[index] === \"--file\") {\n file = optionValue(rest, index, \"--file\");\n index += 1;\n } else if (rest[index] !== \"--json\") throw new UsageError(`Unknown recipes create option: ${rest[index]}`);\n }\n if (!file) throw new UsageError(\"Usage: mediaruntime recipes create --file <recipe.json>\");\n const value = await recipeFile(file);\n if (typeof value.name !== \"string\" || typeof value.template !== \"object\") {\n throw new UsageError(\"Recipe JSON requires name and template\");\n }\n output(await dependencies.recipes.create(value as unknown as CreateRecipeParams), json, dependencies.writeStdout);\n return 0;\n }\n\n if (subcommand === \"version\") {\n let name: string | undefined;\n let file: string | undefined;\n let expected: number | undefined;\n for (let index = 0; index < rest.length; index += 1) {\n const value = rest[index];\n if (value === \"--file\") {\n file = optionValue(rest, index, value);\n index += 1;\n } else if (value === \"--expected\") {\n expected = positiveInteger(optionValue(rest, index, value), value);\n index += 1;\n } else if (value !== \"--json\" && !name) name = value;\n else if (value !== \"--json\") throw new UsageError(`Unknown recipes version option: ${value}`);\n }\n if (!name || !file || !expected) {\n throw new UsageError(\"Usage: mediaruntime recipes version <name> --file <recipe.json> --expected <n>\");\n }\n const value = await recipeFile(file);\n const template = value.template ?? value;\n output(await dependencies.recipes.createVersion(name, {\n // Optimistic concurrency prevents two maintainers from replacing the same latest version.\n expectedLatestVersion: expected,\n ...(typeof value.description === \"string\" ? { description: value.description } : {}),\n template: template as CreateRecipeVersionParams[\"template\"],\n }), json, dependencies.writeStdout);\n return 0;\n }\n\n if (subcommand === \"archive\") {\n const values = rest.filter((value) => value !== \"--json\");\n if (values.length !== 1) throw new UsageError(\"Usage: mediaruntime recipes archive <name>\");\n await dependencies.recipes.archive(values[0] ?? \"\");\n dependencies.writeStdout(json\n ? `${JSON.stringify({ name: values[0], status: \"archived\" })}\\n`\n : `Archived recipe ${values[0]}\\n`);\n return 0;\n }\n\n throw new UsageError(\"Usage: mediaruntime recipes <list|get|create|version|archive>\");\n}\n","import { UsageError } from \"../errors.js\";\n\n// Keep the command layer structurally typed so it remains a thin adapter over the\n// SDK while tests can supply small clients without constructing an HTTP transport.\nexport interface StickerCollectionRecord {\n collectionId: string;\n name: string;\n description: string;\n status: \"active\" | \"archived\";\n packs: StickerPackBinding[];\n createdAt: string;\n archivedAt: string | null;\n updatedAt: string;\n}\n\nexport interface StickerPackBinding {\n bindingId: string;\n collectionId: string;\n activationId: string;\n packId: string;\n packName: string;\n packVersion: string;\n status: \"enabled\" | \"disabled\";\n historicalAccess: \"preserve\" | \"revoke\";\n updatedAt: string | null;\n}\n\nexport interface RuntimeStickerRecord {\n stickerId: string;\n packId: string;\n label: string;\n emoji: string | null;\n category: string | null;\n animated: boolean;\n variants: Array<{ name: string; bytes: number }>;\n score?: number;\n}\n\nexport interface RuntimeStickerPackRecord {\n packId: string;\n name: string;\n version: string;\n assetCount: number;\n animated: boolean;\n}\n\nexport interface StickerRuntimeReadClient {\n listPacks(): Promise<RuntimeStickerPackRecord[]>;\n search(query: string, options?: {\n packId?: string;\n category?: string;\n animated?: boolean;\n limit?: number;\n }): Promise<{ query: string; items: RuntimeStickerRecord[]; total: number }>;\n typeahead(query: string, options?: {\n packId?: string;\n locale?: string;\n limit?: number;\n }): Promise<{ query: string; locale: string; suggestions: Array<{ text: string; assetCount: number }> }>;\n retrieve(stickerId: string): Promise<RuntimeStickerRecord>;\n resolve(stickerId: string, variant: string): Promise<Record<string, unknown>>;\n}\n\nexport interface HostedStickersCommandClient {\n listCollections(options?: { includeArchived?: boolean }): Promise<{ items: StickerCollectionRecord[]; total: number }>;\n createCollection(params: { name: string; description?: string | null }): Promise<StickerCollectionRecord>;\n getCollection(collectionId: string): Promise<StickerCollectionRecord>;\n updateCollection(\n collectionId: string,\n params: { name?: string; description?: string | null; status?: \"active\" | \"archived\" },\n ): Promise<StickerCollectionRecord>;\n archiveCollection(collectionId: string): Promise<StickerCollectionRecord>;\n listCollectionPacks(collectionId: string): Promise<{ items: StickerPackBinding[]; total: number }>;\n addCollectionPack(collectionId: string, params: { activationId: string }): Promise<StickerPackBinding>;\n enableCollectionPack(collectionId: string, packId: string): Promise<StickerPackBinding>;\n disableCollectionPack(collectionId: string, packId: string): Promise<StickerPackBinding>;\n collection(collectionId: string): StickerRuntimeReadClient;\n usage(): Promise<Record<string, unknown>>;\n createClientToken(params: {\n collectionId: string;\n expiresInSeconds?: number;\n scopes?: string[];\n }): Promise<Record<string, unknown>>;\n}\n\nexport interface StickersCommandDependencies {\n hosted?: HostedStickersCommandClient;\n runtime?(collectionId: string): StickerRuntimeReadClient;\n writeStdout(text: string): void;\n}\n\nconst COLLECTION_PATTERN = /^stc_[0-9a-f]{32}$/;\nconst TOKEN_SCOPES = new Set([\"packs:read\", \"stickers:search\", \"stickers:read\", \"assets:resolve\"]);\nconst STICKER_VARIANTS = new Set([\n \"animated\",\n \"reduced_motion\",\n \"small_80\",\n \"small_100\",\n \"small_160\",\n \"thumbnail\",\n]);\n\n// Keep the complete subtree discoverable without requiring a credential or network request.\nexport const STICKERS_HELP = `MediaRuntime Hosted Sticker Runtime\n\nUsage:\n mediaruntime stickers collections list [--include-archived] [--json]\n mediaruntime stickers collections create --name <name> [--description <text>] [--json]\n mediaruntime stickers collections get <collection_id> [--json]\n mediaruntime stickers collections update <collection_id>\n [--name <name>] [--description <text> | --clear-description]\n [--status active|archived] [--json]\n mediaruntime stickers collections archive <collection_id> [--json]\n mediaruntime stickers collections packs list <collection_id> [--json]\n mediaruntime stickers collections packs enable <collection_id>\n (--pack <pack_id> | --activation <activation_id>) [--json]\n mediaruntime stickers collections packs disable <collection_id> --pack <pack_id> [--json]\n mediaruntime stickers packs list --collection <collection_id> [--json]\n mediaruntime stickers search <query> --collection <collection_id>\n [--pack <pack_id>] [--category <category>] [--animated | --static]\n [--limit <1..50>] [--json]\n mediaruntime stickers typeahead <prefix> --collection <collection_id>\n [--pack <pack_id>] [--locale <locale>] [--limit <1..20>] [--json]\n mediaruntime stickers get <sticker_id> --collection <collection_id> [--json]\n mediaruntime stickers resolve <sticker_id> --variant <name>\n --collection <collection_id> [--json]\n mediaruntime stickers usage [--json]\n mediaruntime stickers token create --collection <collection_id>\n [--expires-in <60..3600>] [--scope <scope>]... [--json]\n\nAuthentication:\n API key or secure browser login is the default and is required for management,\n pack binding, usage, and token issuance. MEDIARUNTIME_STICKER_CLIENT_TOKEN is\n accepted only for packs/search/typeahead/get/resolve runtime reads and must match\n the explicit --collection. Secrets are never accepted as command-line options.\n`;\n\nfunction optionValue(args: string[], index: number, option: string): string {\n // Reject a following option so misspelled or incomplete commands fail before an SDK call.\n const value = args[index + 1];\n if (value === undefined || value.startsWith(\"--\")) throw new UsageError(`${option} requires a value`);\n return value;\n}\n\nfunction collectionId(value: string | undefined): string {\n // Collection IDs are path-bearing input, so validate the complete server-issued grammar locally.\n if (!value || !COLLECTION_PATTERN.test(value)) {\n throw new UsageError(\"--collection must be a MediaRuntime sticker collection ID\");\n }\n return value;\n}\n\nfunction boundedInteger(raw: string, option: string, minimum: number, maximum: number): number {\n // Numeric bounds mirror the gateway contract and avoid surprising server-side coercion.\n const value = Number(raw);\n if (!Number.isSafeInteger(value) || value < minimum || value > maximum) {\n throw new UsageError(`${option} must be an integer between ${minimum} and ${maximum}`);\n }\n return value;\n}\n\nfunction output(value: unknown, json: boolean, writeStdout: (text: string) => void, human: string): void {\n // JSON stays compact for shell pipelines; human renderers provide a stable concise summary.\n writeStdout(json ? `${JSON.stringify(value)}\\n` : human);\n}\n\nfunction table(headings: string[], rows: string[][]): string {\n // Derive widths from actual cells so human output remains readable without terminal dependencies.\n const widths = headings.map((heading, index) =>\n Math.max(heading.length, ...rows.map((row) => row[index]?.length ?? 0))\n );\n const render = (row: string[]): string =>\n row.map((cell, index) => cell.padEnd(widths[index] ?? cell.length)).join(\" \").trimEnd();\n return `${[render(headings), render(widths.map((width) => \"-\".repeat(width))), ...rows.map(render)].join(\"\\n\")}\\n`;\n}\n\nfunction collectionTable(page: { items: StickerCollectionRecord[]; total: number }): string {\n // The list view emphasizes lifecycle and enabled-pack count rather than private workspace data.\n return table(\n [\"ID\", \"NAME\", \"STATUS\", \"PACKS\", \"UPDATED\"],\n page.items.map((item) => [\n item.collectionId,\n item.name,\n item.status,\n String(item.packs.length),\n item.updatedAt,\n ]),\n );\n}\n\nfunction bindingTable(page: { items: StickerPackBinding[]; total: number }): string {\n // Retained disabled bindings are visible here because this is an audit-oriented management view.\n return table(\n [\"PACK\", \"NAME\", \"VERSION\", \"STATUS\", \"HISTORICAL\", \"ACTIVATION\"],\n page.items.map((item) => [\n item.packId,\n item.packName,\n item.packVersion,\n item.status,\n item.historicalAccess,\n item.activationId,\n ]),\n );\n}\n\nfunction runtimePackTable(items: RuntimeStickerPackRecord[]): string {\n // Runtime pack discovery shows only packs currently eligible for new sticker use.\n return table(\n [\"PACK\", \"NAME\", \"VERSION\", \"STICKERS\", \"ANIMATED\"],\n items.map((item) => [\n item.packId,\n item.name,\n item.version,\n String(item.assetCount),\n item.animated ? \"yes\" : \"no\",\n ]),\n );\n}\n\nfunction stickerTable(items: RuntimeStickerRecord[]): string {\n // Search output keeps stable IDs prominent so callers can persist an exact reference.\n return table(\n [\"STICKER\", \"LABEL\", \"EMOJI\", \"CATEGORY\", \"ANIMATED\", \"VARIANTS\"],\n items.map((item) => [\n item.stickerId,\n item.label,\n item.emoji ?? \"-\",\n item.category ?? \"-\",\n item.animated ? \"yes\" : \"no\",\n item.variants.map((variant) => variant.name).join(\",\"),\n ]),\n );\n}\n\nfunction hostedClient(dependencies: StickersCommandDependencies): HostedStickersCommandClient {\n // Management, usage, and token issuance require the trusted API-key-backed SDK client.\n if (!dependencies.hosted) {\n throw new UsageError(\"This stickers command requires MEDIARUNTIME_API_KEY or mediaruntime login\");\n }\n return dependencies.hosted;\n}\n\nfunction runtimeClient(\n selectedCollectionId: string,\n dependencies: StickersCommandDependencies,\n): StickerRuntimeReadClient {\n // A scoped token client overrides the server client only for collection-bound read operations.\n if (dependencies.runtime) return dependencies.runtime(selectedCollectionId);\n return hostedClient(dependencies).collection(selectedCollectionId);\n}\n\nasync function collectionsCommand(\n args: string[],\n dependencies: StickersCommandDependencies,\n): Promise<number> {\n // Collection configuration remains under a dedicated subtree to distinguish it from runtime reads.\n const subcommand = args[0];\n const rest = args.slice(1);\n const client = hostedClient(dependencies);\n const json = rest.includes(\"--json\");\n\n if (subcommand === \"list\") {\n let includeArchived = false;\n for (const argument of rest) {\n if (argument === \"--include-archived\") includeArchived = true;\n else if (argument !== \"--json\") throw new UsageError(`Unknown stickers collections list option: ${argument}`);\n }\n const page = await client.listCollections({ includeArchived });\n output(page, json, dependencies.writeStdout, collectionTable(page));\n return 0;\n }\n\n if (subcommand === \"create\") {\n let name: string | undefined;\n let description: string | undefined;\n for (let index = 0; index < rest.length; index += 1) {\n const argument = rest[index];\n if (argument === \"--name\") {\n name = optionValue(rest, index, argument);\n index += 1;\n } else if (argument === \"--description\") {\n description = optionValue(rest, index, argument);\n index += 1;\n } else if (argument !== \"--json\") throw new UsageError(`Unknown stickers collections create option: ${argument}`);\n }\n if (!name) throw new UsageError(\"Usage: mediaruntime stickers collections create --name <name> [--description <text>]\");\n const created = await client.createCollection({ name, ...(description === undefined ? {} : { description }) });\n output(created, json, dependencies.writeStdout, `Created sticker collection ${created.collectionId} (${created.name})\\n`);\n return 0;\n }\n\n if (subcommand === \"get\" || subcommand === \"archive\") {\n const positional = rest.filter((argument) => argument !== \"--json\");\n if (positional.length !== 1) {\n throw new UsageError(`Usage: mediaruntime stickers collections ${subcommand} <collection_id>`);\n }\n const selected = collectionId(positional[0]);\n const result = subcommand === \"get\"\n ? await client.getCollection(selected)\n : await client.archiveCollection(selected);\n const human = subcommand === \"get\"\n ? `${result.name} (${result.collectionId})\\nStatus: ${result.status}\\nDescription: ${result.description || \"-\"}\\nEnabled packs: ${result.packs.length}\\n`\n : `Archived sticker collection ${result.collectionId}\\n`;\n output(result, json, dependencies.writeStdout, human);\n return 0;\n }\n\n if (subcommand === \"update\") {\n let selected: string | undefined;\n let name: string | undefined;\n let description: string | null | undefined;\n let status: \"active\" | \"archived\" | undefined;\n for (let index = 0; index < rest.length; index += 1) {\n const argument = rest[index];\n if (argument === \"--name\") {\n name = optionValue(rest, index, argument);\n index += 1;\n } else if (argument === \"--description\") {\n description = optionValue(rest, index, argument);\n index += 1;\n } else if (argument === \"--clear-description\") {\n description = null;\n } else if (argument === \"--status\") {\n const value = optionValue(rest, index, argument);\n if (value !== \"active\" && value !== \"archived\") throw new UsageError(\"--status must be active or archived\");\n status = value;\n index += 1;\n } else if (argument !== \"--json\" && !selected) selected = argument;\n else if (argument !== \"--json\") throw new UsageError(`Unknown stickers collections update option: ${argument}`);\n }\n const id = collectionId(selected);\n if (name === undefined && description === undefined && status === undefined) {\n throw new UsageError(\"stickers collections update requires --name, --description, --clear-description, or --status\");\n }\n const updated = await client.updateCollection(id, {\n ...(name === undefined ? {} : { name }),\n ...(description === undefined ? {} : { description }),\n ...(status === undefined ? {} : { status }),\n });\n output(updated, json, dependencies.writeStdout, `Updated sticker collection ${updated.collectionId}\\n`);\n return 0;\n }\n\n if (subcommand === \"packs\") return collectionPacksCommand(rest, dependencies);\n throw new UsageError(\"Usage: mediaruntime stickers collections <list|create|get|update|archive|packs>\");\n}\n\nasync function collectionPacksCommand(\n args: string[],\n dependencies: StickersCommandDependencies,\n): Promise<number> {\n // Binding commands never activate or charge a pack; they only attach an existing entitlement.\n const action = args[0];\n const rest = args.slice(1);\n const json = rest.includes(\"--json\");\n const client = hostedClient(dependencies);\n let selected: string | undefined;\n let packId: string | undefined;\n let activationId: string | undefined;\n for (let index = 0; index < rest.length; index += 1) {\n const argument = rest[index];\n if (argument === \"--pack\") {\n packId = optionValue(rest, index, argument);\n index += 1;\n } else if (argument === \"--activation\") {\n activationId = optionValue(rest, index, argument);\n index += 1;\n } else if (argument !== \"--json\" && !selected) selected = argument;\n else if (argument !== \"--json\") throw new UsageError(`Unknown stickers collections packs option: ${argument}`);\n }\n const id = collectionId(selected);\n if (action === \"list\") {\n if (packId || activationId) throw new UsageError(\"stickers collections packs list does not accept a pack selector\");\n const page = await client.listCollectionPacks(id);\n output(page, json, dependencies.writeStdout, bindingTable(page));\n return 0;\n }\n if (action === \"enable\") {\n if ((packId ? 1 : 0) + (activationId ? 1 : 0) !== 1) {\n throw new UsageError(\"stickers collections packs enable requires exactly one of --pack or --activation\");\n }\n const binding = activationId\n ? await client.addCollectionPack(id, { activationId })\n : await client.enableCollectionPack(id, packId ?? \"\");\n output(binding, json, dependencies.writeStdout, `Enabled pack ${binding.packId} in ${id}\\n`);\n return 0;\n }\n if (action === \"disable\") {\n if (!packId || activationId) throw new UsageError(\"stickers collections packs disable requires --pack <pack_id>\");\n const binding = await client.disableCollectionPack(id, packId);\n output(binding, json, dependencies.writeStdout, `Disabled pack ${binding.packId} in ${id}; historical references remain ${binding.historicalAccess}\\n`);\n return 0;\n }\n throw new UsageError(\"Usage: mediaruntime stickers collections packs <list|enable|disable> <collection_id>\");\n}\n\ninterface RuntimeOptions {\n collection?: string;\n packId?: string;\n category?: string;\n locale?: string;\n limit?: number;\n animated?: boolean;\n variant?: string;\n json: boolean;\n positional: string[];\n}\n\nfunction parseRuntimeOptions(args: string[], command: string): RuntimeOptions {\n // Runtime commands share collection selection and bounded filters but retain positional query/ID input.\n const options: RuntimeOptions = { json: false, positional: [] };\n for (let index = 0; index < args.length; index += 1) {\n const argument = args[index];\n if (argument === \"--collection\") {\n options.collection = optionValue(args, index, argument);\n index += 1;\n } else if (argument === \"--pack\") {\n options.packId = optionValue(args, index, argument);\n index += 1;\n } else if (argument === \"--category\") {\n options.category = optionValue(args, index, argument);\n index += 1;\n } else if (argument === \"--locale\") {\n options.locale = optionValue(args, index, argument);\n index += 1;\n } else if (argument === \"--limit\") {\n const maximum = command === \"typeahead\" ? 20 : 50;\n options.limit = boundedInteger(optionValue(args, index, argument), argument, 1, maximum);\n index += 1;\n } else if (argument === \"--animated\" || argument === \"--static\") {\n if (options.animated !== undefined) throw new UsageError(\"Use only one of --animated or --static\");\n options.animated = argument === \"--animated\";\n } else if (argument === \"--variant\") {\n options.variant = optionValue(args, index, argument);\n index += 1;\n } else if (argument === \"--json\") options.json = true;\n else if (argument?.startsWith(\"--\")) throw new UsageError(`Unknown stickers ${command} option: ${argument}`);\n else options.positional.push(argument ?? \"\");\n }\n return options;\n}\n\nasync function runtimeCommand(\n command: string,\n args: string[],\n dependencies: StickersCommandDependencies,\n): Promise<number> {\n // All runtime reads are collection-bound whether authentication uses an API key or client token.\n const options = parseRuntimeOptions(args, command);\n const id = collectionId(options.collection);\n const client = runtimeClient(id, dependencies);\n if (command === \"packs\") {\n if (options.packId || options.category || options.locale || options.limit !== undefined ||\n options.animated !== undefined || options.variant) {\n throw new UsageError(\"stickers packs list accepts only --collection and --json\");\n }\n if (options.positional.length !== 1 || options.positional[0] !== \"list\") {\n throw new UsageError(\"Usage: mediaruntime stickers packs list --collection <collection_id>\");\n }\n const items = await client.listPacks();\n output({ items, total: items.length }, options.json, dependencies.writeStdout, runtimePackTable(items));\n return 0;\n }\n if (command === \"search\") {\n if (options.locale || options.variant) throw new UsageError(\"stickers search does not accept typeahead or asset options\");\n if (options.positional.length !== 1) throw new UsageError(\"Usage: mediaruntime stickers search <query> --collection <collection_id>\");\n const result = await client.search(options.positional[0] ?? \"\", {\n ...(options.packId === undefined ? {} : { packId: options.packId }),\n ...(options.category === undefined ? {} : { category: options.category }),\n ...(options.animated === undefined ? {} : { animated: options.animated }),\n ...(options.limit === undefined ? {} : { limit: options.limit }),\n });\n output(result, options.json, dependencies.writeStdout, stickerTable(result.items));\n return 0;\n }\n if (command === \"typeahead\") {\n if (options.category || options.animated !== undefined || options.variant) {\n throw new UsageError(\"stickers typeahead accepts only --pack, --locale, and --limit filters\");\n }\n if (options.positional.length !== 1) throw new UsageError(\"Usage: mediaruntime stickers typeahead <prefix> --collection <collection_id>\");\n const result = await client.typeahead(options.positional[0] ?? \"\", {\n ...(options.packId === undefined ? {} : { packId: options.packId }),\n ...(options.locale === undefined ? {} : { locale: options.locale }),\n ...(options.limit === undefined ? {} : { limit: options.limit }),\n });\n const human = table(\n [\"SUGGESTION\", \"STICKERS\"],\n result.suggestions.map((suggestion) => [suggestion.text, String(suggestion.assetCount)]),\n );\n output(result, options.json, dependencies.writeStdout, human);\n return 0;\n }\n if (command === \"get\") {\n if (options.packId || options.category || options.locale || options.limit !== undefined ||\n options.animated !== undefined || options.variant) {\n throw new UsageError(\"stickers get accepts only --collection and --json\");\n }\n if (options.positional.length !== 1) throw new UsageError(\"Usage: mediaruntime stickers get <sticker_id> --collection <collection_id>\");\n const sticker = await client.retrieve(options.positional[0] ?? \"\");\n const human = `${sticker.label} (${sticker.stickerId})\\nPack: ${sticker.packId}\\nCategory: ${sticker.category ?? \"-\"}\\nVariants: ${sticker.variants.map((item) => item.name).join(\", \")}\\n`;\n output(sticker, options.json, dependencies.writeStdout, human);\n return 0;\n }\n if (command === \"resolve\") {\n if (options.packId || options.category || options.locale || options.limit !== undefined ||\n options.animated !== undefined) {\n throw new UsageError(\"stickers resolve accepts only --variant, --collection, and --json\");\n }\n if (options.positional.length !== 1 || !options.variant) {\n throw new UsageError(\"Usage: mediaruntime stickers resolve <sticker_id> --variant <name> --collection <collection_id>\");\n }\n if (!STICKER_VARIANTS.has(options.variant)) {\n throw new UsageError(`Unsupported sticker variant: ${options.variant}`);\n }\n const resolution = await client.resolve(options.positional[0] ?? \"\", options.variant);\n // The signed URL is intentionally emitted because asset resolution is this command's explicit purpose.\n const human = `Sticker: ${String(resolution.stickerId ?? \"-\")}\\nVariant: ${String(resolution.variant ?? options.variant)}\\nBytes: ${String(resolution.bytes ?? \"-\")}\\nExpires: ${String(resolution.expiresAt ?? \"-\")}\\nURL: ${String(resolution.url ?? \"-\")}\\n`;\n output(resolution, options.json, dependencies.writeStdout, human);\n return 0;\n }\n throw new UsageError(\"Usage: mediaruntime stickers <packs|search|typeahead|get|resolve>\");\n}\n\nasync function tokenCommand(args: string[], dependencies: StickersCommandDependencies): Promise<number> {\n // Token issuance is deliberately a trusted command; scoped tokens cannot mint descendants.\n if (args[0] !== \"create\") throw new UsageError(\"Usage: mediaruntime stickers token create --collection <collection_id>\");\n let selected: string | undefined;\n let expiresInSeconds: number | undefined;\n const scopes: string[] = [];\n let json = false;\n for (let index = 1; index < args.length; index += 1) {\n const argument = args[index];\n if (argument === \"--collection\") {\n selected = optionValue(args, index, argument);\n index += 1;\n } else if (argument === \"--expires-in\") {\n expiresInSeconds = boundedInteger(optionValue(args, index, argument), argument, 60, 3600);\n index += 1;\n } else if (argument === \"--scope\") {\n const scope = optionValue(args, index, argument);\n if (!TOKEN_SCOPES.has(scope)) throw new UsageError(`Unsupported Sticker Runtime scope: ${scope}`);\n scopes.push(scope);\n index += 1;\n } else if (argument === \"--json\") json = true;\n else throw new UsageError(`Unknown stickers token create option: ${argument}`);\n }\n const result = await hostedClient(dependencies).createClientToken({\n collectionId: collectionId(selected),\n ...(expiresInSeconds === undefined ? {} : { expiresInSeconds }),\n ...(scopes.length === 0 ? {} : { scopes: [...new Set(scopes)] }),\n });\n // Token output is an explicit secret-bearing response; callers should redirect it to a protected sink.\n const human = `Access token: ${String(result.accessToken ?? \"\")}\\nExpires: ${String(result.expiresAt ?? \"-\")}\\nCollection: ${String(result.collectionId ?? \"-\")}\\nScopes: ${Array.isArray(result.scopes) ? result.scopes.join(\", \") : \"-\"}\\n`;\n output(result, json, dependencies.writeStdout, human);\n return 0;\n}\n\nexport function isScopedStickerRuntimeCommand(args: string[]): boolean {\n // Only read-only, collection-bound operations accept the untrusted client credential.\n return [\"packs\", \"search\", \"typeahead\", \"get\", \"resolve\"].includes(args[0] ?? \"\");\n}\n\nexport function stickerCollectionOption(args: string[]): string {\n // Extract the collection before client construction so scoped-token mode never needs a master key.\n const index = args.indexOf(\"--collection\");\n return collectionId(index < 0 ? undefined : args[index + 1]);\n}\n\nexport async function runStickersCommand(\n args: string[],\n dependencies: StickersCommandDependencies,\n): Promise<number> {\n // Route one stable top-level namespace to management, runtime, metering, and token operations.\n const command = args[0];\n if (!command || command === \"--help\" || command === \"-h\" || args.includes(\"--help\") || args.includes(\"-h\")) {\n dependencies.writeStdout(STICKERS_HELP);\n return 0;\n }\n if (command === \"collections\") return collectionsCommand(args.slice(1), dependencies);\n if (command === \"token\") return tokenCommand(args.slice(1), dependencies);\n if (command === \"usage\") {\n const rest = args.slice(1);\n if (rest.some((argument) => argument !== \"--json\")) throw new UsageError(\"Usage: mediaruntime stickers usage [--json]\");\n const result = await hostedClient(dependencies).usage();\n const human = `Month: ${String(result.month ?? \"-\")}\\nStatus: ${String(result.status ?? \"-\")}\\nOperations: ${String(result.operations ?? 0)} / ${String(result.includedOperations ?? 0)}\\nAuthorized delivery: ${String(result.authorizedDeliveryBytes ?? 0)} / ${String(result.includedDeliveryBytes ?? 0)} bytes\\nOverage: ${String(result.overageChargedCents ?? 0)} ${String(result.currency ?? \"USD\")} cents\\n`;\n output(result, rest.includes(\"--json\"), dependencies.writeStdout, human);\n return 0;\n }\n if (isScopedStickerRuntimeCommand(args)) return runtimeCommand(command ?? \"\", args.slice(1), dependencies);\n throw new UsageError(\"Usage: mediaruntime stickers <collections|packs|search|typeahead|get|resolve|usage|token>\");\n}\n","import { randomBytes, randomUUID } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\n\nimport { parseLocalDestination } from \"../trigger/destination.js\";\nimport {\n SUPPORTED_TRIGGER_EVENTS,\n createSyntheticTerminalEvent,\n isTriggerEventType,\n type TriggerEventType,\n} from \"../trigger/event.js\";\nimport { signSyntheticWebhook } from \"../trigger/signature.js\";\nimport { TriggerDeliveryError, UsageError } from \"../errors.js\";\n\nexport interface TriggerCommandDependencies {\n env?: Readonly<Record<string, string | undefined>>;\n fetch?: typeof globalThis.fetch;\n now?: () => number;\n randomUUID?: () => string;\n randomBytes?: (size: number) => Uint8Array;\n readFile?: (path: string, encoding: \"utf8\") => Promise<string>;\n writeStdout?: (text: string) => void;\n}\n\ninterface TriggerArguments {\n type: TriggerEventType;\n destination: URL;\n secretFile?: string;\n generateSecret: boolean;\n jobId?: string;\n accountId?: string;\n json: boolean;\n}\n\nfunction requireOptionValue(args: string[], index: number, option: string): string {\n const value = args[index + 1];\n if (!value || value.startsWith(\"--\")) throw new UsageError(`${option} requires a value`);\n return value;\n}\n\nexport function parseTriggerArguments(args: string[]): TriggerArguments {\n const typeValue = args[0];\n if (!typeValue || typeValue.startsWith(\"--\")) {\n throw new UsageError(\n `trigger requires an event type: ${SUPPORTED_TRIGGER_EVENTS.join(\", \")}`,\n );\n }\n if (!isTriggerEventType(typeValue)) {\n throw new UsageError(\n `Unsupported trigger event ${JSON.stringify(typeValue)}; expected ${SUPPORTED_TRIGGER_EVENTS.join(\", \")}`,\n );\n }\n\n let to: string | undefined;\n let secretFile: string | undefined;\n let generateSecret = false;\n let jobId: string | undefined;\n let accountId: string | undefined;\n let json = false;\n for (let index = 1; index < args.length; index += 1) {\n const option = args[index];\n if (!option) continue;\n if (option === \"--generate-secret\") {\n generateSecret = true;\n continue;\n }\n if (option === \"--json\") {\n json = true;\n continue;\n }\n if ([\"--to\", \"--secret-file\", \"--job-id\", \"--account-id\"].includes(option)) {\n const value = requireOptionValue(args, index, option);\n index += 1;\n if (option === \"--to\") to = value;\n else if (option === \"--secret-file\") secretFile = value;\n else if (option === \"--job-id\") jobId = value;\n else accountId = value;\n continue;\n }\n throw new UsageError(`Unknown trigger option: ${option}`);\n }\n\n if (!to) throw new UsageError(\"trigger requires an explicit --to local URL\");\n if (generateSecret && secretFile) {\n throw new UsageError(\"--generate-secret and --secret-file are mutually exclusive\");\n }\n if (generateSecret && json) {\n throw new UsageError(\"--generate-secret and --json are mutually exclusive\");\n }\n if (jobId !== undefined && !jobId.trim()) throw new UsageError(\"--job-id must not be empty\");\n if (accountId !== undefined && !accountId.trim()) {\n throw new UsageError(\"--account-id must not be empty\");\n }\n return {\n type: typeValue,\n destination: parseLocalDestination(to),\n ...(secretFile === undefined ? {} : { secretFile }),\n generateSecret,\n ...(jobId === undefined ? {} : { jobId: jobId.trim() }),\n ...(accountId === undefined ? {} : { accountId: accountId.trim() }),\n json,\n };\n}\n\nasync function resolveSecret(\n args: TriggerArguments,\n dependencies: Required<\n Pick<TriggerCommandDependencies, \"env\" | \"randomBytes\" | \"readFile\" | \"writeStdout\">\n >,\n): Promise<string> {\n if (args.generateSecret) {\n const generated = Buffer.from(dependencies.randomBytes(32)).toString(\"base64url\");\n dependencies.writeStdout(\n `Generated webhook secret (configure the local receiver with this value): ${generated}\\n`,\n );\n return generated;\n }\n let secret: string | undefined;\n if (args.secretFile) {\n try {\n secret = await dependencies.readFile(args.secretFile, \"utf8\");\n } catch (error) {\n throw new UsageError(`Could not read webhook secret file: ${args.secretFile}`, { cause: error });\n }\n } else {\n // Match deployed webhook receivers by default without placing secrets in shell history.\n secret = dependencies.env.MEDIARUNTIME_WEBHOOK_SECRET;\n }\n const normalized = secret?.trim();\n if (!normalized) {\n throw new UsageError(\n \"Set MEDIARUNTIME_WEBHOOK_SECRET, pass --secret-file, or explicitly use --generate-secret\",\n );\n }\n return normalized;\n}\n\nexport async function runTriggerCommand(\n args: string[],\n dependencies: TriggerCommandDependencies = {},\n): Promise<number> {\n const parsed = parseTriggerArguments(args);\n const deps = {\n env: dependencies.env ?? process.env,\n fetch: dependencies.fetch ?? globalThis.fetch,\n now: dependencies.now ?? Date.now,\n randomUUID: dependencies.randomUUID ?? randomUUID,\n randomBytes: dependencies.randomBytes ?? randomBytes,\n readFile: dependencies.readFile ?? readFile,\n writeStdout: dependencies.writeStdout ?? ((text: string) => process.stdout.write(text)),\n };\n const secret = await resolveSecret(parsed, deps);\n const timestamp = Math.floor(deps.now() / 1000);\n const unique = deps.randomUUID();\n const eventId = `evt_cli_${unique}`;\n const jobId = parsed.jobId ?? `job_cli_${unique}`;\n const accountId = parsed.accountId ?? \"acc_cli_local\";\n const payload = createSyntheticTerminalEvent(parsed.type, {\n eventId,\n jobId,\n accountId,\n timestamp,\n });\n const signed = signSyntheticWebhook(payload, { eventId, timestamp, secret });\n\n // Redirects are disabled so a loopback endpoint cannot relay the signed request elsewhere.\n const response = await deps.fetch(parsed.destination, {\n method: \"POST\",\n headers: signed.headers,\n body: signed.body,\n redirect: \"manual\",\n signal: AbortSignal.timeout(10_000),\n });\n if (!response.ok) {\n throw new TriggerDeliveryError(\n `Local webhook endpoint returned HTTP ${response.status}${response.statusText ? ` ${response.statusText}` : \"\"}`,\n );\n }\n if (parsed.json) {\n deps.writeStdout(`${JSON.stringify({\n eventId,\n type: parsed.type,\n jobId,\n status: payload.status,\n destination: parsed.destination.href,\n httpStatus: response.status,\n })}\\n`);\n } else {\n deps.writeStdout(\n `Sent synthetic ${parsed.type} event ${eventId} to ${parsed.destination.href} (HTTP ${response.status})\\n`,\n );\n }\n return 0;\n}\n","import { UsageError } from \"../errors.js\";\n\nexport function isLoopbackDestination(value: URL): boolean {\n let hostname = value.hostname.toLowerCase();\n if (hostname.endsWith(\".\")) hostname = hostname.slice(0, -1);\n if (hostname.startsWith(\"[\") && hostname.endsWith(\"]\")) {\n hostname = hostname.slice(1, -1);\n }\n if (hostname === \"localhost\" || hostname === \"::1\" || hostname === \"0:0:0:0:0:0:0:1\") {\n return true;\n }\n\n const octets = hostname.split(\".\");\n if (octets.length !== 4 || octets.some((part) => !/^\\d{1,3}$/.test(part))) return false;\n const numbers = octets.map(Number);\n return numbers[0] === 127 && numbers.every((part) => part >= 0 && part <= 255);\n}\n\nexport function parseLocalDestination(raw: string): URL {\n // `trigger` is a local receiver test tool, so reject remote destinations and SSRF targets.\n let destination: URL;\n try {\n destination = new URL(raw);\n } catch {\n throw new UsageError(\"--to must be an absolute local HTTP(S) URL\");\n }\n if (destination.protocol !== \"http:\" && destination.protocol !== \"https:\") {\n throw new UsageError(\"--to must use http:// or https://\");\n }\n if (destination.username || destination.password) {\n throw new UsageError(\"--to must not contain URL credentials\");\n }\n if (!isLoopbackDestination(destination)) {\n throw new UsageError(\n \"trigger only sends to loopback destinations (localhost, 127.0.0.0/8, or ::1)\",\n );\n }\n return destination;\n}\n","export const SUPPORTED_TRIGGER_EVENTS = [\n \"job.completed\",\n \"job.failed\",\n \"job.rejected\",\n] as const;\n\nexport type TriggerEventType = (typeof SUPPORTED_TRIGGER_EVENTS)[number];\n\nexport function isTriggerEventType(value: string): value is TriggerEventType {\n return (SUPPORTED_TRIGGER_EVENTS as readonly string[]).includes(value);\n}\n\nexport interface SyntheticEventOptions {\n eventId: string;\n jobId: string;\n accountId: string;\n timestamp: number;\n}\n\nexport function createSyntheticTerminalEvent(\n type: TriggerEventType,\n options: SyntheticEventOptions,\n): Record<string, unknown> {\n // Keep synthetic events shaped like production terminal webhooks for realistic local tests.\n const status = type.slice(\"job.\".length).toUpperCase();\n const occurredAt = new Date(options.timestamp * 1000).toISOString();\n const base = {\n event_id: options.eventId,\n job_id: options.jobId,\n account_id: options.accountId,\n status,\n };\n\n if (type === \"job.completed\") {\n const expiresAt = new Date((options.timestamp + 7 * 24 * 60 * 60) * 1000).toISOString();\n return {\n ...base,\n completedAt: occurredAt,\n delivery: {\n mode: \"PULL\",\n retentionDays: 7,\n expiresAt,\n bundle: {\n type: \"zip\",\n filename: `${options.jobId}_outputs.zip`,\n size_bytes: 0,\n sha256: \"0\".repeat(64),\n download: {\n // This marker URL is descriptive only; trigger never serves a synthetic ZIP.\n url: `http://127.0.0.1/__mediaruntime_synthetic__/${encodeURIComponent(options.jobId)}.zip`,\n expiresAt,\n },\n },\n layout: \"bundle_relative_v1\",\n deliverables: [],\n manifests: {},\n },\n billing: { status: \"PAID\" },\n usage: { units_total: 0 },\n meta: { synthetic: true, request_metadata: {} },\n };\n }\n\n const failed = type === \"job.failed\";\n return {\n ...base,\n [failed ? \"failedAt\" : \"rejectedAt\"]: occurredAt,\n delivery: { mode: \"NONE\" },\n billing: { status: \"RELEASED\" },\n error: {\n code: failed ? \"SYNTHETIC_ENGINE_FAILED\" : \"SYNTHETIC_REJECTED\",\n message: `Synthetic ${type} event from the MediaRuntime CLI`,\n },\n meta: { synthetic: true, request_metadata: {} },\n };\n}\n","import { createHmac } from \"node:crypto\";\n\nexport const WEBHOOK_HEADERS = {\n id: \"X-Transcoder-Id\",\n timestamp: \"X-Transcoder-Timestamp\",\n signature: \"X-Transcoder-Signature\",\n} as const;\n\nexport interface SignedWebhook {\n body: string;\n headers: Record<string, string>;\n}\n\nexport function signSyntheticWebhook(\n payload: Readonly<Record<string, unknown>>,\n options: { eventId: string; timestamp: number; secret: string },\n): SignedWebhook {\n if (!options.eventId.trim()) throw new Error(\"Webhook event ID must not be empty\");\n if (!Number.isInteger(options.timestamp) || options.timestamp < 0) {\n throw new Error(\"Webhook timestamp must be a non-negative integer\");\n }\n if (!options.secret) throw new Error(\"Webhook secret must not be empty\");\n\n // JSON is serialized once. These exact bytes are both signed and sent.\n const body = JSON.stringify(payload);\n const bodyBytes = Buffer.from(body, \"utf8\");\n const prefix = Buffer.from(`${options.timestamp}.${options.eventId}.`, \"utf8\");\n const digest = createHmac(\"sha256\", options.secret)\n .update(prefix)\n .update(bodyBytes)\n .digest(\"hex\");\n\n return {\n body,\n headers: {\n \"Content-Type\": \"application/json\",\n [WEBHOOK_HEADERS.id]: options.eventId,\n [WEBHOOK_HEADERS.timestamp]: String(options.timestamp),\n [WEBHOOK_HEADERS.signature]: `t=${options.timestamp},v1=${digest}`,\n },\n };\n}\n","const FRAMES = [\"⣋\", \"⣙\", \"⣹\", \"⣸\", \"⣼\", \"⣴\", \"⣦\", \"⣧\", \"⣇\", \"⣏\"];\nconst CLEAR_LINE = \"\\r\\u001b[2K\";\n\nexport interface ActivityIndicator {\n start(message: string): void;\n update(message: string): void;\n stop(): void;\n}\n\nexport function createActivityIndicator(\n write: (text: string) => void,\n enabled: boolean,\n): ActivityIndicator {\n // Callers enable this only for interactive stderr, keeping stdout and --json parseable.\n let timer: ReturnType<typeof setInterval> | undefined;\n let frameIndex = 0;\n let message = \"\";\n let startedAt = 0;\n\n const render = (): void => {\n if (!timer && startedAt === 0) return;\n const elapsedSeconds = Math.max(0, Math.floor((Date.now() - startedAt) / 1000));\n const elapsed = elapsedSeconds > 0 ? ` (${elapsedSeconds}s)` : \"\";\n write(`${CLEAR_LINE}${FRAMES[frameIndex % FRAMES.length]} ${message}${elapsed}`);\n frameIndex += 1;\n };\n\n return {\n start(nextMessage) {\n if (!enabled) return;\n if (timer) clearInterval(timer);\n message = nextMessage;\n startedAt = Date.now();\n frameIndex = 0;\n render();\n timer = setInterval(render, 80);\n // A spinner must never keep an otherwise finished CLI process alive.\n timer.unref?.();\n },\n update(nextMessage) {\n if (!enabled || startedAt === 0) return;\n message = nextMessage;\n render();\n },\n stop() {\n if (!enabled || startedAt === 0) return;\n if (timer) clearInterval(timer);\n timer = undefined;\n startedAt = 0;\n write(CLEAR_LINE);\n },\n };\n}\n"],"mappings":"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","names":["createHash","randomUUID","resolve","resolve","cell","UNSUCCESSFUL_TERMINAL_STATUSES","optionValue","output","detailsProjection","optionValue","humanList","value","optionValue","output","table","cell","randomBytes","readFile","randomBytes","readFile","randomUUID","createHash"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/errors.ts","../src/auth/api.ts","../src/commands/auth.ts","../src/auth/browser.ts","../src/auth/credential-store.ts","../src/commands/capabilities.ts","../src/commands/jobs.ts","../src/clipTranscript.ts","../src/commands/run.ts","../src/commands/recipes.ts","../src/commands/stickers.ts","../src/commands/trigger.ts","../src/trigger/destination.ts","../src/trigger/event.ts","../src/trigger/signature.ts","../src/ui/activity.ts"],"sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport { constants, realpathSync } from \"node:fs\";\nimport {\n access,\n link,\n rename,\n rm,\n} from \"node:fs/promises\";\nimport { createWriteStream } from \"node:fs\";\nimport { basename, dirname, resolve } from \"node:path\";\nimport { Readable, Transform } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport type { ReadableStream as NodeReadableStream } from \"node:stream/web\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n JobWaitTimeoutError,\n MediaRuntime,\n MediaRuntimeApiError,\n MediaRuntimeConnectionError,\n} from \"@mediaruntime/node\";\nimport * as MediaRuntimeSdk from \"@mediaruntime/node\";\nimport { PRODUCTION_ORIGIN } from \"./auth/api.js\";\nimport type { CredentialStore } from \"./auth/credential-store.js\";\nimport {\n resolveCredential,\n runAuthCommand,\n runLoginCommand,\n runLogoutCommand,\n type AuthCommandDependencies,\n} from \"./commands/auth.js\";\nimport {\n runCapabilitiesCommand,\n runPresetsCommand,\n type CapabilitiesReadClient,\n} from \"./commands/capabilities.js\";\nimport {\n runJobsCommand,\n type JobsReadClient,\n} from \"./commands/jobs.js\";\nimport {\n runCommand,\n type RunJobsClient,\n} from \"./commands/run.js\";\nimport { runRecipesCommand, type RecipesClient } from \"./commands/recipes.js\";\nimport {\n isScopedStickerRuntimeCommand,\n runStickersCommand,\n stickerCollectionOption,\n type HostedStickersCommandClient,\n type StickerRuntimeReadClient,\n} from \"./commands/stickers.js\";\nimport { runTriggerCommand } from \"./commands/trigger.js\";\nimport { BundleDownloadError, CliError, UsageError } from \"./errors.js\";\nimport { isLoopbackDestination } from \"./trigger/destination.js\";\nimport { createActivityIndicator } from \"./ui/activity.js\";\n\nexport { parseTriggerArguments, runTriggerCommand } from \"./commands/trigger.js\";\nexport { createSyntheticTerminalEvent } from \"./trigger/event.js\";\nexport { signSyntheticWebhook } from \"./trigger/signature.js\";\nexport {\n resolveCredential,\n runAuthCommand,\n runAuthStatusCommand,\n runLoginCommand,\n runLogoutCommand,\n} from \"./commands/auth.js\";\n\nconst VERSION = \"1.5.0\";\nconst HELP = `MediaRuntime CLI\n\nUsage:\n mediaruntime run <source> (--recipe <name[@version]> | --output <alias> | --preset <name>) [...] [--no-webhook] [--wait]\n --no-webhook disables callbacks for this job; normal billing applies.\n Animation presets: [--animation-width N] [--animation-fps N] [--animation-start SEC]\n [--animation-duration SEC] [--animation-loop N] [--animation-quality N]\n Placeholder preset: [--placeholder-max-dimension N] [--placeholder-time SEC]\n [--lqip-quality N] [--lqip-max-bytes N]\n Contact-sheet preset: [--contact-columns N] [--contact-rows N]\n [--contact-tile-width N] [--contact-tile-height N] [--contact-interval SEC]\n [--contact-start SEC] [--contact-duration SEC] [--contact-max-sheets N]\n [--contact-format jpg|png|webp] [--contact-quality N]\n [--image-width PX] [--image-height PX] [--image-mode fit|fill|cover|contain]\n [--image-format jpg|png|webp|avif] [--image-quality N]\n [--image-max-bytes N] [--image-min-quality N]\n Clip render: --preset video_clip_v1 --clip-start SEC --clip-duration SEC\n [--clip-layout original|vertical_blur] [--clip-transcript <plan.json|captions.srt|captions.vtt>] [--clip-captions]\n Clip suggestions: --preset clip_candidates_v1 [--clip-min-duration SEC]\n [--clip-max-duration SEC] [--clip-count 1..20] [--clip-keyword TEXT]\n [--clip-transcript <plan.json|captions.srt|captions.vtt>]\n Audiogram preset: --audiogram-artwork <source> [--audiogram-captions <source>]\n [--audiogram-layout square|portrait|landscape]\n [--audiogram-fit contain|cover|blurred_background]\n [--audiogram-background #RRGGBB] [--audiogram-waveform #RRGGBB]\n [--audiogram-waveform-gain 0.5..4]\n [--audiogram-caption-position top|bottom] [--audiogram-caption-scale 0.75..1.5]\n [--audiogram-normalize] [--audiogram-loudness-target -24..-12]\n [--audiogram-start SEC] [--audiogram-duration SEC] [--audiogram-fps 15..30]\n Privacy redaction Preview (still-image input + image output only):\n --privacy-detector face|license_plate|text\n [--privacy-style blur|pixelate|solid] [--privacy-failure-mode fail_closed|report_only]\n [--privacy-min-confidence 0.30..0.99] [--privacy-sample-interval 0.1..30]\n [--privacy-max-frames 1..18000] [--privacy-padding 0..0.5]\n [--privacy-solid-color #RRGGBB] [--privacy-pixel-block-size 4..128]\n [--privacy-strength standard|strong] [--privacy-debug-observations]\n mediaruntime capabilities [--json]\n mediaruntime presets list [--json]\n mediaruntime jobs list [--status <status>] [--limit <n>] [--cursor <cursor>]\n mediaruntime jobs get <job_id> [--download <bundle.zip>] [--force]\n mediaruntime recipes <list|get|create|version|archive>\n mediaruntime stickers collections <list|create|get|update|archive|packs>\n mediaruntime stickers packs list --collection <collection_id>\n mediaruntime stickers search <query> --collection <collection_id>\n mediaruntime stickers typeahead <prefix> --collection <collection_id>\n mediaruntime stickers get <sticker_id> --collection <collection_id>\n mediaruntime stickers resolve <sticker_id> --variant <name> --collection <collection_id>\n mediaruntime stickers usage\n mediaruntime stickers token create --collection <collection_id>\n mediaruntime trigger <job.completed|job.failed|job.rejected> --to <local-url>\n mediaruntime login [--no-browser]\n mediaruntime auth status\n mediaruntime logout [--local-only]\n\nGlobal options:\n --base-url <url> Developer override; normally leave unset\n --help Show help\n --version Show version\n\nRun/jobs options:\n --json Machine-readable, URL-redacted output\n\nAuthentication uses a secure login or MEDIARUNTIME_API_KEY.\nSticker commands use that API key by default. MEDIARUNTIME_STICKER_CLIENT_TOKEN may\nreplace it only for collection-bound packs/search/typeahead/get/resolve reads; it cannot\nmanage collections, inspect workspace usage, or mint another token.\n`;\n\ntype CliJobsClient = RunJobsClient & JobsReadClient;\n\nexport interface CliClient {\n jobs: CliJobsClient;\n capabilities: CapabilitiesReadClient;\n uploads?: {\n resolveSource(source: string): Promise<string>;\n };\n recipes?: RecipesClient;\n stickers?: HostedStickersCommandClient;\n}\n\nexport interface CliDependencies {\n createClient?(options: { baseUrl?: string; apiKey?: string }): CliClient;\n createStickerRuntime?(options: {\n accessToken: string;\n collectionId: string;\n baseUrl?: string;\n }): StickerRuntimeReadClient;\n downloadBundle?(\n url: string,\n destination: string,\n options: {\n force: boolean;\n expectedSizeBytes?: number | null;\n expectedSha256?: string | null;\n },\n ): Promise<void>;\n writeStdout?(text: string): void;\n writeStderr?(text: string): void;\n isStderrTTY?: boolean;\n credentialStore?: CredentialStore;\n openBrowser?(url: string): Promise<void>;\n sleep?(milliseconds: number): Promise<void>;\n now?(): number;\n randomVerifier?(): string;\n}\n\nfunction isFileExistsError(error: unknown): boolean {\n return error instanceof Error && \"code\" in error && error.code === \"EEXIST\";\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function downloadBundleAtomically(\n url: string,\n destination: string,\n options: {\n force: boolean;\n expectedSizeBytes?: number | null;\n expectedSha256?: string | null;\n },\n): Promise<void> {\n // Stream into a private sibling file so an interrupted transfer never appears complete.\n const target = resolve(destination);\n if (!options.force && await exists(target)) {\n throw new BundleDownloadError(`Refusing to overwrite existing file: ${destination}`);\n }\n const temporary = resolve(\n dirname(target),\n `.${basename(target)}.${randomUUID()}.part`,\n );\n\n try {\n let response: Response;\n try {\n response = await fetch(url);\n } catch (error) {\n throw new BundleDownloadError(\"Bundle download failed before receiving a response\", { cause: error });\n }\n if (!response.ok) {\n await response.body?.cancel();\n throw new BundleDownloadError(`Bundle download failed with HTTP ${response.status}`);\n }\n if (!response.body) throw new BundleDownloadError(\"Bundle download returned an empty response body\");\n const hash = createHash(\"sha256\");\n let sizeBytes = 0;\n const integrity = new Transform({\n transform(chunk: Buffer, _encoding, callback) {\n sizeBytes += chunk.length;\n hash.update(chunk);\n callback(null, chunk);\n },\n });\n await pipeline(\n Readable.fromWeb(response.body as unknown as NodeReadableStream<Uint8Array>),\n integrity,\n createWriteStream(temporary, { flags: \"wx\", mode: 0o600 }),\n );\n const sha256 = hash.digest(\"hex\");\n // Validate before the temporary file becomes visible at the requested destination.\n if (options.expectedSizeBytes !== undefined && options.expectedSizeBytes !== null &&\n sizeBytes !== options.expectedSizeBytes) {\n throw new BundleDownloadError(\n `Bundle size mismatch: expected ${options.expectedSizeBytes} bytes, received ${sizeBytes}`,\n );\n }\n if (options.expectedSha256 && sha256 !== options.expectedSha256.toLowerCase()) {\n throw new BundleDownloadError(\"Bundle SHA-256 mismatch\");\n }\n\n if (options.force) {\n await rename(temporary, target);\n } else {\n try {\n // A hard link publishes the completed same-filesystem temporary file atomically\n // and fails rather than replacing a destination created during the download.\n await link(temporary, target);\n } catch (error) {\n if (isFileExistsError(error)) {\n throw new BundleDownloadError(`Refusing to overwrite existing file: ${destination}`);\n }\n throw error;\n }\n await rm(temporary);\n }\n } catch (error) {\n await rm(temporary, { force: true });\n if (error instanceof BundleDownloadError) throw error;\n throw new BundleDownloadError(`Could not write bundle to ${destination}`, { cause: error });\n }\n}\n\nfunction normalizeBaseUrl(raw: string): string {\n let value: URL;\n try {\n value = new URL(raw);\n } catch {\n throw new UsageError(\"--base-url must be an absolute HTTP(S) origin\");\n }\n if (value.username || value.password || value.search || value.hash || value.pathname !== \"/\") {\n throw new UsageError(\"--base-url must be an origin without credentials, path, query, or fragment\");\n }\n // Plain HTTP is acceptable only for a developer-controlled loopback gateway.\n if (value.protocol !== \"https:\" && !(value.protocol === \"http:\" && isLoopbackDestination(value))) {\n throw new UsageError(\"--base-url must use HTTPS unless it points to loopback\");\n }\n return value.origin;\n}\n\nfunction extractGlobalOptions(argv: string[]): { baseUrl?: string; args: string[] } {\n const args = [...argv];\n let baseUrl: string | undefined;\n while (args[0] === \"--base-url\") {\n const value = args[1];\n if (!value || value.startsWith(\"--\")) throw new UsageError(\"--base-url requires a value\");\n baseUrl = normalizeBaseUrl(value);\n args.splice(0, 2);\n }\n return { ...(baseUrl === undefined ? {} : { baseUrl }), args };\n}\n\nfunction safeApiError(error: MediaRuntimeApiError): Record<string, unknown> {\n return {\n name: error.name,\n message: error.message,\n code: error.code,\n status: error.status,\n retryable: error.retryable,\n requestId: error.requestId ?? null,\n field: error.field ?? null,\n };\n}\n\nfunction exitCodeFor(error: unknown): number {\n if (error instanceof CliError) return error.exitCode;\n if (error instanceof JobWaitTimeoutError) return 7;\n if (error instanceof MediaRuntimeConnectionError) return 5;\n if (error instanceof MediaRuntimeApiError) {\n if ([401, 402, 403].includes(error.status)) return 3;\n if (error.status >= 500) return 5;\n return 4;\n }\n if (error instanceof DOMException && error.name === \"AbortError\") return 130;\n if (error instanceof TypeError && /fetch|network|socket|connect/i.test(error.message)) return 5;\n return 1;\n}\n\nfunction safeError(error: unknown, exitCode: number): Record<string, unknown> {\n if (error instanceof MediaRuntimeApiError) return { ...safeApiError(error), exitCode };\n return {\n code: error instanceof CliError ? error.code : \"cli_error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n exitCode,\n };\n}\n\nexport async function executeCli(\n argv: string[],\n dependencies: CliDependencies = {},\n): Promise<number> {\n const writeStdout = dependencies.writeStdout ?? ((text: string) => process.stdout.write(text));\n const writeStderr = dependencies.writeStderr ?? ((text: string) => process.stderr.write(text));\n const json = argv.includes(\"--json\");\n const isStderrTTY = dependencies.isStderrTTY ??\n (dependencies.writeStderr === undefined && process.stderr.isTTY === true);\n try {\n const global = extractGlobalOptions(argv);\n const command = global.args[0];\n if (!command || command === \"--help\" || command === \"-h\") {\n writeStdout(HELP);\n return 0;\n }\n if (command === \"--version\" || command === \"-v\") {\n writeStdout(`${VERSION}\\n`);\n return 0;\n }\n if (command === \"trigger\") {\n return await runTriggerCommand(global.args.slice(1), { writeStdout });\n }\n\n const configuredBaseUrl = global.baseUrl ?? process.env.MEDIARUNTIME_API_URL;\n const baseUrl = configuredBaseUrl ? normalizeBaseUrl(configuredBaseUrl) : undefined;\n const authBaseUrl = baseUrl ?? PRODUCTION_ORIGIN;\n const authDependencies: AuthCommandDependencies = {\n ...(dependencies.credentialStore ? { credentialStore: dependencies.credentialStore } : {}),\n ...(dependencies.openBrowser ? { openBrowser: dependencies.openBrowser } : {}),\n ...(dependencies.sleep ? { sleep: dependencies.sleep } : {}),\n ...(dependencies.now ? { now: dependencies.now } : {}),\n ...(dependencies.randomVerifier ? { randomVerifier: dependencies.randomVerifier } : {}),\n writeStdout,\n };\n if (command === \"login\") return await runLoginCommand(global.args.slice(1), authBaseUrl, authDependencies);\n if (command === \"auth\") return await runAuthCommand(global.args.slice(1), authBaseUrl, authDependencies);\n if (command === \"logout\") return await runLogoutCommand(global.args.slice(1), authBaseUrl, authDependencies);\n\n if (command === \"capabilities\" || command === \"presets\") {\n // Discovery is public, so these commands work before login and in setup scripts.\n const publicClient = dependencies.createClient?.({\n ...(baseUrl === undefined ? {} : { baseUrl }),\n }) ?? new MediaRuntime({\n ...(baseUrl === undefined ? {} : { baseUrl }),\n });\n const publicDependencies = { capabilities: publicClient.capabilities, writeStdout };\n if (command === \"capabilities\") {\n return await runCapabilitiesCommand(global.args.slice(1), publicDependencies);\n }\n return await runPresetsCommand(global.args.slice(1), publicDependencies);\n }\n\n const stickerArguments = global.args.slice(1);\n const stickerClientToken = process.env.MEDIARUNTIME_STICKER_CLIENT_TOKEN?.trim();\n if (command === \"stickers\" &&\n (!stickerArguments[0] || stickerArguments.includes(\"--help\") || stickerArguments.includes(\"-h\"))) {\n // Help is local and must remain available before login, including on clean machines.\n return await runStickersCommand(stickerArguments, { writeStdout });\n }\n if (command === \"stickers\" && stickerClientToken && isScopedStickerRuntimeCommand(stickerArguments)) {\n // Scoped mode is dispatched before master-key resolution so an untrusted client\n // credential can never silently fall back to a more privileged stored login.\n const selectedCollectionId = stickerCollectionOption(stickerArguments);\n const options = {\n accessToken: stickerClientToken,\n collectionId: selectedCollectionId,\n ...(baseUrl === undefined ? {} : { baseUrl }),\n };\n const constructor = (MediaRuntimeSdk as unknown as {\n StickerRuntime?: new (value: typeof options) => StickerRuntimeReadClient;\n }).StickerRuntime;\n const runtime = dependencies.createStickerRuntime?.(options) ??\n (constructor ? new constructor(options) : undefined);\n if (!runtime) {\n throw new UsageError(\"The installed @mediaruntime/node SDK does not support scoped Sticker Runtime tokens\");\n }\n return await runStickersCommand(stickerArguments, {\n runtime: () => runtime,\n writeStdout,\n });\n }\n\n // Preserve the documented precedence: explicit environment key, then browser login.\n let apiKey = process.env.MEDIARUNTIME_API_KEY?.trim();\n if (!apiKey && (!dependencies.createClient || dependencies.credentialStore)) {\n apiKey = (await resolveCredential(authBaseUrl, authDependencies))?.apiKey;\n }\n if (!dependencies.createClient && !apiKey) {\n throw new UsageError(\"Run mediaruntime login or set MEDIARUNTIME_API_KEY before using this command\");\n }\n const client = dependencies.createClient?.({\n ...(baseUrl === undefined ? {} : { baseUrl }),\n ...(apiKey === undefined ? {} : { apiKey }),\n }) ?? new MediaRuntime({\n ...(baseUrl === undefined ? {} : { baseUrl }),\n ...(apiKey === undefined ? {} : { apiKey }),\n });\n const downloadBundle = dependencies.downloadBundle ?? downloadBundleAtomically;\n const commandDependencies = {\n jobs: client.jobs,\n capabilities: client.capabilities,\n ...(client.uploads ? { uploads: client.uploads } : {}),\n writeStdout,\n downloadBundle,\n activity: createActivityIndicator(writeStderr, isStderrTTY && !json),\n };\n if (command === \"run\") return await runCommand(global.args.slice(1), commandDependencies);\n if (command === \"jobs\") {\n return await runJobsCommand(global.args.slice(1), commandDependencies);\n }\n if (command === \"recipes\") {\n if (!client.recipes) throw new UsageError(\"This MediaRuntime client does not support hosted recipes\");\n return await runRecipesCommand(global.args.slice(1), {\n recipes: client.recipes,\n writeStdout,\n });\n }\n if (command === \"stickers\") {\n // The structural cast keeps local builds compatible while the additive SDK\n // release carrying the stickers resource moves through package publication.\n const stickers = (client as unknown as CliClient).stickers;\n if (!stickers) throw new UsageError(\"This MediaRuntime client does not support Hosted Sticker Runtime\");\n return await runStickersCommand(stickerArguments, {\n hosted: stickers,\n writeStdout,\n });\n }\n throw new UsageError(`Unknown command: ${command}`);\n } catch (error) {\n const exitCode = exitCodeFor(error);\n if (json) {\n writeStderr(`${JSON.stringify({ error: safeError(error, exitCode) })}\\n`);\n } else {\n const requestId = error instanceof MediaRuntimeApiError && error.requestId\n ? ` (request ${error.requestId})`\n : \"\";\n writeStderr(`Error: ${error instanceof Error ? error.message : \"Unknown error\"}${requestId}\\n`);\n }\n return exitCode;\n }\n}\n\nlet isEntrypoint = false;\nif (process.argv[1] !== undefined) {\n try {\n // npm exposes binaries through a symlink. Resolve both sides so the installed command\n // executes while importing dist/cli.js in tests remains side-effect free.\n isEntrypoint = realpathSync(process.argv[1]) === realpathSync(fileURLToPath(import.meta.url));\n } catch {\n isEntrypoint = false;\n }\n}\nif (isEntrypoint) process.exitCode = await executeCli(process.argv.slice(2));\n","export class CliError extends Error {\n readonly code: string;\n readonly exitCode: number;\n\n constructor(code: string, message: string, exitCode: number, options?: { cause?: unknown }) {\n // Stable codes and exit statuses let shell scripts distinguish usage, API, and I/O failures.\n super(message, options);\n this.name = \"CliError\";\n this.code = code;\n this.exitCode = exitCode;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class UsageError extends CliError {\n constructor(message: string, options?: { cause?: unknown }) {\n super(\"usage_error\", message, 2, options);\n this.name = \"UsageError\";\n }\n}\n\nexport class TriggerDeliveryError extends CliError {\n constructor(message: string, options?: { cause?: unknown }) {\n super(\"trigger_delivery_error\", message, 8, options);\n this.name = \"TriggerDeliveryError\";\n }\n}\n\nexport class BundleDownloadError extends CliError {\n constructor(message: string, options?: { cause?: unknown }) {\n super(\"bundle_download_error\", message, 9, options);\n this.name = \"BundleDownloadError\";\n }\n}\n","import { CliError } from \"../errors.js\";\n\n// Browser login uses a dedicated application route rather than the public /v1 API.\nexport const PRODUCTION_ORIGIN = \"https://mediaruntime.com\";\n\ninterface ErrorPayload {\n error?: unknown;\n detail?: unknown;\n}\n\nexport interface DeviceAuthorization {\n deviceCode: string;\n userCode: string;\n verificationUri: string;\n verificationUriComplete: string;\n expiresIn: number;\n interval: number;\n}\n\nexport interface IssuedCredential {\n apiKey: string;\n accountId: string;\n keyId: string;\n credentialType: \"cli\";\n}\n\nexport interface CredentialStatus {\n status: \"authenticated\";\n accountId: string;\n keyId: string;\n credentialType: \"cli\" | \"api_key\";\n}\n\nexport class AuthApiError extends CliError {\n readonly status: number;\n\n constructor(code: string, message: string, status: number) {\n super(code, message, status >= 500 ? 5 : 3);\n this.name = \"AuthApiError\";\n this.status = status;\n }\n}\n\nfunction endpoint(baseUrl: string, path: string): string {\n return `${baseUrl.replace(/\\/+$/, \"\")}/api/cli/auth/${path}`;\n}\n\nasync function responsePayload(response: Response): Promise<Record<string, unknown>> {\n try {\n const value: unknown = await response.json();\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? value as Record<string, unknown>\n : {};\n } catch {\n return {};\n }\n}\n\nasync function post(\n baseUrl: string,\n path: string,\n body: Record<string, unknown>,\n apiKey?: string,\n): Promise<Record<string, unknown>> {\n let response: Response;\n try {\n response = await fetch(endpoint(baseUrl, path), {\n method: \"POST\",\n // Never forward a credential or device code through an unexpected redirect.\n redirect: \"error\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(apiKey ? { \"X-API-Key\": apiKey } : {}),\n },\n body: JSON.stringify(body),\n });\n } catch (error) {\n throw new CliError(\"auth_connection_error\", \"Could not reach MediaRuntime authentication\", 5, { cause: error });\n }\n const payload = await responsePayload(response);\n if (!response.ok) {\n const errorPayload = payload as ErrorPayload;\n throw new AuthApiError(\n typeof errorPayload.error === \"string\" ? errorPayload.error : \"authorization_failed\",\n typeof errorPayload.detail === \"string\" ? errorPayload.detail : `Authentication failed with HTTP ${response.status}`,\n response.status,\n );\n }\n return payload;\n}\n\nfunction requireString(payload: Record<string, unknown>, key: string): string {\n // Treat malformed success responses as a service failure, not as usable credentials.\n const value = payload[key];\n if (typeof value !== \"string\" || !value) throw new CliError(\"invalid_auth_response\", \"MediaRuntime returned an invalid authentication response\", 5);\n return value;\n}\n\nexport async function startAuthorization(baseUrl: string, codeChallenge: string): Promise<DeviceAuthorization> {\n const payload = await post(baseUrl, \"start\", { codeChallenge, clientName: \"MediaRuntime CLI\" });\n return {\n deviceCode: requireString(payload, \"deviceCode\"),\n userCode: requireString(payload, \"userCode\"),\n verificationUri: requireString(payload, \"verificationUri\"),\n verificationUriComplete: requireString(payload, \"verificationUriComplete\"),\n expiresIn: Number(payload.expiresIn),\n interval: Number(payload.interval),\n };\n}\n\nexport async function exchangeAuthorization(baseUrl: string, deviceCode: string, codeVerifier: string): Promise<IssuedCredential> {\n const payload = await post(baseUrl, \"token\", { deviceCode, codeVerifier });\n const credentialType = requireString(payload, \"credentialType\");\n if (credentialType !== \"cli\") throw new CliError(\"invalid_auth_response\", \"MediaRuntime returned the wrong credential type\", 5);\n return {\n apiKey: requireString(payload, \"apiKey\"),\n accountId: requireString(payload, \"accountId\"),\n keyId: requireString(payload, \"keyId\"),\n credentialType,\n };\n}\n\nexport async function inspectCredential(baseUrl: string, apiKey: string): Promise<CredentialStatus> {\n const payload = await post(baseUrl, \"status\", {}, apiKey);\n const credentialType = requireString(payload, \"credentialType\");\n if (credentialType !== \"cli\" && credentialType !== \"api_key\") {\n throw new CliError(\"invalid_auth_response\", \"MediaRuntime returned the wrong credential type\", 5);\n }\n return {\n status: \"authenticated\",\n accountId: requireString(payload, \"accountId\"),\n keyId: requireString(payload, \"keyId\"),\n credentialType,\n };\n}\n\nexport async function revokeCredential(baseUrl: string, apiKey: string): Promise<void> {\n await post(baseUrl, \"revoke\", {}, apiKey);\n}\n","import { createHash, randomBytes } from \"node:crypto\";\nimport {\n AuthApiError,\n exchangeAuthorization,\n inspectCredential,\n revokeCredential,\n startAuthorization,\n} from \"../auth/api.js\";\nimport { openBrowser } from \"../auth/browser.js\";\nimport {\n OsCredentialStore,\n type CredentialStore,\n type StoredCredential,\n} from \"../auth/credential-store.js\";\nimport { CliError, UsageError } from \"../errors.js\";\n\nexport interface AuthCommandDependencies {\n credentialStore?: CredentialStore;\n openBrowser?: (url: string) => Promise<void>;\n sleep?: (milliseconds: number) => Promise<void>;\n now?: () => number;\n randomVerifier?: () => string;\n writeStdout?: (text: string) => void;\n}\n\nconst defaultSleep = (milliseconds: number) => new Promise<void>((resolve) => setTimeout(resolve, milliseconds));\n\nfunction verifierChallenge(verifier: string): string {\n return createHash(\"sha256\").update(verifier).digest(\"base64url\");\n}\n\nfunction defaultVerifier(): string {\n return randomBytes(32).toString(\"base64url\");\n}\n\nfunction store(dependencies: AuthCommandDependencies): CredentialStore {\n return dependencies.credentialStore ?? new OsCredentialStore();\n}\n\nfunction assertOnly(args: string[], allowed: string[]): void {\n const unexpected = args.find((arg) => !allowed.includes(arg));\n if (unexpected) throw new UsageError(`Unknown authentication option: ${unexpected}`);\n}\n\nexport async function resolveCredential(\n baseUrl: string,\n dependencies: AuthCommandDependencies = {},\n): Promise<{ apiKey: string; source: \"environment\" | \"keychain\"; stored?: StoredCredential } | null> {\n // Environment authentication is permanently supported and deliberately overrides login.\n const environment = process.env.MEDIARUNTIME_API_KEY?.trim();\n if (environment) return { apiKey: environment, source: \"environment\" };\n const stored = await store(dependencies).get(baseUrl);\n return stored ? { apiKey: stored.apiKey, source: \"keychain\", stored } : null;\n}\n\nexport async function runLoginCommand(\n args: string[],\n baseUrl: string,\n dependencies: AuthCommandDependencies = {},\n): Promise<number> {\n assertOnly(args, [\"--no-browser\"]);\n const noBrowser = args.includes(\"--no-browser\");\n const write = dependencies.writeStdout ?? ((text: string) => process.stdout.write(text));\n const existing = await store(dependencies).get(baseUrl);\n if (existing) {\n try {\n await inspectCredential(baseUrl, existing.apiKey);\n write(`Already logged in to ${baseUrl} (account ${existing.accountId}).\\n`);\n return 0;\n } catch (error) {\n if (!(error instanceof AuthApiError) || error.status >= 500) throw error;\n }\n }\n\n const verifier = dependencies.randomVerifier?.() ?? defaultVerifier();\n if (verifier.length < 43 || verifier.length > 128) {\n throw new CliError(\"invalid_verifier\", \"Generated PKCE verifier is invalid\", 1);\n }\n // Only the challenge leaves this process; the PKCE verifier stays local until exchange.\n const authorization = await startAuthorization(baseUrl, verifierChallenge(verifier));\n if (!Number.isFinite(authorization.expiresIn) || authorization.expiresIn <= 0 ||\n !Number.isFinite(authorization.interval) || authorization.interval < 1) {\n throw new CliError(\"invalid_auth_response\", \"MediaRuntime returned invalid authorization timing\", 5);\n }\n\n write(`Open this URL to authorize MediaRuntime CLI:\\n${authorization.verificationUriComplete}\\n\\n`);\n write(`Confirm code: ${authorization.userCode}\\n`);\n if (!noBrowser) await (dependencies.openBrowser ?? openBrowser)(authorization.verificationUriComplete);\n write(\"Waiting for browser approval…\\n\");\n\n const now = dependencies.now ?? Date.now;\n const sleep = dependencies.sleep ?? defaultSleep;\n const deadline = now() + authorization.expiresIn * 1000;\n let credential;\n while (now() < deadline) {\n try {\n credential = await exchangeAuthorization(baseUrl, authorization.deviceCode, verifier);\n break;\n } catch (error) {\n if (error instanceof AuthApiError && error.code === \"authorization_pending\") {\n // Respect the server-provided polling interval to avoid a busy device-flow loop.\n await sleep(authorization.interval * 1000);\n continue;\n }\n throw error;\n }\n }\n if (!credential) throw new CliError(\"authorization_timeout\", \"Browser authorization expired; run mediaruntime login again\", 7);\n\n try {\n await inspectCredential(baseUrl, credential.apiKey);\n await store(dependencies).set({\n apiKey: credential.apiKey,\n accountId: credential.accountId,\n keyId: credential.keyId,\n baseUrl,\n createdAt: new Date(now()).toISOString(),\n });\n } catch (error) {\n // Do not leave an active server credential behind when local persistence fails.\n await revokeCredential(baseUrl, credential.apiKey).catch(() => undefined);\n throw error;\n }\n\n write(`Logged in to ${baseUrl} (account ${credential.accountId}).\\n`);\n if (process.env.MEDIARUNTIME_API_KEY?.trim()) {\n write(\"MEDIARUNTIME_API_KEY is set and will take precedence over this login.\\n\");\n }\n return 0;\n}\n\nexport async function runAuthStatusCommand(\n args: string[],\n baseUrl: string,\n dependencies: AuthCommandDependencies = {},\n): Promise<number> {\n assertOnly(args, [\"--json\"]);\n const json = args.includes(\"--json\");\n const write = dependencies.writeStdout ?? ((text: string) => process.stdout.write(text));\n const resolved = await resolveCredential(baseUrl, dependencies);\n if (!resolved) throw new CliError(\"authentication_required\", \"Run mediaruntime login or set MEDIARUNTIME_API_KEY\", 3);\n const status = await inspectCredential(baseUrl, resolved.apiKey);\n if (json) {\n write(`${JSON.stringify({ authenticated: true, source: resolved.source, ...status })}\\n`);\n } else {\n write(`Authenticated via ${resolved.source} (account ${status.accountId}, key ${status.keyId}).\\n`);\n }\n return 0;\n}\n\nexport async function runLogoutCommand(\n args: string[],\n baseUrl: string,\n dependencies: AuthCommandDependencies = {},\n): Promise<number> {\n assertOnly(args, [\"--local-only\"]);\n const localOnly = args.includes(\"--local-only\");\n const write = dependencies.writeStdout ?? ((text: string) => process.stdout.write(text));\n const credentialStore = store(dependencies);\n const credential = await credentialStore.get(baseUrl);\n if (!credential) {\n write(`No stored login for ${baseUrl}.\\n`);\n if (process.env.MEDIARUNTIME_API_KEY?.trim()) write(\"MEDIARUNTIME_API_KEY remains active in this shell.\\n\");\n return 0;\n }\n if (!localOnly) await revokeCredential(baseUrl, credential.apiKey);\n await credentialStore.delete(baseUrl);\n write(localOnly ? \"Removed the local CLI login without server revocation.\\n\" : \"Logged out and revoked the CLI credential.\\n\");\n if (process.env.MEDIARUNTIME_API_KEY?.trim()) write(\"MEDIARUNTIME_API_KEY remains active in this shell.\\n\");\n return 0;\n}\n\nexport async function runAuthCommand(\n args: string[],\n baseUrl: string,\n dependencies: AuthCommandDependencies = {},\n): Promise<number> {\n const subcommand = args[0];\n if (subcommand !== \"status\") throw new UsageError(\"Usage: mediaruntime auth status [--json]\");\n return runAuthStatusCommand(args.slice(1), baseUrl, dependencies);\n}\n","import { spawn } from \"node:child_process\";\nimport { CliError } from \"../errors.js\";\n\nexport async function openBrowser(url: string): Promise<void> {\n // Use the operating system URL handler so the CLI does not depend on a browser package.\n const command = process.platform === \"darwin\"\n ? { executable: \"open\", args: [url] }\n : process.platform === \"win32\"\n ? { executable: \"rundll32\", args: [\"url.dll,FileProtocolHandler\", url] }\n : { executable: \"xdg-open\", args: [url] };\n\n await new Promise<void>((resolve, reject) => {\n const child = spawn(command.executable, command.args, {\n detached: true,\n stdio: \"ignore\",\n });\n child.once(\"error\", (error) => reject(new CliError(\n \"browser_open_failed\",\n \"Could not open a browser; rerun with --no-browser and open the printed URL\",\n 2,\n { cause: error },\n )));\n child.once(\"spawn\", () => {\n // The browser owns its lifecycle after launch; the CLI can continue polling approval.\n child.unref();\n resolve();\n });\n });\n}\n","import { CliError } from \"../errors.js\";\n\nconst SERVICE = \"mediaruntime-cli\";\n\nexport interface StoredCredential {\n apiKey: string;\n accountId: string;\n keyId: string;\n baseUrl: string;\n createdAt: string;\n}\n\nexport interface CredentialStore {\n get(baseUrl: string): Promise<StoredCredential | null>;\n set(credential: StoredCredential): Promise<void>;\n delete(baseUrl: string): Promise<void>;\n}\n\nfunction vaultAccount(baseUrl: string): string {\n // One vault entry per host keeps production and local/development logins isolated.\n return new URL(baseUrl).host.toLowerCase();\n}\n\nfunction validCredential(value: unknown): value is StoredCredential {\n if (!value || typeof value !== \"object\") return false;\n const item = value as Record<string, unknown>;\n return typeof item.apiKey === \"string\" && item.apiKey.startsWith(\"sk_\") &&\n typeof item.accountId === \"string\" && item.accountId.length > 0 &&\n typeof item.keyId === \"string\" && item.keyId.length > 0 &&\n typeof item.baseUrl === \"string\" && item.baseUrl.length > 0 &&\n typeof item.createdAt === \"string\" && item.createdAt.length > 0;\n}\n\nasync function entry(baseUrl: string) {\n try {\n // Load keyring lazily so MEDIARUNTIME_API_KEY remains usable on unsupported systems.\n const { Entry } = await import(\"@napi-rs/keyring\");\n return new Entry(SERVICE, vaultAccount(baseUrl));\n } catch (error) {\n throw new CliError(\n \"credential_store_unavailable\",\n \"The operating-system credential vault is unavailable; use MEDIARUNTIME_API_KEY on this machine\",\n 2,\n { cause: error },\n );\n }\n}\n\nexport class OsCredentialStore implements CredentialStore {\n async get(baseUrl: string): Promise<StoredCredential | null> {\n try {\n const raw = (await entry(baseUrl)).getPassword();\n if (!raw) return null;\n const parsed: unknown = JSON.parse(raw);\n if (!validCredential(parsed) || parsed.baseUrl !== baseUrl) {\n throw new Error(\"Stored credential has an invalid shape\");\n }\n return parsed;\n } catch (error) {\n if (error instanceof SyntaxError || (error instanceof Error && error.message.includes(\"invalid shape\"))) {\n throw new CliError(\"credential_store_invalid\", \"The stored MediaRuntime credential is invalid; run mediaruntime logout --local-only\", 3);\n }\n if (error instanceof CliError) throw error;\n // Keyring implementations return a not-found error rather than null on some platforms.\n if (error instanceof Error && /not found|no entry|no matching|item.*exist/i.test(error.message)) return null;\n throw new CliError(\"credential_store_error\", \"Could not read the operating-system credential vault\", 2, { cause: error });\n }\n }\n\n async set(credential: StoredCredential): Promise<void> {\n try {\n (await entry(credential.baseUrl)).setPassword(JSON.stringify(credential));\n } catch (error) {\n if (error instanceof CliError) throw error;\n throw new CliError(\"credential_store_error\", \"Could not save the login in the operating-system credential vault\", 2, { cause: error });\n }\n }\n\n async delete(baseUrl: string): Promise<void> {\n try {\n (await entry(baseUrl)).deletePassword();\n } catch (error) {\n if (error instanceof CliError) throw error;\n if (error instanceof Error && /not found|no entry|no matching|item.*exist/i.test(error.message)) return;\n throw new CliError(\"credential_store_error\", \"Could not remove the login from the operating-system credential vault\", 2, { cause: error });\n }\n }\n}\n","import type { Capabilities } from \"@mediaruntime/node\";\nimport { UsageError } from \"../errors.js\";\n\nexport interface CapabilitiesReadClient {\n retrieve(): Promise<Capabilities>;\n}\n\nexport interface CapabilitiesCommandDependencies {\n capabilities: CapabilitiesReadClient;\n writeStdout(text: string): void;\n}\n\nexport interface PublicPresetRow {\n name: string;\n outputType: string;\n tier: string;\n sourceKinds: string[];\n artifacts: string[];\n description: string;\n codec: string | null;\n container: string | null;\n}\n\nfunction cell(value: string): string {\n return value || \"-\";\n}\n\nfunction table(headings: string[], rows: string[][]): string {\n const widths = headings.map((heading, index) =>\n Math.max(heading.length, ...rows.map((row) => row[index]?.length ?? 0)),\n );\n const render = (row: string[]): string =>\n row.map((value, index) => value.padEnd(widths[index] ?? value.length)).join(\" \").trimEnd();\n return `${[\n render(headings),\n render(widths.map((width) => \"-\".repeat(width))),\n ...rows.map(render),\n ].join(\"\\n\")}\\n`;\n}\n\nexport function publicPresetRows(capabilities: Capabilities): PublicPresetRow[] {\n // Preserve the gateway's public ordering and never expose metadata for private presets.\n return capabilities.publicPresets.map((name) => {\n const preset = capabilities.presets[name];\n if (!preset) {\n throw new Error(`Gateway capability contract is missing public preset metadata for ${name}`);\n }\n return {\n name,\n outputType: preset.outputType,\n tier: preset.baseTier,\n sourceKinds: preset.sourceKinds,\n artifacts: preset.artifacts,\n description: preset.description,\n codec: preset.codec ?? null,\n container: preset.container ?? null,\n };\n });\n}\n\nfunction parseJsonOnly(args: string[], command: string): boolean {\n let json = false;\n for (const argument of args) {\n if (argument === \"--json\") json = true;\n else throw new UsageError(`Unknown ${command} option: ${argument}`);\n }\n return json;\n}\n\nexport async function runCapabilitiesCommand(\n args: string[],\n dependencies: CapabilitiesCommandDependencies,\n): Promise<number> {\n const json = parseJsonOnly(args, \"capabilities\");\n const capabilities = await dependencies.capabilities.retrieve();\n if (json) {\n dependencies.writeStdout(`${JSON.stringify(capabilities)}\\n`);\n return 0;\n }\n\n const aliases = Object.entries(capabilities.outputAliases).map(([name, value]) => [\n name,\n value.type,\n value.preset,\n value.tier,\n ]);\n dependencies.writeStdout(\n `Public presets: ${capabilities.publicPresets.length}\\n` +\n `Optional features: ${Object.keys(capabilities.features).sort().join(\", \") || \"none\"}\\n\\n` +\n table([\"ALIAS\", \"TYPE\", \"PRESET\", \"TIER\"], aliases) +\n \"\\nRun `mediaruntime presets list` for the complete public preset catalog.\\n\",\n );\n return 0;\n}\n\nexport async function runPresetsCommand(\n args: string[],\n dependencies: CapabilitiesCommandDependencies,\n): Promise<number> {\n const subcommand = args[0];\n if (subcommand !== \"list\") throw new UsageError(\"Usage: mediaruntime presets list [--json]\");\n const json = parseJsonOnly(args.slice(1), \"presets list\");\n const capabilities = await dependencies.capabilities.retrieve();\n const presets = publicPresetRows(capabilities);\n if (json) dependencies.writeStdout(`${JSON.stringify({ presets })}\\n`);\n else {\n dependencies.writeStdout(table(\n [\"PRESET\", \"TYPE\", \"TIER\", \"INPUTS\", \"ARTIFACTS\"],\n presets.map((preset) => [\n preset.name,\n cell(preset.outputType),\n cell(preset.tier),\n preset.sourceKinds.join(\",\"),\n preset.artifacts.join(\", \"),\n ]),\n ));\n }\n return 0;\n}\n","import type { JobDetails, JobPage, JobStatus, ListJobsParams } from \"@mediaruntime/node\";\nimport { BundleDownloadError, UsageError } from \"../errors.js\";\n\nconst UNSUCCESSFUL_TERMINAL_STATUSES = new Set([\"FAILED\", \"REJECTED\", \"PARTIAL\"]);\n\nexport interface JobsReadClient {\n list(params?: ListJobsParams): Promise<JobPage>;\n get(jobId: string): Promise<JobDetails>;\n}\n\nexport interface JobsCommandDependencies {\n jobs: JobsReadClient;\n writeStdout(text: string): void;\n downloadBundle(\n url: string,\n destination: string,\n options: { force: boolean; expectedSizeBytes?: number | null; expectedSha256?: string | null },\n ): Promise<void>;\n}\n\nfunction optionValue(args: string[], index: number, option: string): string {\n const value = args[index + 1];\n if (!value || value.startsWith(\"--\")) throw new UsageError(`${option} requires a value`);\n return value;\n}\n\nfunction detailsProjection(job: JobDetails): Record<string, unknown> {\n // Keep machine-readable output useful while omitting the signed bundle URL from JSON logs.\n return {\n id: job.id,\n status: job.status,\n tier: job.tier,\n ...(job.deliverWebhook === undefined ? {} : { deliverWebhook: job.deliverWebhook }),\n usage: job.usage,\n billing: job.billing,\n bundle: {\n available: job.bundle.available,\n expiresAt: job.bundle.expiresAt,\n sizeBytes: job.bundle.sizeBytes,\n sha256: job.bundle.sha256,\n retentionDays: job.bundle.retentionDays,\n },\n media: job.media,\n recipe: job.recipe,\n metadata: job.metadata,\n error: job.error,\n createdAt: job.createdAt,\n updatedAt: job.updatedAt,\n startedAt: job.startedAt,\n completedAt: job.completedAt,\n };\n}\n\nfunction humanDetails(job: JobDetails): string {\n const lines = [\n `Job: ${job.id}`,\n `Status: ${job.status}`,\n `Tier: ${job.tier.billed ?? job.tier.effective ?? job.tier.requested ?? \"-\"}`,\n `Bundle: ${job.bundle.available ? \"available\" : \"unavailable\"}`,\n ];\n if (job.bundle.sizeBytes !== null) lines.push(`Bundle size: ${job.bundle.sizeBytes} bytes`);\n if (job.error) lines.push(`Error: ${job.error}`);\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction cell(value: unknown): string {\n if (value === null || value === undefined || value === \"\") return \"-\";\n return String(value);\n}\n\nfunction humanList(page: JobPage): string {\n const rows = page.jobs.map((job) => [\n job.id,\n job.status,\n cell(job.tierBilled),\n cell(job.unitsTotal),\n job.bundleAvailable ? \"yes\" : \"no\",\n cell(job.updatedAt),\n ]);\n const headings = [\"ID\", \"STATUS\", \"TIER\", \"UNITS\", \"BUNDLE\", \"UPDATED\"];\n const widths = headings.map((heading, index) =>\n Math.max(heading.length, ...rows.map((row) => row[index]?.length ?? 0)),\n );\n const render = (row: string[]): string =>\n row.map((value, index) => value.padEnd(widths[index] ?? value.length)).join(\" \").trimEnd();\n const lines = [render(headings), render(widths.map((width) => \"-\".repeat(width))), ...rows.map(render)];\n if (page.nextCursor) lines.push(`Next cursor: ${page.nextCursor}`);\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nasync function listCommand(args: string[], dependencies: JobsCommandDependencies): Promise<number> {\n let status: string | undefined;\n let limit: number | undefined;\n let cursor: string | undefined;\n let json = false;\n for (let index = 0; index < args.length; index += 1) {\n const argument = args[index];\n if (argument === \"--status\") {\n status = optionValue(args, index, argument).toUpperCase();\n index += 1;\n } else if (argument === \"--limit\") {\n const value = Number(optionValue(args, index, argument));\n if (!Number.isSafeInteger(value) || value < 1 || value > 100) {\n throw new UsageError(\"--limit must be an integer between 1 and 100\");\n }\n limit = value;\n index += 1;\n } else if (argument === \"--cursor\") {\n cursor = optionValue(args, index, argument);\n index += 1;\n } else if (argument === \"--json\") {\n json = true;\n } else {\n throw new UsageError(`Unknown jobs list option: ${argument}`);\n }\n }\n const params: ListJobsParams = {\n ...(status === undefined ? {} : { status: status as JobStatus }),\n ...(limit === undefined ? {} : { limit }),\n ...(cursor === undefined ? {} : { cursor }),\n };\n const page = await dependencies.jobs.list(params);\n dependencies.writeStdout(json ? `${JSON.stringify(page)}\\n` : humanList(page));\n return 0;\n}\n\nasync function getCommand(args: string[], dependencies: JobsCommandDependencies): Promise<number> {\n let jobId: string | undefined;\n let download: string | undefined;\n let force = false;\n let json = false;\n for (let index = 0; index < args.length; index += 1) {\n const argument = args[index];\n if (argument === \"--download\") {\n download = optionValue(args, index, argument);\n index += 1;\n } else if (argument === \"--force\") {\n force = true;\n } else if (argument === \"--json\") {\n json = true;\n } else if (argument?.startsWith(\"-\")) {\n throw new UsageError(`Unknown jobs get option: ${argument}`);\n } else if (!jobId) {\n jobId = argument;\n } else {\n throw new UsageError(\"jobs get accepts exactly one job ID\");\n }\n }\n if (!jobId) throw new UsageError(\"Usage: mediaruntime jobs get <job_id>\");\n if (force && !download) throw new UsageError(\"--force requires --download\");\n const job = await dependencies.jobs.get(jobId);\n if (!json) dependencies.writeStdout(humanDetails(job));\n\n if (UNSUCCESSFUL_TERMINAL_STATUSES.has(String(job.status).toUpperCase())) {\n // A retrieved failed job is a successful API call but an unsuccessful automation result.\n if (json) dependencies.writeStdout(`${JSON.stringify(detailsProjection(job))}\\n`);\n return 6;\n }\n if (download) {\n if (String(job.status).toUpperCase() !== \"COMPLETED\" ||\n !job.bundle.available || !job.bundle.downloadUrl) {\n throw new BundleDownloadError(\"Bundle download requires a COMPLETED job with an available canonical bundle\");\n }\n try {\n // Verify gateway-provided size and digest before publishing the downloaded bundle.\n await dependencies.downloadBundle(job.bundle.downloadUrl, download, {\n force,\n expectedSizeBytes: job.bundle.sizeBytes,\n expectedSha256: job.bundle.sha256,\n });\n } catch (error) {\n if (error instanceof BundleDownloadError) throw error;\n throw new BundleDownloadError(`Could not download bundle to ${download}`, { cause: error });\n }\n if (!json) dependencies.writeStdout(`Downloaded bundle to ${download}\\n`);\n }\n if (json) dependencies.writeStdout(`${JSON.stringify(detailsProjection(job))}\\n`);\n return 0;\n}\n\nexport async function runJobsCommand(\n args: string[],\n dependencies: JobsCommandDependencies,\n): Promise<number> {\n const subcommand = args[0];\n if (subcommand === \"list\") return listCommand(args.slice(1), dependencies);\n if (subcommand === \"get\") return getCommand(args.slice(1), dependencies);\n throw new UsageError(\"Usage: mediaruntime jobs <list|get>\");\n}\n","import { open } from \"node:fs/promises\";\nimport { UsageError } from \"./errors.js\";\n\nconst MAX_FILE_BYTES = 1024 * 1024;\ntype Segment = { startTimeSec: number; endTimeSec: number; text: string };\n\nfunction timestamp(value: string): number {\n const match = /^(?:(\\d{2,}):)?(\\d{2}):(\\d{2})[.,](\\d{3})$/.exec(value);\n if (!match || Number(match[2]) > 59 || Number(match[3]) > 59) {\n throw new UsageError(\"Transcript cue times must use HH:MM:SS,mmm (SRT) or MM:SS.mmm / HH:MM:SS.mmm (VTT)\");\n }\n return Number(match[1] ?? 0) * 3600 + Number(match[2]) * 60 + Number(match[3]) + Number(match[4]) / 1000;\n}\n\n/** Flatten subtitle formatting just as the browser attachment flow does. */\nfunction subtitleSegments(text: string, vtt: boolean): unknown[] {\n if (vtt && !/^WEBVTT(?:\\s|$)/.test(text)) throw new UsageError(\"VTT transcripts must begin with WEBVTT\");\n const segments: Segment[] = [];\n for (const block of text.split(/\\n[ \\t]*\\n/)) {\n if (vtt && /^(WEBVTT(?:\\s|$)|NOTE(?:\\s|$)|STYLE(?:\\s|$)|REGION(?:\\s|$))/.test(block)) continue;\n const lines = block.split(\"\\n\");\n const timing = lines[0]?.includes(\"-->\") ? 0 : 1;\n const match = /^(\\S+)\\s+-->\\s+(\\S+)(?:\\s+.*)?$/.exec(lines[timing] ?? \"\");\n if (!match) throw new UsageError(\"Transcript contains an invalid SRT/VTT cue\");\n const entities: Record<string, string> = { amp: \"&\", lt: \"<\", gt: \">\", quot: '\"', apos: \"'\", nbsp: \" \" };\n const cue = lines.slice(timing + 1).join(\"\\n\").replace(/<[^>]*>/g, \"\")\n .replace(/&(amp|lt|gt|quot|apos|nbsp);/g, (_, name: string) => entities[name]!);\n segments.push({ startTimeSec: timestamp(match[1]!), endTimeSec: timestamp(match[2]!), text: cue });\n }\n return segments;\n}\n\n/** Read a bounded local attachment. Its timestamps always refer to the full source. */\nexport async function readClipTranscript(path: string): Promise<Segment[]> {\n if (!/\\.(json|srt|vtt)$/i.test(path)) throw new UsageError(\"--clip-transcript accepts a local .json, .srt, or .vtt file\");\n let data: Buffer;\n try {\n const file = await open(path, \"r\");\n try {\n if (!(await file.stat()).isFile()) throw new UsageError(\"Clip transcript must be a regular file\");\n // Bound the read itself as well as the parsed text, even if a file changes.\n const buffer = Buffer.alloc(MAX_FILE_BYTES + 1);\n let size = 0;\n while (size < buffer.length) {\n const read = await file.read(buffer, size, buffer.length - size, null);\n if (!read.bytesRead) break;\n size += read.bytesRead;\n }\n if (size > MAX_FILE_BYTES) throw new UsageError(\"Clip transcript file must be at most 1 MiB\");\n data = buffer.subarray(0, size);\n } finally { await file.close(); }\n } catch (error) {\n if (error instanceof UsageError) throw error;\n throw new UsageError(\"Cannot read clip transcript file; check its path and permissions\");\n }\n let text: string;\n try { text = new TextDecoder(\"utf-8\", { fatal: true }).decode(data).replace(/^\\uFEFF/, \"\").replace(/\\r\\n?/g, \"\\n\").trim(); }\n catch { throw new UsageError(\"Clip transcript must be valid UTF-8 text\"); }\n let segments: unknown;\n if (/\\.json$/i.test(path)) {\n let value: unknown;\n try { value = JSON.parse(text); }\n catch { throw new UsageError(\"Clip transcript must be valid JSON\"); }\n segments = Array.isArray(value) ? value : value && typeof value === \"object\" && \"transcript\" in value ? value.transcript : undefined;\n } else segments = subtitleSegments(text, /\\.vtt$/i.test(path));\n if (!Array.isArray(segments) || !segments.length || segments.length > 2000) {\n throw new UsageError(\"Clip transcript must contain 1 to 2000 segments\");\n }\n let previous = -1;\n let totalBytes = 0;\n return segments.map((value: unknown) => {\n const segment = value && typeof value === \"object\" ? value as Record<string, unknown> : {};\n // Downloaded reports use snake_case; Node SDK reports use camelCase.\n const start = segment.start_time_sec ?? segment.startTimeSec;\n const end = segment.end_time_sec ?? segment.endTimeSec;\n const cue = segment.text;\n if (typeof start !== \"number\" || !Number.isFinite(start) || typeof end !== \"number\" || !Number.isFinite(end) ||\n start < 0 || end <= start || end > 604800 || start < previous) {\n throw new UsageError(\"Transcript segments require ordered finite source times with end after start (within 604800 seconds)\");\n }\n if (typeof cue !== \"string\" || !cue.trim() || Buffer.byteLength(cue, \"utf8\") > 2000) {\n throw new UsageError(\"Transcript segments require nonblank text of at most 2000 UTF-8 bytes\");\n }\n previous = start;\n totalBytes += Buffer.byteLength(cue, \"utf8\");\n if (totalBytes > 256 * 1024) throw new UsageError(\"Transcript text exceeds 256 KiB\");\n // Project only supported fields; renderer intersects and rebases these times.\n return { startTimeSec: start, endTimeSec: end, text: cue.trim() };\n });\n}\n","import type {\n Capabilities,\n CreateJobParams,\n JobDetails,\n JobOutput,\n JobReceiptData,\n Metadata,\n OutputAlias,\n WaitForJobOptions,\n} from \"@mediaruntime/node\";\nimport type { CapabilitiesReadClient } from \"./capabilities.js\";\nimport { readClipTranscript } from \"../clipTranscript.js\";\nimport { BundleDownloadError, UsageError } from \"../errors.js\";\nimport type { ActivityIndicator } from \"../ui/activity.js\";\n\nconst UNSUCCESSFUL_TERMINAL_STATUSES = new Set([\"FAILED\", \"REJECTED\", \"PARTIAL\"]);\n// Fast-path aliases are stable CLI inputs; preset metadata is still fetched from capabilities.\nconst OUTPUT_ALIASES = new Set([\n \"video.web\",\n \"video.streaming\",\n \"video.social\",\n \"audio.web\",\n \"audio.transcription\",\n \"image.web\",\n]);\n\ninterface SubmittedJob extends JobReceiptData {\n wait(options?: WaitForJobOptions): Promise<JobDetails>;\n}\n\nexport interface RunJobsClient {\n create(params: CreateJobParams): Promise<SubmittedJob>;\n}\n\nexport interface RunUploadsClient {\n resolveSource(source: string): Promise<string>;\n}\n\nexport interface RunCommandDependencies {\n jobs: RunJobsClient;\n capabilities: CapabilitiesReadClient;\n uploads?: RunUploadsClient;\n writeStdout(text: string): void;\n activity: ActivityIndicator;\n downloadBundle(\n url: string,\n destination: string,\n options: { force: boolean; expectedSizeBytes?: number | null; expectedSha256?: string | null },\n ): Promise<void>;\n}\n\ninterface RunOptions {\n source: string;\n outputs: Array<{ kind: \"alias\" | \"preset\"; value: string }>;\n recipe?: string;\n metadata?: Metadata;\n idempotencyKey?: string;\n deliverWebhook?: false;\n wait: boolean;\n timeoutMs?: number;\n download?: string;\n force: boolean;\n json: boolean;\n animation?: {\n width?: number;\n fps?: number;\n startTime?: number;\n duration?: number;\n loop?: number;\n quality?: number;\n };\n placeholders?: {\n maxDimension?: number;\n sourceTimeSec?: number;\n lqipQuality?: number;\n lqipMaxBytes?: number;\n };\n contactSheet?: {\n columns?: number;\n rows?: number;\n tileWidth?: number;\n tileHeight?: number;\n intervalSec?: number;\n startTimeSec?: number;\n durationSec?: number;\n maxSheets?: number;\n format?: \"jpg\" | \"png\" | \"webp\";\n quality?: number;\n };\n image?: {\n width?: number;\n height?: number;\n mode?: \"fit\" | \"fill\" | \"cover\" | \"contain\";\n format?: \"jpg\" | \"png\" | \"webp\" | \"avif\";\n quality?: number;\n maxBytes?: number;\n minQuality?: number;\n };\n clip?: {\n startTimeSec: number;\n durationSec: number;\n layout?: \"original\" | \"vertical_blur\";\n burnCaptions?: boolean;\n transcript?: Array<{ startTimeSec: number; endTimeSec: number; text: string }>;\n };\n clipAnalysis?: {\n minDurationSec?: number;\n maxDurationSec?: number;\n maxCandidates?: number;\n keywords?: string[];\n transcript?: Array<{ startTimeSec: number; endTimeSec: number; text: string }>;\n };\n clipTranscriptFile?: string;\n audiogram?: {\n artworkSource: string;\n captionsSource?: string;\n layout?: \"square\" | \"portrait\" | \"landscape\";\n artworkFit?: \"contain\" | \"cover\" | \"blurred_background\";\n backgroundColor?: string;\n waveformColor?: string;\n waveformGain?: number;\n startTimeSec?: number;\n durationSec?: number;\n fps?: number;\n burnCaptions?: boolean;\n captionPosition?: \"top\" | \"bottom\";\n captionFontScale?: number;\n normalizeAudio?: boolean;\n loudnessTargetLufs?: number;\n };\n privacyRedaction?: {\n detectors: Array<\"face\" | \"license_plate\" | \"text\">;\n style?: \"blur\" | \"pixelate\" | \"solid\";\n failureMode?: \"fail_closed\" | \"report_only\";\n minConfidence?: number;\n sampleIntervalSec?: number;\n maxFrames?: number;\n boxPaddingRatio?: number;\n solidColor?: string;\n pixelBlockSize?: number;\n privacyStrength?: \"standard\" | \"strong\";\n includeDebugObservations?: boolean;\n };\n}\n\nfunction optionValue(args: string[], index: number, option: string): string {\n const value = args[index + 1];\n if (!value || value.startsWith(\"--\")) throw new UsageError(`${option} requires a value`);\n return value;\n}\n\nfunction parseMetadata(value: string): Metadata {\n let parsed: unknown;\n try {\n parsed = JSON.parse(value) as unknown;\n } catch {\n throw new UsageError(\"--metadata must be a valid JSON object\");\n }\n if (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new UsageError(\"--metadata must be a JSON object\");\n }\n return parsed as Metadata;\n}\n\nfunction boundedNumber(\n args: string[],\n index: number,\n option: string,\n minimum: number,\n maximum: number,\n integer = false,\n): number {\n const value = Number(optionValue(args, index, option));\n if (!Number.isFinite(value) || value < minimum || value > maximum || (integer && !Number.isInteger(value))) {\n throw new UsageError(`${option} must be ${integer ? \"an integer \" : \"\"}between ${minimum} and ${maximum}`);\n }\n return value;\n}\n\nfunction hexColor(args: string[], index: number, option: string): string {\n const value = optionValue(args, index, option);\n if (!/^#[0-9A-Fa-f]{6}$/.test(value)) {\n throw new UsageError(`${option} must be a six-digit hex colour such as #5B5CFF`);\n }\n return value;\n}\n\nfunction parseRunOptions(args: string[]): RunOptions {\n let source: string | undefined;\n const outputs: RunOptions[\"outputs\"] = [];\n let metadata: Metadata | undefined;\n let recipe: string | undefined;\n let idempotencyKey: string | undefined;\n let deliverWebhook: false | undefined;\n let wait = false;\n let timeoutMs: number | undefined;\n let download: string | undefined;\n let force = false;\n let json = false;\n const animation: NonNullable<RunOptions[\"animation\"]> = {};\n const placeholders: NonNullable<RunOptions[\"placeholders\"]> = {};\n const contactSheet: NonNullable<RunOptions[\"contactSheet\"]> = {};\n const image: NonNullable<RunOptions[\"image\"]> = {};\n const audiogram: Partial<NonNullable<RunOptions[\"audiogram\"]>> = {};\n const clip: Partial<NonNullable<RunOptions[\"clip\"]>> = {};\n const clipAnalysis: NonNullable<RunOptions[\"clipAnalysis\"]> = {};\n let clipTranscriptFile: string | undefined;\n const privacyRedaction: Partial<NonNullable<RunOptions[\"privacyRedaction\"]>> = {};\n const privacyDetectors: Array<\"face\" | \"license_plate\" | \"text\"> = [];\n\n for (let index = 0; index < args.length; index += 1) {\n const argument = args[index];\n if (argument === \"--output\" || argument === \"-o\") {\n outputs.push({ kind: \"alias\", value: optionValue(args, index, argument) });\n index += 1;\n } else if (argument === \"--preset\") {\n outputs.push({ kind: \"preset\", value: optionValue(args, index, argument) });\n index += 1;\n } else if (argument === \"--recipe\") {\n recipe = optionValue(args, index, argument);\n index += 1;\n } else if (argument === \"--metadata\") {\n metadata = parseMetadata(optionValue(args, index, argument));\n index += 1;\n } else if (argument === \"--idempotency-key\") {\n idempotencyKey = optionValue(args, index, argument);\n index += 1;\n } else if (argument === \"--no-webhook\") {\n deliverWebhook = false;\n } else if (argument === \"--wait\") {\n wait = true;\n } else if (argument === \"--timeout-ms\") {\n const value = Number(optionValue(args, index, argument));\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new UsageError(\"--timeout-ms must be a positive integer\");\n }\n timeoutMs = value;\n index += 1;\n } else if (argument === \"--download\") {\n download = optionValue(args, index, argument);\n wait = true;\n index += 1;\n } else if (argument === \"--force\") {\n force = true;\n } else if (argument === \"--json\") {\n json = true;\n } else if (argument === \"--animation-width\") {\n animation.width = boundedNumber(args, index, argument, 1, 1920, true);\n index += 1;\n } else if (argument === \"--animation-fps\") {\n animation.fps = boundedNumber(args, index, argument, 0.01, 30);\n index += 1;\n } else if (argument === \"--animation-start\") {\n animation.startTime = boundedNumber(args, index, argument, 0, 604800);\n index += 1;\n } else if (argument === \"--animation-duration\") {\n animation.duration = boundedNumber(args, index, argument, 0.01, 30);\n index += 1;\n } else if (argument === \"--animation-loop\") {\n animation.loop = boundedNumber(args, index, argument, 0, 65535, true);\n index += 1;\n } else if (argument === \"--animation-quality\") {\n animation.quality = boundedNumber(args, index, argument, 1, 100, true);\n index += 1;\n } else if (argument === \"--placeholder-max-dimension\") {\n placeholders.maxDimension = boundedNumber(args, index, argument, 8, 100, true);\n index += 1;\n } else if (argument === \"--placeholder-time\") {\n placeholders.sourceTimeSec = boundedNumber(args, index, argument, 0, 604800);\n index += 1;\n } else if (argument === \"--lqip-quality\") {\n placeholders.lqipQuality = boundedNumber(args, index, argument, 1, 100, true);\n index += 1;\n } else if (argument === \"--lqip-max-bytes\") {\n placeholders.lqipMaxBytes = boundedNumber(args, index, argument, 256, 16384, true);\n index += 1;\n } else if (argument === \"--contact-columns\") {\n contactSheet.columns = boundedNumber(args, index, argument, 1, 10, true);\n index += 1;\n } else if (argument === \"--contact-rows\") {\n contactSheet.rows = boundedNumber(args, index, argument, 1, 10, true);\n index += 1;\n } else if (argument === \"--contact-tile-width\") {\n contactSheet.tileWidth = boundedNumber(args, index, argument, 64, 640, true);\n index += 1;\n } else if (argument === \"--contact-tile-height\") {\n contactSheet.tileHeight = boundedNumber(args, index, argument, 36, 640, true);\n index += 1;\n } else if (argument === \"--contact-interval\") {\n contactSheet.intervalSec = boundedNumber(args, index, argument, 0.5, 3600);\n index += 1;\n } else if (argument === \"--contact-start\") {\n contactSheet.startTimeSec = boundedNumber(args, index, argument, 0, 604800);\n index += 1;\n } else if (argument === \"--contact-duration\") {\n contactSheet.durationSec = boundedNumber(args, index, argument, 0, 21600);\n index += 1;\n } else if (argument === \"--contact-max-sheets\") {\n contactSheet.maxSheets = boundedNumber(args, index, argument, 1, 20, true);\n index += 1;\n } else if (argument === \"--contact-format\") {\n const value = optionValue(args, index, argument);\n if (value !== \"jpg\" && value !== \"png\" && value !== \"webp\") {\n throw new UsageError(\"--contact-format must be jpg, png, or webp\");\n }\n contactSheet.format = value;\n index += 1;\n } else if (argument === \"--contact-quality\") {\n contactSheet.quality = boundedNumber(args, index, argument, 1, 100, true);\n index += 1;\n } else if (argument === \"--image-width\") {\n image.width = boundedNumber(args, index, argument, 1, 16384, true);\n index += 1;\n } else if (argument === \"--image-height\") {\n image.height = boundedNumber(args, index, argument, 1, 16384, true);\n index += 1;\n } else if (argument === \"--image-mode\") {\n const value = optionValue(args, index, argument);\n if (value !== \"fit\" && value !== \"fill\" && value !== \"cover\" && value !== \"contain\") {\n throw new UsageError(\"--image-mode must be fit, fill, cover, or contain\");\n }\n image.mode = value;\n index += 1;\n } else if (argument === \"--image-format\") {\n const value = optionValue(args, index, argument);\n if (value !== \"jpg\" && value !== \"png\" && value !== \"webp\" && value !== \"avif\") {\n throw new UsageError(\"--image-format must be jpg, png, webp, or avif\");\n }\n image.format = value;\n index += 1;\n } else if (argument === \"--image-quality\") {\n image.quality = boundedNumber(args, index, argument, 1, 100, true);\n index += 1;\n } else if (argument === \"--image-max-bytes\") {\n image.maxBytes = boundedNumber(args, index, argument, 256, 100_000_000, true);\n index += 1;\n } else if (argument === \"--image-min-quality\") {\n image.minQuality = boundedNumber(args, index, argument, 1, 100, true);\n index += 1;\n } else if (argument === \"--clip-start\") {\n clip.startTimeSec = boundedNumber(args, index, argument, 0, 604800);\n index += 1;\n } else if (argument === \"--clip-duration\") {\n clip.durationSec = boundedNumber(args, index, argument, 0.1, 300);\n index += 1;\n } else if (argument === \"--clip-layout\") {\n const value = optionValue(args, index, argument);\n if (value !== \"original\" && value !== \"vertical_blur\") {\n throw new UsageError(\"--clip-layout must be original or vertical_blur\");\n }\n clip.layout = value;\n index += 1;\n } else if (argument === \"--clip-captions\") {\n clip.burnCaptions = true;\n } else if (argument === \"--clip-transcript\") {\n clipTranscriptFile = optionValue(args, index, argument);\n index += 1;\n } else if (argument === \"--clip-min-duration\") {\n clipAnalysis.minDurationSec = boundedNumber(args, index, argument, 1, 300);\n index += 1;\n } else if (argument === \"--clip-max-duration\") {\n clipAnalysis.maxDurationSec = boundedNumber(args, index, argument, 1, 300);\n index += 1;\n } else if (argument === \"--clip-count\") {\n clipAnalysis.maxCandidates = boundedNumber(args, index, argument, 1, 20, true);\n index += 1;\n } else if (argument === \"--clip-keyword\") {\n (clipAnalysis.keywords ??= []).push(optionValue(args, index, argument));\n index += 1;\n } else if (argument === \"--audiogram-artwork\") {\n audiogram.artworkSource = optionValue(args, index, argument);\n index += 1;\n } else if (argument === \"--audiogram-captions\") {\n audiogram.captionsSource = optionValue(args, index, argument);\n audiogram.burnCaptions = true;\n index += 1;\n } else if (argument === \"--audiogram-layout\") {\n const value = optionValue(args, index, argument);\n if (value !== \"square\" && value !== \"portrait\" && value !== \"landscape\") {\n throw new UsageError(\"--audiogram-layout must be square, portrait, or landscape\");\n }\n audiogram.layout = value;\n index += 1;\n } else if (argument === \"--audiogram-background\") {\n audiogram.backgroundColor = hexColor(args, index, argument);\n index += 1;\n } else if (argument === \"--audiogram-waveform\") {\n audiogram.waveformColor = hexColor(args, index, argument);\n index += 1;\n } else if (argument === \"--audiogram-fit\") {\n const value = optionValue(args, index, argument);\n if (value !== \"contain\" && value !== \"cover\" && value !== \"blurred_background\") {\n throw new UsageError(\"--audiogram-fit must be contain, cover, or blurred_background\");\n }\n audiogram.artworkFit = value;\n index += 1;\n } else if (argument === \"--audiogram-waveform-gain\") {\n audiogram.waveformGain = boundedNumber(args, index, argument, 0.5, 4);\n index += 1;\n } else if (argument === \"--audiogram-caption-position\") {\n const value = optionValue(args, index, argument);\n if (value !== \"top\" && value !== \"bottom\") {\n throw new UsageError(\"--audiogram-caption-position must be top or bottom\");\n }\n audiogram.captionPosition = value;\n index += 1;\n } else if (argument === \"--audiogram-caption-scale\") {\n audiogram.captionFontScale = boundedNumber(args, index, argument, 0.75, 1.5);\n index += 1;\n } else if (argument === \"--audiogram-normalize\") {\n audiogram.normalizeAudio = true;\n } else if (argument === \"--audiogram-loudness-target\") {\n audiogram.loudnessTargetLufs = boundedNumber(args, index, argument, -24, -12);\n index += 1;\n } else if (argument === \"--audiogram-start\") {\n audiogram.startTimeSec = boundedNumber(args, index, argument, 0, 604800);\n index += 1;\n } else if (argument === \"--audiogram-duration\") {\n audiogram.durationSec = boundedNumber(args, index, argument, 0.1, 300);\n index += 1;\n } else if (argument === \"--audiogram-fps\") {\n audiogram.fps = boundedNumber(args, index, argument, 15, 30, true);\n index += 1;\n } else if (argument === \"--privacy-detector\") {\n const value = optionValue(args, index, argument);\n if (value !== \"face\" && value !== \"license_plate\" && value !== \"text\") {\n throw new UsageError(\"--privacy-detector must be face, license_plate, or text\");\n }\n if (privacyDetectors.includes(value)) {\n throw new UsageError(`Duplicate --privacy-detector: ${value}`);\n }\n privacyDetectors.push(value);\n index += 1;\n } else if (argument === \"--privacy-style\") {\n const value = optionValue(args, index, argument);\n if (value !== \"blur\" && value !== \"pixelate\" && value !== \"solid\") {\n throw new UsageError(\"--privacy-style must be blur, pixelate, or solid\");\n }\n privacyRedaction.style = value;\n index += 1;\n } else if (argument === \"--privacy-failure-mode\") {\n const value = optionValue(args, index, argument);\n if (value !== \"fail_closed\" && value !== \"report_only\") {\n throw new UsageError(\"--privacy-failure-mode must be fail_closed or report_only\");\n }\n privacyRedaction.failureMode = value;\n index += 1;\n } else if (argument === \"--privacy-min-confidence\") {\n privacyRedaction.minConfidence = boundedNumber(args, index, argument, 0.3, 0.99);\n index += 1;\n } else if (argument === \"--privacy-sample-interval\") {\n privacyRedaction.sampleIntervalSec = boundedNumber(args, index, argument, 0.1, 30);\n index += 1;\n } else if (argument === \"--privacy-max-frames\") {\n privacyRedaction.maxFrames = boundedNumber(args, index, argument, 1, 18000, true);\n index += 1;\n } else if (argument === \"--privacy-padding\") {\n privacyRedaction.boxPaddingRatio = boundedNumber(args, index, argument, 0, 0.5);\n index += 1;\n } else if (argument === \"--privacy-solid-color\") {\n privacyRedaction.solidColor = hexColor(args, index, argument);\n index += 1;\n } else if (argument === \"--privacy-pixel-block-size\") {\n privacyRedaction.pixelBlockSize = boundedNumber(args, index, argument, 4, 128, true);\n index += 1;\n } else if (argument === \"--privacy-strength\") {\n const value = optionValue(args, index, argument);\n if (value !== \"standard\" && value !== \"strong\") {\n throw new UsageError(\"--privacy-strength must be standard or strong\");\n }\n privacyRedaction.privacyStrength = value;\n index += 1;\n } else if (argument === \"--privacy-debug-observations\") {\n privacyRedaction.includeDebugObservations = true;\n } else if (argument?.startsWith(\"-\")) {\n throw new UsageError(`Unknown run option: ${argument}`);\n } else if (source === undefined) {\n source = argument;\n } else {\n throw new UsageError(\"run accepts exactly one source\");\n }\n }\n\n if (!source) {\n throw new UsageError(\"Usage: mediaruntime run <source> (--recipe <name[@version]> | --output <alias> | --preset <name>) [--wait]\");\n }\n if (recipe && outputs.length > 0) throw new UsageError(\"--recipe cannot be combined with --output or --preset\");\n if (!recipe && outputs.length === 0) throw new UsageError(\"run requires --recipe or at least one --output or --preset\");\n const unsupported = outputs.find(\n (output) => output.kind === \"alias\" && !OUTPUT_ALIASES.has(output.value),\n );\n if (unsupported) throw new UsageError(`Unsupported output alias: ${unsupported.value}`);\n if (force && !download) throw new UsageError(\"--force requires --download\");\n if (timeoutMs !== undefined && !wait) throw new UsageError(\"--timeout-ms requires --wait or --download\");\n const hasAnimationOptions = Object.keys(animation).length > 0;\n if (hasAnimationOptions) {\n const animationSelections = outputs.filter(\n (output) => output.kind === \"preset\" &&\n (output.value === \"image_animated_webp_v1\" || output.value === \"image_animated_apng_v1\"),\n );\n if (recipe || outputs.length !== 1 || animationSelections.length !== 1) {\n throw new UsageError(\"animation options require exactly one animated WebP or APNG --preset\");\n }\n if (animation.quality !== undefined && animationSelections[0]?.value === \"image_animated_apng_v1\") {\n throw new UsageError(\"--animation-quality applies to animated WebP only; APNG is lossless\");\n }\n }\n const hasPlaceholderOptions = Object.keys(placeholders).length > 0;\n if (hasPlaceholderOptions) {\n const placeholderSelections = outputs.filter(\n (output) => output.kind === \"preset\" && output.value === \"image_placeholders_v1\",\n );\n if (recipe || outputs.length !== 1 || placeholderSelections.length !== 1) {\n throw new UsageError(\"placeholder options require exactly one image_placeholders_v1 --preset\");\n }\n }\n const hasContactSheetOptions = Object.keys(contactSheet).length > 0;\n if (hasContactSheetOptions) {\n const selections = outputs.filter(\n (output) => output.kind === \"preset\" && output.value === \"contact_sheet_v1\",\n );\n if (recipe || outputs.length !== 1 || selections.length !== 1) {\n throw new UsageError(\"contact-sheet options require exactly one contact_sheet_v1 --preset\");\n }\n const geometry = {\n columns: 4,\n rows: 4,\n tileWidth: 320,\n tileHeight: 180,\n ...contactSheet,\n };\n if (geometry.columns * geometry.tileWidth > 4096 || geometry.rows * geometry.tileHeight > 4096) {\n throw new UsageError(\"contact-sheet width and height must each be at most 4096 pixels\");\n }\n if (contactSheet.format === \"png\" && contactSheet.quality !== undefined) {\n throw new UsageError(\"--contact-quality applies to JPG and WebP only; PNG is lossless\");\n }\n }\n const hasImageOptions = Object.keys(image).length > 0;\n if (hasImageOptions) {\n const selections = outputs.filter(\n (output) => output.kind === \"preset\" && output.value === \"image_multi_v1\",\n );\n if (recipe || outputs.length !== 1 || selections.length !== 1) {\n throw new UsageError(\"image rendition options require exactly one image_multi_v1 --preset\");\n }\n if (image.minQuality !== undefined && image.maxBytes === undefined) {\n throw new UsageError(\"--image-min-quality requires --image-max-bytes\");\n }\n const quality = image.quality ?? 80;\n if ((image.minQuality ?? 1) > quality) {\n throw new UsageError(\"--image-min-quality must not exceed --image-quality\");\n }\n const format = image.format ?? \"webp\";\n if (image.maxBytes !== undefined && format !== \"jpg\" && format !== \"webp\") {\n throw new UsageError(\"--image-max-bytes currently supports --image-format jpg or webp only\");\n }\n }\n const audiogramSelections = outputs.filter(\n (output) => output.kind === \"preset\" && output.value === \"audiogram_v1\",\n );\n const hasAudiogramOptions = Object.keys(audiogram).length > 0;\n if (hasAudiogramOptions || audiogramSelections.length > 0) {\n if (recipe || outputs.length !== 1 || audiogramSelections.length !== 1) {\n throw new UsageError(\"audiogram options require exactly one audiogram_v1 --preset\");\n }\n if (!audiogram.artworkSource) {\n throw new UsageError(\"audiogram_v1 requires --audiogram-artwork <PNG|JPEG|WebP source>\");\n }\n }\n const hasPrivacyOptions = privacyDetectors.length > 0 || Object.keys(privacyRedaction).length > 0;\n const clipPreset = outputs.length === 1 && outputs[0]?.kind === \"preset\"\n ? outputs[0].value : undefined;\n const hasClip = Object.keys(clip).length > 0 || clipPreset === \"video_clip_v1\";\n const hasClipAnalysis = Object.keys(clipAnalysis).length > 0 || clipPreset === \"clip_candidates_v1\";\n if (hasClip && (recipe || clipPreset !== \"video_clip_v1\" || hasClipAnalysis)) {\n throw new UsageError(\"clip render options require exactly one video_clip_v1 --preset\");\n }\n if (hasClip && (clip.startTimeSec === undefined || clip.durationSec === undefined)) {\n throw new UsageError(\"video_clip_v1 requires --clip-start and --clip-duration\");\n }\n if (hasClipAnalysis && (recipe || clipPreset !== \"clip_candidates_v1\")) {\n throw new UsageError(\"clip analysis options require exactly one clip_candidates_v1 --preset\");\n }\n if ((clipAnalysis.minDurationSec ?? 15) > (clipAnalysis.maxDurationSec ?? 60)) {\n throw new UsageError(\"--clip-min-duration must not exceed --clip-max-duration\");\n }\n if ((clipAnalysis.keywords?.length ?? 0) > 20) {\n throw new UsageError(\"At most 20 --clip-keyword values are supported\");\n }\n if (clipAnalysis.keywords?.some((keyword) => !keyword.trim() || Buffer.byteLength(keyword, \"utf8\") > 100)) {\n throw new UsageError(\"Each --clip-keyword must contain 1 to 100 UTF-8 bytes of nonblank text\");\n }\n if (clipTranscriptFile && !hasClip && !hasClipAnalysis) {\n throw new UsageError(\"--clip-transcript requires a clipping preset\");\n }\n if (clip.burnCaptions && !clipTranscriptFile) {\n throw new UsageError(\"--clip-captions requires --clip-transcript with source timestamps\");\n }\n if (hasPrivacyOptions) {\n if (recipe) throw new UsageError(\"privacy-redaction options cannot be combined with --recipe\");\n if (privacyDetectors.length === 0) {\n throw new UsageError(\"privacy redaction requires at least one --privacy-detector\");\n }\n if (/\\.(?:mp4|mov|mkv|webm|gif|apng)(?:$|[?#])/i.test(source)) {\n throw new UsageError(\n \"privacy redaction Preview accepts still-image inputs only; video and animated images are not available\",\n );\n }\n privacyRedaction.detectors = privacyDetectors;\n }\n return {\n source,\n outputs,\n ...(recipe === undefined ? {} : { recipe }),\n ...(metadata === undefined ? {} : { metadata }),\n ...(idempotencyKey === undefined ? {} : { idempotencyKey }),\n ...(deliverWebhook === undefined ? {} : { deliverWebhook }),\n wait,\n ...(timeoutMs === undefined ? {} : { timeoutMs }),\n ...(download === undefined ? {} : { download }),\n force,\n json,\n ...(hasAnimationOptions ? { animation } : {}),\n ...(hasPlaceholderOptions ? { placeholders } : {}),\n ...(hasContactSheetOptions ? { contactSheet } : {}),\n ...(hasImageOptions ? { image } : {}),\n ...(hasClip ? { clip: clip as NonNullable<RunOptions[\"clip\"]> } : {}),\n ...(hasClipAnalysis ? { clipAnalysis } : {}),\n ...(clipTranscriptFile ? { clipTranscriptFile } : {}),\n ...(hasAudiogramOptions || audiogramSelections.length > 0\n ? { audiogram: audiogram as NonNullable<RunOptions[\"audiogram\"]> }\n : {}),\n ...(hasPrivacyOptions\n ? { privacyRedaction: privacyRedaction as NonNullable<RunOptions[\"privacyRedaction\"]> }\n : {}),\n };\n}\n\n\nfunction isHostedAsset(source: string): boolean {\n return /^(?:https?|gs):\\/\\//i.test(source);\n}\n\nasync function resolveAudiogramAsset(\n source: string,\n label: \"artwork\" | \"captions\",\n uploads?: RunUploadsClient,\n): Promise<string> {\n if (isHostedAsset(source)) return source;\n if (/^[a-z][a-z0-9+.-]*:/i.test(source) && !/^file:\\/\\//i.test(source)) {\n throw new UsageError(`Audiogram ${label} must be an HTTP(S) URL, gs:// URI, or local file path`);\n }\n if (!uploads) {\n throw new UsageError(`This client cannot upload local Audiogram ${label}; use an HTTP(S) URL or gs:// URI`);\n }\n // Upload local artwork/captions through the SDK before embedding their private source URI.\n return await uploads.resolveSource(source);\n}\n\nasync function resolveAudiogram(\n value: NonNullable<RunOptions[\"audiogram\"]>,\n uploads?: RunUploadsClient,\n): Promise<NonNullable<RunOptions[\"audiogram\"]>> {\n const artworkSource = await resolveAudiogramAsset(value.artworkSource, \"artwork\", uploads);\n const captionsSource = value.captionsSource === undefined\n ? undefined\n : await resolveAudiogramAsset(value.captionsSource, \"captions\", uploads);\n return {\n ...value,\n artworkSource,\n ...(captionsSource === undefined ? {} : { captionsSource, burnCaptions: true }),\n };\n}\n\nasync function resolveOutputs(\n selections: RunOptions[\"outputs\"],\n capabilitiesClient: CapabilitiesReadClient,\n animation?: RunOptions[\"animation\"],\n placeholders?: RunOptions[\"placeholders\"],\n contactSheet?: RunOptions[\"contactSheet\"],\n image?: RunOptions[\"image\"],\n audiogram?: RunOptions[\"audiogram\"],\n privacyRedaction?: RunOptions[\"privacyRedaction\"],\n clip?: RunOptions[\"clip\"],\n clipAnalysis?: RunOptions[\"clipAnalysis\"],\n): Promise<Array<OutputAlias | JobOutput>> {\n // Plain aliases need no expansion; preset-specific options require authoritative metadata.\n if (!privacyRedaction && !selections.some((selection) => selection.kind === \"preset\")) {\n return selections.map((selection) => selection.value as OutputAlias);\n }\n const capabilities: Capabilities = await capabilitiesClient.retrieve();\n const publicPresets = new Set(capabilities.publicPresets);\n return selections.map((selection) => {\n if (selection.kind === \"alias\" && !privacyRedaction) {\n return selection.value as OutputAlias;\n }\n const selectedName = selection.kind === \"alias\"\n ? capabilities.outputAliases[selection.value]?.preset\n : selection.value;\n const preset = selectedName ? capabilities.presets[selectedName] : undefined;\n if (!selectedName || !publicPresets.has(selectedName) || !preset) {\n throw new UsageError(selection.kind === \"alias\"\n ? `Gateway did not provide a public expansion for alias: ${selection.value}`\n : `Unknown or non-public preset: ${selection.value}`);\n }\n if (privacyRedaction && preset.outputType !== \"image\") {\n throw new UsageError(\n \"privacy redaction Preview can be attached to image outputs only\",\n );\n }\n const output = { type: preset.outputType, preset: selectedName } as JobOutput & {\n animation?: RunOptions[\"animation\"];\n placeholders?: RunOptions[\"placeholders\"];\n contactSheet?: RunOptions[\"contactSheet\"];\n images?: Array<{\n width: number;\n height: number;\n mode: \"fit\" | \"fill\" | \"cover\" | \"contain\";\n format: \"jpg\" | \"png\" | \"webp\" | \"avif\";\n quality: number;\n maxBytes?: number;\n minQuality?: number;\n }>;\n audiogram?: RunOptions[\"audiogram\"];\n privacyRedaction?: RunOptions[\"privacyRedaction\"];\n clip?: RunOptions[\"clip\"];\n clipAnalysis?: RunOptions[\"clipAnalysis\"];\n };\n if (animation) output.animation = animation;\n if (placeholders) output.placeholders = placeholders;\n if (contactSheet) output.contactSheet = contactSheet;\n if (image) {\n output.images = [{\n width: image.width ?? 1280,\n height: image.height ?? 720,\n mode: image.mode ?? \"fit\",\n format: image.format ?? \"webp\",\n quality: image.quality ?? 80,\n ...(image.maxBytes === undefined ? {} : { maxBytes: image.maxBytes }),\n ...(image.maxBytes === undefined ? {} : { minQuality: image.minQuality ?? 1 }),\n }];\n }\n if (audiogram) output.audiogram = audiogram;\n if (privacyRedaction) output.privacyRedaction = privacyRedaction;\n if (clip) output.clip = clip;\n if (clipAnalysis) output.clipAnalysis = clipAnalysis;\n return output;\n });\n}\n\nfunction receiptProjection(job: SubmittedJob): JobReceiptData {\n return {\n id: job.id,\n status: job.status,\n tier: job.tier,\n requiredTier: job.requiredTier,\n outputs: job.outputs,\n recipe: job.recipe,\n message: job.message,\n };\n}\n\nfunction detailsProjection(job: JobDetails): Record<string, unknown> {\n // Redact the signed bundle URL from --json; expose only lifecycle and integrity metadata.\n return {\n id: job.id,\n status: job.status,\n tier: job.tier,\n ...(job.deliverWebhook === undefined ? {} : { deliverWebhook: job.deliverWebhook }),\n usage: job.usage,\n billing: job.billing,\n bundle: {\n available: job.bundle.available,\n expiresAt: job.bundle.expiresAt,\n sizeBytes: job.bundle.sizeBytes,\n sha256: job.bundle.sha256,\n retentionDays: job.bundle.retentionDays,\n },\n media: job.media,\n recipe: job.recipe,\n metadata: job.metadata,\n error: job.error,\n createdAt: job.createdAt,\n updatedAt: job.updatedAt,\n startedAt: job.startedAt,\n completedAt: job.completedAt,\n };\n}\n\nfunction writeHumanReceipt(job: SubmittedJob, write: (text: string) => void): void {\n write(`Job: ${job.id}\\nStatus: ${job.status}\\nTier: ${job.tier || \"-\"}\\n`);\n}\n\nfunction writeHumanDetails(job: JobDetails, write: (text: string) => void): void {\n const error = job.error ? `\\nError: ${job.error}` : \"\";\n write(\n `Job: ${job.id}\\nStatus: ${job.status}\\n` +\n `Bundle: ${job.bundle.available ? \"available\" : \"unavailable\"}${error}\\n`,\n );\n}\n\nexport async function runCommand(\n args: string[],\n dependencies: RunCommandDependencies,\n): Promise<number> {\n const options = parseRunOptions(args);\n const hasLocalAudiogramAsset = options.audiogram !== undefined &&\n (!isHostedAsset(options.audiogram.artworkSource) ||\n (options.audiogram.captionsSource !== undefined && !isHostedAsset(options.audiogram.captionsSource)));\n const isLocalSource = !isHostedAsset(options.source);\n dependencies.activity.start(\n isLocalSource || hasLocalAudiogramAsset\n ? \"Uploading local media and creating job…\"\n : \"Creating job…\",\n );\n\n try {\n // Older SDKs silently omit unknown output fields. Fail explicitly until the\n // SDK with clipping serialization is installed, rather than submit a wrong job.\n if ((options.clip || options.clipAnalysis) && !(\"getClipCandidates\" in dependencies.jobs)) {\n throw new UsageError(\"Clipping requires the MediaRuntime Node SDK release with getClipCandidates support\");\n }\n if (options.clipTranscriptFile) {\n const transcript = await readClipTranscript(options.clipTranscriptFile);\n if (options.clip) options.clip.transcript = transcript;\n if (options.clipAnalysis) options.clipAnalysis.transcript = transcript;\n }\n // Auxiliary local files are resolved first so the submitted job contains durable sources.\n const audiogram = options.audiogram === undefined\n ? undefined\n : await resolveAudiogram(options.audiogram, dependencies.uploads);\n const outputs = options.recipe\n ? undefined\n : await resolveOutputs(\n options.outputs,\n dependencies.capabilities,\n options.animation,\n options.placeholders,\n options.contactSheet,\n options.image,\n audiogram,\n options.privacyRedaction,\n options.clip,\n options.clipAnalysis,\n );\n const params: CreateJobParams = {\n source: options.source,\n ...(outputs === undefined ? {} : { outputs }),\n ...(options.recipe === undefined ? {} : { recipe: options.recipe }),\n ...(options.metadata === undefined ? {} : { metadata: options.metadata }),\n ...(options.idempotencyKey === undefined ? {} : { idempotencyKey: options.idempotencyKey }),\n // Omit by default so normal account webhook delivery stays unchanged.\n ...(options.deliverWebhook === undefined ? {} : { deliverWebhook: options.deliverWebhook }),\n };\n const submitted = await dependencies.jobs.create(params);\n\n if (!options.wait) {\n // Submission-only mode returns immediately; production services should prefer webhooks.\n dependencies.activity.stop();\n if (options.json) dependencies.writeStdout(`${JSON.stringify(receiptProjection(submitted))}\\n`);\n else writeHumanReceipt(submitted, dependencies.writeStdout);\n return UNSUCCESSFUL_TERMINAL_STATUSES.has(String(submitted.status).toUpperCase()) ? 6 : 0;\n }\n\n dependencies.activity.update(`Waiting for job ${submitted.id} to complete…`);\n const details = await submitted.wait(\n options.timeoutMs === undefined ? {} : { timeoutMs: options.timeoutMs },\n );\n if (String(details.status).toUpperCase() !== \"COMPLETED\") {\n dependencies.activity.stop();\n if (!options.json) writeHumanDetails(details, dependencies.writeStdout);\n if (options.json) dependencies.writeStdout(`${JSON.stringify(detailsProjection(details))}\\n`);\n return 6;\n }\n if (options.download) {\n const url = details.bundle.downloadUrl;\n if (!details.bundle.available || !url) {\n throw new BundleDownloadError(\"Completed job does not have an available canonical bundle\");\n }\n dependencies.activity.update(\"Downloading and verifying ZIP bundle…\");\n try {\n await dependencies.downloadBundle(url, options.download, {\n force: options.force,\n expectedSizeBytes: details.bundle.sizeBytes,\n expectedSha256: details.bundle.sha256,\n });\n } catch (error) {\n if (error instanceof BundleDownloadError) throw error;\n throw new BundleDownloadError(`Could not download bundle to ${options.download}`, { cause: error });\n }\n }\n dependencies.activity.stop();\n if (!options.json) {\n writeHumanDetails(details, dependencies.writeStdout);\n if (options.download) dependencies.writeStdout(`Downloaded bundle to ${options.download}\\n`);\n }\n if (options.json) dependencies.writeStdout(`${JSON.stringify(detailsProjection(details))}\\n`);\n return 0;\n } finally {\n dependencies.activity.stop();\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport type {\n CreateRecipeParams,\n CreateRecipeVersionParams,\n HostedRecipe,\n} from \"@mediaruntime/node\";\nimport { UsageError } from \"../errors.js\";\n\nexport interface RecipesClient {\n list(): Promise<HostedRecipe[]>;\n get(name: string, options?: { version?: number }): Promise<HostedRecipe>;\n create(params: CreateRecipeParams): Promise<HostedRecipe>;\n createVersion(name: string, params: CreateRecipeVersionParams): Promise<HostedRecipe>;\n archive(name: string): Promise<void>;\n}\n\nexport interface RecipesCommandDependencies {\n recipes: RecipesClient;\n writeStdout(text: string): void;\n}\n\nfunction optionValue(args: string[], index: number, option: string): string {\n const value = args[index + 1];\n if (!value || value.startsWith(\"--\")) throw new UsageError(`${option} requires a value`);\n return value;\n}\n\nfunction positiveInteger(value: string, option: string): number {\n const parsed = Number(value);\n if (!Number.isSafeInteger(parsed) || parsed < 1) {\n throw new UsageError(`${option} must be a positive integer`);\n }\n return parsed;\n}\n\nasync function recipeFile(path: string): Promise<Record<string, unknown>> {\n let raw: string;\n try {\n raw = await readFile(path, \"utf8\");\n } catch (error) {\n throw new UsageError(`Could not read recipe file: ${path}`, { cause: error });\n }\n try {\n // Perform only structural parsing here; the gateway remains authoritative for templates.\n const parsed = JSON.parse(raw) as unknown;\n if (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed)) throw new Error();\n return parsed as Record<string, unknown>;\n } catch {\n throw new UsageError(\"Recipe file must contain one JSON object\");\n }\n}\n\nfunction humanRecipe(recipe: HostedRecipe): string {\n const kind = recipe.builtIn ? \"built-in\" : \"custom\";\n return `${recipe.reference}\\n${recipe.description || \"No description\"}\\nType: ${kind}\\nStatus: ${recipe.status}\\n`;\n}\n\nfunction humanList(recipes: HostedRecipe[]): string {\n const headings = [\"REFERENCE\", \"TYPE\", \"DESCRIPTION\"];\n const rows = recipes.map((recipe) => [\n recipe.reference,\n recipe.builtIn ? \"built-in\" : \"custom\",\n recipe.description || \"-\",\n ]);\n const widths = headings.map((heading, index) =>\n Math.max(heading.length, ...rows.map((row) => row[index]?.length ?? 0)),\n );\n const render = (row: string[]): string =>\n row.map((value, index) => value.padEnd(widths[index] ?? value.length)).join(\" \").trimEnd();\n return `${[render(headings), render(widths.map((width) => \"-\".repeat(width))), ...rows.map(render)].join(\"\\n\")}\\n`;\n}\n\nfunction output(recipe: HostedRecipe, json: boolean, write: (text: string) => void): void {\n write(json ? `${JSON.stringify(recipe)}\\n` : humanRecipe(recipe));\n}\n\nexport async function runRecipesCommand(\n args: string[],\n dependencies: RecipesCommandDependencies,\n): Promise<number> {\n const subcommand = args[0];\n const rest = args.slice(1);\n const json = rest.includes(\"--json\");\n\n if (subcommand === \"list\") {\n if (rest.some((value) => value !== \"--json\")) throw new UsageError(\"Usage: mediaruntime recipes list [--json]\");\n const recipes = await dependencies.recipes.list();\n dependencies.writeStdout(json ? `${JSON.stringify({ recipes })}\\n` : humanList(recipes));\n return 0;\n }\n\n if (subcommand === \"get\") {\n let name: string | undefined;\n let version: number | undefined;\n for (let index = 0; index < rest.length; index += 1) {\n const value = rest[index];\n if (value === \"--version\") {\n version = positiveInteger(optionValue(rest, index, value), value);\n index += 1;\n } else if (value !== \"--json\" && !name) name = value;\n else if (value !== \"--json\") throw new UsageError(\"recipes get accepts one name\");\n }\n if (!name) throw new UsageError(\"Usage: mediaruntime recipes get <name> [--version <n>]\");\n output(await dependencies.recipes.get(name, version ? { version } : {}), json, dependencies.writeStdout);\n return 0;\n }\n\n if (subcommand === \"create\") {\n let file: string | undefined;\n for (let index = 0; index < rest.length; index += 1) {\n if (rest[index] === \"--file\") {\n file = optionValue(rest, index, \"--file\");\n index += 1;\n } else if (rest[index] !== \"--json\") throw new UsageError(`Unknown recipes create option: ${rest[index]}`);\n }\n if (!file) throw new UsageError(\"Usage: mediaruntime recipes create --file <recipe.json>\");\n const value = await recipeFile(file);\n if (typeof value.name !== \"string\" || typeof value.template !== \"object\") {\n throw new UsageError(\"Recipe JSON requires name and template\");\n }\n output(await dependencies.recipes.create(value as unknown as CreateRecipeParams), json, dependencies.writeStdout);\n return 0;\n }\n\n if (subcommand === \"version\") {\n let name: string | undefined;\n let file: string | undefined;\n let expected: number | undefined;\n for (let index = 0; index < rest.length; index += 1) {\n const value = rest[index];\n if (value === \"--file\") {\n file = optionValue(rest, index, value);\n index += 1;\n } else if (value === \"--expected\") {\n expected = positiveInteger(optionValue(rest, index, value), value);\n index += 1;\n } else if (value !== \"--json\" && !name) name = value;\n else if (value !== \"--json\") throw new UsageError(`Unknown recipes version option: ${value}`);\n }\n if (!name || !file || !expected) {\n throw new UsageError(\"Usage: mediaruntime recipes version <name> --file <recipe.json> --expected <n>\");\n }\n const value = await recipeFile(file);\n const template = value.template ?? value;\n output(await dependencies.recipes.createVersion(name, {\n // Optimistic concurrency prevents two maintainers from replacing the same latest version.\n expectedLatestVersion: expected,\n ...(typeof value.description === \"string\" ? { description: value.description } : {}),\n template: template as CreateRecipeVersionParams[\"template\"],\n }), json, dependencies.writeStdout);\n return 0;\n }\n\n if (subcommand === \"archive\") {\n const values = rest.filter((value) => value !== \"--json\");\n if (values.length !== 1) throw new UsageError(\"Usage: mediaruntime recipes archive <name>\");\n await dependencies.recipes.archive(values[0] ?? \"\");\n dependencies.writeStdout(json\n ? `${JSON.stringify({ name: values[0], status: \"archived\" })}\\n`\n : `Archived recipe ${values[0]}\\n`);\n return 0;\n }\n\n throw new UsageError(\"Usage: mediaruntime recipes <list|get|create|version|archive>\");\n}\n","import { UsageError } from \"../errors.js\";\n\n// Keep the command layer structurally typed so it remains a thin adapter over the\n// SDK while tests can supply small clients without constructing an HTTP transport.\nexport interface StickerCollectionRecord {\n collectionId: string;\n name: string;\n description: string;\n status: \"active\" | \"archived\";\n packs: StickerPackBinding[];\n createdAt: string;\n archivedAt: string | null;\n updatedAt: string;\n}\n\nexport interface StickerPackBinding {\n bindingId: string;\n collectionId: string;\n activationId: string;\n packId: string;\n packName: string;\n packVersion: string;\n status: \"enabled\" | \"disabled\";\n historicalAccess: \"preserve\" | \"revoke\";\n updatedAt: string | null;\n}\n\nexport interface RuntimeStickerRecord {\n stickerId: string;\n packId: string;\n label: string;\n emoji: string | null;\n category: string | null;\n animated: boolean;\n variants: Array<{ name: string; bytes: number }>;\n score?: number;\n}\n\nexport interface RuntimeStickerPackRecord {\n packId: string;\n name: string;\n version: string;\n assetCount: number;\n animated: boolean;\n}\n\nexport interface StickerRuntimeReadClient {\n listPacks(): Promise<RuntimeStickerPackRecord[]>;\n search(query: string, options?: {\n packId?: string;\n category?: string;\n animated?: boolean;\n limit?: number;\n }): Promise<{ query: string; items: RuntimeStickerRecord[]; total: number }>;\n typeahead(query: string, options?: {\n packId?: string;\n locale?: string;\n limit?: number;\n }): Promise<{ query: string; locale: string; suggestions: Array<{ text: string; assetCount: number }> }>;\n retrieve(stickerId: string): Promise<RuntimeStickerRecord>;\n resolve(stickerId: string, variant: string): Promise<Record<string, unknown>>;\n}\n\nexport interface HostedStickersCommandClient {\n listCollections(options?: { includeArchived?: boolean }): Promise<{ items: StickerCollectionRecord[]; total: number }>;\n createCollection(params: { name: string; description?: string | null }): Promise<StickerCollectionRecord>;\n getCollection(collectionId: string): Promise<StickerCollectionRecord>;\n updateCollection(\n collectionId: string,\n params: { name?: string; description?: string | null; status?: \"active\" | \"archived\" },\n ): Promise<StickerCollectionRecord>;\n archiveCollection(collectionId: string): Promise<StickerCollectionRecord>;\n listCollectionPacks(collectionId: string): Promise<{ items: StickerPackBinding[]; total: number }>;\n addCollectionPack(collectionId: string, params: { activationId: string }): Promise<StickerPackBinding>;\n enableCollectionPack(collectionId: string, packId: string): Promise<StickerPackBinding>;\n disableCollectionPack(collectionId: string, packId: string): Promise<StickerPackBinding>;\n collection(collectionId: string): StickerRuntimeReadClient;\n usage(): Promise<Record<string, unknown>>;\n createClientToken(params: {\n collectionId: string;\n expiresInSeconds?: number;\n scopes?: string[];\n }): Promise<Record<string, unknown>>;\n}\n\nexport interface StickersCommandDependencies {\n hosted?: HostedStickersCommandClient;\n runtime?(collectionId: string): StickerRuntimeReadClient;\n writeStdout(text: string): void;\n}\n\nconst COLLECTION_PATTERN = /^stc_[0-9a-f]{32}$/;\nconst TOKEN_SCOPES = new Set([\"packs:read\", \"stickers:search\", \"stickers:read\", \"assets:resolve\"]);\nconst STICKER_VARIANTS = new Set([\n \"animated\",\n \"reduced_motion\",\n \"small_80\",\n \"small_100\",\n \"small_160\",\n \"thumbnail\",\n]);\n\n// Keep the complete subtree discoverable without requiring a credential or network request.\nexport const STICKERS_HELP = `MediaRuntime Hosted Sticker Runtime\n\nUsage:\n mediaruntime stickers collections list [--include-archived] [--json]\n mediaruntime stickers collections create --name <name> [--description <text>] [--json]\n mediaruntime stickers collections get <collection_id> [--json]\n mediaruntime stickers collections update <collection_id>\n [--name <name>] [--description <text> | --clear-description]\n [--status active|archived] [--json]\n mediaruntime stickers collections archive <collection_id> [--json]\n mediaruntime stickers collections packs list <collection_id> [--json]\n mediaruntime stickers collections packs enable <collection_id>\n (--pack <pack_id> | --activation <activation_id>) [--json]\n mediaruntime stickers collections packs disable <collection_id> --pack <pack_id> [--json]\n mediaruntime stickers packs list --collection <collection_id> [--json]\n mediaruntime stickers search <query> --collection <collection_id>\n [--pack <pack_id>] [--category <category>] [--animated | --static]\n [--limit <1..50>] [--json]\n mediaruntime stickers typeahead <prefix> --collection <collection_id>\n [--pack <pack_id>] [--locale <locale>] [--limit <1..20>] [--json]\n mediaruntime stickers get <sticker_id> --collection <collection_id> [--json]\n mediaruntime stickers resolve <sticker_id> --variant <name>\n --collection <collection_id> [--json]\n mediaruntime stickers usage [--json]\n mediaruntime stickers token create --collection <collection_id>\n [--expires-in <60..3600>] [--scope <scope>]... [--json]\n\nAuthentication:\n API key or secure browser login is the default and is required for management,\n pack binding, usage, and token issuance. MEDIARUNTIME_STICKER_CLIENT_TOKEN is\n accepted only for packs/search/typeahead/get/resolve runtime reads and must match\n the explicit --collection. Secrets are never accepted as command-line options.\n`;\n\nfunction optionValue(args: string[], index: number, option: string): string {\n // Reject a following option so misspelled or incomplete commands fail before an SDK call.\n const value = args[index + 1];\n if (value === undefined || value.startsWith(\"--\")) throw new UsageError(`${option} requires a value`);\n return value;\n}\n\nfunction collectionId(value: string | undefined): string {\n // Collection IDs are path-bearing input, so validate the complete server-issued grammar locally.\n if (!value || !COLLECTION_PATTERN.test(value)) {\n throw new UsageError(\"--collection must be a MediaRuntime sticker collection ID\");\n }\n return value;\n}\n\nfunction boundedInteger(raw: string, option: string, minimum: number, maximum: number): number {\n // Numeric bounds mirror the gateway contract and avoid surprising server-side coercion.\n const value = Number(raw);\n if (!Number.isSafeInteger(value) || value < minimum || value > maximum) {\n throw new UsageError(`${option} must be an integer between ${minimum} and ${maximum}`);\n }\n return value;\n}\n\nfunction output(value: unknown, json: boolean, writeStdout: (text: string) => void, human: string): void {\n // JSON stays compact for shell pipelines; human renderers provide a stable concise summary.\n writeStdout(json ? `${JSON.stringify(value)}\\n` : human);\n}\n\nfunction table(headings: string[], rows: string[][]): string {\n // Derive widths from actual cells so human output remains readable without terminal dependencies.\n const widths = headings.map((heading, index) =>\n Math.max(heading.length, ...rows.map((row) => row[index]?.length ?? 0))\n );\n const render = (row: string[]): string =>\n row.map((cell, index) => cell.padEnd(widths[index] ?? cell.length)).join(\" \").trimEnd();\n return `${[render(headings), render(widths.map((width) => \"-\".repeat(width))), ...rows.map(render)].join(\"\\n\")}\\n`;\n}\n\nfunction collectionTable(page: { items: StickerCollectionRecord[]; total: number }): string {\n // The list view emphasizes lifecycle and enabled-pack count rather than private workspace data.\n return table(\n [\"ID\", \"NAME\", \"STATUS\", \"PACKS\", \"UPDATED\"],\n page.items.map((item) => [\n item.collectionId,\n item.name,\n item.status,\n String(item.packs.length),\n item.updatedAt,\n ]),\n );\n}\n\nfunction bindingTable(page: { items: StickerPackBinding[]; total: number }): string {\n // Retained disabled bindings are visible here because this is an audit-oriented management view.\n return table(\n [\"PACK\", \"NAME\", \"VERSION\", \"STATUS\", \"HISTORICAL\", \"ACTIVATION\"],\n page.items.map((item) => [\n item.packId,\n item.packName,\n item.packVersion,\n item.status,\n item.historicalAccess,\n item.activationId,\n ]),\n );\n}\n\nfunction runtimePackTable(items: RuntimeStickerPackRecord[]): string {\n // Runtime pack discovery shows only packs currently eligible for new sticker use.\n return table(\n [\"PACK\", \"NAME\", \"VERSION\", \"STICKERS\", \"ANIMATED\"],\n items.map((item) => [\n item.packId,\n item.name,\n item.version,\n String(item.assetCount),\n item.animated ? \"yes\" : \"no\",\n ]),\n );\n}\n\nfunction stickerTable(items: RuntimeStickerRecord[]): string {\n // Search output keeps stable IDs prominent so callers can persist an exact reference.\n return table(\n [\"STICKER\", \"LABEL\", \"EMOJI\", \"CATEGORY\", \"ANIMATED\", \"VARIANTS\"],\n items.map((item) => [\n item.stickerId,\n item.label,\n item.emoji ?? \"-\",\n item.category ?? \"-\",\n item.animated ? \"yes\" : \"no\",\n item.variants.map((variant) => variant.name).join(\",\"),\n ]),\n );\n}\n\nfunction hostedClient(dependencies: StickersCommandDependencies): HostedStickersCommandClient {\n // Management, usage, and token issuance require the trusted API-key-backed SDK client.\n if (!dependencies.hosted) {\n throw new UsageError(\"This stickers command requires MEDIARUNTIME_API_KEY or mediaruntime login\");\n }\n return dependencies.hosted;\n}\n\nfunction runtimeClient(\n selectedCollectionId: string,\n dependencies: StickersCommandDependencies,\n): StickerRuntimeReadClient {\n // A scoped token client overrides the server client only for collection-bound read operations.\n if (dependencies.runtime) return dependencies.runtime(selectedCollectionId);\n return hostedClient(dependencies).collection(selectedCollectionId);\n}\n\nasync function collectionsCommand(\n args: string[],\n dependencies: StickersCommandDependencies,\n): Promise<number> {\n // Collection configuration remains under a dedicated subtree to distinguish it from runtime reads.\n const subcommand = args[0];\n const rest = args.slice(1);\n const client = hostedClient(dependencies);\n const json = rest.includes(\"--json\");\n\n if (subcommand === \"list\") {\n let includeArchived = false;\n for (const argument of rest) {\n if (argument === \"--include-archived\") includeArchived = true;\n else if (argument !== \"--json\") throw new UsageError(`Unknown stickers collections list option: ${argument}`);\n }\n const page = await client.listCollections({ includeArchived });\n output(page, json, dependencies.writeStdout, collectionTable(page));\n return 0;\n }\n\n if (subcommand === \"create\") {\n let name: string | undefined;\n let description: string | undefined;\n for (let index = 0; index < rest.length; index += 1) {\n const argument = rest[index];\n if (argument === \"--name\") {\n name = optionValue(rest, index, argument);\n index += 1;\n } else if (argument === \"--description\") {\n description = optionValue(rest, index, argument);\n index += 1;\n } else if (argument !== \"--json\") throw new UsageError(`Unknown stickers collections create option: ${argument}`);\n }\n if (!name) throw new UsageError(\"Usage: mediaruntime stickers collections create --name <name> [--description <text>]\");\n const created = await client.createCollection({ name, ...(description === undefined ? {} : { description }) });\n output(created, json, dependencies.writeStdout, `Created sticker collection ${created.collectionId} (${created.name})\\n`);\n return 0;\n }\n\n if (subcommand === \"get\" || subcommand === \"archive\") {\n const positional = rest.filter((argument) => argument !== \"--json\");\n if (positional.length !== 1) {\n throw new UsageError(`Usage: mediaruntime stickers collections ${subcommand} <collection_id>`);\n }\n const selected = collectionId(positional[0]);\n const result = subcommand === \"get\"\n ? await client.getCollection(selected)\n : await client.archiveCollection(selected);\n const human = subcommand === \"get\"\n ? `${result.name} (${result.collectionId})\\nStatus: ${result.status}\\nDescription: ${result.description || \"-\"}\\nEnabled packs: ${result.packs.length}\\n`\n : `Archived sticker collection ${result.collectionId}\\n`;\n output(result, json, dependencies.writeStdout, human);\n return 0;\n }\n\n if (subcommand === \"update\") {\n let selected: string | undefined;\n let name: string | undefined;\n let description: string | null | undefined;\n let status: \"active\" | \"archived\" | undefined;\n for (let index = 0; index < rest.length; index += 1) {\n const argument = rest[index];\n if (argument === \"--name\") {\n name = optionValue(rest, index, argument);\n index += 1;\n } else if (argument === \"--description\") {\n description = optionValue(rest, index, argument);\n index += 1;\n } else if (argument === \"--clear-description\") {\n description = null;\n } else if (argument === \"--status\") {\n const value = optionValue(rest, index, argument);\n if (value !== \"active\" && value !== \"archived\") throw new UsageError(\"--status must be active or archived\");\n status = value;\n index += 1;\n } else if (argument !== \"--json\" && !selected) selected = argument;\n else if (argument !== \"--json\") throw new UsageError(`Unknown stickers collections update option: ${argument}`);\n }\n const id = collectionId(selected);\n if (name === undefined && description === undefined && status === undefined) {\n throw new UsageError(\"stickers collections update requires --name, --description, --clear-description, or --status\");\n }\n const updated = await client.updateCollection(id, {\n ...(name === undefined ? {} : { name }),\n ...(description === undefined ? {} : { description }),\n ...(status === undefined ? {} : { status }),\n });\n output(updated, json, dependencies.writeStdout, `Updated sticker collection ${updated.collectionId}\\n`);\n return 0;\n }\n\n if (subcommand === \"packs\") return collectionPacksCommand(rest, dependencies);\n throw new UsageError(\"Usage: mediaruntime stickers collections <list|create|get|update|archive|packs>\");\n}\n\nasync function collectionPacksCommand(\n args: string[],\n dependencies: StickersCommandDependencies,\n): Promise<number> {\n // Binding commands never activate or charge a pack; they only attach an existing entitlement.\n const action = args[0];\n const rest = args.slice(1);\n const json = rest.includes(\"--json\");\n const client = hostedClient(dependencies);\n let selected: string | undefined;\n let packId: string | undefined;\n let activationId: string | undefined;\n for (let index = 0; index < rest.length; index += 1) {\n const argument = rest[index];\n if (argument === \"--pack\") {\n packId = optionValue(rest, index, argument);\n index += 1;\n } else if (argument === \"--activation\") {\n activationId = optionValue(rest, index, argument);\n index += 1;\n } else if (argument !== \"--json\" && !selected) selected = argument;\n else if (argument !== \"--json\") throw new UsageError(`Unknown stickers collections packs option: ${argument}`);\n }\n const id = collectionId(selected);\n if (action === \"list\") {\n if (packId || activationId) throw new UsageError(\"stickers collections packs list does not accept a pack selector\");\n const page = await client.listCollectionPacks(id);\n output(page, json, dependencies.writeStdout, bindingTable(page));\n return 0;\n }\n if (action === \"enable\") {\n if ((packId ? 1 : 0) + (activationId ? 1 : 0) !== 1) {\n throw new UsageError(\"stickers collections packs enable requires exactly one of --pack or --activation\");\n }\n const binding = activationId\n ? await client.addCollectionPack(id, { activationId })\n : await client.enableCollectionPack(id, packId ?? \"\");\n output(binding, json, dependencies.writeStdout, `Enabled pack ${binding.packId} in ${id}\\n`);\n return 0;\n }\n if (action === \"disable\") {\n if (!packId || activationId) throw new UsageError(\"stickers collections packs disable requires --pack <pack_id>\");\n const binding = await client.disableCollectionPack(id, packId);\n output(binding, json, dependencies.writeStdout, `Disabled pack ${binding.packId} in ${id}; historical references remain ${binding.historicalAccess}\\n`);\n return 0;\n }\n throw new UsageError(\"Usage: mediaruntime stickers collections packs <list|enable|disable> <collection_id>\");\n}\n\ninterface RuntimeOptions {\n collection?: string;\n packId?: string;\n category?: string;\n locale?: string;\n limit?: number;\n animated?: boolean;\n variant?: string;\n json: boolean;\n positional: string[];\n}\n\nfunction parseRuntimeOptions(args: string[], command: string): RuntimeOptions {\n // Runtime commands share collection selection and bounded filters but retain positional query/ID input.\n const options: RuntimeOptions = { json: false, positional: [] };\n for (let index = 0; index < args.length; index += 1) {\n const argument = args[index];\n if (argument === \"--collection\") {\n options.collection = optionValue(args, index, argument);\n index += 1;\n } else if (argument === \"--pack\") {\n options.packId = optionValue(args, index, argument);\n index += 1;\n } else if (argument === \"--category\") {\n options.category = optionValue(args, index, argument);\n index += 1;\n } else if (argument === \"--locale\") {\n options.locale = optionValue(args, index, argument);\n index += 1;\n } else if (argument === \"--limit\") {\n const maximum = command === \"typeahead\" ? 20 : 50;\n options.limit = boundedInteger(optionValue(args, index, argument), argument, 1, maximum);\n index += 1;\n } else if (argument === \"--animated\" || argument === \"--static\") {\n if (options.animated !== undefined) throw new UsageError(\"Use only one of --animated or --static\");\n options.animated = argument === \"--animated\";\n } else if (argument === \"--variant\") {\n options.variant = optionValue(args, index, argument);\n index += 1;\n } else if (argument === \"--json\") options.json = true;\n else if (argument?.startsWith(\"--\")) throw new UsageError(`Unknown stickers ${command} option: ${argument}`);\n else options.positional.push(argument ?? \"\");\n }\n return options;\n}\n\nasync function runtimeCommand(\n command: string,\n args: string[],\n dependencies: StickersCommandDependencies,\n): Promise<number> {\n // All runtime reads are collection-bound whether authentication uses an API key or client token.\n const options = parseRuntimeOptions(args, command);\n const id = collectionId(options.collection);\n const client = runtimeClient(id, dependencies);\n if (command === \"packs\") {\n if (options.packId || options.category || options.locale || options.limit !== undefined ||\n options.animated !== undefined || options.variant) {\n throw new UsageError(\"stickers packs list accepts only --collection and --json\");\n }\n if (options.positional.length !== 1 || options.positional[0] !== \"list\") {\n throw new UsageError(\"Usage: mediaruntime stickers packs list --collection <collection_id>\");\n }\n const items = await client.listPacks();\n output({ items, total: items.length }, options.json, dependencies.writeStdout, runtimePackTable(items));\n return 0;\n }\n if (command === \"search\") {\n if (options.locale || options.variant) throw new UsageError(\"stickers search does not accept typeahead or asset options\");\n if (options.positional.length !== 1) throw new UsageError(\"Usage: mediaruntime stickers search <query> --collection <collection_id>\");\n const result = await client.search(options.positional[0] ?? \"\", {\n ...(options.packId === undefined ? {} : { packId: options.packId }),\n ...(options.category === undefined ? {} : { category: options.category }),\n ...(options.animated === undefined ? {} : { animated: options.animated }),\n ...(options.limit === undefined ? {} : { limit: options.limit }),\n });\n output(result, options.json, dependencies.writeStdout, stickerTable(result.items));\n return 0;\n }\n if (command === \"typeahead\") {\n if (options.category || options.animated !== undefined || options.variant) {\n throw new UsageError(\"stickers typeahead accepts only --pack, --locale, and --limit filters\");\n }\n if (options.positional.length !== 1) throw new UsageError(\"Usage: mediaruntime stickers typeahead <prefix> --collection <collection_id>\");\n const result = await client.typeahead(options.positional[0] ?? \"\", {\n ...(options.packId === undefined ? {} : { packId: options.packId }),\n ...(options.locale === undefined ? {} : { locale: options.locale }),\n ...(options.limit === undefined ? {} : { limit: options.limit }),\n });\n const human = table(\n [\"SUGGESTION\", \"STICKERS\"],\n result.suggestions.map((suggestion) => [suggestion.text, String(suggestion.assetCount)]),\n );\n output(result, options.json, dependencies.writeStdout, human);\n return 0;\n }\n if (command === \"get\") {\n if (options.packId || options.category || options.locale || options.limit !== undefined ||\n options.animated !== undefined || options.variant) {\n throw new UsageError(\"stickers get accepts only --collection and --json\");\n }\n if (options.positional.length !== 1) throw new UsageError(\"Usage: mediaruntime stickers get <sticker_id> --collection <collection_id>\");\n const sticker = await client.retrieve(options.positional[0] ?? \"\");\n const human = `${sticker.label} (${sticker.stickerId})\\nPack: ${sticker.packId}\\nCategory: ${sticker.category ?? \"-\"}\\nVariants: ${sticker.variants.map((item) => item.name).join(\", \")}\\n`;\n output(sticker, options.json, dependencies.writeStdout, human);\n return 0;\n }\n if (command === \"resolve\") {\n if (options.packId || options.category || options.locale || options.limit !== undefined ||\n options.animated !== undefined) {\n throw new UsageError(\"stickers resolve accepts only --variant, --collection, and --json\");\n }\n if (options.positional.length !== 1 || !options.variant) {\n throw new UsageError(\"Usage: mediaruntime stickers resolve <sticker_id> --variant <name> --collection <collection_id>\");\n }\n if (!STICKER_VARIANTS.has(options.variant)) {\n throw new UsageError(`Unsupported sticker variant: ${options.variant}`);\n }\n const resolution = await client.resolve(options.positional[0] ?? \"\", options.variant);\n // The signed URL is intentionally emitted because asset resolution is this command's explicit purpose.\n const human = `Sticker: ${String(resolution.stickerId ?? \"-\")}\\nVariant: ${String(resolution.variant ?? options.variant)}\\nBytes: ${String(resolution.bytes ?? \"-\")}\\nExpires: ${String(resolution.expiresAt ?? \"-\")}\\nURL: ${String(resolution.url ?? \"-\")}\\n`;\n output(resolution, options.json, dependencies.writeStdout, human);\n return 0;\n }\n throw new UsageError(\"Usage: mediaruntime stickers <packs|search|typeahead|get|resolve>\");\n}\n\nasync function tokenCommand(args: string[], dependencies: StickersCommandDependencies): Promise<number> {\n // Token issuance is deliberately a trusted command; scoped tokens cannot mint descendants.\n if (args[0] !== \"create\") throw new UsageError(\"Usage: mediaruntime stickers token create --collection <collection_id>\");\n let selected: string | undefined;\n let expiresInSeconds: number | undefined;\n const scopes: string[] = [];\n let json = false;\n for (let index = 1; index < args.length; index += 1) {\n const argument = args[index];\n if (argument === \"--collection\") {\n selected = optionValue(args, index, argument);\n index += 1;\n } else if (argument === \"--expires-in\") {\n expiresInSeconds = boundedInteger(optionValue(args, index, argument), argument, 60, 3600);\n index += 1;\n } else if (argument === \"--scope\") {\n const scope = optionValue(args, index, argument);\n if (!TOKEN_SCOPES.has(scope)) throw new UsageError(`Unsupported Sticker Runtime scope: ${scope}`);\n scopes.push(scope);\n index += 1;\n } else if (argument === \"--json\") json = true;\n else throw new UsageError(`Unknown stickers token create option: ${argument}`);\n }\n const result = await hostedClient(dependencies).createClientToken({\n collectionId: collectionId(selected),\n ...(expiresInSeconds === undefined ? {} : { expiresInSeconds }),\n ...(scopes.length === 0 ? {} : { scopes: [...new Set(scopes)] }),\n });\n // Token output is an explicit secret-bearing response; callers should redirect it to a protected sink.\n const human = `Access token: ${String(result.accessToken ?? \"\")}\\nExpires: ${String(result.expiresAt ?? \"-\")}\\nCollection: ${String(result.collectionId ?? \"-\")}\\nScopes: ${Array.isArray(result.scopes) ? result.scopes.join(\", \") : \"-\"}\\n`;\n output(result, json, dependencies.writeStdout, human);\n return 0;\n}\n\nexport function isScopedStickerRuntimeCommand(args: string[]): boolean {\n // Only read-only, collection-bound operations accept the untrusted client credential.\n return [\"packs\", \"search\", \"typeahead\", \"get\", \"resolve\"].includes(args[0] ?? \"\");\n}\n\nexport function stickerCollectionOption(args: string[]): string {\n // Extract the collection before client construction so scoped-token mode never needs a master key.\n const index = args.indexOf(\"--collection\");\n return collectionId(index < 0 ? undefined : args[index + 1]);\n}\n\nexport async function runStickersCommand(\n args: string[],\n dependencies: StickersCommandDependencies,\n): Promise<number> {\n // Route one stable top-level namespace to management, runtime, metering, and token operations.\n const command = args[0];\n if (!command || command === \"--help\" || command === \"-h\" || args.includes(\"--help\") || args.includes(\"-h\")) {\n dependencies.writeStdout(STICKERS_HELP);\n return 0;\n }\n if (command === \"collections\") return collectionsCommand(args.slice(1), dependencies);\n if (command === \"token\") return tokenCommand(args.slice(1), dependencies);\n if (command === \"usage\") {\n const rest = args.slice(1);\n if (rest.some((argument) => argument !== \"--json\")) throw new UsageError(\"Usage: mediaruntime stickers usage [--json]\");\n const result = await hostedClient(dependencies).usage();\n const human = `Month: ${String(result.month ?? \"-\")}\\nStatus: ${String(result.status ?? \"-\")}\\nOperations: ${String(result.operations ?? 0)} / ${String(result.includedOperations ?? 0)}\\nAuthorized delivery: ${String(result.authorizedDeliveryBytes ?? 0)} / ${String(result.includedDeliveryBytes ?? 0)} bytes\\nOverage: ${String(result.overageChargedCents ?? 0)} ${String(result.currency ?? \"USD\")} cents\\n`;\n output(result, rest.includes(\"--json\"), dependencies.writeStdout, human);\n return 0;\n }\n if (isScopedStickerRuntimeCommand(args)) return runtimeCommand(command ?? \"\", args.slice(1), dependencies);\n throw new UsageError(\"Usage: mediaruntime stickers <collections|packs|search|typeahead|get|resolve|usage|token>\");\n}\n","import { randomBytes, randomUUID } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\n\nimport { parseLocalDestination } from \"../trigger/destination.js\";\nimport {\n SUPPORTED_TRIGGER_EVENTS,\n createSyntheticTerminalEvent,\n isTriggerEventType,\n type TriggerEventType,\n} from \"../trigger/event.js\";\nimport { signSyntheticWebhook } from \"../trigger/signature.js\";\nimport { TriggerDeliveryError, UsageError } from \"../errors.js\";\n\nexport interface TriggerCommandDependencies {\n env?: Readonly<Record<string, string | undefined>>;\n fetch?: typeof globalThis.fetch;\n now?: () => number;\n randomUUID?: () => string;\n randomBytes?: (size: number) => Uint8Array;\n readFile?: (path: string, encoding: \"utf8\") => Promise<string>;\n writeStdout?: (text: string) => void;\n}\n\ninterface TriggerArguments {\n type: TriggerEventType;\n destination: URL;\n secretFile?: string;\n generateSecret: boolean;\n jobId?: string;\n accountId?: string;\n json: boolean;\n}\n\nfunction requireOptionValue(args: string[], index: number, option: string): string {\n const value = args[index + 1];\n if (!value || value.startsWith(\"--\")) throw new UsageError(`${option} requires a value`);\n return value;\n}\n\nexport function parseTriggerArguments(args: string[]): TriggerArguments {\n const typeValue = args[0];\n if (!typeValue || typeValue.startsWith(\"--\")) {\n throw new UsageError(\n `trigger requires an event type: ${SUPPORTED_TRIGGER_EVENTS.join(\", \")}`,\n );\n }\n if (!isTriggerEventType(typeValue)) {\n throw new UsageError(\n `Unsupported trigger event ${JSON.stringify(typeValue)}; expected ${SUPPORTED_TRIGGER_EVENTS.join(\", \")}`,\n );\n }\n\n let to: string | undefined;\n let secretFile: string | undefined;\n let generateSecret = false;\n let jobId: string | undefined;\n let accountId: string | undefined;\n let json = false;\n for (let index = 1; index < args.length; index += 1) {\n const option = args[index];\n if (!option) continue;\n if (option === \"--generate-secret\") {\n generateSecret = true;\n continue;\n }\n if (option === \"--json\") {\n json = true;\n continue;\n }\n if ([\"--to\", \"--secret-file\", \"--job-id\", \"--account-id\"].includes(option)) {\n const value = requireOptionValue(args, index, option);\n index += 1;\n if (option === \"--to\") to = value;\n else if (option === \"--secret-file\") secretFile = value;\n else if (option === \"--job-id\") jobId = value;\n else accountId = value;\n continue;\n }\n throw new UsageError(`Unknown trigger option: ${option}`);\n }\n\n if (!to) throw new UsageError(\"trigger requires an explicit --to local URL\");\n if (generateSecret && secretFile) {\n throw new UsageError(\"--generate-secret and --secret-file are mutually exclusive\");\n }\n if (generateSecret && json) {\n throw new UsageError(\"--generate-secret and --json are mutually exclusive\");\n }\n if (jobId !== undefined && !jobId.trim()) throw new UsageError(\"--job-id must not be empty\");\n if (accountId !== undefined && !accountId.trim()) {\n throw new UsageError(\"--account-id must not be empty\");\n }\n return {\n type: typeValue,\n destination: parseLocalDestination(to),\n ...(secretFile === undefined ? {} : { secretFile }),\n generateSecret,\n ...(jobId === undefined ? {} : { jobId: jobId.trim() }),\n ...(accountId === undefined ? {} : { accountId: accountId.trim() }),\n json,\n };\n}\n\nasync function resolveSecret(\n args: TriggerArguments,\n dependencies: Required<\n Pick<TriggerCommandDependencies, \"env\" | \"randomBytes\" | \"readFile\" | \"writeStdout\">\n >,\n): Promise<string> {\n if (args.generateSecret) {\n const generated = Buffer.from(dependencies.randomBytes(32)).toString(\"base64url\");\n dependencies.writeStdout(\n `Generated webhook secret (configure the local receiver with this value): ${generated}\\n`,\n );\n return generated;\n }\n let secret: string | undefined;\n if (args.secretFile) {\n try {\n secret = await dependencies.readFile(args.secretFile, \"utf8\");\n } catch (error) {\n throw new UsageError(`Could not read webhook secret file: ${args.secretFile}`, { cause: error });\n }\n } else {\n // Match deployed webhook receivers by default without placing secrets in shell history.\n secret = dependencies.env.MEDIARUNTIME_WEBHOOK_SECRET;\n }\n const normalized = secret?.trim();\n if (!normalized) {\n throw new UsageError(\n \"Set MEDIARUNTIME_WEBHOOK_SECRET, pass --secret-file, or explicitly use --generate-secret\",\n );\n }\n return normalized;\n}\n\nexport async function runTriggerCommand(\n args: string[],\n dependencies: TriggerCommandDependencies = {},\n): Promise<number> {\n const parsed = parseTriggerArguments(args);\n const deps = {\n env: dependencies.env ?? process.env,\n fetch: dependencies.fetch ?? globalThis.fetch,\n now: dependencies.now ?? Date.now,\n randomUUID: dependencies.randomUUID ?? randomUUID,\n randomBytes: dependencies.randomBytes ?? randomBytes,\n readFile: dependencies.readFile ?? readFile,\n writeStdout: dependencies.writeStdout ?? ((text: string) => process.stdout.write(text)),\n };\n const secret = await resolveSecret(parsed, deps);\n const timestamp = Math.floor(deps.now() / 1000);\n const unique = deps.randomUUID();\n const eventId = `evt_cli_${unique}`;\n const jobId = parsed.jobId ?? `job_cli_${unique}`;\n const accountId = parsed.accountId ?? \"acc_cli_local\";\n const payload = createSyntheticTerminalEvent(parsed.type, {\n eventId,\n jobId,\n accountId,\n timestamp,\n });\n const signed = signSyntheticWebhook(payload, { eventId, timestamp, secret });\n\n // Redirects are disabled so a loopback endpoint cannot relay the signed request elsewhere.\n const response = await deps.fetch(parsed.destination, {\n method: \"POST\",\n headers: signed.headers,\n body: signed.body,\n redirect: \"manual\",\n signal: AbortSignal.timeout(10_000),\n });\n if (!response.ok) {\n throw new TriggerDeliveryError(\n `Local webhook endpoint returned HTTP ${response.status}${response.statusText ? ` ${response.statusText}` : \"\"}`,\n );\n }\n if (parsed.json) {\n deps.writeStdout(`${JSON.stringify({\n eventId,\n type: parsed.type,\n jobId,\n status: payload.status,\n destination: parsed.destination.href,\n httpStatus: response.status,\n })}\\n`);\n } else {\n deps.writeStdout(\n `Sent synthetic ${parsed.type} event ${eventId} to ${parsed.destination.href} (HTTP ${response.status})\\n`,\n );\n }\n return 0;\n}\n","import { UsageError } from \"../errors.js\";\n\nexport function isLoopbackDestination(value: URL): boolean {\n let hostname = value.hostname.toLowerCase();\n if (hostname.endsWith(\".\")) hostname = hostname.slice(0, -1);\n if (hostname.startsWith(\"[\") && hostname.endsWith(\"]\")) {\n hostname = hostname.slice(1, -1);\n }\n if (hostname === \"localhost\" || hostname === \"::1\" || hostname === \"0:0:0:0:0:0:0:1\") {\n return true;\n }\n\n const octets = hostname.split(\".\");\n if (octets.length !== 4 || octets.some((part) => !/^\\d{1,3}$/.test(part))) return false;\n const numbers = octets.map(Number);\n return numbers[0] === 127 && numbers.every((part) => part >= 0 && part <= 255);\n}\n\nexport function parseLocalDestination(raw: string): URL {\n // `trigger` is a local receiver test tool, so reject remote destinations and SSRF targets.\n let destination: URL;\n try {\n destination = new URL(raw);\n } catch {\n throw new UsageError(\"--to must be an absolute local HTTP(S) URL\");\n }\n if (destination.protocol !== \"http:\" && destination.protocol !== \"https:\") {\n throw new UsageError(\"--to must use http:// or https://\");\n }\n if (destination.username || destination.password) {\n throw new UsageError(\"--to must not contain URL credentials\");\n }\n if (!isLoopbackDestination(destination)) {\n throw new UsageError(\n \"trigger only sends to loopback destinations (localhost, 127.0.0.0/8, or ::1)\",\n );\n }\n return destination;\n}\n","export const SUPPORTED_TRIGGER_EVENTS = [\n \"job.completed\",\n \"job.failed\",\n \"job.rejected\",\n] as const;\n\nexport type TriggerEventType = (typeof SUPPORTED_TRIGGER_EVENTS)[number];\n\nexport function isTriggerEventType(value: string): value is TriggerEventType {\n return (SUPPORTED_TRIGGER_EVENTS as readonly string[]).includes(value);\n}\n\nexport interface SyntheticEventOptions {\n eventId: string;\n jobId: string;\n accountId: string;\n timestamp: number;\n}\n\nexport function createSyntheticTerminalEvent(\n type: TriggerEventType,\n options: SyntheticEventOptions,\n): Record<string, unknown> {\n // Keep synthetic events shaped like production terminal webhooks for realistic local tests.\n const status = type.slice(\"job.\".length).toUpperCase();\n const occurredAt = new Date(options.timestamp * 1000).toISOString();\n const base = {\n event_id: options.eventId,\n job_id: options.jobId,\n account_id: options.accountId,\n status,\n };\n\n if (type === \"job.completed\") {\n const expiresAt = new Date((options.timestamp + 7 * 24 * 60 * 60) * 1000).toISOString();\n return {\n ...base,\n completedAt: occurredAt,\n delivery: {\n mode: \"PULL\",\n retentionDays: 7,\n expiresAt,\n bundle: {\n type: \"zip\",\n filename: `${options.jobId}_outputs.zip`,\n size_bytes: 0,\n sha256: \"0\".repeat(64),\n download: {\n // This marker URL is descriptive only; trigger never serves a synthetic ZIP.\n url: `http://127.0.0.1/__mediaruntime_synthetic__/${encodeURIComponent(options.jobId)}.zip`,\n expiresAt,\n },\n },\n layout: \"bundle_relative_v1\",\n deliverables: [],\n manifests: {},\n },\n billing: { status: \"PAID\" },\n usage: { units_total: 0 },\n meta: { synthetic: true, request_metadata: {} },\n };\n }\n\n const failed = type === \"job.failed\";\n return {\n ...base,\n [failed ? \"failedAt\" : \"rejectedAt\"]: occurredAt,\n delivery: { mode: \"NONE\" },\n billing: { status: \"RELEASED\" },\n error: {\n code: failed ? \"SYNTHETIC_ENGINE_FAILED\" : \"SYNTHETIC_REJECTED\",\n message: `Synthetic ${type} event from the MediaRuntime CLI`,\n },\n meta: { synthetic: true, request_metadata: {} },\n };\n}\n","import { createHmac } from \"node:crypto\";\n\nexport const WEBHOOK_HEADERS = {\n id: \"X-Transcoder-Id\",\n timestamp: \"X-Transcoder-Timestamp\",\n signature: \"X-Transcoder-Signature\",\n} as const;\n\nexport interface SignedWebhook {\n body: string;\n headers: Record<string, string>;\n}\n\nexport function signSyntheticWebhook(\n payload: Readonly<Record<string, unknown>>,\n options: { eventId: string; timestamp: number; secret: string },\n): SignedWebhook {\n if (!options.eventId.trim()) throw new Error(\"Webhook event ID must not be empty\");\n if (!Number.isInteger(options.timestamp) || options.timestamp < 0) {\n throw new Error(\"Webhook timestamp must be a non-negative integer\");\n }\n if (!options.secret) throw new Error(\"Webhook secret must not be empty\");\n\n // JSON is serialized once. These exact bytes are both signed and sent.\n const body = JSON.stringify(payload);\n const bodyBytes = Buffer.from(body, \"utf8\");\n const prefix = Buffer.from(`${options.timestamp}.${options.eventId}.`, \"utf8\");\n const digest = createHmac(\"sha256\", options.secret)\n .update(prefix)\n .update(bodyBytes)\n .digest(\"hex\");\n\n return {\n body,\n headers: {\n \"Content-Type\": \"application/json\",\n [WEBHOOK_HEADERS.id]: options.eventId,\n [WEBHOOK_HEADERS.timestamp]: String(options.timestamp),\n [WEBHOOK_HEADERS.signature]: `t=${options.timestamp},v1=${digest}`,\n },\n };\n}\n","const FRAMES = [\"⣋\", \"⣙\", \"⣹\", \"⣸\", \"⣼\", \"⣴\", \"⣦\", \"⣧\", \"⣇\", \"⣏\"];\nconst CLEAR_LINE = \"\\r\\u001b[2K\";\n\nexport interface ActivityIndicator {\n start(message: string): void;\n update(message: string): void;\n stop(): void;\n}\n\nexport function createActivityIndicator(\n write: (text: string) => void,\n enabled: boolean,\n): ActivityIndicator {\n // Callers enable this only for interactive stderr, keeping stdout and --json parseable.\n let timer: ReturnType<typeof setInterval> | undefined;\n let frameIndex = 0;\n let message = \"\";\n let startedAt = 0;\n\n const render = (): void => {\n if (!timer && startedAt === 0) return;\n const elapsedSeconds = Math.max(0, Math.floor((Date.now() - startedAt) / 1000));\n const elapsed = elapsedSeconds > 0 ? ` (${elapsedSeconds}s)` : \"\";\n write(`${CLEAR_LINE}${FRAMES[frameIndex % FRAMES.length]} ${message}${elapsed}`);\n frameIndex += 1;\n };\n\n return {\n start(nextMessage) {\n if (!enabled) return;\n if (timer) clearInterval(timer);\n message = nextMessage;\n startedAt = Date.now();\n frameIndex = 0;\n render();\n timer = setInterval(render, 80);\n // A spinner must never keep an otherwise finished CLI process alive.\n timer.unref?.();\n },\n update(nextMessage) {\n if (!enabled || startedAt === 0) return;\n message = nextMessage;\n render();\n },\n stop() {\n if (!enabled || startedAt === 0) return;\n if (timer) clearInterval(timer);\n timer = undefined;\n startedAt = 0;\n write(CLEAR_LINE);\n },\n };\n}\n"],"mappings":"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","names":["createHash","randomUUID","resolve","resolve","cell","UNSUCCESSFUL_TERMINAL_STATUSES","optionValue","output","detailsProjection","optionValue","humanList","value","optionValue","output","table","cell","randomBytes","readFile","randomBytes","readFile","timestamp","randomUUID","createHash"]}
|