coreslopper 0.0.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../packages/cli/src/npx.ts","../packages/cli/src/doctor.ts","../packages/providers/src/mock.ts","../packages/core/src/schema.ts","../packages/core/src/errors.ts","../packages/core/src/hash.ts","../packages/core/src/timing.ts","../packages/core/src/state.ts","../packages/core/src/cost.ts","../packages/core/src/project.ts","../packages/providers/src/http.ts","../packages/providers/src/higgsfield.ts","../packages/providers/src/runner.ts","../packages/cli/src/tools.ts","../packages/cli/src/workspace.ts","../packages/cli/src/init-command.ts","../packages/cli/src/init.ts","../packages/cli/src/new-project.ts","../packages/cli/src/onboarding.ts","../packages/cli/src/status.ts","../packages/cli/src/utils.ts","../packages/cli/src/validate.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { relative, resolve } from 'node:path';\nimport { runDoctor } from './doctor.js';\nimport {\n runInitCommand,\n validateChoice,\n type InitCommandOptions,\n} from './init-command.js';\nimport { createProject } from './new-project.js';\nimport { onboard } from './onboarding.js';\nimport { printStatus } from './status.js';\nimport { formatSeconds, run } from './utils.js';\nimport { validateProject } from './validate.js';\nimport {\n findWorkspaceRoot,\n listProjects,\n loadWorkspaceEnv,\n ownVersion,\n resolveProjectArg,\n requireWorkspaceRoot,\n} from './workspace.js';\n\ninterface NewCommandOptions {\n budget?: number;\n title?: string;\n song?: string;\n visual?: string;\n imageProvider?: string;\n videoProvider?: string;\n}\n\nfunction requireWorkspace(): string {\n const root = requireWorkspaceRoot();\n process.chdir(root);\n loadWorkspaceEnv(root);\n return root;\n}\n\nfunction workspaceSummary(root: string): void {\n const projects = listProjects(root);\n console.log(`coreslopper workspace: ${root}`);\n if (projects.length) {\n console.log(`Projects: ${projects.join(', ')}`);\n try {\n const project = resolveProjectArg(root);\n console.log(`Tip: npx coreslopper status ${relative(root, project)}`);\n } catch {\n // Multiple projects; no single default to suggest.\n }\n } else {\n console.log('No projects yet. Create one with: npx coreslopper new <slug> --budget 50');\n }\n console.log('Commands: init, doctor, new, status, validate');\n}\n\nconst program = new Command();\nprogram\n .name('coreslopper')\n .description('Create and manage a coreslopper music-video workspace.')\n .version(ownVersion())\n .showHelpAfterError();\n\nprogram\n .command('init [dir]')\n .description('Create a workspace, install tools, and configure fal.ai, Higgsfield, and Suno.')\n .option('-y, --yes', 'Use defaults and skip prompts')\n .option('--force', 'Merge into a non-empty directory')\n .option('--no-install', 'Skip npm install and uv sync')\n .option('--no-git', 'Do not initialize a git repository')\n .option('--install-tools', 'Install missing uv, Python, ffmpeg, and Claude Code')\n .option('--no-tool-install', 'Do not offer to install system tools')\n .option('--song <provider>', 'suno | import', 'import')\n .option('--visual <provider>', 'mock | fal | higgsfield', 'mock')\n .option('--image-provider <provider>', 'mock | fal | higgsfield')\n .option('--video-provider <provider>', 'mock | fal | higgsfield')\n .option('--budget <usd>', 'First project budget in USD', (value) => Number(value))\n .option('--project <slug>', 'First project slug')\n .option('--title <title>', 'First project title')\n .option('--fal-key <key>', 'fal.ai API key (prefer FAL_KEY in the environment)')\n .option('--higgsfield-key <key>', 'Higgsfield credential (prefer HIGGSFIELD_API_KEY in the environment)')\n .option('--no-suno', 'Do not configure the Suno MCP server')\n .option('--skip-project', 'Create the workspace without a first project')\n .option('--runtime <dir>', 'Runtime directory (development only)')\n .action((dir: string | undefined, options: InitCommandOptions) =>\n run(async () => {\n const visuals = ['mock', 'fal', 'higgsfield'] as const;\n if (options.song) options.song = validateChoice(options.song, ['suno', 'import'] as const, 'song provider');\n if (options.visual) options.visual = validateChoice(options.visual, visuals, 'visual provider');\n if (options.imageProvider) {\n options.imageProvider = validateChoice(options.imageProvider, visuals, 'image provider');\n }\n if (options.videoProvider) {\n options.videoProvider = validateChoice(options.videoProvider, visuals, 'video provider');\n }\n await runInitCommand(dir, options);\n }),\n );\n\nprogram\n .command('doctor [dir]')\n .description('Check the workspace, tools, and credentials.')\n .option('--json', 'Print machine-readable JSON')\n .action((dir: string | undefined, options: { json?: boolean }) =>\n run(async () => {\n const root = dir ? resolve(dir) : (findWorkspaceRoot() ?? process.cwd());\n const result = await runDoctor(root, { json: options.json });\n if (!result.ok) process.exitCode = 1;\n }),\n );\n\nprogram\n .command('new <slug>')\n .description('Create a project inside the current workspace.')\n .option('--budget <usd>', 'Project budget in USD (required)', (value) => Number(value))\n .option('--title <title>')\n .option('--song <provider>', 'suno | import', 'import')\n .option('--visual <provider>', 'mock | fal | higgsfield', 'mock')\n .option('--image-provider <provider>', 'mock | fal | higgsfield')\n .option('--video-provider <provider>', 'mock | fal | higgsfield')\n .action((slug: string, options: NewCommandOptions) =>\n run(async () => {\n const root = requireWorkspace();\n const visuals = ['mock', 'fal', 'higgsfield'] as const;\n const song = validateChoice(options.song ?? 'import', ['suno', 'import'] as const, 'song provider');\n const visual = validateChoice(options.visual ?? 'mock', visuals, 'visual provider');\n const image = options.imageProvider\n ? validateChoice(options.imageProvider, visuals, 'image provider')\n : visual;\n const video = options.videoProvider\n ? validateChoice(options.videoProvider, visuals, 'video provider')\n : visual;\n await createProject({\n slug,\n title: options.title,\n budget: options.budget,\n root,\n songProvider: song,\n imageProvider: image,\n videoProvider: video,\n });\n }),\n );\n\nprogram\n .command('status [project]')\n .description('Show stage state and budget for a project.')\n .action((project: string | undefined) =>\n run(async () => {\n const root = requireWorkspace();\n await printStatus(resolveProjectArg(root, project));\n }),\n );\n\nprogram\n .command('validate [project]')\n .description('Validate timing, style, characters, and storyboard coverage.')\n .option('--no-write', 'Do not write timing.effective.json')\n .action((project: string | undefined, options: { write: boolean }) =>\n run(async () => {\n const root = requireWorkspace();\n const projectDir = resolveProjectArg(root, project);\n const { project: loaded, resolved } = await validateProject(projectDir, { write: options.write });\n console.log(\n `✔ ${loaded.config.title}: ${resolved.shots.length} shots, ${formatSeconds(resolved.durationSeconds)}, ${resolved.durationInFrames} frames`,\n );\n for (const warning of resolved.warnings) console.log(` ! ${warning}`);\n }),\n );\n\nconst args = process.argv.slice(2);\nif (args.length === 0) {\n const root = findWorkspaceRoot();\n if (root) {\n workspaceSummary(root);\n } else if (!process.stdin.isTTY) {\n console.error('No coreslopper workspace detected.');\n console.error('Run: npx coreslopper init <dir> --yes');\n process.exitCode = 1;\n } else {\n await run(async () => {\n await onboard();\n });\n }\n} else {\n await program.parseAsync(process.argv);\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { resolveHiggsfieldCredentials } from '@coreslopper/providers';\nimport { detectTools, type ToolCheck } from './tools.js';\nimport { isWorkspace, loadWorkspaceEnv } from './workspace.js';\n\nexport interface DoctorCheck {\n id: string;\n name: string;\n ok: boolean;\n detail: string;\n required: boolean;\n group: 'workspace' | 'tool' | 'credentials';\n}\n\nexport interface DoctorResult {\n ok: boolean;\n root: string;\n checks: DoctorCheck[];\n}\n\nexport interface DoctorOptions {\n json?: boolean;\n}\n\nfunction fileCheck(\n root: string,\n id: string,\n name: string,\n path: string,\n options: { required?: boolean; detail?: string } = {},\n): DoctorCheck {\n const exists = existsSync(join(root, path));\n return {\n id,\n name,\n ok: exists,\n detail: exists ? path : `${path} is missing`,\n required: options.required ?? true,\n group: 'workspace',\n };\n}\n\nfunction sunoCheck(root: string): DoctorCheck {\n const path = join(root, '.mcp.json');\n if (!existsSync(path)) {\n return {\n id: 'suno-mcp',\n name: 'Suno MCP',\n ok: false,\n detail: '.mcp.json is missing (optional)',\n required: false,\n group: 'credentials',\n };\n }\n try {\n const config = JSON.parse(readFileSync(path, 'utf8')) as {\n mcpServers?: Record<string, { url?: string }>;\n };\n const url = config.mcpServers?.suno?.url;\n return {\n id: 'suno-mcp',\n name: 'Suno MCP',\n ok: url === 'https://api.suno.com/mcp',\n detail: url ?? '.mcp.json has no \"suno\" server',\n required: false,\n group: 'credentials',\n };\n } catch (error) {\n return {\n id: 'suno-mcp',\n name: 'Suno MCP',\n ok: false,\n detail: `.mcp.json is invalid: ${error instanceof Error ? error.message : String(error)}`,\n required: false,\n group: 'credentials',\n };\n }\n}\n\nfunction toolCheck(tool: ToolCheck): DoctorCheck {\n return {\n id: tool.id,\n name: tool.name,\n ok: tool.ok,\n detail: tool.detail,\n required: tool.required,\n group: 'tool',\n };\n}\n\nexport async function runDoctor(root: string, options: DoctorOptions = {}): Promise<DoctorResult> {\n loadWorkspaceEnv(root);\n const higgsfield = resolveHiggsfieldCredentials();\n\n const checks: DoctorCheck[] = [\n {\n id: 'workspace',\n name: 'coreslopper workspace',\n ok: isWorkspace(root),\n detail: isWorkspace(root) ? root : 'not a workspace (run \"npx coreslopper init\")',\n required: true,\n group: 'workspace',\n },\n fileCheck(root, 'templates', 'Project template', 'templates/project/README.md'),\n fileCheck(root, 'config', 'Defaults', 'config/defaults.yaml'),\n fileCheck(root, 'models', 'Model roles and pricing', 'config/models.yaml'),\n fileCheck(root, 'remotion', 'Remotion entry', 'packages/remotion/src/index.ts'),\n fileCheck(root, 'skills', 'Claude Code skills', '.claude/skills/video-brief/SKILL.md'),\n fileCheck(root, 'audio-analysis', 'Audio analysis scripts', 'scripts/audio-analysis/analyze.py'),\n fileCheck(root, 'fonts', 'Example fonts', 'brand/example/fonts/SpaceGrotesk.ttf'),\n {\n id: 'fal-key',\n name: 'FAL_KEY',\n ok: Boolean(process.env.FAL_KEY),\n detail: process.env.FAL_KEY ? 'set (from environment or .env)' : 'not set (mock works without it)',\n required: false,\n group: 'credentials',\n },\n {\n id: 'higgsfield-key',\n name: 'HIGGSFIELD_API_KEY',\n ok: Boolean(higgsfield),\n detail: higgsfield ? 'set (from environment or .env)' : 'not set (mock works without it)',\n required: false,\n group: 'credentials',\n },\n sunoCheck(root),\n ...detectTools(root).map(toolCheck),\n ];\n\n const ok = checks.every((check) => check.ok || !check.required);\n\n if (options.json) {\n console.log(JSON.stringify({ ok, root, checks }, null, 2));\n } else {\n console.log(`Workspace: ${root}`);\n for (const check of checks) {\n const mark = check.ok ? '✔' : check.required ? '✖' : '○';\n console.log(`${mark} ${check.name}: ${check.detail}`);\n }\n if (!ok) {\n console.log('\\nSome required checks failed. Fix them and run \"coreslopper doctor\" again.');\n }\n }\n\n return { ok, root, checks };\n}\n","import { mkdir, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { Provider, ProviderInput, ProviderOutput } from './types.js';\n\nfunction escapeXml(value: string): string {\n return value\n .replaceAll('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;')\n .replaceAll('\"', '&quot;')\n .replaceAll(\"'\", '&apos;');\n}\n\nfunction colorFromSeed(seed: number, index: number): string {\n const hue = (seed * 37 + index * 61) % 360;\n return `hsl(${hue} 80% 55%)`;\n}\n\nfunction placeholderSvg(input: ProviderInput, label: string): string {\n const width = input.width ?? 1024;\n const height = input.height ?? 576;\n const colors = [0, 1, 2].map((index) => colorFromSeed(input.seed, index));\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\" viewBox=\"0 0 ${width} ${height}\">\n <defs>\n <linearGradient id=\"g\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\">\n <stop offset=\"0%\" stop-color=\"${colors[0]}\"/>\n <stop offset=\"55%\" stop-color=\"${colors[1]}\"/>\n <stop offset=\"100%\" stop-color=\"${colors[2]}\"/>\n </linearGradient>\n <pattern id=\"grid\" width=\"48\" height=\"48\" patternUnits=\"userSpaceOnUse\">\n <path d=\"M 48 0 L 0 0 0 48\" fill=\"none\" stroke=\"rgba(255,255,255,0.16)\" stroke-width=\"1\"/>\n </pattern>\n </defs>\n <rect width=\"${width}\" height=\"${height}\" fill=\"url(#g)\"/>\n <rect width=\"${width}\" height=\"${height}\" fill=\"url(#grid)\"/>\n <text x=\"${width / 2}\" y=\"${height / 2 - 18}\" font-family=\"monospace\" font-size=\"${Math.round(width / 26)}\" fill=\"white\" text-anchor=\"middle\" opacity=\"0.92\">${escapeXml(label)}</text>\n <text x=\"${width / 2}\" y=\"${height / 2 + 34}\" font-family=\"monospace\" font-size=\"${Math.round(width / 52)}\" fill=\"white\" text-anchor=\"middle\" opacity=\"0.7\">${escapeXml(input.model)}</text>\n <text x=\"${width / 2}\" y=\"${height / 2 + 78}\" font-family=\"monospace\" font-size=\"${Math.round(width / 64)}\" fill=\"white\" text-anchor=\"middle\" opacity=\"0.55\">seed ${input.seed}</text>\n</svg>\n`;\n}\n\nasync function writePlaceholder(input: ProviderInput, label: string, suffix: string): Promise<ProviderOutput> {\n await mkdir(input.outputDir, { recursive: true });\n const path = join(input.outputDir, `mock-${input.seed}-${suffix}.svg`);\n await writeFile(path, placeholderSvg(input, label), 'utf8');\n return { files: [path], raw: { mock: true, label, model: input.model } };\n}\n\nexport class MockProvider implements Provider {\n readonly name = 'mock';\n\n async generateImage(input: ProviderInput): Promise<ProviderOutput> {\n return writePlaceholder(input, 'MOCK IMAGE', 'image');\n }\n\n async editImage(input: ProviderInput): Promise<ProviderOutput> {\n return writePlaceholder(input, 'MOCK EDIT', 'edit');\n }\n\n async imageToVideo(input: ProviderInput): Promise<ProviderOutput> {\n return writePlaceholder(input, `MOCK CLIP ${input.durationSeconds ?? 5}s`, 'clip');\n }\n\n async lipSync(input: ProviderInput): Promise<ProviderOutput> {\n if (!input.references?.[0]) throw new Error('lipSync requires a face reference image.');\n if (!input.audio) throw new Error('lipSync requires an audio file.');\n return writePlaceholder(input, `MOCK LIPSYNC ${input.durationSeconds ?? '?'}s`, 'lipsync');\n }\n}\n","import { z } from 'zod';\n\nexport const FormatSchema = z.object({\n aspect: z.string().min(1),\n width: z.number().int().positive(),\n height: z.number().int().positive(),\n fps: z.number().int().positive().default(30),\n});\n\nexport const ProviderKindSchema = z.enum(['fal', 'higgsfield', 'mock']);\n\nexport const ProjectConfigSchema = z.object({\n version: z.literal(1),\n slug: z\n .string()\n .min(1)\n .regex(/^[a-z0-9][a-z0-9-]*$/, 'slug must be lowercase letters, digits, and dashes'),\n title: z.string().min(1),\n created: z.string().min(1),\n workflow: z.object({\n version: z.string().min(1),\n commit: z.string().optional(),\n }),\n budget_usd: z.number().positive(),\n batch_cap_usd: z.number().positive().optional(),\n review_mode: z.enum(['auto', 'final']).default('auto'),\n formats: z.object({\n master: FormatSchema,\n derivatives: z.array(FormatSchema).default([]),\n }),\n providers: z\n .object({\n image: ProviderKindSchema.default('mock'),\n video: ProviderKindSchema.default('mock'),\n /** Lip-sync can use a different provider from the rest of the video. */\n lipsync: ProviderKindSchema.optional(),\n song: z.enum(['suno', 'import', 'mock']).default('import'),\n })\n .default({ image: 'mock', video: 'mock', song: 'import' }),\n song: z\n .object({\n variants: z.number().int().min(1).max(4).default(2),\n pinned_variant: z.string().optional(),\n })\n .default({ variants: 2 }),\n brand: z.string().min(1).default('example'),\n models: z.record(z.string(), z.unknown()).default({}),\n});\n\nexport const StageStatusSchema = z.enum(['pending', 'running', 'done', 'failed', 'skipped']);\n\nexport const StageStateSchema = z.object({\n status: StageStatusSchema,\n inputHash: z.string().optional(),\n outputs: z.array(z.string()).default([]),\n attempts: z.number().int().nonnegative().default(0),\n lastError: z.string().optional(),\n startedAt: z.string().optional(),\n finishedAt: z.string().optional(),\n});\n\nexport const BudgetSchema = z.object({\n totalUsd: z.number().nonnegative(),\n spentUsd: z.number().nonnegative(),\n reservedUsd: z.number().nonnegative(),\n});\n\nexport const StateSchema = z.object({\n version: z.literal(1),\n project: z.string().min(1),\n workflowVersion: z.string().min(1),\n stage: z.string().min(1),\n status: StageStatusSchema,\n stages: z.record(z.string(), StageStateSchema),\n budget: BudgetSchema,\n artifacts: z.record(z.string(), z.string()).default({}),\n errors: z.array(z.string()).default([]),\n updatedAt: z.string().min(1),\n});\n\nexport const WordSchema = z.object({\n text: z.string(),\n start: z.number().nonnegative(),\n end: z.number().nonnegative(),\n});\n\nexport const LineSchema = z.object({\n id: z.string().min(1),\n section: z.string().min(1),\n start: z.number().nonnegative(),\n end: z.number().nonnegative(),\n text: z.string(),\n words: z.array(WordSchema).default([]),\n});\n\nexport const SectionSchema = z.object({\n id: z.string().min(1),\n label: z.string().min(1),\n start: z.number().nonnegative(),\n end: z.number().nonnegative(),\n confidence: z.number().min(0).max(1).default(0.5),\n sources: z.array(z.string()).default([]),\n});\n\nexport const EnergySchema = z.object({\n hop: z.number().int().positive(),\n fps: z.number().positive(),\n values: z.array(z.number()),\n});\n\nexport const TimingSchema = z.object({\n version: z.literal(1),\n audio: z.object({\n path: z.string().min(1),\n duration: z.number().positive(),\n sampleRate: z.number().int().positive(),\n }),\n bpm: z.number().positive(),\n beats: z.array(z.number().nonnegative()).default([]),\n downbeats: z.array(z.number().nonnegative()).default([]),\n onsets: z.array(z.number().nonnegative()).default([]),\n energy: EnergySchema,\n sections: z.array(SectionSchema).min(1),\n lines: z.array(LineSchema).default([]),\n meta: z.record(z.string(), z.unknown()).default({}),\n});\n\nexport const TimingOverridesSchema = z.object({\n version: z.literal(1).default(1),\n bpm: z.number().positive().optional(),\n beats: z.array(z.number().nonnegative()).optional(),\n downbeats: z.array(z.number().nonnegative()).optional(),\n sections: z\n .array(z.object({ id: z.string().min(1), start: z.number().nonnegative(), end: z.number().nonnegative() }))\n .default([]),\n lines: z\n .array(z.object({ id: z.string().min(1), start: z.number().nonnegative(), end: z.number().nonnegative() }))\n .default([]),\n words: z\n .array(\n z.object({\n line: z.string().min(1),\n index: z.number().int().nonnegative(),\n start: z.number().nonnegative(),\n end: z.number().nonnegative(),\n }),\n )\n .default([]),\n});\n\nexport const AnchorSchema = z.discriminatedUnion('type', [\n z.object({\n type: z.literal('section'),\n id: z.string().min(1),\n edge: z.enum(['start', 'end']).default('start'),\n offset: z.number().default(0),\n }),\n z.object({\n type: z.literal('line'),\n id: z.string().min(1),\n edge: z.enum(['start', 'end']).default('start'),\n offset: z.number().default(0),\n }),\n z.object({\n type: z.literal('word'),\n line: z.string().min(1),\n index: z.number().int().nonnegative(),\n edge: z.enum(['start', 'end']).default('start'),\n offset: z.number().default(0),\n }),\n z.object({\n type: z.literal('beat'),\n index: z.number().int().nonnegative(),\n offset: z.number().default(0),\n }),\n z.object({\n type: z.literal('downbeat'),\n index: z.number().int().nonnegative(),\n offset: z.number().default(0),\n }),\n z.object({\n type: z.literal('time'),\n seconds: z.number().nonnegative(),\n }),\n]);\n\nexport const TransitionSchema = z.object({\n type: z.enum(['cut', 'fade', 'dissolve', 'wipe', 'glitch']).default('cut'),\n duration: z.number().nonnegative().default(0),\n});\n\nexport const ShotSourceSchema = z.enum(['motion', 'ai-clip', 'footage', 'mixed']);\n\nexport const LayerSchema = z.object({\n type: z.enum(['motion', 'ai-clip', 'footage']),\n asset: z.string().optional(),\n component: z.string().optional(),\n blend: z.string().optional(),\n zIndex: z.number().int().default(0),\n});\n\nexport const ShotSchema = z.object({\n id: z.string().regex(/^shot-[0-9]{3}$/, 'shot id must look like shot-001'),\n section: z.string().min(1),\n start: AnchorSchema,\n end: AnchorSchema,\n source: ShotSourceSchema,\n description: z.string().min(1),\n camera: z.string().default('static'),\n text: z.string().optional(),\n highlights: z.array(z.string()).default([]),\n transition: TransitionSchema.default({ type: 'cut', duration: 0 }),\n refs: z\n .object({\n style: z.array(z.string()).default([]),\n characters: z.array(z.string()).default([]),\n })\n .default({ style: [], characters: [] }),\n motion: z\n .object({\n component: z.string().optional(),\n props: z.record(z.string(), z.unknown()).default({}),\n })\n .optional(),\n prompts: z\n .object({\n keyframe: z.string().optional(),\n video: z.string().optional(),\n })\n .optional(),\n asset: z.string().optional(),\n /**\n * Lip-sync shot: a frontal face keyframe (prompts.keyframe) is animated by the\n * vocal segment between the shot's start and end (operation lipSync).\n */\n lipSync: z\n .object({\n character: z.string().min(1),\n source: z.string().default('audio/stems/vocals.wav'),\n })\n .optional(),\n layers: z.array(LayerSchema).optional(),\n chaining: z\n .object({\n enabled: z.boolean().default(false),\n from: z.string().optional(),\n })\n .optional(),\n});\n\nexport const StoryboardSchema = z.object({\n version: z.literal(1),\n timing: z.string().default('timing.effective.json'),\n style: z.string().default('style.yaml'),\n characters: z.string().default('characters.yaml'),\n shots: z.array(ShotSchema).min(1),\n});\n\nexport const TypographyStyleSchema = z.object({\n family: z.string().min(1),\n weight: z.number().int().min(100).max(900).optional(),\n size: z.number().positive().optional(),\n letterSpacing: z.number().optional(),\n lineHeight: z.number().positive().optional(),\n});\n\nexport const StyleBibleSchema = z.object({\n version: z.literal(1).default(1),\n name: z.string().min(1),\n palette: z.record(z.string(), z.string().regex(/^#[0-9a-fA-F]{6}$/)),\n typography: z.record(z.string(), TypographyStyleSchema),\n look: z\n .object({\n keywords: z.array(z.string()).default([]),\n negative: z.array(z.string()).default([]),\n references: z.array(z.string()).default([]),\n })\n .default({ keywords: [], negative: [], references: [] }),\n motion: z\n .object({\n easing: z.string().default('easeOut'),\n grain: z.number().min(0).max(1).default(0.08),\n })\n .default({ easing: 'easeOut', grain: 0.08 }),\n});\n\nexport const CharacterSchema = z.object({\n id: z.string().min(1),\n name: z.string().min(1),\n description: z.string().min(1),\n sheet: z.string().optional(),\n refs: z.array(z.string()).default([]),\n prompt: z.string().optional(),\n});\n\nexport const CharacterBibleSchema = z.object({\n version: z.literal(1).default(1),\n characters: z.array(CharacterSchema).default([]),\n});\n\nexport const BrandKitSchema = z.object({\n version: z.literal(1).default(1),\n id: z.string().min(1),\n name: z.string().min(1),\n description: z.string().optional(),\n logo: z.string().min(1),\n tokens: z.string().min(1),\n palette: z.record(z.string(), z.string().regex(/^#[0-9a-fA-F]{6}$/)),\n typography: z.record(z.string(), TypographyStyleSchema),\n motion: z.object({\n easing: z.string().default('easeOut'),\n grain: z.number().min(0).max(1).default(0.08),\n }),\n fonts: z\n .array(\n z.object({\n family: z.string().min(1),\n file: z.string().min(1),\n license: z.string().min(1),\n }),\n )\n .default([]),\n});\n\nexport const ModelPricingSchema = z.object({\n unit: z.enum(['image', 'second', 'request']),\n usd: z.number().nonnegative(),\n});\n\nexport const ModelRoleVariantSchema = z.object({\n model: z.string().min(1),\n params: z.record(z.string(), z.unknown()).default({}),\n pricing: ModelPricingSchema.optional(),\n maxDuration: z.number().positive().optional(),\n notes: z.string().optional(),\n});\n\nexport const ModelRoleSchema = z.object({\n /** Provider whose model slug and defaults are in the fields below. */\n provider: z.string().min(1).default('fal'),\n model: z.string().min(1),\n params: z.record(z.string(), z.unknown()).default({}),\n pricing: ModelPricingSchema.optional(),\n maxDuration: z.number().positive().optional(),\n notes: z.string().optional(),\n /** Provider-specific model slugs, params, and prices. */\n alternatives: z.record(z.string(), ModelRoleVariantSchema).default({}),\n});\n\nexport const ModelsConfigSchema = z.object({\n version: z.literal(1).default(1),\n last_verified: z.string().optional(),\n roles: z.record(z.string(), ModelRoleSchema),\n});\n\nexport type ProjectConfig = z.infer<typeof ProjectConfigSchema>;\nexport type Format = z.infer<typeof FormatSchema>;\nexport type StageStatus = z.infer<typeof StageStatusSchema>;\nexport type StageState = z.infer<typeof StageStateSchema>;\nexport type State = z.infer<typeof StateSchema>;\nexport type Word = z.infer<typeof WordSchema>;\nexport type Line = z.infer<typeof LineSchema>;\nexport type Section = z.infer<typeof SectionSchema>;\nexport type Timing = z.infer<typeof TimingSchema>;\nexport type TimingOverrides = z.infer<typeof TimingOverridesSchema>;\nexport type Anchor = z.infer<typeof AnchorSchema>;\nexport type Transition = z.infer<typeof TransitionSchema>;\nexport type ShotSource = z.infer<typeof ShotSourceSchema>;\nexport type Layer = z.infer<typeof LayerSchema>;\nexport type Shot = z.infer<typeof ShotSchema>;\nexport type Storyboard = z.infer<typeof StoryboardSchema>;\nexport type StyleBible = z.infer<typeof StyleBibleSchema>;\nexport type Character = z.infer<typeof CharacterSchema>;\nexport type CharacterBible = z.infer<typeof CharacterBibleSchema>;\nexport type BrandKit = z.infer<typeof BrandKitSchema>;\nexport type ModelPricing = z.infer<typeof ModelPricingSchema>;\nexport type ModelRoleVariant = z.infer<typeof ModelRoleVariantSchema>;\nexport type ModelRole = z.infer<typeof ModelRoleSchema>;\nexport type ModelsConfig = z.infer<typeof ModelsConfigSchema>;\nexport type ProviderKind = z.infer<typeof ProviderKindSchema>;\n","import { ZodError } from 'zod';\n\nexport class ValidationError extends Error {\n constructor(\n message: string,\n readonly details: string[] = [],\n ) {\n super(message);\n this.name = 'ValidationError';\n }\n}\n\nexport class BudgetError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'BudgetError';\n }\n}\n\nexport class ConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ConfigError';\n }\n}\n\nexport function formatZodError(error: ZodError): string[] {\n return error.issues.map((issue) => {\n const path = issue.path.length ? issue.path.join('.') : '(root)';\n return `${path}: ${issue.message}`;\n });\n}\n\nexport function asErrorMessage(error: unknown): string {\n if (error instanceof Error) return error.message;\n return String(error);\n}\n","import { createHash } from 'node:crypto';\nimport { readFile } from 'node:fs/promises';\n\nexport function sha256(input: string | Uint8Array): string {\n return createHash('sha256').update(input).digest('hex');\n}\n\nexport async function hashFile(path: string): Promise<string> {\n const data = await readFile(path);\n return sha256(data);\n}\n\n/**\n * Stable JSON stringify: object keys are sorted recursively, so the same\n * logical request produces the same cache key regardless of key order.\n */\nexport function canonicalJson(value: unknown): string {\n return JSON.stringify(sortValue(value));\n}\n\nfunction sortValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortValue);\n if (value && typeof value === 'object') {\n const record = value as Record<string, unknown>;\n const sorted: Record<string, unknown> = {};\n for (const key of Object.keys(record).sort()) {\n const item = record[key];\n if (item !== undefined) sorted[key] = sortValue(item);\n }\n return sorted;\n }\n return value;\n}\n\nexport function hashObject(value: unknown): string {\n return sha256(canonicalJson(value));\n}\n","import {\n type Anchor,\n type CharacterBible,\n type Line,\n type Section,\n type Shot,\n type Storyboard,\n type StyleBible,\n type Timing,\n type TimingOverrides,\n} from './schema.js';\nimport { ValidationError } from './errors.js';\n\nexport const TIMING_TOLERANCE_SECONDS = 0.05;\n\nexport const MOTION_COMPONENTS = new Set([\n 'TitleCard',\n 'LyricCard',\n 'GlitchBackdrop',\n 'ParticleField',\n 'Grid',\n 'Scanlines',\n 'NeonTorus',\n]);\n\nexport interface ResolvedShot extends Shot {\n startSeconds: number;\n endSeconds: number;\n startFrame: number;\n endFrame: number;\n durationInFrames: number;\n}\n\nexport interface ResolvedStoryboard {\n fps: number;\n durationSeconds: number;\n durationInFrames: number;\n shots: ResolvedShot[];\n warnings: string[];\n}\n\nfunction findSection(timing: Timing, id: string): Section {\n const section = timing.sections.find((candidate) => candidate.id === id);\n if (!section) {\n throw new ValidationError(`Unknown section \"${id}\". Known sections: ${timing.sections.map((s) => s.id).join(', ')}`);\n }\n return section;\n}\n\nfunction findLine(timing: Timing, id: string): Line {\n const line = timing.lines.find((candidate) => candidate.id === id);\n if (!line) {\n throw new ValidationError(`Unknown lyric line \"${id}\".`);\n }\n return line;\n}\n\nexport function mergeTiming(base: Timing, overrides: TimingOverrides): Timing {\n const merged = structuredClone(base);\n\n if (overrides.bpm !== undefined) merged.bpm = overrides.bpm;\n if (overrides.beats !== undefined) merged.beats = [...overrides.beats];\n if (overrides.downbeats !== undefined) merged.downbeats = [...overrides.downbeats];\n\n for (const override of overrides.sections) {\n const section = findSection(merged, override.id);\n section.start = override.start;\n section.end = override.end;\n }\n\n for (const override of overrides.lines) {\n const line = findLine(merged, override.id);\n line.start = override.start;\n line.end = override.end;\n }\n\n for (const override of overrides.words) {\n const line = findLine(merged, override.line);\n const word = line.words[override.index];\n if (!word) {\n throw new ValidationError(\n `Word override references missing word ${override.index} on line \"${override.line}\".`,\n );\n }\n word.start = override.start;\n word.end = override.end;\n }\n\n assertTiming(merged);\n return merged;\n}\n\nexport function assertTiming(timing: Timing): void {\n const issues: string[] = [];\n const duration = timing.audio.duration;\n\n if (timing.sections.length === 0) {\n issues.push('timing.sections must not be empty');\n }\n\n const sections = [...timing.sections].sort((a, b) => a.start - b.start);\n for (let index = 0; index < sections.length; index += 1) {\n const section = sections[index]!;\n if (section.end <= section.start) {\n issues.push(`section \"${section.id}\" has end <= start`);\n }\n if (section.start < -TIMING_TOLERANCE_SECONDS || section.end > duration + TIMING_TOLERANCE_SECONDS) {\n issues.push(`section \"${section.id}\" is outside the audio duration`);\n }\n if (index === 0 && Math.abs(section.start) > TIMING_TOLERANCE_SECONDS) {\n issues.push(`sections must start at 0; first section starts at ${section.start.toFixed(3)}s`);\n }\n const previous = sections[index - 1];\n if (previous) {\n const gap = section.start - previous.end;\n if (Math.abs(gap) > TIMING_TOLERANCE_SECONDS) {\n issues.push(`sections \"${previous.id}\" and \"${section.id}\" have a gap or overlap of ${gap.toFixed(3)}s`);\n }\n }\n }\n const last = sections[sections.length - 1];\n if (last && Math.abs(last.end - duration) > TIMING_TOLERANCE_SECONDS) {\n issues.push(`last section ends at ${last.end.toFixed(3)}s; audio duration is ${duration.toFixed(3)}s`);\n }\n\n for (const line of timing.lines) {\n if (line.end <= line.start) issues.push(`line \"${line.id}\" has end <= start`);\n if (line.start < -TIMING_TOLERANCE_SECONDS || line.end > duration + TIMING_TOLERANCE_SECONDS) {\n issues.push(`line \"${line.id}\" is outside the audio duration`);\n }\n if (!timing.sections.some((section) => section.id === line.section)) {\n issues.push(`line \"${line.id}\" references unknown section \"${line.section}\"`);\n }\n let previousEnd = -Infinity;\n for (const [index, word] of line.words.entries()) {\n if (word.end < word.start) issues.push(`line \"${line.id}\" word ${index} has end < start`);\n if (word.start < previousEnd - TIMING_TOLERANCE_SECONDS) {\n issues.push(`line \"${line.id}\" word ${index} starts before the previous word ends`);\n }\n previousEnd = word.end;\n }\n }\n\n for (const [label, values] of [\n ['beats', timing.beats],\n ['downbeats', timing.downbeats],\n ['onsets', timing.onsets],\n ] as const) {\n for (const value of values) {\n if (value < -TIMING_TOLERANCE_SECONDS || value > duration + TIMING_TOLERANCE_SECONDS) {\n issues.push(`${label} contains ${value.toFixed(3)}s, outside the audio duration`);\n }\n }\n }\n\n if (timing.energy.values.length === 0) issues.push('energy.values must not be empty');\n if (timing.energy.fps <= 0) issues.push('energy.fps must be positive');\n\n if (issues.length > 0) {\n throw new ValidationError('Invalid timing', issues);\n }\n}\n\nfunction ensureTime(value: number, timing: Timing, label: string): number {\n if (!Number.isFinite(value)) {\n throw new ValidationError(`${label} resolved to a non-finite time`);\n }\n if (value < -TIMING_TOLERANCE_SECONDS || value > timing.audio.duration + TIMING_TOLERANCE_SECONDS) {\n throw new ValidationError(\n `${label} resolved to ${value.toFixed(3)}s, outside 0..${timing.audio.duration.toFixed(3)}s`,\n );\n }\n return Math.max(0, Math.min(timing.audio.duration, value));\n}\n\nexport function resolveAnchor(anchor: Anchor, timing: Timing): number {\n switch (anchor.type) {\n case 'section': {\n const section = findSection(timing, anchor.id);\n const base = anchor.edge === 'start' ? section.start : section.end;\n return ensureTime(base + anchor.offset, timing, `section \"${anchor.id}\" ${anchor.edge}`);\n }\n case 'line': {\n const line = findLine(timing, anchor.id);\n const base = anchor.edge === 'start' ? line.start : line.end;\n return ensureTime(base + anchor.offset, timing, `line \"${anchor.id}\" ${anchor.edge}`);\n }\n case 'word': {\n const line = findLine(timing, anchor.line);\n const word = line.words[anchor.index];\n if (!word) {\n throw new ValidationError(`Word anchor references missing word ${anchor.index} on line \"${anchor.line}\".`);\n }\n const base = anchor.edge === 'start' ? word.start : word.end;\n return ensureTime(base + anchor.offset, timing, `word \"${anchor.line}\"[${anchor.index}] ${anchor.edge}`);\n }\n case 'beat': {\n const beat = timing.beats[anchor.index];\n if (beat === undefined) {\n throw new ValidationError(`Beat anchor references missing beat ${anchor.index}.`);\n }\n return ensureTime(beat + anchor.offset, timing, `beat ${anchor.index}`);\n }\n case 'downbeat': {\n const downbeat = timing.downbeats[anchor.index];\n if (downbeat === undefined) {\n throw new ValidationError(`Downbeat anchor references missing downbeat ${anchor.index}.`);\n }\n return ensureTime(downbeat + anchor.offset, timing, `downbeat ${anchor.index}`);\n }\n case 'time':\n return ensureTime(anchor.seconds, timing, 'time anchor');\n }\n}\n\nfunction getPath(value: unknown, path: string): unknown {\n return path.split('.').reduce<unknown>((current, key) => {\n if (current && typeof current === 'object' && key in current) {\n return (current as Record<string, unknown>)[key];\n }\n return undefined;\n }, value);\n}\n\nfunction validateRefs(shot: Shot, style: StyleBible, characters: CharacterBible): void {\n for (const ref of shot.refs.style) {\n if (getPath(style, ref) === undefined) {\n throw new ValidationError(`Shot \"${shot.id}\" references missing style token \"${ref}\".`);\n }\n }\n for (const character of shot.refs.characters) {\n if (!characters.characters.some((candidate) => candidate.id === character)) {\n throw new ValidationError(`Shot \"${shot.id}\" references missing character \"${character}\".`);\n }\n }\n}\n\nfunction validateSource(shot: Shot): void {\n if (shot.source === 'motion') {\n if (!shot.motion?.component) {\n throw new ValidationError(`Motion shot \"${shot.id}\" must set motion.component.`);\n }\n if (!MOTION_COMPONENTS.has(shot.motion.component)) {\n throw new ValidationError(\n `Motion shot \"${shot.id}\" uses unknown component \"${shot.motion.component}\". Known: ${[...MOTION_COMPONENTS].join(', ')}.`,\n );\n }\n }\n if (shot.source === 'ai-clip') {\n if (!shot.prompts?.keyframe || !shot.prompts.video) {\n throw new ValidationError(`AI clip shot \"${shot.id}\" must set prompts.keyframe and prompts.video.`);\n }\n }\n if (shot.source === 'footage' && !shot.asset) {\n throw new ValidationError(`Footage shot \"${shot.id}\" must set asset.`);\n }\n if (shot.source === 'mixed') {\n if (!shot.layers || shot.layers.length < 2) {\n throw new ValidationError(`Mixed shot \"${shot.id}\" must have at least two layers.`);\n }\n for (const [index, layer] of shot.layers.entries()) {\n if (layer.type === 'footage' && !layer.asset) {\n throw new ValidationError(`Mixed shot \"${shot.id}\" layer ${index} is footage but has no asset.`);\n }\n if (layer.type === 'motion') {\n if (!layer.component) {\n throw new ValidationError(`Mixed shot \"${shot.id}\" layer ${index} is motion but has no component.`);\n }\n if (!MOTION_COMPONENTS.has(layer.component)) {\n throw new ValidationError(\n `Mixed shot \"${shot.id}\" layer ${index} uses unknown component \"${layer.component}\".`,\n );\n }\n }\n if (layer.type === 'ai-clip' && !layer.asset && !shot.prompts?.video) {\n throw new ValidationError(\n `Mixed shot \"${shot.id}\" layer ${index} is ai-clip but has neither asset nor prompts.video.`,\n );\n }\n }\n }\n}\n\nfunction validateText(shot: Shot): void {\n if (shot.highlights.length === 0) return;\n if (!shot.text) {\n throw new ValidationError(`Shot \"${shot.id}\" has highlights but no text.`);\n }\n const normalized = shot.text.toLowerCase();\n for (const highlight of shot.highlights) {\n if (!normalized.includes(highlight.toLowerCase())) {\n throw new ValidationError(`Shot \"${shot.id}\" highlight \"${highlight}\" is not part of its text.`);\n }\n }\n}\n\nexport function resolveStoryboard(\n storyboard: Storyboard,\n timing: Timing,\n style: StyleBible,\n characters: CharacterBible,\n fps: number,\n toleranceFrames = 1,\n): ResolvedStoryboard {\n const warnings: string[] = [];\n const resolved: ResolvedShot[] = [];\n const ids = new Set<string>();\n\n for (const shot of storyboard.shots) {\n if (ids.has(shot.id)) throw new ValidationError(`Duplicate shot id \"${shot.id}\".`);\n ids.add(shot.id);\n\n if (!timing.sections.some((section) => section.id === shot.section)) {\n throw new ValidationError(`Shot \"${shot.id}\" references unknown section \"${shot.section}\".`);\n }\n\n const startSeconds = resolveAnchor(shot.start, timing);\n const endSeconds = resolveAnchor(shot.end, timing);\n if (endSeconds <= startSeconds) {\n throw new ValidationError(`Shot \"${shot.id}\" ends at or before its start.`);\n }\n\n const startFrame = Math.round(startSeconds * fps);\n const endFrame = Math.round(endSeconds * fps);\n if (endFrame <= startFrame) {\n throw new ValidationError(`Shot \"${shot.id}\" is shorter than one frame.`);\n }\n\n if (shot.start.type === 'time' || shot.end.type === 'time') {\n warnings.push(`Shot \"${shot.id}\" uses an explicit time anchor; prefer a symbolic anchor.`);\n }\n\n validateRefs(shot, style, characters);\n validateSource(shot);\n validateText(shot);\n\n resolved.push({\n ...shot,\n startSeconds,\n endSeconds,\n startFrame,\n endFrame,\n durationInFrames: endFrame - startFrame,\n });\n }\n\n const durationInFrames = Math.round(timing.audio.duration * fps);\n const ordered = [...resolved].sort((a, b) => a.startFrame - b.startFrame);\n if (ordered.some((shot, index) => shot.id !== resolved[index]?.id)) {\n throw new ValidationError('Storyboard shots must be ordered by start time.');\n }\n\n const first = ordered[0];\n if (!first) throw new ValidationError('Storyboard must contain at least one shot.');\n if (Math.abs(first.startFrame) > toleranceFrames) {\n throw new ValidationError(`Storyboard must start at 0; first shot starts at frame ${first.startFrame}.`);\n }\n\n let previousEnd = 0;\n for (const shot of ordered) {\n const gap = shot.startFrame - previousEnd;\n if (gap > toleranceFrames) {\n throw new ValidationError(`Gap of ${gap} frame(s) before shot \"${shot.id}\".`);\n }\n if (gap < -toleranceFrames) {\n throw new ValidationError(`Overlap of ${Math.abs(gap)} frame(s) at shot \"${shot.id}\".`);\n }\n previousEnd = shot.endFrame;\n }\n\n if (Math.abs(previousEnd - durationInFrames) > toleranceFrames) {\n throw new ValidationError(\n `Storyboard ends at frame ${previousEnd}; song ends at frame ${durationInFrames}.`,\n );\n }\n\n for (const shot of ordered) {\n if (!shot.chaining?.enabled) continue;\n if (!shot.chaining.from) {\n throw new ValidationError(`Shot \"${shot.id}\" enables chaining but has no \"from\" shot.`);\n }\n const source = ordered.find((candidate) => candidate.id === shot.chaining?.from);\n if (!source) {\n throw new ValidationError(`Shot \"${shot.id}\" chains from missing shot \"${shot.chaining.from}\".`);\n }\n if (source.endFrame > shot.startFrame + toleranceFrames) {\n throw new ValidationError(`Shot \"${shot.id}\" chains from a shot that does not end before it starts.`);\n }\n }\n\n return {\n fps,\n durationSeconds: timing.audio.duration,\n durationInFrames,\n shots: ordered,\n warnings,\n };\n}\n\nexport function sectionAt(timing: Timing, seconds: number): Section | undefined {\n return timing.sections.find(\n (section) => seconds >= section.start - TIMING_TOLERANCE_SECONDS && seconds <= section.end + TIMING_TOLERANCE_SECONDS,\n );\n}\n\nexport function energyAt(timing: Timing, seconds: number): number {\n if (timing.energy.values.length === 0) return 0;\n const index = Math.floor(seconds * timing.energy.fps);\n return timing.energy.values[Math.max(0, Math.min(timing.energy.values.length - 1, index))] ?? 0;\n}\n\nexport function beatIndexAt(timing: Timing, seconds: number): number {\n let index = -1;\n for (const [i, beat] of timing.beats.entries()) {\n if (beat <= seconds + TIMING_TOLERANCE_SECONDS) index = i;\n else break;\n }\n return index;\n}\n","import { BudgetError } from './errors.js';\nimport type { ProjectConfig, State, StageState, StageStatus } from './schema.js';\n\nexport interface StageDefinition {\n id: string;\n label: string;\n skills: string[];\n outputs: string[];\n mechanical: boolean;\n}\n\nexport const STAGES: StageDefinition[] = [\n {\n id: 'brief',\n label: 'Brief',\n skills: ['video-brief'],\n outputs: ['brief.md'],\n mechanical: false,\n },\n {\n id: 'treatment',\n label: 'Concept & treatment',\n skills: ['video-treatment'],\n outputs: ['treatment.md'],\n mechanical: false,\n },\n {\n id: 'lyrics',\n label: 'Lyrics',\n skills: ['lyrics-writer'],\n outputs: ['lyrics.txt', 'suno-style.txt'],\n mechanical: false,\n },\n {\n id: 'song',\n label: 'Song',\n skills: ['suno-song'],\n outputs: ['song.json', 'audio/song.wav', 'audio/stems/vocals.wav'],\n mechanical: false,\n },\n {\n id: 'audio-analysis',\n label: 'Audio analysis',\n skills: ['audio-analysis'],\n outputs: ['timing.json', 'timing.report.md'],\n mechanical: true,\n },\n {\n id: 'style-character',\n label: 'Style & character bible',\n skills: ['style-bible', 'character-bible'],\n outputs: ['style.yaml', 'characters.yaml'],\n mechanical: false,\n },\n {\n id: 'storyboard',\n label: 'Storyboard',\n skills: ['storyboard'],\n outputs: ['storyboard.yaml', 'storyboard.md', 'review/contact-sheet.svg'],\n mechanical: false,\n },\n {\n id: 'assets',\n label: 'Asset production',\n skills: ['remotion-motion', 'ai-clips', 'footage'],\n outputs: ['assets/manifest.jsonl'],\n mechanical: false,\n },\n {\n id: 'assembly',\n label: 'Assembly',\n skills: ['assembly-render'],\n outputs: ['renders/preview-16x9.mp4'],\n mechanical: true,\n },\n {\n id: 'qa-export',\n label: 'QA & export',\n skills: ['video-qa'],\n outputs: ['review/report.md', 'renders/16x9.mp4'],\n mechanical: true,\n },\n];\n\nexport const STAGE_IDS = STAGES.map((stage) => stage.id);\n\nexport function stageDefinition(id: string): StageDefinition | undefined {\n return STAGES.find((stage) => stage.id === id);\n}\n\nexport function createInitialState(config: ProjectConfig, workflowVersion: string): State {\n const now = new Date().toISOString();\n const stages: Record<string, StageState> = {};\n for (const stage of STAGES) {\n stages[stage.id] = {\n status: 'pending',\n outputs: [],\n attempts: 0,\n };\n }\n return {\n version: 1,\n project: config.slug,\n workflowVersion,\n stage: STAGES[0]!.id,\n status: 'pending',\n stages,\n budget: {\n totalUsd: config.budget_usd,\n spentUsd: 0,\n reservedUsd: 0,\n },\n artifacts: {},\n errors: [],\n updatedAt: now,\n };\n}\n\nexport function nextStage(state: State): StageDefinition | undefined {\n return STAGES.find((stage) => {\n const status = state.stages[stage.id]?.status ?? 'pending';\n return status === 'pending' || status === 'failed';\n });\n}\n\nexport function overallStatus(state: State): StageStatus {\n const statuses = STAGES.map((stage) => state.stages[stage.id]?.status ?? 'pending');\n if (statuses.some((status) => status === 'failed')) return 'failed';\n if (statuses.some((status) => status === 'running')) return 'running';\n if (statuses.every((status) => status === 'done' || status === 'skipped')) return 'done';\n return 'pending';\n}\n\nexport function setStageRunning(state: State, stageId: string): State {\n const stage = state.stages[stageId];\n if (!stage) throw new Error(`Unknown stage \"${stageId}\".`);\n const now = new Date().toISOString();\n stage.status = 'running';\n stage.startedAt = now;\n stage.attempts += 1;\n state.stage = stageId;\n state.status = 'running';\n state.updatedAt = now;\n return state;\n}\n\nexport function setStageDone(\n state: State,\n stageId: string,\n outputs: string[],\n inputHash?: string,\n): State {\n const stage = state.stages[stageId];\n if (!stage) throw new Error(`Unknown stage \"${stageId}\".`);\n const now = new Date().toISOString();\n stage.status = 'done';\n stage.outputs = outputs;\n stage.finishedAt = now;\n if (inputHash) stage.inputHash = inputHash;\n delete stage.lastError;\n const next = nextStage(state);\n state.stage = next?.id ?? stageId;\n state.status = overallStatus(state);\n state.updatedAt = now;\n return state;\n}\n\nexport function setStageFailed(state: State, stageId: string, error: string): State {\n const stage = state.stages[stageId];\n if (!stage) throw new Error(`Unknown stage \"${stageId}\".`);\n const now = new Date().toISOString();\n stage.status = 'failed';\n stage.lastError = error;\n stage.finishedAt = now;\n state.stage = stageId;\n state.status = 'failed';\n state.errors.push(error);\n state.updatedAt = now;\n return state;\n}\n\nexport function setStageSkipped(state: State, stageId: string, reason?: string): State {\n const stage = state.stages[stageId];\n if (!stage) throw new Error(`Unknown stage \"${stageId}\".`);\n stage.status = 'skipped';\n if (reason) stage.lastError = reason;\n const next = nextStage(state);\n state.stage = next?.id ?? stageId;\n state.status = overallStatus(state);\n state.updatedAt = new Date().toISOString();\n return state;\n}\n\nexport function resetStage(state: State, stageId: string): State {\n const stage = state.stages[stageId];\n if (!stage) throw new Error(`Unknown stage \"${stageId}\".`);\n stage.status = 'pending';\n stage.outputs = [];\n stage.attempts = 0;\n delete stage.inputHash;\n delete stage.lastError;\n delete stage.startedAt;\n delete stage.finishedAt;\n state.stage = stageId;\n state.status = overallStatus(state);\n state.updatedAt = new Date().toISOString();\n return state;\n}\n\nexport function remainingBudget(state: State): number {\n return Math.max(0, state.budget.totalUsd - state.budget.spentUsd - state.budget.reservedUsd);\n}\n\nexport function recordSpend(state: State, usd: number): State {\n if (usd < 0) throw new BudgetError('Spend must not be negative.');\n const next = state.budget.spentUsd + usd;\n if (next > state.budget.totalUsd + 1e-9) {\n throw new BudgetError(\n `Spend of $${usd.toFixed(2)} would exceed the project budget ($${state.budget.totalUsd.toFixed(2)}).`,\n );\n }\n state.budget.spentUsd = Number(next.toFixed(6));\n state.updatedAt = new Date().toISOString();\n return state;\n}\n\nexport function stageTable(state: State): string[] {\n const rows = ['Stage Status Attempts Outputs'];\n for (const stage of STAGES) {\n const current = state.stages[stage.id];\n const status = current?.status ?? 'pending';\n const attempts = current?.attempts ?? 0;\n const outputs = current?.outputs.length ? current.outputs.join(', ') : '-';\n rows.push(`${stage.id.padEnd(21)} ${status.padEnd(9)} ${String(attempts).padEnd(9)} ${outputs}`);\n }\n return rows;\n}\n","import { BudgetError } from './errors.js';\nimport type { ModelPricing, ProjectConfig, State } from './schema.js';\nimport { remainingBudget } from './state.js';\n\nexport function estimateCost(units: number, pricing: ModelPricing): number {\n if (!Number.isFinite(units) || units < 0) throw new BudgetError('Cost units must be a non-negative number.');\n if (!Number.isFinite(pricing.usd) || pricing.usd < 0) {\n throw new BudgetError('Model pricing must be a known non-negative number.');\n }\n return Number((units * pricing.usd).toFixed(6));\n}\n\nexport function effectiveBatchCap(config: ProjectConfig, state: State): number {\n const remaining = remainingBudget(state);\n const ratioCap = remaining * 0.3;\n const configured = config.batch_cap_usd ?? ratioCap;\n return Math.min(configured, remaining);\n}\n\nexport function assertAffordable(\n config: ProjectConfig,\n state: State,\n estimatedUsd: number,\n label = 'batch',\n): void {\n const remaining = remainingBudget(state);\n if (estimatedUsd > remaining + 1e-9) {\n throw new BudgetError(\n `${label} estimate $${estimatedUsd.toFixed(2)} exceeds the remaining project budget $${remaining.toFixed(2)}.`,\n );\n }\n const cap = effectiveBatchCap(config, state);\n if (estimatedUsd > cap + 1e-9) {\n throw new BudgetError(\n `${label} estimate $${estimatedUsd.toFixed(2)} exceeds the batch cap $${cap.toFixed(2)}. Raise batch_cap_usd or reduce the batch.`,\n );\n }\n}\n\nexport function formatUsd(value: number): string {\n const absolute = Math.abs(value);\n const digits = absolute > 0 && absolute < 0.01 ? 4 : absolute < 1 ? 3 : 2;\n const fixed = value.toFixed(digits);\n const [whole, fraction = ''] = fixed.split('.');\n const trimmed = fraction.replace(/0+$/, '');\n return `$${whole}.${trimmed.padEnd(2, '0')}`;\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { mkdir, readFile, rename, writeFile } from 'node:fs/promises';\nimport { dirname, join, resolve } from 'node:path';\nimport { parse as parseYaml } from 'yaml';\nimport { z } from 'zod';\nimport { ValidationError, formatZodError } from './errors.js';\nimport { mergeTiming } from './timing.js';\nimport {\n CharacterBibleSchema,\n ModelsConfigSchema,\n ProjectConfigSchema,\n StateSchema,\n StoryboardSchema,\n StyleBibleSchema,\n TimingOverridesSchema,\n TimingSchema,\n type CharacterBible,\n type ModelsConfig,\n type ProjectConfig,\n type State,\n type Storyboard,\n type StyleBible,\n type Timing,\n type TimingOverrides,\n} from './schema.js';\nimport { createInitialState } from './state.js';\n\nexport interface ProjectPaths {\n root: string;\n config: string;\n state: string;\n brief: string;\n treatment: string;\n lyrics: string;\n sunoStyle: string;\n song: string;\n timing: string;\n overrides: string;\n effectiveTiming: string;\n storyboard: string;\n storyboardMd: string;\n style: string;\n characters: string;\n review: string;\n contactSheet: string;\n renders: string;\n assets: string;\n manifest: string;\n}\n\nexport function projectPaths(projectDir: string): ProjectPaths {\n const root = resolve(projectDir);\n return {\n root,\n config: join(root, 'project.yaml'),\n state: join(root, 'state.json'),\n brief: join(root, 'brief.md'),\n treatment: join(root, 'treatment.md'),\n lyrics: join(root, 'lyrics.txt'),\n sunoStyle: join(root, 'suno-style.txt'),\n song: join(root, 'song.json'),\n timing: join(root, 'timing.json'),\n overrides: join(root, 'timing.overrides.json'),\n effectiveTiming: join(root, 'timing.effective.json'),\n storyboard: join(root, 'storyboard.yaml'),\n storyboardMd: join(root, 'storyboard.md'),\n style: join(root, 'style.yaml'),\n characters: join(root, 'characters.yaml'),\n review: join(root, 'review'),\n contactSheet: join(root, 'review', 'contact-sheet.svg'),\n renders: join(root, 'renders'),\n assets: join(root, 'assets'),\n manifest: join(root, 'assets', 'manifest.jsonl'),\n };\n}\n\nexport async function readYamlFile<T>(path: string, schema: z.ZodType<T>): Promise<T> {\n let raw: string;\n try {\n raw = await readFile(path, 'utf8');\n } catch (error) {\n throw new ValidationError(`Cannot read ${path}: ${(error as Error).message}`);\n }\n let data: unknown;\n try {\n data = parseYaml(raw);\n } catch (error) {\n throw new ValidationError(`Invalid YAML in ${path}: ${(error as Error).message}`);\n }\n const result = schema.safeParse(data);\n if (!result.success) {\n throw new ValidationError(`Invalid ${path}`, formatZodError(result.error));\n }\n return result.data;\n}\n\nexport async function readJsonFile<T>(path: string, schema: z.ZodType<T>): Promise<T> {\n let raw: string;\n try {\n raw = await readFile(path, 'utf8');\n } catch (error) {\n throw new ValidationError(`Cannot read ${path}: ${(error as Error).message}`);\n }\n let data: unknown;\n try {\n data = JSON.parse(raw);\n } catch (error) {\n throw new ValidationError(`Invalid JSON in ${path}: ${(error as Error).message}`);\n }\n const result = schema.safeParse(data);\n if (!result.success) {\n throw new ValidationError(`Invalid ${path}`, formatZodError(result.error));\n }\n return result.data;\n}\n\nexport async function ensureDir(path: string): Promise<void> {\n await mkdir(path, { recursive: true });\n}\n\nexport async function writeTextAtomic(path: string, content: string): Promise<void> {\n await ensureDir(dirname(path));\n const temporary = `${path}.tmp-${process.pid}-${Date.now()}`;\n await writeFile(temporary, content, 'utf8');\n await rename(temporary, path);\n}\n\nexport async function writeJsonAtomic(path: string, value: unknown): Promise<void> {\n await writeTextAtomic(path, `${JSON.stringify(value, null, 2)}\\n`);\n}\n\nexport function pathExists(path: string): boolean {\n return existsSync(path);\n}\n\nexport function repoRoot(start = process.cwd()): string {\n let current = resolve(start);\n while (true) {\n const packagePath = join(current, 'package.json');\n if (existsSync(packagePath)) {\n try {\n const parsed = JSON.parse(readFileSync(packagePath, 'utf8')) as { name?: string };\n if (parsed.name === 'coreslopper') return current;\n } catch {\n // Keep walking.\n }\n }\n const parent = dirname(current);\n if (parent === current) {\n throw new ValidationError(`Could not find the coreslopper repository root from ${start}.`);\n }\n current = parent;\n }\n}\n\nexport interface LoadedProject {\n config: ProjectConfig;\n state: State;\n timing?: Timing;\n overrides: TimingOverrides;\n effectiveTiming?: Timing;\n storyboard?: Storyboard;\n style?: StyleBible;\n characters?: CharacterBible;\n paths: ProjectPaths;\n}\n\nexport async function loadProject(projectDir: string): Promise<LoadedProject> {\n const paths = projectPaths(projectDir);\n const config = await readYamlFile(paths.config, ProjectConfigSchema);\n const state = pathExists(paths.state)\n ? await readJsonFile(paths.state, StateSchema)\n : createInitialState(config, config.workflow.version);\n const timing = pathExists(paths.timing) ? await readJsonFile(paths.timing, TimingSchema) : undefined;\n const overrides = pathExists(paths.overrides)\n ? await readJsonFile(paths.overrides, TimingOverridesSchema)\n : TimingOverridesSchema.parse({});\n const effectiveTiming = timing ? mergeTiming(timing, overrides) : undefined;\n const storyboard = pathExists(paths.storyboard)\n ? await readYamlFile(paths.storyboard, StoryboardSchema)\n : undefined;\n const style = pathExists(paths.style) ? await readYamlFile(paths.style, StyleBibleSchema) : undefined;\n const characters = pathExists(paths.characters)\n ? await readYamlFile(paths.characters, CharacterBibleSchema)\n : undefined;\n\n return { config, state, timing, overrides, effectiveTiming, storyboard, style, characters, paths };\n}\n\nexport async function saveState(path: string, state: State): Promise<void> {\n await writeJsonAtomic(path, state);\n}\n\nexport async function writeEffectiveTiming(project: LoadedProject): Promise<void> {\n if (!project.effectiveTiming) return;\n await writeJsonAtomic(project.paths.effectiveTiming, project.effectiveTiming);\n}\n\nexport async function loadModelsConfig(root = repoRoot()): Promise<ModelsConfig> {\n return readYamlFile(join(root, 'config', 'models.yaml'), ModelsConfigSchema);\n}\n\nexport const DefaultsSchema = z.object({\n version: z.literal(1).default(1),\n formats: z.object({\n master: z.object({\n aspect: z.string().default('16:9'),\n width: z.number().int().positive().default(1920),\n height: z.number().int().positive().default(1080),\n fps: z.number().int().positive().default(30),\n }),\n derivatives: z\n .array(\n z.object({\n aspect: z.string(),\n width: z.number().int().positive(),\n height: z.number().int().positive(),\n }),\n )\n .default([\n { aspect: '9:16', width: 1080, height: 1920 },\n { aspect: '1:1', width: 1080, height: 1080 },\n ]),\n }),\n budget: z.object({\n minimum_usd: z.number().positive().default(5),\n suggested_usd: z.number().positive().default(50),\n }),\n render: z.object({\n loudness_lufs: z.number().default(-14),\n true_peak_dbtp: z.number().default(-1),\n video_bitrate: z.string().default('12M'),\n }),\n asset_batch_size: z.number().int().positive().default(5),\n retries: z.object({\n max_attempts: z.number().int().positive().default(4),\n base_delay_ms: z.number().int().positive().default(1000),\n request_timeout_ms: z.number().int().positive().default(180_000),\n }),\n});\n\nexport type Defaults = z.infer<typeof DefaultsSchema>;\n\nexport async function loadDefaults(root = repoRoot()): Promise<Defaults> {\n return readYamlFile(join(root, 'config', 'defaults.yaml'), DefaultsSchema);\n}\n","import { createHash } from 'node:crypto';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { extname, join } from 'node:path';\n\nexport type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;\n\nexport const IMAGE_EXTENSIONS = new Set(['.png', '.jpg', '.jpeg', '.webp', '.gif', '.avif', '.svg']);\nexport const VIDEO_EXTENSIONS = new Set(['.mp4', '.webm', '.mov', '.mkv']);\nexport const AUDIO_EXTENSIONS = new Set(['.mp3', '.wav', '.m4a', '.ogg', '.flac']);\n\nexport function mimeForPath(path: string): string {\n const extension = extname(path).toLowerCase();\n if (extension === '.png') return 'image/png';\n if (extension === '.jpg' || extension === '.jpeg') return 'image/jpeg';\n if (extension === '.webp') return 'image/webp';\n if (extension === '.svg') return 'image/svg+xml';\n if (extension === '.avif') return 'image/avif';\n if (extension === '.gif') return 'image/gif';\n if (extension === '.mp4') return 'video/mp4';\n if (extension === '.webm') return 'video/webm';\n if (extension === '.mp3') return 'audio/mpeg';\n if (extension === '.wav') return 'audio/wav';\n if (extension === '.m4a') return 'audio/mp4';\n if (extension === '.ogg') return 'audio/ogg';\n if (extension === '.flac') return 'audio/flac';\n return 'application/octet-stream';\n}\n\nexport async function fileToDataUri(path: string): Promise<string> {\n const data = await readFile(path);\n return `data:${mimeForPath(path)};base64,${data.toString('base64')}`;\n}\n\nexport function delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function isRetryableStatus(status: number): boolean {\n return status === 408 || status === 409 || status === 429 || status >= 500;\n}\n\nexport class NonRetryableHttpError extends Error {}\n\nexport async function fetchJsonWithRetry(\n label: string,\n url: string,\n init: RequestInit,\n timeoutMs: number,\n fetchImpl: FetchLike = fetch,\n attempts = 4,\n): Promise<Record<string, unknown>> {\n let lastError: unknown;\n for (let attempt = 0; attempt < attempts; attempt += 1) {\n try {\n const response = await fetchImpl(url, { ...init, signal: AbortSignal.timeout(timeoutMs) });\n const text = await response.text();\n let body: unknown;\n try {\n body = text ? JSON.parse(text) : {};\n } catch {\n body = { raw: text };\n }\n if (!response.ok) {\n const message = `${label} ${response.status}: ${typeof body === 'string' ? body : JSON.stringify(body)}`;\n if (!isRetryableStatus(response.status)) throw new NonRetryableHttpError(message);\n if (attempt < attempts - 1) {\n await delay(500 * 2 ** attempt);\n continue;\n }\n throw new Error(message);\n }\n return body as Record<string, unknown>;\n } catch (error) {\n if (error instanceof NonRetryableHttpError) throw error;\n lastError = error;\n if (attempt >= attempts - 1) break;\n await delay(500 * 2 ** attempt);\n }\n }\n throw lastError instanceof Error ? lastError : new Error(String(lastError));\n}\n\nexport function collectUrls(value: unknown, keyHint = ''): string[] {\n const found: string[] = [];\n if (typeof value === 'string') {\n if (/^https?:\\/\\//.test(value)) {\n const extension = extname(new URL(value).pathname).toLowerCase();\n if (\n IMAGE_EXTENSIONS.has(extension) ||\n VIDEO_EXTENSIONS.has(extension) ||\n AUDIO_EXTENSIONS.has(extension) ||\n keyHint === 'url' ||\n keyHint.endsWith('_url')\n ) {\n found.push(value);\n }\n }\n return found;\n }\n if (Array.isArray(value)) {\n for (const item of value) found.push(...collectUrls(item, keyHint));\n return found;\n }\n if (value && typeof value === 'object') {\n for (const [key, item] of Object.entries(value as Record<string, unknown>)) {\n found.push(...collectUrls(item, key));\n }\n }\n return found;\n}\n\nexport function extensionFor(contentType: string | null, url: string): string {\n const type = (contentType ?? '').split(';')[0]?.trim().toLowerCase();\n if (type === 'image/png') return '.png';\n if (type === 'image/jpeg') return '.jpg';\n if (type === 'image/webp') return '.webp';\n if (type === 'image/svg+xml') return '.svg';\n if (type === 'video/mp4') return '.mp4';\n if (type === 'video/webm') return '.webm';\n if (type === 'audio/mpeg') return '.mp3';\n if (type === 'audio/wav' || type === 'audio/x-wav') return '.wav';\n if (type === 'audio/mp4') return '.m4a';\n const extension = extname(new URL(url).pathname).toLowerCase();\n if (IMAGE_EXTENSIONS.has(extension) || VIDEO_EXTENSIONS.has(extension) || AUDIO_EXTENSIONS.has(extension)) {\n return extension;\n }\n return '.bin';\n}\n\nexport async function downloadOutputs(\n prefix: string,\n urls: string[],\n outputDir: string,\n timeoutMs: number,\n fetchImpl: FetchLike = fetch,\n): Promise<string[]> {\n await mkdir(outputDir, { recursive: true });\n const files: string[] = [];\n for (const [index, url] of urls.entries()) {\n const response = await fetchImpl(url, { signal: AbortSignal.timeout(timeoutMs) });\n if (!response.ok) throw new Error(`Failed to download ${prefix} output ${url}: ${response.status}`);\n const extension = extensionFor(response.headers.get('content-type'), url);\n const name = createHash('sha256').update(url).digest('hex').slice(0, 16);\n const path = join(outputDir, `${prefix}-${name}-${index}${extension}`);\n await writeFile(path, Buffer.from(await response.arrayBuffer()));\n files.push(path);\n }\n return files;\n}\n","import { readFile } from 'node:fs/promises';\nimport { extname } from 'node:path';\nimport { ConfigError } from '@coreslopper/core';\nimport {\n collectUrls,\n delay,\n downloadOutputs,\n fetchJsonWithRetry,\n type FetchLike,\n} from './http.js';\nimport type { Provider, ProviderInput, ProviderOutput } from './types.js';\n\nexport interface HiggsfieldProviderOptions {\n /** Complete credential, usually `key_id:key_secret`. */\n credentials?: string;\n baseUrl?: string;\n requestTimeoutMs?: number;\n pollIntervalMs?: number;\n fetchImpl?: FetchLike;\n}\n\n/** Content types accepted by the Higgsfield upload endpoint. */\nconst UPLOAD_CONTENT_TYPES = new Map<string, string>([\n ['.jpg', 'image/jpeg'],\n ['.jpeg', 'image/jpeg'],\n ['.png', 'image/png'],\n ['.webp', 'image/webp'],\n ['.gif', 'image/gif'],\n ['.wav', 'audio/wav'],\n ['.mp4', 'video/mp4'],\n]);\n\nconst TERMINAL_FAILURES = new Set(['failed', 'nsfw', 'canceled', 'cancelled']);\nconst COMPLETED = 'completed';\nconst OUTPUT_KEYS = ['images', 'image', 'video', 'videos', 'audio', 'audios', 'output', 'outputs', 'files'];\n\n/**\n * Resolve Higgsfield credentials from the environment.\n *\n * Accepts the complete credential (`HIGGSFIELD_API_KEY`, `HF_API_KEY`, `HF_KEY`,\n * or `HF_CREDENTIALS`) or the split key ID and secret (`HF_API_KEY_ID` and\n * `HF_API_KEY_SECRET`).\n */\nexport function resolveHiggsfieldCredentials(env: NodeJS.ProcessEnv = process.env): string | undefined {\n const combined = env.HIGGSFIELD_API_KEY ?? env.HF_API_KEY ?? env.HF_KEY ?? env.HF_CREDENTIALS;\n if (combined?.trim()) return combined.trim().replace(/^Key\\s+/i, '');\n const id = env.HF_API_KEY_ID?.trim();\n const secret = env.HF_API_KEY_SECRET?.trim();\n if (id && secret) return `${id}:${secret}`;\n return undefined;\n}\n\nfunction normalizeCredentials(value: string): string {\n return value.trim().replace(/^Key\\s+/i, '');\n}\n\nfunction normalizeSeed(seed: number): number {\n const value = Math.abs(Math.trunc(seed)) % 1_000_000;\n return value || 1;\n}\n\n/**\n * Pull a boolean adapter option out of the model params. These options steer\n * the adapter and are not sent to the provider.\n */\nfunction takeSwitch(params: Record<string, unknown>, key: string): [boolean, Record<string, unknown>] {\n const { [key]: value, ...rest } = params;\n return [value === true, rest];\n}\n\nfunction takeReferenceField(\n params: Record<string, unknown>,\n fallback = 'image_urls',\n): [string, Record<string, unknown>] {\n const { reference_field: value, ...rest } = params;\n return [typeof value === 'string' && value.length > 0 ? value : fallback, rest];\n}\n\nfunction collectOutputUrls(result: Record<string, unknown>): string[] {\n const urls: string[] = [];\n for (const key of OUTPUT_KEYS) {\n if (result[key] === undefined) continue;\n urls.push(...collectUrls(result[key], 'url'));\n }\n return [...new Set(urls)];\n}\n\nexport class HiggsfieldProvider implements Provider {\n readonly name = 'higgsfield';\n private readonly credentials: string;\n private readonly baseUrl: string;\n private readonly requestTimeoutMs: number;\n private readonly pollIntervalMs: number;\n private readonly fetchImpl: FetchLike;\n private readonly uploadCache = new Map<string, string>();\n\n constructor(options: HiggsfieldProviderOptions = {}) {\n const credentials = options.credentials ?? resolveHiggsfieldCredentials();\n if (!credentials) {\n throw new ConfigError(\n 'Higgsfield credentials are not set. Add HIGGSFIELD_API_KEY (key_id:key_secret) to .env, ' +\n 'or set HF_API_KEY_ID and HF_API_KEY_SECRET, or use the mock provider.',\n );\n }\n this.credentials = normalizeCredentials(credentials);\n this.baseUrl = options.baseUrl ?? 'https://api.higgsfield.ai';\n this.requestTimeoutMs = options.requestTimeoutMs ?? 600_000;\n this.pollIntervalMs = options.pollIntervalMs ?? 1_000;\n this.fetchImpl = options.fetchImpl ?? fetch;\n }\n\n async generateImage(input: ProviderInput): Promise<ProviderOutput> {\n const [, afterReference] = takeReferenceField(input.params ?? {}, 'image_url');\n const [sendSeed, afterSeedSwitch] = takeSwitch(afterReference, 'send_seed');\n const [sendNegative, params] = takeSwitch(afterSeedSwitch, 'send_negative_prompt');\n return this.runModel(input, {\n prompt: input.prompt,\n ...(sendSeed ? { seed: normalizeSeed(input.seed) } : {}),\n ...(sendNegative && input.negativePrompt ? { negative_prompt: input.negativePrompt } : {}),\n ...params,\n });\n }\n\n async editImage(input: ProviderInput): Promise<ProviderOutput> {\n const references = input.references ?? [];\n if (references.length === 0) {\n throw new Error('editImage requires at least one reference image.');\n }\n const [field, afterReference] = takeReferenceField(input.params ?? {});\n const [sendSeed, afterSeedSwitch] = takeSwitch(afterReference, 'send_seed');\n const [sendNegative, params] = takeSwitch(afterSeedSwitch, 'send_negative_prompt');\n const urls = await Promise.all(references.map((reference) => this.uploadReference(reference)));\n if (!field.endsWith('s') && urls.length > 1) {\n throw new Error(\n `Higgsfield reference field \"${field}\" accepts one image, but ${urls.length} references were supplied.`,\n );\n }\n const referenceBody = field.endsWith('s') ? { [field]: urls } : { [field]: urls[0] };\n return this.runModel(input, {\n prompt: input.prompt,\n ...referenceBody,\n ...(sendSeed ? { seed: normalizeSeed(input.seed) } : {}),\n ...(sendNegative && input.negativePrompt ? { negative_prompt: input.negativePrompt } : {}),\n ...params,\n });\n }\n\n async imageToVideo(input: ProviderInput): Promise<ProviderOutput> {\n const reference = input.references?.[0];\n if (!reference) {\n throw new Error('imageToVideo requires a start-frame reference image.');\n }\n const [field, afterReference] = takeReferenceField(input.params ?? {}, 'image_url');\n const [sendSeed, afterSeedSwitch] = takeSwitch(afterReference, 'send_seed');\n const [sendNegative, params] = takeSwitch(afterSeedSwitch, 'send_negative_prompt');\n const imageUrl = await this.uploadReference(reference);\n return this.runModel(input, {\n prompt: input.prompt,\n [field]: imageUrl,\n duration: input.durationSeconds ?? 5,\n ...(sendSeed ? { seed: normalizeSeed(input.seed) } : {}),\n ...(sendNegative && input.negativePrompt ? { negative_prompt: input.negativePrompt } : {}),\n ...params,\n });\n }\n\n async lipSync(_input: ProviderInput): Promise<ProviderOutput> {\n throw new ConfigError(\n 'The Higgsfield adapter does not support lip-sync yet. Set providers.lipsync to \"fal\" ' +\n 'and provide FAL_KEY, or keep providers.video on fal for lip-sync shots.',\n );\n }\n\n private async runModel(input: ProviderInput, body: Record<string, unknown>): Promise<ProviderOutput> {\n const model = input.model.replace(/^\\/+/, '');\n const headers: Record<string, string> = {\n Authorization: `Key ${this.credentials}`,\n 'Content-Type': 'application/json',\n };\n if (input.idempotencyKey) headers['Idempotency-Key'] = input.idempotencyKey;\n\n const accepted = await fetchJsonWithRetry(\n 'Higgsfield',\n `${this.baseUrl}/${model}`,\n { method: 'POST', headers, body: JSON.stringify(body) },\n this.requestTimeoutMs,\n this.fetchImpl,\n );\n\n const initialStatus = String(accepted.status ?? '').toLowerCase();\n if (TERMINAL_FAILURES.has(initialStatus)) {\n throw new Error(`Higgsfield request ${initialStatus}: ${JSON.stringify(accepted).slice(0, 500)}`);\n }\n\n let result = accepted;\n if (initialStatus !== COMPLETED && collectOutputUrls(accepted).length === 0) {\n const statusUrl = String(\n accepted.status_url ??\n (accepted.request_id ? `${this.baseUrl}/requests/${accepted.request_id}/status` : ''),\n );\n if (!statusUrl) {\n throw new Error(`Higgsfield returned no request handle for ${model}: ${JSON.stringify(accepted).slice(0, 500)}`);\n }\n result = await this.poll(statusUrl);\n }\n\n const urls = collectOutputUrls(result);\n if (urls.length === 0) {\n throw new Error(`Higgsfield returned no output URLs for ${model}: ${JSON.stringify(result).slice(0, 500)}`);\n }\n return {\n files: await downloadOutputs('higgsfield', urls, input.outputDir, this.requestTimeoutMs, this.fetchImpl),\n raw: result,\n };\n }\n\n private async poll(statusUrl: string): Promise<Record<string, unknown>> {\n const started = Date.now();\n let interval = this.pollIntervalMs;\n while (Date.now() - started < this.requestTimeoutMs) {\n const status = await fetchJsonWithRetry(\n 'Higgsfield',\n statusUrl,\n {\n method: 'GET',\n headers: { Authorization: `Key ${this.credentials}` },\n },\n this.requestTimeoutMs,\n this.fetchImpl,\n );\n const value = String(status.status ?? '').toLowerCase();\n if (value === COMPLETED) return status;\n if (TERMINAL_FAILURES.has(value)) {\n throw new Error(`Higgsfield request ${value}: ${JSON.stringify(status).slice(0, 500)}`);\n }\n await delay(interval);\n interval = Math.min(Math.round(interval * 1.5), 10_000);\n }\n throw new Error(`Higgsfield request timed out after ${this.requestTimeoutMs}ms.`);\n }\n\n private async uploadReference(path: string): Promise<string> {\n const cached = this.uploadCache.get(path);\n if (cached) return cached;\n\n const contentType = UPLOAD_CONTENT_TYPES.get(extname(path).toLowerCase());\n if (!contentType) {\n throw new ConfigError(\n `Higgsfield cannot upload ${path}: unsupported content type. Use JPEG, PNG, WebP, GIF, WAV, or MP4.`,\n );\n }\n\n const created = await fetchJsonWithRetry(\n 'Higgsfield',\n `${this.baseUrl}/files/generate-upload-url`,\n {\n method: 'POST',\n headers: {\n Authorization: `Key ${this.credentials}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ content_type: contentType }),\n },\n this.requestTimeoutMs,\n this.fetchImpl,\n );\n\n const uploadUrl = typeof created.upload_url === 'string' ? created.upload_url : undefined;\n const publicUrl = typeof created.public_url === 'string' ? created.public_url : undefined;\n if (!uploadUrl || !publicUrl) {\n throw new Error(`Higgsfield did not return an upload URL: ${JSON.stringify(created).slice(0, 500)}`);\n }\n\n const uploadHeaders =\n created.upload_headers && typeof created.upload_headers === 'object'\n ? (created.upload_headers as Record<string, string>)\n : { 'Content-Type': contentType };\n const data = await readFile(path);\n const upload = await this.fetchImpl(uploadUrl, {\n method: 'PUT',\n headers: uploadHeaders,\n body: new Uint8Array(data),\n signal: AbortSignal.timeout(this.requestTimeoutMs),\n });\n if (!upload.ok) {\n throw new Error(`Higgsfield upload failed for ${path}: ${upload.status}`);\n }\n\n this.uploadCache.set(path, publicUrl);\n return publicUrl;\n }\n}\n","import { copyFile, mkdir, readFile, writeFile, appendFile, stat } from 'node:fs/promises';\nimport { dirname, extname, join, relative } from 'node:path';\nimport { createHash } from 'node:crypto';\nimport { hashFile, hashObject } from '@coreslopper/core';\nimport type {\n GenerationRequest,\n GenerationResult,\n GenerationRunnerOptions,\n ProviderOutput,\n} from './types.js';\n\ninterface CacheRecord {\n result: Omit<GenerationResult, 'cached'>;\n}\n\nfunction defaultSeed(request: GenerationRequest): number {\n const digest = hashObject({\n model: request.model,\n prompt: request.prompt,\n operation: request.operation,\n });\n return Number.parseInt(digest.slice(0, 8), 16) % 2_147_483_647;\n}\n\nfunction outputName(hash: string, index: number, extension: string): string {\n return `${hash.slice(0, 16)}-${index}${extension}`;\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function copyOutputs(files: string[], outputDir: string, hash: string): Promise<string[]> {\n await mkdir(outputDir, { recursive: true });\n const copied: string[] = [];\n for (const [index, file] of files.entries()) {\n const extension = extname(file) || '.bin';\n const destination = join(outputDir, outputName(hash, index, extension));\n await copyFile(file, destination);\n copied.push(destination);\n }\n return copied;\n}\n\nexport class GenerationRunner {\n constructor(private readonly options: GenerationRunnerOptions) {}\n\n async run(request: GenerationRequest): Promise<GenerationResult> {\n const references = request.references ?? [];\n const referenceHashes = await Promise.all(\n references.map(async (path) => ({\n path,\n sha256: await hashFile(path),\n })),\n );\n if (request.operation === 'lipSync' && !request.audio) {\n throw new Error('lipSync requires an audio file.');\n }\n const audioHash = request.audio ? await hashFile(request.audio) : undefined;\n const seed = request.seed ?? defaultSeed(request);\n const params = request.params ?? {};\n const hash = hashObject({\n operation: request.operation,\n provider: this.options.provider.name,\n model: request.model,\n prompt: request.prompt,\n negativePrompt: request.negativePrompt,\n seed,\n width: request.width,\n height: request.height,\n durationSeconds: request.durationSeconds,\n params,\n references: referenceHashes,\n ...(audioHash ? { audio: audioHash } : {}),\n });\n\n const cacheDir = join(this.options.cacheDir, hash);\n const cacheRecordPath = join(cacheDir, 'result.json');\n const cached = await this.readCache(cacheRecordPath);\n if (cached) {\n const copied = await copyOutputs(cached.result.files, request.outputDir, hash);\n const result: GenerationResult = {\n ...cached.result,\n files: copied,\n cached: true,\n costUsd: 0,\n };\n await this.appendManifest(request, result, 'ok');\n return result;\n }\n\n await this.options.beforeGenerate?.(request.estimatedCostUsd);\n await mkdir(cacheDir, { recursive: true });\n\n let output: ProviderOutput;\n try {\n const input = {\n model: request.model,\n prompt: request.prompt,\n negativePrompt: request.negativePrompt,\n references,\n audio: request.audio,\n seed,\n width: request.width,\n height: request.height,\n durationSeconds: request.durationSeconds,\n params,\n outputDir: cacheDir,\n idempotencyKey: hash,\n };\n if (request.operation === 'generateImage') output = await this.options.provider.generateImage(input);\n else if (request.operation === 'editImage') output = await this.options.provider.editImage(input);\n else if (request.operation === 'lipSync') output = await this.options.provider.lipSync(input);\n else output = await this.options.provider.imageToVideo(input);\n } catch (error) {\n const failed: GenerationResult = {\n id: `gen_${hash.slice(0, 12)}`,\n hash,\n operation: request.operation,\n role: request.role,\n provider: this.options.provider.name,\n model: request.model,\n prompt: request.prompt,\n seed,\n references,\n params,\n costUsd: 0,\n cached: false,\n files: [],\n createdAt: new Date().toISOString(),\n };\n await this.appendManifest(request, failed, 'failed', error instanceof Error ? error.message : String(error));\n throw error;\n }\n\n if (output.files.length === 0) throw new Error(`${this.options.provider.name} returned no files.`);\n for (const file of output.files) {\n if (!(await fileExists(file))) throw new Error(`Provider reported a missing file: ${file}`);\n }\n\n const cachedResult: Omit<GenerationResult, 'cached'> = {\n id: `gen_${hash.slice(0, 12)}`,\n hash,\n operation: request.operation,\n role: request.role,\n provider: this.options.provider.name,\n model: request.model,\n prompt: request.prompt,\n seed,\n references,\n ...(request.audio ? { audio: request.audio } : {}),\n params,\n costUsd: request.estimatedCostUsd,\n files: output.files,\n createdAt: new Date().toISOString(),\n };\n await writeFile(cacheRecordPath, `${JSON.stringify({ result: cachedResult }, null, 2)}\\n`, 'utf8');\n\n const copied = await copyOutputs(output.files, request.outputDir, hash);\n const result: GenerationResult = {\n ...cachedResult,\n files: copied,\n cached: false,\n };\n await this.appendManifest(request, result, 'ok');\n return result;\n }\n\n private async readCache(path: string): Promise<CacheRecord | undefined> {\n if (!(await fileExists(path))) return undefined;\n try {\n const parsed = JSON.parse(await readFile(path, 'utf8')) as CacheRecord;\n if (!parsed.result?.files?.length) return undefined;\n for (const file of parsed.result.files) {\n if (!(await fileExists(file))) return undefined;\n }\n return parsed;\n } catch {\n return undefined;\n }\n }\n\n private async appendManifest(\n request: GenerationRequest,\n result: GenerationResult,\n status: 'ok' | 'failed',\n error?: string,\n ): Promise<void> {\n const baseDir = request.projectDir ?? process.cwd();\n const record = {\n ...result,\n status,\n ...(error ? { error } : {}),\n files: result.files.map((file) => relative(baseDir, file)),\n references: result.references.map((file) => relative(baseDir, file)),\n ...(result.audio ? { audio: relative(baseDir, result.audio) } : {}),\n };\n await mkdir(dirname(this.options.manifestPath), { recursive: true });\n await appendFile(this.options.manifestPath, `${JSON.stringify(record)}\\n`, 'utf8');\n }\n}\n\nexport function newGenerationId(): string {\n return `gen_${createHash('sha256').update(String(Date.now())).digest('hex').slice(0, 12)}`;\n}\n","import { execFileSync, spawnSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { delimiter, join } from 'node:path';\n\nexport type ToolId = 'node' | 'npm' | 'git' | 'uv' | 'python' | 'ffmpeg' | 'claude';\n\nexport interface ToolCheck {\n id: ToolId;\n name: string;\n ok: boolean;\n detail: string;\n required: boolean;\n purpose: string;\n}\n\nexport interface SetupResult {\n npm: boolean;\n uv: boolean;\n warning?: string;\n}\n\nfunction refreshPath(): void {\n const additions = [join(homedir(), '.local', 'bin'), join(homedir(), '.cargo', 'bin')];\n const current = process.env.PATH?.split(delimiter) ?? [];\n for (const directory of additions) {\n if (existsSync(directory) && !current.includes(directory)) {\n process.env.PATH = `${directory}${delimiter}${process.env.PATH ?? ''}`;\n current.unshift(directory);\n }\n }\n}\n\nfunction commandVersion(command: string, args: string[] = ['--version']): string | undefined {\n try {\n const output = execFileSync(command, args, {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n timeout: 10_000,\n shell: process.platform === 'win32',\n }).trim();\n return output.split('\\n').find((line) => line.trim())?.trim();\n } catch {\n return undefined;\n }\n}\n\nexport function commandExists(command: string): boolean {\n refreshPath();\n const finder = process.platform === 'win32' ? 'where' : 'which';\n try {\n execFileSync(finder, [command], { stdio: 'ignore', timeout: 5_000 });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction pythonVersion(): { ok: boolean; detail: string } {\n let fallback: { ok: false; detail: string } | undefined;\n for (const command of ['python3', 'python']) {\n const output = commandVersion(command, ['--version']);\n if (!output) continue;\n const match = output.match(/(\\d+)\\.(\\d+)\\.(\\d+)/);\n if (!match) continue;\n const major = Number(match[1]);\n const minor = Number(match[2]);\n const detail = `${output} (${command})`;\n if (major === 3 && minor >= 12) return { ok: true, detail };\n fallback ??= { ok: false, detail: `${detail}, but 3.12 or newer is required` };\n }\n\n if (commandExists('uv')) {\n try {\n const path = execFileSync('uv', ['python', 'find', '3.12'], {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n timeout: 15_000,\n }).trim();\n if (path) return { ok: true, detail: `${path} (managed by uv)` };\n } catch {\n // Fall through to the missing message.\n }\n }\n\n return fallback ?? { ok: false, detail: 'missing (3.12 or newer required)' };\n}\n\nexport function detectTools(root = process.cwd()): ToolCheck[] {\n refreshPath();\n const checks: ToolCheck[] = [];\n\n const nodeMajor = Number(process.versions.node.split('.')[0]);\n checks.push({\n id: 'node',\n name: 'Node.js >= 22',\n ok: nodeMajor >= 22,\n detail: process.version,\n required: true,\n purpose: 'runtime',\n });\n\n const npm = commandVersion('npm');\n checks.push({\n id: 'npm',\n name: 'npm',\n ok: Boolean(npm),\n detail: npm ?? 'missing',\n required: true,\n purpose: 'dependency installation',\n });\n\n const git = commandVersion('git');\n checks.push({\n id: 'git',\n name: 'git',\n ok: Boolean(git),\n detail: git ?? 'missing (optional, needed for versioning your workspace)',\n required: false,\n purpose: 'version control',\n });\n\n const uv = commandVersion('uv');\n checks.push({\n id: 'uv',\n name: 'uv',\n ok: Boolean(uv),\n detail: uv ?? 'missing (needed for audio analysis)',\n required: false,\n purpose: 'audio-analysis',\n });\n\n const python = pythonVersion();\n checks.push({\n id: 'python',\n name: 'Python >= 3.12',\n ok: python.ok,\n detail: python.detail,\n required: false,\n purpose: 'audio-analysis',\n });\n\n const localFfmpeg = join(root, '.tools', 'ffmpeg', 'ffmpeg');\n const ffmpeg = existsSync(localFfmpeg) ? localFfmpeg : commandVersion('ffmpeg', ['-version']);\n checks.push({\n id: 'ffmpeg',\n name: 'ffmpeg',\n ok: Boolean(ffmpeg),\n detail: ffmpeg ?? 'missing (optional, needed for footage and loudness normalization)',\n required: false,\n purpose: 'media',\n });\n\n const claude = commandVersion('claude');\n checks.push({\n id: 'claude',\n name: 'Claude Code',\n ok: Boolean(claude),\n detail: claude ?? 'missing (needed to run /video-next)',\n required: false,\n purpose: 'agent pipeline',\n });\n\n return checks;\n}\n\nexport function formatTools(checks: ToolCheck[]): string {\n return checks\n .map((check) => {\n const mark = check.ok ? '✔' : check.required ? '✖' : '○';\n return `${mark} ${check.name}: ${check.detail}`;\n })\n .join('\\n');\n}\n\nexport function missingTools(checks: ToolCheck[]): ToolCheck[] {\n return checks.filter((check) => !check.ok);\n}\n\nfunction spawnStep(label: string, command: string, args: string[], cwd?: string): void {\n console.log(`→ ${label}`);\n const result = spawnSync(command, args, {\n cwd,\n env: process.env,\n stdio: 'inherit',\n shell: process.platform === 'win32',\n });\n if (result.error) throw result.error;\n if (result.status !== 0) {\n throw new Error(`${label} failed (exit code ${result.status ?? 'unknown'}).`);\n }\n}\n\nexport function installUv(): boolean {\n refreshPath();\n if (commandExists('uv')) return true;\n\n console.log('→ Installing uv (official installer)');\n const result =\n process.platform === 'win32'\n ? spawnSync(\n 'powershell',\n ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-Command', 'irm https://astral.sh/uv/install.ps1 | iex'],\n { stdio: 'inherit' },\n )\n : spawnSync('sh', ['-c', 'curl -LsSf https://astral.sh/uv/install.sh | sh'], { stdio: 'inherit' });\n\n refreshPath();\n if (result.error) console.error(`uv installer: ${result.error.message}`);\n return commandExists('uv');\n}\n\nexport function installPython(): boolean {\n if (!commandExists('uv')) return false;\n spawnStep('Installing Python 3.12 with uv', 'uv', ['python', 'install', '3.12']);\n return pythonVersion().ok;\n}\n\nexport function installFfmpeg(root = process.cwd()): boolean {\n const local = join(root, '.tools', 'ffmpeg', 'ffmpeg');\n if (existsSync(local) || commandExists('ffmpeg')) return true;\n\n const script = join(root, 'scripts', 'install-ffmpeg.sh');\n if (process.platform === 'darwin' && commandExists('brew')) {\n spawnStep('Installing ffmpeg with Homebrew', 'brew', ['install', 'ffmpeg']);\n return commandExists('ffmpeg');\n }\n\n if (process.platform === 'linux' && process.arch === 'x64' && existsSync(script)) {\n spawnStep('Installing local ffmpeg (Linux x86_64)', 'bash', [script]);\n return existsSync(local) || commandExists('ffmpeg');\n }\n\n if (process.platform === 'linux' && commandExists('apt-get')) {\n if (process.getuid?.() === 0) {\n spawnStep('Updating apt package lists', 'apt-get', ['update']);\n spawnStep('Installing ffmpeg with apt', 'apt-get', ['install', '-y', 'ffmpeg']);\n } else {\n spawnStep('Updating apt package lists (sudo)', 'sudo', ['apt-get', 'update']);\n spawnStep('Installing ffmpeg with apt (sudo)', 'sudo', ['apt-get', 'install', '-y', 'ffmpeg']);\n }\n return commandExists('ffmpeg');\n }\n\n if (process.platform === 'win32' && commandExists('winget')) {\n spawnStep('Installing ffmpeg with winget', 'winget', [\n 'install',\n '--id',\n 'Gyan.FFmpeg',\n '-e',\n '--accept-source-agreements',\n '--accept-package-agreements',\n ]);\n return commandExists('ffmpeg');\n }\n\n console.error('Could not install ffmpeg automatically. Install it with your package manager.');\n return false;\n}\n\nexport function installClaudeCode(): boolean {\n if (commandExists('claude')) return true;\n spawnStep('Installing Claude Code globally', 'npm', ['install', '-g', '@anthropic-ai/claude-code']);\n return commandExists('claude');\n}\n\nexport function runSetup(root: string): SetupResult {\n spawnStep('Installing Node dependencies (npm install)', 'npm', ['install'], root);\n\n if (!commandExists('uv')) {\n return {\n npm: true,\n uv: false,\n warning: 'uv is not installed, so the Python audio-analysis environment was skipped.',\n };\n }\n\n try {\n spawnStep('Syncing audio-analysis dependencies (uv sync)', 'uv', ['sync', '--group', 'dev'], join(root, 'scripts', 'audio-analysis'));\n } catch (error) {\n return {\n npm: true,\n uv: false,\n warning: `Node dependencies are installed, but \"uv sync\" failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n return { npm: true, uv: true };\n}\n\nexport type FalKeyStatus = 'valid' | 'invalid' | 'unknown';\n\nexport interface ProviderKeyResult {\n status: FalKeyStatus;\n message: string;\n}\n\nexport type FalKeyResult = ProviderKeyResult;\n\n/**\n * Check a fal.ai key against the model-list endpoint. A network failure is\n * reported as unknown so onboarding never blocks on connectivity.\n */\nexport async function validateFalKey(\n key: string,\n fetchImpl: (input: string, init?: RequestInit) => Promise<Response> = fetch,\n): Promise<ProviderKeyResult> {\n const trimmed = key.trim();\n if (!trimmed) return { status: 'invalid', message: 'empty key' };\n\n try {\n const response = await fetchImpl('https://api.fal.ai/v1/models?limit=1', {\n headers: { Authorization: `Key ${trimmed}` },\n signal: AbortSignal.timeout(10_000),\n });\n if (response.ok) return { status: 'valid', message: `HTTP ${response.status}` };\n if (response.status === 401) return { status: 'invalid', message: 'HTTP 401 (key rejected)' };\n if (response.status === 403) return { status: 'unknown', message: 'HTTP 403 (key may lack API permission)' };\n return { status: 'unknown', message: `HTTP ${response.status}` };\n } catch (error) {\n return {\n status: 'unknown',\n message: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Check a Higgsfield credential against a lightweight authenticated endpoint.\n * Network failures are reported as unknown, not as an invalid credential.\n */\nexport async function validateHiggsfieldKey(\n key: string,\n fetchImpl: (input: string, init?: RequestInit) => Promise<Response> = fetch,\n): Promise<ProviderKeyResult> {\n const trimmed = key.trim();\n if (!trimmed) return { status: 'invalid', message: 'empty credential' };\n\n try {\n const response = await fetchImpl('https://api.higgsfield.ai/v1/text2image/soul-styles/v2', {\n headers: { Authorization: `Key ${trimmed}` },\n signal: AbortSignal.timeout(10_000),\n });\n if (response.ok) return { status: 'valid', message: `HTTP ${response.status}` };\n if (response.status === 401) return { status: 'invalid', message: 'HTTP 401 (credential rejected)' };\n if (response.status === 402) return { status: 'unknown', message: 'HTTP 402 (balance required)' };\n if (response.status === 403) return { status: 'unknown', message: 'HTTP 403 (credential may lack API permission)' };\n return { status: 'unknown', message: `HTTP ${response.status}` };\n } catch (error) {\n return {\n status: 'unknown',\n message: error instanceof Error ? error.message : String(error),\n };\n }\n}\n","import { existsSync, readFileSync, readdirSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { ValidationError } from '@coreslopper/core';\n\nexport const WORKSPACE_MARKER = 'coreslopper.workspace.json';\n\nexport interface WorkspaceMarker {\n version: 1;\n runtimeVersion: string;\n created: string;\n project?: string;\n}\n\nfunction readPackage(path: string): { name?: string; version?: string } | undefined {\n try {\n return JSON.parse(readFileSync(path, 'utf8')) as { name?: string; version?: string };\n } catch {\n return undefined;\n }\n}\n\nexport function isWorkspace(directory: string): boolean {\n const root = resolve(directory);\n if (existsSync(join(root, WORKSPACE_MARKER))) return true;\n const packageJson = readPackage(join(root, 'package.json'));\n return packageJson?.name === 'coreslopper' && existsSync(join(root, 'templates', 'project'));\n}\n\nexport function findWorkspaceRoot(start = process.cwd()): string | undefined {\n let current = resolve(start);\n while (true) {\n if (isWorkspace(current)) return current;\n const parent = dirname(current);\n if (parent === current) return undefined;\n current = parent;\n }\n}\n\nexport function requireWorkspaceRoot(start = process.cwd()): string {\n const root = findWorkspaceRoot(start);\n if (!root) {\n throw new ValidationError(\n `No coreslopper workspace found from ${start}. Run \"npx coreslopper init\" to create one.`,\n );\n }\n return root;\n}\n\n/**\n * The package that contains this file. In development it is the repository\n * root; in an npx install it is the package root that contains dist/.\n */\nexport function ownPackageRoot(): string {\n let current = dirname(fileURLToPath(import.meta.url));\n while (true) {\n const packageJson = readPackage(join(current, 'package.json'));\n if (packageJson?.name === 'coreslopper') return current;\n const parent = dirname(current);\n if (parent === current) return process.cwd();\n current = parent;\n }\n}\n\nexport function ownVersion(): string {\n return readPackage(join(ownPackageRoot(), 'package.json'))?.version ?? '0.1.0';\n}\n\nexport function runtimeDir(): string | undefined {\n const candidate = join(ownPackageRoot(), 'runtime');\n return existsSync(join(candidate, 'templates', 'project')) ? candidate : undefined;\n}\n\n/** Load .env without overriding variables that are already set. */\nexport function loadWorkspaceEnv(root: string): void {\n const envPath = join(root, '.env');\n if (!existsSync(envPath) || typeof process.loadEnvFile !== 'function') return;\n try {\n process.loadEnvFile(envPath);\n } catch {\n // A malformed .env should not prevent read-only commands from running.\n // `coreslopper doctor` reports the problem separately.\n }\n}\n\nexport function listProjects(root: string): string[] {\n const projectsDir = join(root, 'projects');\n if (!existsSync(projectsDir)) return [];\n return readdirSync(projectsDir, { withFileTypes: true })\n .filter((entry) => entry.isDirectory() && existsSync(join(projectsDir, entry.name, 'project.yaml')))\n .map((entry) => entry.name)\n .sort();\n}\n\n/**\n * Resolve an optional project argument. With no argument, prefer the only\n * non-demo project; otherwise ask for an explicit project.\n */\nexport function resolveProjectArg(root: string, arg?: string): string {\n if (arg) {\n const direct = resolve(process.cwd(), arg);\n if (existsSync(join(direct, 'project.yaml'))) return direct;\n const named = join(root, 'projects', arg);\n if (existsSync(join(named, 'project.yaml'))) return named;\n throw new ValidationError(`Project not found: ${arg}`);\n }\n\n const projects = listProjects(root);\n const candidates = projects.filter((project) => project !== 'demo');\n if (candidates.length === 1) return join(root, 'projects', candidates[0]!);\n if (projects.length === 1) return join(root, 'projects', projects[0]!);\n if (projects.length === 0) {\n throw new ValidationError('No projects found. Create one with \"coreslopper new <slug> --budget <usd>\".');\n }\n throw new ValidationError(\n `Multiple projects found: ${projects.join(', ')}. Pass one explicitly, for example \"coreslopper status ${candidates[0] ?? projects[0]}\".`,\n );\n}\n","import { resolve } from 'node:path';\nimport { ValidationError } from '@coreslopper/core';\nimport { resolveHiggsfieldCredentials } from '@coreslopper/providers';\nimport {\n defaultProjectSlug,\n initWorkspace,\n type FirstProjectOptions,\n type InitResult,\n type SongProvider,\n type VisualProvider,\n} from './init.js';\nimport { onboard } from './onboarding.js';\nimport { validateFalKey, validateHiggsfieldKey } from './tools.js';\n\nexport interface InitCommandOptions {\n yes?: boolean;\n force?: boolean;\n install?: boolean;\n git?: boolean;\n installTools?: boolean;\n toolInstall?: boolean;\n song?: SongProvider;\n visual?: VisualProvider;\n imageProvider?: VisualProvider;\n videoProvider?: VisualProvider;\n budget?: number;\n project?: string;\n title?: string;\n falKey?: string;\n higgsfieldKey?: string;\n suno?: boolean;\n skipProject?: boolean;\n runtime?: string;\n}\n\nexport function validateChoice<T extends string>(value: string, choices: readonly T[], label: string): T {\n if (!choices.includes(value as T)) {\n throw new ValidationError(`Invalid ${label}: ${value}. Use one of: ${choices.join(', ')}.`);\n }\n return value as T;\n}\n\nexport function printInitSummary(result: InitResult): void {\n console.log(`✔ Workspace created: ${result.targetDir}`);\n console.log(` runtime: ${result.runtimeVersion}`);\n if (result.projectSlug) console.log(` project: ${result.projectSlug}`);\n console.log(` dependencies: ${result.installed ? 'installed' : 'not installed'}`);\n console.log(` audio analysis: ${result.uvSynced ? 'ready' : 'not synced'}`);\n console.log(` git: ${result.gitInitialized ? 'initialized' : 'not initialized'}`);\n for (const warning of result.warnings) console.warn(` ! ${warning}`);\n console.log('');\n console.log('Next:');\n console.log(` cd ${result.targetDir}`);\n if (!result.installed) console.log(' npm install');\n if (!result.uvSynced) console.log(' npm run python:sync');\n console.log(' npm run cli -- doctor');\n console.log(' npm run demo:preview');\n if (result.projectSlug) console.log(` claude # then /video-next ${result.projectSlug}`);\n else console.log(' claude');\n}\n\nexport async function runInitCommand(targetArg: string | undefined, options: InitCommandOptions): Promise<void> {\n const nonInteractive = Boolean(options.yes) || !process.stdin.isTTY;\n\n if (!nonInteractive) {\n await onboard({\n dir: targetArg,\n force: options.force,\n install: options.install,\n git: options.git,\n installTools: options.toolInstall === false ? false : options.installTools,\n song: options.song,\n visual: options.visual,\n imageProvider: options.imageProvider,\n videoProvider: options.videoProvider,\n budget: options.budget,\n projectSlug: options.project,\n title: options.title,\n falKey: options.falKey,\n higgsfieldKey: options.higgsfieldKey,\n suno: options.suno,\n noProject: options.skipProject,\n });\n return;\n }\n\n const target = resolve(targetArg ?? '.');\n const visual = options.visual ?? 'mock';\n const image = options.imageProvider ?? visual;\n const video = options.videoProvider ?? visual;\n const falKey = options.falKey ?? process.env.FAL_KEY;\n const higgsfieldKey = options.higgsfieldKey ?? resolveHiggsfieldCredentials();\n for (const provider of new Set([image, video])) {\n if (provider === 'fal') {\n if (!falKey) {\n console.warn('! No FAL_KEY was provided. Add it to .env before generating paid assets.');\n } else {\n const check = await validateFalKey(falKey);\n if (check.status !== 'valid') console.warn(`! Could not verify the fal.ai key (${check.message}).`);\n }\n }\n if (provider === 'higgsfield') {\n if (!higgsfieldKey) {\n console.warn(\n '! No Higgsfield credential was provided. Add HIGGSFIELD_API_KEY to .env before generating paid assets.',\n );\n } else {\n const check = await validateHiggsfieldKey(higgsfieldKey);\n if (check.status !== 'valid') {\n console.warn(`! Could not verify the Higgsfield credential (${check.message}).`);\n }\n }\n }\n }\n\n const projectSlug = options.project ?? defaultProjectSlug(target);\n const project: FirstProjectOptions | null = options.skipProject\n ? null\n : {\n slug: projectSlug,\n title: options.title,\n budget: options.budget ?? 50,\n song: options.song ?? 'import',\n image,\n video,\n };\n\n const result = await initWorkspace({\n targetDir: target,\n runtimeDir: options.runtime,\n force: options.force,\n install: options.install,\n git: options.git,\n tools: options.toolInstall === false ? false : options.installTools,\n project,\n falKey,\n higgsfieldKey,\n suno: options.suno !== false,\n });\n printInitSummary(result);\n if (!result.installed && options.install !== false) process.exitCode = 1;\n}\n","import { spawnSync } from 'node:child_process';\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { chmod, cp, mkdir, readFile, readdir, stat, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { basename, isAbsolute, join, parse, relative, resolve, sep } from 'node:path';\nimport { ValidationError } from '@coreslopper/core';\nimport { createProject } from './new-project.js';\nimport {\n commandExists,\n detectTools,\n installClaudeCode,\n installFfmpeg,\n installPython,\n installUv,\n missingTools,\n runSetup,\n} from './tools.js';\nimport {\n WORKSPACE_MARKER,\n ownPackageRoot,\n ownVersion,\n runtimeDir as defaultRuntimeDir,\n type WorkspaceMarker,\n} from './workspace.js';\n\nexport type SongProvider = 'suno' | 'import';\nexport type VisualProvider = 'fal' | 'higgsfield' | 'mock';\n\nexport interface FirstProjectOptions {\n slug: string;\n title?: string;\n budget: number;\n song: SongProvider;\n image: VisualProvider;\n video: VisualProvider;\n}\n\nexport interface InitOptions {\n targetDir: string;\n runtimeDir?: string;\n force?: boolean;\n install?: boolean;\n git?: boolean;\n tools?: boolean;\n project?: FirstProjectOptions | null;\n falKey?: string;\n higgsfieldKey?: string;\n suno?: boolean;\n onProgress?: (message: string) => void;\n}\n\nexport interface InitResult {\n targetDir: string;\n runtimeVersion: string;\n projectSlug?: string;\n installed: boolean;\n uvSynced: boolean;\n gitInitialized: boolean;\n warnings: string[];\n}\n\nconst SKIPPED_DIRECTORIES = new Set([\n '.git',\n '.cache',\n '.tools',\n '.vitest',\n '.venv',\n '__pycache__',\n '.pytest_cache',\n 'node_modules',\n 'dist',\n 'runtime',\n 'tmp',\n]);\n\nexport function sanitizeSlug(value: string): string {\n const slug = value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n return slug || 'my-video';\n}\n\nexport function defaultProjectSlug(targetDir: string): string {\n const name = basename(resolve(targetDir));\n return name && name !== '.' && name !== sep ? sanitizeSlug(name) : 'my-video';\n}\n\nexport function upsertEnv(content: string, key: string, value: string): string {\n if (!/^[A-Z_][A-Z0-9_]*$/.test(key)) throw new ValidationError(`Invalid environment variable name: ${key}`);\n if (/[\\r\\n]/.test(value)) throw new ValidationError(`Environment value for ${key} must be a single line.`);\n\n const line = `${key}=${value}`;\n const pattern = new RegExp(`^${key}=.*$`, 'm');\n if (pattern.test(content)) return content.replace(pattern, () => line);\n return `${content.trimEnd()}\\n${line}\\n`;\n}\n\nexport async function isDirectoryEmpty(path: string): Promise<boolean> {\n if (!existsSync(path)) return true;\n if (!(await stat(path)).isDirectory()) return false;\n const entries = await readdir(path);\n return entries.filter((entry) => entry !== '.DS_Store').length === 0;\n}\n\nfunction isInside(parent: string, child: string): boolean {\n if (parent === child) return true;\n const path = relative(parent, child);\n return path !== '' && !path.startsWith('..') && !isAbsolute(path);\n}\n\nfunction resolveRuntime(options: InitOptions): string {\n const runtime = options.runtimeDir ? resolve(options.runtimeDir) : defaultRuntimeDir();\n if (!runtime || !existsSync(join(runtime, 'templates', 'project'))) {\n throw new ValidationError(\n 'Runtime assets not found. Use \"npx coreslopper init\" to create a workspace, or run \"npm run build:runtime\" in the upstream repository.',\n );\n }\n return runtime;\n}\n\nfunction shouldCopy(source: string, runtime: string): boolean {\n const path = relative(runtime, source);\n if (!path) return true;\n const segments = path.split(sep);\n if (segments.some((segment) => SKIPPED_DIRECTORIES.has(segment))) return false;\n if (path === '.env' || (segments[0] === '.env' && path !== '.env.example')) return false;\n return true;\n}\n\nasync function copyRuntime(runtime: string, target: string): Promise<void> {\n await mkdir(target, { recursive: true });\n await cp(runtime, target, {\n recursive: true,\n force: true,\n errorOnExist: false,\n filter: (source) => shouldCopy(source, runtime),\n });\n}\n\nasync function ensureEnvFile(\n target: string,\n falKey?: string,\n higgsfieldKey?: string,\n): Promise<void> {\n const envPath = join(target, '.env');\n let content: string;\n if (existsSync(envPath)) {\n content = await readFile(envPath, 'utf8');\n } else {\n const examplePath = join(target, '.env.example');\n content = existsSync(examplePath)\n ? await readFile(examplePath, 'utf8')\n : '# Local secrets. This file is gitignored.\\n';\n }\n if (falKey) content = upsertEnv(content, 'FAL_KEY', falKey.trim());\n if (!/^FAL_KEY=/m.test(content)) content = `${content.trimEnd()}\\nFAL_KEY=\\n`;\n if (higgsfieldKey) content = upsertEnv(content, 'HIGGSFIELD_API_KEY', higgsfieldKey.trim());\n if (!/^HIGGSFIELD_API_KEY=/m.test(content)) {\n content = `${content.trimEnd()}\\nHIGGSFIELD_API_KEY=\\n`;\n }\n await writeFile(envPath, content, { encoding: 'utf8', mode: 0o600 });\n await chmod(envPath, 0o600).catch(() => undefined);\n}\n\nexport function writeMcpConfig(target: string, suno: boolean): void {\n const path = join(target, '.mcp.json');\n let config: { mcpServers?: Record<string, unknown> } = {};\n if (existsSync(path)) {\n try {\n config = JSON.parse(readFileSync(path, 'utf8')) as { mcpServers?: Record<string, unknown> };\n } catch {\n config = {};\n }\n }\n config.mcpServers ??= {};\n if (suno) {\n config.mcpServers.suno = { type: 'http', url: 'https://api.suno.com/mcp' };\n } else {\n delete config.mcpServers.suno;\n }\n writeFileSyncJson(path, config);\n}\n\nfunction writeFileSyncJson(path: string, value: unknown): void {\n // Small synchronous write keeps init call sites simple and lets the MCP\n // config be produced before dependency installation.\n writeFileSync(path, `${JSON.stringify(value, null, 2)}\\n`, 'utf8');\n}\n\nfunction writeMarker(target: string, projectSlug?: string): void {\n const marker: WorkspaceMarker = {\n version: 1,\n runtimeVersion: ownVersion(),\n created: new Date().toISOString(),\n ...(projectSlug ? { project: projectSlug } : {}),\n };\n writeFileSyncJson(join(target, WORKSPACE_MARKER), marker);\n}\n\nfunction initGit(target: string): boolean {\n if (existsSync(join(target, '.git')) || !commandExists('git')) return false;\n const result = spawnSync('git', ['init', '-b', 'main'], { cwd: target, stdio: 'inherit' });\n if (result.status === 0) return true;\n const fallback = spawnSync('git', ['init'], { cwd: target, stdio: 'inherit' });\n return fallback.status === 0;\n}\n\nasync function createFirstProject(\n target: string,\n project: FirstProjectOptions,\n warnings: string[],\n): Promise<string | undefined> {\n const projectDir = join(target, 'projects', project.slug);\n if (existsSync(projectDir)) {\n warnings.push(`Project \"${project.slug}\" already exists; the bundled project was kept.`);\n return undefined;\n }\n await createProject({\n slug: project.slug,\n title: project.title,\n budget: project.budget,\n root: target,\n songProvider: project.song,\n imageProvider: project.image,\n videoProvider: project.video,\n });\n return project.slug;\n}\n\nfunction gettingStarted(target: string, result: InitResult, options: InitOptions): string {\n const project = options.project;\n const lines = [\n '# Your coreslopper workspace',\n '',\n `Created ${new Date().toISOString()} with coreslopper ${result.runtimeVersion}.`,\n '',\n '## Workspace',\n '',\n `- Location: \\`${target}\\``,\n ...(project\n ? [\n `- First project: \\`${project.slug}\\` (budget $${project.budget.toFixed(2)}, song: ${project.song}, visuals: ${project.image})`,\n ]\n : ['- No first project yet. Create one with `npm run cli -- new <slug> --budget 50`.']),\n '',\n '## Next steps',\n '',\n '```bash',\n ...(result.installed ? [] : ['npm install']),\n ...(result.uvSynced ? [] : ['npm run python:sync']),\n 'npm run cli -- doctor',\n 'npm run demo:preview',\n 'claude',\n '```',\n '',\n 'In Claude Code:',\n '',\n '```text',\n ...(options.suno === false ? [] : ['/mcp # authenticate Suno once']),\n ...(project ? [`/video-next ${project.slug}`] : []),\n '```',\n '',\n '## Credentials',\n '',\n '- fal.ai: `FAL_KEY` in `.env` (gitignored).',\n '- Higgsfield: `HIGGSFIELD_API_KEY` (or `HF_API_KEY_ID` + `HF_API_KEY_SECRET`) in `.env`.',\n '- Suno: OAuth through the Suno MCP server in `.mcp.json`.',\n '',\n 'Generated audio, images, clips, and renders stay in the project folders and are gitignored.',\n '',\n ];\n return lines.join('\\n');\n}\n\nfunction ensureTools(target: string, warnings: string[]): void {\n const missing = missingTools(detectTools(target));\n if (missing.length === 0) return;\n\n if (missing.some((tool) => tool.id === 'node' || tool.id === 'npm')) {\n warnings.push('Node.js 22+ and npm are required. Install them and run \"npm install\" in the workspace.');\n }\n if (missing.some((tool) => tool.id === 'uv') && !installUv()) {\n warnings.push('uv could not be installed; audio analysis will need it later.');\n }\n if (missing.some((tool) => tool.id === 'python') && commandExists('uv') && !installPython()) {\n warnings.push('Python 3.12 could not be installed; audio analysis will need it later.');\n }\n if (missing.some((tool) => tool.id === 'ffmpeg') && !installFfmpeg(target)) {\n warnings.push('ffmpeg could not be installed; footage and loudness normalization will need it later.');\n }\n if (missing.some((tool) => tool.id === 'claude') && !installClaudeCode()) {\n warnings.push('Claude Code could not be installed; /video-next needs it.');\n }\n}\n\nexport async function initWorkspace(options: InitOptions): Promise<InitResult> {\n const target = resolve(options.targetDir);\n const runtime = resolveRuntime(options);\n\n if (existsSync(target) && !(await stat(target)).isDirectory()) {\n throw new ValidationError(`Target exists and is not a directory: ${target}`);\n }\n if (target === parse(target).root || target === homedir()) {\n throw new ValidationError('Choose a dedicated workspace directory, not the filesystem root or your home directory.');\n }\n if (target === ownPackageRoot()) {\n throw new ValidationError('Refusing to initialize a workspace inside the coreslopper package itself.');\n }\n if (isInside(runtime, target)) {\n throw new ValidationError('The workspace cannot be created inside the coreslopper runtime directory.');\n }\n if (\n existsSync(join(target, 'scripts', 'build-runtime.mjs')) ||\n existsSync(join(target, 'tsup.config.ts'))\n ) {\n throw new ValidationError(\n 'This directory is the coreslopper source repository. Create the workspace in a different directory.',\n );\n }\n if (!(await isDirectoryEmpty(target)) && !options.force) {\n throw new ValidationError(\n `Target directory is not empty: ${target}. Pass --force to merge the workspace into it.`,\n );\n }\n\n const warnings: string[] = [];\n options.onProgress?.('Copying the coreslopper runtime...');\n await copyRuntime(runtime, target);\n\n options.onProgress?.('Writing credentials and MCP configuration...');\n await ensureEnvFile(target, options.falKey, options.higgsfieldKey);\n writeMcpConfig(target, options.suno !== false);\n\n if (options.tools) {\n options.onProgress?.('Installing missing tools...');\n ensureTools(target, warnings);\n }\n\n const gitInitialized = options.git === false ? false : initGit(target);\n\n const projectSlug = options.project\n ? await createFirstProject(target, options.project, warnings)\n : undefined;\n\n writeMarker(target, projectSlug);\n\n let installed = false;\n let uvSynced = false;\n if (options.install !== false) {\n options.onProgress?.('Installing Node and Python dependencies...');\n try {\n const setup = runSetup(target);\n installed = setup.npm;\n uvSynced = setup.uv;\n if (setup.warning) warnings.push(setup.warning);\n } catch (error) {\n warnings.push(`Dependency installation failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n const result: InitResult = {\n targetDir: target,\n runtimeVersion: ownVersion(),\n projectSlug,\n installed,\n uvSynced,\n gitInitialized,\n warnings,\n };\n\n await writeFile(join(target, 'GETTING_STARTED.md'), gettingStarted(target, result, options), 'utf8');\n return result;\n}\n","import { cp, mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { execFileSync } from 'node:child_process';\nimport {\n ConfigError,\n ValidationError,\n createInitialState,\n loadDefaults,\n repoRoot,\n writeJsonAtomic,\n writeTextAtomic,\n type ProjectConfig,\n type ProviderKind,\n} from '@coreslopper/core';\nimport { stringify } from 'yaml';\n\nexport interface NewProjectOptions {\n slug: string;\n title?: string;\n budget?: number;\n brand?: string;\n imageProvider?: ProviderKind;\n videoProvider?: ProviderKind;\n songProvider?: 'suno' | 'import' | 'mock';\n /** Workspace root. Defaults to the repository root discovered from cwd. */\n root?: string;\n}\n\nfunction titleFromSlug(slug: string): string {\n return slug\n .split('-')\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(' ');\n}\n\nfunction workflowVersion(root: string): string {\n try {\n const packageJson = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8')) as {\n version?: string;\n };\n return packageJson.version ?? '0.1.0';\n } catch {\n return '0.1.0';\n }\n}\n\nfunction workflowCommit(root: string): string | undefined {\n try {\n return execFileSync('git', ['rev-parse', '--short', 'HEAD'], {\n cwd: root,\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n timeout: 2_000,\n }).trim();\n } catch {\n return undefined;\n }\n}\n\nexport async function createProject(options: NewProjectOptions): Promise<string> {\n const slug = options.slug.trim();\n if (!/^[a-z0-9][a-z0-9-]*$/.test(slug)) {\n throw new ValidationError('Project slug must be lowercase letters, digits, and dashes.');\n }\n if (options.budget === undefined || !Number.isFinite(options.budget)) {\n throw new ConfigError('A project budget is required. Pass --budget <USD>.');\n }\n\n const root = options.root ?? repoRoot();\n const defaults = await loadDefaults(root);\n if (options.budget < defaults.budget.minimum_usd) {\n throw new ConfigError(\n `Budget must be at least $${defaults.budget.minimum_usd.toFixed(2)} (got $${options.budget.toFixed(2)}).`,\n );\n }\n\n const projectDir = join(root, 'projects', slug);\n if (existsSync(projectDir)) {\n throw new ValidationError(`Project directory already exists: ${projectDir}`);\n }\n\n const templateDir = join(root, 'templates', 'project');\n await cp(templateDir, projectDir, { recursive: true, errorOnExist: true });\n\n const config: ProjectConfig = {\n version: 1,\n slug,\n title: options.title?.trim() || titleFromSlug(slug),\n created: new Date().toISOString(),\n workflow: {\n version: workflowVersion(root),\n ...(workflowCommit(root) ? { commit: workflowCommit(root) } : {}),\n },\n budget_usd: options.budget,\n review_mode: 'auto',\n formats: {\n master: defaults.formats.master,\n derivatives: defaults.formats.derivatives.map((format) => ({\n ...format,\n fps: defaults.formats.master.fps,\n })),\n },\n providers: {\n image: options.imageProvider ?? 'mock',\n video: options.videoProvider ?? 'mock',\n song: options.songProvider ?? 'import',\n },\n song: { variants: 2 },\n brand: options.brand ?? 'example',\n models: {},\n };\n\n await writeTextAtomic(join(projectDir, 'project.yaml'), stringify(config));\n for (const file of ['brief.md', 'treatment.md', 'README.md', 'lyrics.txt', 'suno-style.txt']) {\n const path = join(projectDir, file);\n if (!existsSync(path)) continue;\n const text = await readFile(path, 'utf8');\n await writeFile(path, text.replaceAll('{{TITLE}}', config.title).replaceAll('{{SLUG}}', slug), 'utf8');\n }\n const state = createInitialState(config, config.workflow.version);\n // New projects start with an empty project state; the template carries the\n // creative placeholders that the skills fill in.\n state.stage = 'brief';\n await writeJsonAtomic(join(projectDir, 'state.json'), state);\n await writeJsonAtomic(join(projectDir, 'timing.overrides.json'), {\n version: 1,\n sections: [],\n lines: [],\n words: [],\n });\n\n for (const directory of ['audio', 'assets', 'characters', 'renders', 'review', 'brand']) {\n await mkdir(join(projectDir, directory), { recursive: true });\n }\n await writeFile(join(projectDir, 'audio', '.gitkeep'), '');\n await writeFile(join(projectDir, 'assets', '.gitkeep'), '');\n await writeFile(join(projectDir, 'characters', '.gitkeep'), '');\n await writeFile(join(projectDir, 'renders', '.gitkeep'), '');\n await writeFile(join(projectDir, 'review', '.gitkeep'), '');\n await writeFile(join(projectDir, 'brand', '.gitkeep'), '');\n\n // Validate the project shell. Timing and storyboard are intentionally absent\n // at this point; only the project config and state are checked.\n await readFile(join(projectDir, 'project.yaml'), 'utf8');\n\n console.log(`Created project ${config.title} (${slug}) at ${projectDir}`);\n console.log(`Budget: $${config.budget_usd.toFixed(2)} · providers: image=${config.providers.image}, video=${config.providers.video}, song=${config.providers.song}`);\n console.log('Next: run /video-next ' + slug + ' in Claude Code, or npm run status -- ' + relativeToRoot(projectDir, root));\n return projectDir;\n}\n\nfunction relativeToRoot(path: string, root: string): string {\n return path.startsWith(root) ? path.slice(root.length + 1) : path;\n}\n","import {\n cancel,\n confirm,\n intro,\n isCancel,\n log,\n note,\n outro,\n password,\n select,\n spinner,\n text,\n} from '@clack/prompts';\nimport { resolve } from 'node:path';\nimport { ValidationError } from '@coreslopper/core';\nimport { resolveHiggsfieldCredentials } from '@coreslopper/providers';\nimport {\n defaultProjectSlug,\n initWorkspace,\n isDirectoryEmpty,\n type FirstProjectOptions,\n type InitResult,\n type SongProvider,\n type VisualProvider,\n} from './init.js';\nimport {\n detectTools,\n formatTools,\n installClaudeCode,\n installFfmpeg,\n installPython,\n installUv,\n missingTools,\n validateFalKey,\n validateHiggsfieldKey,\n} from './tools.js';\n\nexport interface OnboardOptions {\n dir?: string;\n force?: boolean;\n install?: boolean;\n git?: boolean;\n installTools?: boolean;\n song?: SongProvider;\n visual?: VisualProvider;\n imageProvider?: VisualProvider;\n videoProvider?: VisualProvider;\n budget?: number;\n projectSlug?: string;\n title?: string;\n falKey?: string;\n higgsfieldKey?: string;\n suno?: boolean;\n noProject?: boolean;\n}\n\nfunction unwrap<T>(value: T): Exclude<T, symbol> {\n if (isCancel(value)) {\n cancel('Onboarding cancelled.');\n process.exit(130);\n }\n return value as Exclude<T, symbol>;\n}\n\nfunction validSlug(value: string): string | undefined {\n if (!/^[a-z0-9][a-z0-9-]*$/.test(value)) {\n return 'Use lowercase letters, digits, and dashes; start with a letter or digit.';\n }\n return undefined;\n}\n\nasync function chooseTarget(options: OnboardOptions): Promise<string> {\n if (options.dir) return resolve(options.dir);\n\n if (await isDirectoryEmpty(process.cwd())) return process.cwd();\n\n const answer = unwrap(\n await text({\n message: 'Where should the workspace live?',\n placeholder: 'coreslopper-studio',\n defaultValue: 'coreslopper-studio',\n }),\n );\n return resolve(answer);\n}\n\nasync function ensureTargetIsUsable(target: string, force = false): Promise<void> {\n if (await isDirectoryEmpty(target)) return;\n if (force) return;\n const proceed = unwrap(\n await confirm({\n message: `${target} is not empty. Merge the workspace into it?`,\n initialValue: false,\n }),\n );\n if (!proceed) {\n cancel('Choose an empty directory, or pass --force.');\n process.exit(130);\n }\n}\n\nasync function offerTools(target: string, enabled: boolean): Promise<{ ffmpeg: boolean }> {\n const checks = detectTools(target);\n note(formatTools(checks), 'Environment');\n if (!enabled) return { ffmpeg: false };\n\n const missing = missingTools(checks);\n if (missing.some((tool) => tool.id === 'node' || tool.id === 'npm')) {\n cancel('Node.js 22+ and npm are required. Install them, then run the onboarding again.');\n process.exit(1);\n }\n\n let uvReady = Boolean(checks.find((tool) => tool.id === 'uv')?.ok);\n if (!uvReady && missing.some((tool) => tool.id === 'uv')) {\n const install = unwrap(\n await confirm({\n message: 'Install uv? It manages the Python audio-analysis environment.',\n initialValue: true,\n }),\n );\n if (install) uvReady = installUv();\n if (!uvReady) log.warn('uv was not installed. Audio analysis will need it later.');\n }\n\n const pythonReady = Boolean(checks.find((tool) => tool.id === 'python')?.ok);\n if (!pythonReady && uvReady) {\n const install = unwrap(\n await confirm({\n message: 'Install Python 3.12 with uv?',\n initialValue: true,\n }),\n );\n if (install && !installPython()) {\n log.warn('Python 3.12 was not installed. Audio analysis will need it later.');\n }\n }\n\n let installFfmpegNow = false;\n if (missing.some((tool) => tool.id === 'ffmpeg')) {\n installFfmpegNow = unwrap(\n await confirm({\n message: 'Install ffmpeg? Optional, but needed for footage and loudness normalization.',\n initialValue: false,\n }),\n );\n }\n\n if (missing.some((tool) => tool.id === 'claude')) {\n const install = unwrap(\n await confirm({\n message: 'Install Claude Code globally? The /video-next pipeline runs there.',\n initialValue: true,\n }),\n );\n if (install && !installClaudeCode()) {\n log.warn('Claude Code was not installed. Install it with \"npm install -g @anthropic-ai/claude-code\".');\n }\n }\n\n if (missing.some((tool) => tool.id === 'git')) {\n log.warn('git is not installed. The workspace still works, but you cannot version it.');\n }\n\n return { ffmpeg: installFfmpegNow };\n}\n\nasync function chooseFalKey(options: OnboardOptions, needed: boolean): Promise<string | undefined> {\n let key = options.falKey ?? process.env.FAL_KEY;\n if (!needed) return key;\n\n if (!key) {\n key = unwrap(\n await password({\n message: 'fal.ai API key (leave empty to add it later)',\n mask: '•',\n }),\n );\n }\n\n if (!key) {\n log.warn('No FAL_KEY yet. Add it to .env before generating paid assets.');\n return undefined;\n }\n\n const check = spinner();\n check.start('Checking the fal.ai key...');\n const result = await validateFalKey(key);\n if (result.status === 'valid') {\n check.stop('fal.ai key is valid.');\n return key;\n }\n\n check.stop(`Could not verify the fal.ai key (${result.message}).`);\n if (result.status === 'invalid') {\n const keep = unwrap(\n await confirm({\n message: 'The key was rejected. Keep it in .env anyway?',\n initialValue: false,\n }),\n );\n if (!keep) return undefined;\n }\n return key;\n}\n\nasync function chooseHiggsfieldKey(\n options: OnboardOptions,\n needed: boolean,\n): Promise<string | undefined> {\n let key = options.higgsfieldKey ?? resolveHiggsfieldCredentials();\n if (!needed) return key;\n\n if (!key) {\n key = unwrap(\n await password({\n message: 'Higgsfield API credential key_id:key_secret (leave empty to add it later)',\n mask: '•',\n }),\n );\n }\n\n if (!key) {\n log.warn('No Higgsfield credential yet. Add HIGGSFIELD_API_KEY to .env before generating paid assets.');\n return undefined;\n }\n\n const check = spinner();\n check.start('Checking the Higgsfield credential...');\n const result = await validateHiggsfieldKey(key);\n if (result.status === 'valid') {\n check.stop('Higgsfield credential is valid.');\n return key;\n }\n\n check.stop(`Could not verify the Higgsfield credential (${result.message}).`);\n if (result.status === 'invalid') {\n const keep = unwrap(\n await confirm({\n message: 'The credential was rejected. Keep it in .env anyway?',\n initialValue: false,\n }),\n );\n if (!keep) return undefined;\n }\n return key;\n}\n\nfunction printNextSteps(target: string, result: InitResult, options: OnboardOptions): void {\n const project = result.projectSlug;\n const lines = [\n `Workspace: ${target}`,\n ...(project ? [`Project: ${project}`] : []),\n '',\n 'Next:',\n ` cd ${target}`,\n ...(result.installed ? [] : [' npm install']),\n ...(result.uvSynced ? [] : [' npm run python:sync']),\n ' npm run cli -- doctor',\n ' npm run demo:preview',\n ...(project ? [] : [' npm run cli -- new <slug> --budget 50']),\n ' claude',\n '',\n 'In Claude Code:',\n ...(options.suno === false ? [] : [' /mcp authenticate Suno once']),\n ...(project ? [` /video-next ${project}`] : []),\n ];\n outro(lines.join('\\n'));\n}\n\nexport async function onboard(options: OnboardOptions = {}): Promise<InitResult> {\n intro('coreslopper — from brief to finished music video');\n\n const target = await chooseTarget(options);\n await ensureTargetIsUsable(target, options.force);\n\n const checks = detectTools(target);\n if (!checks.find((tool) => tool.id === 'node')?.ok) {\n cancel('Node.js 22 or newer is required.');\n process.exit(1);\n }\n if (!checks.find((tool) => tool.id === 'npm')?.ok) {\n cancel('npm is required to install the workspace dependencies.');\n process.exit(1);\n }\n\n const { ffmpeg: installFfmpegNow } = await offerTools(target, options.installTools !== false);\n\n let falKey: string | undefined = options.falKey ?? process.env.FAL_KEY;\n let higgsfieldKey: string | undefined =\n options.higgsfieldKey ?? resolveHiggsfieldCredentials();\n let project: FirstProjectOptions | null = null;\n\n if (!options.noProject) {\n const song =\n options.song ??\n (unwrap(\n await select({\n message: 'How will you get the song?',\n options: [\n { value: 'import', label: 'Import an existing audio file', hint: 'works immediately, no Suno account' },\n { value: 'suno', label: 'Generate with Suno', hint: 'OAuth through the Suno MCP server' },\n ],\n initialValue: 'import',\n }),\n ) as SongProvider);\n\n const visual =\n options.visual ??\n (options.imageProvider && options.videoProvider\n ? options.imageProvider\n : (unwrap(\n await select({\n message: 'How should visuals be generated?',\n options: [\n { value: 'mock', label: 'Mock provider', hint: 'motion graphics and dry runs, no API key' },\n { value: 'fal', label: 'fal.ai', hint: 'AI keyframes and image-to-video, needs FAL_KEY' },\n {\n value: 'higgsfield',\n label: 'Higgsfield',\n hint: 'AI keyframes and image-to-video, needs HIGGSFIELD_API_KEY',\n },\n ],\n initialValue: 'mock',\n }),\n ) as VisualProvider));\n const image = options.imageProvider ?? visual;\n const video = options.videoProvider ?? visual;\n\n falKey = await chooseFalKey(options, image === 'fal' || video === 'fal');\n higgsfieldKey = await chooseHiggsfieldKey(\n options,\n image === 'higgsfield' || video === 'higgsfield',\n );\n\n const budget =\n options.budget ??\n Number(\n unwrap(\n await text({\n message: 'First project budget (USD)',\n defaultValue: '50',\n validate: (value) => {\n const number = Number(value);\n return Number.isFinite(number) && number >= 5 ? undefined : 'Enter a budget of at least $5.';\n },\n }),\n ),\n );\n if (!Number.isFinite(budget) || budget < 5) throw new ValidationError('Budget must be at least $5.');\n\n const projectSlug =\n options.projectSlug ??\n unwrap(\n await text({\n message: 'First project slug',\n defaultValue: defaultProjectSlug(target),\n validate: (value) => validSlug(value ?? ''),\n }),\n );\n const slugError = validSlug(projectSlug);\n if (slugError) throw new ValidationError(slugError);\n\n project = { slug: projectSlug, title: options.title, budget, song, image, video };\n }\n\n const install =\n options.install ??\n (unwrap(\n await confirm({\n message: 'Install Node and Python dependencies now? (takes a few minutes)',\n initialValue: true,\n }),\n ) as boolean);\n const git =\n options.git ??\n (unwrap(\n await confirm({\n message: 'Initialize a git repository in the workspace?',\n initialValue: true,\n }),\n ) as boolean);\n\n const summary = [\n `Target: ${target}`,\n `Project: ${project ? project.slug : 'none'}`,\n `Song: ${project ? project.song : '-'}`,\n `Visuals: ${project ? (project.image === project.video ? project.image : `image=${project.image}, video=${project.video}`) : '-'}`,\n `Budget: ${project ? `$${project.budget.toFixed(2)}` : '-'}`,\n `Install: ${install ? 'yes' : 'no'}`,\n `Git: ${git ? 'yes' : 'no'}`,\n ].join('\\n');\n note(summary, 'Ready to create');\n\n const proceed = unwrap(\n await confirm({\n message: 'Create the workspace now?',\n initialValue: true,\n }),\n );\n if (!proceed) {\n cancel('No files were written.');\n process.exit(130);\n }\n\n const result = await initWorkspace({\n targetDir: target,\n force: true,\n install,\n git,\n project,\n falKey,\n higgsfieldKey,\n suno: options.suno !== false,\n onProgress: (message) => log.step(message),\n });\n\n if (installFfmpegNow) {\n log.step('Installing ffmpeg...');\n if (!installFfmpeg(target)) log.warn('ffmpeg was not installed. Install it later for footage and loudness.');\n }\n\n for (const warning of result.warnings) log.warn(warning);\n if (!result.installed && install) {\n log.error('Dependency installation did not finish. Run npm install in the workspace.');\n process.exitCode = 1;\n }\n\n printNextSteps(target, result, options);\n return result;\n}\n","import { existsSync } from 'node:fs';\nimport {\n effectiveBatchCap,\n formatUsd,\n loadProject,\n nextStage,\n remainingBudget,\n stageTable,\n} from '@coreslopper/core';\n\nexport async function printStatus(projectDir: string): Promise<void> {\n const loaded = await loadProject(projectDir);\n const state = loaded.state;\n console.log(`${loaded.config.title} (${loaded.config.slug})`);\n console.log(`Stage: ${state.stage} · Overall: ${state.status}`);\n console.log(stageTable(state).join('\\n'));\n console.log(\n `Budget: ${formatUsd(state.budget.spentUsd)} spent / ${formatUsd(state.budget.totalUsd)} total · ${formatUsd(remainingBudget(state))} remaining · batch cap ${formatUsd(effectiveBatchCap(loaded.config, state))}`,\n );\n const next = nextStage(state);\n console.log(`Next: ${next ? `${next.id} (${next.skills.join(', ')})` : 'done'}`);\n if (!existsSync(loaded.paths.state)) console.log('Note: state.json does not exist yet; showing the initial state.');\n}\n","import { resolve } from 'node:path';\nimport { ZodError } from 'zod';\nimport { BudgetError, ValidationError, formatZodError } from '@coreslopper/core';\n\nexport function printError(error: unknown): void {\n if (error instanceof ValidationError) {\n console.error(`✖ ${error.message}`);\n for (const detail of error.details) console.error(` - ${detail}`);\n return;\n }\n if (error instanceof ZodError) {\n console.error('✖ Validation failed');\n for (const detail of formatZodError(error)) console.error(` - ${detail}`);\n return;\n }\n if (error instanceof BudgetError) {\n console.error(`✖ Budget: ${error.message}`);\n return;\n }\n if (error instanceof Error) {\n console.error(`✖ ${error.message}`);\n return;\n }\n console.error(`✖ ${String(error)}`);\n}\n\nexport async function run(action: () => Promise<void>): Promise<void> {\n try {\n await action();\n } catch (error) {\n printError(error);\n process.exitCode = 1;\n }\n}\n\nexport function projectDirFromArg(arg: string | undefined, fallback = 'projects/demo'): string {\n return resolve(process.cwd(), arg ?? fallback);\n}\n\nexport function formatSeconds(value: number): string {\n const minutes = Math.floor(value / 60);\n const seconds = value - minutes * 60;\n return `${minutes}:${seconds.toFixed(2).padStart(5, '0')}`;\n}\n\nexport function parseCsv(value: string | undefined): string[] {\n if (!value) return [];\n return value\n .split(',')\n .map((item) => item.trim())\n .filter(Boolean);\n}\n","import {\n ValidationError,\n loadModelsConfig,\n loadProject,\n resolveStoryboard,\n writeEffectiveTiming,\n type LoadedProject,\n type ResolvedStoryboard,\n} from '@coreslopper/core';\nimport { basename } from 'node:path';\n\nexport interface ValidatedProject {\n project: LoadedProject;\n resolved: ResolvedStoryboard;\n}\n\nexport async function validateProject(projectDir: string, options: { write?: boolean } = {}): Promise<ValidatedProject> {\n const project = await loadProject(projectDir);\n const { config, effectiveTiming, storyboard, style, characters, paths } = project;\n\n if (!effectiveTiming) {\n throw new ValidationError(\n `timing.json is missing in ${paths.root}. Run the audio-analysis stage before validating the storyboard.`,\n );\n }\n if (!storyboard) throw new ValidationError(`storyboard.yaml is missing in ${paths.root}.`);\n if (!style) throw new ValidationError(`style.yaml is missing in ${paths.root}.`);\n if (!characters) throw new ValidationError(`characters.yaml is missing in ${paths.root}.`);\n\n const expectedSlug = basename(paths.root);\n if (config.slug !== expectedSlug) {\n throw new ValidationError(\n `project.yaml slug \"${config.slug}\" does not match the project folder \"${expectedSlug}\".`,\n );\n }\n\n if (Math.abs(project.state.budget.totalUsd - config.budget_usd) > 1e-9) {\n throw new ValidationError(\n `state.json budget (${project.state.budget.totalUsd}) does not match project.yaml budget_usd (${config.budget_usd}).`,\n );\n }\n\n try {\n await loadModelsConfig();\n } catch (error) {\n if (error instanceof ValidationError) {\n throw new ValidationError('config/models.yaml is invalid', error.details);\n }\n throw error;\n }\n\n const resolved = resolveStoryboard(\n storyboard,\n effectiveTiming,\n style,\n characters,\n config.formats.master.fps,\n );\n\n if (options.write !== false) {\n await writeEffectiveTiming(project);\n }\n\n return { project, resolved };\n}\n"],"mappings":"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","names":["relative","resolve","existsSync","readFileSync","join","workflowVersion","mkdir","readFile","writeFile","join","z","join","readFile","mkdir","writeFile","join","z","createHash","mkdir","readFile","writeFile","join","readFile","extname","mkdir","readFile","writeFile","dirname","extname","join","createHash","existsSync","join","args","existsSync","readFileSync","dirname","join","resolve","readFileSync","resolve","existsSync","join","dirname","existsSync","join","readFileSync","resolve","spawnSync","existsSync","readFileSync","cp","mkdir","readFile","stat","writeFile","homedir","join","relative","resolve","mkdir","readFile","writeFile","existsSync","readFileSync","join","execFileSync","readFileSync","join","execFileSync","existsSync","text","readFile","writeFile","mkdir","resolve","existsSync","stat","relative","join","mkdir","cp","readFile","writeFile","readFileSync","spawnSync","homedir","resolve","resolve","resolve","existsSync","existsSync","resolve","basename","relative","resolve"]}
1
+ {"version":3,"sources":["../packages/cli/src/npx.ts","../packages/cli/src/doctor.ts","../packages/providers/src/mock.ts","../packages/core/src/schema.ts","../packages/core/src/errors.ts","../packages/core/src/hash.ts","../packages/core/src/timing.ts","../packages/core/src/state.ts","../packages/core/src/cost.ts","../packages/core/src/project.ts","../packages/providers/src/http.ts","../packages/providers/src/higgsfield.ts","../packages/providers/src/runner.ts","../packages/cli/src/tools.ts","../packages/cli/src/workspace.ts","../packages/cli/src/init-command.ts","../packages/cli/src/init.ts","../packages/cli/src/new-project.ts","../packages/cli/src/update.ts","../packages/cli/src/onboarding.ts","../packages/cli/src/status.ts","../packages/cli/src/utils.ts","../packages/cli/src/validate.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { relative, resolve } from 'node:path';\nimport { runDoctor } from './doctor.js';\nimport {\n runInitCommand,\n validateChoice,\n type InitCommandOptions,\n} from './init-command.js';\nimport { createProject } from './new-project.js';\nimport { onboard } from './onboarding.js';\nimport { printStatus } from './status.js';\nimport { printUpdateSummary, updateWorkspace } from './update.js';\nimport { formatSeconds, run } from './utils.js';\nimport { validateProject } from './validate.js';\nimport {\n findWorkspaceRoot,\n listProjects,\n loadWorkspaceEnv,\n ownVersion,\n resolveProjectArg,\n requireWorkspaceRoot,\n} from './workspace.js';\n\ninterface NewCommandOptions {\n budget?: number;\n title?: string;\n song?: string;\n visual?: string;\n imageProvider?: string;\n videoProvider?: string;\n}\n\nfunction requireWorkspace(): string {\n const root = requireWorkspaceRoot();\n process.chdir(root);\n loadWorkspaceEnv(root);\n return root;\n}\n\nfunction workspaceSummary(root: string): void {\n const projects = listProjects(root);\n console.log(`coreslopper workspace: ${root}`);\n if (projects.length) {\n console.log(`Projects: ${projects.join(', ')}`);\n try {\n const project = resolveProjectArg(root);\n console.log(`Tip: npx coreslopper status ${relative(root, project)}`);\n } catch {\n // Multiple projects; no single default to suggest.\n }\n } else {\n console.log('No projects yet. Create one with: npx coreslopper new <slug> --budget 50');\n }\n console.log('Commands: init, update, doctor, new, status, validate');\n}\n\nconst program = new Command();\nprogram\n .name('coreslopper')\n .description('Create and manage a coreslopper music-video workspace.')\n .version(ownVersion())\n .showHelpAfterError();\n\nprogram\n .command('init [dir]')\n .description('Create a workspace, install tools, and configure fal.ai, Higgsfield, and Suno.')\n .option('-y, --yes', 'Use defaults and skip prompts')\n .option('--force', 'Merge into a non-empty directory')\n .option('--no-install', 'Skip npm install and uv sync')\n .option('--no-git', 'Do not initialize a git repository')\n .option('--install-tools', 'Install missing uv, Python, ffmpeg, and Claude Code')\n .option('--no-tool-install', 'Do not offer to install system tools')\n .option('--song <provider>', 'suno | import', 'import')\n .option('--visual <provider>', 'mock | fal | higgsfield', 'mock')\n .option('--image-provider <provider>', 'mock | fal | higgsfield')\n .option('--video-provider <provider>', 'mock | fal | higgsfield')\n .option('--budget <usd>', 'First project budget in USD', (value) => Number(value))\n .option('--project <slug>', 'First project slug')\n .option('--title <title>', 'First project title')\n .option('--fal-key <key>', 'fal.ai API key (prefer FAL_KEY in the environment)')\n .option('--higgsfield-key <key>', 'Higgsfield credential (prefer HIGGSFIELD_API_KEY in the environment)')\n .option('--no-suno', 'Do not configure the Suno MCP server')\n .option('--skip-project', 'Create the workspace without a first project')\n .option('--runtime <dir>', 'Runtime directory (development only)')\n .action((dir: string | undefined, options: InitCommandOptions) =>\n run(async () => {\n const visuals = ['mock', 'fal', 'higgsfield'] as const;\n if (options.song) options.song = validateChoice(options.song, ['suno', 'import'] as const, 'song provider');\n if (options.visual) options.visual = validateChoice(options.visual, visuals, 'visual provider');\n if (options.imageProvider) {\n options.imageProvider = validateChoice(options.imageProvider, visuals, 'image provider');\n }\n if (options.videoProvider) {\n options.videoProvider = validateChoice(options.videoProvider, visuals, 'video provider');\n }\n await runInitCommand(dir, options);\n }),\n );\n\nprogram\n .command('update [dir]')\n .description('Update the workflow files of a workspace to this coreslopper version; keeps local changes.')\n .option('--dry-run', 'Show what would change without writing anything')\n .option('--force', 'Overwrite locally changed files and allow a downgrade')\n .option('--no-install', 'Skip npm install and uv sync')\n .option('--runtime <dir>', 'Runtime directory (development only)')\n .action(\n (\n dir: string | undefined,\n options: { dryRun?: boolean; force?: boolean; install: boolean; runtime?: string },\n ) =>\n run(async () => {\n const target = dir ? resolve(dir) : requireWorkspaceRoot();\n const result = await updateWorkspace({\n targetDir: target,\n runtimeDir: options.runtime,\n dryRun: options.dryRun,\n force: options.force,\n install: options.install,\n onProgress: (message) => console.log(message),\n });\n printUpdateSummary(result);\n }),\n );\n\nprogram\n .command('doctor [dir]')\n .description('Check the workspace, tools, and credentials.')\n .option('--json', 'Print machine-readable JSON')\n .action((dir: string | undefined, options: { json?: boolean }) =>\n run(async () => {\n const root = dir ? resolve(dir) : (findWorkspaceRoot() ?? process.cwd());\n const result = await runDoctor(root, { json: options.json });\n if (!result.ok) process.exitCode = 1;\n }),\n );\n\nprogram\n .command('new <slug>')\n .description('Create a project inside the current workspace.')\n .option('--budget <usd>', 'Project budget in USD (required)', (value) => Number(value))\n .option('--title <title>')\n .option('--song <provider>', 'suno | import', 'import')\n .option('--visual <provider>', 'mock | fal | higgsfield', 'mock')\n .option('--image-provider <provider>', 'mock | fal | higgsfield')\n .option('--video-provider <provider>', 'mock | fal | higgsfield')\n .action((slug: string, options: NewCommandOptions) =>\n run(async () => {\n const root = requireWorkspace();\n const visuals = ['mock', 'fal', 'higgsfield'] as const;\n const song = validateChoice(options.song ?? 'import', ['suno', 'import'] as const, 'song provider');\n const visual = validateChoice(options.visual ?? 'mock', visuals, 'visual provider');\n const image = options.imageProvider\n ? validateChoice(options.imageProvider, visuals, 'image provider')\n : visual;\n const video = options.videoProvider\n ? validateChoice(options.videoProvider, visuals, 'video provider')\n : visual;\n await createProject({\n slug,\n title: options.title,\n budget: options.budget,\n root,\n songProvider: song,\n imageProvider: image,\n videoProvider: video,\n });\n }),\n );\n\nprogram\n .command('status [project]')\n .description('Show stage state and budget for a project.')\n .action((project: string | undefined) =>\n run(async () => {\n const root = requireWorkspace();\n await printStatus(resolveProjectArg(root, project));\n }),\n );\n\nprogram\n .command('validate [project]')\n .description('Validate timing, style, characters, and storyboard coverage.')\n .option('--no-write', 'Do not write timing.effective.json')\n .action((project: string | undefined, options: { write: boolean }) =>\n run(async () => {\n const root = requireWorkspace();\n const projectDir = resolveProjectArg(root, project);\n const { project: loaded, resolved } = await validateProject(projectDir, { write: options.write });\n console.log(\n `✔ ${loaded.config.title}: ${resolved.shots.length} shots, ${formatSeconds(resolved.durationSeconds)}, ${resolved.durationInFrames} frames`,\n );\n for (const warning of resolved.warnings) console.log(` ! ${warning}`);\n }),\n );\n\nconst args = process.argv.slice(2);\nif (args.length === 0) {\n const root = findWorkspaceRoot();\n if (root) {\n workspaceSummary(root);\n } else if (!process.stdin.isTTY) {\n console.error('No coreslopper workspace detected.');\n console.error('Run: npx coreslopper init <dir> --yes');\n process.exitCode = 1;\n } else {\n await run(async () => {\n await onboard();\n });\n }\n} else {\n await program.parseAsync(process.argv);\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { resolveHiggsfieldCredentials } from '@coreslopper/providers';\nimport { detectTools, type ToolCheck } from './tools.js';\nimport { isWorkspace, loadWorkspaceEnv } from './workspace.js';\n\nexport interface DoctorCheck {\n id: string;\n name: string;\n ok: boolean;\n detail: string;\n required: boolean;\n group: 'workspace' | 'tool' | 'credentials';\n}\n\nexport interface DoctorResult {\n ok: boolean;\n root: string;\n checks: DoctorCheck[];\n}\n\nexport interface DoctorOptions {\n json?: boolean;\n}\n\nfunction fileCheck(\n root: string,\n id: string,\n name: string,\n path: string,\n options: { required?: boolean; detail?: string } = {},\n): DoctorCheck {\n const exists = existsSync(join(root, path));\n return {\n id,\n name,\n ok: exists,\n detail: exists ? path : `${path} is missing`,\n required: options.required ?? true,\n group: 'workspace',\n };\n}\n\nfunction sunoCheck(root: string): DoctorCheck {\n const path = join(root, '.mcp.json');\n if (!existsSync(path)) {\n return {\n id: 'suno-mcp',\n name: 'Suno MCP',\n ok: false,\n detail: '.mcp.json is missing (optional)',\n required: false,\n group: 'credentials',\n };\n }\n try {\n const config = JSON.parse(readFileSync(path, 'utf8')) as {\n mcpServers?: Record<string, { url?: string }>;\n };\n const url = config.mcpServers?.suno?.url;\n return {\n id: 'suno-mcp',\n name: 'Suno MCP',\n ok: url === 'https://api.suno.com/mcp',\n detail: url ?? '.mcp.json has no \"suno\" server',\n required: false,\n group: 'credentials',\n };\n } catch (error) {\n return {\n id: 'suno-mcp',\n name: 'Suno MCP',\n ok: false,\n detail: `.mcp.json is invalid: ${error instanceof Error ? error.message : String(error)}`,\n required: false,\n group: 'credentials',\n };\n }\n}\n\nfunction toolCheck(tool: ToolCheck): DoctorCheck {\n return {\n id: tool.id,\n name: tool.name,\n ok: tool.ok,\n detail: tool.detail,\n required: tool.required,\n group: 'tool',\n };\n}\n\nexport async function runDoctor(root: string, options: DoctorOptions = {}): Promise<DoctorResult> {\n loadWorkspaceEnv(root);\n const higgsfield = resolveHiggsfieldCredentials();\n\n const checks: DoctorCheck[] = [\n {\n id: 'workspace',\n name: 'coreslopper workspace',\n ok: isWorkspace(root),\n detail: isWorkspace(root) ? root : 'not a workspace (run \"npx coreslopper init\")',\n required: true,\n group: 'workspace',\n },\n fileCheck(root, 'templates', 'Project template', 'templates/project/README.md'),\n fileCheck(root, 'config', 'Defaults', 'config/defaults.yaml'),\n fileCheck(root, 'models', 'Model roles and pricing', 'config/models.yaml'),\n fileCheck(root, 'remotion', 'Remotion entry', 'packages/remotion/src/index.ts'),\n fileCheck(root, 'skills', 'Claude Code skills', '.claude/skills/video-brief/SKILL.md'),\n fileCheck(root, 'audio-analysis', 'Audio analysis scripts', 'scripts/audio-analysis/analyze.py'),\n fileCheck(root, 'fonts', 'Example fonts', 'brand/example/fonts/SpaceGrotesk.ttf'),\n {\n id: 'fal-key',\n name: 'FAL_KEY',\n ok: Boolean(process.env.FAL_KEY),\n detail: process.env.FAL_KEY ? 'set (from environment or .env)' : 'not set (mock works without it)',\n required: false,\n group: 'credentials',\n },\n {\n id: 'higgsfield-key',\n name: 'HIGGSFIELD_API_KEY',\n ok: Boolean(higgsfield),\n detail: higgsfield ? 'set (from environment or .env)' : 'not set (mock works without it)',\n required: false,\n group: 'credentials',\n },\n sunoCheck(root),\n ...detectTools(root).map(toolCheck),\n ];\n\n const ok = checks.every((check) => check.ok || !check.required);\n\n if (options.json) {\n console.log(JSON.stringify({ ok, root, checks }, null, 2));\n } else {\n console.log(`Workspace: ${root}`);\n for (const check of checks) {\n const mark = check.ok ? '✔' : check.required ? '✖' : '○';\n console.log(`${mark} ${check.name}: ${check.detail}`);\n }\n if (!ok) {\n console.log('\\nSome required checks failed. Fix them and run \"coreslopper doctor\" again.');\n }\n }\n\n return { ok, root, checks };\n}\n","import { mkdir, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { Provider, ProviderInput, ProviderOutput } from './types.js';\n\nfunction escapeXml(value: string): string {\n return value\n .replaceAll('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;')\n .replaceAll('\"', '&quot;')\n .replaceAll(\"'\", '&apos;');\n}\n\nfunction colorFromSeed(seed: number, index: number): string {\n const hue = (seed * 37 + index * 61) % 360;\n return `hsl(${hue} 80% 55%)`;\n}\n\nfunction placeholderSvg(input: ProviderInput, label: string): string {\n const width = input.width ?? 1024;\n const height = input.height ?? 576;\n const colors = [0, 1, 2].map((index) => colorFromSeed(input.seed, index));\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\" viewBox=\"0 0 ${width} ${height}\">\n <defs>\n <linearGradient id=\"g\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\">\n <stop offset=\"0%\" stop-color=\"${colors[0]}\"/>\n <stop offset=\"55%\" stop-color=\"${colors[1]}\"/>\n <stop offset=\"100%\" stop-color=\"${colors[2]}\"/>\n </linearGradient>\n <pattern id=\"grid\" width=\"48\" height=\"48\" patternUnits=\"userSpaceOnUse\">\n <path d=\"M 48 0 L 0 0 0 48\" fill=\"none\" stroke=\"rgba(255,255,255,0.16)\" stroke-width=\"1\"/>\n </pattern>\n </defs>\n <rect width=\"${width}\" height=\"${height}\" fill=\"url(#g)\"/>\n <rect width=\"${width}\" height=\"${height}\" fill=\"url(#grid)\"/>\n <text x=\"${width / 2}\" y=\"${height / 2 - 18}\" font-family=\"monospace\" font-size=\"${Math.round(width / 26)}\" fill=\"white\" text-anchor=\"middle\" opacity=\"0.92\">${escapeXml(label)}</text>\n <text x=\"${width / 2}\" y=\"${height / 2 + 34}\" font-family=\"monospace\" font-size=\"${Math.round(width / 52)}\" fill=\"white\" text-anchor=\"middle\" opacity=\"0.7\">${escapeXml(input.model)}</text>\n <text x=\"${width / 2}\" y=\"${height / 2 + 78}\" font-family=\"monospace\" font-size=\"${Math.round(width / 64)}\" fill=\"white\" text-anchor=\"middle\" opacity=\"0.55\">seed ${input.seed}</text>\n</svg>\n`;\n}\n\nasync function writePlaceholder(input: ProviderInput, label: string, suffix: string): Promise<ProviderOutput> {\n await mkdir(input.outputDir, { recursive: true });\n const path = join(input.outputDir, `mock-${input.seed}-${suffix}.svg`);\n await writeFile(path, placeholderSvg(input, label), 'utf8');\n return { files: [path], raw: { mock: true, label, model: input.model } };\n}\n\nexport class MockProvider implements Provider {\n readonly name = 'mock';\n\n async generateImage(input: ProviderInput): Promise<ProviderOutput> {\n return writePlaceholder(input, 'MOCK IMAGE', 'image');\n }\n\n async editImage(input: ProviderInput): Promise<ProviderOutput> {\n return writePlaceholder(input, 'MOCK EDIT', 'edit');\n }\n\n async imageToVideo(input: ProviderInput): Promise<ProviderOutput> {\n return writePlaceholder(input, `MOCK CLIP ${input.durationSeconds ?? 5}s`, 'clip');\n }\n\n async lipSync(input: ProviderInput): Promise<ProviderOutput> {\n if (!input.references?.[0]) throw new Error('lipSync requires a face reference image.');\n if (!input.audio) throw new Error('lipSync requires an audio file.');\n return writePlaceholder(input, `MOCK LIPSYNC ${input.durationSeconds ?? '?'}s`, 'lipsync');\n }\n}\n","import { z } from 'zod';\n\nexport const FormatSchema = z.object({\n aspect: z.string().min(1),\n width: z.number().int().positive(),\n height: z.number().int().positive(),\n fps: z.number().int().positive().default(30),\n});\n\nexport const ProviderKindSchema = z.enum(['fal', 'higgsfield', 'mock']);\n\nexport const ProjectConfigSchema = z.object({\n version: z.literal(1),\n slug: z\n .string()\n .min(1)\n .regex(/^[a-z0-9][a-z0-9-]*$/, 'slug must be lowercase letters, digits, and dashes'),\n title: z.string().min(1),\n created: z.string().min(1),\n workflow: z.object({\n version: z.string().min(1),\n commit: z.string().optional(),\n }),\n budget_usd: z.number().positive(),\n batch_cap_usd: z.number().positive().optional(),\n review_mode: z.enum(['auto', 'final']).default('auto'),\n formats: z.object({\n master: FormatSchema,\n derivatives: z.array(FormatSchema).default([]),\n }),\n providers: z\n .object({\n image: ProviderKindSchema.default('mock'),\n video: ProviderKindSchema.default('mock'),\n /** Lip-sync can use a different provider from the rest of the video. */\n lipsync: ProviderKindSchema.optional(),\n song: z.enum(['suno', 'import', 'mock']).default('import'),\n })\n .default({ image: 'mock', video: 'mock', song: 'import' }),\n song: z\n .object({\n variants: z.number().int().min(1).max(4).default(2),\n pinned_variant: z.string().optional(),\n })\n .default({ variants: 2 }),\n brand: z.string().min(1).default('example'),\n models: z.record(z.string(), z.unknown()).default({}),\n});\n\nexport const StageStatusSchema = z.enum(['pending', 'running', 'done', 'failed', 'skipped']);\n\nexport const StageStateSchema = z.object({\n status: StageStatusSchema,\n inputHash: z.string().optional(),\n outputs: z.array(z.string()).default([]),\n attempts: z.number().int().nonnegative().default(0),\n lastError: z.string().optional(),\n startedAt: z.string().optional(),\n finishedAt: z.string().optional(),\n});\n\nexport const BudgetSchema = z.object({\n totalUsd: z.number().nonnegative(),\n spentUsd: z.number().nonnegative(),\n reservedUsd: z.number().nonnegative(),\n});\n\nexport const StateSchema = z.object({\n version: z.literal(1),\n project: z.string().min(1),\n workflowVersion: z.string().min(1),\n stage: z.string().min(1),\n status: StageStatusSchema,\n stages: z.record(z.string(), StageStateSchema),\n budget: BudgetSchema,\n artifacts: z.record(z.string(), z.string()).default({}),\n errors: z.array(z.string()).default([]),\n updatedAt: z.string().min(1),\n});\n\nexport const WordSchema = z.object({\n text: z.string(),\n start: z.number().nonnegative(),\n end: z.number().nonnegative(),\n});\n\nexport const LineSchema = z.object({\n id: z.string().min(1),\n section: z.string().min(1),\n start: z.number().nonnegative(),\n end: z.number().nonnegative(),\n text: z.string(),\n words: z.array(WordSchema).default([]),\n});\n\nexport const SectionSchema = z.object({\n id: z.string().min(1),\n label: z.string().min(1),\n start: z.number().nonnegative(),\n end: z.number().nonnegative(),\n confidence: z.number().min(0).max(1).default(0.5),\n sources: z.array(z.string()).default([]),\n});\n\nexport const EnergySchema = z.object({\n hop: z.number().int().positive(),\n fps: z.number().positive(),\n values: z.array(z.number()),\n});\n\nexport const TimingSchema = z.object({\n version: z.literal(1),\n audio: z.object({\n path: z.string().min(1),\n duration: z.number().positive(),\n sampleRate: z.number().int().positive(),\n }),\n bpm: z.number().positive(),\n beats: z.array(z.number().nonnegative()).default([]),\n downbeats: z.array(z.number().nonnegative()).default([]),\n onsets: z.array(z.number().nonnegative()).default([]),\n energy: EnergySchema,\n sections: z.array(SectionSchema).min(1),\n lines: z.array(LineSchema).default([]),\n meta: z.record(z.string(), z.unknown()).default({}),\n});\n\nexport const TimingOverridesSchema = z.object({\n version: z.literal(1).default(1),\n bpm: z.number().positive().optional(),\n beats: z.array(z.number().nonnegative()).optional(),\n downbeats: z.array(z.number().nonnegative()).optional(),\n sections: z\n .array(z.object({ id: z.string().min(1), start: z.number().nonnegative(), end: z.number().nonnegative() }))\n .default([]),\n lines: z\n .array(z.object({ id: z.string().min(1), start: z.number().nonnegative(), end: z.number().nonnegative() }))\n .default([]),\n words: z\n .array(\n z.object({\n line: z.string().min(1),\n index: z.number().int().nonnegative(),\n start: z.number().nonnegative(),\n end: z.number().nonnegative(),\n }),\n )\n .default([]),\n});\n\nexport const AnchorSchema = z.discriminatedUnion('type', [\n z.object({\n type: z.literal('section'),\n id: z.string().min(1),\n edge: z.enum(['start', 'end']).default('start'),\n offset: z.number().default(0),\n }),\n z.object({\n type: z.literal('line'),\n id: z.string().min(1),\n edge: z.enum(['start', 'end']).default('start'),\n offset: z.number().default(0),\n }),\n z.object({\n type: z.literal('word'),\n line: z.string().min(1),\n index: z.number().int().nonnegative(),\n edge: z.enum(['start', 'end']).default('start'),\n offset: z.number().default(0),\n }),\n z.object({\n type: z.literal('beat'),\n index: z.number().int().nonnegative(),\n offset: z.number().default(0),\n }),\n z.object({\n type: z.literal('downbeat'),\n index: z.number().int().nonnegative(),\n offset: z.number().default(0),\n }),\n z.object({\n type: z.literal('time'),\n seconds: z.number().nonnegative(),\n }),\n]);\n\nexport const TransitionSchema = z.object({\n type: z.enum(['cut', 'fade', 'dissolve', 'wipe', 'glitch']).default('cut'),\n duration: z.number().nonnegative().default(0),\n});\n\nexport const ShotSourceSchema = z.enum(['motion', 'ai-clip', 'footage', 'mixed']);\n\nexport const LayerSchema = z.object({\n type: z.enum(['motion', 'ai-clip', 'footage']),\n asset: z.string().optional(),\n component: z.string().optional(),\n blend: z.string().optional(),\n zIndex: z.number().int().default(0),\n});\n\nexport const ShotSchema = z.object({\n id: z.string().regex(/^shot-[0-9]{3}$/, 'shot id must look like shot-001'),\n section: z.string().min(1),\n start: AnchorSchema,\n end: AnchorSchema,\n source: ShotSourceSchema,\n description: z.string().min(1),\n camera: z.string().default('static'),\n text: z.string().optional(),\n highlights: z.array(z.string()).default([]),\n transition: TransitionSchema.default({ type: 'cut', duration: 0 }),\n refs: z\n .object({\n style: z.array(z.string()).default([]),\n characters: z.array(z.string()).default([]),\n })\n .default({ style: [], characters: [] }),\n motion: z\n .object({\n component: z.string().optional(),\n props: z.record(z.string(), z.unknown()).default({}),\n })\n .optional(),\n prompts: z\n .object({\n keyframe: z.string().optional(),\n video: z.string().optional(),\n })\n .optional(),\n asset: z.string().optional(),\n /**\n * Lip-sync shot: a frontal face keyframe (prompts.keyframe) is animated by the\n * vocal segment between the shot's start and end (operation lipSync).\n */\n lipSync: z\n .object({\n character: z.string().min(1),\n source: z.string().default('audio/stems/vocals.wav'),\n })\n .optional(),\n layers: z.array(LayerSchema).optional(),\n chaining: z\n .object({\n enabled: z.boolean().default(false),\n from: z.string().optional(),\n })\n .optional(),\n});\n\nexport const StoryboardSchema = z.object({\n version: z.literal(1),\n timing: z.string().default('timing.effective.json'),\n style: z.string().default('style.yaml'),\n characters: z.string().default('characters.yaml'),\n shots: z.array(ShotSchema).min(1),\n});\n\nexport const TypographyStyleSchema = z.object({\n family: z.string().min(1),\n weight: z.number().int().min(100).max(900).optional(),\n size: z.number().positive().optional(),\n letterSpacing: z.number().optional(),\n lineHeight: z.number().positive().optional(),\n});\n\nexport const StyleBibleSchema = z.object({\n version: z.literal(1).default(1),\n name: z.string().min(1),\n palette: z.record(z.string(), z.string().regex(/^#[0-9a-fA-F]{6}$/)),\n typography: z.record(z.string(), TypographyStyleSchema),\n look: z\n .object({\n keywords: z.array(z.string()).default([]),\n negative: z.array(z.string()).default([]),\n references: z.array(z.string()).default([]),\n })\n .default({ keywords: [], negative: [], references: [] }),\n motion: z\n .object({\n easing: z.string().default('easeOut'),\n grain: z.number().min(0).max(1).default(0.08),\n })\n .default({ easing: 'easeOut', grain: 0.08 }),\n});\n\nexport const CharacterSchema = z.object({\n id: z.string().min(1),\n name: z.string().min(1),\n description: z.string().min(1),\n sheet: z.string().optional(),\n refs: z.array(z.string()).default([]),\n prompt: z.string().optional(),\n});\n\nexport const CharacterBibleSchema = z.object({\n version: z.literal(1).default(1),\n characters: z.array(CharacterSchema).default([]),\n});\n\nexport const BrandKitSchema = z.object({\n version: z.literal(1).default(1),\n id: z.string().min(1),\n name: z.string().min(1),\n description: z.string().optional(),\n logo: z.string().min(1),\n tokens: z.string().min(1),\n palette: z.record(z.string(), z.string().regex(/^#[0-9a-fA-F]{6}$/)),\n typography: z.record(z.string(), TypographyStyleSchema),\n motion: z.object({\n easing: z.string().default('easeOut'),\n grain: z.number().min(0).max(1).default(0.08),\n }),\n fonts: z\n .array(\n z.object({\n family: z.string().min(1),\n file: z.string().min(1),\n license: z.string().min(1),\n }),\n )\n .default([]),\n});\n\nexport const ModelPricingSchema = z.object({\n unit: z.enum(['image', 'second', 'request']),\n usd: z.number().nonnegative(),\n});\n\nexport const ModelRoleVariantSchema = z.object({\n model: z.string().min(1),\n params: z.record(z.string(), z.unknown()).default({}),\n pricing: ModelPricingSchema.optional(),\n maxDuration: z.number().positive().optional(),\n notes: z.string().optional(),\n});\n\nexport const ModelRoleSchema = z.object({\n /** Provider whose model slug and defaults are in the fields below. */\n provider: z.string().min(1).default('fal'),\n model: z.string().min(1),\n params: z.record(z.string(), z.unknown()).default({}),\n pricing: ModelPricingSchema.optional(),\n maxDuration: z.number().positive().optional(),\n notes: z.string().optional(),\n /** Provider-specific model slugs, params, and prices. */\n alternatives: z.record(z.string(), ModelRoleVariantSchema).default({}),\n});\n\nexport const ModelsConfigSchema = z.object({\n version: z.literal(1).default(1),\n last_verified: z.string().optional(),\n roles: z.record(z.string(), ModelRoleSchema),\n});\n\nexport type ProjectConfig = z.infer<typeof ProjectConfigSchema>;\nexport type Format = z.infer<typeof FormatSchema>;\nexport type StageStatus = z.infer<typeof StageStatusSchema>;\nexport type StageState = z.infer<typeof StageStateSchema>;\nexport type State = z.infer<typeof StateSchema>;\nexport type Word = z.infer<typeof WordSchema>;\nexport type Line = z.infer<typeof LineSchema>;\nexport type Section = z.infer<typeof SectionSchema>;\nexport type Timing = z.infer<typeof TimingSchema>;\nexport type TimingOverrides = z.infer<typeof TimingOverridesSchema>;\nexport type Anchor = z.infer<typeof AnchorSchema>;\nexport type Transition = z.infer<typeof TransitionSchema>;\nexport type ShotSource = z.infer<typeof ShotSourceSchema>;\nexport type Layer = z.infer<typeof LayerSchema>;\nexport type Shot = z.infer<typeof ShotSchema>;\nexport type Storyboard = z.infer<typeof StoryboardSchema>;\nexport type StyleBible = z.infer<typeof StyleBibleSchema>;\nexport type Character = z.infer<typeof CharacterSchema>;\nexport type CharacterBible = z.infer<typeof CharacterBibleSchema>;\nexport type BrandKit = z.infer<typeof BrandKitSchema>;\nexport type ModelPricing = z.infer<typeof ModelPricingSchema>;\nexport type ModelRoleVariant = z.infer<typeof ModelRoleVariantSchema>;\nexport type ModelRole = z.infer<typeof ModelRoleSchema>;\nexport type ModelsConfig = z.infer<typeof ModelsConfigSchema>;\nexport type ProviderKind = z.infer<typeof ProviderKindSchema>;\n","import { ZodError } from 'zod';\n\nexport class ValidationError extends Error {\n constructor(\n message: string,\n readonly details: string[] = [],\n ) {\n super(message);\n this.name = 'ValidationError';\n }\n}\n\nexport class BudgetError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'BudgetError';\n }\n}\n\nexport class ConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ConfigError';\n }\n}\n\nexport function formatZodError(error: ZodError): string[] {\n return error.issues.map((issue) => {\n const path = issue.path.length ? issue.path.join('.') : '(root)';\n return `${path}: ${issue.message}`;\n });\n}\n\nexport function asErrorMessage(error: unknown): string {\n if (error instanceof Error) return error.message;\n return String(error);\n}\n","import { createHash } from 'node:crypto';\nimport { readFile } from 'node:fs/promises';\n\nexport function sha256(input: string | Uint8Array): string {\n return createHash('sha256').update(input).digest('hex');\n}\n\nexport async function hashFile(path: string): Promise<string> {\n const data = await readFile(path);\n return sha256(data);\n}\n\n/**\n * Stable JSON stringify: object keys are sorted recursively, so the same\n * logical request produces the same cache key regardless of key order.\n */\nexport function canonicalJson(value: unknown): string {\n return JSON.stringify(sortValue(value));\n}\n\nfunction sortValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortValue);\n if (value && typeof value === 'object') {\n const record = value as Record<string, unknown>;\n const sorted: Record<string, unknown> = {};\n for (const key of Object.keys(record).sort()) {\n const item = record[key];\n if (item !== undefined) sorted[key] = sortValue(item);\n }\n return sorted;\n }\n return value;\n}\n\nexport function hashObject(value: unknown): string {\n return sha256(canonicalJson(value));\n}\n","import {\n type Anchor,\n type CharacterBible,\n type Line,\n type Section,\n type Shot,\n type Storyboard,\n type StyleBible,\n type Timing,\n type TimingOverrides,\n} from './schema.js';\nimport { ValidationError } from './errors.js';\n\nexport const TIMING_TOLERANCE_SECONDS = 0.05;\n\nexport const MOTION_COMPONENTS = new Set([\n 'TitleCard',\n 'LyricCard',\n 'GlitchBackdrop',\n 'ParticleField',\n 'Grid',\n 'Scanlines',\n 'NeonTorus',\n]);\n\nexport interface ResolvedShot extends Shot {\n startSeconds: number;\n endSeconds: number;\n startFrame: number;\n endFrame: number;\n durationInFrames: number;\n}\n\nexport interface ResolvedStoryboard {\n fps: number;\n durationSeconds: number;\n durationInFrames: number;\n shots: ResolvedShot[];\n warnings: string[];\n}\n\nfunction findSection(timing: Timing, id: string): Section {\n const section = timing.sections.find((candidate) => candidate.id === id);\n if (!section) {\n throw new ValidationError(`Unknown section \"${id}\". Known sections: ${timing.sections.map((s) => s.id).join(', ')}`);\n }\n return section;\n}\n\nfunction findLine(timing: Timing, id: string): Line {\n const line = timing.lines.find((candidate) => candidate.id === id);\n if (!line) {\n throw new ValidationError(`Unknown lyric line \"${id}\".`);\n }\n return line;\n}\n\nexport function mergeTiming(base: Timing, overrides: TimingOverrides): Timing {\n const merged = structuredClone(base);\n\n if (overrides.bpm !== undefined) merged.bpm = overrides.bpm;\n if (overrides.beats !== undefined) merged.beats = [...overrides.beats];\n if (overrides.downbeats !== undefined) merged.downbeats = [...overrides.downbeats];\n\n for (const override of overrides.sections) {\n const section = findSection(merged, override.id);\n section.start = override.start;\n section.end = override.end;\n }\n\n for (const override of overrides.lines) {\n const line = findLine(merged, override.id);\n line.start = override.start;\n line.end = override.end;\n }\n\n for (const override of overrides.words) {\n const line = findLine(merged, override.line);\n const word = line.words[override.index];\n if (!word) {\n throw new ValidationError(\n `Word override references missing word ${override.index} on line \"${override.line}\".`,\n );\n }\n word.start = override.start;\n word.end = override.end;\n }\n\n assertTiming(merged);\n return merged;\n}\n\nexport function assertTiming(timing: Timing): void {\n const issues: string[] = [];\n const duration = timing.audio.duration;\n\n if (timing.sections.length === 0) {\n issues.push('timing.sections must not be empty');\n }\n\n const sections = [...timing.sections].sort((a, b) => a.start - b.start);\n for (let index = 0; index < sections.length; index += 1) {\n const section = sections[index]!;\n if (section.end <= section.start) {\n issues.push(`section \"${section.id}\" has end <= start`);\n }\n if (section.start < -TIMING_TOLERANCE_SECONDS || section.end > duration + TIMING_TOLERANCE_SECONDS) {\n issues.push(`section \"${section.id}\" is outside the audio duration`);\n }\n if (index === 0 && Math.abs(section.start) > TIMING_TOLERANCE_SECONDS) {\n issues.push(`sections must start at 0; first section starts at ${section.start.toFixed(3)}s`);\n }\n const previous = sections[index - 1];\n if (previous) {\n const gap = section.start - previous.end;\n if (Math.abs(gap) > TIMING_TOLERANCE_SECONDS) {\n issues.push(`sections \"${previous.id}\" and \"${section.id}\" have a gap or overlap of ${gap.toFixed(3)}s`);\n }\n }\n }\n const last = sections[sections.length - 1];\n if (last && Math.abs(last.end - duration) > TIMING_TOLERANCE_SECONDS) {\n issues.push(`last section ends at ${last.end.toFixed(3)}s; audio duration is ${duration.toFixed(3)}s`);\n }\n\n for (const line of timing.lines) {\n if (line.end <= line.start) issues.push(`line \"${line.id}\" has end <= start`);\n if (line.start < -TIMING_TOLERANCE_SECONDS || line.end > duration + TIMING_TOLERANCE_SECONDS) {\n issues.push(`line \"${line.id}\" is outside the audio duration`);\n }\n if (!timing.sections.some((section) => section.id === line.section)) {\n issues.push(`line \"${line.id}\" references unknown section \"${line.section}\"`);\n }\n let previousEnd = -Infinity;\n for (const [index, word] of line.words.entries()) {\n if (word.end < word.start) issues.push(`line \"${line.id}\" word ${index} has end < start`);\n if (word.start < previousEnd - TIMING_TOLERANCE_SECONDS) {\n issues.push(`line \"${line.id}\" word ${index} starts before the previous word ends`);\n }\n previousEnd = word.end;\n }\n }\n\n for (const [label, values] of [\n ['beats', timing.beats],\n ['downbeats', timing.downbeats],\n ['onsets', timing.onsets],\n ] as const) {\n for (const value of values) {\n if (value < -TIMING_TOLERANCE_SECONDS || value > duration + TIMING_TOLERANCE_SECONDS) {\n issues.push(`${label} contains ${value.toFixed(3)}s, outside the audio duration`);\n }\n }\n }\n\n if (timing.energy.values.length === 0) issues.push('energy.values must not be empty');\n if (timing.energy.fps <= 0) issues.push('energy.fps must be positive');\n\n if (issues.length > 0) {\n throw new ValidationError('Invalid timing', issues);\n }\n}\n\nfunction ensureTime(value: number, timing: Timing, label: string): number {\n if (!Number.isFinite(value)) {\n throw new ValidationError(`${label} resolved to a non-finite time`);\n }\n if (value < -TIMING_TOLERANCE_SECONDS || value > timing.audio.duration + TIMING_TOLERANCE_SECONDS) {\n throw new ValidationError(\n `${label} resolved to ${value.toFixed(3)}s, outside 0..${timing.audio.duration.toFixed(3)}s`,\n );\n }\n return Math.max(0, Math.min(timing.audio.duration, value));\n}\n\nexport function resolveAnchor(anchor: Anchor, timing: Timing): number {\n switch (anchor.type) {\n case 'section': {\n const section = findSection(timing, anchor.id);\n const base = anchor.edge === 'start' ? section.start : section.end;\n return ensureTime(base + anchor.offset, timing, `section \"${anchor.id}\" ${anchor.edge}`);\n }\n case 'line': {\n const line = findLine(timing, anchor.id);\n const base = anchor.edge === 'start' ? line.start : line.end;\n return ensureTime(base + anchor.offset, timing, `line \"${anchor.id}\" ${anchor.edge}`);\n }\n case 'word': {\n const line = findLine(timing, anchor.line);\n const word = line.words[anchor.index];\n if (!word) {\n throw new ValidationError(`Word anchor references missing word ${anchor.index} on line \"${anchor.line}\".`);\n }\n const base = anchor.edge === 'start' ? word.start : word.end;\n return ensureTime(base + anchor.offset, timing, `word \"${anchor.line}\"[${anchor.index}] ${anchor.edge}`);\n }\n case 'beat': {\n const beat = timing.beats[anchor.index];\n if (beat === undefined) {\n throw new ValidationError(`Beat anchor references missing beat ${anchor.index}.`);\n }\n return ensureTime(beat + anchor.offset, timing, `beat ${anchor.index}`);\n }\n case 'downbeat': {\n const downbeat = timing.downbeats[anchor.index];\n if (downbeat === undefined) {\n throw new ValidationError(`Downbeat anchor references missing downbeat ${anchor.index}.`);\n }\n return ensureTime(downbeat + anchor.offset, timing, `downbeat ${anchor.index}`);\n }\n case 'time':\n return ensureTime(anchor.seconds, timing, 'time anchor');\n }\n}\n\nfunction getPath(value: unknown, path: string): unknown {\n return path.split('.').reduce<unknown>((current, key) => {\n if (current && typeof current === 'object' && key in current) {\n return (current as Record<string, unknown>)[key];\n }\n return undefined;\n }, value);\n}\n\nfunction validateRefs(shot: Shot, style: StyleBible, characters: CharacterBible): void {\n for (const ref of shot.refs.style) {\n if (getPath(style, ref) === undefined) {\n throw new ValidationError(`Shot \"${shot.id}\" references missing style token \"${ref}\".`);\n }\n }\n for (const character of shot.refs.characters) {\n if (!characters.characters.some((candidate) => candidate.id === character)) {\n throw new ValidationError(`Shot \"${shot.id}\" references missing character \"${character}\".`);\n }\n }\n}\n\nfunction validateSource(shot: Shot): void {\n if (shot.source === 'motion') {\n if (!shot.motion?.component) {\n throw new ValidationError(`Motion shot \"${shot.id}\" must set motion.component.`);\n }\n if (!MOTION_COMPONENTS.has(shot.motion.component)) {\n throw new ValidationError(\n `Motion shot \"${shot.id}\" uses unknown component \"${shot.motion.component}\". Known: ${[...MOTION_COMPONENTS].join(', ')}.`,\n );\n }\n }\n if (shot.source === 'ai-clip') {\n if (!shot.prompts?.keyframe || !shot.prompts.video) {\n throw new ValidationError(`AI clip shot \"${shot.id}\" must set prompts.keyframe and prompts.video.`);\n }\n }\n if (shot.source === 'footage' && !shot.asset) {\n throw new ValidationError(`Footage shot \"${shot.id}\" must set asset.`);\n }\n if (shot.source === 'mixed') {\n if (!shot.layers || shot.layers.length < 2) {\n throw new ValidationError(`Mixed shot \"${shot.id}\" must have at least two layers.`);\n }\n for (const [index, layer] of shot.layers.entries()) {\n if (layer.type === 'footage' && !layer.asset) {\n throw new ValidationError(`Mixed shot \"${shot.id}\" layer ${index} is footage but has no asset.`);\n }\n if (layer.type === 'motion') {\n if (!layer.component) {\n throw new ValidationError(`Mixed shot \"${shot.id}\" layer ${index} is motion but has no component.`);\n }\n if (!MOTION_COMPONENTS.has(layer.component)) {\n throw new ValidationError(\n `Mixed shot \"${shot.id}\" layer ${index} uses unknown component \"${layer.component}\".`,\n );\n }\n }\n if (layer.type === 'ai-clip' && !layer.asset && !shot.prompts?.video) {\n throw new ValidationError(\n `Mixed shot \"${shot.id}\" layer ${index} is ai-clip but has neither asset nor prompts.video.`,\n );\n }\n }\n }\n}\n\nfunction validateText(shot: Shot): void {\n if (shot.highlights.length === 0) return;\n if (!shot.text) {\n throw new ValidationError(`Shot \"${shot.id}\" has highlights but no text.`);\n }\n const normalized = shot.text.toLowerCase();\n for (const highlight of shot.highlights) {\n if (!normalized.includes(highlight.toLowerCase())) {\n throw new ValidationError(`Shot \"${shot.id}\" highlight \"${highlight}\" is not part of its text.`);\n }\n }\n}\n\nexport function resolveStoryboard(\n storyboard: Storyboard,\n timing: Timing,\n style: StyleBible,\n characters: CharacterBible,\n fps: number,\n toleranceFrames = 1,\n): ResolvedStoryboard {\n const warnings: string[] = [];\n const resolved: ResolvedShot[] = [];\n const ids = new Set<string>();\n\n for (const shot of storyboard.shots) {\n if (ids.has(shot.id)) throw new ValidationError(`Duplicate shot id \"${shot.id}\".`);\n ids.add(shot.id);\n\n if (!timing.sections.some((section) => section.id === shot.section)) {\n throw new ValidationError(`Shot \"${shot.id}\" references unknown section \"${shot.section}\".`);\n }\n\n const startSeconds = resolveAnchor(shot.start, timing);\n const endSeconds = resolveAnchor(shot.end, timing);\n if (endSeconds <= startSeconds) {\n throw new ValidationError(`Shot \"${shot.id}\" ends at or before its start.`);\n }\n\n const startFrame = Math.round(startSeconds * fps);\n const endFrame = Math.round(endSeconds * fps);\n if (endFrame <= startFrame) {\n throw new ValidationError(`Shot \"${shot.id}\" is shorter than one frame.`);\n }\n\n if (shot.start.type === 'time' || shot.end.type === 'time') {\n warnings.push(`Shot \"${shot.id}\" uses an explicit time anchor; prefer a symbolic anchor.`);\n }\n\n validateRefs(shot, style, characters);\n validateSource(shot);\n validateText(shot);\n\n resolved.push({\n ...shot,\n startSeconds,\n endSeconds,\n startFrame,\n endFrame,\n durationInFrames: endFrame - startFrame,\n });\n }\n\n const durationInFrames = Math.round(timing.audio.duration * fps);\n const ordered = [...resolved].sort((a, b) => a.startFrame - b.startFrame);\n if (ordered.some((shot, index) => shot.id !== resolved[index]?.id)) {\n throw new ValidationError('Storyboard shots must be ordered by start time.');\n }\n\n const first = ordered[0];\n if (!first) throw new ValidationError('Storyboard must contain at least one shot.');\n if (Math.abs(first.startFrame) > toleranceFrames) {\n throw new ValidationError(`Storyboard must start at 0; first shot starts at frame ${first.startFrame}.`);\n }\n\n let previousEnd = 0;\n for (const shot of ordered) {\n const gap = shot.startFrame - previousEnd;\n if (gap > toleranceFrames) {\n throw new ValidationError(`Gap of ${gap} frame(s) before shot \"${shot.id}\".`);\n }\n if (gap < -toleranceFrames) {\n throw new ValidationError(`Overlap of ${Math.abs(gap)} frame(s) at shot \"${shot.id}\".`);\n }\n previousEnd = shot.endFrame;\n }\n\n if (Math.abs(previousEnd - durationInFrames) > toleranceFrames) {\n throw new ValidationError(\n `Storyboard ends at frame ${previousEnd}; song ends at frame ${durationInFrames}.`,\n );\n }\n\n for (const shot of ordered) {\n if (!shot.chaining?.enabled) continue;\n if (!shot.chaining.from) {\n throw new ValidationError(`Shot \"${shot.id}\" enables chaining but has no \"from\" shot.`);\n }\n const source = ordered.find((candidate) => candidate.id === shot.chaining?.from);\n if (!source) {\n throw new ValidationError(`Shot \"${shot.id}\" chains from missing shot \"${shot.chaining.from}\".`);\n }\n if (source.endFrame > shot.startFrame + toleranceFrames) {\n throw new ValidationError(`Shot \"${shot.id}\" chains from a shot that does not end before it starts.`);\n }\n }\n\n return {\n fps,\n durationSeconds: timing.audio.duration,\n durationInFrames,\n shots: ordered,\n warnings,\n };\n}\n\nexport function sectionAt(timing: Timing, seconds: number): Section | undefined {\n return timing.sections.find(\n (section) => seconds >= section.start - TIMING_TOLERANCE_SECONDS && seconds <= section.end + TIMING_TOLERANCE_SECONDS,\n );\n}\n\nexport function energyAt(timing: Timing, seconds: number): number {\n if (timing.energy.values.length === 0) return 0;\n const index = Math.floor(seconds * timing.energy.fps);\n return timing.energy.values[Math.max(0, Math.min(timing.energy.values.length - 1, index))] ?? 0;\n}\n\nexport function beatIndexAt(timing: Timing, seconds: number): number {\n let index = -1;\n for (const [i, beat] of timing.beats.entries()) {\n if (beat <= seconds + TIMING_TOLERANCE_SECONDS) index = i;\n else break;\n }\n return index;\n}\n","import { BudgetError } from './errors.js';\nimport type { ProjectConfig, State, StageState, StageStatus } from './schema.js';\n\nexport interface StageDefinition {\n id: string;\n label: string;\n skills: string[];\n outputs: string[];\n mechanical: boolean;\n}\n\nexport const STAGES: StageDefinition[] = [\n {\n id: 'brief',\n label: 'Brief',\n skills: ['video-brief'],\n outputs: ['brief.md'],\n mechanical: false,\n },\n {\n id: 'treatment',\n label: 'Concept & treatment',\n skills: ['video-treatment'],\n outputs: ['treatment.md'],\n mechanical: false,\n },\n {\n id: 'lyrics',\n label: 'Lyrics',\n skills: ['lyrics-writer'],\n outputs: ['lyrics.txt', 'suno-style.txt'],\n mechanical: false,\n },\n {\n id: 'song',\n label: 'Song',\n skills: ['suno-song'],\n outputs: ['song.json', 'audio/song.wav', 'audio/stems/vocals.wav'],\n mechanical: false,\n },\n {\n id: 'audio-analysis',\n label: 'Audio analysis',\n skills: ['audio-analysis'],\n outputs: ['timing.json', 'timing.report.md'],\n mechanical: true,\n },\n {\n id: 'style-character',\n label: 'Style & character bible',\n skills: ['style-bible', 'character-bible'],\n outputs: ['style.yaml', 'characters.yaml'],\n mechanical: false,\n },\n {\n id: 'storyboard',\n label: 'Storyboard',\n skills: ['storyboard'],\n outputs: ['storyboard.yaml', 'storyboard.md', 'review/contact-sheet.svg'],\n mechanical: false,\n },\n {\n id: 'assets',\n label: 'Asset production',\n skills: ['remotion-motion', 'ai-clips', 'footage'],\n outputs: ['assets/manifest.jsonl'],\n mechanical: false,\n },\n {\n id: 'assembly',\n label: 'Assembly',\n skills: ['assembly-render'],\n outputs: ['renders/preview-16x9.mp4'],\n mechanical: true,\n },\n {\n id: 'qa-export',\n label: 'QA & export',\n skills: ['video-qa'],\n outputs: ['review/report.md', 'renders/16x9.mp4'],\n mechanical: true,\n },\n];\n\nexport const STAGE_IDS = STAGES.map((stage) => stage.id);\n\nexport function stageDefinition(id: string): StageDefinition | undefined {\n return STAGES.find((stage) => stage.id === id);\n}\n\nexport function createInitialState(config: ProjectConfig, workflowVersion: string): State {\n const now = new Date().toISOString();\n const stages: Record<string, StageState> = {};\n for (const stage of STAGES) {\n stages[stage.id] = {\n status: 'pending',\n outputs: [],\n attempts: 0,\n };\n }\n return {\n version: 1,\n project: config.slug,\n workflowVersion,\n stage: STAGES[0]!.id,\n status: 'pending',\n stages,\n budget: {\n totalUsd: config.budget_usd,\n spentUsd: 0,\n reservedUsd: 0,\n },\n artifacts: {},\n errors: [],\n updatedAt: now,\n };\n}\n\nexport function nextStage(state: State): StageDefinition | undefined {\n return STAGES.find((stage) => {\n const status = state.stages[stage.id]?.status ?? 'pending';\n return status === 'pending' || status === 'failed';\n });\n}\n\nexport function overallStatus(state: State): StageStatus {\n const statuses = STAGES.map((stage) => state.stages[stage.id]?.status ?? 'pending');\n if (statuses.some((status) => status === 'failed')) return 'failed';\n if (statuses.some((status) => status === 'running')) return 'running';\n if (statuses.every((status) => status === 'done' || status === 'skipped')) return 'done';\n return 'pending';\n}\n\nexport function setStageRunning(state: State, stageId: string): State {\n const stage = state.stages[stageId];\n if (!stage) throw new Error(`Unknown stage \"${stageId}\".`);\n const now = new Date().toISOString();\n stage.status = 'running';\n stage.startedAt = now;\n stage.attempts += 1;\n state.stage = stageId;\n state.status = 'running';\n state.updatedAt = now;\n return state;\n}\n\nexport function setStageDone(\n state: State,\n stageId: string,\n outputs: string[],\n inputHash?: string,\n): State {\n const stage = state.stages[stageId];\n if (!stage) throw new Error(`Unknown stage \"${stageId}\".`);\n const now = new Date().toISOString();\n stage.status = 'done';\n stage.outputs = outputs;\n stage.finishedAt = now;\n if (inputHash) stage.inputHash = inputHash;\n delete stage.lastError;\n const next = nextStage(state);\n state.stage = next?.id ?? stageId;\n state.status = overallStatus(state);\n state.updatedAt = now;\n return state;\n}\n\nexport function setStageFailed(state: State, stageId: string, error: string): State {\n const stage = state.stages[stageId];\n if (!stage) throw new Error(`Unknown stage \"${stageId}\".`);\n const now = new Date().toISOString();\n stage.status = 'failed';\n stage.lastError = error;\n stage.finishedAt = now;\n state.stage = stageId;\n state.status = 'failed';\n state.errors.push(error);\n state.updatedAt = now;\n return state;\n}\n\nexport function setStageSkipped(state: State, stageId: string, reason?: string): State {\n const stage = state.stages[stageId];\n if (!stage) throw new Error(`Unknown stage \"${stageId}\".`);\n stage.status = 'skipped';\n if (reason) stage.lastError = reason;\n const next = nextStage(state);\n state.stage = next?.id ?? stageId;\n state.status = overallStatus(state);\n state.updatedAt = new Date().toISOString();\n return state;\n}\n\nexport function resetStage(state: State, stageId: string): State {\n const stage = state.stages[stageId];\n if (!stage) throw new Error(`Unknown stage \"${stageId}\".`);\n stage.status = 'pending';\n stage.outputs = [];\n stage.attempts = 0;\n delete stage.inputHash;\n delete stage.lastError;\n delete stage.startedAt;\n delete stage.finishedAt;\n state.stage = stageId;\n state.status = overallStatus(state);\n state.updatedAt = new Date().toISOString();\n return state;\n}\n\nexport function remainingBudget(state: State): number {\n return Math.max(0, state.budget.totalUsd - state.budget.spentUsd - state.budget.reservedUsd);\n}\n\nexport function recordSpend(state: State, usd: number): State {\n if (usd < 0) throw new BudgetError('Spend must not be negative.');\n const next = state.budget.spentUsd + usd;\n if (next > state.budget.totalUsd + 1e-9) {\n throw new BudgetError(\n `Spend of $${usd.toFixed(2)} would exceed the project budget ($${state.budget.totalUsd.toFixed(2)}).`,\n );\n }\n state.budget.spentUsd = Number(next.toFixed(6));\n state.updatedAt = new Date().toISOString();\n return state;\n}\n\nexport function stageTable(state: State): string[] {\n const rows = ['Stage Status Attempts Outputs'];\n for (const stage of STAGES) {\n const current = state.stages[stage.id];\n const status = current?.status ?? 'pending';\n const attempts = current?.attempts ?? 0;\n const outputs = current?.outputs.length ? current.outputs.join(', ') : '-';\n rows.push(`${stage.id.padEnd(21)} ${status.padEnd(9)} ${String(attempts).padEnd(9)} ${outputs}`);\n }\n return rows;\n}\n","import { BudgetError } from './errors.js';\nimport type { ModelPricing, ProjectConfig, State } from './schema.js';\nimport { remainingBudget } from './state.js';\n\nexport function estimateCost(units: number, pricing: ModelPricing): number {\n if (!Number.isFinite(units) || units < 0) throw new BudgetError('Cost units must be a non-negative number.');\n if (!Number.isFinite(pricing.usd) || pricing.usd < 0) {\n throw new BudgetError('Model pricing must be a known non-negative number.');\n }\n return Number((units * pricing.usd).toFixed(6));\n}\n\nexport function effectiveBatchCap(config: ProjectConfig, state: State): number {\n const remaining = remainingBudget(state);\n const ratioCap = remaining * 0.3;\n const configured = config.batch_cap_usd ?? ratioCap;\n return Math.min(configured, remaining);\n}\n\nexport function assertAffordable(\n config: ProjectConfig,\n state: State,\n estimatedUsd: number,\n label = 'batch',\n): void {\n const remaining = remainingBudget(state);\n if (estimatedUsd > remaining + 1e-9) {\n throw new BudgetError(\n `${label} estimate $${estimatedUsd.toFixed(2)} exceeds the remaining project budget $${remaining.toFixed(2)}.`,\n );\n }\n const cap = effectiveBatchCap(config, state);\n if (estimatedUsd > cap + 1e-9) {\n throw new BudgetError(\n `${label} estimate $${estimatedUsd.toFixed(2)} exceeds the batch cap $${cap.toFixed(2)}. Raise batch_cap_usd or reduce the batch.`,\n );\n }\n}\n\nexport function formatUsd(value: number): string {\n const absolute = Math.abs(value);\n const digits = absolute > 0 && absolute < 0.01 ? 4 : absolute < 1 ? 3 : 2;\n const fixed = value.toFixed(digits);\n const [whole, fraction = ''] = fixed.split('.');\n const trimmed = fraction.replace(/0+$/, '');\n return `$${whole}.${trimmed.padEnd(2, '0')}`;\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { mkdir, readFile, rename, writeFile } from 'node:fs/promises';\nimport { dirname, join, resolve } from 'node:path';\nimport { parse as parseYaml } from 'yaml';\nimport { z } from 'zod';\nimport { ValidationError, formatZodError } from './errors.js';\nimport { mergeTiming } from './timing.js';\nimport {\n CharacterBibleSchema,\n ModelsConfigSchema,\n ProjectConfigSchema,\n StateSchema,\n StoryboardSchema,\n StyleBibleSchema,\n TimingOverridesSchema,\n TimingSchema,\n type CharacterBible,\n type ModelsConfig,\n type ProjectConfig,\n type State,\n type Storyboard,\n type StyleBible,\n type Timing,\n type TimingOverrides,\n} from './schema.js';\nimport { createInitialState } from './state.js';\n\nexport interface ProjectPaths {\n root: string;\n config: string;\n state: string;\n brief: string;\n treatment: string;\n lyrics: string;\n sunoStyle: string;\n song: string;\n timing: string;\n overrides: string;\n effectiveTiming: string;\n storyboard: string;\n storyboardMd: string;\n style: string;\n characters: string;\n review: string;\n contactSheet: string;\n renders: string;\n assets: string;\n manifest: string;\n}\n\nexport function projectPaths(projectDir: string): ProjectPaths {\n const root = resolve(projectDir);\n return {\n root,\n config: join(root, 'project.yaml'),\n state: join(root, 'state.json'),\n brief: join(root, 'brief.md'),\n treatment: join(root, 'treatment.md'),\n lyrics: join(root, 'lyrics.txt'),\n sunoStyle: join(root, 'suno-style.txt'),\n song: join(root, 'song.json'),\n timing: join(root, 'timing.json'),\n overrides: join(root, 'timing.overrides.json'),\n effectiveTiming: join(root, 'timing.effective.json'),\n storyboard: join(root, 'storyboard.yaml'),\n storyboardMd: join(root, 'storyboard.md'),\n style: join(root, 'style.yaml'),\n characters: join(root, 'characters.yaml'),\n review: join(root, 'review'),\n contactSheet: join(root, 'review', 'contact-sheet.svg'),\n renders: join(root, 'renders'),\n assets: join(root, 'assets'),\n manifest: join(root, 'assets', 'manifest.jsonl'),\n };\n}\n\nexport async function readYamlFile<T>(path: string, schema: z.ZodType<T>): Promise<T> {\n let raw: string;\n try {\n raw = await readFile(path, 'utf8');\n } catch (error) {\n throw new ValidationError(`Cannot read ${path}: ${(error as Error).message}`);\n }\n let data: unknown;\n try {\n data = parseYaml(raw);\n } catch (error) {\n throw new ValidationError(`Invalid YAML in ${path}: ${(error as Error).message}`);\n }\n const result = schema.safeParse(data);\n if (!result.success) {\n throw new ValidationError(`Invalid ${path}`, formatZodError(result.error));\n }\n return result.data;\n}\n\nexport async function readJsonFile<T>(path: string, schema: z.ZodType<T>): Promise<T> {\n let raw: string;\n try {\n raw = await readFile(path, 'utf8');\n } catch (error) {\n throw new ValidationError(`Cannot read ${path}: ${(error as Error).message}`);\n }\n let data: unknown;\n try {\n data = JSON.parse(raw);\n } catch (error) {\n throw new ValidationError(`Invalid JSON in ${path}: ${(error as Error).message}`);\n }\n const result = schema.safeParse(data);\n if (!result.success) {\n throw new ValidationError(`Invalid ${path}`, formatZodError(result.error));\n }\n return result.data;\n}\n\nexport async function ensureDir(path: string): Promise<void> {\n await mkdir(path, { recursive: true });\n}\n\nexport async function writeTextAtomic(path: string, content: string): Promise<void> {\n await ensureDir(dirname(path));\n const temporary = `${path}.tmp-${process.pid}-${Date.now()}`;\n await writeFile(temporary, content, 'utf8');\n await rename(temporary, path);\n}\n\nexport async function writeJsonAtomic(path: string, value: unknown): Promise<void> {\n await writeTextAtomic(path, `${JSON.stringify(value, null, 2)}\\n`);\n}\n\nexport function pathExists(path: string): boolean {\n return existsSync(path);\n}\n\nexport function repoRoot(start = process.cwd()): string {\n let current = resolve(start);\n while (true) {\n const packagePath = join(current, 'package.json');\n if (existsSync(packagePath)) {\n try {\n const parsed = JSON.parse(readFileSync(packagePath, 'utf8')) as { name?: string };\n if (parsed.name === 'coreslopper') return current;\n } catch {\n // Keep walking.\n }\n }\n const parent = dirname(current);\n if (parent === current) {\n throw new ValidationError(`Could not find the coreslopper repository root from ${start}.`);\n }\n current = parent;\n }\n}\n\nexport interface LoadedProject {\n config: ProjectConfig;\n state: State;\n timing?: Timing;\n overrides: TimingOverrides;\n effectiveTiming?: Timing;\n storyboard?: Storyboard;\n style?: StyleBible;\n characters?: CharacterBible;\n paths: ProjectPaths;\n}\n\nexport async function loadProject(projectDir: string): Promise<LoadedProject> {\n const paths = projectPaths(projectDir);\n const config = await readYamlFile(paths.config, ProjectConfigSchema);\n const state = pathExists(paths.state)\n ? await readJsonFile(paths.state, StateSchema)\n : createInitialState(config, config.workflow.version);\n const timing = pathExists(paths.timing) ? await readJsonFile(paths.timing, TimingSchema) : undefined;\n const overrides = pathExists(paths.overrides)\n ? await readJsonFile(paths.overrides, TimingOverridesSchema)\n : TimingOverridesSchema.parse({});\n const effectiveTiming = timing ? mergeTiming(timing, overrides) : undefined;\n const storyboard = pathExists(paths.storyboard)\n ? await readYamlFile(paths.storyboard, StoryboardSchema)\n : undefined;\n const style = pathExists(paths.style) ? await readYamlFile(paths.style, StyleBibleSchema) : undefined;\n const characters = pathExists(paths.characters)\n ? await readYamlFile(paths.characters, CharacterBibleSchema)\n : undefined;\n\n return { config, state, timing, overrides, effectiveTiming, storyboard, style, characters, paths };\n}\n\nexport async function saveState(path: string, state: State): Promise<void> {\n await writeJsonAtomic(path, state);\n}\n\nexport async function writeEffectiveTiming(project: LoadedProject): Promise<void> {\n if (!project.effectiveTiming) return;\n await writeJsonAtomic(project.paths.effectiveTiming, project.effectiveTiming);\n}\n\nexport async function loadModelsConfig(root = repoRoot()): Promise<ModelsConfig> {\n return readYamlFile(join(root, 'config', 'models.yaml'), ModelsConfigSchema);\n}\n\nexport const DefaultsSchema = z.object({\n version: z.literal(1).default(1),\n formats: z.object({\n master: z.object({\n aspect: z.string().default('16:9'),\n width: z.number().int().positive().default(1920),\n height: z.number().int().positive().default(1080),\n fps: z.number().int().positive().default(30),\n }),\n derivatives: z\n .array(\n z.object({\n aspect: z.string(),\n width: z.number().int().positive(),\n height: z.number().int().positive(),\n }),\n )\n .default([\n { aspect: '9:16', width: 1080, height: 1920 },\n { aspect: '1:1', width: 1080, height: 1080 },\n ]),\n }),\n budget: z.object({\n minimum_usd: z.number().positive().default(5),\n suggested_usd: z.number().positive().default(50),\n }),\n render: z.object({\n loudness_lufs: z.number().default(-14),\n true_peak_dbtp: z.number().default(-1),\n video_bitrate: z.string().default('12M'),\n }),\n asset_batch_size: z.number().int().positive().default(5),\n retries: z.object({\n max_attempts: z.number().int().positive().default(4),\n base_delay_ms: z.number().int().positive().default(1000),\n request_timeout_ms: z.number().int().positive().default(180_000),\n }),\n});\n\nexport type Defaults = z.infer<typeof DefaultsSchema>;\n\nexport async function loadDefaults(root = repoRoot()): Promise<Defaults> {\n return readYamlFile(join(root, 'config', 'defaults.yaml'), DefaultsSchema);\n}\n","import { createHash } from 'node:crypto';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { extname, join } from 'node:path';\n\nexport type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;\n\nexport const IMAGE_EXTENSIONS = new Set(['.png', '.jpg', '.jpeg', '.webp', '.gif', '.avif', '.svg']);\nexport const VIDEO_EXTENSIONS = new Set(['.mp4', '.webm', '.mov', '.mkv']);\nexport const AUDIO_EXTENSIONS = new Set(['.mp3', '.wav', '.m4a', '.ogg', '.flac']);\n\nexport function mimeForPath(path: string): string {\n const extension = extname(path).toLowerCase();\n if (extension === '.png') return 'image/png';\n if (extension === '.jpg' || extension === '.jpeg') return 'image/jpeg';\n if (extension === '.webp') return 'image/webp';\n if (extension === '.svg') return 'image/svg+xml';\n if (extension === '.avif') return 'image/avif';\n if (extension === '.gif') return 'image/gif';\n if (extension === '.mp4') return 'video/mp4';\n if (extension === '.webm') return 'video/webm';\n if (extension === '.mp3') return 'audio/mpeg';\n if (extension === '.wav') return 'audio/wav';\n if (extension === '.m4a') return 'audio/mp4';\n if (extension === '.ogg') return 'audio/ogg';\n if (extension === '.flac') return 'audio/flac';\n return 'application/octet-stream';\n}\n\nexport async function fileToDataUri(path: string): Promise<string> {\n const data = await readFile(path);\n return `data:${mimeForPath(path)};base64,${data.toString('base64')}`;\n}\n\nexport function delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function isRetryableStatus(status: number): boolean {\n return status === 408 || status === 409 || status === 429 || status >= 500;\n}\n\nexport class NonRetryableHttpError extends Error {}\n\nexport async function fetchJsonWithRetry(\n label: string,\n url: string,\n init: RequestInit,\n timeoutMs: number,\n fetchImpl: FetchLike = fetch,\n attempts = 4,\n): Promise<Record<string, unknown>> {\n let lastError: unknown;\n for (let attempt = 0; attempt < attempts; attempt += 1) {\n try {\n const response = await fetchImpl(url, { ...init, signal: AbortSignal.timeout(timeoutMs) });\n const text = await response.text();\n let body: unknown;\n try {\n body = text ? JSON.parse(text) : {};\n } catch {\n body = { raw: text };\n }\n if (!response.ok) {\n const message = `${label} ${response.status}: ${typeof body === 'string' ? body : JSON.stringify(body)}`;\n if (!isRetryableStatus(response.status)) throw new NonRetryableHttpError(message);\n if (attempt < attempts - 1) {\n await delay(500 * 2 ** attempt);\n continue;\n }\n throw new Error(message);\n }\n return body as Record<string, unknown>;\n } catch (error) {\n if (error instanceof NonRetryableHttpError) throw error;\n lastError = error;\n if (attempt >= attempts - 1) break;\n await delay(500 * 2 ** attempt);\n }\n }\n throw lastError instanceof Error ? lastError : new Error(String(lastError));\n}\n\nexport function collectUrls(value: unknown, keyHint = ''): string[] {\n const found: string[] = [];\n if (typeof value === 'string') {\n if (/^https?:\\/\\//.test(value)) {\n const extension = extname(new URL(value).pathname).toLowerCase();\n if (\n IMAGE_EXTENSIONS.has(extension) ||\n VIDEO_EXTENSIONS.has(extension) ||\n AUDIO_EXTENSIONS.has(extension) ||\n keyHint === 'url' ||\n keyHint.endsWith('_url')\n ) {\n found.push(value);\n }\n }\n return found;\n }\n if (Array.isArray(value)) {\n for (const item of value) found.push(...collectUrls(item, keyHint));\n return found;\n }\n if (value && typeof value === 'object') {\n for (const [key, item] of Object.entries(value as Record<string, unknown>)) {\n found.push(...collectUrls(item, key));\n }\n }\n return found;\n}\n\nexport function extensionFor(contentType: string | null, url: string): string {\n const type = (contentType ?? '').split(';')[0]?.trim().toLowerCase();\n if (type === 'image/png') return '.png';\n if (type === 'image/jpeg') return '.jpg';\n if (type === 'image/webp') return '.webp';\n if (type === 'image/svg+xml') return '.svg';\n if (type === 'video/mp4') return '.mp4';\n if (type === 'video/webm') return '.webm';\n if (type === 'audio/mpeg') return '.mp3';\n if (type === 'audio/wav' || type === 'audio/x-wav') return '.wav';\n if (type === 'audio/mp4') return '.m4a';\n const extension = extname(new URL(url).pathname).toLowerCase();\n if (IMAGE_EXTENSIONS.has(extension) || VIDEO_EXTENSIONS.has(extension) || AUDIO_EXTENSIONS.has(extension)) {\n return extension;\n }\n return '.bin';\n}\n\nexport async function downloadOutputs(\n prefix: string,\n urls: string[],\n outputDir: string,\n timeoutMs: number,\n fetchImpl: FetchLike = fetch,\n): Promise<string[]> {\n await mkdir(outputDir, { recursive: true });\n const files: string[] = [];\n for (const [index, url] of urls.entries()) {\n const response = await fetchImpl(url, { signal: AbortSignal.timeout(timeoutMs) });\n if (!response.ok) throw new Error(`Failed to download ${prefix} output ${url}: ${response.status}`);\n const extension = extensionFor(response.headers.get('content-type'), url);\n const name = createHash('sha256').update(url).digest('hex').slice(0, 16);\n const path = join(outputDir, `${prefix}-${name}-${index}${extension}`);\n await writeFile(path, Buffer.from(await response.arrayBuffer()));\n files.push(path);\n }\n return files;\n}\n","import { readFile } from 'node:fs/promises';\nimport { extname } from 'node:path';\nimport { ConfigError } from '@coreslopper/core';\nimport {\n collectUrls,\n delay,\n downloadOutputs,\n fetchJsonWithRetry,\n type FetchLike,\n} from './http.js';\nimport type { Provider, ProviderInput, ProviderOutput } from './types.js';\n\nexport interface HiggsfieldProviderOptions {\n /** Complete credential, usually `key_id:key_secret`. */\n credentials?: string;\n baseUrl?: string;\n requestTimeoutMs?: number;\n pollIntervalMs?: number;\n fetchImpl?: FetchLike;\n}\n\n/** Content types accepted by the Higgsfield upload endpoint. */\nconst UPLOAD_CONTENT_TYPES = new Map<string, string>([\n ['.jpg', 'image/jpeg'],\n ['.jpeg', 'image/jpeg'],\n ['.png', 'image/png'],\n ['.webp', 'image/webp'],\n ['.gif', 'image/gif'],\n ['.wav', 'audio/wav'],\n ['.mp4', 'video/mp4'],\n]);\n\nconst TERMINAL_FAILURES = new Set(['failed', 'nsfw', 'canceled', 'cancelled']);\nconst COMPLETED = 'completed';\nconst OUTPUT_KEYS = ['images', 'image', 'video', 'videos', 'audio', 'audios', 'output', 'outputs', 'files'];\n\n/**\n * Resolve Higgsfield credentials from the environment.\n *\n * Accepts the complete credential (`HIGGSFIELD_API_KEY`, `HF_API_KEY`, `HF_KEY`,\n * or `HF_CREDENTIALS`) or the split key ID and secret (`HF_API_KEY_ID` and\n * `HF_API_KEY_SECRET`).\n */\nexport function resolveHiggsfieldCredentials(env: NodeJS.ProcessEnv = process.env): string | undefined {\n const combined = env.HIGGSFIELD_API_KEY ?? env.HF_API_KEY ?? env.HF_KEY ?? env.HF_CREDENTIALS;\n if (combined?.trim()) return combined.trim().replace(/^Key\\s+/i, '');\n const id = env.HF_API_KEY_ID?.trim();\n const secret = env.HF_API_KEY_SECRET?.trim();\n if (id && secret) return `${id}:${secret}`;\n return undefined;\n}\n\nfunction normalizeCredentials(value: string): string {\n return value.trim().replace(/^Key\\s+/i, '');\n}\n\nfunction normalizeSeed(seed: number): number {\n const value = Math.abs(Math.trunc(seed)) % 1_000_000;\n return value || 1;\n}\n\n/**\n * Pull a boolean adapter option out of the model params. These options steer\n * the adapter and are not sent to the provider.\n */\nfunction takeSwitch(params: Record<string, unknown>, key: string): [boolean, Record<string, unknown>] {\n const { [key]: value, ...rest } = params;\n return [value === true, rest];\n}\n\nfunction takeReferenceField(\n params: Record<string, unknown>,\n fallback = 'image_urls',\n): [string, Record<string, unknown>] {\n const { reference_field: value, ...rest } = params;\n return [typeof value === 'string' && value.length > 0 ? value : fallback, rest];\n}\n\nfunction collectOutputUrls(result: Record<string, unknown>): string[] {\n const urls: string[] = [];\n for (const key of OUTPUT_KEYS) {\n if (result[key] === undefined) continue;\n urls.push(...collectUrls(result[key], 'url'));\n }\n return [...new Set(urls)];\n}\n\nexport class HiggsfieldProvider implements Provider {\n readonly name = 'higgsfield';\n private readonly credentials: string;\n private readonly baseUrl: string;\n private readonly requestTimeoutMs: number;\n private readonly pollIntervalMs: number;\n private readonly fetchImpl: FetchLike;\n private readonly uploadCache = new Map<string, string>();\n\n constructor(options: HiggsfieldProviderOptions = {}) {\n const credentials = options.credentials ?? resolveHiggsfieldCredentials();\n if (!credentials) {\n throw new ConfigError(\n 'Higgsfield credentials are not set. Add HIGGSFIELD_API_KEY (key_id:key_secret) to .env, ' +\n 'or set HF_API_KEY_ID and HF_API_KEY_SECRET, or use the mock provider.',\n );\n }\n this.credentials = normalizeCredentials(credentials);\n this.baseUrl = options.baseUrl ?? 'https://api.higgsfield.ai';\n this.requestTimeoutMs = options.requestTimeoutMs ?? 600_000;\n this.pollIntervalMs = options.pollIntervalMs ?? 1_000;\n this.fetchImpl = options.fetchImpl ?? fetch;\n }\n\n async generateImage(input: ProviderInput): Promise<ProviderOutput> {\n const [, afterReference] = takeReferenceField(input.params ?? {}, 'image_url');\n const [sendSeed, afterSeedSwitch] = takeSwitch(afterReference, 'send_seed');\n const [sendNegative, params] = takeSwitch(afterSeedSwitch, 'send_negative_prompt');\n return this.runModel(input, {\n prompt: input.prompt,\n ...(sendSeed ? { seed: normalizeSeed(input.seed) } : {}),\n ...(sendNegative && input.negativePrompt ? { negative_prompt: input.negativePrompt } : {}),\n ...params,\n });\n }\n\n async editImage(input: ProviderInput): Promise<ProviderOutput> {\n const references = input.references ?? [];\n if (references.length === 0) {\n throw new Error('editImage requires at least one reference image.');\n }\n const [field, afterReference] = takeReferenceField(input.params ?? {});\n const [sendSeed, afterSeedSwitch] = takeSwitch(afterReference, 'send_seed');\n const [sendNegative, params] = takeSwitch(afterSeedSwitch, 'send_negative_prompt');\n const urls = await Promise.all(references.map((reference) => this.uploadReference(reference)));\n if (!field.endsWith('s') && urls.length > 1) {\n throw new Error(\n `Higgsfield reference field \"${field}\" accepts one image, but ${urls.length} references were supplied.`,\n );\n }\n const referenceBody = field.endsWith('s') ? { [field]: urls } : { [field]: urls[0] };\n return this.runModel(input, {\n prompt: input.prompt,\n ...referenceBody,\n ...(sendSeed ? { seed: normalizeSeed(input.seed) } : {}),\n ...(sendNegative && input.negativePrompt ? { negative_prompt: input.negativePrompt } : {}),\n ...params,\n });\n }\n\n async imageToVideo(input: ProviderInput): Promise<ProviderOutput> {\n const reference = input.references?.[0];\n if (!reference) {\n throw new Error('imageToVideo requires a start-frame reference image.');\n }\n const [field, afterReference] = takeReferenceField(input.params ?? {}, 'image_url');\n const [sendSeed, afterSeedSwitch] = takeSwitch(afterReference, 'send_seed');\n const [sendNegative, params] = takeSwitch(afterSeedSwitch, 'send_negative_prompt');\n const imageUrl = await this.uploadReference(reference);\n return this.runModel(input, {\n prompt: input.prompt,\n [field]: imageUrl,\n duration: input.durationSeconds ?? 5,\n ...(sendSeed ? { seed: normalizeSeed(input.seed) } : {}),\n ...(sendNegative && input.negativePrompt ? { negative_prompt: input.negativePrompt } : {}),\n ...params,\n });\n }\n\n async lipSync(_input: ProviderInput): Promise<ProviderOutput> {\n throw new ConfigError(\n 'The Higgsfield adapter does not support lip-sync yet. Set providers.lipsync to \"fal\" ' +\n 'and provide FAL_KEY, or keep providers.video on fal for lip-sync shots.',\n );\n }\n\n private async runModel(input: ProviderInput, body: Record<string, unknown>): Promise<ProviderOutput> {\n const model = input.model.replace(/^\\/+/, '');\n const headers: Record<string, string> = {\n Authorization: `Key ${this.credentials}`,\n 'Content-Type': 'application/json',\n };\n if (input.idempotencyKey) headers['Idempotency-Key'] = input.idempotencyKey;\n\n const accepted = await fetchJsonWithRetry(\n 'Higgsfield',\n `${this.baseUrl}/${model}`,\n { method: 'POST', headers, body: JSON.stringify(body) },\n this.requestTimeoutMs,\n this.fetchImpl,\n );\n\n const initialStatus = String(accepted.status ?? '').toLowerCase();\n if (TERMINAL_FAILURES.has(initialStatus)) {\n throw new Error(`Higgsfield request ${initialStatus}: ${JSON.stringify(accepted).slice(0, 500)}`);\n }\n\n let result = accepted;\n if (initialStatus !== COMPLETED && collectOutputUrls(accepted).length === 0) {\n const statusUrl = String(\n accepted.status_url ??\n (accepted.request_id ? `${this.baseUrl}/requests/${accepted.request_id}/status` : ''),\n );\n if (!statusUrl) {\n throw new Error(`Higgsfield returned no request handle for ${model}: ${JSON.stringify(accepted).slice(0, 500)}`);\n }\n result = await this.poll(statusUrl);\n }\n\n const urls = collectOutputUrls(result);\n if (urls.length === 0) {\n throw new Error(`Higgsfield returned no output URLs for ${model}: ${JSON.stringify(result).slice(0, 500)}`);\n }\n return {\n files: await downloadOutputs('higgsfield', urls, input.outputDir, this.requestTimeoutMs, this.fetchImpl),\n raw: result,\n };\n }\n\n private async poll(statusUrl: string): Promise<Record<string, unknown>> {\n const started = Date.now();\n let interval = this.pollIntervalMs;\n while (Date.now() - started < this.requestTimeoutMs) {\n const status = await fetchJsonWithRetry(\n 'Higgsfield',\n statusUrl,\n {\n method: 'GET',\n headers: { Authorization: `Key ${this.credentials}` },\n },\n this.requestTimeoutMs,\n this.fetchImpl,\n );\n const value = String(status.status ?? '').toLowerCase();\n if (value === COMPLETED) return status;\n if (TERMINAL_FAILURES.has(value)) {\n throw new Error(`Higgsfield request ${value}: ${JSON.stringify(status).slice(0, 500)}`);\n }\n await delay(interval);\n interval = Math.min(Math.round(interval * 1.5), 10_000);\n }\n throw new Error(`Higgsfield request timed out after ${this.requestTimeoutMs}ms.`);\n }\n\n private async uploadReference(path: string): Promise<string> {\n const cached = this.uploadCache.get(path);\n if (cached) return cached;\n\n const contentType = UPLOAD_CONTENT_TYPES.get(extname(path).toLowerCase());\n if (!contentType) {\n throw new ConfigError(\n `Higgsfield cannot upload ${path}: unsupported content type. Use JPEG, PNG, WebP, GIF, WAV, or MP4.`,\n );\n }\n\n const created = await fetchJsonWithRetry(\n 'Higgsfield',\n `${this.baseUrl}/files/generate-upload-url`,\n {\n method: 'POST',\n headers: {\n Authorization: `Key ${this.credentials}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ content_type: contentType }),\n },\n this.requestTimeoutMs,\n this.fetchImpl,\n );\n\n const uploadUrl = typeof created.upload_url === 'string' ? created.upload_url : undefined;\n const publicUrl = typeof created.public_url === 'string' ? created.public_url : undefined;\n if (!uploadUrl || !publicUrl) {\n throw new Error(`Higgsfield did not return an upload URL: ${JSON.stringify(created).slice(0, 500)}`);\n }\n\n const uploadHeaders =\n created.upload_headers && typeof created.upload_headers === 'object'\n ? (created.upload_headers as Record<string, string>)\n : { 'Content-Type': contentType };\n const data = await readFile(path);\n const upload = await this.fetchImpl(uploadUrl, {\n method: 'PUT',\n headers: uploadHeaders,\n body: new Uint8Array(data),\n signal: AbortSignal.timeout(this.requestTimeoutMs),\n });\n if (!upload.ok) {\n throw new Error(`Higgsfield upload failed for ${path}: ${upload.status}`);\n }\n\n this.uploadCache.set(path, publicUrl);\n return publicUrl;\n }\n}\n","import { copyFile, mkdir, readFile, writeFile, appendFile, stat } from 'node:fs/promises';\nimport { dirname, extname, join, relative } from 'node:path';\nimport { createHash } from 'node:crypto';\nimport { hashFile, hashObject } from '@coreslopper/core';\nimport type {\n GenerationRequest,\n GenerationResult,\n GenerationRunnerOptions,\n ProviderOutput,\n} from './types.js';\n\ninterface CacheRecord {\n result: Omit<GenerationResult, 'cached'>;\n}\n\nfunction defaultSeed(request: GenerationRequest): number {\n const digest = hashObject({\n model: request.model,\n prompt: request.prompt,\n operation: request.operation,\n });\n return Number.parseInt(digest.slice(0, 8), 16) % 2_147_483_647;\n}\n\nfunction outputName(hash: string, index: number, extension: string): string {\n return `${hash.slice(0, 16)}-${index}${extension}`;\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function copyOutputs(files: string[], outputDir: string, hash: string): Promise<string[]> {\n await mkdir(outputDir, { recursive: true });\n const copied: string[] = [];\n for (const [index, file] of files.entries()) {\n const extension = extname(file) || '.bin';\n const destination = join(outputDir, outputName(hash, index, extension));\n await copyFile(file, destination);\n copied.push(destination);\n }\n return copied;\n}\n\nexport class GenerationRunner {\n constructor(private readonly options: GenerationRunnerOptions) {}\n\n async run(request: GenerationRequest): Promise<GenerationResult> {\n const references = request.references ?? [];\n const referenceHashes = await Promise.all(\n references.map(async (path) => ({\n path,\n sha256: await hashFile(path),\n })),\n );\n if (request.operation === 'lipSync' && !request.audio) {\n throw new Error('lipSync requires an audio file.');\n }\n const audioHash = request.audio ? await hashFile(request.audio) : undefined;\n const seed = request.seed ?? defaultSeed(request);\n const params = request.params ?? {};\n const hash = hashObject({\n operation: request.operation,\n provider: this.options.provider.name,\n model: request.model,\n prompt: request.prompt,\n negativePrompt: request.negativePrompt,\n seed,\n width: request.width,\n height: request.height,\n durationSeconds: request.durationSeconds,\n params,\n references: referenceHashes,\n ...(audioHash ? { audio: audioHash } : {}),\n });\n\n const cacheDir = join(this.options.cacheDir, hash);\n const cacheRecordPath = join(cacheDir, 'result.json');\n const cached = await this.readCache(cacheRecordPath);\n if (cached) {\n const copied = await copyOutputs(cached.result.files, request.outputDir, hash);\n const result: GenerationResult = {\n ...cached.result,\n files: copied,\n cached: true,\n costUsd: 0,\n };\n await this.appendManifest(request, result, 'ok');\n return result;\n }\n\n await this.options.beforeGenerate?.(request.estimatedCostUsd);\n await mkdir(cacheDir, { recursive: true });\n\n let output: ProviderOutput;\n try {\n const input = {\n model: request.model,\n prompt: request.prompt,\n negativePrompt: request.negativePrompt,\n references,\n audio: request.audio,\n seed,\n width: request.width,\n height: request.height,\n durationSeconds: request.durationSeconds,\n params,\n outputDir: cacheDir,\n idempotencyKey: hash,\n };\n if (request.operation === 'generateImage') output = await this.options.provider.generateImage(input);\n else if (request.operation === 'editImage') output = await this.options.provider.editImage(input);\n else if (request.operation === 'lipSync') output = await this.options.provider.lipSync(input);\n else output = await this.options.provider.imageToVideo(input);\n } catch (error) {\n const failed: GenerationResult = {\n id: `gen_${hash.slice(0, 12)}`,\n hash,\n operation: request.operation,\n role: request.role,\n provider: this.options.provider.name,\n model: request.model,\n prompt: request.prompt,\n seed,\n references,\n params,\n costUsd: 0,\n cached: false,\n files: [],\n createdAt: new Date().toISOString(),\n };\n await this.appendManifest(request, failed, 'failed', error instanceof Error ? error.message : String(error));\n throw error;\n }\n\n if (output.files.length === 0) throw new Error(`${this.options.provider.name} returned no files.`);\n for (const file of output.files) {\n if (!(await fileExists(file))) throw new Error(`Provider reported a missing file: ${file}`);\n }\n\n const cachedResult: Omit<GenerationResult, 'cached'> = {\n id: `gen_${hash.slice(0, 12)}`,\n hash,\n operation: request.operation,\n role: request.role,\n provider: this.options.provider.name,\n model: request.model,\n prompt: request.prompt,\n seed,\n references,\n ...(request.audio ? { audio: request.audio } : {}),\n params,\n costUsd: request.estimatedCostUsd,\n files: output.files,\n createdAt: new Date().toISOString(),\n };\n await writeFile(cacheRecordPath, `${JSON.stringify({ result: cachedResult }, null, 2)}\\n`, 'utf8');\n\n const copied = await copyOutputs(output.files, request.outputDir, hash);\n const result: GenerationResult = {\n ...cachedResult,\n files: copied,\n cached: false,\n };\n await this.appendManifest(request, result, 'ok');\n return result;\n }\n\n private async readCache(path: string): Promise<CacheRecord | undefined> {\n if (!(await fileExists(path))) return undefined;\n try {\n const parsed = JSON.parse(await readFile(path, 'utf8')) as CacheRecord;\n if (!parsed.result?.files?.length) return undefined;\n for (const file of parsed.result.files) {\n if (!(await fileExists(file))) return undefined;\n }\n return parsed;\n } catch {\n return undefined;\n }\n }\n\n private async appendManifest(\n request: GenerationRequest,\n result: GenerationResult,\n status: 'ok' | 'failed',\n error?: string,\n ): Promise<void> {\n const baseDir = request.projectDir ?? process.cwd();\n const record = {\n ...result,\n status,\n ...(error ? { error } : {}),\n files: result.files.map((file) => relative(baseDir, file)),\n references: result.references.map((file) => relative(baseDir, file)),\n ...(result.audio ? { audio: relative(baseDir, result.audio) } : {}),\n };\n await mkdir(dirname(this.options.manifestPath), { recursive: true });\n await appendFile(this.options.manifestPath, `${JSON.stringify(record)}\\n`, 'utf8');\n }\n}\n\nexport function newGenerationId(): string {\n return `gen_${createHash('sha256').update(String(Date.now())).digest('hex').slice(0, 12)}`;\n}\n","import { execFileSync, spawnSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { delimiter, join } from 'node:path';\n\nexport type ToolId = 'node' | 'npm' | 'git' | 'uv' | 'python' | 'ffmpeg' | 'claude';\n\nexport interface ToolCheck {\n id: ToolId;\n name: string;\n ok: boolean;\n detail: string;\n required: boolean;\n purpose: string;\n}\n\nexport interface SetupResult {\n npm: boolean;\n uv: boolean;\n warning?: string;\n}\n\nfunction refreshPath(): void {\n const additions = [join(homedir(), '.local', 'bin'), join(homedir(), '.cargo', 'bin')];\n const current = process.env.PATH?.split(delimiter) ?? [];\n for (const directory of additions) {\n if (existsSync(directory) && !current.includes(directory)) {\n process.env.PATH = `${directory}${delimiter}${process.env.PATH ?? ''}`;\n current.unshift(directory);\n }\n }\n}\n\nfunction commandVersion(command: string, args: string[] = ['--version']): string | undefined {\n try {\n const output = execFileSync(command, args, {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n timeout: 10_000,\n shell: process.platform === 'win32',\n }).trim();\n return output.split('\\n').find((line) => line.trim())?.trim();\n } catch {\n return undefined;\n }\n}\n\nexport function commandExists(command: string): boolean {\n refreshPath();\n const finder = process.platform === 'win32' ? 'where' : 'which';\n try {\n execFileSync(finder, [command], { stdio: 'ignore', timeout: 5_000 });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction pythonVersion(): { ok: boolean; detail: string } {\n let fallback: { ok: false; detail: string } | undefined;\n for (const command of ['python3', 'python']) {\n const output = commandVersion(command, ['--version']);\n if (!output) continue;\n const match = output.match(/(\\d+)\\.(\\d+)\\.(\\d+)/);\n if (!match) continue;\n const major = Number(match[1]);\n const minor = Number(match[2]);\n const detail = `${output} (${command})`;\n if (major === 3 && minor >= 12) return { ok: true, detail };\n fallback ??= { ok: false, detail: `${detail}, but 3.12 or newer is required` };\n }\n\n if (commandExists('uv')) {\n try {\n const path = execFileSync('uv', ['python', 'find', '3.12'], {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n timeout: 15_000,\n }).trim();\n if (path) return { ok: true, detail: `${path} (managed by uv)` };\n } catch {\n // Fall through to the missing message.\n }\n }\n\n return fallback ?? { ok: false, detail: 'missing (3.12 or newer required)' };\n}\n\nexport function detectTools(root = process.cwd()): ToolCheck[] {\n refreshPath();\n const checks: ToolCheck[] = [];\n\n const nodeMajor = Number(process.versions.node.split('.')[0]);\n checks.push({\n id: 'node',\n name: 'Node.js >= 22',\n ok: nodeMajor >= 22,\n detail: process.version,\n required: true,\n purpose: 'runtime',\n });\n\n const npm = commandVersion('npm');\n checks.push({\n id: 'npm',\n name: 'npm',\n ok: Boolean(npm),\n detail: npm ?? 'missing',\n required: true,\n purpose: 'dependency installation',\n });\n\n const git = commandVersion('git');\n checks.push({\n id: 'git',\n name: 'git',\n ok: Boolean(git),\n detail: git ?? 'missing (optional, needed for versioning your workspace)',\n required: false,\n purpose: 'version control',\n });\n\n const uv = commandVersion('uv');\n checks.push({\n id: 'uv',\n name: 'uv',\n ok: Boolean(uv),\n detail: uv ?? 'missing (needed for audio analysis)',\n required: false,\n purpose: 'audio-analysis',\n });\n\n const python = pythonVersion();\n checks.push({\n id: 'python',\n name: 'Python >= 3.12',\n ok: python.ok,\n detail: python.detail,\n required: false,\n purpose: 'audio-analysis',\n });\n\n const localFfmpeg = join(root, '.tools', 'ffmpeg', 'ffmpeg');\n const ffmpeg = existsSync(localFfmpeg) ? localFfmpeg : commandVersion('ffmpeg', ['-version']);\n checks.push({\n id: 'ffmpeg',\n name: 'ffmpeg',\n ok: Boolean(ffmpeg),\n detail: ffmpeg ?? 'missing (optional, needed for footage and loudness normalization)',\n required: false,\n purpose: 'media',\n });\n\n const claude = commandVersion('claude');\n checks.push({\n id: 'claude',\n name: 'Claude Code',\n ok: Boolean(claude),\n detail: claude ?? 'missing (needed to run /video-next)',\n required: false,\n purpose: 'agent pipeline',\n });\n\n return checks;\n}\n\nexport function formatTools(checks: ToolCheck[]): string {\n return checks\n .map((check) => {\n const mark = check.ok ? '✔' : check.required ? '✖' : '○';\n return `${mark} ${check.name}: ${check.detail}`;\n })\n .join('\\n');\n}\n\nexport function missingTools(checks: ToolCheck[]): ToolCheck[] {\n return checks.filter((check) => !check.ok);\n}\n\nfunction spawnStep(label: string, command: string, args: string[], cwd?: string): void {\n console.log(`→ ${label}`);\n const result = spawnSync(command, args, {\n cwd,\n env: process.env,\n stdio: 'inherit',\n shell: process.platform === 'win32',\n });\n if (result.error) throw result.error;\n if (result.status !== 0) {\n throw new Error(`${label} failed (exit code ${result.status ?? 'unknown'}).`);\n }\n}\n\nexport function installUv(): boolean {\n refreshPath();\n if (commandExists('uv')) return true;\n\n console.log('→ Installing uv (official installer)');\n const result =\n process.platform === 'win32'\n ? spawnSync(\n 'powershell',\n ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-Command', 'irm https://astral.sh/uv/install.ps1 | iex'],\n { stdio: 'inherit' },\n )\n : spawnSync('sh', ['-c', 'curl -LsSf https://astral.sh/uv/install.sh | sh'], { stdio: 'inherit' });\n\n refreshPath();\n if (result.error) console.error(`uv installer: ${result.error.message}`);\n return commandExists('uv');\n}\n\nexport function installPython(): boolean {\n if (!commandExists('uv')) return false;\n spawnStep('Installing Python 3.12 with uv', 'uv', ['python', 'install', '3.12']);\n return pythonVersion().ok;\n}\n\nexport function installFfmpeg(root = process.cwd()): boolean {\n const local = join(root, '.tools', 'ffmpeg', 'ffmpeg');\n if (existsSync(local) || commandExists('ffmpeg')) return true;\n\n const script = join(root, 'scripts', 'install-ffmpeg.sh');\n if (process.platform === 'darwin' && commandExists('brew')) {\n spawnStep('Installing ffmpeg with Homebrew', 'brew', ['install', 'ffmpeg']);\n return commandExists('ffmpeg');\n }\n\n if (process.platform === 'linux' && process.arch === 'x64' && existsSync(script)) {\n spawnStep('Installing local ffmpeg (Linux x86_64)', 'bash', [script]);\n return existsSync(local) || commandExists('ffmpeg');\n }\n\n if (process.platform === 'linux' && commandExists('apt-get')) {\n if (process.getuid?.() === 0) {\n spawnStep('Updating apt package lists', 'apt-get', ['update']);\n spawnStep('Installing ffmpeg with apt', 'apt-get', ['install', '-y', 'ffmpeg']);\n } else {\n spawnStep('Updating apt package lists (sudo)', 'sudo', ['apt-get', 'update']);\n spawnStep('Installing ffmpeg with apt (sudo)', 'sudo', ['apt-get', 'install', '-y', 'ffmpeg']);\n }\n return commandExists('ffmpeg');\n }\n\n if (process.platform === 'win32' && commandExists('winget')) {\n spawnStep('Installing ffmpeg with winget', 'winget', [\n 'install',\n '--id',\n 'Gyan.FFmpeg',\n '-e',\n '--accept-source-agreements',\n '--accept-package-agreements',\n ]);\n return commandExists('ffmpeg');\n }\n\n console.error('Could not install ffmpeg automatically. Install it with your package manager.');\n return false;\n}\n\nexport function installClaudeCode(): boolean {\n if (commandExists('claude')) return true;\n spawnStep('Installing Claude Code globally', 'npm', ['install', '-g', '@anthropic-ai/claude-code']);\n return commandExists('claude');\n}\n\nexport function runSetup(root: string): SetupResult {\n spawnStep('Installing Node dependencies (npm install)', 'npm', ['install'], root);\n\n if (!commandExists('uv')) {\n return {\n npm: true,\n uv: false,\n warning: 'uv is not installed, so the Python audio-analysis environment was skipped.',\n };\n }\n\n try {\n spawnStep('Syncing audio-analysis dependencies (uv sync)', 'uv', ['sync', '--group', 'dev'], join(root, 'scripts', 'audio-analysis'));\n } catch (error) {\n return {\n npm: true,\n uv: false,\n warning: `Node dependencies are installed, but \"uv sync\" failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n return { npm: true, uv: true };\n}\n\nexport type FalKeyStatus = 'valid' | 'invalid' | 'unknown';\n\nexport interface ProviderKeyResult {\n status: FalKeyStatus;\n message: string;\n}\n\nexport type FalKeyResult = ProviderKeyResult;\n\n/**\n * Check a fal.ai key against the model-list endpoint. A network failure is\n * reported as unknown so onboarding never blocks on connectivity.\n */\nexport async function validateFalKey(\n key: string,\n fetchImpl: (input: string, init?: RequestInit) => Promise<Response> = fetch,\n): Promise<ProviderKeyResult> {\n const trimmed = key.trim();\n if (!trimmed) return { status: 'invalid', message: 'empty key' };\n\n try {\n const response = await fetchImpl('https://api.fal.ai/v1/models?limit=1', {\n headers: { Authorization: `Key ${trimmed}` },\n signal: AbortSignal.timeout(10_000),\n });\n if (response.ok) return { status: 'valid', message: `HTTP ${response.status}` };\n if (response.status === 401) return { status: 'invalid', message: 'HTTP 401 (key rejected)' };\n if (response.status === 403) return { status: 'unknown', message: 'HTTP 403 (key may lack API permission)' };\n return { status: 'unknown', message: `HTTP ${response.status}` };\n } catch (error) {\n return {\n status: 'unknown',\n message: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Check a Higgsfield credential against a lightweight authenticated endpoint.\n * Network failures are reported as unknown, not as an invalid credential.\n */\nexport async function validateHiggsfieldKey(\n key: string,\n fetchImpl: (input: string, init?: RequestInit) => Promise<Response> = fetch,\n): Promise<ProviderKeyResult> {\n const trimmed = key.trim();\n if (!trimmed) return { status: 'invalid', message: 'empty credential' };\n\n try {\n const response = await fetchImpl('https://api.higgsfield.ai/v1/text2image/soul-styles/v2', {\n headers: { Authorization: `Key ${trimmed}` },\n signal: AbortSignal.timeout(10_000),\n });\n if (response.ok) return { status: 'valid', message: `HTTP ${response.status}` };\n if (response.status === 401) return { status: 'invalid', message: 'HTTP 401 (credential rejected)' };\n if (response.status === 402) return { status: 'unknown', message: 'HTTP 402 (balance required)' };\n if (response.status === 403) return { status: 'unknown', message: 'HTTP 403 (credential may lack API permission)' };\n return { status: 'unknown', message: `HTTP ${response.status}` };\n } catch (error) {\n return {\n status: 'unknown',\n message: error instanceof Error ? error.message : String(error),\n };\n }\n}\n","import { existsSync, readFileSync, readdirSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { ValidationError } from '@coreslopper/core';\n\nexport const WORKSPACE_MARKER = 'coreslopper.workspace.json';\n\nexport interface WorkspaceMarker {\n version: 1;\n runtimeVersion: string;\n created: string;\n project?: string;\n /** Last `coreslopper update`. */\n updated?: string;\n /** SHA-256 of every workflow file as installed; the baseline for `coreslopper update`. */\n files?: Record<string, string>;\n}\n\nfunction readPackage(path: string): { name?: string; version?: string } | undefined {\n try {\n return JSON.parse(readFileSync(path, 'utf8')) as { name?: string; version?: string };\n } catch {\n return undefined;\n }\n}\n\nexport function isWorkspace(directory: string): boolean {\n const root = resolve(directory);\n if (existsSync(join(root, WORKSPACE_MARKER))) return true;\n const packageJson = readPackage(join(root, 'package.json'));\n return packageJson?.name === 'coreslopper' && existsSync(join(root, 'templates', 'project'));\n}\n\nexport function findWorkspaceRoot(start = process.cwd()): string | undefined {\n let current = resolve(start);\n while (true) {\n if (isWorkspace(current)) return current;\n const parent = dirname(current);\n if (parent === current) return undefined;\n current = parent;\n }\n}\n\nexport function requireWorkspaceRoot(start = process.cwd()): string {\n const root = findWorkspaceRoot(start);\n if (!root) {\n throw new ValidationError(\n `No coreslopper workspace found from ${start}. Run \"npx coreslopper init\" to create one.`,\n );\n }\n return root;\n}\n\n/**\n * The package that contains this file. In development it is the repository\n * root; in an npx install it is the package root that contains dist/.\n */\nexport function ownPackageRoot(): string {\n let current = dirname(fileURLToPath(import.meta.url));\n while (true) {\n const packageJson = readPackage(join(current, 'package.json'));\n if (packageJson?.name === 'coreslopper') return current;\n const parent = dirname(current);\n if (parent === current) return process.cwd();\n current = parent;\n }\n}\n\nexport function ownVersion(): string {\n return readPackage(join(ownPackageRoot(), 'package.json'))?.version ?? '0.1.0';\n}\n\nexport function runtimeDir(): string | undefined {\n const candidate = join(ownPackageRoot(), 'runtime');\n return existsSync(join(candidate, 'templates', 'project')) ? candidate : undefined;\n}\n\n/** Load .env without overriding variables that are already set. */\nexport function loadWorkspaceEnv(root: string): void {\n const envPath = join(root, '.env');\n if (!existsSync(envPath) || typeof process.loadEnvFile !== 'function') return;\n try {\n process.loadEnvFile(envPath);\n } catch {\n // A malformed .env should not prevent read-only commands from running.\n // `coreslopper doctor` reports the problem separately.\n }\n}\n\nexport function listProjects(root: string): string[] {\n const projectsDir = join(root, 'projects');\n if (!existsSync(projectsDir)) return [];\n return readdirSync(projectsDir, { withFileTypes: true })\n .filter((entry) => entry.isDirectory() && existsSync(join(projectsDir, entry.name, 'project.yaml')))\n .map((entry) => entry.name)\n .sort();\n}\n\n/**\n * Resolve an optional project argument. With no argument, prefer the only\n * non-demo project; otherwise ask for an explicit project.\n */\nexport function resolveProjectArg(root: string, arg?: string): string {\n if (arg) {\n const direct = resolve(process.cwd(), arg);\n if (existsSync(join(direct, 'project.yaml'))) return direct;\n const named = join(root, 'projects', arg);\n if (existsSync(join(named, 'project.yaml'))) return named;\n throw new ValidationError(`Project not found: ${arg}`);\n }\n\n const projects = listProjects(root);\n const candidates = projects.filter((project) => project !== 'demo');\n if (candidates.length === 1) return join(root, 'projects', candidates[0]!);\n if (projects.length === 1) return join(root, 'projects', projects[0]!);\n if (projects.length === 0) {\n throw new ValidationError('No projects found. Create one with \"coreslopper new <slug> --budget <usd>\".');\n }\n throw new ValidationError(\n `Multiple projects found: ${projects.join(', ')}. Pass one explicitly, for example \"coreslopper status ${candidates[0] ?? projects[0]}\".`,\n );\n}\n","import { resolve } from 'node:path';\nimport { ValidationError } from '@coreslopper/core';\nimport { resolveHiggsfieldCredentials } from '@coreslopper/providers';\nimport {\n defaultProjectSlug,\n initWorkspace,\n type FirstProjectOptions,\n type InitResult,\n type SongProvider,\n type VisualProvider,\n} from './init.js';\nimport { onboard } from './onboarding.js';\nimport { validateFalKey, validateHiggsfieldKey } from './tools.js';\n\nexport interface InitCommandOptions {\n yes?: boolean;\n force?: boolean;\n install?: boolean;\n git?: boolean;\n installTools?: boolean;\n toolInstall?: boolean;\n song?: SongProvider;\n visual?: VisualProvider;\n imageProvider?: VisualProvider;\n videoProvider?: VisualProvider;\n budget?: number;\n project?: string;\n title?: string;\n falKey?: string;\n higgsfieldKey?: string;\n suno?: boolean;\n skipProject?: boolean;\n runtime?: string;\n}\n\nexport function validateChoice<T extends string>(value: string, choices: readonly T[], label: string): T {\n if (!choices.includes(value as T)) {\n throw new ValidationError(`Invalid ${label}: ${value}. Use one of: ${choices.join(', ')}.`);\n }\n return value as T;\n}\n\nexport function printInitSummary(result: InitResult): void {\n console.log(`✔ Workspace created: ${result.targetDir}`);\n console.log(` runtime: ${result.runtimeVersion}`);\n if (result.projectSlug) console.log(` project: ${result.projectSlug}`);\n console.log(` dependencies: ${result.installed ? 'installed' : 'not installed'}`);\n console.log(` audio analysis: ${result.uvSynced ? 'ready' : 'not synced'}`);\n console.log(` git: ${result.gitInitialized ? 'initialized' : 'not initialized'}`);\n for (const warning of result.warnings) console.warn(` ! ${warning}`);\n console.log('');\n console.log('Next:');\n console.log(` cd ${result.targetDir}`);\n if (!result.installed) console.log(' npm install');\n if (!result.uvSynced) console.log(' npm run python:sync');\n console.log(' npm run cli -- doctor');\n console.log(' npm run demo:preview');\n if (result.projectSlug) console.log(` claude # then /video-next ${result.projectSlug}`);\n else console.log(' claude');\n}\n\nexport async function runInitCommand(targetArg: string | undefined, options: InitCommandOptions): Promise<void> {\n const nonInteractive = Boolean(options.yes) || !process.stdin.isTTY;\n\n if (!nonInteractive) {\n await onboard({\n dir: targetArg,\n force: options.force,\n install: options.install,\n git: options.git,\n installTools: options.toolInstall === false ? false : options.installTools,\n song: options.song,\n visual: options.visual,\n imageProvider: options.imageProvider,\n videoProvider: options.videoProvider,\n budget: options.budget,\n projectSlug: options.project,\n title: options.title,\n falKey: options.falKey,\n higgsfieldKey: options.higgsfieldKey,\n suno: options.suno,\n noProject: options.skipProject,\n });\n return;\n }\n\n const target = resolve(targetArg ?? '.');\n const visual = options.visual ?? 'mock';\n const image = options.imageProvider ?? visual;\n const video = options.videoProvider ?? visual;\n const falKey = options.falKey ?? process.env.FAL_KEY;\n const higgsfieldKey = options.higgsfieldKey ?? resolveHiggsfieldCredentials();\n for (const provider of new Set([image, video])) {\n if (provider === 'fal') {\n if (!falKey) {\n console.warn('! No FAL_KEY was provided. Add it to .env before generating paid assets.');\n } else {\n const check = await validateFalKey(falKey);\n if (check.status !== 'valid') console.warn(`! Could not verify the fal.ai key (${check.message}).`);\n }\n }\n if (provider === 'higgsfield') {\n if (!higgsfieldKey) {\n console.warn(\n '! No Higgsfield credential was provided. Add HIGGSFIELD_API_KEY to .env before generating paid assets.',\n );\n } else {\n const check = await validateHiggsfieldKey(higgsfieldKey);\n if (check.status !== 'valid') {\n console.warn(`! Could not verify the Higgsfield credential (${check.message}).`);\n }\n }\n }\n }\n\n const projectSlug = options.project ?? defaultProjectSlug(target);\n const project: FirstProjectOptions | null = options.skipProject\n ? null\n : {\n slug: projectSlug,\n title: options.title,\n budget: options.budget ?? 50,\n song: options.song ?? 'import',\n image,\n video,\n };\n\n const result = await initWorkspace({\n targetDir: target,\n runtimeDir: options.runtime,\n force: options.force,\n install: options.install,\n git: options.git,\n tools: options.toolInstall === false ? false : options.installTools,\n project,\n falKey,\n higgsfieldKey,\n suno: options.suno !== false,\n });\n printInitSummary(result);\n if (!result.installed && options.install !== false) process.exitCode = 1;\n}\n","import { spawnSync } from 'node:child_process';\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { chmod, cp, mkdir, readFile, readdir, stat, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { basename, isAbsolute, join, parse, relative, resolve, sep } from 'node:path';\nimport { ValidationError } from '@coreslopper/core';\nimport { createProject } from './new-project.js';\nimport { SKIPPED_DIRECTORIES, hashRuntime } from './update.js';\nimport {\n commandExists,\n detectTools,\n installClaudeCode,\n installFfmpeg,\n installPython,\n installUv,\n missingTools,\n runSetup,\n} from './tools.js';\nimport {\n WORKSPACE_MARKER,\n ownPackageRoot,\n ownVersion,\n runtimeDir as defaultRuntimeDir,\n type WorkspaceMarker,\n} from './workspace.js';\n\nexport type SongProvider = 'suno' | 'import';\nexport type VisualProvider = 'fal' | 'higgsfield' | 'mock';\n\nexport interface FirstProjectOptions {\n slug: string;\n title?: string;\n budget: number;\n song: SongProvider;\n image: VisualProvider;\n video: VisualProvider;\n}\n\nexport interface InitOptions {\n targetDir: string;\n runtimeDir?: string;\n force?: boolean;\n install?: boolean;\n git?: boolean;\n tools?: boolean;\n project?: FirstProjectOptions | null;\n falKey?: string;\n higgsfieldKey?: string;\n suno?: boolean;\n onProgress?: (message: string) => void;\n}\n\nexport interface InitResult {\n targetDir: string;\n runtimeVersion: string;\n projectSlug?: string;\n installed: boolean;\n uvSynced: boolean;\n gitInitialized: boolean;\n warnings: string[];\n}\n\nexport function sanitizeSlug(value: string): string {\n const slug = value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n return slug || 'my-video';\n}\n\nexport function defaultProjectSlug(targetDir: string): string {\n const name = basename(resolve(targetDir));\n return name && name !== '.' && name !== sep ? sanitizeSlug(name) : 'my-video';\n}\n\nexport function upsertEnv(content: string, key: string, value: string): string {\n if (!/^[A-Z_][A-Z0-9_]*$/.test(key)) throw new ValidationError(`Invalid environment variable name: ${key}`);\n if (/[\\r\\n]/.test(value)) throw new ValidationError(`Environment value for ${key} must be a single line.`);\n\n const line = `${key}=${value}`;\n const pattern = new RegExp(`^${key}=.*$`, 'm');\n if (pattern.test(content)) return content.replace(pattern, () => line);\n return `${content.trimEnd()}\\n${line}\\n`;\n}\n\nexport async function isDirectoryEmpty(path: string): Promise<boolean> {\n if (!existsSync(path)) return true;\n if (!(await stat(path)).isDirectory()) return false;\n const entries = await readdir(path);\n return entries.filter((entry) => entry !== '.DS_Store').length === 0;\n}\n\nfunction isInside(parent: string, child: string): boolean {\n if (parent === child) return true;\n const path = relative(parent, child);\n return path !== '' && !path.startsWith('..') && !isAbsolute(path);\n}\n\nfunction resolveRuntime(options: InitOptions): string {\n const runtime = options.runtimeDir ? resolve(options.runtimeDir) : defaultRuntimeDir();\n if (!runtime || !existsSync(join(runtime, 'templates', 'project'))) {\n throw new ValidationError(\n 'Runtime assets not found. Use \"npx coreslopper init\" to create a workspace, or run \"npm run build:runtime\" in the upstream repository.',\n );\n }\n return runtime;\n}\n\nfunction shouldCopy(source: string, runtime: string): boolean {\n const path = relative(runtime, source);\n if (!path) return true;\n const segments = path.split(sep);\n if (segments.some((segment) => SKIPPED_DIRECTORIES.has(segment))) return false;\n if (path === '.env' || (segments[0] === '.env' && path !== '.env.example')) return false;\n return true;\n}\n\nasync function copyRuntime(runtime: string, target: string): Promise<void> {\n await mkdir(target, { recursive: true });\n await cp(runtime, target, {\n recursive: true,\n force: true,\n errorOnExist: false,\n filter: (source) => shouldCopy(source, runtime),\n });\n}\n\nasync function ensureEnvFile(\n target: string,\n falKey?: string,\n higgsfieldKey?: string,\n): Promise<void> {\n const envPath = join(target, '.env');\n let content: string;\n if (existsSync(envPath)) {\n content = await readFile(envPath, 'utf8');\n } else {\n const examplePath = join(target, '.env.example');\n content = existsSync(examplePath)\n ? await readFile(examplePath, 'utf8')\n : '# Local secrets. This file is gitignored.\\n';\n }\n if (falKey) content = upsertEnv(content, 'FAL_KEY', falKey.trim());\n if (!/^FAL_KEY=/m.test(content)) content = `${content.trimEnd()}\\nFAL_KEY=\\n`;\n if (higgsfieldKey) content = upsertEnv(content, 'HIGGSFIELD_API_KEY', higgsfieldKey.trim());\n if (!/^HIGGSFIELD_API_KEY=/m.test(content)) {\n content = `${content.trimEnd()}\\nHIGGSFIELD_API_KEY=\\n`;\n }\n await writeFile(envPath, content, { encoding: 'utf8', mode: 0o600 });\n await chmod(envPath, 0o600).catch(() => undefined);\n}\n\nexport function writeMcpConfig(target: string, suno: boolean): void {\n const path = join(target, '.mcp.json');\n let config: { mcpServers?: Record<string, unknown> } = {};\n if (existsSync(path)) {\n try {\n config = JSON.parse(readFileSync(path, 'utf8')) as { mcpServers?: Record<string, unknown> };\n } catch {\n config = {};\n }\n }\n config.mcpServers ??= {};\n if (suno) {\n config.mcpServers.suno = { type: 'http', url: 'https://api.suno.com/mcp' };\n } else {\n delete config.mcpServers.suno;\n }\n writeFileSyncJson(path, config);\n}\n\nfunction writeFileSyncJson(path: string, value: unknown): void {\n // Small synchronous write keeps init call sites simple and lets the MCP\n // config be produced before dependency installation.\n writeFileSync(path, `${JSON.stringify(value, null, 2)}\\n`, 'utf8');\n}\n\nfunction writeMarker(target: string, files: Record<string, string>, projectSlug?: string): void {\n const marker: WorkspaceMarker = {\n version: 1,\n runtimeVersion: ownVersion(),\n created: new Date().toISOString(),\n ...(projectSlug ? { project: projectSlug } : {}),\n files,\n };\n writeFileSyncJson(join(target, WORKSPACE_MARKER), marker);\n}\n\nfunction initGit(target: string): boolean {\n if (existsSync(join(target, '.git')) || !commandExists('git')) return false;\n const result = spawnSync('git', ['init', '-b', 'main'], { cwd: target, stdio: 'inherit' });\n if (result.status === 0) return true;\n const fallback = spawnSync('git', ['init'], { cwd: target, stdio: 'inherit' });\n return fallback.status === 0;\n}\n\nasync function createFirstProject(\n target: string,\n project: FirstProjectOptions,\n warnings: string[],\n): Promise<string | undefined> {\n const projectDir = join(target, 'projects', project.slug);\n if (existsSync(projectDir)) {\n warnings.push(`Project \"${project.slug}\" already exists; the bundled project was kept.`);\n return undefined;\n }\n await createProject({\n slug: project.slug,\n title: project.title,\n budget: project.budget,\n root: target,\n songProvider: project.song,\n imageProvider: project.image,\n videoProvider: project.video,\n });\n return project.slug;\n}\n\nfunction gettingStarted(target: string, result: InitResult, options: InitOptions): string {\n const project = options.project;\n const lines = [\n '# Your coreslopper workspace',\n '',\n `Created ${new Date().toISOString()} with coreslopper ${result.runtimeVersion}.`,\n '',\n '## Workspace',\n '',\n `- Location: \\`${target}\\``,\n ...(project\n ? [\n `- First project: \\`${project.slug}\\` (budget $${project.budget.toFixed(2)}, song: ${project.song}, visuals: ${project.image})`,\n ]\n : ['- No first project yet. Create one with `npm run cli -- new <slug> --budget 50`.']),\n '',\n '## Next steps',\n '',\n '```bash',\n ...(result.installed ? [] : ['npm install']),\n ...(result.uvSynced ? [] : ['npm run python:sync']),\n 'npm run cli -- doctor',\n 'npm run demo:preview',\n 'claude',\n '```',\n '',\n 'In Claude Code:',\n '',\n '```text',\n ...(options.suno === false ? [] : ['/mcp # authenticate Suno once']),\n ...(project ? [`/video-next ${project.slug}`] : []),\n '```',\n '',\n '## Credentials',\n '',\n '- fal.ai: `FAL_KEY` in `.env` (gitignored).',\n '- Higgsfield: `HIGGSFIELD_API_KEY` (or `HF_API_KEY_ID` + `HF_API_KEY_SECRET`) in `.env`.',\n '- Suno: OAuth through the Suno MCP server in `.mcp.json`.',\n '',\n 'Generated audio, images, clips, and renders stay in the project folders and are gitignored.',\n '',\n ];\n return lines.join('\\n');\n}\n\nfunction ensureTools(target: string, warnings: string[]): void {\n const missing = missingTools(detectTools(target));\n if (missing.length === 0) return;\n\n if (missing.some((tool) => tool.id === 'node' || tool.id === 'npm')) {\n warnings.push('Node.js 22+ and npm are required. Install them and run \"npm install\" in the workspace.');\n }\n if (missing.some((tool) => tool.id === 'uv') && !installUv()) {\n warnings.push('uv could not be installed; audio analysis will need it later.');\n }\n if (missing.some((tool) => tool.id === 'python') && commandExists('uv') && !installPython()) {\n warnings.push('Python 3.12 could not be installed; audio analysis will need it later.');\n }\n if (missing.some((tool) => tool.id === 'ffmpeg') && !installFfmpeg(target)) {\n warnings.push('ffmpeg could not be installed; footage and loudness normalization will need it later.');\n }\n if (missing.some((tool) => tool.id === 'claude') && !installClaudeCode()) {\n warnings.push('Claude Code could not be installed; /video-next needs it.');\n }\n}\n\nexport async function initWorkspace(options: InitOptions): Promise<InitResult> {\n const target = resolve(options.targetDir);\n const runtime = resolveRuntime(options);\n\n if (existsSync(target) && !(await stat(target)).isDirectory()) {\n throw new ValidationError(`Target exists and is not a directory: ${target}`);\n }\n if (target === parse(target).root || target === homedir()) {\n throw new ValidationError('Choose a dedicated workspace directory, not the filesystem root or your home directory.');\n }\n if (target === ownPackageRoot()) {\n throw new ValidationError('Refusing to initialize a workspace inside the coreslopper package itself.');\n }\n if (isInside(runtime, target)) {\n throw new ValidationError('The workspace cannot be created inside the coreslopper runtime directory.');\n }\n if (\n existsSync(join(target, 'scripts', 'build-runtime.mjs')) ||\n existsSync(join(target, 'tsup.config.ts'))\n ) {\n throw new ValidationError(\n 'This directory is the coreslopper source repository. Create the workspace in a different directory.',\n );\n }\n if (!(await isDirectoryEmpty(target)) && !options.force) {\n throw new ValidationError(\n `Target directory is not empty: ${target}. Pass --force to merge the workspace into it.`,\n );\n }\n\n const warnings: string[] = [];\n options.onProgress?.('Copying the coreslopper runtime...');\n await copyRuntime(runtime, target);\n\n options.onProgress?.('Writing credentials and MCP configuration...');\n await ensureEnvFile(target, options.falKey, options.higgsfieldKey);\n writeMcpConfig(target, options.suno !== false);\n\n if (options.tools) {\n options.onProgress?.('Installing missing tools...');\n ensureTools(target, warnings);\n }\n\n const gitInitialized = options.git === false ? false : initGit(target);\n\n const projectSlug = options.project\n ? await createFirstProject(target, options.project, warnings)\n : undefined;\n\n writeMarker(target, await hashRuntime(runtime), projectSlug);\n\n let installed = false;\n let uvSynced = false;\n if (options.install !== false) {\n options.onProgress?.('Installing Node and Python dependencies...');\n try {\n const setup = runSetup(target);\n installed = setup.npm;\n uvSynced = setup.uv;\n if (setup.warning) warnings.push(setup.warning);\n } catch (error) {\n warnings.push(`Dependency installation failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n const result: InitResult = {\n targetDir: target,\n runtimeVersion: ownVersion(),\n projectSlug,\n installed,\n uvSynced,\n gitInitialized,\n warnings,\n };\n\n await writeFile(join(target, 'GETTING_STARTED.md'), gettingStarted(target, result, options), 'utf8');\n return result;\n}\n","import { cp, mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { execFileSync } from 'node:child_process';\nimport {\n ConfigError,\n ValidationError,\n createInitialState,\n loadDefaults,\n repoRoot,\n writeJsonAtomic,\n writeTextAtomic,\n type ProjectConfig,\n type ProviderKind,\n} from '@coreslopper/core';\nimport { stringify } from 'yaml';\n\nexport interface NewProjectOptions {\n slug: string;\n title?: string;\n budget?: number;\n brand?: string;\n imageProvider?: ProviderKind;\n videoProvider?: ProviderKind;\n songProvider?: 'suno' | 'import' | 'mock';\n /** Workspace root. Defaults to the repository root discovered from cwd. */\n root?: string;\n}\n\nfunction titleFromSlug(slug: string): string {\n return slug\n .split('-')\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(' ');\n}\n\nfunction workflowVersion(root: string): string {\n try {\n const packageJson = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8')) as {\n version?: string;\n };\n return packageJson.version ?? '0.1.0';\n } catch {\n return '0.1.0';\n }\n}\n\nfunction workflowCommit(root: string): string | undefined {\n try {\n return execFileSync('git', ['rev-parse', '--short', 'HEAD'], {\n cwd: root,\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n timeout: 2_000,\n }).trim();\n } catch {\n return undefined;\n }\n}\n\nexport async function createProject(options: NewProjectOptions): Promise<string> {\n const slug = options.slug.trim();\n if (!/^[a-z0-9][a-z0-9-]*$/.test(slug)) {\n throw new ValidationError('Project slug must be lowercase letters, digits, and dashes.');\n }\n if (options.budget === undefined || !Number.isFinite(options.budget)) {\n throw new ConfigError('A project budget is required. Pass --budget <USD>.');\n }\n\n const root = options.root ?? repoRoot();\n const defaults = await loadDefaults(root);\n if (options.budget < defaults.budget.minimum_usd) {\n throw new ConfigError(\n `Budget must be at least $${defaults.budget.minimum_usd.toFixed(2)} (got $${options.budget.toFixed(2)}).`,\n );\n }\n\n const projectDir = join(root, 'projects', slug);\n if (existsSync(projectDir)) {\n throw new ValidationError(`Project directory already exists: ${projectDir}`);\n }\n\n const templateDir = join(root, 'templates', 'project');\n await cp(templateDir, projectDir, { recursive: true, errorOnExist: true });\n\n const config: ProjectConfig = {\n version: 1,\n slug,\n title: options.title?.trim() || titleFromSlug(slug),\n created: new Date().toISOString(),\n workflow: {\n version: workflowVersion(root),\n ...(workflowCommit(root) ? { commit: workflowCommit(root) } : {}),\n },\n budget_usd: options.budget,\n review_mode: 'auto',\n formats: {\n master: defaults.formats.master,\n derivatives: defaults.formats.derivatives.map((format) => ({\n ...format,\n fps: defaults.formats.master.fps,\n })),\n },\n providers: {\n image: options.imageProvider ?? 'mock',\n video: options.videoProvider ?? 'mock',\n song: options.songProvider ?? 'import',\n },\n song: { variants: 2 },\n brand: options.brand ?? 'example',\n models: {},\n };\n\n await writeTextAtomic(join(projectDir, 'project.yaml'), stringify(config));\n for (const file of ['brief.md', 'treatment.md', 'README.md', 'lyrics.txt', 'suno-style.txt']) {\n const path = join(projectDir, file);\n if (!existsSync(path)) continue;\n const text = await readFile(path, 'utf8');\n await writeFile(path, text.replaceAll('{{TITLE}}', config.title).replaceAll('{{SLUG}}', slug), 'utf8');\n }\n const state = createInitialState(config, config.workflow.version);\n // New projects start with an empty project state; the template carries the\n // creative placeholders that the skills fill in.\n state.stage = 'brief';\n await writeJsonAtomic(join(projectDir, 'state.json'), state);\n await writeJsonAtomic(join(projectDir, 'timing.overrides.json'), {\n version: 1,\n sections: [],\n lines: [],\n words: [],\n });\n\n for (const directory of ['audio', 'assets', 'characters', 'renders', 'review', 'brand']) {\n await mkdir(join(projectDir, directory), { recursive: true });\n }\n await writeFile(join(projectDir, 'audio', '.gitkeep'), '');\n await writeFile(join(projectDir, 'assets', '.gitkeep'), '');\n await writeFile(join(projectDir, 'characters', '.gitkeep'), '');\n await writeFile(join(projectDir, 'renders', '.gitkeep'), '');\n await writeFile(join(projectDir, 'review', '.gitkeep'), '');\n await writeFile(join(projectDir, 'brand', '.gitkeep'), '');\n\n // Validate the project shell. Timing and storyboard are intentionally absent\n // at this point; only the project config and state are checked.\n await readFile(join(projectDir, 'project.yaml'), 'utf8');\n\n console.log(`Created project ${config.title} (${slug}) at ${projectDir}`);\n console.log(`Budget: $${config.budget_usd.toFixed(2)} · providers: image=${config.providers.image}, video=${config.providers.video}, song=${config.providers.song}`);\n console.log('Next: run /video-next ' + slug + ' in Claude Code, or npm run status -- ' + relativeToRoot(projectDir, root));\n return projectDir;\n}\n\nfunction relativeToRoot(path: string, root: string): string {\n return path.startsWith(root) ? path.slice(root.length + 1) : path;\n}\n","import { spawnSync } from 'node:child_process';\nimport { createHash } from 'node:crypto';\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { chmod, copyFile, mkdir, readFile, readdir, rm, rmdir, stat } from 'node:fs/promises';\nimport { dirname, join, posix, relative, resolve, sep } from 'node:path';\nimport { ValidationError } from '@coreslopper/core';\nimport { runSetup } from './tools.js';\nimport {\n WORKSPACE_MARKER,\n isWorkspace,\n ownVersion,\n runtimeDir as defaultRuntimeDir,\n type WorkspaceMarker,\n} from './workspace.js';\n\n/** Directories that never belong to the shipped workflow. */\nexport const SKIPPED_DIRECTORIES = new Set([\n '.git',\n '.cache',\n '.tools',\n '.vitest',\n '.venv',\n '__pycache__',\n '.pytest_cache',\n 'node_modules',\n 'dist',\n 'runtime',\n 'tmp',\n]);\n\n/** Suffix for the upstream version of a file that was changed on both sides. */\nexport const CONFLICT_SUFFIX = '.coreslopper-new';\n\n/** Files the workspace owns after init; update never touches them. */\nconst USER_OWNED_FILES = new Set(['.mcp.json', WORKSPACE_MARKER, 'GETTING_STARTED.md']);\n\n/** Files that are regenerated locally and always follow upstream. */\nconst ALWAYS_UPSTREAM_FILES = new Set(['package-lock.json']);\n\n/** Upstream files below these prefixes are added when missing but never overwritten or removed. */\nconst USER_OWNED_PREFIXES = ['projects/'];\n\nexport function isRuntimePath(path: string): boolean {\n if (!path) return true;\n const segments = path.split('/');\n if (segments.some((segment) => SKIPPED_DIRECTORIES.has(segment))) return false;\n if (segments.at(-1)?.endsWith(CONFLICT_SUFFIX)) return false;\n if (path === '.env' || (path.startsWith('.env.') && path !== '.env.example')) return false;\n return true;\n}\n\nfunction toPosix(path: string): string {\n return sep === '/' ? path : path.split(sep).join(posix.sep);\n}\n\n/** List runtime files as POSIX paths relative to the runtime root. */\nexport async function listRuntimeFiles(runtime: string): Promise<string[]> {\n const files: string[] = [];\n async function walk(directory: string): Promise<void> {\n for (const entry of await readdir(directory, { withFileTypes: true })) {\n const absolute = join(directory, entry.name);\n const path = toPosix(relative(runtime, absolute));\n if (!isRuntimePath(path)) continue;\n if (entry.isDirectory()) await walk(absolute);\n else if (entry.isFile()) files.push(path);\n }\n }\n await walk(runtime);\n return files.sort();\n}\n\nexport async function hashFile(path: string): Promise<string> {\n return createHash('sha256').update(await readFile(path)).digest('hex');\n}\n\n/** Hash every runtime file; the result is the baseline for the next update. */\nexport async function hashRuntime(runtime: string): Promise<Record<string, string>> {\n const hashes: Record<string, string> = {};\n for (const file of await listRuntimeFiles(runtime)) hashes[file] = await hashFile(join(runtime, file));\n return hashes;\n}\n\nexport function readMarker(target: string): WorkspaceMarker | undefined {\n const path = join(target, WORKSPACE_MARKER);\n if (!existsSync(path)) return undefined;\n try {\n return JSON.parse(readFileSync(path, 'utf8')) as WorkspaceMarker;\n } catch {\n return undefined;\n }\n}\n\nexport function writeMarkerFile(target: string, marker: WorkspaceMarker): void {\n writeFileSync(join(target, WORKSPACE_MARKER), `${JSON.stringify(marker, null, 2)}\\n`, 'utf8');\n}\n\n/** Compare two `x.y.z[-pre]` versions; prerelease tags are ignored. */\nexport function compareVersions(a: string, b: string): number {\n const parse = (value: string) => value.split('-')[0]!.split('.').map((part) => Number(part) || 0);\n const left = parse(a);\n const right = parse(b);\n for (let index = 0; index < Math.max(left.length, right.length); index += 1) {\n const difference = (left[index] ?? 0) - (right[index] ?? 0);\n if (difference !== 0) return Math.sign(difference);\n }\n return 0;\n}\n\nexport type UpdateAction =\n | 'added'\n | 'updated'\n | 'removed'\n | 'conflict'\n | 'overwritten'\n | 'kept-removed-upstream'\n | 'skipped-deleted-locally';\n\nexport interface UpdateChange {\n path: string;\n action: UpdateAction;\n}\n\nexport interface UpdateOptions {\n targetDir: string;\n runtimeDir?: string;\n /** Overwrite locally changed files and allow a downgrade. */\n force?: boolean;\n dryRun?: boolean;\n install?: boolean;\n onProgress?: (message: string) => void;\n}\n\nexport interface UpdateResult {\n targetDir: string;\n fromVersion?: string;\n toVersion: string;\n /** False when the workspace had no recorded baseline (created before `update` existed). */\n hadBaseline: boolean;\n changes: UpdateChange[];\n /** Locally changed files that upstream did not touch. */\n keptLocal: number;\n dryRun: boolean;\n installed: boolean;\n uvSynced: boolean;\n dirtyGit: boolean;\n warnings: string[];\n}\n\nfunction resolveRuntime(runtimeDir?: string): string {\n const runtime = runtimeDir ? resolve(runtimeDir) : defaultRuntimeDir();\n if (!runtime || !existsSync(join(runtime, 'templates', 'project'))) {\n throw new ValidationError('Runtime assets not found. Run \"npx coreslopper@latest update\" from the workspace.');\n }\n return runtime;\n}\n\nfunction runtimeVersion(runtime: string): string {\n try {\n const packageJson = JSON.parse(readFileSync(join(runtime, 'package.json'), 'utf8')) as { version?: string };\n return packageJson.version ?? ownVersion();\n } catch {\n return ownVersion();\n }\n}\n\nfunction gitIsDirty(target: string): boolean {\n if (!existsSync(join(target, '.git'))) return false;\n const result = spawnSync('git', ['status', '--porcelain'], { cwd: target, encoding: 'utf8' });\n return result.status === 0 && result.stdout.trim().length > 0;\n}\n\nasync function install(source: string, destination: string): Promise<void> {\n await mkdir(dirname(destination), { recursive: true });\n await copyFile(source, destination);\n await chmod(destination, (await stat(source)).mode).catch(() => undefined);\n}\n\n/** Remove now-empty parent directories of a deleted file, up to the workspace root. */\nasync function pruneEmptyDirectories(target: string, file: string): Promise<void> {\n let directory = dirname(join(target, file));\n while (directory !== target && directory.startsWith(target)) {\n if ((await readdir(directory)).length > 0) return;\n await rmdir(directory);\n directory = dirname(directory);\n }\n}\n\nexport async function updateWorkspace(options: UpdateOptions): Promise<UpdateResult> {\n const target = resolve(options.targetDir);\n const runtime = resolveRuntime(options.runtimeDir);\n\n if (!isWorkspace(target)) {\n throw new ValidationError(`No coreslopper workspace found at ${target}. Create one with \"npx coreslopper init\".`);\n }\n if (existsSync(join(target, 'scripts', 'build-runtime.mjs')) || existsSync(join(target, 'tsup.config.ts'))) {\n throw new ValidationError('This is the coreslopper source repository. Update it with git, not \"coreslopper update\".');\n }\n\n const dirtyGit = gitIsDirty(target);\n const marker = readMarker(target);\n const fromVersion = marker?.runtimeVersion;\n const toVersion = runtimeVersion(runtime);\n if (fromVersion && compareVersions(toVersion, fromVersion) < 0 && !options.force) {\n throw new ValidationError(\n `The workspace runs coreslopper ${fromVersion}, newer than ${toVersion}. Use \"npx coreslopper@latest update\", or pass --force to downgrade.`,\n );\n }\n\n const baseline = marker?.files;\n const hadBaseline = baseline !== undefined;\n const base = baseline ?? {};\n const dryRun = Boolean(options.dryRun);\n const changes: UpdateChange[] = [];\n const nextFiles: Record<string, string> = {};\n let keptLocal = 0;\n\n options.onProgress?.(`Comparing the workspace with coreslopper ${toVersion}...`);\n const upstream = await hashRuntime(runtime);\n\n const record = (path: string, action: UpdateAction) => changes.push({ path, action });\n const apply = async (path: string) => {\n if (!dryRun) await install(join(runtime, path), join(target, path));\n };\n\n for (const [path, upstreamHash] of Object.entries(upstream)) {\n nextFiles[path] = upstreamHash;\n if (USER_OWNED_FILES.has(path)) continue;\n\n const local = join(target, path);\n const localExists = existsSync(local);\n const baseHash = base[path];\n\n if (!localExists) {\n if (baseHash !== undefined && !ALWAYS_UPSTREAM_FILES.has(path)) {\n // Deleted on purpose; mention it only when upstream changed the file.\n if (upstreamHash !== baseHash) record(path, 'skipped-deleted-locally');\n continue;\n }\n await apply(path);\n record(path, 'added');\n continue;\n }\n\n const localHash = await hashFile(local);\n if (localHash === upstreamHash) continue;\n if (USER_OWNED_PREFIXES.some((prefix) => path.startsWith(prefix))) continue;\n\n if (ALWAYS_UPSTREAM_FILES.has(path) || localHash === baseHash) {\n await apply(path);\n record(path, 'updated');\n continue;\n }\n\n if (baseHash !== undefined && upstreamHash === baseHash) {\n // Changed locally, unchanged upstream: the local version wins.\n keptLocal += 1;\n continue;\n }\n\n // Changed on both sides, or no baseline to tell.\n if (options.force) {\n await apply(path);\n record(path, 'overwritten');\n } else {\n if (!dryRun) await install(join(runtime, path), `${local}${CONFLICT_SUFFIX}`);\n record(path, 'conflict');\n }\n }\n\n for (const [path, baseHash] of Object.entries(base)) {\n if (path in upstream || USER_OWNED_FILES.has(path)) continue;\n if (USER_OWNED_PREFIXES.some((prefix) => path.startsWith(prefix))) continue;\n const local = join(target, path);\n if (!existsSync(local)) continue;\n if ((await hashFile(local)) === baseHash) {\n if (!dryRun) {\n await rm(local);\n await pruneEmptyDirectories(target, path);\n }\n record(path, 'removed');\n } else {\n record(path, 'kept-removed-upstream');\n }\n }\n\n const warnings: string[] = [];\n if (dirtyGit && !dryRun) {\n warnings.push('The workspace had uncommitted changes before the update; \"git diff\" now mixes them with the update.');\n }\n if (!hadBaseline) {\n warnings.push(\n 'This workspace has no recorded baseline, so every file that differs from upstream counts as a local change. Review the conflicts, or commit and rerun with --force.',\n );\n }\n\n let installed = false;\n let uvSynced = false;\n if (!dryRun) {\n writeMarkerFile(target, {\n version: 1,\n runtimeVersion: toVersion,\n created: marker?.created ?? new Date().toISOString(),\n ...(marker?.project ? { project: marker.project } : {}),\n updated: new Date().toISOString(),\n files: nextFiles,\n });\n\n if (options.install !== false && changes.length > 0) {\n options.onProgress?.('Installing Node and Python dependencies...');\n try {\n const setup = runSetup(target);\n installed = setup.npm;\n uvSynced = setup.uv;\n if (setup.warning) warnings.push(setup.warning);\n } catch (error) {\n warnings.push(`Dependency installation failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n }\n\n return {\n targetDir: target,\n fromVersion,\n toVersion,\n hadBaseline,\n changes,\n keptLocal,\n dryRun,\n installed,\n uvSynced,\n dirtyGit,\n warnings,\n };\n}\n\nconst LABELS: Record<UpdateAction, string> = {\n added: '+ added',\n updated: '~ updated',\n removed: '- removed',\n overwritten: '! overwritten',\n conflict: '! conflict',\n 'kept-removed-upstream': '= kept (removed upstream, changed locally)',\n 'skipped-deleted-locally': '= skipped (deleted locally)',\n};\n\nexport function printUpdateSummary(result: UpdateResult): void {\n const from = result.fromVersion ?? 'unknown';\n const verb = result.dryRun ? 'Would update' : 'Updated';\n console.log(`✔ ${verb} ${result.targetDir}: coreslopper ${from} → ${result.toVersion}`);\n if (result.changes.length === 0) console.log(' Workflow files are already up to date.');\n for (const change of result.changes) {\n const suffix = change.action === 'conflict' ? ` → ${change.path}${CONFLICT_SUFFIX}` : '';\n console.log(` ${LABELS[change.action]}: ${change.path}${suffix}`);\n }\n if (result.keptLocal > 0) console.log(` ${result.keptLocal} locally changed file(s) kept; upstream did not change them.`);\n for (const warning of result.warnings) console.warn(` ! ${warning}`);\n\n const conflicts = result.changes.filter((change) => change.action === 'conflict').length;\n if (conflicts > 0) {\n console.log('');\n console.log(\n `${conflicts} file(s) changed both locally and upstream. Merge each \"${CONFLICT_SUFFIX}\" file into the original, then delete it.`,\n );\n }\n if (result.dryRun) {\n console.log('');\n console.log('Dry run: nothing was written.');\n } else if (result.changes.length > 0 && !result.installed) {\n console.log('');\n console.log('Next: npm install && npm run python:sync');\n }\n}\n","import {\n cancel,\n confirm,\n intro,\n isCancel,\n log,\n note,\n outro,\n password,\n select,\n spinner,\n text,\n} from '@clack/prompts';\nimport { resolve } from 'node:path';\nimport { ValidationError } from '@coreslopper/core';\nimport { resolveHiggsfieldCredentials } from '@coreslopper/providers';\nimport {\n defaultProjectSlug,\n initWorkspace,\n isDirectoryEmpty,\n type FirstProjectOptions,\n type InitResult,\n type SongProvider,\n type VisualProvider,\n} from './init.js';\nimport {\n detectTools,\n formatTools,\n installClaudeCode,\n installFfmpeg,\n installPython,\n installUv,\n missingTools,\n validateFalKey,\n validateHiggsfieldKey,\n} from './tools.js';\n\nexport interface OnboardOptions {\n dir?: string;\n force?: boolean;\n install?: boolean;\n git?: boolean;\n installTools?: boolean;\n song?: SongProvider;\n visual?: VisualProvider;\n imageProvider?: VisualProvider;\n videoProvider?: VisualProvider;\n budget?: number;\n projectSlug?: string;\n title?: string;\n falKey?: string;\n higgsfieldKey?: string;\n suno?: boolean;\n noProject?: boolean;\n}\n\nfunction unwrap<T>(value: T): Exclude<T, symbol> {\n if (isCancel(value)) {\n cancel('Onboarding cancelled.');\n process.exit(130);\n }\n return value as Exclude<T, symbol>;\n}\n\nfunction validSlug(value: string): string | undefined {\n if (!/^[a-z0-9][a-z0-9-]*$/.test(value)) {\n return 'Use lowercase letters, digits, and dashes; start with a letter or digit.';\n }\n return undefined;\n}\n\nasync function chooseTarget(options: OnboardOptions): Promise<string> {\n if (options.dir) return resolve(options.dir);\n\n if (await isDirectoryEmpty(process.cwd())) return process.cwd();\n\n const answer = unwrap(\n await text({\n message: 'Where should the workspace live?',\n placeholder: 'coreslopper-studio',\n defaultValue: 'coreslopper-studio',\n }),\n );\n return resolve(answer);\n}\n\nasync function ensureTargetIsUsable(target: string, force = false): Promise<void> {\n if (await isDirectoryEmpty(target)) return;\n if (force) return;\n const proceed = unwrap(\n await confirm({\n message: `${target} is not empty. Merge the workspace into it?`,\n initialValue: false,\n }),\n );\n if (!proceed) {\n cancel('Choose an empty directory, or pass --force.');\n process.exit(130);\n }\n}\n\nasync function offerTools(target: string, enabled: boolean): Promise<{ ffmpeg: boolean }> {\n const checks = detectTools(target);\n note(formatTools(checks), 'Environment');\n if (!enabled) return { ffmpeg: false };\n\n const missing = missingTools(checks);\n if (missing.some((tool) => tool.id === 'node' || tool.id === 'npm')) {\n cancel('Node.js 22+ and npm are required. Install them, then run the onboarding again.');\n process.exit(1);\n }\n\n let uvReady = Boolean(checks.find((tool) => tool.id === 'uv')?.ok);\n if (!uvReady && missing.some((tool) => tool.id === 'uv')) {\n const install = unwrap(\n await confirm({\n message: 'Install uv? It manages the Python audio-analysis environment.',\n initialValue: true,\n }),\n );\n if (install) uvReady = installUv();\n if (!uvReady) log.warn('uv was not installed. Audio analysis will need it later.');\n }\n\n const pythonReady = Boolean(checks.find((tool) => tool.id === 'python')?.ok);\n if (!pythonReady && uvReady) {\n const install = unwrap(\n await confirm({\n message: 'Install Python 3.12 with uv?',\n initialValue: true,\n }),\n );\n if (install && !installPython()) {\n log.warn('Python 3.12 was not installed. Audio analysis will need it later.');\n }\n }\n\n let installFfmpegNow = false;\n if (missing.some((tool) => tool.id === 'ffmpeg')) {\n installFfmpegNow = unwrap(\n await confirm({\n message: 'Install ffmpeg? Optional, but needed for footage and loudness normalization.',\n initialValue: false,\n }),\n );\n }\n\n if (missing.some((tool) => tool.id === 'claude')) {\n const install = unwrap(\n await confirm({\n message: 'Install Claude Code globally? The /video-next pipeline runs there.',\n initialValue: true,\n }),\n );\n if (install && !installClaudeCode()) {\n log.warn('Claude Code was not installed. Install it with \"npm install -g @anthropic-ai/claude-code\".');\n }\n }\n\n if (missing.some((tool) => tool.id === 'git')) {\n log.warn('git is not installed. The workspace still works, but you cannot version it.');\n }\n\n return { ffmpeg: installFfmpegNow };\n}\n\nasync function chooseFalKey(options: OnboardOptions, needed: boolean): Promise<string | undefined> {\n let key = options.falKey ?? process.env.FAL_KEY;\n if (!needed) return key;\n\n if (!key) {\n key = unwrap(\n await password({\n message: 'fal.ai API key (leave empty to add it later)',\n mask: '•',\n }),\n );\n }\n\n if (!key) {\n log.warn('No FAL_KEY yet. Add it to .env before generating paid assets.');\n return undefined;\n }\n\n const check = spinner();\n check.start('Checking the fal.ai key...');\n const result = await validateFalKey(key);\n if (result.status === 'valid') {\n check.stop('fal.ai key is valid.');\n return key;\n }\n\n check.stop(`Could not verify the fal.ai key (${result.message}).`);\n if (result.status === 'invalid') {\n const keep = unwrap(\n await confirm({\n message: 'The key was rejected. Keep it in .env anyway?',\n initialValue: false,\n }),\n );\n if (!keep) return undefined;\n }\n return key;\n}\n\nasync function chooseHiggsfieldKey(\n options: OnboardOptions,\n needed: boolean,\n): Promise<string | undefined> {\n let key = options.higgsfieldKey ?? resolveHiggsfieldCredentials();\n if (!needed) return key;\n\n if (!key) {\n key = unwrap(\n await password({\n message: 'Higgsfield API credential key_id:key_secret (leave empty to add it later)',\n mask: '•',\n }),\n );\n }\n\n if (!key) {\n log.warn('No Higgsfield credential yet. Add HIGGSFIELD_API_KEY to .env before generating paid assets.');\n return undefined;\n }\n\n const check = spinner();\n check.start('Checking the Higgsfield credential...');\n const result = await validateHiggsfieldKey(key);\n if (result.status === 'valid') {\n check.stop('Higgsfield credential is valid.');\n return key;\n }\n\n check.stop(`Could not verify the Higgsfield credential (${result.message}).`);\n if (result.status === 'invalid') {\n const keep = unwrap(\n await confirm({\n message: 'The credential was rejected. Keep it in .env anyway?',\n initialValue: false,\n }),\n );\n if (!keep) return undefined;\n }\n return key;\n}\n\nfunction printNextSteps(target: string, result: InitResult, options: OnboardOptions): void {\n const project = result.projectSlug;\n const lines = [\n `Workspace: ${target}`,\n ...(project ? [`Project: ${project}`] : []),\n '',\n 'Next:',\n ` cd ${target}`,\n ...(result.installed ? [] : [' npm install']),\n ...(result.uvSynced ? [] : [' npm run python:sync']),\n ' npm run cli -- doctor',\n ' npm run demo:preview',\n ...(project ? [] : [' npm run cli -- new <slug> --budget 50']),\n ' claude',\n '',\n 'In Claude Code:',\n ...(options.suno === false ? [] : [' /mcp authenticate Suno once']),\n ...(project ? [` /video-next ${project}`] : []),\n ];\n outro(lines.join('\\n'));\n}\n\nexport async function onboard(options: OnboardOptions = {}): Promise<InitResult> {\n intro('coreslopper — from brief to finished music video');\n\n const target = await chooseTarget(options);\n await ensureTargetIsUsable(target, options.force);\n\n const checks = detectTools(target);\n if (!checks.find((tool) => tool.id === 'node')?.ok) {\n cancel('Node.js 22 or newer is required.');\n process.exit(1);\n }\n if (!checks.find((tool) => tool.id === 'npm')?.ok) {\n cancel('npm is required to install the workspace dependencies.');\n process.exit(1);\n }\n\n const { ffmpeg: installFfmpegNow } = await offerTools(target, options.installTools !== false);\n\n let falKey: string | undefined = options.falKey ?? process.env.FAL_KEY;\n let higgsfieldKey: string | undefined =\n options.higgsfieldKey ?? resolveHiggsfieldCredentials();\n let project: FirstProjectOptions | null = null;\n\n if (!options.noProject) {\n const song =\n options.song ??\n (unwrap(\n await select({\n message: 'How will you get the song?',\n options: [\n { value: 'import', label: 'Import an existing audio file', hint: 'works immediately, no Suno account' },\n { value: 'suno', label: 'Generate with Suno', hint: 'OAuth through the Suno MCP server' },\n ],\n initialValue: 'import',\n }),\n ) as SongProvider);\n\n const visual =\n options.visual ??\n (options.imageProvider && options.videoProvider\n ? options.imageProvider\n : (unwrap(\n await select({\n message: 'How should visuals be generated?',\n options: [\n { value: 'mock', label: 'Mock provider', hint: 'motion graphics and dry runs, no API key' },\n { value: 'fal', label: 'fal.ai', hint: 'AI keyframes and image-to-video, needs FAL_KEY' },\n {\n value: 'higgsfield',\n label: 'Higgsfield',\n hint: 'AI keyframes and image-to-video, needs HIGGSFIELD_API_KEY',\n },\n ],\n initialValue: 'mock',\n }),\n ) as VisualProvider));\n const image = options.imageProvider ?? visual;\n const video = options.videoProvider ?? visual;\n\n falKey = await chooseFalKey(options, image === 'fal' || video === 'fal');\n higgsfieldKey = await chooseHiggsfieldKey(\n options,\n image === 'higgsfield' || video === 'higgsfield',\n );\n\n const budget =\n options.budget ??\n Number(\n unwrap(\n await text({\n message: 'First project budget (USD)',\n defaultValue: '50',\n validate: (value) => {\n const number = Number(value);\n return Number.isFinite(number) && number >= 5 ? undefined : 'Enter a budget of at least $5.';\n },\n }),\n ),\n );\n if (!Number.isFinite(budget) || budget < 5) throw new ValidationError('Budget must be at least $5.');\n\n const projectSlug =\n options.projectSlug ??\n unwrap(\n await text({\n message: 'First project slug',\n defaultValue: defaultProjectSlug(target),\n validate: (value) => validSlug(value ?? ''),\n }),\n );\n const slugError = validSlug(projectSlug);\n if (slugError) throw new ValidationError(slugError);\n\n project = { slug: projectSlug, title: options.title, budget, song, image, video };\n }\n\n const install =\n options.install ??\n (unwrap(\n await confirm({\n message: 'Install Node and Python dependencies now? (takes a few minutes)',\n initialValue: true,\n }),\n ) as boolean);\n const git =\n options.git ??\n (unwrap(\n await confirm({\n message: 'Initialize a git repository in the workspace?',\n initialValue: true,\n }),\n ) as boolean);\n\n const summary = [\n `Target: ${target}`,\n `Project: ${project ? project.slug : 'none'}`,\n `Song: ${project ? project.song : '-'}`,\n `Visuals: ${project ? (project.image === project.video ? project.image : `image=${project.image}, video=${project.video}`) : '-'}`,\n `Budget: ${project ? `$${project.budget.toFixed(2)}` : '-'}`,\n `Install: ${install ? 'yes' : 'no'}`,\n `Git: ${git ? 'yes' : 'no'}`,\n ].join('\\n');\n note(summary, 'Ready to create');\n\n const proceed = unwrap(\n await confirm({\n message: 'Create the workspace now?',\n initialValue: true,\n }),\n );\n if (!proceed) {\n cancel('No files were written.');\n process.exit(130);\n }\n\n const result = await initWorkspace({\n targetDir: target,\n force: true,\n install,\n git,\n project,\n falKey,\n higgsfieldKey,\n suno: options.suno !== false,\n onProgress: (message) => log.step(message),\n });\n\n if (installFfmpegNow) {\n log.step('Installing ffmpeg...');\n if (!installFfmpeg(target)) log.warn('ffmpeg was not installed. Install it later for footage and loudness.');\n }\n\n for (const warning of result.warnings) log.warn(warning);\n if (!result.installed && install) {\n log.error('Dependency installation did not finish. Run npm install in the workspace.');\n process.exitCode = 1;\n }\n\n printNextSteps(target, result, options);\n return result;\n}\n","import { existsSync } from 'node:fs';\nimport {\n effectiveBatchCap,\n formatUsd,\n loadProject,\n nextStage,\n remainingBudget,\n stageTable,\n} from '@coreslopper/core';\n\nexport async function printStatus(projectDir: string): Promise<void> {\n const loaded = await loadProject(projectDir);\n const state = loaded.state;\n console.log(`${loaded.config.title} (${loaded.config.slug})`);\n console.log(`Stage: ${state.stage} · Overall: ${state.status}`);\n console.log(stageTable(state).join('\\n'));\n console.log(\n `Budget: ${formatUsd(state.budget.spentUsd)} spent / ${formatUsd(state.budget.totalUsd)} total · ${formatUsd(remainingBudget(state))} remaining · batch cap ${formatUsd(effectiveBatchCap(loaded.config, state))}`,\n );\n const next = nextStage(state);\n console.log(`Next: ${next ? `${next.id} (${next.skills.join(', ')})` : 'done'}`);\n if (!existsSync(loaded.paths.state)) console.log('Note: state.json does not exist yet; showing the initial state.');\n}\n","import { resolve } from 'node:path';\nimport { ZodError } from 'zod';\nimport { BudgetError, ValidationError, formatZodError } from '@coreslopper/core';\n\nexport function printError(error: unknown): void {\n if (error instanceof ValidationError) {\n console.error(`✖ ${error.message}`);\n for (const detail of error.details) console.error(` - ${detail}`);\n return;\n }\n if (error instanceof ZodError) {\n console.error('✖ Validation failed');\n for (const detail of formatZodError(error)) console.error(` - ${detail}`);\n return;\n }\n if (error instanceof BudgetError) {\n console.error(`✖ Budget: ${error.message}`);\n return;\n }\n if (error instanceof Error) {\n console.error(`✖ ${error.message}`);\n return;\n }\n console.error(`✖ ${String(error)}`);\n}\n\nexport async function run(action: () => Promise<void>): Promise<void> {\n try {\n await action();\n } catch (error) {\n printError(error);\n process.exitCode = 1;\n }\n}\n\nexport function projectDirFromArg(arg: string | undefined, fallback = 'projects/demo'): string {\n return resolve(process.cwd(), arg ?? fallback);\n}\n\nexport function formatSeconds(value: number): string {\n const minutes = Math.floor(value / 60);\n const seconds = value - minutes * 60;\n return `${minutes}:${seconds.toFixed(2).padStart(5, '0')}`;\n}\n\nexport function parseCsv(value: string | undefined): string[] {\n if (!value) return [];\n return value\n .split(',')\n .map((item) => item.trim())\n .filter(Boolean);\n}\n","import {\n ValidationError,\n loadModelsConfig,\n loadProject,\n resolveStoryboard,\n writeEffectiveTiming,\n type LoadedProject,\n type ResolvedStoryboard,\n} from '@coreslopper/core';\nimport { basename } from 'node:path';\n\nexport interface ValidatedProject {\n project: LoadedProject;\n resolved: ResolvedStoryboard;\n}\n\nexport async function validateProject(projectDir: string, options: { write?: boolean } = {}): Promise<ValidatedProject> {\n const project = await loadProject(projectDir);\n const { config, effectiveTiming, storyboard, style, characters, paths } = project;\n\n if (!effectiveTiming) {\n throw new ValidationError(\n `timing.json is missing in ${paths.root}. Run the audio-analysis stage before validating the storyboard.`,\n );\n }\n if (!storyboard) throw new ValidationError(`storyboard.yaml is missing in ${paths.root}.`);\n if (!style) throw new ValidationError(`style.yaml is missing in ${paths.root}.`);\n if (!characters) throw new ValidationError(`characters.yaml is missing in ${paths.root}.`);\n\n const expectedSlug = basename(paths.root);\n if (config.slug !== expectedSlug) {\n throw new ValidationError(\n `project.yaml slug \"${config.slug}\" does not match the project folder \"${expectedSlug}\".`,\n );\n }\n\n if (Math.abs(project.state.budget.totalUsd - config.budget_usd) > 1e-9) {\n throw new ValidationError(\n `state.json budget (${project.state.budget.totalUsd}) does not match project.yaml budget_usd (${config.budget_usd}).`,\n );\n }\n\n try {\n await loadModelsConfig();\n } catch (error) {\n if (error instanceof ValidationError) {\n throw new ValidationError('config/models.yaml is invalid', error.details);\n }\n throw error;\n }\n\n const resolved = resolveStoryboard(\n storyboard,\n effectiveTiming,\n style,\n characters,\n config.formats.master.fps,\n );\n\n if (options.write !== false) {\n await writeEffectiveTiming(project);\n }\n\n return { project, resolved };\n}\n"],"mappings":"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","names":["relative","resolve","existsSync","readFileSync","join","workflowVersion","mkdir","readFile","writeFile","join","z","join","readFile","mkdir","writeFile","join","z","createHash","mkdir","readFile","writeFile","join","readFile","extname","mkdir","readFile","writeFile","dirname","extname","join","createHash","existsSync","join","args","existsSync","readFileSync","dirname","join","resolve","readFileSync","resolve","existsSync","join","dirname","existsSync","join","readFileSync","resolve","spawnSync","existsSync","readFileSync","writeFileSync","chmod","cp","mkdir","readFile","readdir","stat","writeFile","homedir","join","relative","resolve","sep","mkdir","readFile","writeFile","existsSync","readFileSync","join","execFileSync","readFileSync","join","execFileSync","existsSync","text","readFile","writeFile","mkdir","spawnSync","createHash","existsSync","readFileSync","copyFile","mkdir","readFile","stat","dirname","join","relative","resolve","join","relative","hashFile","createHash","readFile","existsSync","readFileSync","parse","runtimeDir","resolve","spawnSync","mkdir","dirname","copyFile","stat","resolve","sep","existsSync","stat","readdir","relative","resolveRuntime","join","mkdir","cp","readFile","writeFile","chmod","readFileSync","writeFileSync","spawnSync","homedir","resolve","resolve","install","resolve","existsSync","existsSync","resolve","basename","relative","resolve"]}