create-spatius-app 0.1.0-beta.1 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/package-managers.ts","../src/setup/project.ts","../src/templates/cloudflare-livekit/voices.ts","../src/setup/environment.ts","../src/setup/livekit.ts","../src/setup/livekit-install.ts","../src/setup/redaction.ts","../src/setup/success-page.ts","../src/setup/spatius-api.ts","../src/setup/spatius-auth.ts","../src/setup/spatius-resources.ts","../src/setup/wizard.ts","../src/templates.ts","../src/templates/cloudflare-livekit/index.ts","../src/templates/cloudflare-livekit/configure.ts","../src/templates/cloudflare-livekit/install.ts","../src/scaffold.ts","../src/project-directory.ts"],"sourcesContent":["export const EXIT_CODES = {\n cancelled: 130,\n filesystem: 4,\n general: 1,\n invalidArgument: 2,\n success: 0,\n targetConflict: 3,\n} as const;\n\nexport type CliErrorCode =\n | 'CANCELLED'\n | 'FILESYSTEM_ERROR'\n | 'INSTALL_FAILED'\n | 'INVALID_ARGUMENT'\n | 'PACKAGE_MANAGER_NOT_FOUND'\n | 'PACKAGE_MANAGER_UNAVAILABLE'\n | 'TARGET_NOT_DIRECTORY'\n | 'TARGET_NOT_EMPTY'\n | 'TEMPLATE_NOT_FOUND'\n | 'UNSAFE_TARGET'\n | 'UNKNOWN_ERROR';\n\ninterface CliErrorOptions {\n exitCode?: number;\n path?: string;\n recovery?: string;\n}\n\nexport class CliError extends Error {\n readonly code: CliErrorCode;\n readonly exitCode: number;\n readonly path?: string;\n readonly recovery?: string;\n\n constructor(\n code: CliErrorCode,\n message: string,\n { exitCode = EXIT_CODES.general, path, recovery }: CliErrorOptions = {},\n ) {\n super(message);\n this.name = 'CliError';\n this.code = code;\n this.exitCode = exitCode;\n this.path = path;\n this.recovery = recovery;\n }\n}\n\nexport class PromptCancelledError extends CliError {\n constructor(message = 'Project creation was cancelled.') {\n super('CANCELLED', message, {\n exitCode: EXIT_CODES.cancelled,\n recovery: 'Run the command again when you are ready.',\n });\n this.name = 'PromptCancelledError';\n }\n}\n\nexport function normalizeError(error: unknown): CliError {\n if (error instanceof CliError) {\n return error;\n }\n\n if (error instanceof Error && error.message.trim() !== '') {\n return new CliError('UNKNOWN_ERROR', error.message);\n }\n\n return new CliError(\n 'UNKNOWN_ERROR',\n 'An unexpected error occurred while creating the project.',\n );\n}\n\nexport function formatError(error: unknown): string {\n return normalizeError(error).message;\n}\n","import { execFile, spawn, type ChildProcess } from 'node:child_process';\n\nimport { CliError, EXIT_CODES } from './errors.js';\n\nexport const JAVASCRIPT_PACKAGE_MANAGERS = ['pnpm', 'bun', 'npm'] as const;\nexport const PYTHON_PACKAGE_MANAGERS = ['uv', 'pip'] as const;\n\nexport type JavaScriptPackageManager =\n (typeof JAVASCRIPT_PACKAGE_MANAGERS)[number];\nexport type PythonPackageManager = (typeof PYTHON_PACKAGE_MANAGERS)[number];\n\nexport interface CommandSpec {\n argsPrefix: string[];\n command: string;\n displayName: string;\n}\n\nexport interface ProcessInvocation {\n args: string[];\n command: string;\n}\n\nexport interface DetectedJavaScriptPackageManager {\n available: true;\n command: CommandSpec;\n name: JavaScriptPackageManager;\n version: string;\n}\n\nexport interface DetectedPythonPackageManager {\n available: true;\n command: CommandSpec;\n name: PythonPackageManager;\n pythonRuntime?: CommandSpec;\n version: string;\n}\n\nexport interface SelectedJavaScriptPackageManager {\n available: boolean;\n command: CommandSpec;\n name: JavaScriptPackageManager;\n version?: string;\n}\n\nexport interface SelectedPythonPackageManager {\n available: boolean;\n command: CommandSpec;\n name: PythonPackageManager;\n pythonRuntime?: CommandSpec;\n version?: string;\n}\n\nexport interface PackageManagerInventory {\n javascript: DetectedJavaScriptPackageManager[];\n python: DetectedPythonPackageManager[];\n}\n\nexport interface SelectedPackageManagers {\n javascript: SelectedJavaScriptPackageManager;\n python: SelectedPythonPackageManager;\n}\n\nexport type ProbeCommand = (command: CommandSpec) => Promise<string>;\n\ninterface ProbePackageManagerOptions {\n platform?: NodeJS.Platform;\n timeoutMs?: number;\n}\n\nexport function requiresWindowsCommandShell(\n command: string,\n platform: NodeJS.Platform = process.platform,\n): boolean {\n if (platform !== 'win32') {\n return false;\n }\n\n const executableName = command.split(/[\\\\/]/u).at(-1)?.toLowerCase();\n return (\n executableName !== undefined &&\n (['npm', 'pnpm', 'bun', 'uv', 'lk'].includes(executableName) ||\n executableName.endsWith('.cmd') ||\n executableName.endsWith('.bat'))\n );\n}\n\nexport function createProcessInvocation(\n command: string,\n args: readonly string[],\n platform: NodeJS.Platform = process.platform,\n environment: NodeJS.ProcessEnv = process.env,\n): ProcessInvocation {\n if (!requiresWindowsCommandShell(command, platform)) {\n return { args: [...args], command };\n }\n\n return {\n args: ['/d', '/s', '/c', command, ...args],\n command: environment.ComSpec ?? environment.COMSPEC ?? 'cmd.exe',\n };\n}\n\nasync function terminateProcessTree(\n child: ChildProcess,\n platform: NodeJS.Platform,\n): Promise<void> {\n if (child.pid === undefined) {\n child.kill('SIGKILL');\n return;\n }\n\n if (platform === 'win32') {\n await new Promise<void>((resolvePromise) => {\n execFile(\n 'taskkill.exe',\n ['/pid', String(child.pid), '/t', '/f'],\n { timeout: 2000, windowsHide: true },\n () => resolvePromise(),\n );\n });\n child.kill('SIGKILL');\n return;\n }\n\n try {\n process.kill(-child.pid, 'SIGKILL');\n } catch {\n child.kill('SIGKILL');\n }\n}\n\nexport function probePackageManagerCommand(\n command: CommandSpec,\n {\n platform = process.platform,\n timeoutMs = 3000,\n }: ProbePackageManagerOptions = {},\n): Promise<string> {\n return new Promise((resolvePromise, reject) => {\n const invocation = createProcessInvocation(\n command.command,\n [...command.argsPrefix, '--version'],\n platform,\n );\n const child = spawn(invocation.command, invocation.args, {\n detached: platform !== 'win32',\n stdio: ['ignore', 'pipe', 'pipe'],\n windowsHide: true,\n });\n let settled = false;\n let timedOut = false;\n let stderr = '';\n let stdout = '';\n\n child.stdout?.setEncoding('utf8');\n child.stderr?.setEncoding('utf8');\n child.stdout?.on('data', (chunk: string) => {\n stdout += chunk;\n });\n child.stderr?.on('data', (chunk: string) => {\n stderr += chunk;\n });\n\n const timeout = setTimeout(() => {\n timedOut = true;\n void terminateProcessTree(child, platform).finally(() => {\n if (settled) {\n return;\n }\n\n settled = true;\n reject(\n new Error(\n `${command.displayName} --version timed out after ${String(timeoutMs)}ms.`,\n ),\n );\n });\n }, timeoutMs);\n\n child.once('error', (error) => {\n if (settled || timedOut) {\n return;\n }\n\n settled = true;\n clearTimeout(timeout);\n reject(new Error(error.message, { cause: error }));\n });\n child.once('close', (code, signal) => {\n if (settled || timedOut) {\n return;\n }\n\n settled = true;\n clearTimeout(timeout);\n if (code !== 0) {\n const reason =\n signal === null ? `exit code ${String(code)}` : `signal ${signal}`;\n reject(new Error(`${command.displayName} failed with ${reason}.`));\n return;\n }\n\n resolvePromise(`${stdout}\\n${stderr}`.trim());\n });\n });\n}\n\nfunction executable(command: string, ...argsPrefix: string[]): CommandSpec {\n return {\n argsPrefix,\n command,\n displayName: [command, ...argsPrefix].join(' '),\n };\n}\n\nfunction parseVersion(output: string): string {\n return output.match(/\\d+\\.\\d+(?:\\.\\d+)?(?:-[\\w.-]+)?/u)?.[0] ?? 'unknown';\n}\n\nasync function detectJavaScriptManager(\n name: JavaScriptPackageManager,\n probe: ProbeCommand,\n): Promise<DetectedJavaScriptPackageManager | undefined> {\n const command = executable(name);\n\n try {\n return {\n available: true,\n command,\n name,\n version: parseVersion(await probe(command)),\n };\n } catch {\n return undefined;\n }\n}\n\nfunction pythonRuntimeCandidates(platform: NodeJS.Platform): CommandSpec[] {\n return platform === 'win32'\n ? [executable('py', '-3'), executable('python'), executable('python3')]\n : [executable('python3'), executable('python')];\n}\n\nasync function detectPip(\n probe: ProbeCommand,\n platform: NodeJS.Platform,\n): Promise<DetectedPythonPackageManager | undefined> {\n for (const pythonRuntime of pythonRuntimeCandidates(platform)) {\n const command = executable(\n pythonRuntime.command,\n ...pythonRuntime.argsPrefix,\n '-m',\n 'pip',\n );\n\n try {\n return {\n available: true,\n command,\n name: 'pip',\n pythonRuntime,\n version: parseVersion(await probe(command)),\n };\n } catch {\n // Try the next platform-appropriate Python launcher.\n }\n }\n\n return undefined;\n}\n\nasync function detectUv(\n probe: ProbeCommand,\n): Promise<DetectedPythonPackageManager | undefined> {\n const command = executable('uv');\n\n try {\n return {\n available: true,\n command,\n name: 'uv',\n version: parseVersion(await probe(command)),\n };\n } catch {\n return undefined;\n }\n}\n\ninterface DetectPackageManagersOptions {\n javascript?: readonly JavaScriptPackageManager[];\n platform?: NodeJS.Platform;\n probe?: ProbeCommand;\n python?: readonly PythonPackageManager[];\n}\n\nexport async function detectPackageManagers({\n javascript = JAVASCRIPT_PACKAGE_MANAGERS,\n platform = process.platform,\n probe = probePackageManagerCommand,\n python = PYTHON_PACKAGE_MANAGERS,\n}: DetectPackageManagersOptions = {}): Promise<PackageManagerInventory> {\n const [javascriptResults, pythonResults] = await Promise.all([\n Promise.all(\n javascript.map(async (name) => detectJavaScriptManager(name, probe)),\n ),\n Promise.all(\n python.map(async (name) =>\n name === 'uv' ? detectUv(probe) : detectPip(probe, platform),\n ),\n ),\n ]);\n\n return {\n javascript: javascriptResults.filter(\n (manager): manager is DetectedJavaScriptPackageManager =>\n manager !== undefined,\n ),\n python: pythonResults.filter(\n (manager): manager is DetectedPythonPackageManager =>\n manager !== undefined,\n ),\n };\n}\n\nexport function inferInvokingPackageManager(\n userAgent: string | undefined,\n): JavaScriptPackageManager | undefined {\n const name = userAgent?.split(' ')[0]?.split('/')[0];\n return JAVASCRIPT_PACKAGE_MANAGERS.find((manager) => manager === name);\n}\n\nfunction unavailableJavaScriptManager(\n name: JavaScriptPackageManager,\n): SelectedJavaScriptPackageManager {\n return {\n available: false,\n command: executable(name),\n name,\n };\n}\n\nfunction unavailablePythonManager(\n name: PythonPackageManager,\n platform: NodeJS.Platform,\n): SelectedPythonPackageManager {\n if (name === 'uv') {\n return {\n available: false,\n command: executable('uv'),\n name,\n };\n }\n\n const pythonRuntime = pythonRuntimeCandidates(platform)[0]!;\n return {\n available: false,\n command: executable(\n pythonRuntime.command,\n ...pythonRuntime.argsPrefix,\n '-m',\n 'pip',\n ),\n name,\n pythonRuntime,\n };\n}\n\nexport function selectJavaScriptPackageManager(\n inventory: PackageManagerInventory,\n explicit: JavaScriptPackageManager | undefined,\n userAgent: string | undefined,\n): SelectedJavaScriptPackageManager {\n if (explicit !== undefined) {\n return (\n inventory.javascript.find((manager) => manager.name === explicit) ??\n unavailableJavaScriptManager(explicit)\n );\n }\n\n const invoked = inferInvokingPackageManager(userAgent);\n const selected =\n inventory.javascript.find((manager) => manager.name === invoked) ??\n inventory.javascript[0];\n\n if (selected === undefined) {\n throw new CliError(\n 'PACKAGE_MANAGER_NOT_FOUND',\n 'No supported JavaScript package manager was found.',\n {\n exitCode: EXIT_CODES.invalidArgument,\n recovery: 'Install pnpm, Bun, or npm, then run the command again.',\n },\n );\n }\n\n return selected;\n}\n\nexport function selectPythonPackageManager(\n inventory: PackageManagerInventory,\n explicit: PythonPackageManager | undefined,\n platform: NodeJS.Platform = process.platform,\n): SelectedPythonPackageManager {\n if (explicit !== undefined) {\n return (\n inventory.python.find((manager) => manager.name === explicit) ??\n unavailablePythonManager(explicit, platform)\n );\n }\n\n const selected = inventory.python[0];\n if (selected === undefined) {\n throw new CliError(\n 'PACKAGE_MANAGER_NOT_FOUND',\n 'No supported Python package manager was found.',\n {\n exitCode: EXIT_CODES.invalidArgument,\n recovery:\n 'Install uv, or install Python with pip, then run the command again.',\n },\n );\n }\n\n return selected;\n}\n\nexport function assertPackageManagersAvailable(\n packageManagers: SelectedPackageManagers,\n): void {\n const unavailable = [packageManagers.javascript, packageManagers.python].find(\n (manager) => !manager.available,\n );\n\n if (unavailable !== undefined) {\n throw new CliError(\n 'PACKAGE_MANAGER_UNAVAILABLE',\n `${unavailable.name} was selected but is not available on PATH.`,\n {\n exitCode: EXIT_CODES.invalidArgument,\n recovery:\n 'Install the selected package manager, choose an available one, or use --no-install.',\n },\n );\n }\n}\n\nexport function javascriptInstallCommand(\n packageManager: JavaScriptPackageManager,\n): string {\n return `${packageManager} install`;\n}\n\nexport function javascriptRunCommand(\n packageManager: JavaScriptPackageManager,\n script: string,\n): string {\n return `${packageManager} run ${script}`;\n}\n\nexport function pythonInstallCommands(\n packageManager: SelectedPythonPackageManager,\n platform: NodeJS.Platform = process.platform,\n): string[] {\n if (packageManager.name === 'uv') {\n return ['uv sync --directory agent --extra dev'];\n }\n\n const python =\n packageManager.pythonRuntime?.displayName ??\n (platform === 'win32' ? 'py -3' : 'python3');\n const virtualEnvironmentPython =\n platform === 'win32'\n ? 'agent\\\\.venv\\\\Scripts\\\\python.exe'\n : 'agent/.venv/bin/python';\n\n return [\n `${python} -m venv agent/.venv`,\n `${virtualEnvironmentPython} -m pip install -e \"./agent[dev]\"`,\n ];\n}\n","import { lstat } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { CliError, EXIT_CODES } from '../errors.js';\n\nconst requiredProjectPaths = [\n 'package.json',\n 'wrangler.jsonc',\n '.dev.vars.example',\n 'worker/index.ts',\n 'agent/src/agent.py',\n 'agent/.env.example',\n] as const;\nconst requiredProjectDirectories = ['agent', 'worker'] as const;\n\nexport async function assertSpatiusProject(\n targetDirectory: string,\n): Promise<void> {\n try {\n const target = await lstat(targetDirectory);\n if (!target.isDirectory() || target.isSymbolicLink()) {\n throw new Error('not a regular directory');\n }\n\n await Promise.all([\n ...requiredProjectDirectories.map(async (relativePath) => {\n const stats = await lstat(join(targetDirectory, relativePath));\n if (!stats.isDirectory() || stats.isSymbolicLink()) {\n throw new Error(`${relativePath} is not a regular directory`);\n }\n }),\n ...requiredProjectPaths.map(async (relativePath) => {\n const stats = await lstat(join(targetDirectory, relativePath));\n if (!stats.isFile() || stats.isSymbolicLink()) {\n throw new Error(`${relativePath} is not a regular file`);\n }\n }),\n ]);\n } catch {\n throw new CliError(\n 'INVALID_ARGUMENT',\n 'The target is not a compatible create-spatius-app project.',\n {\n exitCode: EXIT_CODES.invalidArgument,\n path: targetDirectory,\n recovery:\n 'Run this command from a generated project, or pass its directory explicitly.',\n },\n );\n }\n}\n","// Standard Cartesia voices listed by LiveKit Inference:\n// https://docs.livekit.io/agents/models/tts/cartesia/\nexport const CHARACTER_VOICES = [\n {\n value: 'feminine',\n label: 'Feminine — Jacqueline',\n hint: 'Standard female voice · English (US)',\n voiceId: '9626c31c-bec5-4cca-baa8-f8ba9e84c8bc',\n },\n {\n value: 'masculine',\n label: 'Masculine — Blake',\n hint: 'Standard male voice · English (US)',\n voiceId: 'a167e0f3-df7e-4d52-a9c3-f949145efdab',\n },\n] as const;\n","import {\n chmod,\n lstat,\n readFile,\n rename,\n rm,\n writeFile,\n} from 'node:fs/promises';\nimport { randomUUID } from 'node:crypto';\nimport { join } from 'node:path';\n\nimport { CliError, EXIT_CODES } from '../errors.js';\n\nexport interface LiveKitCredentials {\n apiKey: string;\n apiSecret: string;\n url: string;\n}\n\nexport interface SpatiusCredentials {\n backgroundUrl?: string;\n apiKey: string;\n appId: string;\n avatarId: string;\n}\n\nexport interface CredentialBundle {\n voiceId?: string;\n liveKit: LiveKitCredentials;\n spatius: SpatiusCredentials;\n}\n\nexport const WORKER_MANAGED_KEYS = [\n 'LIVEKIT_URL',\n 'LIVEKIT_API_KEY',\n 'LIVEKIT_API_SECRET',\n 'LIVEKIT_AGENT_NAME',\n 'SPATIUS_APP_ID',\n 'SPATIUS_AVATAR_ID',\n] as const;\n\nexport const AGENT_MANAGED_KEYS = [\n 'LIVEKIT_URL',\n 'LIVEKIT_API_KEY',\n 'LIVEKIT_API_SECRET',\n 'SPATIUS_API_KEY',\n 'SPATIUS_APP_ID',\n] as const;\n\ntype ManagedKey =\n (typeof WORKER_MANAGED_KEYS)[number] | (typeof AGENT_MANAGED_KEYS)[number];\n\nexport interface CredentialFileContents {\n agent: string;\n worker: string;\n}\n\nexport type CredentialConfigurationStatus =\n 'complete' | 'inconsistent' | 'missing' | 'placeholder';\n\nexport interface CredentialFileState {\n agent?: string;\n hasManagedValues: boolean;\n status: CredentialConfigurationStatus;\n worker?: string;\n}\n\nconst assignmentPattern =\n /^\\s*(?:export\\s+)?([A-Za-z_][A-Za-z\\d_]*)\\s*=\\s*(.*)$/u;\n\nfunction parseQuotedValue(rawValue: string): string {\n const value = rawValue.trim();\n if (value.startsWith('\"')) {\n const match = value.match(/^((?:\"(?:\\\\.|[^\"\\\\])*\")).*$/u);\n if (match?.[1] !== undefined) {\n try {\n return JSON.parse(match[1]) as string;\n } catch {\n return match[1].slice(1, -1);\n }\n }\n }\n\n if (value.startsWith(\"'\")) {\n const closingQuote = value.indexOf(\"'\", 1);\n if (closingQuote !== -1) {\n return value.slice(1, closingQuote);\n }\n }\n\n return value.replace(/\\s+#.*$/u, '').trim();\n}\n\nexport function parseDotenv(contents: string): Map<string, string> {\n const values = new Map<string, string>();\n for (const line of contents.split(/\\r?\\n/u)) {\n const match = line.match(assignmentPattern);\n if (match?.[1] !== undefined && match[2] !== undefined) {\n values.set(match[1], parseQuotedValue(match[2]));\n }\n }\n\n return values;\n}\n\nexport function isPlaceholderValue(value: string | undefined): boolean {\n if (value === undefined || value.trim() === '') {\n return true;\n }\n\n const normalized = value.trim().toLowerCase();\n return (\n normalized.includes('your-') ||\n normalized.includes('your_') ||\n normalized.includes('replace-me') ||\n normalized.includes('changeme') ||\n normalized.includes('placeholder') ||\n /^<[^>]+>$/u.test(normalized)\n );\n}\n\nfunction assertSafeValue(name: string, value: string): string {\n const normalized = value.trim();\n if (isPlaceholderValue(normalized)) {\n throw new CliError(\n 'INVALID_ARGUMENT',\n `${name} must be a non-placeholder value.`,\n { exitCode: EXIT_CODES.invalidArgument },\n );\n }\n if (/\\p{Cc}/u.test(normalized)) {\n throw new CliError(\n 'INVALID_ARGUMENT',\n `${name} cannot contain control characters.`,\n { exitCode: EXIT_CODES.invalidArgument },\n );\n }\n\n return normalized;\n}\n\nexport function validateLiveKitUrl(value: string): string {\n const normalized = assertSafeValue('LIVEKIT_URL', value);\n let parsed: URL;\n try {\n parsed = new URL(normalized);\n } catch {\n throw new CliError(\n 'INVALID_ARGUMENT',\n 'LIVEKIT_URL must be a valid https:// or wss:// URL.',\n { exitCode: EXIT_CODES.invalidArgument },\n );\n }\n\n if (!['https:', 'wss:'].includes(parsed.protocol) || parsed.hostname === '') {\n throw new CliError(\n 'INVALID_ARGUMENT',\n 'LIVEKIT_URL must use https:// or wss://.',\n { exitCode: EXIT_CODES.invalidArgument },\n );\n }\n\n return normalized;\n}\n\n// Optional public presentation metadata is never required for credential completeness.\nexport function publicBackgroundUrl(\n value: string | undefined,\n): string | undefined {\n if (!value) return undefined;\n try {\n const url = new URL(value);\n return url.protocol === 'https:' && !url.username && !url.password\n ? url.href\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function validateCredentialBundle(\n credentials: CredentialBundle,\n): CredentialBundle {\n return {\n ...(credentials.voiceId === undefined\n ? {}\n : {\n voiceId: assertSafeValue('CARTESIA_VOICE_ID', credentials.voiceId),\n }),\n liveKit: {\n apiKey: assertSafeValue('LIVEKIT_API_KEY', credentials.liveKit.apiKey),\n apiSecret: assertSafeValue(\n 'LIVEKIT_API_SECRET',\n credentials.liveKit.apiSecret,\n ),\n url: validateLiveKitUrl(credentials.liveKit.url),\n },\n spatius: {\n backgroundUrl: publicBackgroundUrl(credentials.spatius.backgroundUrl),\n apiKey: assertSafeValue('SPATIUS_API_KEY', credentials.spatius.apiKey),\n appId: assertSafeValue('SPATIUS_APP_ID', credentials.spatius.appId),\n avatarId: assertSafeValue(\n 'SPATIUS_AVATAR_ID',\n credentials.spatius.avatarId,\n ),\n },\n };\n}\n\nfunction managedValues(\n contents: string | undefined,\n keys: readonly ManagedKey[],\n): Map<string, string> {\n const parsed = parseDotenv(contents ?? '');\n return new Map(\n keys.flatMap((key) => {\n const value = parsed.get(key);\n return value === undefined ? [] : [[key, value] as const];\n }),\n );\n}\n\nexport function inspectCredentialConfiguration(\n contents: Pick<CredentialFileState, 'agent' | 'worker'>,\n expectedAgentName = 'spatius-agent',\n): Omit<CredentialFileState, 'agent' | 'worker'> {\n const worker = managedValues(contents.worker, WORKER_MANAGED_KEYS);\n const agent = managedValues(contents.agent, AGENT_MANAGED_KEYS);\n const allEntries = [...worker.entries(), ...agent.entries()];\n const hasManagedValues =\n allEntries.length > 0 ||\n parseDotenv(contents.worker ?? '').has('CARTESIA_VOICE_ID');\n const hasPlaceholder = allEntries.some(([, value]) =>\n isPlaceholderValue(value),\n );\n const allPresent =\n WORKER_MANAGED_KEYS.every((key) => worker.has(key)) &&\n AGENT_MANAGED_KEYS.every((key) => agent.has(key));\n const sharedKeys = [\n 'LIVEKIT_URL',\n 'LIVEKIT_API_KEY',\n 'LIVEKIT_API_SECRET',\n 'SPATIUS_APP_ID',\n ] as const;\n const inconsistent =\n sharedKeys.some((key) => {\n const workerValue = worker.get(key);\n const agentValue = agent.get(key);\n return (\n workerValue !== undefined &&\n agentValue !== undefined &&\n !isPlaceholderValue(workerValue) &&\n !isPlaceholderValue(agentValue) &&\n workerValue !== agentValue\n );\n }) ||\n (worker.get('LIVEKIT_AGENT_NAME') !== undefined &&\n !isPlaceholderValue(worker.get('LIVEKIT_AGENT_NAME')) &&\n worker.get('LIVEKIT_AGENT_NAME') !== expectedAgentName);\n\n if (inconsistent) {\n return { hasManagedValues, status: 'inconsistent' };\n }\n if (!allPresent) {\n return { hasManagedValues, status: 'missing' };\n }\n if (hasPlaceholder) {\n return { hasManagedValues, status: 'placeholder' };\n }\n\n return { hasManagedValues, status: 'complete' };\n}\n\nfunction isMissingFile(error: unknown): boolean {\n return error instanceof Error && 'code' in error && error.code === 'ENOENT';\n}\n\nasync function readOptionalCredentialFile(\n path: string,\n): Promise<string | undefined> {\n try {\n const stats = await lstat(path);\n if (stats.isSymbolicLink() || !stats.isFile()) {\n throw new CliError(\n 'FILESYSTEM_ERROR',\n `Refusing to manage a credential path that is not a regular file: ${path}`,\n {\n exitCode: EXIT_CODES.filesystem,\n path,\n recovery: 'Replace it with a regular local file and rerun setup.',\n },\n );\n }\n\n return await readFile(path, 'utf8');\n } catch (error) {\n if (isMissingFile(error)) {\n return undefined;\n }\n throw error;\n }\n}\n\nexport async function readCredentialFileState(\n targetDirectory: string,\n): Promise<CredentialFileState> {\n const [worker, agent, workerExample] = await Promise.all([\n readOptionalCredentialFile(join(targetDirectory, '.dev.vars')),\n readOptionalCredentialFile(join(targetDirectory, 'agent', '.env.local')),\n readOptionalCredentialFile(join(targetDirectory, '.dev.vars.example')),\n ]);\n\n return {\n agent,\n ...inspectCredentialConfiguration(\n { agent, worker },\n parseDotenv(workerExample ?? '').get('LIVEKIT_AGENT_NAME'),\n ),\n worker,\n };\n}\n\nfunction serializeDotenvValue(value: string): string {\n return JSON.stringify(value);\n}\n\nexport function mergeDotenv(\n baseContents: string,\n values: Readonly<Record<string, string>>,\n): string {\n const seen = new Set<string>();\n const lines = baseContents.replace(/\\r\\n/gu, '\\n').split('\\n');\n const rendered = lines.map((line) => {\n const match = line.match(assignmentPattern);\n const key = match?.[1];\n if (key === undefined || !(key in values)) {\n return line;\n }\n\n seen.add(key);\n return `${key}=${serializeDotenvValue(values[key]!)}`;\n });\n\n while (rendered.at(-1) === '') {\n rendered.pop();\n }\n for (const [key, value] of Object.entries(values)) {\n if (!seen.has(key)) {\n rendered.push(`${key}=${serializeDotenvValue(value)}`);\n }\n }\n\n return `${rendered.join('\\n')}\\n`;\n}\n\nexport function buildCredentialFileContents(\n state: CredentialFileState,\n examples: CredentialFileContents,\n rawCredentials: CredentialBundle,\n): CredentialFileContents {\n const credentials = validateCredentialBundle(rawCredentials);\n const shared = {\n LIVEKIT_API_KEY: credentials.liveKit.apiKey,\n LIVEKIT_API_SECRET: credentials.liveKit.apiSecret,\n LIVEKIT_URL: credentials.liveKit.url,\n SPATIUS_APP_ID: credentials.spatius.appId,\n };\n\n return {\n agent: mergeDotenv(state.agent ?? examples.agent, {\n ...shared,\n SPATIUS_API_KEY: credentials.spatius.apiKey,\n }),\n worker: mergeDotenv(state.worker ?? examples.worker, {\n ...(credentials.voiceId === undefined\n ? {}\n : { CARTESIA_VOICE_ID: credentials.voiceId }),\n ...shared,\n LIVEKIT_AGENT_NAME:\n parseDotenv(examples.worker).get('LIVEKIT_AGENT_NAME') ??\n 'spatius-agent',\n SPATIUS_AVATAR_ID: credentials.spatius.avatarId,\n // Clear a previous avatar’s background when a new selection has none.\n SPATIUS_AVATAR_BACKGROUND_URL: credentials.spatius.backgroundUrl ?? '',\n }),\n };\n}\n\nexport interface AtomicCredentialFileSystem {\n chmod(path: string, mode: number): Promise<void>;\n lstat(path: string): ReturnType<typeof lstat>;\n readFile(path: string): Promise<Buffer>;\n rename(oldPath: string, newPath: string): Promise<void>;\n rm(path: string): Promise<void>;\n writeFile(\n path: string,\n contents: string | Buffer,\n options: { flag?: string; mode: number },\n ): Promise<void>;\n}\n\nconst defaultAtomicFileSystem: AtomicCredentialFileSystem = {\n chmod,\n lstat,\n readFile: (path) => readFile(path),\n rename,\n rm: (path) => rm(path, { force: true }),\n writeFile,\n};\n\ninterface AtomicTarget {\n backupMoved: boolean;\n backupPath: string;\n destinationPath: string;\n hadOriginal: boolean;\n installed: boolean;\n original?: Buffer;\n stagedPath: string;\n}\n\nasync function pathExists(\n path: string,\n fileSystem: AtomicCredentialFileSystem,\n): Promise<boolean> {\n try {\n await fileSystem.lstat(path);\n return true;\n } catch (error) {\n if (isMissingFile(error)) {\n return false;\n }\n throw error;\n }\n}\n\nexport async function writeCredentialFilesAtomically(\n targetDirectory: string,\n contents: CredentialFileContents,\n fileSystem: AtomicCredentialFileSystem = defaultAtomicFileSystem,\n): Promise<void> {\n const nonce = randomUUID();\n const targets: AtomicTarget[] = [\n {\n backupMoved: false,\n backupPath: join(targetDirectory, `.dev.vars.${nonce}.backup`),\n destinationPath: join(targetDirectory, '.dev.vars'),\n hadOriginal: false,\n installed: false,\n stagedPath: join(targetDirectory, `.dev.vars.${nonce}.tmp`),\n },\n {\n backupMoved: false,\n backupPath: join(targetDirectory, 'agent', `.env.local.${nonce}.backup`),\n destinationPath: join(targetDirectory, 'agent', '.env.local'),\n hadOriginal: false,\n installed: false,\n stagedPath: join(targetDirectory, 'agent', `.env.local.${nonce}.tmp`),\n },\n ];\n const payloads = [contents.worker, contents.agent];\n\n try {\n for (const [index, target] of targets.entries()) {\n await fileSystem.writeFile(target.stagedPath, payloads[index]!, {\n flag: 'wx',\n mode: 0o600,\n });\n target.hadOriginal = await pathExists(target.destinationPath, fileSystem);\n if (target.hadOriginal) {\n target.original = await fileSystem.readFile(target.destinationPath);\n }\n }\n\n for (const target of targets) {\n if (target.hadOriginal) {\n await fileSystem.rename(target.destinationPath, target.backupPath);\n target.backupMoved = true;\n }\n }\n\n for (const target of targets) {\n await fileSystem.rename(target.stagedPath, target.destinationPath);\n target.installed = true;\n await fileSystem.chmod(target.destinationPath, 0o600);\n }\n\n for (const target of targets) {\n await fileSystem.rm(target.backupPath);\n }\n } catch {\n const unrestoredPaths: string[] = [];\n for (const target of [...targets].reverse()) {\n try {\n if (target.backupMoved) {\n if (!(await pathExists(target.backupPath, fileSystem))) {\n // Cleanup may already have removed this backup. Recreate it away\n // from the destination so a failed write cannot truncate that file.\n await fileSystem.writeFile(target.backupPath, target.original!, {\n flag: 'wx',\n mode: 0o600,\n });\n }\n await fileSystem.rename(target.backupPath, target.destinationPath);\n } else if (target.installed) {\n await fileSystem.rm(target.destinationPath);\n }\n } catch {\n unrestoredPaths.push(target.destinationPath);\n }\n // Leave untouched originals and failed recovery backups in place.\n await fileSystem.rm(target.stagedPath).catch(() => undefined);\n }\n\n throw new CliError(\n 'FILESYSTEM_ERROR',\n 'Could not save the local credential files. ' +\n (unrestoredPaths.length === 0\n ? 'Existing files were left unchanged or restored.'\n : 'Some credential files could not be restored. Any remaining backups were kept.'),\n {\n exitCode: EXIT_CODES.filesystem,\n path: targetDirectory,\n recovery:\n unrestoredPaths.length === 0\n ? 'Check file permissions, then rerun create-spatius-app setup . --interactive.'\n : `Check file permissions and inspect the affected files (${unrestoredPaths.join(', ')}) and remaining .backup files before rerunning setup.`,\n },\n );\n }\n}\n\nexport async function readCredentialExamples(\n targetDirectory: string,\n): Promise<CredentialFileContents> {\n const [worker, agent] = await Promise.all([\n readFile(join(targetDirectory, '.dev.vars.example'), 'utf8'),\n readFile(join(targetDirectory, 'agent', '.env.example'), 'utf8'),\n ]);\n return { agent, worker };\n}\n","import { spawn, type ChildProcess } from 'node:child_process';\nimport { chmod, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\n\nimport { PromptCancelledError } from '../errors.js';\nimport { createProcessInvocation } from '../package-managers.js';\nimport {\n type LiveKitCredentials,\n parseDotenv,\n validateCredentialBundle,\n} from './environment.js';\n\nexport interface LiveKitCliProbe {\n available: boolean;\n reason?: 'incompatible' | 'missing';\n version?: string;\n}\n\ninterface CapturedCommandOptions {\n cwd?: string;\n timeoutMs?: number;\n}\n\ninterface InteractiveCommandOptions {\n cwd: string;\n}\n\nexport interface LiveKitCommandRunner {\n capture(\n command: string,\n args: readonly string[],\n options?: CapturedCommandOptions,\n ): Promise<string>;\n interactive(\n command: string,\n args: readonly string[],\n options: InteractiveCommandOptions,\n ): Promise<void>;\n}\n\nasync function terminate(child: ChildProcess): Promise<void> {\n if (child.pid === undefined) {\n child.kill('SIGKILL');\n return;\n }\n if (process.platform === 'win32') {\n await new Promise<void>((resolvePromise) => {\n const killer = spawn(\n 'taskkill.exe',\n ['/pid', String(child.pid), '/t', '/f'],\n { stdio: 'ignore', windowsHide: true },\n );\n killer.once('close', () => resolvePromise());\n killer.once('error', () => resolvePromise());\n });\n return;\n }\n\n try {\n process.kill(-child.pid, 'SIGKILL');\n } catch {\n child.kill('SIGKILL');\n }\n}\n\nfunction captureCommand(\n command: string,\n args: readonly string[],\n { cwd, timeoutMs = 3000 }: CapturedCommandOptions = {},\n): Promise<string> {\n return new Promise((resolvePromise, reject) => {\n const invocation = createProcessInvocation(command, args);\n const child = spawn(invocation.command, invocation.args, {\n ...(cwd === undefined ? {} : { cwd }),\n detached: process.platform !== 'win32',\n stdio: ['ignore', 'pipe', 'pipe'],\n windowsHide: true,\n });\n let output = '';\n let settled = false;\n\n const onData = (chunk: Buffer | string) => {\n if (output.length < 128_000) {\n output += chunk.toString();\n }\n };\n child.stdout?.on('data', onData);\n child.stderr?.on('data', onData);\n\n const timeout = setTimeout(() => {\n if (settled) return;\n settled = true;\n void terminate(child).finally(() => {\n reject(new Error(`${command} timed out.`));\n });\n }, timeoutMs);\n\n child.once('error', (error) => {\n if (settled) return;\n settled = true;\n clearTimeout(timeout);\n reject(error);\n });\n child.once('close', (code) => {\n if (settled) return;\n settled = true;\n clearTimeout(timeout);\n if (code !== 0) {\n reject(new Error(`${command} exited unsuccessfully.`));\n return;\n }\n resolvePromise(output.trim());\n });\n });\n}\n\nfunction interactiveCommand(\n command: string,\n args: readonly string[],\n { cwd }: InteractiveCommandOptions,\n): Promise<void> {\n return new Promise((resolvePromise, reject) => {\n const invocation = createProcessInvocation(command, args);\n const child = spawn(invocation.command, invocation.args, {\n cwd,\n stdio: 'inherit',\n windowsHide: true,\n });\n child.once('error', () => {\n reject(new Error('The LiveKit CLI could not be started.'));\n });\n child.once('close', (code, signal) => {\n if (signal === 'SIGINT' || signal === 'SIGTERM' || code === 130) {\n reject(new PromptCancelledError('LiveKit setup was cancelled.'));\n return;\n }\n if (code === 0) {\n resolvePromise();\n return;\n }\n reject(new Error('The LiveKit CLI credential flow did not complete.'));\n });\n });\n}\n\nexport const defaultLiveKitCommandRunner: LiveKitCommandRunner = {\n capture: captureCommand,\n interactive: interactiveCommand,\n};\n\nfunction parseVersion(output: string): string | undefined {\n return output.match(/\\d+\\.\\d+(?:\\.\\d+)?(?:-[\\w.-]+)?/u)?.[0];\n}\n\nexport async function probeLiveKitCli(\n runner: LiveKitCommandRunner = defaultLiveKitCommandRunner,\n): Promise<LiveKitCliProbe> {\n let versionOutput: string;\n try {\n versionOutput = await runner.capture('lk', ['--version']);\n } catch {\n return { available: false, reason: 'missing' };\n }\n\n try {\n const help = await runner.capture('lk', ['app', 'env', '--help']);\n if (\n !help.includes('--write') ||\n !help.includes('--destination') ||\n !help.includes('--example')\n ) {\n return {\n available: false,\n reason: 'incompatible',\n ...(parseVersion(versionOutput) === undefined\n ? {}\n : { version: parseVersion(versionOutput) }),\n };\n }\n\n return {\n available: true,\n ...(parseVersion(versionOutput) === undefined\n ? {}\n : { version: parseVersion(versionOutput) }),\n };\n } catch {\n return {\n available: false,\n reason: 'incompatible',\n ...(parseVersion(versionOutput) === undefined\n ? {}\n : { version: parseVersion(versionOutput) }),\n };\n }\n}\n\nexport function createLiveKitEnvArguments(\n temporaryDirectory: string,\n): string[] {\n return [\n 'app',\n 'env',\n '--write',\n '--destination',\n '.env.local',\n '--example',\n '.env.example',\n temporaryDirectory,\n ];\n}\n\ninterface LiveKitTemporaryFileSystem {\n chmod(path: string, mode: number): Promise<void>;\n mkdtemp(prefix: string): Promise<string>;\n readFile(path: string): Promise<string>;\n remove(path: string): Promise<void>;\n writeFile(path: string, contents: string, mode: number): Promise<void>;\n}\n\nconst defaultTemporaryFileSystem: LiveKitTemporaryFileSystem = {\n chmod,\n mkdtemp,\n readFile: (path) => readFile(path, 'utf8'),\n remove: (path) =>\n rm(path, {\n force: true,\n maxRetries: 3,\n recursive: true,\n retryDelay: 100,\n }),\n writeFile: (path, contents, mode) => writeFile(path, contents, { mode }),\n};\n\ninterface LoadLiveKitCredentialsOptions {\n fileSystem?: LiveKitTemporaryFileSystem;\n runner?: LiveKitCommandRunner;\n temporaryRoot?: string;\n}\n\nexport async function loadLiveKitCredentialsWithCli({\n fileSystem = defaultTemporaryFileSystem,\n runner = defaultLiveKitCommandRunner,\n temporaryRoot = tmpdir(),\n}: LoadLiveKitCredentialsOptions = {}): Promise<LiveKitCredentials> {\n const directory = await fileSystem.mkdtemp(\n join(temporaryRoot, 'create-spatius-app-livekit-'),\n );\n\n try {\n await fileSystem.chmod(directory, 0o700);\n await fileSystem.writeFile(\n join(directory, '.env.example'),\n 'LIVEKIT_URL=\\nLIVEKIT_API_KEY=\\nLIVEKIT_API_SECRET=\\n',\n 0o600,\n );\n await runner.interactive('lk', createLiveKitEnvArguments(directory), {\n cwd: directory,\n });\n const values = parseDotenv(\n await fileSystem.readFile(join(directory, '.env.local')),\n );\n const validated = validateCredentialBundle({\n liveKit: {\n apiKey: values.get('LIVEKIT_API_KEY') ?? '',\n apiSecret: values.get('LIVEKIT_API_SECRET') ?? '',\n url: values.get('LIVEKIT_URL') ?? '',\n },\n spatius: {\n apiKey: 'validation-only',\n appId: 'validation-only',\n avatarId: 'validation-only',\n },\n });\n return validated.liveKit;\n } catch (error) {\n if (error instanceof PromptCancelledError) throw error;\n throw new Error(\n 'LiveKit CLI did not return a complete, valid credential set.',\n { cause: error },\n );\n } finally {\n await fileSystem.remove(directory).catch(() => {\n throw new Error(\n 'The temporary LiveKit credential directory could not be removed.',\n );\n });\n }\n}\n","import { tmpdir } from 'node:os';\n\nimport {\n defaultLiveKitCommandRunner,\n type LiveKitCommandRunner,\n} from './livekit.js';\n\nexport const LIVEKIT_INSTALL_GUIDE =\n 'https://docs.livekit.io/reference/developer-tools/livekit-cli/';\n\nexport interface LiveKitInstallPlan {\n command: string;\n args: string[];\n displayCommand: string;\n}\n\n/** Only offer an installer when its prerequisites are already available. */\nexport async function planLiveKitInstall(\n update: boolean,\n platform: NodeJS.Platform = process.platform,\n runner: LiveKitCommandRunner = defaultLiveKitCommandRunner,\n): Promise<LiveKitInstallPlan | undefined> {\n try {\n if (platform === 'darwin') {\n await runner.capture('brew', ['--version']);\n const args = [update ? 'upgrade' : 'install', 'livekit-cli'];\n return {\n command: 'brew',\n args,\n displayCommand: `brew ${args.join(' ')}`,\n };\n }\n if (platform === 'win32') {\n await runner.capture('winget', ['--version']);\n const args = [\n update ? 'upgrade' : 'install',\n '--id',\n 'LiveKit.LiveKitCLI',\n '--exact',\n ];\n return {\n command: 'winget',\n args,\n displayCommand: `winget ${args.join(' ')}`,\n };\n }\n if (platform === 'linux') {\n await runner.capture('bash', ['--version']);\n await runner.capture('curl', ['--version']);\n // pipefail prevents a failed download from being reported as an install success.\n const script = 'curl -fsSL https://get.livekit.io/cli | bash';\n return {\n command: 'bash',\n args: ['-o', 'pipefail', '-c', script],\n displayCommand: script,\n };\n }\n } catch {\n // The user can install prerequisites themselves and retry in this wizard.\n }\n return undefined;\n}\n\nexport function installLiveKitCli(\n plan: LiveKitInstallPlan,\n runner: LiveKitCommandRunner = defaultLiveKitCommandRunner,\n): Promise<void> {\n return runner.interactive(plan.command, plan.args, { cwd: tmpdir() });\n}\n\nexport function authenticateLiveKitCli(\n runner: LiveKitCommandRunner = defaultLiveKitCommandRunner,\n): Promise<void> {\n return runner.interactive('lk', ['cloud', 'auth'], { cwd: tmpdir() });\n}\n","const SENSITIVE_ASSIGNMENT =\n /\\b(authorization|auth[_-]?code|code[_-]?verifier|access[_-]?token|refresh[_-]?token|api[_-]?key|api[_-]?secret|password|secret)\\b(\\s*[:=]\\s*)([\"']?)([^\\s,\"'&}]+)\\3/giu;\nconst SENSITIVE_QUERY =\n /([?&](?:auth_code|code_verifier|access_token|refresh_token|api_key|api_secret)=)[^&#\\s]+/giu;\nconst BEARER_TOKEN = /\\bBearer\\s+[A-Za-z\\d._~+/=-]+/giu;\n\nexport class SecretRedactor {\n readonly #values = new Set<string>();\n\n add(...values: Array<string | undefined>): void {\n for (const value of values) {\n const trimmed = value?.trim();\n if (trimmed !== undefined && trimmed.length >= 4) {\n this.#values.add(trimmed);\n }\n }\n }\n\n redact(value: string): string {\n let redacted = value;\n for (const secret of [...this.#values].sort(\n (left, right) => right.length - left.length,\n )) {\n redacted = redacted.replaceAll(secret, '[REDACTED]');\n }\n\n return redacted\n .replace(BEARER_TOKEN, 'Bearer [REDACTED]')\n .replace(SENSITIVE_QUERY, '$1[REDACTED]')\n .replace(SENSITIVE_ASSIGNMENT, '$1$2$3[REDACTED]$3');\n }\n\n error(error: unknown, fallback: string): Error {\n const message = error instanceof Error ? error.message : fallback;\n return new Error(this.redact(message), { cause: error });\n }\n}\n\nexport function maskSecret(value: string): string {\n const normalized = value.trim();\n if (normalized.length <= 4) {\n return '••••';\n }\n\n return `••••${normalized.slice(-4)}`;\n}\n","/** Static, offline-capable callback page. Never interpolate authentication data. */\nexport const successPage = `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <meta name=\"referrer\" content=\"no-referrer\" />\n <title>Spatius authorization complete</title>\n <style>\n :root { color-scheme: light; font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif; color: #151131; background: #f7f5f1; }\n * { box-sizing: border-box; }\n body { margin: 0; min-height: 100vh; min-height: 100svh; display: flex; flex-direction: column; background: radial-gradient(ellipse at 50% 38%, #eae6f3 0, transparent 58%); }\n a { color: inherit; text-decoration: none; }\n a:focus-visible { outline: 3px solid #6363a7; outline-offset: 5px; }\n header, footer { width: min(100% - 48px, 1120px); margin-inline: auto; display: flex; align-items: center; justify-content: space-between; gap: 20px; padding-block: 28px; }\n .brand { font-size: 24px; font-weight: 650; letter-spacing: -.9px; }\n .brand { display: inline-flex; align-items: center; gap: 8px; }\n .eyebrow { font: 11px ui-monospace, SFMono-Regular, Consolas, monospace; letter-spacing: .12em; text-transform: uppercase; color: #636174; }\n main { flex: 1; display: grid; place-items: center; padding: 48px 24px; }\n .card { width: min(100%, 620px); padding: 48px; background: #ffffffed; border: 1px solid #e8e4ee; border-radius: 24px; box-shadow: 0 24px 80px -32px #30234d30; }\n .check { display: grid; place-items: center; width: 52px; height: 52px; border: 1px solid #dcd7ed; border-radius: 50%; background: #f1eef8; color: #6363a7; margin-bottom: 28px; }\n .check svg { width: 24px; height: 24px; }\n h1 { font-size: clamp(30px, 5vw, 42px); font-weight: 550; letter-spacing: -.045em; line-height: 1.15; margin: 12px 0 16px; }\n .description { color: #636174; line-height: 1.7; font-size: 15px; margin: 0; max-width: 420px; }\n .terminal { display: flex; align-items: center; gap: 16px; padding: 20px; margin: 28px 0 32px; background: #f7f5f9; border: 1px solid #e8e4ee; border-radius: 12px; }\n .terminal-icon { font: 20px ui-monospace, SFMono-Regular, Consolas, monospace; color: #6363a7; }\n .terminal strong { display: block; font-size: 14px; font-weight: 600; }\n .terminal p { margin: 5px 0 0; font-size: 13px; color: #636174; line-height: 1.5; }\n nav { border-top: 1px solid #eeebf1; padding-top: 24px; }\n nav .eyebrow { display: block; margin-bottom: 14px; }\n .links { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }\n .links a { display: flex; align-items: center; justify-content: space-between; gap: 8px; min-height: 46px; padding: 12px 14px; border: 1px solid #e8e4ee; border-radius: 9px; font-size: 13px; font-weight: 550; }\n .links a:hover { background: #f1eef8; border-color: #bab2d4; }\n .link-label { display: flex; align-items: center; gap: 10px; }\n .links svg { width: 18px; height: 18px; flex-shrink: 0; fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; color: #6363a7; }\n .links .external-icon { width: 14px; height: 14px; }\n footer { justify-content: flex-end; font-size: 12px; color: #636174; }\n footer a:hover { color: #151131; text-decoration: underline; }\n @media (max-width: 520px) {\n header, footer { width: calc(100% - 40px); padding-block: 22px; }\n main { padding: 20px; }\n .card { padding: 28px 24px; border-radius: 18px; }\n .links { grid-template-columns: 1fr; }\n footer { flex-wrap: wrap; gap: 12px; }\n }\n </style>\n </head>\n <body>\n <header>\n <!-- Inline brand mark from spatius-site/src/assets/brand/spatius-logo-mark-black.svg. -->\n <a class=\"brand\" href=\"https://www.spatius.ai/\" target=\"_blank\" rel=\"noopener noreferrer\"><svg width=\"24\" height=\"20\" aria-hidden=\"true\" viewBox=\"0 0 265 220\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><g clip-path=\"url(#clip0_279_158)\"><path d=\"M178.56 7.19C182.19 8.35 184.62 11.78 184.62 15.59V39.43C184.62 44.17 180.77 48 176.06 48H151.07C148.71 48 146.57 48.96 145.02 50.5C144.92 50.6 144.82 50.69 144.73 50.8C143.35 52.33 142.5 54.35 142.5 56.56V94.22C142.5 98.94 138.66 102.78 133.94 102.78H108.96C104.22 102.78 100.4 106.62 100.4 111.34V149C100.4 153.74 96.56 157.57 91.84 157.57H66.86C62.12 157.57 58.29 161.41 58.29 166.14V188.47C58.29 195.77 49.94 199.95 44.12 195.55C17.04 175.04 0 145.2 0 111.99C0 50.13 59.1 0 132 0C148.41 0 164.11 2.53999 178.59 7.17999L178.56 7.19Z\" fill=\"currentColor\"/><path d=\"M230.22 59.4799V98.2699C230.22 103.15 226.27 107.09 221.4 107.09H195.68C190.8 107.09 186.86 111.04 186.86 115.91V154.7C186.86 159.58 182.9 163.52 178.04 163.52H152.31C149.89 163.52 147.67 164.52 146.08 166.1C145.98 166.2 145.88 166.3 145.78 166.41C144.35 167.98 143.49 170.06 143.49 172.34V211.13C143.49 216.01 139.54 219.95 134.67 219.95H108.95C104.07 219.95 100.13 216 100.13 211.13V172.34C100.13 167.46 104.08 163.52 108.95 163.52H134.67C139.55 163.52 143.49 159.57 143.49 154.7V115.91C143.49 115.62 143.49 115.35 143.53 115.06C143.53 114.93 143.55 114.81 143.57 114.67C143.57 114.55 143.6 114.42 143.63 114.29C143.63 114.23 143.65 114.18 143.66 114.12C143.68 114 143.72 113.88 143.75 113.77C143.77 113.66 143.81 113.55 143.84 113.43C143.92 113.18 144.01 112.91 144.11 112.67C144.19 112.46 144.28 112.26 144.36 112.07C144.36 112.05 144.38 112.04 144.38 112.03C144.44 111.92 144.49 111.81 144.56 111.7C144.73 111.39 144.93 111.08 145.12 110.79C145.21 110.67 145.29 110.55 145.39 110.44C145.51 110.27 145.64 110.12 145.79 109.96C145.89 109.85 145.99 109.75 146.09 109.65C146.29 109.45 146.5 109.26 146.71 109.07C146.93 108.89 147.15 108.73 147.38 108.56C147.61 108.41 147.86 108.26 148.1 108.12C148.34 107.99 148.6 107.87 148.85 107.75C149.12 107.63 149.38 107.53 149.66 107.45C149.87 107.38 150.08 107.33 150.29 107.28C150.5 107.22 150.72 107.18 150.94 107.15C151.12 107.13 151.29 107.11 151.47 107.08H178.02C182.89 107.08 186.84 103.13 186.84 98.2599V59.4699C186.84 54.5899 190.79 50.6499 195.66 50.6499H221.38C226.26 50.6499 230.2 54.5999 230.2 59.4699H230.21L230.22 59.4799Z\" fill=\"currentColor\"/><path d=\"M264.34 122.11V154.32C264.34 158.37 261.07 161.64 257.02 161.64H235.66C231.61 161.64 228.34 164.91 228.34 168.96V201.16C228.34 205.21 225.07 208.49 221.02 208.49H199.66C195.61 208.49 192.34 205.22 192.34 201.16V168.96C192.34 164.91 195.61 161.64 199.66 161.64H221.02C225.07 161.64 228.34 158.37 228.34 154.32V122.11C228.34 118.06 231.61 114.79 235.66 114.79H257.02C261.07 114.79 264.34 118.06 264.34 122.11Z\" fill=\"currentColor\"/></g><defs><clipPath id=\"clip0_279_158\"><rect width=\"265\" height=\"220\" fill=\"white\"/></clipPath></defs></svg>Spatius</a>\n </header>\n <main>\n <section class=\"card\" aria-labelledby=\"success-title\">\n <div class=\"check\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"m5 12 4 4L19 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" /></svg></div>\n <span class=\"eyebrow\">You're connected</span>\n <h1 id=\"success-title\">Authorization complete.</h1>\n <p class=\"description\">Your next idea starts here. Spatius is ready to help you bring it to life.</p>\n <div class=\"terminal\">\n <span class=\"terminal-icon\" aria-hidden=\"true\">&gt;_</span>\n <div><strong>Continue in your terminal</strong><p>You can close this tab and finish your project setup.</p></div>\n </div>\n <nav aria-label=\"Spatius resources\">\n <span class=\"eyebrow\">While you're building</span>\n <div class=\"links\">\n <a href=\"https://docs.spatius.ai/\" target=\"_blank\" rel=\"noopener noreferrer\"><span class=\"link-label\"><svg aria-hidden=\"true\" viewBox=\"0 0 24 24\"><path d=\"M12 5v16M12 5C9 3 5 3 2 4v15c3-1 7-1 10 2 3-3 7-3 10-2V4c-3-1-7-1-10 1Z\" /></svg>Documentation</span><svg class=\"external-icon\" aria-hidden=\"true\" viewBox=\"0 0 24 24\"><path d=\"M14 3h7v7m0-7L10 14M10 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-5\" /></svg></a>\n <a href=\"https://app.spatius.ai\" target=\"_blank\" rel=\"noopener noreferrer\"><span class=\"link-label\"><svg aria-hidden=\"true\" viewBox=\"0 0 24 24\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"3\" /><path d=\"M3 9h18M9 9v12\" /></svg>Open Studio</span><svg class=\"external-icon\" aria-hidden=\"true\" viewBox=\"0 0 24 24\"><path d=\"M14 3h7v7m0-7L10 14M10 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-5\" /></svg></a>\n <a href=\"https://github.com/spatius-ai\" target=\"_blank\" rel=\"noopener noreferrer\"><span class=\"link-label\"><svg aria-hidden=\"true\" viewBox=\"0 0 24 24\"><path d=\"m8 7-5 5 5 5m8-10 5 5-5 5m-3-13-2 16\" /></svg>GitHub</span><svg class=\"external-icon\" aria-hidden=\"true\" viewBox=\"0 0 24 24\"><path d=\"M14 3h7v7m0-7L10 14M10 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-5\" /></svg></a>\n <a href=\"https://discord.gg/9HGhZfHZh9\" target=\"_blank\" rel=\"noopener noreferrer\"><span class=\"link-label\"><svg aria-hidden=\"true\" viewBox=\"0 0 24 24\"><path d=\"M21 11a8 8 0 0 1-8 8H8l-5 3V7a4 4 0 0 1 4-4h6a8 8 0 0 1 8 8Z\" /><path d=\"M7 10h10M7 14h6\" /></svg>Join our Discord</span><svg class=\"external-icon\" aria-hidden=\"true\" viewBox=\"0 0 24 24\"><path d=\"M14 3h7v7m0-7L10 14M10 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-5\" /></svg></a>\n </div>\n </nav>\n </section>\n </main>\n <footer><a href=\"https://www.spatius.ai/\" target=\"_blank\" rel=\"noopener noreferrer\">Explore Spatius ↗</a></footer>\n </body>\n</html>`;\n","export const SPATIUS_CONSOLE_BASE_URL = 'https://api.studio.spatius.ai';\n\nexport interface SpatiusAuthSessionResponse {\n authRequestId: string;\n authorizeUrl: string;\n expiresAt?: string;\n expiresIn?: number;\n}\n\nexport interface SpatiusTokenSet {\n accessToken: string;\n refreshToken: string;\n}\n\nexport interface SpatiusApp {\n appId: string;\n createdAt?: string;\n name: string;\n}\n\nexport interface SpatiusApiKey {\n apiKey: string;\n createdAt?: string;\n}\n\nexport interface SpatiusAvatar {\n backgroundUrl?: string;\n id: string;\n name: string;\n source: 'personal' | 'public';\n}\n\nexport interface SpatiusRequestDiagnostic {\n method: string;\n route: string;\n durationMs: number;\n outcome: 'response' | 'network-error' | 'invalid-response';\n httpStatus?: number;\n apiStatus?: number;\n apiCode?: string;\n}\n\nconst knownApiStatuses: Readonly<Record<string, number>> = {\n BAD_REQUEST: 400,\n INVALID_ARGUMENT: 400,\n FAILED_PRECONDITION: 400,\n UNAUTHORIZED: 401,\n PAYMENT_REQUIRED: 402,\n FORBIDDEN: 403,\n PERMISSION_DENIED: 403,\n NOT_FOUND: 404,\n TIMEOUT: 408,\n ALREADY_EXISTS: 409,\n FAILED_DEPENDENCY: 424,\n QUOTA_EXCEEDED: 429,\n INTERNAL_SERVER_ERROR: 500,\n UNIMPLEMENTED: 501,\n UNAVAILABLE: 503,\n unauthorized: 401,\n forbidden: 403,\n invalid_request: 400,\n not_found: 404,\n internal_error: 500,\n};\n\nfunction diagnosticRoute(path: string): string {\n return path.replace(/\\/apps\\/[^/]+/u, '/apps/{appId}');\n}\n\nexport class SpatiusHttpError extends Error {\n readonly status: number;\n readonly httpStatus: number;\n readonly apiCode?: string;\n\n constructor(\n status: number,\n method: string,\n path: string,\n options: {\n httpStatus?: number;\n apiCode?: string;\n missingFrontendUrl?: boolean;\n } = {},\n ) {\n const httpStatus = options.httpStatus ?? status;\n super(\n `Spatius request ${method} ${diagnosticRoute(path)} failed (HTTP ${String(httpStatus)}${options.apiCode === undefined ? '' : `, API ${String(status)} ${options.apiCode}`}).` +\n (options.missingFrontendUrl === true\n ? ' The Spatius console server is missing SERVER_OPEN_PLATFORM_FRONTEND_URL. Configure it with the Studio URL in the console deployment, then retry.'\n : ''),\n );\n this.name = 'SpatiusHttpError';\n this.status = status;\n this.httpStatus = httpStatus;\n this.apiCode = options.apiCode;\n }\n}\n\ntype JsonObject = Record<string, unknown>;\n\nfunction apiError(\n payload: JsonObject,\n httpStatus: number,\n method: string,\n path: string,\n): SpatiusHttpError | undefined {\n const errors = payload.errors;\n const hasErrors = Array.isArray(errors) && errors.length > 0;\n const raw: unknown = hasErrors ? errors[0] : payload.error;\n if (!hasErrors && (raw === undefined || raw === null)) return undefined;\n const error =\n raw !== null && typeof raw === 'object' && !Array.isArray(raw)\n ? (raw as JsonObject)\n : {};\n // Only known codes and an exact, known-safe configuration message may leave\n // the client. Arbitrary details, titles, source fields, and bodies can echo secrets.\n const code =\n typeof error.code === 'string' &&\n Object.hasOwn(knownApiStatuses, error.code)\n ? error.code\n : 'API_ERROR';\n const suppliedStatus =\n typeof error.status === 'number'\n ? error.status\n : typeof error.status === 'string' && /^\\d{3}$/u.test(error.status)\n ? Number(error.status)\n : undefined;\n const status =\n suppliedStatus !== undefined &&\n Number.isInteger(suppliedStatus) &&\n suppliedStatus >= 400 &&\n suppliedStatus <= 599\n ? suppliedStatus\n : (knownApiStatuses[code] ?? (httpStatus >= 400 ? httpStatus : 500));\n\n return new SpatiusHttpError(status, method, path, {\n apiCode: code,\n httpStatus,\n missingFrontendUrl:\n code === 'INTERNAL_SERVER_ERROR' &&\n error.detail === 'server open-platform frontend URL is not configured',\n });\n}\n\nfunction object(value: unknown, label: string): JsonObject {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(`Spatius returned an invalid ${label} response.`);\n }\n return value as JsonObject;\n}\n\nfunction field(\n value: JsonObject,\n camelCase: string,\n snakeCase: string,\n): unknown {\n return value[camelCase] ?? value[snakeCase];\n}\n\nfunction requiredString(\n value: JsonObject,\n camelCase: string,\n snakeCase = camelCase,\n): string {\n const result = field(value, camelCase, snakeCase);\n if (typeof result !== 'string' || result.trim() === '') {\n throw new Error(`Spatius returned a response without ${camelCase}.`);\n }\n return result.trim();\n}\n\nfunction optionalString(\n value: JsonObject,\n camelCase: string,\n snakeCase = camelCase,\n): string | undefined {\n const result = field(value, camelCase, snakeCase);\n return typeof result === 'string' && result.trim() !== ''\n ? result.trim()\n : undefined;\n}\n\nfunction optionalNumber(\n value: JsonObject,\n camelCase: string,\n snakeCase = camelCase,\n): number | undefined {\n const result = field(value, camelCase, snakeCase);\n return typeof result === 'number' && Number.isFinite(result)\n ? result\n : undefined;\n}\n\nfunction arrayField(\n value: JsonObject,\n camelCase: string,\n snakeCase: string,\n): unknown[] {\n const result = field(value, camelCase, snakeCase);\n if (!Array.isArray(result)) return [];\n const values: unknown[] = [];\n for (const entry of result) values.push(entry as unknown);\n return values;\n}\n\nfunction nextPageToken(value: JsonObject): string | undefined {\n const paginationValue = value.pagination;\n if (\n paginationValue === null ||\n typeof paginationValue !== 'object' ||\n Array.isArray(paginationValue)\n ) {\n return undefined;\n }\n return optionalString(\n paginationValue as JsonObject,\n 'nextPageToken',\n 'next_page_token',\n );\n}\n\ninterface RequestOptions {\n accessToken?: string;\n appCredentials?: { apiKey: string; appId: string };\n body?: JsonObject;\n method?: 'GET' | 'POST';\n query?: URLSearchParams;\n}\n\nexport class SpatiusApiClient {\n readonly #baseUrl: string;\n readonly #fetch: typeof fetch;\n readonly #onDiagnostic?: (event: SpatiusRequestDiagnostic) => void;\n\n constructor(\n baseUrl = SPATIUS_CONSOLE_BASE_URL,\n fetchImplementation: typeof fetch = fetch,\n onDiagnostic?: (event: SpatiusRequestDiagnostic) => void,\n ) {\n this.#baseUrl = baseUrl.replace(/\\/+$/u, '');\n this.#fetch = fetchImplementation;\n this.#onDiagnostic = onDiagnostic;\n }\n\n async #request(\n path: string,\n {\n accessToken,\n appCredentials,\n body,\n method = 'GET',\n query,\n }: RequestOptions = {},\n ): Promise<JsonObject> {\n const startedAt = performance.now();\n const report = (\n details: Pick<\n SpatiusRequestDiagnostic,\n 'outcome' | 'httpStatus' | 'apiStatus' | 'apiCode'\n >,\n ) => {\n this.#onDiagnostic?.({\n method,\n route: diagnosticRoute(path),\n durationMs: Math.round(performance.now() - startedAt),\n ...details,\n });\n };\n const url = new URL(`${this.#baseUrl}${path}`);\n if (query !== undefined) {\n url.search = query.toString();\n }\n const headers = new Headers({ Accept: 'application/json' });\n if (body !== undefined) {\n headers.set('Content-Type', 'application/json');\n }\n if (accessToken !== undefined) {\n headers.set('Authorization', `Bearer ${accessToken}`);\n }\n if (appCredentials !== undefined) {\n headers.set('X-App-ID', appCredentials.appId);\n headers.set('X-API-Key', appCredentials.apiKey);\n }\n\n let response: Response;\n try {\n response = await this.#fetch(url, {\n ...(body === undefined ? {} : { body: JSON.stringify(body) }),\n headers,\n method,\n redirect: 'error',\n signal: AbortSignal.timeout(30_000),\n });\n } catch {\n report({ outcome: 'network-error' });\n throw new Error(\n `Could not reach the Spatius API for ${method} ${diagnosticRoute(path)}.`,\n );\n }\n\n if (response.status === 204) {\n report({ outcome: 'response', httpStatus: response.status });\n return {};\n }\n\n let payload: JsonObject;\n try {\n const contents = await response.text();\n payload =\n contents.trim() === '' ? {} : object(JSON.parse(contents), 'API');\n } catch {\n report({ outcome: 'invalid-response', httpStatus: response.status });\n if (!response.ok)\n throw new SpatiusHttpError(response.status, method, path);\n throw new Error(\n `Spatius returned an invalid JSON object response for ${method} ${diagnosticRoute(path)}.`,\n );\n }\n\n const error = apiError(payload, response.status, method, path);\n report({\n outcome: 'response',\n httpStatus: response.status,\n ...(error === undefined\n ? {}\n : { apiStatus: error.status, apiCode: error.apiCode }),\n });\n if (error !== undefined) throw error;\n if (!response.ok) throw new SpatiusHttpError(response.status, method, path);\n return payload;\n }\n\n async createAuthSession(input: {\n codeChallenge: string;\n redirectUri: string;\n state: string;\n }): Promise<SpatiusAuthSessionResponse> {\n const response = await this.#request('/v1/cli/auth/sessions', {\n body: {\n clientName: 'create-spatius-app',\n codeChallenge: input.codeChallenge,\n codeChallengeMethod: 'CLI_AUTH_CODE_CHALLENGE_METHOD_S256',\n redirectUri: input.redirectUri,\n state: input.state,\n },\n method: 'POST',\n });\n return {\n authRequestId: requiredString(\n response,\n 'authRequestId',\n 'auth_request_id',\n ),\n authorizeUrl: requiredString(response, 'authorizeUrl', 'authorize_url'),\n ...(optionalString(response, 'expiresAt', 'expires_at') === undefined\n ? {}\n : { expiresAt: optionalString(response, 'expiresAt', 'expires_at') }),\n ...(optionalNumber(response, 'expiresIn', 'expires_in') === undefined\n ? {}\n : { expiresIn: optionalNumber(response, 'expiresIn', 'expires_in') }),\n };\n }\n\n async exchangeAuthCode(input: {\n authCode: string;\n authRequestId: string;\n codeVerifier: string;\n }): Promise<SpatiusTokenSet> {\n const response = await this.#request('/v1/cli/auth/token', {\n body: {\n authCode: input.authCode,\n authRequestId: input.authRequestId,\n codeVerifier: input.codeVerifier,\n },\n method: 'POST',\n });\n return parseTokenSet(object(response.token, 'token'));\n }\n\n async refresh(refreshToken: string): Promise<SpatiusTokenSet> {\n const response = await this.#request('/v1/cli/auth/token:refresh', {\n body: { refreshToken },\n method: 'POST',\n });\n return parseTokenSet(object(response.token, 'token'), refreshToken);\n }\n\n async revoke(tokens: SpatiusTokenSet): Promise<void> {\n await this.#request('/v1/cli/auth/token:revoke', {\n body: {\n accessToken: tokens.accessToken,\n refreshToken: tokens.refreshToken,\n },\n method: 'POST',\n });\n }\n\n async listApps(accessToken: string): Promise<SpatiusApp[]> {\n const results: SpatiusApp[] = [];\n let pageToken: string | undefined;\n const seen = new Set<string>();\n do {\n const query = new URLSearchParams({ 'pagination.pageSize': '100' });\n if (pageToken !== undefined) {\n query.set('pagination.pageToken', pageToken);\n }\n const response = await this.#request('/v1/apps', {\n accessToken,\n query,\n });\n for (const raw of arrayField(response, 'apps', 'apps')) {\n const app = object(raw, 'app');\n results.push({\n appId: requiredString(app, 'appId', 'app_id'),\n ...(optionalString(app, 'createdAt', 'created_at') === undefined\n ? {}\n : { createdAt: optionalString(app, 'createdAt', 'created_at') }),\n name: optionalString(app, 'name') ?? 'Unnamed app',\n });\n }\n pageToken = nextPageToken(response);\n if (pageToken !== undefined && seen.has(pageToken)) break;\n if (pageToken !== undefined) seen.add(pageToken);\n } while (pageToken !== undefined);\n\n return results;\n }\n\n async createApp(accessToken: string, name: string): Promise<SpatiusApp> {\n const response = await this.#request('/v1/apps', {\n accessToken,\n body: { name },\n method: 'POST',\n });\n return {\n appId: requiredString(response, 'appId', 'app_id'),\n name,\n };\n }\n\n async listApiKeys(\n accessToken: string,\n appId: string,\n ): Promise<SpatiusApiKey[]> {\n const results: SpatiusApiKey[] = [];\n let pageToken: string | undefined;\n const seen = new Set<string>();\n do {\n const query = new URLSearchParams({ 'pagination.pageSize': '100' });\n if (pageToken !== undefined) {\n query.set('pagination.pageToken', pageToken);\n }\n const path = `/v1/apps/${encodeURIComponent(appId)}/api-keys`;\n const response = await this.#request(path, { accessToken, query });\n for (const raw of arrayField(response, 'apiKeys', 'api_keys')) {\n results.push(parseApiKey(object(raw, 'API key')));\n }\n pageToken = nextPageToken(response);\n if (pageToken !== undefined && seen.has(pageToken)) break;\n if (pageToken !== undefined) seen.add(pageToken);\n } while (pageToken !== undefined);\n return results;\n }\n\n async createApiKey(\n accessToken: string,\n appId: string,\n ): Promise<SpatiusApiKey> {\n const path = `/v1/apps/${encodeURIComponent(appId)}/api-keys`;\n const response = await this.#request(path, {\n accessToken,\n body: { appId },\n method: 'POST',\n });\n return parseApiKey(object(field(response, 'apiKey', 'api_key'), 'API key'));\n }\n\n async listPublicAvatars(accessToken: string): Promise<SpatiusAvatar[]> {\n const results: SpatiusAvatar[] = [];\n let pageToken: string | undefined;\n const seen = new Set<string>();\n do {\n const query = new URLSearchParams({ 'pagination.pageSize': '100' });\n if (pageToken !== undefined) {\n query.set('pagination.pageToken', pageToken);\n }\n const response = await this.#request('/v2/console/public-avatars', {\n accessToken,\n query,\n });\n for (const raw of arrayField(\n response,\n 'publicAvatars',\n 'public_avatars',\n )) {\n const avatar = object(raw, 'public avatar');\n results.push({\n id: requiredString(avatar, 'id'),\n name: optionalString(avatar, 'name') ?? 'Unnamed avatar',\n source: 'public',\n backgroundUrl: optionalString(\n avatar,\n 'backgroundImageUrl',\n 'background_image_url',\n ),\n });\n }\n pageToken = nextPageToken(response);\n if (pageToken !== undefined && seen.has(pageToken)) break;\n if (pageToken !== undefined) seen.add(pageToken);\n } while (pageToken !== undefined);\n return results;\n }\n\n async listPersonalAvatars(\n appId: string,\n apiKey: string,\n ): Promise<SpatiusAvatar[]> {\n const results: SpatiusAvatar[] = [];\n let pageToken: string | undefined;\n const seen = new Set<string>();\n do {\n const query = new URLSearchParams({ 'pagination.pageSize': '100' });\n if (pageToken !== undefined) {\n query.set('pagination.pageToken', pageToken);\n }\n const response = await this.#request('/v1/open/avatars', {\n appCredentials: { apiKey, appId },\n query,\n });\n for (const raw of arrayField(response, 'avatars', 'avatars')) {\n const avatar = object(raw, 'personal avatar');\n results.push({\n id: requiredString(avatar, 'id'),\n name: optionalString(avatar, 'name') ?? 'Unnamed avatar',\n source: 'personal',\n });\n }\n pageToken = nextPageToken(response);\n if (pageToken !== undefined && seen.has(pageToken)) break;\n if (pageToken !== undefined) seen.add(pageToken);\n } while (pageToken !== undefined);\n return results;\n }\n}\n\nfunction parseTokenSet(\n value: JsonObject,\n refreshTokenFallback?: string,\n): SpatiusTokenSet {\n const refreshToken =\n optionalString(value, 'refreshToken', 'refresh_token') ??\n refreshTokenFallback;\n if (refreshToken === undefined) {\n throw new Error('Spatius returned a response without refreshToken.');\n }\n\n return {\n accessToken: requiredString(value, 'accessToken', 'access_token'),\n refreshToken,\n };\n}\n\nfunction parseApiKey(value: JsonObject): SpatiusApiKey {\n return {\n apiKey: requiredString(value, 'apiKey', 'api_key'),\n ...(optionalString(value, 'createdAt', 'created_at') === undefined\n ? {}\n : { createdAt: optionalString(value, 'createdAt', 'created_at') }),\n };\n}\n\nexport class SpatiusAuthenticatedSession {\n readonly #client: SpatiusApiClient;\n #tokens: SpatiusTokenSet;\n\n constructor(client: SpatiusApiClient, tokens: SpatiusTokenSet) {\n this.#client = client;\n this.#tokens = tokens;\n }\n\n async authorized<Value>(\n operation: (accessToken: string) => Promise<Value>,\n ): Promise<Value> {\n try {\n return await operation(this.#tokens.accessToken);\n } catch (error) {\n if (!(error instanceof SpatiusHttpError) || error.status !== 401) {\n throw error;\n }\n this.#tokens = await this.#client.refresh(this.#tokens.refreshToken);\n return operation(this.#tokens.accessToken);\n }\n }\n\n revoke(): Promise<void> {\n return this.#client.revoke(this.#tokens);\n }\n}\n","import { execFile } from 'node:child_process';\nimport { createHash, randomBytes } from 'node:crypto';\nimport { createServer, type Server } from 'node:http';\nimport type { AddressInfo } from 'node:net';\nimport { promisify } from 'node:util';\n\nimport { SecretRedactor } from './redaction.js';\nimport { successPage } from './success-page.js';\nimport {\n SpatiusApiClient,\n SpatiusAuthenticatedSession,\n} from './spatius-api.js';\n\nconst execFileAsync = promisify(execFile);\nconst callbackPath = '/callback';\n\nfunction base64Url(value: Buffer): string {\n return value.toString('base64url');\n}\n\nexport interface PkceMaterial {\n challenge: string;\n state: string;\n verifier: string;\n}\n\nexport function createPkceMaterial(\n random: (size: number) => Buffer = randomBytes,\n): PkceMaterial {\n const verifier = base64Url(random(32));\n return {\n challenge: base64Url(createHash('sha256').update(verifier).digest()),\n state: base64Url(random(18)),\n verifier,\n };\n}\n\nexport interface SpatiusCallbackResult {\n authCode: string;\n authRequestId: string;\n}\n\nexport function validateSpatiusCallback(\n requestUrl: string,\n redirectUri: string,\n expectedState: string,\n expectedRequestId: string,\n): SpatiusCallbackResult {\n const url = new URL(requestUrl, redirectUri);\n if (url.pathname !== callbackPath) {\n throw new Error('The Spatius callback used an unexpected path.');\n }\n\n const providerError = url.searchParams.get('error');\n if (providerError !== null) {\n const safeCode = providerError.replace(/[^A-Za-z\\d_.-]/gu, '').slice(0, 80);\n throw new Error(\n safeCode === ''\n ? 'Spatius authorization was declined.'\n : `Spatius authorization was declined (${safeCode}).`,\n );\n }\n\n if (url.searchParams.get('state') !== expectedState) {\n throw new Error('The Spatius callback state did not match.');\n }\n const authRequestId = url.searchParams.get('auth_request_id')?.trim();\n if (authRequestId !== expectedRequestId) {\n throw new Error('The Spatius callback request ID did not match.');\n }\n const authCode = url.searchParams.get('auth_code')?.trim();\n if (authCode === undefined || authCode === '') {\n throw new Error(\n 'The Spatius callback did not include an authorization code.',\n );\n }\n\n return { authCode, authRequestId };\n}\n\ninterface CallbackExpectation {\n expectedRequestId: string;\n expectedState: string;\n reject: (error: Error) => void;\n resolve: (result: SpatiusCallbackResult) => void;\n}\n\nexport interface SpatiusCallbackServer {\n close(): Promise<void>;\n redirectUri: string;\n waitForCallback(options: {\n expectedRequestId: string;\n expectedState: string;\n timeoutMs: number;\n }): Promise<SpatiusCallbackResult>;\n}\n\nfunction closeServer(server: Server): Promise<void> {\n return new Promise((resolvePromise) => {\n server.close(() => resolvePromise());\n server.closeAllConnections();\n });\n}\n\nexport async function createLoopbackCallbackServer(): Promise<SpatiusCallbackServer> {\n let expectation: CallbackExpectation | undefined;\n let redirectUri = '';\n const server = createServer((request, response) => {\n if (request.method !== 'GET' || request.url === undefined) {\n response.writeHead(404).end('Not found');\n return;\n }\n const requestUrl = new URL(request.url, redirectUri);\n if (requestUrl.pathname !== callbackPath || expectation === undefined) {\n response.writeHead(404).end('Not found');\n return;\n }\n\n const current = expectation;\n expectation = undefined;\n try {\n const result = validateSpatiusCallback(\n request.url,\n redirectUri,\n current.expectedState,\n current.expectedRequestId,\n );\n response\n .writeHead(200, {\n 'Cache-Control': 'no-store',\n 'Content-Security-Policy':\n \"default-src 'none'; style-src 'unsafe-inline'\",\n 'Content-Type': 'text/html; charset=utf-8',\n 'Referrer-Policy': 'no-referrer',\n })\n .end(successPage);\n current.resolve(result);\n } catch (error) {\n response\n .writeHead(400, {\n 'Cache-Control': 'no-store',\n 'Content-Type': 'text/plain; charset=utf-8',\n })\n .end('Authorization could not be completed. Return to the terminal.');\n current.reject(\n error instanceof Error\n ? error\n : new Error('The Spatius callback was invalid.'),\n );\n }\n });\n\n await new Promise<void>((resolvePromise, reject) => {\n server.once('error', reject);\n server.listen(0, '127.0.0.1', () => {\n server.off('error', reject);\n resolvePromise();\n });\n });\n const address = server.address() as AddressInfo;\n redirectUri = `http://127.0.0.1:${String(address.port)}${callbackPath}`;\n\n return {\n close: () => closeServer(server),\n redirectUri,\n waitForCallback: ({ expectedRequestId, expectedState, timeoutMs }) =>\n new Promise((resolvePromise, reject) => {\n if (expectation !== undefined) {\n reject(new Error('A Spatius callback is already pending.'));\n return;\n }\n const timeout = setTimeout(() => {\n expectation = undefined;\n reject(new Error('Timed out waiting for Spatius authorization.'));\n }, timeoutMs);\n expectation = {\n expectedRequestId,\n expectedState,\n reject: (error) => {\n clearTimeout(timeout);\n reject(error);\n },\n resolve: (result) => {\n clearTimeout(timeout);\n resolvePromise(result);\n },\n };\n }),\n };\n}\n\nexport async function openSystemBrowser(url: string): Promise<void> {\n const command =\n process.platform === 'darwin'\n ? 'open'\n : process.platform === 'win32'\n ? 'rundll32.exe'\n : 'xdg-open';\n const args =\n process.platform === 'win32' ? ['url.dll,FileProtocolHandler', url] : [url];\n try {\n await execFileAsync(command, args, {\n timeout: 10_000,\n windowsHide: true,\n });\n } catch {\n throw new Error('The browser could not be opened automatically.');\n }\n}\n\nfunction sessionTimeoutMs(\n response: { expiresAt?: string; expiresIn?: number },\n now: () => number,\n maximumMs: number,\n): number {\n const candidates = [maximumMs];\n if (response.expiresIn !== undefined && response.expiresIn > 0) {\n candidates.push(response.expiresIn * 1000);\n }\n if (response.expiresAt !== undefined) {\n const expiresAt = Date.parse(response.expiresAt);\n if (Number.isFinite(expiresAt)) {\n candidates.push(Math.max(1, expiresAt - now()));\n }\n }\n return Math.max(1, Math.min(...candidates.filter((value) => value > 0)));\n}\n\nfunction validateAuthorizationUrl(value: string): string {\n const url = new URL(value);\n const loopbackHost = ['127.0.0.1', '[::1]', 'localhost'].includes(\n url.hostname,\n );\n if (\n (url.protocol !== 'https:' &&\n !(url.protocol === 'http:' && loopbackHost)) ||\n url.username !== '' ||\n url.password !== ''\n ) {\n throw new Error('Spatius returned an unsafe authorization URL.');\n }\n return value;\n}\n\ninterface LoginToSpatiusOptions {\n callbackServerFactory?: () => Promise<SpatiusCallbackServer>;\n client: SpatiusApiClient;\n maximumWaitMs?: number;\n now?: () => number;\n onAuthorizationUrl: (url: string) => void;\n onBrowserOpenFailure?: (error: Error) => void;\n openBrowser?: (url: string) => Promise<void>;\n redactor?: SecretRedactor;\n}\n\nexport async function loginToSpatius({\n callbackServerFactory = createLoopbackCallbackServer,\n client,\n maximumWaitMs = 5 * 60_000,\n now = Date.now,\n onAuthorizationUrl,\n onBrowserOpenFailure,\n openBrowser = openSystemBrowser,\n redactor = new SecretRedactor(),\n}: LoginToSpatiusOptions): Promise<SpatiusAuthenticatedSession> {\n const callback = await callbackServerFactory();\n const pkce = createPkceMaterial();\n redactor.add(pkce.verifier, pkce.state);\n\n try {\n const auth = await client.createAuthSession({\n codeChallenge: pkce.challenge,\n redirectUri: callback.redirectUri,\n state: pkce.state,\n });\n const authorizationUrl = validateAuthorizationUrl(auth.authorizeUrl);\n onAuthorizationUrl(authorizationUrl);\n const callbackResult = callback.waitForCallback({\n expectedRequestId: auth.authRequestId,\n expectedState: pkce.state,\n timeoutMs: sessionTimeoutMs(auth, now, maximumWaitMs),\n });\n // The callback can reject while the browser launcher is still pending.\n // Handle it immediately; awaiting the original promise below still throws.\n void callbackResult.catch(() => undefined);\n try {\n await openBrowser(authorizationUrl);\n } catch (error) {\n onBrowserOpenFailure?.(\n error instanceof Error\n ? error\n : new Error('The browser could not be opened automatically.'),\n );\n }\n\n const result = await callbackResult;\n redactor.add(result.authCode);\n const tokens = await client.exchangeAuthCode({\n authCode: result.authCode,\n authRequestId: result.authRequestId,\n codeVerifier: pkce.verifier,\n });\n redactor.add(tokens.accessToken, tokens.refreshToken);\n return new SpatiusAuthenticatedSession(client, tokens);\n } finally {\n await callback.close().catch(() => undefined);\n }\n}\n","import { PromptCancelledError } from '../errors.js';\nimport type { SetupPrompts } from '../prompts.js';\nimport { type SpatiusCredentials, isPlaceholderValue } from './environment.js';\nimport { maskSecret, SecretRedactor } from './redaction.js';\nimport {\n type SpatiusApiKey,\n type SpatiusApp,\n type SpatiusAvatar,\n SpatiusApiClient,\n SpatiusAuthenticatedSession,\n} from './spatius-api.js';\n\nexport function combineAvatars(\n publicAvatars: readonly SpatiusAvatar[],\n personalAvatars: readonly SpatiusAvatar[],\n): SpatiusAvatar[] {\n const byId = new Map<string, SpatiusAvatar>();\n for (const avatar of publicAvatars) {\n byId.set(avatar.id, avatar);\n }\n for (const avatar of personalAvatars) {\n byId.set(avatar.id, { ...byId.get(avatar.id), ...avatar });\n }\n return [...byId.values()];\n}\n\nfunction dateLabel(value: string | undefined): string {\n if (value === undefined) return 'creation date unavailable';\n const date = new Date(value);\n return Number.isNaN(date.getTime())\n ? 'creation date unavailable'\n : `created ${date.toISOString().slice(0, 10)}`;\n}\n\nexport function apiKeyLabel(key: SpatiusApiKey): string {\n return `${maskSecret(key.apiKey)} · ${dateLabel(key.createdAt)}`;\n}\n\nfunction assertResourceId(value: string, label: string): string {\n const normalized = value.trim();\n if (isPlaceholderValue(normalized)) {\n throw new Error(`${label} must be a non-placeholder value.`);\n }\n return normalized;\n}\n\ninterface SelectedAppKey {\n apiKey: string;\n app: SpatiusApp;\n}\n\nasync function createApiKey(\n session: SpatiusAuthenticatedSession,\n client: SpatiusApiClient,\n app: SpatiusApp,\n prompts: SetupPrompts,\n redactor: SecretRedactor,\n): Promise<SelectedAppKey> {\n const confirmed = await prompts.confirm(\n `Create a new API key for ${app.name} (${app.appId})?`,\n false,\n );\n if (!confirmed) {\n throw new PromptCancelledError('Credential setup was cancelled.');\n }\n const key = await session.authorized((accessToken) =>\n client.createApiKey(accessToken, app.appId),\n );\n redactor.add(key.apiKey);\n return { apiKey: key.apiKey, app };\n}\n\nasync function selectExistingAppKey(\n session: SpatiusAuthenticatedSession,\n client: SpatiusApiClient,\n app: SpatiusApp,\n prompts: SetupPrompts,\n redactor: SecretRedactor,\n): Promise<SelectedAppKey> {\n const keys = await session.authorized((accessToken) =>\n client.listApiKeys(accessToken, app.appId),\n );\n redactor.add(...keys.map((key) => key.apiKey));\n const options = [\n ...keys.map((key, index) => ({\n label: apiKeyLabel(key),\n value: `key-${String(index)}`,\n })),\n {\n hint: 'Creates a new secret after confirmation',\n label: 'Create a new API key for this app',\n value: 'create-key',\n },\n ];\n const selection = await prompts.choose(\n `Which API key should ${app.name} use?`,\n options,\n keys.length > 0 ? 'key-0' : 'create-key',\n );\n if (selection === 'create-key') {\n return createApiKey(session, client, app, prompts, redactor);\n }\n const index = Number.parseInt(selection.slice('key-'.length), 10);\n const key = keys[index];\n if (key === undefined) {\n throw new Error('The selected Spatius API key is no longer available.');\n }\n return { apiKey: key.apiKey, app };\n}\n\nasync function createAppAndKey(\n session: SpatiusAuthenticatedSession,\n client: SpatiusApiClient,\n projectName: string,\n prompts: SetupPrompts,\n redactor: SecretRedactor,\n): Promise<SelectedAppKey> {\n const requestedName = await prompts.input('Name for the new Spatius app', {\n initialValue: projectName,\n placeholder: projectName,\n });\n const name = requestedName.trim();\n if (name === '' || name.length > 128) {\n throw new Error(\n 'The Spatius app name must be between 1 and 128 characters.',\n );\n }\n const confirmed = await prompts.confirm(\n `Create the Spatius app \"${name}\" and its first API key?`,\n false,\n );\n if (!confirmed) {\n throw new PromptCancelledError('Credential setup was cancelled.');\n }\n\n const app = await session.authorized((accessToken) =>\n client.createApp(accessToken, name),\n );\n try {\n const key = await session.authorized((accessToken) =>\n client.createApiKey(accessToken, app.appId),\n );\n redactor.add(key.apiKey);\n return { apiKey: key.apiKey, app };\n } catch (error) {\n throw new Error(\n `The Spatius app was created with ID ${app.appId}, but its API key could not be created. Rerun setup and select that app to create a key.`,\n { cause: error },\n );\n }\n}\n\nasync function selectAppAndKey(\n session: SpatiusAuthenticatedSession,\n client: SpatiusApiClient,\n apps: readonly SpatiusApp[],\n projectName: string,\n prompts: SetupPrompts,\n redactor: SecretRedactor,\n): Promise<SelectedAppKey> {\n const options = [\n ...apps.map((app, index) => ({\n hint: app.appId,\n label: app.name,\n value: `app-${String(index)}`,\n })),\n {\n hint: 'Creates remote resources only after confirmation',\n label: 'Create a new Spatius app and API key',\n value: 'create-app',\n },\n ];\n const selection = await prompts.choose(\n 'Which Spatius app should this project use?',\n options,\n apps.length > 0 ? 'app-0' : 'create-app',\n );\n if (selection === 'create-app') {\n return createAppAndKey(session, client, projectName, prompts, redactor);\n }\n const index = Number.parseInt(selection.slice('app-'.length), 10);\n const app = apps[index];\n if (app === undefined) {\n throw new Error('The selected Spatius app is no longer available.');\n }\n return selectExistingAppKey(session, client, app, prompts, redactor);\n}\n\nasync function selectAvatar(\n publicAvatars: readonly SpatiusAvatar[],\n personalAvatars: readonly SpatiusAvatar[],\n prompts: SetupPrompts,\n): Promise<Pick<SpatiusCredentials, 'avatarId' | 'backgroundUrl'>> {\n const avatars = combineAvatars(publicAvatars, personalAvatars);\n const options = [\n ...avatars.map((avatar, index) => ({\n hint: avatar.id,\n label: `${avatar.name} (${avatar.source})`,\n value: `avatar-${String(index)}`,\n })),\n {\n hint: 'Use an avatar ID not shown in the lists',\n label: 'Enter an avatar ID manually',\n value: 'manual-avatar',\n },\n ];\n const selection = await prompts.choose(\n 'Which avatar should the demo dispatch?',\n options,\n avatars.length > 0 ? 'avatar-0' : 'manual-avatar',\n );\n if (selection === 'manual-avatar') {\n return {\n avatarId: assertResourceId(\n await prompts.input('Spatius avatar ID'),\n 'SPATIUS_AVATAR_ID',\n ),\n };\n }\n const index = Number.parseInt(selection.slice('avatar-'.length), 10);\n const avatar = avatars[index];\n if (avatar === undefined) {\n throw new Error('The selected Spatius avatar is no longer available.');\n }\n return {\n avatarId: avatar.id,\n ...(avatar.backgroundUrl ? { backgroundUrl: avatar.backgroundUrl } : {}),\n };\n}\n\ninterface SelectSpatiusResourcesOptions {\n client: SpatiusApiClient;\n onWarning: (message: string) => void;\n projectName: string;\n prompts: SetupPrompts;\n redactor: SecretRedactor;\n session: SpatiusAuthenticatedSession;\n}\n\nexport async function selectSpatiusResources({\n client,\n onWarning,\n projectName,\n prompts,\n redactor,\n session,\n}: SelectSpatiusResourcesOptions): Promise<SpatiusCredentials> {\n const [apps, publicAvatars] = await session.authorized((accessToken) =>\n Promise.all([\n client.listApps(accessToken),\n client.listPublicAvatars(accessToken),\n ]),\n );\n const selected = await selectAppAndKey(\n session,\n client,\n apps,\n projectName,\n prompts,\n redactor,\n );\n let personalAvatars: SpatiusAvatar[] = [];\n try {\n personalAvatars = await client.listPersonalAvatars(\n selected.app.appId,\n selected.apiKey,\n );\n } catch {\n onWarning(\n 'Personal avatars could not be loaded; continuing with the public avatar library.',\n );\n }\n const avatar = await selectAvatar(publicAvatars, personalAvatars, prompts);\n\n return {\n apiKey: selected.apiKey,\n appId: selected.app.appId,\n ...avatar,\n };\n}\n","import { basename } from 'node:path';\n\nimport { PromptCancelledError } from '../errors.js';\nimport type { SetupPrompts } from '../prompts.js';\nimport { CHARACTER_VOICES } from '../templates/cloudflare-livekit/voices.js';\nimport {\n buildCredentialFileContents,\n type CredentialBundle,\n type CredentialFileState,\n type LiveKitCredentials,\n readCredentialExamples,\n readCredentialFileState,\n parseDotenv,\n type SpatiusCredentials,\n validateCredentialBundle,\n validateLiveKitUrl,\n writeCredentialFilesAtomically,\n} from './environment.js';\nimport {\n loadLiveKitCredentialsWithCli,\n probeLiveKitCli,\n type LiveKitCliProbe,\n} from './livekit.js';\nimport {\n authenticateLiveKitCli,\n installLiveKitCli,\n LIVEKIT_INSTALL_GUIDE,\n planLiveKitInstall,\n} from './livekit-install.js';\nimport { assertSpatiusProject } from './project.js';\nimport { SecretRedactor } from './redaction.js';\nimport { loginToSpatius, type SpatiusCallbackServer } from './spatius-auth.js';\nimport {\n SPATIUS_CONSOLE_BASE_URL,\n SpatiusApiClient,\n SpatiusAuthenticatedSession,\n type SpatiusRequestDiagnostic,\n} from './spatius-api.js';\nimport { selectSpatiusResources } from './spatius-resources.js';\n\nexport type CredentialSetupResult = 'configured' | 'unchanged';\n\nexport interface CredentialSetupDependencies {\n authenticateLiveKit?: () => Promise<void>;\n installLiveKit?: typeof installLiveKitCli;\n planLiveKitInstall?: typeof planLiveKitInstall;\n createSpatiusClient?: () => SpatiusApiClient;\n loadLiveKitCredentials?: () => Promise<LiveKitCredentials>;\n loginToSpatius?: (options: {\n client: SpatiusApiClient;\n onAuthorizationUrl: (url: string) => void;\n onBrowserOpenFailure: (error: Error) => void;\n redactor: SecretRedactor;\n }) => Promise<SpatiusAuthenticatedSession>;\n probeLiveKit?: () => Promise<LiveKitCliProbe>;\n readExamples?: typeof readCredentialExamples;\n readState?: typeof readCredentialFileState;\n selectSpatiusResources?: typeof selectSpatiusResources;\n validateProject?: typeof assertSpatiusProject;\n writeFiles?: typeof writeCredentialFilesAtomically;\n}\n\ninterface CredentialSetupOptions {\n dependencies?: CredentialSetupDependencies;\n onDiagnostic?: (event: SpatiusRequestDiagnostic) => void;\n onStatus?: (message: string) => void;\n onWarning?: (message: string) => void;\n projectName?: string;\n prompts: SetupPrompts;\n targetDirectory: string;\n}\n\nasync function collectManualLiveKitCredentials(\n prompts: SetupPrompts,\n): Promise<LiveKitCredentials> {\n const url = validateLiveKitUrl(\n await prompts.input('LiveKit URL', {\n placeholder: 'wss://your-project.livekit.cloud',\n }),\n );\n const apiKey = await prompts.password('LiveKit API key');\n const apiSecret = await prompts.password('LiveKit API secret');\n return validateCredentialBundle({\n liveKit: { apiKey, apiSecret, url },\n spatius: {\n apiKey: 'validation-only',\n appId: 'validation-only',\n avatarId: 'validation-only',\n },\n }).liveKit;\n}\n\nasync function collectLiveKitCredentials(\n prompts: SetupPrompts,\n dependencies: Required<\n Pick<\n CredentialSetupDependencies,\n | 'loadLiveKitCredentials'\n | 'probeLiveKit'\n | 'planLiveKitInstall'\n | 'installLiveKit'\n | 'authenticateLiveKit'\n >\n >,\n onStatus: (message: string) => void,\n onWarning: (message: string) => void,\n): Promise<LiveKitCredentials | undefined> {\n let probe = await dependencies.probeLiveKit();\n let useCli = false;\n while (true) {\n if (!probe.available) {\n const update = probe.reason === 'incompatible';\n onWarning(\n update\n ? 'The installed LiveKit CLI needs an update to support `lk app env`.'\n : 'LiveKit CLI was not found on PATH. It is needed for browser-based setup.',\n );\n const plan = await dependencies.planLiveKitInstall(update);\n onStatus(\n plan === undefined\n ? `Install or update LiveKit CLI, then check again: ${LIVEKIT_INSTALL_GUIDE}`\n : `${update ? 'Update' : 'Install'} command: ${plan.displayCommand}`,\n );\n const action = await prompts.choose(\n 'Connect your LiveKit project',\n [\n ...(plan === undefined\n ? []\n : [\n {\n label: `${update ? 'Update' : 'Install'} LiveKit CLI and connect`,\n value: 'install',\n hint: 'Recommended; runs the command shown above',\n },\n ]),\n { label: \"I've installed it — check again\", value: 'retry' },\n { label: 'Enter credentials manually', value: 'manual' },\n { label: 'Set up later', value: 'skip' },\n ],\n plan === undefined ? 'manual' : 'install',\n );\n if (action === 'skip') return undefined;\n if (action === 'manual') return collectManualLiveKitCredentials(prompts);\n if (action === 'install' && plan !== undefined) {\n try {\n onStatus(`${update ? 'Updating' : 'Installing'} LiveKit CLI…`);\n await dependencies.installLiveKit(plan);\n } catch (error) {\n if (error instanceof PromptCancelledError) throw error;\n onWarning(\n 'LiveKit CLI installation did not complete. Retry, enter credentials manually, or set up later.',\n );\n continue;\n }\n }\n probe = await dependencies.probeLiveKit();\n if (!probe.available) {\n onWarning(\n 'A compatible lk is still unavailable in this terminal. If installation changed PATH, open a new terminal and run create-spatius-app setup . --interactive from your project.',\n );\n continue;\n }\n onStatus('LiveKit CLI is ready.');\n useCli = true;\n }\n\n const source = useCli\n ? 'cli'\n : await prompts.choose(\n 'How should LiveKit credentials be configured?',\n [\n {\n hint:\n probe.version === undefined\n ? 'Recommended; uses `lk app env`'\n : `Recommended; lk ${probe.version}`,\n label: 'Use the LiveKit CLI',\n value: 'cli',\n },\n {\n hint: 'Opens LiveKit in your browser using `lk cloud auth`',\n label: 'Connect another LiveKit project',\n value: 'connect',\n },\n {\n hint: 'Values are entered with secret masking',\n label: 'Enter credentials manually',\n value: 'manual',\n },\n { label: 'Set up later', value: 'skip' },\n ],\n 'cli',\n );\n if (source === 'skip') return undefined;\n if (source === 'manual') return collectManualLiveKitCredentials(prompts);\n try {\n if (source === 'connect') {\n onStatus(\n 'Opening LiveKit in your browser. Sign in and select a project.',\n );\n await dependencies.authenticateLiveKit();\n }\n onStatus(\n 'Starting the LiveKit project credential flow… Follow the LiveKit prompts to select a linked project or sign in through your browser.',\n );\n return await dependencies.loadLiveKitCredentials();\n } catch (error) {\n if (error instanceof PromptCancelledError) throw error;\n onWarning(\n 'The LiveKit CLI flow did not complete or returned invalid credentials.',\n );\n const action = await prompts.choose(\n 'How should LiveKit setup continue?',\n [\n { label: 'Retry LiveKit connection', value: 'retry' },\n { label: 'Enter credentials manually', value: 'manual' },\n { label: 'Set up later', value: 'skip' },\n ],\n 'manual',\n );\n if (action === 'skip') return undefined;\n if (action === 'manual') return collectManualLiveKitCredentials(prompts);\n useCli = false;\n }\n }\n}\n\nasync function collectManualSpatiusCredentials(\n prompts: SetupPrompts,\n): Promise<SpatiusCredentials> {\n return {\n apiKey: await prompts.password('Spatius API key'),\n appId: await prompts.password('Spatius app ID'),\n avatarId: await prompts.password('Spatius avatar ID'),\n };\n}\n\nasync function collectBrowserSpatiusCredentials(\n prompts: SetupPrompts,\n projectName: string,\n client: SpatiusApiClient,\n dependencies: Required<\n Pick<\n CredentialSetupDependencies,\n 'loginToSpatius' | 'selectSpatiusResources'\n >\n >,\n redactor: SecretRedactor,\n onStatus: (message: string) => void,\n onWarning: (message: string) => void,\n): Promise<SpatiusCredentials> {\n let session: SpatiusAuthenticatedSession | undefined;\n try {\n session = await dependencies.loginToSpatius({\n client,\n onAuthorizationUrl: (url) => {\n onStatus(`Approve Spatius access in your browser:\\n${url}`);\n },\n onBrowserOpenFailure: () => {\n onWarning(\n 'The browser could not be opened automatically. Use the printed authorization URL.',\n );\n },\n redactor,\n });\n return await dependencies.selectSpatiusResources({\n client,\n onWarning,\n projectName,\n prompts,\n redactor,\n session,\n });\n } finally {\n if (session !== undefined) {\n await session.revoke().catch(() => {\n onWarning(\n 'The temporary Spatius CLI session could not be revoked automatically. No session token was stored locally.',\n );\n });\n }\n }\n}\n\nasync function collectSpatiusCredentials(\n prompts: SetupPrompts,\n projectName: string,\n client: SpatiusApiClient,\n dependencies: Required<\n Pick<\n CredentialSetupDependencies,\n 'loginToSpatius' | 'selectSpatiusResources'\n >\n >,\n redactor: SecretRedactor,\n onStatus: (message: string) => void,\n onWarning: (message: string) => void,\n): Promise<SpatiusCredentials> {\n const source = await prompts.choose(\n 'How should Spatius credentials be configured?',\n [\n {\n hint: 'Recommended; login is temporary and browser-approved',\n label: 'Sign in with Spatius Studio',\n value: 'browser',\n },\n {\n hint: 'Values are entered with secret masking',\n label: 'Enter credentials manually',\n value: 'manual',\n },\n ],\n 'browser',\n );\n if (source === 'manual') {\n return collectManualSpatiusCredentials(prompts);\n }\n\n try {\n return await collectBrowserSpatiusCredentials(\n prompts,\n projectName,\n client,\n dependencies,\n redactor,\n onStatus,\n onWarning,\n );\n } catch (error) {\n if (error instanceof PromptCancelledError) {\n throw error;\n }\n const detail = redactor.redact(\n error instanceof Error ? error.message : 'Unknown provider error.',\n );\n onWarning(`Spatius browser setup did not complete: ${detail}`);\n const useManual = await prompts.confirm(\n 'Enter Spatius credentials manually instead?',\n true,\n );\n if (!useManual) {\n throw new PromptCancelledError('Credential setup was cancelled.');\n }\n return collectManualSpatiusCredentials(prompts);\n }\n}\n\nasync function confirmReplacement(\n state: CredentialFileState,\n prompts: SetupPrompts,\n onWarning: (message: string) => void,\n): Promise<boolean> {\n if (state.status === 'complete') {\n const keep = await prompts.confirm(\n 'A complete, consistent local credential configuration already exists. Keep it?',\n true,\n );\n if (keep) return false;\n } else if (state.hasManagedValues) {\n onWarning(\n state.status === 'inconsistent'\n ? 'The Worker and agent credential files contain inconsistent managed values.'\n : 'The local credential files contain only part of the required configuration.',\n );\n } else {\n return true;\n }\n\n return prompts.confirm(\n 'Replace the existing managed credential values? Unrelated variables and comments will be preserved.',\n false,\n );\n}\n\nfunction defaultClient(\n onDiagnostic?: (event: SpatiusRequestDiagnostic) => void,\n): SpatiusApiClient {\n const testBaseUrl =\n process.env.NODE_ENV === 'test'\n ? process.env.CREATE_SPATIUS_APP_TEST_SPATIUS_BASE_URL\n : undefined;\n return new SpatiusApiClient(\n testBaseUrl ?? SPATIUS_CONSOLE_BASE_URL,\n fetch,\n onDiagnostic,\n );\n}\n\nexport async function runCredentialSetup({\n dependencies = {},\n onDiagnostic,\n onStatus = () => undefined,\n onWarning = () => undefined,\n projectName,\n prompts,\n targetDirectory,\n}: CredentialSetupOptions): Promise<CredentialSetupResult> {\n const validateProject = dependencies.validateProject ?? assertSpatiusProject;\n const readState = dependencies.readState ?? readCredentialFileState;\n const readExamples = dependencies.readExamples ?? readCredentialExamples;\n const writeFiles = dependencies.writeFiles ?? writeCredentialFilesAtomically;\n const setupDependencies = {\n authenticateLiveKit:\n dependencies.authenticateLiveKit ?? authenticateLiveKitCli,\n installLiveKit: dependencies.installLiveKit ?? installLiveKitCli,\n planLiveKitInstall: dependencies.planLiveKitInstall ?? planLiveKitInstall,\n createSpatiusClient:\n dependencies.createSpatiusClient ?? (() => defaultClient(onDiagnostic)),\n loadLiveKitCredentials:\n dependencies.loadLiveKitCredentials ??\n (() => loadLiveKitCredentialsWithCli()),\n loginToSpatius:\n dependencies.loginToSpatius ??\n ((options) =>\n loginToSpatius({\n ...options,\n ...(process.env.NODE_ENV === 'test' &&\n process.env.CREATE_SPATIUS_APP_TEST_NO_BROWSER === '1'\n ? { openBrowser: () => Promise.resolve() }\n : {}),\n })),\n probeLiveKit: dependencies.probeLiveKit ?? (() => probeLiveKitCli()),\n selectSpatiusResources:\n dependencies.selectSpatiusResources ?? selectSpatiusResources,\n };\n\n // Validate the project boundary before inspecting any credential file.\n await validateProject(targetDirectory);\n const state = await readState(targetDirectory);\n const shouldReplace = await confirmReplacement(state, prompts, onWarning);\n if (!shouldReplace) {\n onStatus('Existing local credentials were left unchanged.');\n return 'unchanged';\n }\n\n const redactor = new SecretRedactor();\n const liveKit = await collectLiveKitCredentials(\n prompts,\n setupDependencies,\n onStatus,\n onWarning,\n );\n if (liveKit === undefined) {\n onStatus(\n 'Credential setup deferred. Run create-spatius-app setup . --interactive from your project when ready.',\n );\n return 'unchanged';\n }\n redactor.add(liveKit.apiKey, liveKit.apiSecret);\n const spatius = await collectSpatiusCredentials(\n prompts,\n projectName ?? basename(targetDirectory),\n setupDependencies.createSpatiusClient(),\n setupDependencies,\n redactor,\n onStatus,\n onWarning,\n );\n redactor.add(spatius.apiKey);\n const existingVoice = parseDotenv(state.worker ?? '').get(\n 'CARTESIA_VOICE_ID',\n );\n const initialVoice =\n CHARACTER_VOICES.find((voice) => voice.voiceId === existingVoice) ??\n CHARACTER_VOICES[0];\n const characterStyle = await prompts.choose(\n 'Which character style should the voice match for your selected avatar?',\n CHARACTER_VOICES.map(({ value, label, hint }) => ({ value, label, hint })),\n initialVoice.value,\n );\n const voice = CHARACTER_VOICES.find(\n (option) => option.value === characterStyle,\n );\n if (!voice)\n throw new Error('Choose a feminine or masculine character voice.');\n const credentials: CredentialBundle = validateCredentialBundle({\n voiceId: voice.voiceId,\n liveKit,\n spatius,\n });\n const examples = await readExamples(targetDirectory);\n const rendered = buildCredentialFileContents(state, examples, credentials);\n await writeFiles(targetDirectory, rendered);\n onStatus('Saved .dev.vars and agent/.env.local for local development only.');\n return 'configured';\n}\n\nexport type { SpatiusCallbackServer };\n","import { fileURLToPath } from 'node:url';\n\nimport { CliError, EXIT_CODES } from './errors.js';\nimport { cloudflareLivekitTemplate } from './templates/cloudflare-livekit/index.js';\nimport type { TemplateDefinition } from './templates/types.js';\n\nexport type {\n TemplateConfiguration,\n TemplateDefinition,\n} from './templates/types.js';\n\nexport const DEFAULT_TEMPLATE_ID = 'cloudflare-livekit' as const;\nexport const templateRegistry = {\n [DEFAULT_TEMPLATE_ID]: cloudflareLivekitTemplate,\n} as const satisfies Record<string, TemplateDefinition>;\nexport type TemplateId = keyof typeof templateRegistry;\n\nexport function getTemplate(\n id: TemplateId = DEFAULT_TEMPLATE_ID,\n): TemplateDefinition {\n return templateRegistry[id];\n}\n\nexport function resolveTemplateDirectory(\n template: TemplateDefinition = getTemplate(),\n): string {\n // Both src/templates.ts and the bundled dist/templates.js / dist/cli.js\n // live exactly one directory below the installed package root.\n return fileURLToPath(new URL(`../${template.directory}/`, import.meta.url));\n}\n\nexport async function resolveProjectTemplate(\n targetDirectory: string,\n templates: readonly TemplateDefinition[] = Object.values(templateRegistry),\n): Promise<TemplateDefinition> {\n const matches: TemplateDefinition[] = [];\n for (const template of templates) {\n if (await template.setup.recognizes(targetDirectory))\n matches.push(template);\n }\n if (matches.length !== 1) {\n throw new CliError(\n 'INVALID_ARGUMENT',\n matches.length === 0\n ? 'The target is not a compatible create-spatius-app project.'\n : 'The target matches more than one create-spatius-app template.',\n {\n exitCode: EXIT_CODES.invalidArgument,\n path: targetDirectory,\n recovery:\n 'Run this command from a generated project, or pass its directory explicitly.',\n },\n );\n }\n return matches[0]!;\n}\n\n// Internal verification entry point. These helpers are bundled for scripts\n// that exercise every registry entry without adding a public CLI selector.\nexport { createScaffoldPlan, scaffoldProject } from './scaffold.js';\nexport {\n createProcessInvocation,\n selectJavaScriptPackageManager,\n selectPythonPackageManager,\n} from './package-managers.js';\n","import { CliError } from '../../errors.js';\nimport {\n javascriptInstallCommand,\n javascriptRunCommand,\n pythonInstallCommands,\n} from '../../package-managers.js';\nimport { assertSpatiusProject } from '../../setup/project.js';\nimport type { TemplateDefinition } from '../types.js';\nimport { configureGeneratedTemplate } from './configure.js';\nimport { createInstallPlan } from './install.js';\n\nconst aliases: Readonly<Record<string, string>> = {\n 'dev.vars.example': '.dev.vars.example',\n dockerignore: '.dockerignore',\n 'env.example': '.env.example',\n gitignore: '.gitignore',\n npmrc: '.npmrc',\n prettierignore: '.prettierignore',\n 'python-version': '.python-version',\n 'Dockerfile.pip': 'Dockerfile',\n 'Dockerfile.uv': 'Dockerfile',\n};\n\nexport const cloudflareLivekitTemplate: TemplateDefinition = {\n id: 'cloudflare-livekit',\n directory: 'templates/cloudflare-livekit',\n description:\n 'Create a React, Cloudflare Workers, and LiveKit Agents application.',\n components: [\n '- web/ React + Spatius AvatarKit',\n '- worker/ Cloudflare token and dispatch API',\n '- agent/ Python LiveKit agent',\n ],\n includeFile(path, configuration) {\n const javascript = configuration?.packageManagers.javascript.name ?? 'pnpm';\n const python = configuration?.packageManagers.python.name ?? 'uv';\n if (path === 'package-lock.json') return javascript === 'npm';\n if (['npmrc', 'pnpm-lock.yaml', 'pnpm-workspace.yaml'].includes(path)) {\n return javascript === 'pnpm';\n }\n if (path === 'agent/uv.lock' || path === 'agent/Dockerfile.uv') {\n return python === 'uv';\n }\n if (path === 'agent/Dockerfile.pip') return python === 'pip';\n return true;\n },\n mapFile(path) {\n return path\n .split('/')\n .map((segment) => aliases[segment] ?? segment)\n .join('/');\n },\n configure: configureGeneratedTemplate,\n createInstallPlan,\n nextSteps({\n credentialsConfigured = false,\n dependenciesInstalled,\n javascriptPackageManager,\n platform,\n pythonPackageManager,\n }) {\n return [\n ...(dependenciesInstalled\n ? []\n : [\n javascriptInstallCommand(javascriptPackageManager),\n ...pythonInstallCommands(pythonPackageManager, platform),\n ]),\n ...(credentialsConfigured\n ? []\n : ['npx create-spatius-app setup . --interactive']),\n javascriptRunCommand(javascriptPackageManager, 'dev'),\n ];\n },\n setup: {\n async recognizes(directory) {\n // These structural markers also recognize projects generated before the\n // registry existed; no new manifest or metadata is required for setup.\n try {\n await assertSpatiusProject(directory);\n return true;\n } catch (error) {\n if (error instanceof CliError && error.code === 'INVALID_ARGUMENT') {\n return false;\n }\n throw error;\n }\n },\n async run(options) {\n const { runCredentialSetup } = await import('../../setup/wizard.js');\n return runCredentialSetup(options);\n },\n },\n verification: [\n { javascript: 'pnpm', python: 'uv', scripts: ['check', 'agent:check'] },\n { javascript: 'npm', python: 'pip', scripts: ['check', 'agent:check'] },\n ],\n};\n","import { randomUUID } from 'node:crypto';\nimport { readFile, writeFile } from 'node:fs/promises';\nimport { basename, join } from 'node:path';\n\nimport {\n javascriptInstallCommand,\n javascriptRunCommand,\n pythonInstallCommands,\n type SelectedPackageManagers,\n} from '../../package-managers.js';\nimport type { TemplateConfiguration } from '../types.js';\n\ninterface PackageMetadata {\n allowScripts?: Record<string, boolean>;\n name: string;\n packageManager?: string;\n scripts: Record<string, string>;\n trustedDependencies?: string[];\n}\n\ninterface PackageLockMetadata {\n name: string;\n packages?: Record<string, { name?: string }>;\n}\n\nexport function toValidPackageName(value: string): string {\n const normalized = value\n .trim()\n .toLowerCase()\n .replace(/\\s+/gu, '-')\n .replace(/^[._-]+/u, '')\n .replace(/[^a-z\\d~._-]+/gu, '-')\n .replace(/-+/gu, '-')\n .slice(0, 214)\n .replace(/-$/u, '');\n\n return normalized === '' ? 'spatius-app' : normalized;\n}\n\nfunction managerDescription(name: string, version: string | undefined): string {\n return version === undefined || version === 'unknown'\n ? name\n : `${name} ${version}`;\n}\n\nfunction npmRequiresScriptAllowlist(version: string | undefined): boolean {\n const major = Number.parseInt(version?.split('.')[0] ?? '', 10);\n return Number.isFinite(major) && major >= 12;\n}\n\nfunction createReplacements(\n packageManagers: SelectedPackageManagers,\n platform: NodeJS.Platform,\n): ReadonlyMap<string, string> {\n const javascript = packageManagers.javascript;\n const python = packageManagers.python;\n\n return new Map([\n [\n '{{SPATIUS_JAVASCRIPT_PACKAGE_MANAGER}}',\n managerDescription(javascript.name, javascript.version),\n ],\n [\n '{{SPATIUS_PYTHON_PACKAGE_MANAGER}}',\n managerDescription(python.name, python.version),\n ],\n [\n '__SPATIUS_JAVASCRIPT_INSTALL_COMMAND__',\n javascriptInstallCommand(javascript.name),\n ],\n [\n '__SPATIUS_PYTHON_INSTALL_COMMANDS__',\n pythonInstallCommands(python, platform).join('\\n'),\n ],\n [\n '__SPATIUS_PYTHON_INSTALL_SUMMARY__',\n pythonInstallCommands(python, platform).join(' && '),\n ],\n ['__SPATIUS_DEV_COMMAND__', javascriptRunCommand(javascript.name, 'dev')],\n [\n '__SPATIUS_WEB_DEV_COMMAND__',\n javascriptRunCommand(javascript.name, 'dev:web'),\n ],\n [\n '__SPATIUS_CHECK_COMMAND__',\n javascriptRunCommand(javascript.name, 'check'),\n ],\n [\n '__SPATIUS_AGENT_CHECK_COMMAND__',\n javascriptRunCommand(javascript.name, 'agent:check'),\n ],\n [\n '__SPATIUS_AGENT_DEV_COMMAND__',\n javascriptRunCommand(javascript.name, 'agent:dev'),\n ],\n [\n '__SPATIUS_CF_TYPEGEN_COMMAND__',\n javascriptRunCommand(javascript.name, 'cf-typegen'),\n ],\n [\n '__SPATIUS_DEPLOY_COMMAND__',\n javascriptRunCommand(javascript.name, 'deploy'),\n ],\n [\n '__SPATIUS_WRANGLER_LOGIN_COMMAND__',\n javascriptRunCommand(javascript.name, 'wrangler -- login'),\n ],\n [\n '__SPATIUS_WRANGLER_API_KEY_COMMAND__',\n javascriptRunCommand(\n javascript.name,\n 'wrangler -- secret put LIVEKIT_API_KEY',\n ),\n ],\n [\n '__SPATIUS_WRANGLER_API_SECRET_COMMAND__',\n javascriptRunCommand(\n javascript.name,\n 'wrangler -- secret put LIVEKIT_API_SECRET',\n ),\n ],\n ]);\n}\n\nasync function renderFile(\n path: string,\n replacements: ReadonlyMap<string, string>,\n): Promise<void> {\n let contents = await readFile(path, 'utf8');\n\n for (const [token, replacement] of replacements) {\n contents = contents.replaceAll(token, replacement);\n }\n\n await writeFile(path, contents);\n}\n\nexport async function configureGeneratedTemplate(\n targetDirectory: string,\n {\n packageManagers,\n platform = process.platform,\n projectName = basename(targetDirectory),\n }: TemplateConfiguration,\n): Promise<void> {\n const packagePath = join(targetDirectory, 'package.json');\n const packageContents = await readFile(packagePath, 'utf8');\n const metadata = JSON.parse(packageContents) as PackageMetadata;\n const javascript = packageManagers.javascript;\n const run = (script: string) => javascriptRunCommand(javascript.name, script);\n\n metadata.name = toValidPackageName(projectName);\n if (javascript.version === undefined || javascript.version === 'unknown') {\n delete metadata.packageManager;\n } else {\n metadata.packageManager = `${javascript.name}@${javascript.version}`;\n }\n\n metadata.scripts.check = [\n 'format:check',\n 'lint',\n 'typecheck',\n 'test',\n 'test:dev',\n 'build',\n ]\n .map(run)\n .join(' && ');\n metadata.scripts.deploy = `${run('build')} && wrangler deploy`;\n metadata.scripts.dev = `concurrently --kill-others --names web,agent \"${run('dev:web')}\" \"${run('agent:dev')}\"`;\n\n if (\n javascript.name === 'npm' &&\n npmRequiresScriptAllowlist(javascript.version)\n ) {\n metadata.allowScripts = {\n 'core-js': true,\n esbuild: true,\n workerd: true,\n };\n delete metadata.trustedDependencies;\n } else if (javascript.name === 'bun') {\n metadata.trustedDependencies = ['core-js', 'esbuild', 'workerd'];\n delete metadata.allowScripts;\n } else {\n delete metadata.allowScripts;\n delete metadata.trustedDependencies;\n }\n\n await writeFile(packagePath, `${JSON.stringify(metadata, undefined, 2)}\\n`);\n\n if (javascript.name === 'npm') {\n const packageLockPath = join(targetDirectory, 'package-lock.json');\n const packageLock = JSON.parse(\n await readFile(packageLockPath, 'utf8'),\n ) as PackageLockMetadata;\n packageLock.name = metadata.name;\n if (packageLock.packages?.[''] !== undefined) {\n packageLock.packages[''].name = metadata.name;\n }\n await writeFile(\n packageLockPath,\n `${JSON.stringify(packageLock, undefined, 2)}\\n`,\n );\n }\n\n const replacements = createReplacements(packageManagers, platform);\n // Generate once per project so registration and dispatch always agree.\n const agentReplacements = new Map([\n ['spatius-agent', `spatius-agent-${randomUUID()}`],\n ]);\n await Promise.all(\n [\n '.dev.vars.example',\n 'wrangler.jsonc',\n 'agent/src/agent.py',\n 'agent/README.md',\n 'worker/index.test.ts',\n ].map(async (relativePath) =>\n renderFile(join(targetDirectory, relativePath), agentReplacements),\n ),\n );\n await Promise.all(\n ['README.md', 'AGENTS.md', 'agent/README.md'].map(async (relativePath) =>\n renderFile(join(targetDirectory, relativePath), replacements),\n ),\n );\n}\n","import { posix, win32 } from 'node:path';\n\nimport type { InstallStep } from '../../install.js';\nimport {\n javascriptInstallCommand,\n pythonInstallCommands,\n type CommandSpec,\n type SelectedPackageManagers,\n} from '../../package-managers.js';\n\nfunction commandStep(\n command: CommandSpec,\n args: string[],\n cwd: string,\n displayCommand: string,\n label: string,\n): InstallStep {\n return {\n args: [...command.argsPrefix, ...args],\n command: command.command,\n cwd,\n displayCommand,\n label,\n };\n}\n\nexport function createInstallPlan(\n targetDirectory: string,\n packageManagers: SelectedPackageManagers,\n platform: NodeJS.Platform = process.platform,\n): InstallStep[] {\n const path = platform === 'win32' ? win32 : posix;\n const javascript = packageManagers.javascript;\n const python = packageManagers.python;\n const steps = [\n commandStep(\n javascript.command,\n ['install'],\n targetDirectory,\n javascriptInstallCommand(javascript.name),\n `Installing JavaScript dependencies with ${javascript.name}`,\n ),\n ];\n\n if (python.name === 'uv') {\n steps.push(\n commandStep(\n python.command,\n ['sync', '--directory', 'agent', '--extra', 'dev'],\n targetDirectory,\n pythonInstallCommands(python, platform)[0]!,\n 'Installing Python dependencies with uv',\n ),\n );\n return steps;\n }\n\n const runtime = python.pythonRuntime;\n if (runtime === undefined) {\n throw new Error('pip was selected without a Python runtime.');\n }\n\n const displayedCommands = pythonInstallCommands(python, platform);\n steps.push(\n commandStep(\n runtime,\n ['-m', 'venv', 'agent/.venv'],\n targetDirectory,\n displayedCommands[0]!,\n 'Creating the Python virtual environment',\n ),\n );\n\n const virtualEnvironmentPython =\n platform === 'win32'\n ? path.join(targetDirectory, 'agent', '.venv', 'Scripts', 'python.exe')\n : path.join(targetDirectory, 'agent', '.venv', 'bin', 'python');\n steps.push({\n args: ['-m', 'pip', 'install', '-e', '.[dev]'],\n command: virtualEnvironmentPython,\n cwd: path.join(targetDirectory, 'agent'),\n displayCommand: displayedCommands[1]!,\n label: 'Installing Python dependencies with pip',\n });\n\n return steps;\n}\n","import { constants } from 'node:fs';\nimport { copyFile, lstat, mkdir, readdir, rm } from 'node:fs/promises';\nimport { basename, dirname, isAbsolute, join, win32 } from 'node:path';\n\nimport { CliError, EXIT_CODES } from './errors.js';\nimport {\n assertTargetDirectoryAvailable,\n normalizeTargetDirectory,\n type TargetState,\n} from './project-directory.js';\nimport {\n getTemplate,\n resolveTemplateDirectory,\n type TemplateConfiguration,\n type TemplateDefinition,\n} from './templates.js';\n\nexport type CopyEntry = (source: string, destination: string) => Promise<void>;\n\ninterface ScaffoldProjectOptions {\n configuration?: TemplateConfiguration;\n copyEntry?: CopyEntry;\n targetDirectory: string;\n template?: TemplateDefinition;\n /** Explicit source override for isolated fixtures. */\n templateDirectory?: string;\n}\n\ninterface PlannedFile {\n destination: string;\n source: string;\n}\n\ninterface ScaffoldPlan {\n entries: PlannedFile[];\n files: string[];\n targetDirectory: string;\n targetState: TargetState;\n templateDirectory: string;\n}\n\nexport interface ScaffoldResult {\n files: string[];\n targetDirectory: string;\n}\n\nconst defaultCopyEntry: CopyEntry = async (source, destination) => {\n await copyFile(source, destination, constants.COPYFILE_EXCL);\n};\n\nconst ignoredTemplateEntries = new Set([\n '.DS_Store',\n '.npmignore',\n '.pytest_cache',\n '.ruff_cache',\n '.venv',\n '.wrangler',\n '__pycache__',\n 'coverage',\n 'dist',\n 'node_modules',\n 'test-results',\n 'playwright-report',\n]);\n\nfunction shouldIgnoreTemplateEntry(entry: string): boolean {\n return (\n ignoredTemplateEntries.has(entry) ||\n /\\.py[cod]$/u.test(entry) ||\n (/^\\.(?:env|dev\\.vars)(?:\\.|$)/u.test(entry) && !entry.endsWith('.example'))\n );\n}\n\nfunction assertRelativeDestination(path: string): void {\n if (\n isAbsolute(path) ||\n win32.isAbsolute(path) ||\n path.includes('\\\\') ||\n path.includes(':') ||\n path.includes('\\0') ||\n path.split('/').some((segment) => ['', '.', '..'].includes(segment))\n ) {\n throw new Error('Template file mappings must stay inside the project.');\n }\n}\n\nasync function listTemplateFiles(\n templateDirectory: string,\n template: TemplateDefinition,\n configuration: TemplateConfiguration | undefined,\n relativeDirectory = '',\n): Promise<PlannedFile[]> {\n const entries = await readdir(join(templateDirectory, relativeDirectory), {\n withFileTypes: true,\n });\n const files: PlannedFile[] = [];\n for (const entry of entries) {\n if (shouldIgnoreTemplateEntry(entry.name)) continue;\n const source = [relativeDirectory, entry.name].filter(Boolean).join('/');\n if (!template.includeFile(source, configuration)) continue;\n if (entry.isSymbolicLink()) {\n throw new Error('Bundled templates must not contain symbolic links.');\n }\n if (entry.isDirectory()) {\n files.push(\n ...(await listTemplateFiles(\n templateDirectory,\n template,\n configuration,\n source,\n )),\n );\n } else if (entry.isFile()) {\n const destination = template.mapFile(source);\n assertRelativeDestination(destination);\n files.push({ source, destination });\n } else {\n throw new Error('Bundled templates must contain regular files.');\n }\n }\n return files;\n}\n\nexport async function createScaffoldPlan({\n configuration,\n targetDirectory: targetDirectoryInput,\n template = getTemplate(),\n templateDirectory = resolveTemplateDirectory(template),\n}: ScaffoldProjectOptions): Promise<ScaffoldPlan> {\n const targetDirectory = normalizeTargetDirectory(targetDirectoryInput);\n const targetState = await assertTargetDirectoryAvailable(targetDirectory);\n\n let entries: PlannedFile[];\n try {\n const root = await lstat(templateDirectory);\n if (!root.isDirectory() || root.isSymbolicLink()) {\n throw new Error('The template must be a regular directory.');\n }\n entries = await listTemplateFiles(\n templateDirectory,\n template,\n configuration,\n );\n const destinations = new Set<string>();\n const directories = new Map<string, string>();\n for (const { destination } of entries) {\n // Reject mappings that would collide on case-insensitive filesystems too.\n const key = destination.toLowerCase();\n if (destinations.has(key) || directories.has(key)) {\n throw new Error('Template file mappings collide.');\n }\n destinations.add(key);\n const segments = destination.split('/');\n for (let index = 1; index < segments.length; index++) {\n const parent = segments.slice(0, index).join('/');\n const parentKey = parent.toLowerCase();\n if (destinations.has(parentKey))\n throw new Error('Template file mappings collide.');\n const existingParent = directories.get(parentKey);\n if (existingParent !== undefined && existingParent !== parent) {\n throw new Error(\n 'Template directory mappings use inconsistent casing.',\n );\n }\n directories.set(parentKey, parent);\n }\n }\n } catch (error) {\n throw new CliError(\n 'TEMPLATE_NOT_FOUND',\n 'The bundled project template could not be loaded at ' +\n templateDirectory +\n ': ' +\n (error instanceof Error ? error.message : 'unknown filesystem error'),\n {\n exitCode: EXIT_CODES.filesystem,\n path: templateDirectory,\n recovery: 'Reinstall create-spatius-app and try again.',\n },\n );\n }\n\n if (entries.length === 0) {\n throw new CliError(\n 'TEMPLATE_NOT_FOUND',\n 'The bundled project template is empty.',\n {\n exitCode: EXIT_CODES.filesystem,\n path: templateDirectory,\n recovery: 'Reinstall create-spatius-app and try again.',\n },\n );\n }\n\n entries.sort((left, right) =>\n left.destination < right.destination\n ? -1\n : left.destination > right.destination\n ? 1\n : 0,\n );\n return {\n entries,\n files: entries.map((entry) => entry.destination),\n targetDirectory,\n targetState,\n templateDirectory,\n };\n}\n\nasync function rollback(\n targetDirectory: string,\n targetCreated: boolean,\n createdPaths: readonly string[],\n): Promise<void> {\n if (targetCreated) {\n await rm(targetDirectory, { force: true, recursive: true });\n return;\n }\n for (const path of [...createdPaths].reverse()) {\n await rm(path, { force: true, recursive: true });\n }\n}\n\nexport async function scaffoldProject({\n configuration,\n copyEntry = defaultCopyEntry,\n targetDirectory: targetDirectoryInput,\n template = getTemplate(),\n templateDirectory = resolveTemplateDirectory(template),\n}: ScaffoldProjectOptions): Promise<ScaffoldResult> {\n const plan = await createScaffoldPlan({\n configuration,\n targetDirectory: targetDirectoryInput,\n template,\n templateDirectory,\n });\n const { targetDirectory } = plan;\n const createdPaths: string[] = [];\n const createdDirectories = new Set([targetDirectory]);\n let targetCreated = false;\n\n async function createParent(directory: string): Promise<void> {\n if (createdDirectories.has(directory)) return;\n await createParent(dirname(directory));\n await mkdir(directory);\n createdPaths.push(directory);\n createdDirectories.add(directory);\n }\n\n try {\n // Recheck after planning so a destination populated during a slow read\n // is never treated as the originally empty directory.\n const targetState = await assertTargetDirectoryAvailable(targetDirectory);\n if (targetState === 'missing') {\n await mkdir(dirname(targetDirectory), { recursive: true });\n await mkdir(targetDirectory);\n targetCreated = true;\n }\n\n for (const entry of plan.entries) {\n const source = join(templateDirectory, entry.source);\n const destination = join(targetDirectory, entry.destination);\n const stats = await lstat(source);\n if (!stats.isFile() || stats.isSymbolicLink()) {\n throw new Error('A template source is no longer a regular file.');\n }\n await createParent(dirname(destination));\n createdPaths.push(destination);\n await copyEntry(source, destination);\n }\n if (configuration !== undefined) {\n await template.configure(targetDirectory, configuration);\n }\n } catch (error) {\n await rollback(targetDirectory, targetCreated, createdPaths).catch(\n () => undefined,\n );\n throw new CliError(\n 'FILESYSTEM_ERROR',\n 'Could not create ' +\n basename(targetDirectory) +\n ': ' +\n (error instanceof Error ? error.message : 'unknown filesystem error'),\n {\n exitCode: EXIT_CODES.filesystem,\n path: targetDirectory,\n recovery: 'Check filesystem permissions and try again.',\n },\n );\n }\n return { files: plan.files, targetDirectory };\n}\n","import { homedir } from 'node:os';\nimport { lstat, readdir } from 'node:fs/promises';\nimport { parse, resolve } from 'node:path';\n\nimport { CliError, EXIT_CODES } from './errors.js';\n\nexport type TargetState =\n 'empty-directory' | 'missing' | 'not-a-directory' | 'non-empty-directory';\n\nexport function normalizeTargetDirectory(\n input: string,\n currentWorkingDirectory = process.cwd(),\n): string {\n return resolve(currentWorkingDirectory, input);\n}\n\nexport function assertSafeTargetDirectory(\n targetDirectory: string,\n homeDirectory = homedir(),\n): void {\n const normalizedTarget = resolve(targetDirectory);\n\n if (normalizedTarget === parse(normalizedTarget).root) {\n throw new CliError(\n 'UNSAFE_TARGET',\n 'Refusing to create a project at the filesystem root.',\n {\n exitCode: EXIT_CODES.invalidArgument,\n path: normalizedTarget,\n recovery: 'Choose a dedicated project directory.',\n },\n );\n }\n\n if (normalizedTarget === resolve(homeDirectory)) {\n throw new CliError(\n 'UNSAFE_TARGET',\n 'Refusing to create a project directly in the home directory.',\n {\n exitCode: EXIT_CODES.invalidArgument,\n path: normalizedTarget,\n recovery:\n 'Choose a dedicated project directory inside your home directory.',\n },\n );\n }\n}\n\nexport async function inspectTargetDirectory(\n targetDirectory: string,\n): Promise<TargetState> {\n try {\n const stats = await lstat(targetDirectory);\n\n if (!stats.isDirectory() || stats.isSymbolicLink()) {\n return 'not-a-directory';\n }\n\n const entries = await readdir(targetDirectory);\n return entries.length === 0 ? 'empty-directory' : 'non-empty-directory';\n } catch (error) {\n if (isNodeError(error) && error.code === 'ENOENT') {\n return 'missing';\n }\n\n throw error;\n }\n}\n\nexport async function assertTargetDirectoryAvailable(\n targetDirectory: string,\n): Promise<TargetState> {\n assertSafeTargetDirectory(targetDirectory);\n\n const state = await inspectTargetDirectory(targetDirectory);\n\n if (state === 'not-a-directory') {\n throw new CliError(\n 'TARGET_NOT_DIRECTORY',\n `The target path is not a directory: ${targetDirectory}`,\n {\n exitCode: EXIT_CODES.targetConflict,\n path: targetDirectory,\n recovery: 'Choose a path that is missing or is an empty directory.',\n },\n );\n }\n\n if (state === 'non-empty-directory') {\n throw new CliError(\n 'TARGET_NOT_EMPTY',\n `The target directory is not empty: ${targetDirectory}\\nChoose a new directory or remove its contents first.`,\n {\n exitCode: EXIT_CODES.targetConflict,\n path: targetDirectory,\n recovery: 'Choose an empty directory or remove its contents first.',\n },\n );\n }\n\n return state;\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && 'code' in error;\n}\n"],"mappings":"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","names":["lstat","readFile","writeFile","randomUUID","join","spawn","chmod","readFile","rm","writeFile","join","tmpdir","execFile","key","index","app","avatar","basename","voice","join","runCredentialSetup","lstat","readdir","rm","basename","join","win32","lstat","win32","readdir","join","lstat","rm","basename"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/package-managers.ts","../src/setup/project.ts","../src/templates/cloudflare-livekit/voices.ts","../src/setup/environment.ts","../src/setup/livekit.ts","../src/setup/livekit-install.ts","../src/setup/redaction.ts","../src/setup/success-page.ts","../src/setup/spatius-api.ts","../src/setup/spatius-auth.ts","../src/setup/spatius-resources.ts","../src/setup/wizard.ts","../src/templates.ts","../src/templates/cloudflare-livekit/index.ts","../src/templates/cloudflare-livekit/configure.ts","../src/templates/cloudflare-livekit/install.ts","../src/scaffold.ts","../src/project-directory.ts"],"sourcesContent":["export const EXIT_CODES = {\n cancelled: 130,\n filesystem: 4,\n general: 1,\n invalidArgument: 2,\n success: 0,\n targetConflict: 3,\n} as const;\n\nexport type CliErrorCode =\n | 'CANCELLED'\n | 'FILESYSTEM_ERROR'\n | 'INSTALL_FAILED'\n | 'INVALID_ARGUMENT'\n | 'PACKAGE_MANAGER_NOT_FOUND'\n | 'PACKAGE_MANAGER_UNAVAILABLE'\n | 'TARGET_NOT_DIRECTORY'\n | 'TARGET_NOT_EMPTY'\n | 'TEMPLATE_NOT_FOUND'\n | 'UNSAFE_TARGET'\n | 'UNKNOWN_ERROR';\n\ninterface CliErrorOptions {\n exitCode?: number;\n path?: string;\n recovery?: string;\n}\n\nexport class CliError extends Error {\n readonly code: CliErrorCode;\n readonly exitCode: number;\n readonly path?: string;\n readonly recovery?: string;\n\n constructor(\n code: CliErrorCode,\n message: string,\n { exitCode = EXIT_CODES.general, path, recovery }: CliErrorOptions = {},\n ) {\n super(message);\n this.name = 'CliError';\n this.code = code;\n this.exitCode = exitCode;\n this.path = path;\n this.recovery = recovery;\n }\n}\n\nexport class PromptCancelledError extends CliError {\n constructor(message = 'Project creation was cancelled.') {\n super('CANCELLED', message, {\n exitCode: EXIT_CODES.cancelled,\n recovery: 'Run the command again when you are ready.',\n });\n this.name = 'PromptCancelledError';\n }\n}\n\nexport function normalizeError(error: unknown): CliError {\n if (error instanceof CliError) {\n return error;\n }\n\n if (error instanceof Error && error.message.trim() !== '') {\n return new CliError('UNKNOWN_ERROR', error.message);\n }\n\n return new CliError(\n 'UNKNOWN_ERROR',\n 'An unexpected error occurred while creating the project.',\n );\n}\n\nexport function formatError(error: unknown): string {\n return normalizeError(error).message;\n}\n","import { execFile, spawn, type ChildProcess } from 'node:child_process';\n\nimport { CliError, EXIT_CODES } from './errors.js';\n\nexport const JAVASCRIPT_PACKAGE_MANAGERS = ['pnpm', 'bun', 'npm'] as const;\nexport const PYTHON_PACKAGE_MANAGERS = ['uv', 'pip'] as const;\n\nexport type JavaScriptPackageManager =\n (typeof JAVASCRIPT_PACKAGE_MANAGERS)[number];\nexport type PythonPackageManager = (typeof PYTHON_PACKAGE_MANAGERS)[number];\n\nexport interface CommandSpec {\n argsPrefix: string[];\n command: string;\n displayName: string;\n}\n\nexport interface ProcessInvocation {\n args: string[];\n command: string;\n}\n\nexport interface DetectedJavaScriptPackageManager {\n available: true;\n command: CommandSpec;\n name: JavaScriptPackageManager;\n version: string;\n}\n\nexport interface DetectedPythonPackageManager {\n available: true;\n command: CommandSpec;\n name: PythonPackageManager;\n pythonRuntime?: CommandSpec;\n version: string;\n}\n\nexport interface SelectedJavaScriptPackageManager {\n available: boolean;\n command: CommandSpec;\n name: JavaScriptPackageManager;\n version?: string;\n}\n\nexport interface SelectedPythonPackageManager {\n available: boolean;\n command: CommandSpec;\n name: PythonPackageManager;\n pythonRuntime?: CommandSpec;\n version?: string;\n}\n\nexport interface PackageManagerInventory {\n javascript: DetectedJavaScriptPackageManager[];\n python: DetectedPythonPackageManager[];\n}\n\nexport interface SelectedPackageManagers {\n javascript: SelectedJavaScriptPackageManager;\n python: SelectedPythonPackageManager;\n}\n\nexport type ProbeCommand = (command: CommandSpec) => Promise<string>;\n\ninterface ProbePackageManagerOptions {\n platform?: NodeJS.Platform;\n timeoutMs?: number;\n}\n\nexport function requiresWindowsCommandShell(\n command: string,\n platform: NodeJS.Platform = process.platform,\n): boolean {\n if (platform !== 'win32') {\n return false;\n }\n\n const executableName = command.split(/[\\\\/]/u).at(-1)?.toLowerCase();\n return (\n executableName !== undefined &&\n (['npm', 'pnpm', 'bun', 'uv', 'lk'].includes(executableName) ||\n executableName.endsWith('.cmd') ||\n executableName.endsWith('.bat'))\n );\n}\n\nexport function createProcessInvocation(\n command: string,\n args: readonly string[],\n platform: NodeJS.Platform = process.platform,\n environment: NodeJS.ProcessEnv = process.env,\n): ProcessInvocation {\n if (!requiresWindowsCommandShell(command, platform)) {\n return { args: [...args], command };\n }\n\n return {\n args: ['/d', '/s', '/c', command, ...args],\n command: environment.ComSpec ?? environment.COMSPEC ?? 'cmd.exe',\n };\n}\n\nasync function terminateProcessTree(\n child: ChildProcess,\n platform: NodeJS.Platform,\n): Promise<void> {\n if (child.pid === undefined) {\n child.kill('SIGKILL');\n return;\n }\n\n if (platform === 'win32') {\n await new Promise<void>((resolvePromise) => {\n execFile(\n 'taskkill.exe',\n ['/pid', String(child.pid), '/t', '/f'],\n { timeout: 2000, windowsHide: true },\n () => resolvePromise(),\n );\n });\n child.kill('SIGKILL');\n return;\n }\n\n try {\n process.kill(-child.pid, 'SIGKILL');\n } catch {\n child.kill('SIGKILL');\n }\n}\n\nexport function probePackageManagerCommand(\n command: CommandSpec,\n {\n platform = process.platform,\n timeoutMs = 3000,\n }: ProbePackageManagerOptions = {},\n): Promise<string> {\n return new Promise((resolvePromise, reject) => {\n const invocation = createProcessInvocation(\n command.command,\n [...command.argsPrefix, '--version'],\n platform,\n );\n const child = spawn(invocation.command, invocation.args, {\n detached: platform !== 'win32',\n stdio: ['ignore', 'pipe', 'pipe'],\n windowsHide: true,\n });\n let settled = false;\n let timedOut = false;\n let stderr = '';\n let stdout = '';\n\n child.stdout?.setEncoding('utf8');\n child.stderr?.setEncoding('utf8');\n child.stdout?.on('data', (chunk: string) => {\n stdout += chunk;\n });\n child.stderr?.on('data', (chunk: string) => {\n stderr += chunk;\n });\n\n const timeout = setTimeout(() => {\n timedOut = true;\n void terminateProcessTree(child, platform).finally(() => {\n if (settled) {\n return;\n }\n\n settled = true;\n reject(\n new Error(\n `${command.displayName} --version timed out after ${String(timeoutMs)}ms.`,\n ),\n );\n });\n }, timeoutMs);\n\n child.once('error', (error) => {\n if (settled || timedOut) {\n return;\n }\n\n settled = true;\n clearTimeout(timeout);\n reject(new Error(error.message, { cause: error }));\n });\n child.once('close', (code, signal) => {\n if (settled || timedOut) {\n return;\n }\n\n settled = true;\n clearTimeout(timeout);\n if (code !== 0) {\n const reason =\n signal === null ? `exit code ${String(code)}` : `signal ${signal}`;\n reject(new Error(`${command.displayName} failed with ${reason}.`));\n return;\n }\n\n resolvePromise(`${stdout}\\n${stderr}`.trim());\n });\n });\n}\n\nfunction executable(command: string, ...argsPrefix: string[]): CommandSpec {\n return {\n argsPrefix,\n command,\n displayName: [command, ...argsPrefix].join(' '),\n };\n}\n\nfunction parseVersion(output: string): string {\n return output.match(/\\d+\\.\\d+(?:\\.\\d+)?(?:-[\\w.-]+)?/u)?.[0] ?? 'unknown';\n}\n\nasync function detectJavaScriptManager(\n name: JavaScriptPackageManager,\n probe: ProbeCommand,\n): Promise<DetectedJavaScriptPackageManager | undefined> {\n const command = executable(name);\n\n try {\n return {\n available: true,\n command,\n name,\n version: parseVersion(await probe(command)),\n };\n } catch {\n return undefined;\n }\n}\n\nfunction pythonRuntimeCandidates(platform: NodeJS.Platform): CommandSpec[] {\n return platform === 'win32'\n ? [executable('py', '-3'), executable('python'), executable('python3')]\n : [executable('python3'), executable('python')];\n}\n\nasync function detectPip(\n probe: ProbeCommand,\n platform: NodeJS.Platform,\n): Promise<DetectedPythonPackageManager | undefined> {\n for (const pythonRuntime of pythonRuntimeCandidates(platform)) {\n const command = executable(\n pythonRuntime.command,\n ...pythonRuntime.argsPrefix,\n '-m',\n 'pip',\n );\n\n try {\n return {\n available: true,\n command,\n name: 'pip',\n pythonRuntime,\n version: parseVersion(await probe(command)),\n };\n } catch {\n // Try the next platform-appropriate Python launcher.\n }\n }\n\n return undefined;\n}\n\nasync function detectUv(\n probe: ProbeCommand,\n): Promise<DetectedPythonPackageManager | undefined> {\n const command = executable('uv');\n\n try {\n return {\n available: true,\n command,\n name: 'uv',\n version: parseVersion(await probe(command)),\n };\n } catch {\n return undefined;\n }\n}\n\ninterface DetectPackageManagersOptions {\n javascript?: readonly JavaScriptPackageManager[];\n platform?: NodeJS.Platform;\n probe?: ProbeCommand;\n python?: readonly PythonPackageManager[];\n}\n\nexport async function detectPackageManagers({\n javascript = JAVASCRIPT_PACKAGE_MANAGERS,\n platform = process.platform,\n probe = probePackageManagerCommand,\n python = PYTHON_PACKAGE_MANAGERS,\n}: DetectPackageManagersOptions = {}): Promise<PackageManagerInventory> {\n const [javascriptResults, pythonResults] = await Promise.all([\n Promise.all(\n javascript.map(async (name) => detectJavaScriptManager(name, probe)),\n ),\n Promise.all(\n python.map(async (name) =>\n name === 'uv' ? detectUv(probe) : detectPip(probe, platform),\n ),\n ),\n ]);\n\n return {\n javascript: javascriptResults.filter(\n (manager): manager is DetectedJavaScriptPackageManager =>\n manager !== undefined,\n ),\n python: pythonResults.filter(\n (manager): manager is DetectedPythonPackageManager =>\n manager !== undefined,\n ),\n };\n}\n\nexport function inferInvokingPackageManager(\n userAgent: string | undefined,\n): JavaScriptPackageManager | undefined {\n const name = userAgent?.split(' ')[0]?.split('/')[0];\n return JAVASCRIPT_PACKAGE_MANAGERS.find((manager) => manager === name);\n}\n\nfunction unavailableJavaScriptManager(\n name: JavaScriptPackageManager,\n): SelectedJavaScriptPackageManager {\n return {\n available: false,\n command: executable(name),\n name,\n };\n}\n\nfunction unavailablePythonManager(\n name: PythonPackageManager,\n platform: NodeJS.Platform,\n): SelectedPythonPackageManager {\n if (name === 'uv') {\n return {\n available: false,\n command: executable('uv'),\n name,\n };\n }\n\n const pythonRuntime = pythonRuntimeCandidates(platform)[0]!;\n return {\n available: false,\n command: executable(\n pythonRuntime.command,\n ...pythonRuntime.argsPrefix,\n '-m',\n 'pip',\n ),\n name,\n pythonRuntime,\n };\n}\n\nexport function selectJavaScriptPackageManager(\n inventory: PackageManagerInventory,\n explicit: JavaScriptPackageManager | undefined,\n userAgent: string | undefined,\n): SelectedJavaScriptPackageManager {\n if (explicit !== undefined) {\n return (\n inventory.javascript.find((manager) => manager.name === explicit) ??\n unavailableJavaScriptManager(explicit)\n );\n }\n\n const invoked = inferInvokingPackageManager(userAgent);\n const selected =\n inventory.javascript.find((manager) => manager.name === invoked) ??\n inventory.javascript[0];\n\n if (selected === undefined) {\n throw new CliError(\n 'PACKAGE_MANAGER_NOT_FOUND',\n 'No supported JavaScript package manager was found.',\n {\n exitCode: EXIT_CODES.invalidArgument,\n recovery: 'Install pnpm, Bun, or npm, then run the command again.',\n },\n );\n }\n\n return selected;\n}\n\nexport function selectPythonPackageManager(\n inventory: PackageManagerInventory,\n explicit: PythonPackageManager | undefined,\n platform: NodeJS.Platform = process.platform,\n): SelectedPythonPackageManager {\n if (explicit !== undefined) {\n return (\n inventory.python.find((manager) => manager.name === explicit) ??\n unavailablePythonManager(explicit, platform)\n );\n }\n\n const selected = inventory.python[0];\n if (selected === undefined) {\n throw new CliError(\n 'PACKAGE_MANAGER_NOT_FOUND',\n 'No supported Python package manager was found.',\n {\n exitCode: EXIT_CODES.invalidArgument,\n recovery:\n 'Install uv, or install Python with pip, then run the command again.',\n },\n );\n }\n\n return selected;\n}\n\nexport function assertPackageManagersAvailable(\n packageManagers: SelectedPackageManagers,\n): void {\n const unavailable = [packageManagers.javascript, packageManagers.python].find(\n (manager) => !manager.available,\n );\n\n if (unavailable !== undefined) {\n throw new CliError(\n 'PACKAGE_MANAGER_UNAVAILABLE',\n `${unavailable.name} was selected but is not available on PATH.`,\n {\n exitCode: EXIT_CODES.invalidArgument,\n recovery:\n 'Install the selected package manager, choose an available one, or use --no-install.',\n },\n );\n }\n}\n\nexport function javascriptInstallCommand(\n packageManager: JavaScriptPackageManager,\n): string {\n return `${packageManager} install`;\n}\n\nexport function javascriptRunCommand(\n packageManager: JavaScriptPackageManager,\n script: string,\n): string {\n return `${packageManager} run ${script}`;\n}\n\nexport function pythonInstallCommands(\n packageManager: SelectedPythonPackageManager,\n platform: NodeJS.Platform = process.platform,\n): string[] {\n if (packageManager.name === 'uv') {\n return ['uv sync --directory agent --extra dev'];\n }\n\n const python =\n packageManager.pythonRuntime?.displayName ??\n (platform === 'win32' ? 'py -3' : 'python3');\n const virtualEnvironmentPython =\n platform === 'win32'\n ? 'agent\\\\.venv\\\\Scripts\\\\python.exe'\n : 'agent/.venv/bin/python';\n\n return [\n `${python} -m venv agent/.venv`,\n `${virtualEnvironmentPython} -m pip install -e \"./agent[dev]\"`,\n ];\n}\n","import { lstat } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { CliError, EXIT_CODES } from '../errors.js';\n\nconst requiredProjectPaths = [\n 'package.json',\n 'wrangler.jsonc',\n '.dev.vars.example',\n 'worker/index.ts',\n 'agent/src/agent.py',\n 'agent/.env.example',\n] as const;\nconst requiredProjectDirectories = ['agent', 'worker'] as const;\n\nexport async function assertSpatiusProject(\n targetDirectory: string,\n): Promise<void> {\n try {\n const target = await lstat(targetDirectory);\n if (!target.isDirectory() || target.isSymbolicLink()) {\n throw new Error('not a regular directory');\n }\n\n await Promise.all([\n ...requiredProjectDirectories.map(async (relativePath) => {\n const stats = await lstat(join(targetDirectory, relativePath));\n if (!stats.isDirectory() || stats.isSymbolicLink()) {\n throw new Error(`${relativePath} is not a regular directory`);\n }\n }),\n ...requiredProjectPaths.map(async (relativePath) => {\n const stats = await lstat(join(targetDirectory, relativePath));\n if (!stats.isFile() || stats.isSymbolicLink()) {\n throw new Error(`${relativePath} is not a regular file`);\n }\n }),\n ]);\n } catch {\n throw new CliError(\n 'INVALID_ARGUMENT',\n 'The target is not a compatible create-spatius-app project.',\n {\n exitCode: EXIT_CODES.invalidArgument,\n path: targetDirectory,\n recovery:\n 'Run this command from a generated project, or pass its directory explicitly.',\n },\n );\n }\n}\n","// Standard Cartesia voices listed by LiveKit Inference:\n// https://docs.livekit.io/agents/models/tts/cartesia/\nexport const CHARACTER_VOICES = [\n {\n value: 'feminine',\n label: 'Feminine — Jacqueline',\n hint: 'Standard female voice · English (US)',\n voiceId: '9626c31c-bec5-4cca-baa8-f8ba9e84c8bc',\n },\n {\n value: 'masculine',\n label: 'Masculine — Blake',\n hint: 'Standard male voice · English (US)',\n voiceId: 'a167e0f3-df7e-4d52-a9c3-f949145efdab',\n },\n] as const;\n","import {\n chmod,\n lstat,\n readFile,\n rename,\n rm,\n writeFile,\n} from 'node:fs/promises';\nimport { randomUUID } from 'node:crypto';\nimport { join } from 'node:path';\n\nimport { CliError, EXIT_CODES } from '../errors.js';\n\nexport interface LiveKitCredentials {\n apiKey: string;\n apiSecret: string;\n url: string;\n}\n\nexport interface SpatiusCredentials {\n backgroundUrl?: string;\n apiKey: string;\n appId: string;\n avatarId: string;\n}\n\nexport interface CredentialBundle {\n voiceId?: string;\n liveKit: LiveKitCredentials;\n spatius: SpatiusCredentials;\n}\n\nexport const WORKER_MANAGED_KEYS = [\n 'LIVEKIT_URL',\n 'LIVEKIT_API_KEY',\n 'LIVEKIT_API_SECRET',\n 'LIVEKIT_AGENT_NAME',\n 'SPATIUS_APP_ID',\n 'SPATIUS_AVATAR_ID',\n] as const;\n\nexport const AGENT_MANAGED_KEYS = [\n 'LIVEKIT_URL',\n 'LIVEKIT_API_KEY',\n 'LIVEKIT_API_SECRET',\n 'SPATIUS_API_KEY',\n 'SPATIUS_APP_ID',\n] as const;\n\ntype ManagedKey =\n (typeof WORKER_MANAGED_KEYS)[number] | (typeof AGENT_MANAGED_KEYS)[number];\n\nexport interface CredentialFileContents {\n agent: string;\n worker: string;\n}\n\nexport type CredentialConfigurationStatus =\n 'complete' | 'inconsistent' | 'missing' | 'placeholder';\n\nexport interface CredentialFileState {\n agent?: string;\n hasManagedValues: boolean;\n status: CredentialConfigurationStatus;\n worker?: string;\n}\n\nconst assignmentPattern =\n /^\\s*(?:export\\s+)?([A-Za-z_][A-Za-z\\d_]*)\\s*=\\s*(.*)$/u;\n\nfunction parseQuotedValue(rawValue: string): string {\n const value = rawValue.trim();\n if (value.startsWith('\"')) {\n const match = value.match(/^((?:\"(?:\\\\.|[^\"\\\\])*\")).*$/u);\n if (match?.[1] !== undefined) {\n try {\n return JSON.parse(match[1]) as string;\n } catch {\n return match[1].slice(1, -1);\n }\n }\n }\n\n if (value.startsWith(\"'\")) {\n const closingQuote = value.indexOf(\"'\", 1);\n if (closingQuote !== -1) {\n return value.slice(1, closingQuote);\n }\n }\n\n return value.replace(/\\s+#.*$/u, '').trim();\n}\n\nexport function parseDotenv(contents: string): Map<string, string> {\n const values = new Map<string, string>();\n for (const line of contents.split(/\\r?\\n/u)) {\n const match = line.match(assignmentPattern);\n if (match?.[1] !== undefined && match[2] !== undefined) {\n values.set(match[1], parseQuotedValue(match[2]));\n }\n }\n\n return values;\n}\n\nexport function isPlaceholderValue(value: string | undefined): boolean {\n if (value === undefined || value.trim() === '') {\n return true;\n }\n\n const normalized = value.trim().toLowerCase();\n return (\n normalized.includes('your-') ||\n normalized.includes('your_') ||\n normalized.includes('replace-me') ||\n normalized.includes('changeme') ||\n normalized.includes('placeholder') ||\n /^<[^>]+>$/u.test(normalized)\n );\n}\n\nfunction assertSafeValue(name: string, value: string): string {\n const normalized = value.trim();\n if (isPlaceholderValue(normalized)) {\n throw new CliError(\n 'INVALID_ARGUMENT',\n `${name} must be a non-placeholder value.`,\n { exitCode: EXIT_CODES.invalidArgument },\n );\n }\n if (/\\p{Cc}/u.test(normalized)) {\n throw new CliError(\n 'INVALID_ARGUMENT',\n `${name} cannot contain control characters.`,\n { exitCode: EXIT_CODES.invalidArgument },\n );\n }\n\n return normalized;\n}\n\nexport function validateLiveKitUrl(value: string): string {\n const normalized = assertSafeValue('LIVEKIT_URL', value);\n let parsed: URL;\n try {\n parsed = new URL(normalized);\n } catch {\n throw new CliError(\n 'INVALID_ARGUMENT',\n 'LIVEKIT_URL must be a valid https:// or wss:// URL.',\n { exitCode: EXIT_CODES.invalidArgument },\n );\n }\n\n if (!['https:', 'wss:'].includes(parsed.protocol) || parsed.hostname === '') {\n throw new CliError(\n 'INVALID_ARGUMENT',\n 'LIVEKIT_URL must use https:// or wss://.',\n { exitCode: EXIT_CODES.invalidArgument },\n );\n }\n\n return normalized;\n}\n\n// Optional public presentation metadata is never required for credential completeness.\nexport function publicBackgroundUrl(\n value: string | undefined,\n): string | undefined {\n if (!value) return undefined;\n try {\n const url = new URL(value);\n return url.protocol === 'https:' && !url.username && !url.password\n ? url.href\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function validateCredentialBundle(\n credentials: CredentialBundle,\n): CredentialBundle {\n return {\n ...(credentials.voiceId === undefined\n ? {}\n : {\n voiceId: assertSafeValue('CARTESIA_VOICE_ID', credentials.voiceId),\n }),\n liveKit: {\n apiKey: assertSafeValue('LIVEKIT_API_KEY', credentials.liveKit.apiKey),\n apiSecret: assertSafeValue(\n 'LIVEKIT_API_SECRET',\n credentials.liveKit.apiSecret,\n ),\n url: validateLiveKitUrl(credentials.liveKit.url),\n },\n spatius: {\n backgroundUrl: publicBackgroundUrl(credentials.spatius.backgroundUrl),\n apiKey: assertSafeValue('SPATIUS_API_KEY', credentials.spatius.apiKey),\n appId: assertSafeValue('SPATIUS_APP_ID', credentials.spatius.appId),\n avatarId: assertSafeValue(\n 'SPATIUS_AVATAR_ID',\n credentials.spatius.avatarId,\n ),\n },\n };\n}\n\nfunction managedValues(\n contents: string | undefined,\n keys: readonly ManagedKey[],\n): Map<string, string> {\n const parsed = parseDotenv(contents ?? '');\n return new Map(\n keys.flatMap((key) => {\n const value = parsed.get(key);\n return value === undefined ? [] : [[key, value] as const];\n }),\n );\n}\n\nexport function inspectCredentialConfiguration(\n contents: Pick<CredentialFileState, 'agent' | 'worker'>,\n expectedAgentName = 'spatius-agent',\n): Omit<CredentialFileState, 'agent' | 'worker'> {\n const worker = managedValues(contents.worker, WORKER_MANAGED_KEYS);\n const agent = managedValues(contents.agent, AGENT_MANAGED_KEYS);\n const allEntries = [...worker.entries(), ...agent.entries()];\n const hasManagedValues =\n allEntries.length > 0 ||\n parseDotenv(contents.worker ?? '').has('CARTESIA_VOICE_ID');\n const hasPlaceholder = allEntries.some(([, value]) =>\n isPlaceholderValue(value),\n );\n const allPresent =\n WORKER_MANAGED_KEYS.every((key) => worker.has(key)) &&\n AGENT_MANAGED_KEYS.every((key) => agent.has(key));\n const sharedKeys = [\n 'LIVEKIT_URL',\n 'LIVEKIT_API_KEY',\n 'LIVEKIT_API_SECRET',\n 'SPATIUS_APP_ID',\n ] as const;\n const inconsistent =\n sharedKeys.some((key) => {\n const workerValue = worker.get(key);\n const agentValue = agent.get(key);\n return (\n workerValue !== undefined &&\n agentValue !== undefined &&\n !isPlaceholderValue(workerValue) &&\n !isPlaceholderValue(agentValue) &&\n workerValue !== agentValue\n );\n }) ||\n (worker.get('LIVEKIT_AGENT_NAME') !== undefined &&\n !isPlaceholderValue(worker.get('LIVEKIT_AGENT_NAME')) &&\n worker.get('LIVEKIT_AGENT_NAME') !== expectedAgentName);\n\n if (inconsistent) {\n return { hasManagedValues, status: 'inconsistent' };\n }\n if (!allPresent) {\n return { hasManagedValues, status: 'missing' };\n }\n if (hasPlaceholder) {\n return { hasManagedValues, status: 'placeholder' };\n }\n\n return { hasManagedValues, status: 'complete' };\n}\n\nfunction isMissingFile(error: unknown): boolean {\n return error instanceof Error && 'code' in error && error.code === 'ENOENT';\n}\n\nasync function readOptionalCredentialFile(\n path: string,\n): Promise<string | undefined> {\n try {\n const stats = await lstat(path);\n if (stats.isSymbolicLink() || !stats.isFile()) {\n throw new CliError(\n 'FILESYSTEM_ERROR',\n `Refusing to manage a credential path that is not a regular file: ${path}`,\n {\n exitCode: EXIT_CODES.filesystem,\n path,\n recovery: 'Replace it with a regular local file and rerun setup.',\n },\n );\n }\n\n return await readFile(path, 'utf8');\n } catch (error) {\n if (isMissingFile(error)) {\n return undefined;\n }\n throw error;\n }\n}\n\nexport async function readCredentialFileState(\n targetDirectory: string,\n): Promise<CredentialFileState> {\n const [worker, agent, workerExample] = await Promise.all([\n readOptionalCredentialFile(join(targetDirectory, '.dev.vars')),\n readOptionalCredentialFile(join(targetDirectory, 'agent', '.env.local')),\n readOptionalCredentialFile(join(targetDirectory, '.dev.vars.example')),\n ]);\n\n return {\n agent,\n ...inspectCredentialConfiguration(\n { agent, worker },\n parseDotenv(workerExample ?? '').get('LIVEKIT_AGENT_NAME'),\n ),\n worker,\n };\n}\n\nfunction serializeDotenvValue(value: string): string {\n return JSON.stringify(value);\n}\n\nexport function mergeDotenv(\n baseContents: string,\n values: Readonly<Record<string, string>>,\n): string {\n const seen = new Set<string>();\n const lines = baseContents.replace(/\\r\\n/gu, '\\n').split('\\n');\n const rendered = lines.map((line) => {\n const match = line.match(assignmentPattern);\n const key = match?.[1];\n if (key === undefined || !(key in values)) {\n return line;\n }\n\n seen.add(key);\n return `${key}=${serializeDotenvValue(values[key]!)}`;\n });\n\n while (rendered.at(-1) === '') {\n rendered.pop();\n }\n for (const [key, value] of Object.entries(values)) {\n if (!seen.has(key)) {\n rendered.push(`${key}=${serializeDotenvValue(value)}`);\n }\n }\n\n return `${rendered.join('\\n')}\\n`;\n}\n\nexport function buildCredentialFileContents(\n state: CredentialFileState,\n examples: CredentialFileContents,\n rawCredentials: CredentialBundle,\n): CredentialFileContents {\n const credentials = validateCredentialBundle(rawCredentials);\n const shared = {\n LIVEKIT_API_KEY: credentials.liveKit.apiKey,\n LIVEKIT_API_SECRET: credentials.liveKit.apiSecret,\n LIVEKIT_URL: credentials.liveKit.url,\n SPATIUS_APP_ID: credentials.spatius.appId,\n };\n\n return {\n agent: mergeDotenv(state.agent ?? examples.agent, {\n ...shared,\n SPATIUS_API_KEY: credentials.spatius.apiKey,\n }),\n worker: mergeDotenv(state.worker ?? examples.worker, {\n ...(credentials.voiceId === undefined\n ? {}\n : { CARTESIA_VOICE_ID: credentials.voiceId }),\n ...shared,\n LIVEKIT_AGENT_NAME:\n parseDotenv(examples.worker).get('LIVEKIT_AGENT_NAME') ??\n 'spatius-agent',\n SPATIUS_AVATAR_ID: credentials.spatius.avatarId,\n // Clear a previous avatar’s background when a new selection has none.\n SPATIUS_AVATAR_BACKGROUND_URL: credentials.spatius.backgroundUrl ?? '',\n }),\n };\n}\n\nexport interface AtomicCredentialFileSystem {\n chmod(path: string, mode: number): Promise<void>;\n lstat(path: string): ReturnType<typeof lstat>;\n readFile(path: string): Promise<Buffer>;\n rename(oldPath: string, newPath: string): Promise<void>;\n rm(path: string): Promise<void>;\n writeFile(\n path: string,\n contents: string | Buffer,\n options: { flag?: string; mode: number },\n ): Promise<void>;\n}\n\nconst defaultAtomicFileSystem: AtomicCredentialFileSystem = {\n chmod,\n lstat,\n readFile: (path) => readFile(path),\n rename,\n rm: (path) => rm(path, { force: true }),\n writeFile,\n};\n\ninterface AtomicTarget {\n backupMoved: boolean;\n backupPath: string;\n destinationPath: string;\n hadOriginal: boolean;\n installed: boolean;\n original?: Buffer;\n stagedPath: string;\n}\n\nasync function pathExists(\n path: string,\n fileSystem: AtomicCredentialFileSystem,\n): Promise<boolean> {\n try {\n await fileSystem.lstat(path);\n return true;\n } catch (error) {\n if (isMissingFile(error)) {\n return false;\n }\n throw error;\n }\n}\n\nexport async function writeCredentialFilesAtomically(\n targetDirectory: string,\n contents: CredentialFileContents,\n fileSystem: AtomicCredentialFileSystem = defaultAtomicFileSystem,\n): Promise<void> {\n const nonce = randomUUID();\n const targets: AtomicTarget[] = [\n {\n backupMoved: false,\n backupPath: join(targetDirectory, `.dev.vars.${nonce}.backup`),\n destinationPath: join(targetDirectory, '.dev.vars'),\n hadOriginal: false,\n installed: false,\n stagedPath: join(targetDirectory, `.dev.vars.${nonce}.tmp`),\n },\n {\n backupMoved: false,\n backupPath: join(targetDirectory, 'agent', `.env.local.${nonce}.backup`),\n destinationPath: join(targetDirectory, 'agent', '.env.local'),\n hadOriginal: false,\n installed: false,\n stagedPath: join(targetDirectory, 'agent', `.env.local.${nonce}.tmp`),\n },\n ];\n const payloads = [contents.worker, contents.agent];\n\n try {\n for (const [index, target] of targets.entries()) {\n await fileSystem.writeFile(target.stagedPath, payloads[index]!, {\n flag: 'wx',\n mode: 0o600,\n });\n target.hadOriginal = await pathExists(target.destinationPath, fileSystem);\n if (target.hadOriginal) {\n target.original = await fileSystem.readFile(target.destinationPath);\n }\n }\n\n for (const target of targets) {\n if (target.hadOriginal) {\n await fileSystem.rename(target.destinationPath, target.backupPath);\n target.backupMoved = true;\n }\n }\n\n for (const target of targets) {\n await fileSystem.rename(target.stagedPath, target.destinationPath);\n target.installed = true;\n await fileSystem.chmod(target.destinationPath, 0o600);\n }\n\n for (const target of targets) {\n await fileSystem.rm(target.backupPath);\n }\n } catch {\n const unrestoredPaths: string[] = [];\n for (const target of [...targets].reverse()) {\n try {\n if (target.backupMoved) {\n if (!(await pathExists(target.backupPath, fileSystem))) {\n // Cleanup may already have removed this backup. Recreate it away\n // from the destination so a failed write cannot truncate that file.\n await fileSystem.writeFile(target.backupPath, target.original!, {\n flag: 'wx',\n mode: 0o600,\n });\n }\n await fileSystem.rename(target.backupPath, target.destinationPath);\n } else if (target.installed) {\n await fileSystem.rm(target.destinationPath);\n }\n } catch {\n unrestoredPaths.push(target.destinationPath);\n }\n // Leave untouched originals and failed recovery backups in place.\n await fileSystem.rm(target.stagedPath).catch(() => undefined);\n }\n\n throw new CliError(\n 'FILESYSTEM_ERROR',\n 'Could not save the local credential files. ' +\n (unrestoredPaths.length === 0\n ? 'Existing files were left unchanged or restored.'\n : 'Some credential files could not be restored. Any remaining backups were kept.'),\n {\n exitCode: EXIT_CODES.filesystem,\n path: targetDirectory,\n recovery:\n unrestoredPaths.length === 0\n ? 'Check file permissions, then rerun create-spatius-app setup . --interactive.'\n : `Check file permissions and inspect the affected files (${unrestoredPaths.join(', ')}) and remaining .backup files before rerunning setup.`,\n },\n );\n }\n}\n\nexport async function readCredentialExamples(\n targetDirectory: string,\n): Promise<CredentialFileContents> {\n const [worker, agent] = await Promise.all([\n readFile(join(targetDirectory, '.dev.vars.example'), 'utf8'),\n readFile(join(targetDirectory, 'agent', '.env.example'), 'utf8'),\n ]);\n return { agent, worker };\n}\n","import { spawn, type ChildProcess } from 'node:child_process';\nimport { chmod, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\n\nimport { PromptCancelledError } from '../errors.js';\nimport { createProcessInvocation } from '../package-managers.js';\nimport {\n type LiveKitCredentials,\n parseDotenv,\n validateCredentialBundle,\n} from './environment.js';\n\nexport interface LiveKitCliProbe {\n available: boolean;\n reason?: 'incompatible' | 'missing';\n version?: string;\n}\n\ninterface CapturedCommandOptions {\n cwd?: string;\n timeoutMs?: number;\n}\n\ninterface InteractiveCommandOptions {\n cwd: string;\n}\n\nexport interface LiveKitCommandRunner {\n capture(\n command: string,\n args: readonly string[],\n options?: CapturedCommandOptions,\n ): Promise<string>;\n interactive(\n command: string,\n args: readonly string[],\n options: InteractiveCommandOptions,\n ): Promise<void>;\n}\n\nasync function terminate(child: ChildProcess): Promise<void> {\n if (child.pid === undefined) {\n child.kill('SIGKILL');\n return;\n }\n if (process.platform === 'win32') {\n await new Promise<void>((resolvePromise) => {\n const killer = spawn(\n 'taskkill.exe',\n ['/pid', String(child.pid), '/t', '/f'],\n { stdio: 'ignore', windowsHide: true },\n );\n killer.once('close', () => resolvePromise());\n killer.once('error', () => resolvePromise());\n });\n return;\n }\n\n try {\n process.kill(-child.pid, 'SIGKILL');\n } catch {\n child.kill('SIGKILL');\n }\n}\n\nfunction captureCommand(\n command: string,\n args: readonly string[],\n { cwd, timeoutMs = 3000 }: CapturedCommandOptions = {},\n): Promise<string> {\n return new Promise((resolvePromise, reject) => {\n const invocation = createProcessInvocation(command, args);\n const child = spawn(invocation.command, invocation.args, {\n ...(cwd === undefined ? {} : { cwd }),\n detached: process.platform !== 'win32',\n stdio: ['ignore', 'pipe', 'pipe'],\n windowsHide: true,\n });\n let output = '';\n let settled = false;\n\n const onData = (chunk: Buffer | string) => {\n if (output.length < 128_000) {\n output += chunk.toString();\n }\n };\n child.stdout?.on('data', onData);\n child.stderr?.on('data', onData);\n\n const timeout = setTimeout(() => {\n if (settled) return;\n settled = true;\n void terminate(child).finally(() => {\n reject(new Error(`${command} timed out.`));\n });\n }, timeoutMs);\n\n child.once('error', (error) => {\n if (settled) return;\n settled = true;\n clearTimeout(timeout);\n reject(error);\n });\n child.once('close', (code) => {\n if (settled) return;\n settled = true;\n clearTimeout(timeout);\n if (code !== 0) {\n reject(new Error(`${command} exited unsuccessfully.`));\n return;\n }\n resolvePromise(output.trim());\n });\n });\n}\n\nfunction interactiveCommand(\n command: string,\n args: readonly string[],\n { cwd }: InteractiveCommandOptions,\n): Promise<void> {\n return new Promise((resolvePromise, reject) => {\n const invocation = createProcessInvocation(command, args);\n const child = spawn(invocation.command, invocation.args, {\n cwd,\n stdio: 'inherit',\n windowsHide: true,\n });\n child.once('error', () => {\n reject(new Error('The LiveKit CLI could not be started.'));\n });\n child.once('close', (code, signal) => {\n if (signal === 'SIGINT' || signal === 'SIGTERM' || code === 130) {\n reject(new PromptCancelledError('LiveKit setup was cancelled.'));\n return;\n }\n if (code === 0) {\n resolvePromise();\n return;\n }\n reject(new Error('The LiveKit CLI credential flow did not complete.'));\n });\n });\n}\n\nexport const defaultLiveKitCommandRunner: LiveKitCommandRunner = {\n capture: captureCommand,\n interactive: interactiveCommand,\n};\n\nfunction parseVersion(output: string): string | undefined {\n return output.match(/\\d+\\.\\d+(?:\\.\\d+)?(?:-[\\w.-]+)?/u)?.[0];\n}\n\nexport async function probeLiveKitCli(\n runner: LiveKitCommandRunner = defaultLiveKitCommandRunner,\n): Promise<LiveKitCliProbe> {\n let versionOutput: string;\n try {\n versionOutput = await runner.capture('lk', ['--version']);\n } catch {\n return { available: false, reason: 'missing' };\n }\n\n try {\n const help = await runner.capture('lk', ['app', 'env', '--help']);\n if (\n !help.includes('--write') ||\n !help.includes('--destination') ||\n !help.includes('--example')\n ) {\n return {\n available: false,\n reason: 'incompatible',\n ...(parseVersion(versionOutput) === undefined\n ? {}\n : { version: parseVersion(versionOutput) }),\n };\n }\n\n return {\n available: true,\n ...(parseVersion(versionOutput) === undefined\n ? {}\n : { version: parseVersion(versionOutput) }),\n };\n } catch {\n return {\n available: false,\n reason: 'incompatible',\n ...(parseVersion(versionOutput) === undefined\n ? {}\n : { version: parseVersion(versionOutput) }),\n };\n }\n}\n\nexport function createLiveKitEnvArguments(\n temporaryDirectory: string,\n): string[] {\n return [\n 'app',\n 'env',\n '--write',\n '--destination',\n '.env.local',\n '--example',\n '.env.example',\n temporaryDirectory,\n ];\n}\n\ninterface LiveKitTemporaryFileSystem {\n chmod(path: string, mode: number): Promise<void>;\n mkdtemp(prefix: string): Promise<string>;\n readFile(path: string): Promise<string>;\n remove(path: string): Promise<void>;\n writeFile(path: string, contents: string, mode: number): Promise<void>;\n}\n\nconst defaultTemporaryFileSystem: LiveKitTemporaryFileSystem = {\n chmod,\n mkdtemp,\n readFile: (path) => readFile(path, 'utf8'),\n remove: (path) =>\n rm(path, {\n force: true,\n maxRetries: 3,\n recursive: true,\n retryDelay: 100,\n }),\n writeFile: (path, contents, mode) => writeFile(path, contents, { mode }),\n};\n\ninterface LoadLiveKitCredentialsOptions {\n fileSystem?: LiveKitTemporaryFileSystem;\n runner?: LiveKitCommandRunner;\n temporaryRoot?: string;\n}\n\nexport async function loadLiveKitCredentialsWithCli({\n fileSystem = defaultTemporaryFileSystem,\n runner = defaultLiveKitCommandRunner,\n temporaryRoot = tmpdir(),\n}: LoadLiveKitCredentialsOptions = {}): Promise<LiveKitCredentials> {\n const directory = await fileSystem.mkdtemp(\n join(temporaryRoot, 'create-spatius-app-livekit-'),\n );\n\n try {\n await fileSystem.chmod(directory, 0o700);\n await fileSystem.writeFile(\n join(directory, '.env.example'),\n 'LIVEKIT_URL=\\nLIVEKIT_API_KEY=\\nLIVEKIT_API_SECRET=\\n',\n 0o600,\n );\n await runner.interactive('lk', createLiveKitEnvArguments(directory), {\n cwd: directory,\n });\n const values = parseDotenv(\n await fileSystem.readFile(join(directory, '.env.local')),\n );\n const validated = validateCredentialBundle({\n liveKit: {\n apiKey: values.get('LIVEKIT_API_KEY') ?? '',\n apiSecret: values.get('LIVEKIT_API_SECRET') ?? '',\n url: values.get('LIVEKIT_URL') ?? '',\n },\n spatius: {\n apiKey: 'validation-only',\n appId: 'validation-only',\n avatarId: 'validation-only',\n },\n });\n return validated.liveKit;\n } catch (error) {\n if (error instanceof PromptCancelledError) throw error;\n throw new Error(\n 'LiveKit CLI did not return a complete, valid credential set.',\n { cause: error },\n );\n } finally {\n await fileSystem.remove(directory).catch(() => {\n throw new Error(\n 'The temporary LiveKit credential directory could not be removed.',\n );\n });\n }\n}\n","import { tmpdir } from 'node:os';\n\nimport {\n defaultLiveKitCommandRunner,\n type LiveKitCommandRunner,\n} from './livekit.js';\n\nexport const LIVEKIT_INSTALL_GUIDE =\n 'https://docs.livekit.io/reference/developer-tools/livekit-cli/';\n\nexport interface LiveKitInstallPlan {\n command: string;\n args: string[];\n displayCommand: string;\n}\n\n/** Only offer an installer when its prerequisites are already available. */\nexport async function planLiveKitInstall(\n update: boolean,\n platform: NodeJS.Platform = process.platform,\n runner: LiveKitCommandRunner = defaultLiveKitCommandRunner,\n): Promise<LiveKitInstallPlan | undefined> {\n try {\n if (platform === 'darwin') {\n await runner.capture('brew', ['--version']);\n const args = [update ? 'upgrade' : 'install', 'livekit-cli'];\n return {\n command: 'brew',\n args,\n displayCommand: `brew ${args.join(' ')}`,\n };\n }\n if (platform === 'win32') {\n await runner.capture('winget', ['--version']);\n const args = [\n update ? 'upgrade' : 'install',\n '--id',\n 'LiveKit.LiveKitCLI',\n '--exact',\n ];\n return {\n command: 'winget',\n args,\n displayCommand: `winget ${args.join(' ')}`,\n };\n }\n if (platform === 'linux') {\n await runner.capture('bash', ['--version']);\n await runner.capture('curl', ['--version']);\n // pipefail prevents a failed download from being reported as an install success.\n const script = 'curl -fsSL https://get.livekit.io/cli | bash';\n return {\n command: 'bash',\n args: ['-o', 'pipefail', '-c', script],\n displayCommand: script,\n };\n }\n } catch {\n // The user can install prerequisites themselves and retry in this wizard.\n }\n return undefined;\n}\n\nexport function installLiveKitCli(\n plan: LiveKitInstallPlan,\n runner: LiveKitCommandRunner = defaultLiveKitCommandRunner,\n): Promise<void> {\n return runner.interactive(plan.command, plan.args, { cwd: tmpdir() });\n}\n\nexport function authenticateLiveKitCli(\n runner: LiveKitCommandRunner = defaultLiveKitCommandRunner,\n): Promise<void> {\n return runner.interactive('lk', ['cloud', 'auth'], { cwd: tmpdir() });\n}\n","const SENSITIVE_ASSIGNMENT =\n /\\b(authorization|auth[_-]?code|code[_-]?verifier|access[_-]?token|refresh[_-]?token|api[_-]?key|api[_-]?secret|password|secret)\\b(\\s*[:=]\\s*)([\"']?)([^\\s,\"'&}]+)\\3/giu;\nconst SENSITIVE_QUERY =\n /([?&](?:auth_code|code_verifier|access_token|refresh_token|api_key|api_secret)=)[^&#\\s]+/giu;\nconst BEARER_TOKEN = /\\bBearer\\s+[A-Za-z\\d._~+/=-]+/giu;\n\nexport class SecretRedactor {\n readonly #values = new Set<string>();\n\n add(...values: Array<string | undefined>): void {\n for (const value of values) {\n const trimmed = value?.trim();\n if (trimmed !== undefined && trimmed.length >= 4) {\n this.#values.add(trimmed);\n }\n }\n }\n\n redact(value: string): string {\n let redacted = value;\n for (const secret of [...this.#values].sort(\n (left, right) => right.length - left.length,\n )) {\n redacted = redacted.replaceAll(secret, '[REDACTED]');\n }\n\n return redacted\n .replace(BEARER_TOKEN, 'Bearer [REDACTED]')\n .replace(SENSITIVE_QUERY, '$1[REDACTED]')\n .replace(SENSITIVE_ASSIGNMENT, '$1$2$3[REDACTED]$3');\n }\n\n error(error: unknown, fallback: string): Error {\n const message = error instanceof Error ? error.message : fallback;\n return new Error(this.redact(message), { cause: error });\n }\n}\n\nexport function maskSecret(value: string): string {\n const normalized = value.trim();\n if (normalized.length <= 4) {\n return '••••';\n }\n\n return `••••${normalized.slice(-4)}`;\n}\n","/** Static, offline-capable callback page. Never interpolate authentication data. */\nexport const successPage = `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <meta name=\"referrer\" content=\"no-referrer\" />\n <title>Spatius authorization complete</title>\n <style>\n :root { color-scheme: light; font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif; color: #151131; background: #f7f5f1; }\n * { box-sizing: border-box; }\n body { margin: 0; min-height: 100vh; min-height: 100svh; display: flex; flex-direction: column; background: radial-gradient(ellipse at 50% 38%, #eae6f3 0, transparent 58%); }\n a { color: inherit; text-decoration: none; }\n a:focus-visible { outline: 3px solid #6363a7; outline-offset: 5px; }\n header, footer { width: min(100% - 48px, 1120px); margin-inline: auto; display: flex; align-items: center; justify-content: space-between; gap: 20px; padding-block: 28px; }\n .brand { font-size: 24px; font-weight: 650; letter-spacing: -.9px; }\n .brand { display: inline-flex; align-items: center; gap: 8px; }\n .eyebrow { font: 11px ui-monospace, SFMono-Regular, Consolas, monospace; letter-spacing: .12em; text-transform: uppercase; color: #636174; }\n main { flex: 1; display: grid; place-items: center; padding: 48px 24px; }\n .card { width: min(100%, 620px); padding: 48px; background: #ffffffed; border: 1px solid #e8e4ee; border-radius: 24px; box-shadow: 0 24px 80px -32px #30234d30; }\n .check { display: grid; place-items: center; width: 52px; height: 52px; border: 1px solid #dcd7ed; border-radius: 50%; background: #f1eef8; color: #6363a7; margin-bottom: 28px; }\n .check svg { width: 24px; height: 24px; }\n h1 { font-size: clamp(30px, 5vw, 42px); font-weight: 550; letter-spacing: -.045em; line-height: 1.15; margin: 12px 0 16px; }\n .description { color: #636174; line-height: 1.7; font-size: 15px; margin: 0; max-width: 420px; }\n .terminal { display: flex; align-items: center; gap: 16px; padding: 20px; margin: 28px 0 32px; background: #f7f5f9; border: 1px solid #e8e4ee; border-radius: 12px; }\n .terminal-icon { font: 20px ui-monospace, SFMono-Regular, Consolas, monospace; color: #6363a7; }\n .terminal strong { display: block; font-size: 14px; font-weight: 600; }\n .terminal p { margin: 5px 0 0; font-size: 13px; color: #636174; line-height: 1.5; }\n nav { border-top: 1px solid #eeebf1; padding-top: 24px; }\n nav .eyebrow { display: block; margin-bottom: 14px; }\n .links { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }\n .links a { display: flex; align-items: center; justify-content: space-between; gap: 8px; min-height: 46px; padding: 12px 14px; border: 1px solid #e8e4ee; border-radius: 9px; font-size: 13px; font-weight: 550; }\n .links a:hover { background: #f1eef8; border-color: #bab2d4; }\n .link-label { display: flex; align-items: center; gap: 10px; }\n .links svg { width: 18px; height: 18px; flex-shrink: 0; fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; color: #6363a7; }\n .links .external-icon { width: 14px; height: 14px; }\n footer { justify-content: flex-end; font-size: 12px; color: #636174; }\n footer a:hover { color: #151131; text-decoration: underline; }\n @media (max-width: 520px) {\n header, footer { width: calc(100% - 40px); padding-block: 22px; }\n main { padding: 20px; }\n .card { padding: 28px 24px; border-radius: 18px; }\n .links { grid-template-columns: 1fr; }\n footer { flex-wrap: wrap; gap: 12px; }\n }\n </style>\n </head>\n <body>\n <header>\n <!-- Inline brand mark from spatius-site/src/assets/brand/spatius-logo-mark-black.svg. -->\n <a class=\"brand\" href=\"https://www.spatius.ai/\" target=\"_blank\" rel=\"noopener noreferrer\"><svg width=\"24\" height=\"20\" aria-hidden=\"true\" viewBox=\"0 0 265 220\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><g clip-path=\"url(#clip0_279_158)\"><path d=\"M178.56 7.19C182.19 8.35 184.62 11.78 184.62 15.59V39.43C184.62 44.17 180.77 48 176.06 48H151.07C148.71 48 146.57 48.96 145.02 50.5C144.92 50.6 144.82 50.69 144.73 50.8C143.35 52.33 142.5 54.35 142.5 56.56V94.22C142.5 98.94 138.66 102.78 133.94 102.78H108.96C104.22 102.78 100.4 106.62 100.4 111.34V149C100.4 153.74 96.56 157.57 91.84 157.57H66.86C62.12 157.57 58.29 161.41 58.29 166.14V188.47C58.29 195.77 49.94 199.95 44.12 195.55C17.04 175.04 0 145.2 0 111.99C0 50.13 59.1 0 132 0C148.41 0 164.11 2.53999 178.59 7.17999L178.56 7.19Z\" fill=\"currentColor\"/><path d=\"M230.22 59.4799V98.2699C230.22 103.15 226.27 107.09 221.4 107.09H195.68C190.8 107.09 186.86 111.04 186.86 115.91V154.7C186.86 159.58 182.9 163.52 178.04 163.52H152.31C149.89 163.52 147.67 164.52 146.08 166.1C145.98 166.2 145.88 166.3 145.78 166.41C144.35 167.98 143.49 170.06 143.49 172.34V211.13C143.49 216.01 139.54 219.95 134.67 219.95H108.95C104.07 219.95 100.13 216 100.13 211.13V172.34C100.13 167.46 104.08 163.52 108.95 163.52H134.67C139.55 163.52 143.49 159.57 143.49 154.7V115.91C143.49 115.62 143.49 115.35 143.53 115.06C143.53 114.93 143.55 114.81 143.57 114.67C143.57 114.55 143.6 114.42 143.63 114.29C143.63 114.23 143.65 114.18 143.66 114.12C143.68 114 143.72 113.88 143.75 113.77C143.77 113.66 143.81 113.55 143.84 113.43C143.92 113.18 144.01 112.91 144.11 112.67C144.19 112.46 144.28 112.26 144.36 112.07C144.36 112.05 144.38 112.04 144.38 112.03C144.44 111.92 144.49 111.81 144.56 111.7C144.73 111.39 144.93 111.08 145.12 110.79C145.21 110.67 145.29 110.55 145.39 110.44C145.51 110.27 145.64 110.12 145.79 109.96C145.89 109.85 145.99 109.75 146.09 109.65C146.29 109.45 146.5 109.26 146.71 109.07C146.93 108.89 147.15 108.73 147.38 108.56C147.61 108.41 147.86 108.26 148.1 108.12C148.34 107.99 148.6 107.87 148.85 107.75C149.12 107.63 149.38 107.53 149.66 107.45C149.87 107.38 150.08 107.33 150.29 107.28C150.5 107.22 150.72 107.18 150.94 107.15C151.12 107.13 151.29 107.11 151.47 107.08H178.02C182.89 107.08 186.84 103.13 186.84 98.2599V59.4699C186.84 54.5899 190.79 50.6499 195.66 50.6499H221.38C226.26 50.6499 230.2 54.5999 230.2 59.4699H230.21L230.22 59.4799Z\" fill=\"currentColor\"/><path d=\"M264.34 122.11V154.32C264.34 158.37 261.07 161.64 257.02 161.64H235.66C231.61 161.64 228.34 164.91 228.34 168.96V201.16C228.34 205.21 225.07 208.49 221.02 208.49H199.66C195.61 208.49 192.34 205.22 192.34 201.16V168.96C192.34 164.91 195.61 161.64 199.66 161.64H221.02C225.07 161.64 228.34 158.37 228.34 154.32V122.11C228.34 118.06 231.61 114.79 235.66 114.79H257.02C261.07 114.79 264.34 118.06 264.34 122.11Z\" fill=\"currentColor\"/></g><defs><clipPath id=\"clip0_279_158\"><rect width=\"265\" height=\"220\" fill=\"white\"/></clipPath></defs></svg>Spatius</a>\n </header>\n <main>\n <section class=\"card\" aria-labelledby=\"success-title\">\n <div class=\"check\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"m5 12 4 4L19 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" /></svg></div>\n <span class=\"eyebrow\">You're connected</span>\n <h1 id=\"success-title\">Authorization complete.</h1>\n <p class=\"description\">Your next idea starts here. Spatius is ready to help you bring it to life.</p>\n <div class=\"terminal\">\n <span class=\"terminal-icon\" aria-hidden=\"true\">&gt;_</span>\n <div><strong>Continue in your terminal</strong><p>You can close this tab and finish your project setup.</p></div>\n </div>\n <nav aria-label=\"Spatius resources\">\n <span class=\"eyebrow\">While you're building</span>\n <div class=\"links\">\n <a href=\"https://docs.spatius.ai/\" target=\"_blank\" rel=\"noopener noreferrer\"><span class=\"link-label\"><svg aria-hidden=\"true\" viewBox=\"0 0 24 24\"><path d=\"M12 5v16M12 5C9 3 5 3 2 4v15c3-1 7-1 10 2 3-3 7-3 10-2V4c-3-1-7-1-10 1Z\" /></svg>Documentation</span><svg class=\"external-icon\" aria-hidden=\"true\" viewBox=\"0 0 24 24\"><path d=\"M14 3h7v7m0-7L10 14M10 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-5\" /></svg></a>\n <a href=\"https://app.spatius.ai\" target=\"_blank\" rel=\"noopener noreferrer\"><span class=\"link-label\"><svg aria-hidden=\"true\" viewBox=\"0 0 24 24\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"3\" /><path d=\"M3 9h18M9 9v12\" /></svg>Open Studio</span><svg class=\"external-icon\" aria-hidden=\"true\" viewBox=\"0 0 24 24\"><path d=\"M14 3h7v7m0-7L10 14M10 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-5\" /></svg></a>\n <a href=\"https://github.com/spatius-ai\" target=\"_blank\" rel=\"noopener noreferrer\"><span class=\"link-label\"><svg aria-hidden=\"true\" viewBox=\"0 0 24 24\"><path d=\"m8 7-5 5 5 5m8-10 5 5-5 5m-3-13-2 16\" /></svg>GitHub</span><svg class=\"external-icon\" aria-hidden=\"true\" viewBox=\"0 0 24 24\"><path d=\"M14 3h7v7m0-7L10 14M10 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-5\" /></svg></a>\n <a href=\"https://discord.gg/9HGhZfHZh9\" target=\"_blank\" rel=\"noopener noreferrer\"><span class=\"link-label\"><svg aria-hidden=\"true\" viewBox=\"0 0 24 24\"><path d=\"M21 11a8 8 0 0 1-8 8H8l-5 3V7a4 4 0 0 1 4-4h6a8 8 0 0 1 8 8Z\" /><path d=\"M7 10h10M7 14h6\" /></svg>Join our Discord</span><svg class=\"external-icon\" aria-hidden=\"true\" viewBox=\"0 0 24 24\"><path d=\"M14 3h7v7m0-7L10 14M10 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-5\" /></svg></a>\n </div>\n </nav>\n </section>\n </main>\n <footer><a href=\"https://www.spatius.ai/\" target=\"_blank\" rel=\"noopener noreferrer\">Explore Spatius ↗</a></footer>\n </body>\n</html>`;\n","export const SPATIUS_CONSOLE_BASE_URL = 'https://api.studio.spatius.ai';\n\nexport interface SpatiusAuthSessionResponse {\n authRequestId: string;\n authorizeUrl: string;\n expiresAt?: string;\n expiresIn?: number;\n}\n\nexport interface SpatiusTokenSet {\n accessToken: string;\n refreshToken: string;\n}\n\nexport interface SpatiusApp {\n appId: string;\n createdAt?: string;\n name: string;\n}\n\nexport interface SpatiusApiKey {\n apiKey: string;\n createdAt?: string;\n}\n\nexport interface SpatiusAvatar {\n backgroundUrl?: string;\n id: string;\n name: string;\n source: 'personal' | 'public';\n}\n\nexport interface SpatiusRequestDiagnostic {\n method: string;\n route: string;\n durationMs: number;\n outcome: 'response' | 'network-error' | 'invalid-response';\n httpStatus?: number;\n apiStatus?: number;\n apiCode?: string;\n}\n\nconst knownApiStatuses: Readonly<Record<string, number>> = {\n BAD_REQUEST: 400,\n INVALID_ARGUMENT: 400,\n FAILED_PRECONDITION: 400,\n UNAUTHORIZED: 401,\n PAYMENT_REQUIRED: 402,\n FORBIDDEN: 403,\n PERMISSION_DENIED: 403,\n NOT_FOUND: 404,\n TIMEOUT: 408,\n ALREADY_EXISTS: 409,\n FAILED_DEPENDENCY: 424,\n QUOTA_EXCEEDED: 429,\n INTERNAL_SERVER_ERROR: 500,\n UNIMPLEMENTED: 501,\n UNAVAILABLE: 503,\n unauthorized: 401,\n forbidden: 403,\n invalid_request: 400,\n not_found: 404,\n internal_error: 500,\n};\n\nfunction diagnosticRoute(path: string): string {\n return path.replace(/\\/apps\\/[^/]+/u, '/apps/{appId}');\n}\n\nexport class SpatiusHttpError extends Error {\n readonly status: number;\n readonly httpStatus: number;\n readonly apiCode?: string;\n\n constructor(\n status: number,\n method: string,\n path: string,\n options: {\n httpStatus?: number;\n apiCode?: string;\n missingFrontendUrl?: boolean;\n } = {},\n ) {\n const httpStatus = options.httpStatus ?? status;\n super(\n `Spatius request ${method} ${diagnosticRoute(path)} failed (HTTP ${String(httpStatus)}${options.apiCode === undefined ? '' : `, API ${String(status)} ${options.apiCode}`}).` +\n (options.missingFrontendUrl === true\n ? ' The Spatius console server is missing SERVER_OPEN_PLATFORM_FRONTEND_URL. Configure it with the Studio URL in the console deployment, then retry.'\n : ''),\n );\n this.name = 'SpatiusHttpError';\n this.status = status;\n this.httpStatus = httpStatus;\n this.apiCode = options.apiCode;\n }\n}\n\ntype JsonObject = Record<string, unknown>;\n\nfunction apiError(\n payload: JsonObject,\n httpStatus: number,\n method: string,\n path: string,\n): SpatiusHttpError | undefined {\n const errors = payload.errors;\n const hasErrors = Array.isArray(errors) && errors.length > 0;\n const raw: unknown = hasErrors ? errors[0] : payload.error;\n if (!hasErrors && (raw === undefined || raw === null)) return undefined;\n const error =\n raw !== null && typeof raw === 'object' && !Array.isArray(raw)\n ? (raw as JsonObject)\n : {};\n // Only known codes and an exact, known-safe configuration message may leave\n // the client. Arbitrary details, titles, source fields, and bodies can echo secrets.\n const code =\n typeof error.code === 'string' &&\n Object.hasOwn(knownApiStatuses, error.code)\n ? error.code\n : 'API_ERROR';\n const suppliedStatus =\n typeof error.status === 'number'\n ? error.status\n : typeof error.status === 'string' && /^\\d{3}$/u.test(error.status)\n ? Number(error.status)\n : undefined;\n const status =\n suppliedStatus !== undefined &&\n Number.isInteger(suppliedStatus) &&\n suppliedStatus >= 400 &&\n suppliedStatus <= 599\n ? suppliedStatus\n : (knownApiStatuses[code] ?? (httpStatus >= 400 ? httpStatus : 500));\n\n return new SpatiusHttpError(status, method, path, {\n apiCode: code,\n httpStatus,\n missingFrontendUrl:\n code === 'INTERNAL_SERVER_ERROR' &&\n error.detail === 'server open-platform frontend URL is not configured',\n });\n}\n\nfunction object(value: unknown, label: string): JsonObject {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(`Spatius returned an invalid ${label} response.`);\n }\n return value as JsonObject;\n}\n\nfunction field(\n value: JsonObject,\n camelCase: string,\n snakeCase: string,\n): unknown {\n return value[camelCase] ?? value[snakeCase];\n}\n\nfunction requiredString(\n value: JsonObject,\n camelCase: string,\n snakeCase = camelCase,\n): string {\n const result = field(value, camelCase, snakeCase);\n if (typeof result !== 'string' || result.trim() === '') {\n throw new Error(`Spatius returned a response without ${camelCase}.`);\n }\n return result.trim();\n}\n\nfunction optionalString(\n value: JsonObject,\n camelCase: string,\n snakeCase = camelCase,\n): string | undefined {\n const result = field(value, camelCase, snakeCase);\n return typeof result === 'string' && result.trim() !== ''\n ? result.trim()\n : undefined;\n}\n\nfunction optionalNumber(\n value: JsonObject,\n camelCase: string,\n snakeCase = camelCase,\n): number | undefined {\n const result = field(value, camelCase, snakeCase);\n return typeof result === 'number' && Number.isFinite(result)\n ? result\n : undefined;\n}\n\nfunction arrayField(\n value: JsonObject,\n camelCase: string,\n snakeCase: string,\n): unknown[] {\n const result = field(value, camelCase, snakeCase);\n if (!Array.isArray(result)) return [];\n const values: unknown[] = [];\n for (const entry of result) values.push(entry as unknown);\n return values;\n}\n\nfunction nextPageToken(value: JsonObject): string | undefined {\n const paginationValue = value.pagination;\n if (\n paginationValue === null ||\n typeof paginationValue !== 'object' ||\n Array.isArray(paginationValue)\n ) {\n return undefined;\n }\n return optionalString(\n paginationValue as JsonObject,\n 'nextPageToken',\n 'next_page_token',\n );\n}\n\ninterface RequestOptions {\n accessToken?: string;\n appCredentials?: { apiKey: string; appId: string };\n body?: JsonObject;\n method?: 'GET' | 'POST';\n query?: URLSearchParams;\n}\n\nexport class SpatiusApiClient {\n readonly #baseUrl: string;\n readonly #fetch: typeof fetch;\n readonly #onDiagnostic?: (event: SpatiusRequestDiagnostic) => void;\n\n constructor(\n baseUrl = SPATIUS_CONSOLE_BASE_URL,\n fetchImplementation: typeof fetch = fetch,\n onDiagnostic?: (event: SpatiusRequestDiagnostic) => void,\n ) {\n this.#baseUrl = baseUrl.replace(/\\/+$/u, '');\n this.#fetch = fetchImplementation;\n this.#onDiagnostic = onDiagnostic;\n }\n\n async #request(\n path: string,\n {\n accessToken,\n appCredentials,\n body,\n method = 'GET',\n query,\n }: RequestOptions = {},\n ): Promise<JsonObject> {\n const startedAt = performance.now();\n const report = (\n details: Pick<\n SpatiusRequestDiagnostic,\n 'outcome' | 'httpStatus' | 'apiStatus' | 'apiCode'\n >,\n ) => {\n this.#onDiagnostic?.({\n method,\n route: diagnosticRoute(path),\n durationMs: Math.round(performance.now() - startedAt),\n ...details,\n });\n };\n const url = new URL(`${this.#baseUrl}${path}`);\n if (query !== undefined) {\n url.search = query.toString();\n }\n const headers = new Headers({ Accept: 'application/json' });\n if (body !== undefined) {\n headers.set('Content-Type', 'application/json');\n }\n if (accessToken !== undefined) {\n headers.set('Authorization', `Bearer ${accessToken}`);\n }\n if (appCredentials !== undefined) {\n headers.set('X-App-ID', appCredentials.appId);\n headers.set('X-API-Key', appCredentials.apiKey);\n }\n\n let response: Response;\n try {\n response = await this.#fetch(url, {\n ...(body === undefined ? {} : { body: JSON.stringify(body) }),\n headers,\n method,\n redirect: 'error',\n signal: AbortSignal.timeout(30_000),\n });\n } catch {\n report({ outcome: 'network-error' });\n throw new Error(\n `Could not reach the Spatius API for ${method} ${diagnosticRoute(path)}.`,\n );\n }\n\n if (response.status === 204) {\n report({ outcome: 'response', httpStatus: response.status });\n return {};\n }\n\n let payload: JsonObject;\n try {\n const contents = await response.text();\n payload =\n contents.trim() === '' ? {} : object(JSON.parse(contents), 'API');\n } catch {\n report({ outcome: 'invalid-response', httpStatus: response.status });\n if (!response.ok)\n throw new SpatiusHttpError(response.status, method, path);\n throw new Error(\n `Spatius returned an invalid JSON object response for ${method} ${diagnosticRoute(path)}.`,\n );\n }\n\n const error = apiError(payload, response.status, method, path);\n report({\n outcome: 'response',\n httpStatus: response.status,\n ...(error === undefined\n ? {}\n : { apiStatus: error.status, apiCode: error.apiCode }),\n });\n if (error !== undefined) throw error;\n if (!response.ok) throw new SpatiusHttpError(response.status, method, path);\n return payload;\n }\n\n async createAuthSession(input: {\n codeChallenge: string;\n redirectUri: string;\n state: string;\n }): Promise<SpatiusAuthSessionResponse> {\n const response = await this.#request('/v1/cli/auth/sessions', {\n body: {\n clientName: 'create-spatius-app',\n codeChallenge: input.codeChallenge,\n codeChallengeMethod: 'CLI_AUTH_CODE_CHALLENGE_METHOD_S256',\n redirectUri: input.redirectUri,\n state: input.state,\n },\n method: 'POST',\n });\n return {\n authRequestId: requiredString(\n response,\n 'authRequestId',\n 'auth_request_id',\n ),\n authorizeUrl: requiredString(response, 'authorizeUrl', 'authorize_url'),\n ...(optionalString(response, 'expiresAt', 'expires_at') === undefined\n ? {}\n : { expiresAt: optionalString(response, 'expiresAt', 'expires_at') }),\n ...(optionalNumber(response, 'expiresIn', 'expires_in') === undefined\n ? {}\n : { expiresIn: optionalNumber(response, 'expiresIn', 'expires_in') }),\n };\n }\n\n async exchangeAuthCode(input: {\n authCode: string;\n authRequestId: string;\n codeVerifier: string;\n }): Promise<SpatiusTokenSet> {\n const response = await this.#request('/v1/cli/auth/token', {\n body: {\n authCode: input.authCode,\n authRequestId: input.authRequestId,\n codeVerifier: input.codeVerifier,\n },\n method: 'POST',\n });\n return parseTokenSet(object(response.token, 'token'));\n }\n\n async refresh(refreshToken: string): Promise<SpatiusTokenSet> {\n const response = await this.#request('/v1/cli/auth/token:refresh', {\n body: { refreshToken },\n method: 'POST',\n });\n return parseTokenSet(object(response.token, 'token'), refreshToken);\n }\n\n async revoke(tokens: SpatiusTokenSet): Promise<void> {\n await this.#request('/v1/cli/auth/token:revoke', {\n body: {\n accessToken: tokens.accessToken,\n refreshToken: tokens.refreshToken,\n },\n method: 'POST',\n });\n }\n\n async listApps(accessToken: string): Promise<SpatiusApp[]> {\n const results: SpatiusApp[] = [];\n let pageToken: string | undefined;\n const seen = new Set<string>();\n do {\n const query = new URLSearchParams({ 'pagination.pageSize': '100' });\n if (pageToken !== undefined) {\n query.set('pagination.pageToken', pageToken);\n }\n const response = await this.#request('/v1/apps', {\n accessToken,\n query,\n });\n for (const raw of arrayField(response, 'apps', 'apps')) {\n const app = object(raw, 'app');\n results.push({\n appId: requiredString(app, 'appId', 'app_id'),\n ...(optionalString(app, 'createdAt', 'created_at') === undefined\n ? {}\n : { createdAt: optionalString(app, 'createdAt', 'created_at') }),\n name: optionalString(app, 'name') ?? 'Unnamed app',\n });\n }\n pageToken = nextPageToken(response);\n if (pageToken !== undefined && seen.has(pageToken)) break;\n if (pageToken !== undefined) seen.add(pageToken);\n } while (pageToken !== undefined);\n\n return results;\n }\n\n async createApp(accessToken: string, name: string): Promise<SpatiusApp> {\n const response = await this.#request('/v1/apps', {\n accessToken,\n body: { name },\n method: 'POST',\n });\n return {\n appId: requiredString(response, 'appId', 'app_id'),\n name,\n };\n }\n\n async listApiKeys(\n accessToken: string,\n appId: string,\n ): Promise<SpatiusApiKey[]> {\n const results: SpatiusApiKey[] = [];\n let pageToken: string | undefined;\n const seen = new Set<string>();\n do {\n const query = new URLSearchParams({ 'pagination.pageSize': '100' });\n if (pageToken !== undefined) {\n query.set('pagination.pageToken', pageToken);\n }\n const path = `/v1/apps/${encodeURIComponent(appId)}/api-keys`;\n const response = await this.#request(path, { accessToken, query });\n for (const raw of arrayField(response, 'apiKeys', 'api_keys')) {\n results.push(parseApiKey(object(raw, 'API key')));\n }\n pageToken = nextPageToken(response);\n if (pageToken !== undefined && seen.has(pageToken)) break;\n if (pageToken !== undefined) seen.add(pageToken);\n } while (pageToken !== undefined);\n return results;\n }\n\n async createApiKey(\n accessToken: string,\n appId: string,\n ): Promise<SpatiusApiKey> {\n const path = `/v1/apps/${encodeURIComponent(appId)}/api-keys`;\n const response = await this.#request(path, {\n accessToken,\n body: { appId },\n method: 'POST',\n });\n return parseApiKey(object(field(response, 'apiKey', 'api_key'), 'API key'));\n }\n\n async listPublicAvatars(accessToken: string): Promise<SpatiusAvatar[]> {\n const results: SpatiusAvatar[] = [];\n let pageToken: string | undefined;\n const seen = new Set<string>();\n do {\n const query = new URLSearchParams({ 'pagination.pageSize': '100' });\n if (pageToken !== undefined) {\n query.set('pagination.pageToken', pageToken);\n }\n const response = await this.#request('/v2/console/public-avatars', {\n accessToken,\n query,\n });\n for (const raw of arrayField(\n response,\n 'publicAvatars',\n 'public_avatars',\n )) {\n const avatar = object(raw, 'public avatar');\n results.push({\n id: requiredString(avatar, 'id'),\n name: optionalString(avatar, 'name') ?? 'Unnamed avatar',\n source: 'public',\n backgroundUrl: optionalString(\n avatar,\n 'backgroundImageUrl',\n 'background_image_url',\n ),\n });\n }\n pageToken = nextPageToken(response);\n if (pageToken !== undefined && seen.has(pageToken)) break;\n if (pageToken !== undefined) seen.add(pageToken);\n } while (pageToken !== undefined);\n return results;\n }\n\n async listPersonalAvatars(\n appId: string,\n apiKey: string,\n ): Promise<SpatiusAvatar[]> {\n const results: SpatiusAvatar[] = [];\n let pageToken: string | undefined;\n const seen = new Set<string>();\n do {\n const query = new URLSearchParams({ 'pagination.pageSize': '100' });\n if (pageToken !== undefined) {\n query.set('pagination.pageToken', pageToken);\n }\n const response = await this.#request('/v1/open/avatars', {\n appCredentials: { apiKey, appId },\n query,\n });\n for (const raw of arrayField(response, 'avatars', 'avatars')) {\n const avatar = object(raw, 'personal avatar');\n results.push({\n id: requiredString(avatar, 'id'),\n name: optionalString(avatar, 'name') ?? 'Unnamed avatar',\n source: 'personal',\n });\n }\n pageToken = nextPageToken(response);\n if (pageToken !== undefined && seen.has(pageToken)) break;\n if (pageToken !== undefined) seen.add(pageToken);\n } while (pageToken !== undefined);\n return results;\n }\n}\n\nfunction parseTokenSet(\n value: JsonObject,\n refreshTokenFallback?: string,\n): SpatiusTokenSet {\n const refreshToken =\n optionalString(value, 'refreshToken', 'refresh_token') ??\n refreshTokenFallback;\n if (refreshToken === undefined) {\n throw new Error('Spatius returned a response without refreshToken.');\n }\n\n return {\n accessToken: requiredString(value, 'accessToken', 'access_token'),\n refreshToken,\n };\n}\n\nfunction parseApiKey(value: JsonObject): SpatiusApiKey {\n return {\n apiKey: requiredString(value, 'apiKey', 'api_key'),\n ...(optionalString(value, 'createdAt', 'created_at') === undefined\n ? {}\n : { createdAt: optionalString(value, 'createdAt', 'created_at') }),\n };\n}\n\nexport class SpatiusAuthenticatedSession {\n readonly #client: SpatiusApiClient;\n #tokens: SpatiusTokenSet;\n\n constructor(client: SpatiusApiClient, tokens: SpatiusTokenSet) {\n this.#client = client;\n this.#tokens = tokens;\n }\n\n async authorized<Value>(\n operation: (accessToken: string) => Promise<Value>,\n ): Promise<Value> {\n try {\n return await operation(this.#tokens.accessToken);\n } catch (error) {\n if (!(error instanceof SpatiusHttpError) || error.status !== 401) {\n throw error;\n }\n this.#tokens = await this.#client.refresh(this.#tokens.refreshToken);\n return operation(this.#tokens.accessToken);\n }\n }\n\n revoke(): Promise<void> {\n return this.#client.revoke(this.#tokens);\n }\n}\n","import { execFile } from 'node:child_process';\nimport { createHash, randomBytes } from 'node:crypto';\nimport { createServer, type Server } from 'node:http';\nimport type { AddressInfo } from 'node:net';\nimport { promisify } from 'node:util';\n\nimport { SecretRedactor } from './redaction.js';\nimport { successPage } from './success-page.js';\nimport {\n SpatiusApiClient,\n SpatiusAuthenticatedSession,\n} from './spatius-api.js';\n\nconst execFileAsync = promisify(execFile);\nconst callbackPath = '/callback';\n\nfunction base64Url(value: Buffer): string {\n return value.toString('base64url');\n}\n\nexport interface PkceMaterial {\n challenge: string;\n state: string;\n verifier: string;\n}\n\nexport function createPkceMaterial(\n random: (size: number) => Buffer = randomBytes,\n): PkceMaterial {\n const verifier = base64Url(random(32));\n return {\n challenge: base64Url(createHash('sha256').update(verifier).digest()),\n state: base64Url(random(18)),\n verifier,\n };\n}\n\nexport interface SpatiusCallbackResult {\n authCode: string;\n authRequestId: string;\n}\n\nexport function validateSpatiusCallback(\n requestUrl: string,\n redirectUri: string,\n expectedState: string,\n expectedRequestId: string,\n): SpatiusCallbackResult {\n const url = new URL(requestUrl, redirectUri);\n if (url.pathname !== callbackPath) {\n throw new Error('The Spatius callback used an unexpected path.');\n }\n\n const providerError = url.searchParams.get('error');\n if (providerError !== null) {\n const safeCode = providerError.replace(/[^A-Za-z\\d_.-]/gu, '').slice(0, 80);\n throw new Error(\n safeCode === ''\n ? 'Spatius authorization was declined.'\n : `Spatius authorization was declined (${safeCode}).`,\n );\n }\n\n if (url.searchParams.get('state') !== expectedState) {\n throw new Error('The Spatius callback state did not match.');\n }\n const authRequestId = url.searchParams.get('auth_request_id')?.trim();\n if (authRequestId !== expectedRequestId) {\n throw new Error('The Spatius callback request ID did not match.');\n }\n const authCode = url.searchParams.get('auth_code')?.trim();\n if (authCode === undefined || authCode === '') {\n throw new Error(\n 'The Spatius callback did not include an authorization code.',\n );\n }\n\n return { authCode, authRequestId };\n}\n\ninterface CallbackExpectation {\n expectedRequestId: string;\n expectedState: string;\n reject: (error: Error) => void;\n resolve: (result: SpatiusCallbackResult) => void;\n}\n\nexport interface SpatiusCallbackServer {\n close(): Promise<void>;\n redirectUri: string;\n waitForCallback(options: {\n expectedRequestId: string;\n expectedState: string;\n timeoutMs: number;\n }): Promise<SpatiusCallbackResult>;\n}\n\nfunction closeServer(server: Server): Promise<void> {\n return new Promise((resolvePromise) => {\n server.close(() => resolvePromise());\n server.closeAllConnections();\n });\n}\n\nexport async function createLoopbackCallbackServer(): Promise<SpatiusCallbackServer> {\n let expectation: CallbackExpectation | undefined;\n let redirectUri = '';\n const server = createServer((request, response) => {\n if (request.method !== 'GET' || request.url === undefined) {\n response.writeHead(404).end('Not found');\n return;\n }\n const requestUrl = new URL(request.url, redirectUri);\n if (requestUrl.pathname !== callbackPath || expectation === undefined) {\n response.writeHead(404).end('Not found');\n return;\n }\n\n const current = expectation;\n expectation = undefined;\n try {\n const result = validateSpatiusCallback(\n request.url,\n redirectUri,\n current.expectedState,\n current.expectedRequestId,\n );\n response\n .writeHead(200, {\n 'Cache-Control': 'no-store',\n 'Content-Security-Policy':\n \"default-src 'none'; style-src 'unsafe-inline'\",\n 'Content-Type': 'text/html; charset=utf-8',\n 'Referrer-Policy': 'no-referrer',\n })\n .end(successPage);\n current.resolve(result);\n } catch (error) {\n response\n .writeHead(400, {\n 'Cache-Control': 'no-store',\n 'Content-Type': 'text/plain; charset=utf-8',\n })\n .end('Authorization could not be completed. Return to the terminal.');\n current.reject(\n error instanceof Error\n ? error\n : new Error('The Spatius callback was invalid.'),\n );\n }\n });\n\n await new Promise<void>((resolvePromise, reject) => {\n server.once('error', reject);\n server.listen(0, '127.0.0.1', () => {\n server.off('error', reject);\n resolvePromise();\n });\n });\n const address = server.address() as AddressInfo;\n redirectUri = `http://127.0.0.1:${String(address.port)}${callbackPath}`;\n\n return {\n close: () => closeServer(server),\n redirectUri,\n waitForCallback: ({ expectedRequestId, expectedState, timeoutMs }) =>\n new Promise((resolvePromise, reject) => {\n if (expectation !== undefined) {\n reject(new Error('A Spatius callback is already pending.'));\n return;\n }\n const timeout = setTimeout(() => {\n expectation = undefined;\n reject(new Error('Timed out waiting for Spatius authorization.'));\n }, timeoutMs);\n expectation = {\n expectedRequestId,\n expectedState,\n reject: (error) => {\n clearTimeout(timeout);\n reject(error);\n },\n resolve: (result) => {\n clearTimeout(timeout);\n resolvePromise(result);\n },\n };\n }),\n };\n}\n\nexport async function openSystemBrowser(url: string): Promise<void> {\n const command =\n process.platform === 'darwin'\n ? 'open'\n : process.platform === 'win32'\n ? 'rundll32.exe'\n : 'xdg-open';\n const args =\n process.platform === 'win32' ? ['url.dll,FileProtocolHandler', url] : [url];\n try {\n await execFileAsync(command, args, {\n timeout: 10_000,\n windowsHide: true,\n });\n } catch {\n throw new Error('The browser could not be opened automatically.');\n }\n}\n\nfunction sessionTimeoutMs(\n response: { expiresAt?: string; expiresIn?: number },\n now: () => number,\n maximumMs: number,\n): number {\n const candidates = [maximumMs];\n if (response.expiresIn !== undefined && response.expiresIn > 0) {\n candidates.push(response.expiresIn * 1000);\n }\n if (response.expiresAt !== undefined) {\n const expiresAt = Date.parse(response.expiresAt);\n if (Number.isFinite(expiresAt)) {\n candidates.push(Math.max(1, expiresAt - now()));\n }\n }\n return Math.max(1, Math.min(...candidates.filter((value) => value > 0)));\n}\n\nfunction validateAuthorizationUrl(value: string): string {\n const url = new URL(value);\n const loopbackHost = ['127.0.0.1', '[::1]', 'localhost'].includes(\n url.hostname,\n );\n if (\n (url.protocol !== 'https:' &&\n !(url.protocol === 'http:' && loopbackHost)) ||\n url.username !== '' ||\n url.password !== ''\n ) {\n throw new Error('Spatius returned an unsafe authorization URL.');\n }\n return value;\n}\n\ninterface LoginToSpatiusOptions {\n callbackServerFactory?: () => Promise<SpatiusCallbackServer>;\n client: SpatiusApiClient;\n maximumWaitMs?: number;\n now?: () => number;\n onAuthorizationUrl: (url: string) => void;\n onBrowserOpenFailure?: (error: Error) => void;\n openBrowser?: (url: string) => Promise<void>;\n redactor?: SecretRedactor;\n}\n\nexport async function loginToSpatius({\n callbackServerFactory = createLoopbackCallbackServer,\n client,\n maximumWaitMs = 5 * 60_000,\n now = Date.now,\n onAuthorizationUrl,\n onBrowserOpenFailure,\n openBrowser = openSystemBrowser,\n redactor = new SecretRedactor(),\n}: LoginToSpatiusOptions): Promise<SpatiusAuthenticatedSession> {\n const callback = await callbackServerFactory();\n const pkce = createPkceMaterial();\n redactor.add(pkce.verifier, pkce.state);\n\n try {\n const auth = await client.createAuthSession({\n codeChallenge: pkce.challenge,\n redirectUri: callback.redirectUri,\n state: pkce.state,\n });\n const authorizationUrl = validateAuthorizationUrl(auth.authorizeUrl);\n onAuthorizationUrl(authorizationUrl);\n const callbackResult = callback.waitForCallback({\n expectedRequestId: auth.authRequestId,\n expectedState: pkce.state,\n timeoutMs: sessionTimeoutMs(auth, now, maximumWaitMs),\n });\n // The callback can reject while the browser launcher is still pending.\n // Handle it immediately; awaiting the original promise below still throws.\n void callbackResult.catch(() => undefined);\n try {\n await openBrowser(authorizationUrl);\n } catch (error) {\n onBrowserOpenFailure?.(\n error instanceof Error\n ? error\n : new Error('The browser could not be opened automatically.'),\n );\n }\n\n const result = await callbackResult;\n redactor.add(result.authCode);\n const tokens = await client.exchangeAuthCode({\n authCode: result.authCode,\n authRequestId: result.authRequestId,\n codeVerifier: pkce.verifier,\n });\n redactor.add(tokens.accessToken, tokens.refreshToken);\n return new SpatiusAuthenticatedSession(client, tokens);\n } finally {\n await callback.close().catch(() => undefined);\n }\n}\n","import { PromptCancelledError } from '../errors.js';\nimport type { SetupPrompts } from '../prompts.js';\nimport { type SpatiusCredentials, isPlaceholderValue } from './environment.js';\nimport { maskSecret, SecretRedactor } from './redaction.js';\nimport {\n type SpatiusApiKey,\n type SpatiusApp,\n type SpatiusAvatar,\n SpatiusApiClient,\n SpatiusAuthenticatedSession,\n} from './spatius-api.js';\n\nexport function combineAvatars(\n publicAvatars: readonly SpatiusAvatar[],\n personalAvatars: readonly SpatiusAvatar[],\n): SpatiusAvatar[] {\n const byId = new Map<string, SpatiusAvatar>();\n for (const avatar of publicAvatars) {\n byId.set(avatar.id, avatar);\n }\n for (const avatar of personalAvatars) {\n byId.set(avatar.id, { ...byId.get(avatar.id), ...avatar });\n }\n return [...byId.values()];\n}\n\nfunction dateLabel(value: string | undefined): string {\n if (value === undefined) return 'creation date unavailable';\n const date = new Date(value);\n return Number.isNaN(date.getTime())\n ? 'creation date unavailable'\n : `created ${date.toISOString().slice(0, 10)}`;\n}\n\nexport function apiKeyLabel(key: SpatiusApiKey): string {\n return `${maskSecret(key.apiKey)} · ${dateLabel(key.createdAt)}`;\n}\n\nfunction assertResourceId(value: string, label: string): string {\n const normalized = value.trim();\n if (isPlaceholderValue(normalized)) {\n throw new Error(`${label} must be a non-placeholder value.`);\n }\n return normalized;\n}\n\ninterface SelectedAppKey {\n apiKey: string;\n app: SpatiusApp;\n}\n\nasync function createApiKey(\n session: SpatiusAuthenticatedSession,\n client: SpatiusApiClient,\n app: SpatiusApp,\n prompts: SetupPrompts,\n redactor: SecretRedactor,\n): Promise<SelectedAppKey> {\n const confirmed = await prompts.confirm(\n `Create a new API key for ${app.name} (${app.appId})?`,\n false,\n );\n if (!confirmed) {\n throw new PromptCancelledError('Credential setup was cancelled.');\n }\n const key = await session.authorized((accessToken) =>\n client.createApiKey(accessToken, app.appId),\n );\n redactor.add(key.apiKey);\n return { apiKey: key.apiKey, app };\n}\n\nasync function selectExistingAppKey(\n session: SpatiusAuthenticatedSession,\n client: SpatiusApiClient,\n app: SpatiusApp,\n prompts: SetupPrompts,\n redactor: SecretRedactor,\n): Promise<SelectedAppKey> {\n const keys = await session.authorized((accessToken) =>\n client.listApiKeys(accessToken, app.appId),\n );\n redactor.add(...keys.map((key) => key.apiKey));\n const options = [\n ...keys.map((key, index) => ({\n label: apiKeyLabel(key),\n value: `key-${String(index)}`,\n })),\n {\n hint: 'Creates a new secret after confirmation',\n label: 'Create a new API key for this app',\n value: 'create-key',\n },\n ];\n const selection = await prompts.choose(\n `Which API key should ${app.name} use?`,\n options,\n keys.length > 0 ? 'key-0' : 'create-key',\n );\n if (selection === 'create-key') {\n return createApiKey(session, client, app, prompts, redactor);\n }\n const index = Number.parseInt(selection.slice('key-'.length), 10);\n const key = keys[index];\n if (key === undefined) {\n throw new Error('The selected Spatius API key is no longer available.');\n }\n return { apiKey: key.apiKey, app };\n}\n\nasync function createAppAndKey(\n session: SpatiusAuthenticatedSession,\n client: SpatiusApiClient,\n projectName: string,\n prompts: SetupPrompts,\n redactor: SecretRedactor,\n): Promise<SelectedAppKey> {\n const requestedName = await prompts.input('Name for the new Spatius app', {\n initialValue: projectName,\n placeholder: projectName,\n });\n const name = requestedName.trim();\n if (name === '' || name.length > 128) {\n throw new Error(\n 'The Spatius app name must be between 1 and 128 characters.',\n );\n }\n const confirmed = await prompts.confirm(\n `Create the Spatius app \"${name}\" and its first API key?`,\n false,\n );\n if (!confirmed) {\n throw new PromptCancelledError('Credential setup was cancelled.');\n }\n\n const app = await session.authorized((accessToken) =>\n client.createApp(accessToken, name),\n );\n try {\n const key = await session.authorized((accessToken) =>\n client.createApiKey(accessToken, app.appId),\n );\n redactor.add(key.apiKey);\n return { apiKey: key.apiKey, app };\n } catch (error) {\n throw new Error(\n `The Spatius app was created with ID ${app.appId}, but its API key could not be created. Rerun setup and select that app to create a key.`,\n { cause: error },\n );\n }\n}\n\nasync function selectAppAndKey(\n session: SpatiusAuthenticatedSession,\n client: SpatiusApiClient,\n apps: readonly SpatiusApp[],\n projectName: string,\n prompts: SetupPrompts,\n redactor: SecretRedactor,\n): Promise<SelectedAppKey> {\n const options = [\n ...apps.map((app, index) => ({\n hint: app.appId,\n label: app.name,\n value: `app-${String(index)}`,\n })),\n {\n hint: 'Creates remote resources only after confirmation',\n label: 'Create a new Spatius app and API key',\n value: 'create-app',\n },\n ];\n const selection = await prompts.choose(\n 'Which Spatius app should this project use?',\n options,\n apps.length > 0 ? 'app-0' : 'create-app',\n );\n if (selection === 'create-app') {\n return createAppAndKey(session, client, projectName, prompts, redactor);\n }\n const index = Number.parseInt(selection.slice('app-'.length), 10);\n const app = apps[index];\n if (app === undefined) {\n throw new Error('The selected Spatius app is no longer available.');\n }\n return selectExistingAppKey(session, client, app, prompts, redactor);\n}\n\nasync function selectAvatar(\n publicAvatars: readonly SpatiusAvatar[],\n personalAvatars: readonly SpatiusAvatar[],\n prompts: SetupPrompts,\n): Promise<Pick<SpatiusCredentials, 'avatarId' | 'backgroundUrl'>> {\n const avatars = combineAvatars(publicAvatars, personalAvatars);\n const options = [\n ...avatars.map((avatar, index) => ({\n hint: avatar.id,\n label: `${avatar.name} (${avatar.source})`,\n value: `avatar-${String(index)}`,\n })),\n {\n hint: 'Use an avatar ID not shown in the lists',\n label: 'Enter an avatar ID manually',\n value: 'manual-avatar',\n },\n ];\n const selection = await prompts.choose(\n 'Which avatar should the demo dispatch?',\n options,\n avatars.length > 0 ? 'avatar-0' : 'manual-avatar',\n );\n if (selection === 'manual-avatar') {\n return {\n avatarId: assertResourceId(\n await prompts.input('Spatius avatar ID'),\n 'SPATIUS_AVATAR_ID',\n ),\n };\n }\n const index = Number.parseInt(selection.slice('avatar-'.length), 10);\n const avatar = avatars[index];\n if (avatar === undefined) {\n throw new Error('The selected Spatius avatar is no longer available.');\n }\n return {\n avatarId: avatar.id,\n ...(avatar.backgroundUrl ? { backgroundUrl: avatar.backgroundUrl } : {}),\n };\n}\n\ninterface SelectSpatiusResourcesOptions {\n client: SpatiusApiClient;\n onWarning: (message: string) => void;\n projectName: string;\n prompts: SetupPrompts;\n redactor: SecretRedactor;\n session: SpatiusAuthenticatedSession;\n}\n\nexport async function selectSpatiusResources({\n client,\n onWarning,\n projectName,\n prompts,\n redactor,\n session,\n}: SelectSpatiusResourcesOptions): Promise<SpatiusCredentials> {\n const [apps, publicAvatars] = await session.authorized((accessToken) =>\n Promise.all([\n client.listApps(accessToken),\n client.listPublicAvatars(accessToken),\n ]),\n );\n const selected = await selectAppAndKey(\n session,\n client,\n apps,\n projectName,\n prompts,\n redactor,\n );\n let personalAvatars: SpatiusAvatar[] = [];\n try {\n personalAvatars = await client.listPersonalAvatars(\n selected.app.appId,\n selected.apiKey,\n );\n } catch {\n onWarning(\n 'Personal avatars could not be loaded; continuing with the public avatar library.',\n );\n }\n const avatar = await selectAvatar(publicAvatars, personalAvatars, prompts);\n\n return {\n apiKey: selected.apiKey,\n appId: selected.app.appId,\n ...avatar,\n };\n}\n","import { basename } from 'node:path';\n\nimport { PromptCancelledError } from '../errors.js';\nimport type { SetupPrompts } from '../prompts.js';\nimport { CHARACTER_VOICES } from '../templates/cloudflare-livekit/voices.js';\nimport {\n buildCredentialFileContents,\n type CredentialBundle,\n type CredentialFileState,\n type LiveKitCredentials,\n readCredentialExamples,\n readCredentialFileState,\n parseDotenv,\n type SpatiusCredentials,\n validateCredentialBundle,\n validateLiveKitUrl,\n writeCredentialFilesAtomically,\n} from './environment.js';\nimport {\n loadLiveKitCredentialsWithCli,\n probeLiveKitCli,\n type LiveKitCliProbe,\n} from './livekit.js';\nimport {\n authenticateLiveKitCli,\n installLiveKitCli,\n LIVEKIT_INSTALL_GUIDE,\n planLiveKitInstall,\n} from './livekit-install.js';\nimport { assertSpatiusProject } from './project.js';\nimport { SecretRedactor } from './redaction.js';\nimport { loginToSpatius, type SpatiusCallbackServer } from './spatius-auth.js';\nimport {\n SPATIUS_CONSOLE_BASE_URL,\n SpatiusApiClient,\n SpatiusAuthenticatedSession,\n type SpatiusRequestDiagnostic,\n} from './spatius-api.js';\nimport { selectSpatiusResources } from './spatius-resources.js';\n\nexport type CredentialSetupResult = 'configured' | 'unchanged';\n\nexport interface CredentialSetupDependencies {\n authenticateLiveKit?: () => Promise<void>;\n installLiveKit?: typeof installLiveKitCli;\n planLiveKitInstall?: typeof planLiveKitInstall;\n createSpatiusClient?: () => SpatiusApiClient;\n loadLiveKitCredentials?: () => Promise<LiveKitCredentials>;\n loginToSpatius?: (options: {\n client: SpatiusApiClient;\n onAuthorizationUrl: (url: string) => void;\n onBrowserOpenFailure: (error: Error) => void;\n redactor: SecretRedactor;\n }) => Promise<SpatiusAuthenticatedSession>;\n probeLiveKit?: () => Promise<LiveKitCliProbe>;\n readExamples?: typeof readCredentialExamples;\n readState?: typeof readCredentialFileState;\n selectSpatiusResources?: typeof selectSpatiusResources;\n validateProject?: typeof assertSpatiusProject;\n writeFiles?: typeof writeCredentialFilesAtomically;\n}\n\ninterface CredentialSetupOptions {\n dependencies?: CredentialSetupDependencies;\n onDiagnostic?: (event: SpatiusRequestDiagnostic) => void;\n onStatus?: (message: string) => void;\n onWarning?: (message: string) => void;\n projectName?: string;\n prompts: SetupPrompts;\n targetDirectory: string;\n}\n\nasync function collectManualLiveKitCredentials(\n prompts: SetupPrompts,\n): Promise<LiveKitCredentials> {\n const url = validateLiveKitUrl(\n await prompts.input('LiveKit URL', {\n placeholder: 'wss://your-project.livekit.cloud',\n }),\n );\n const apiKey = await prompts.password('LiveKit API key');\n const apiSecret = await prompts.password('LiveKit API secret');\n return validateCredentialBundle({\n liveKit: { apiKey, apiSecret, url },\n spatius: {\n apiKey: 'validation-only',\n appId: 'validation-only',\n avatarId: 'validation-only',\n },\n }).liveKit;\n}\n\nasync function collectLiveKitCredentials(\n prompts: SetupPrompts,\n dependencies: Required<\n Pick<\n CredentialSetupDependencies,\n | 'loadLiveKitCredentials'\n | 'probeLiveKit'\n | 'planLiveKitInstall'\n | 'installLiveKit'\n | 'authenticateLiveKit'\n >\n >,\n onStatus: (message: string) => void,\n onWarning: (message: string) => void,\n): Promise<LiveKitCredentials | undefined> {\n let probe = await dependencies.probeLiveKit();\n let useCli = false;\n while (true) {\n if (!probe.available) {\n const update = probe.reason === 'incompatible';\n onWarning(\n update\n ? 'The installed LiveKit CLI needs an update to support `lk app env`.'\n : 'LiveKit CLI was not found on PATH. It is needed for browser-based setup.',\n );\n const plan = await dependencies.planLiveKitInstall(update);\n onStatus(\n plan === undefined\n ? `Install or update LiveKit CLI, then check again: ${LIVEKIT_INSTALL_GUIDE}`\n : `${update ? 'Update' : 'Install'} command: ${plan.displayCommand}`,\n );\n const action = await prompts.choose(\n 'Connect your LiveKit project',\n [\n ...(plan === undefined\n ? []\n : [\n {\n label: `${update ? 'Update' : 'Install'} LiveKit CLI and connect`,\n value: 'install',\n hint: 'Recommended; runs the command shown above',\n },\n ]),\n { label: \"I've installed it — check again\", value: 'retry' },\n { label: 'Enter credentials manually', value: 'manual' },\n { label: 'Set up later', value: 'skip' },\n ],\n plan === undefined ? 'manual' : 'install',\n );\n if (action === 'skip') return undefined;\n if (action === 'manual') return collectManualLiveKitCredentials(prompts);\n if (action === 'install' && plan !== undefined) {\n try {\n onStatus(`${update ? 'Updating' : 'Installing'} LiveKit CLI…`);\n await dependencies.installLiveKit(plan);\n } catch (error) {\n if (error instanceof PromptCancelledError) throw error;\n onWarning(\n 'LiveKit CLI installation did not complete. Retry, enter credentials manually, or set up later.',\n );\n continue;\n }\n }\n probe = await dependencies.probeLiveKit();\n if (!probe.available) {\n onWarning(\n 'A compatible lk is still unavailable in this terminal. If installation changed PATH, open a new terminal and run create-spatius-app setup . --interactive from your project.',\n );\n continue;\n }\n onStatus('LiveKit CLI is ready.');\n useCli = true;\n }\n\n const source = useCli\n ? 'cli'\n : await prompts.choose(\n 'How should LiveKit credentials be configured?',\n [\n {\n hint:\n probe.version === undefined\n ? 'Recommended; uses `lk app env`'\n : `Recommended; lk ${probe.version}`,\n label: 'Use the LiveKit CLI',\n value: 'cli',\n },\n {\n hint: 'Opens LiveKit in your browser using `lk cloud auth`',\n label: 'Connect another LiveKit project',\n value: 'connect',\n },\n {\n hint: 'Values are entered with secret masking',\n label: 'Enter credentials manually',\n value: 'manual',\n },\n { label: 'Set up later', value: 'skip' },\n ],\n 'cli',\n );\n if (source === 'skip') return undefined;\n if (source === 'manual') return collectManualLiveKitCredentials(prompts);\n try {\n if (source === 'connect') {\n onStatus(\n 'Opening LiveKit in your browser. Sign in and select a project.',\n );\n await dependencies.authenticateLiveKit();\n }\n onStatus(\n 'Starting the LiveKit project credential flow… Follow the LiveKit prompts to select a linked project or sign in through your browser.',\n );\n return await dependencies.loadLiveKitCredentials();\n } catch (error) {\n if (error instanceof PromptCancelledError) throw error;\n onWarning(\n 'The LiveKit CLI flow did not complete or returned invalid credentials.',\n );\n const action = await prompts.choose(\n 'How should LiveKit setup continue?',\n [\n { label: 'Retry LiveKit connection', value: 'retry' },\n { label: 'Enter credentials manually', value: 'manual' },\n { label: 'Set up later', value: 'skip' },\n ],\n 'manual',\n );\n if (action === 'skip') return undefined;\n if (action === 'manual') return collectManualLiveKitCredentials(prompts);\n useCli = false;\n }\n }\n}\n\nasync function collectManualSpatiusCredentials(\n prompts: SetupPrompts,\n): Promise<SpatiusCredentials> {\n return {\n apiKey: await prompts.password('Spatius API key'),\n appId: await prompts.password('Spatius app ID'),\n avatarId: await prompts.password('Spatius avatar ID'),\n };\n}\n\nasync function collectBrowserSpatiusCredentials(\n prompts: SetupPrompts,\n projectName: string,\n client: SpatiusApiClient,\n dependencies: Required<\n Pick<\n CredentialSetupDependencies,\n 'loginToSpatius' | 'selectSpatiusResources'\n >\n >,\n redactor: SecretRedactor,\n onStatus: (message: string) => void,\n onWarning: (message: string) => void,\n): Promise<SpatiusCredentials> {\n let session: SpatiusAuthenticatedSession | undefined;\n try {\n session = await dependencies.loginToSpatius({\n client,\n onAuthorizationUrl: (url) => {\n onStatus(`Approve Spatius access in your browser:\\n${url}`);\n },\n onBrowserOpenFailure: () => {\n onWarning(\n 'The browser could not be opened automatically. Use the printed authorization URL.',\n );\n },\n redactor,\n });\n return await dependencies.selectSpatiusResources({\n client,\n onWarning,\n projectName,\n prompts,\n redactor,\n session,\n });\n } finally {\n if (session !== undefined) {\n await session.revoke().catch(() => {\n onWarning(\n 'The temporary Spatius CLI session could not be revoked automatically. No session token was stored locally.',\n );\n });\n }\n }\n}\n\nasync function collectSpatiusCredentials(\n prompts: SetupPrompts,\n projectName: string,\n client: SpatiusApiClient,\n dependencies: Required<\n Pick<\n CredentialSetupDependencies,\n 'loginToSpatius' | 'selectSpatiusResources'\n >\n >,\n redactor: SecretRedactor,\n onStatus: (message: string) => void,\n onWarning: (message: string) => void,\n): Promise<SpatiusCredentials> {\n const source = await prompts.choose(\n 'How should Spatius credentials be configured?',\n [\n {\n hint: 'Recommended; login is temporary and browser-approved',\n label: 'Sign in with Spatius Studio',\n value: 'browser',\n },\n {\n hint: 'Values are entered with secret masking',\n label: 'Enter credentials manually',\n value: 'manual',\n },\n ],\n 'browser',\n );\n if (source === 'manual') {\n return collectManualSpatiusCredentials(prompts);\n }\n\n try {\n return await collectBrowserSpatiusCredentials(\n prompts,\n projectName,\n client,\n dependencies,\n redactor,\n onStatus,\n onWarning,\n );\n } catch (error) {\n if (error instanceof PromptCancelledError) {\n throw error;\n }\n const detail = redactor.redact(\n error instanceof Error ? error.message : 'Unknown provider error.',\n );\n onWarning(`Spatius browser setup did not complete: ${detail}`);\n const useManual = await prompts.confirm(\n 'Enter Spatius credentials manually instead?',\n true,\n );\n if (!useManual) {\n throw new PromptCancelledError('Credential setup was cancelled.');\n }\n return collectManualSpatiusCredentials(prompts);\n }\n}\n\nasync function confirmReplacement(\n state: CredentialFileState,\n prompts: SetupPrompts,\n onWarning: (message: string) => void,\n): Promise<boolean> {\n if (state.status === 'complete') {\n const keep = await prompts.confirm(\n 'A complete, consistent local credential configuration already exists. Keep it?',\n true,\n );\n if (keep) return false;\n } else if (state.hasManagedValues) {\n onWarning(\n state.status === 'inconsistent'\n ? 'The Worker and agent credential files contain inconsistent managed values.'\n : 'The local credential files contain only part of the required configuration.',\n );\n } else {\n return true;\n }\n\n return prompts.confirm(\n 'Replace the existing managed credential values? Unrelated variables and comments will be preserved.',\n false,\n );\n}\n\nfunction defaultClient(\n onDiagnostic?: (event: SpatiusRequestDiagnostic) => void,\n): SpatiusApiClient {\n const testBaseUrl =\n process.env.NODE_ENV === 'test'\n ? process.env.CREATE_SPATIUS_APP_TEST_SPATIUS_BASE_URL\n : undefined;\n return new SpatiusApiClient(\n testBaseUrl ?? SPATIUS_CONSOLE_BASE_URL,\n fetch,\n onDiagnostic,\n );\n}\n\nexport async function runCredentialSetup({\n dependencies = {},\n onDiagnostic,\n onStatus = () => undefined,\n onWarning = () => undefined,\n projectName,\n prompts,\n targetDirectory,\n}: CredentialSetupOptions): Promise<CredentialSetupResult> {\n const validateProject = dependencies.validateProject ?? assertSpatiusProject;\n const readState = dependencies.readState ?? readCredentialFileState;\n const readExamples = dependencies.readExamples ?? readCredentialExamples;\n const writeFiles = dependencies.writeFiles ?? writeCredentialFilesAtomically;\n const setupDependencies = {\n authenticateLiveKit:\n dependencies.authenticateLiveKit ?? authenticateLiveKitCli,\n installLiveKit: dependencies.installLiveKit ?? installLiveKitCli,\n planLiveKitInstall: dependencies.planLiveKitInstall ?? planLiveKitInstall,\n createSpatiusClient:\n dependencies.createSpatiusClient ?? (() => defaultClient(onDiagnostic)),\n loadLiveKitCredentials:\n dependencies.loadLiveKitCredentials ??\n (() => loadLiveKitCredentialsWithCli()),\n loginToSpatius:\n dependencies.loginToSpatius ??\n ((options) =>\n loginToSpatius({\n ...options,\n ...(process.env.NODE_ENV === 'test' &&\n process.env.CREATE_SPATIUS_APP_TEST_NO_BROWSER === '1'\n ? { openBrowser: () => Promise.resolve() }\n : {}),\n })),\n probeLiveKit: dependencies.probeLiveKit ?? (() => probeLiveKitCli()),\n selectSpatiusResources:\n dependencies.selectSpatiusResources ?? selectSpatiusResources,\n };\n\n // Validate the project boundary before inspecting any credential file.\n await validateProject(targetDirectory);\n const state = await readState(targetDirectory);\n const shouldReplace = await confirmReplacement(state, prompts, onWarning);\n if (!shouldReplace) {\n onStatus('Existing local credentials were left unchanged.');\n return 'unchanged';\n }\n\n const redactor = new SecretRedactor();\n const liveKit = await collectLiveKitCredentials(\n prompts,\n setupDependencies,\n onStatus,\n onWarning,\n );\n if (liveKit === undefined) {\n onStatus(\n 'Credential setup deferred. Run create-spatius-app setup . --interactive from your project when ready.',\n );\n return 'unchanged';\n }\n redactor.add(liveKit.apiKey, liveKit.apiSecret);\n const spatius = await collectSpatiusCredentials(\n prompts,\n projectName ?? basename(targetDirectory),\n setupDependencies.createSpatiusClient(),\n setupDependencies,\n redactor,\n onStatus,\n onWarning,\n );\n redactor.add(spatius.apiKey);\n const existingVoice = parseDotenv(state.worker ?? '').get(\n 'CARTESIA_VOICE_ID',\n );\n const initialVoice =\n CHARACTER_VOICES.find((voice) => voice.voiceId === existingVoice) ??\n CHARACTER_VOICES[0];\n const characterStyle = await prompts.choose(\n 'Which character style should the voice match for your selected avatar?',\n CHARACTER_VOICES.map(({ value, label, hint }) => ({ value, label, hint })),\n initialVoice.value,\n );\n const voice = CHARACTER_VOICES.find(\n (option) => option.value === characterStyle,\n );\n if (!voice)\n throw new Error('Choose a feminine or masculine character voice.');\n const credentials: CredentialBundle = validateCredentialBundle({\n voiceId: voice.voiceId,\n liveKit,\n spatius,\n });\n const examples = await readExamples(targetDirectory);\n const rendered = buildCredentialFileContents(state, examples, credentials);\n await writeFiles(targetDirectory, rendered);\n onStatus('Saved .dev.vars and agent/.env.local for local development only.');\n return 'configured';\n}\n\nexport type { SpatiusCallbackServer };\n","import { fileURLToPath } from 'node:url';\n\nimport { CliError, EXIT_CODES } from './errors.js';\nimport { cloudflareLivekitTemplate } from './templates/cloudflare-livekit/index.js';\nimport type { TemplateDefinition } from './templates/types.js';\n\nexport type {\n TemplateConfiguration,\n TemplateDefinition,\n} from './templates/types.js';\n\nexport const DEFAULT_TEMPLATE_ID = 'cloudflare-livekit' as const;\nexport const templateRegistry = {\n [DEFAULT_TEMPLATE_ID]: cloudflareLivekitTemplate,\n} as const satisfies Record<string, TemplateDefinition>;\nexport type TemplateId = keyof typeof templateRegistry;\n\nexport function getTemplate(\n id: TemplateId = DEFAULT_TEMPLATE_ID,\n): TemplateDefinition {\n return templateRegistry[id];\n}\n\nexport function resolveTemplateDirectory(\n template: TemplateDefinition = getTemplate(),\n): string {\n // Both src/templates.ts and the bundled dist/templates.js / dist/cli.js\n // live exactly one directory below the installed package root.\n return fileURLToPath(new URL(`../${template.directory}/`, import.meta.url));\n}\n\nexport async function resolveProjectTemplate(\n targetDirectory: string,\n templates: readonly TemplateDefinition[] = Object.values(templateRegistry),\n): Promise<TemplateDefinition> {\n const matches: TemplateDefinition[] = [];\n for (const template of templates) {\n if (await template.setup.recognizes(targetDirectory))\n matches.push(template);\n }\n if (matches.length !== 1) {\n throw new CliError(\n 'INVALID_ARGUMENT',\n matches.length === 0\n ? 'The target is not a compatible create-spatius-app project.'\n : 'The target matches more than one create-spatius-app template.',\n {\n exitCode: EXIT_CODES.invalidArgument,\n path: targetDirectory,\n recovery:\n 'Run this command from a generated project, or pass its directory explicitly.',\n },\n );\n }\n return matches[0]!;\n}\n\n// Internal verification entry point. These helpers are bundled for scripts\n// that exercise every registry entry without adding a public CLI selector.\nexport { createScaffoldPlan, scaffoldProject } from './scaffold.js';\nexport {\n createProcessInvocation,\n selectJavaScriptPackageManager,\n selectPythonPackageManager,\n} from './package-managers.js';\n","import { CliError } from '../../errors.js';\nimport {\n javascriptInstallCommand,\n javascriptRunCommand,\n pythonInstallCommands,\n} from '../../package-managers.js';\nimport { assertSpatiusProject } from '../../setup/project.js';\nimport type { TemplateDefinition } from '../types.js';\nimport { configureGeneratedTemplate } from './configure.js';\nimport { createInstallPlan } from './install.js';\n\nconst aliases: Readonly<Record<string, string>> = {\n 'dev.vars.example': '.dev.vars.example',\n dockerignore: '.dockerignore',\n 'env.example': '.env.example',\n gitignore: '.gitignore',\n npmrc: '.npmrc',\n prettierignore: '.prettierignore',\n 'python-version': '.python-version',\n 'Dockerfile.pip': 'Dockerfile',\n 'Dockerfile.uv': 'Dockerfile',\n};\n\nexport const cloudflareLivekitTemplate: TemplateDefinition = {\n id: 'cloudflare-livekit',\n directory: 'templates/cloudflare-livekit',\n description:\n 'Create a React, Cloudflare Workers, and LiveKit Agents application.',\n components: [\n '- web/ React + Spatius AvatarKit',\n '- worker/ Cloudflare token and dispatch API',\n '- agent/ Python LiveKit agent',\n ],\n includeFile(path, configuration) {\n const javascript = configuration?.packageManagers.javascript.name ?? 'pnpm';\n const python = configuration?.packageManagers.python.name ?? 'uv';\n if (path === 'package-lock.json') return javascript === 'npm';\n if (['npmrc', 'pnpm-lock.yaml', 'pnpm-workspace.yaml'].includes(path)) {\n return javascript === 'pnpm';\n }\n if (path === 'agent/uv.lock' || path === 'agent/Dockerfile.uv') {\n return python === 'uv';\n }\n if (path === 'agent/Dockerfile.pip') return python === 'pip';\n return true;\n },\n mapFile(path) {\n return path\n .split('/')\n .map((segment) => aliases[segment] ?? segment)\n .join('/');\n },\n configure: configureGeneratedTemplate,\n createInstallPlan,\n nextSteps({\n credentialsConfigured = false,\n dependenciesInstalled,\n javascriptPackageManager,\n platform,\n pythonPackageManager,\n }) {\n return [\n ...(dependenciesInstalled\n ? []\n : [\n javascriptInstallCommand(javascriptPackageManager),\n ...pythonInstallCommands(pythonPackageManager, platform),\n ]),\n ...(credentialsConfigured\n ? []\n : ['npx create-spatius-app setup . --interactive']),\n javascriptRunCommand(javascriptPackageManager, 'dev'),\n ];\n },\n setup: {\n async recognizes(directory) {\n // These structural markers also recognize projects generated before the\n // registry existed; no new manifest or metadata is required for setup.\n try {\n await assertSpatiusProject(directory);\n return true;\n } catch (error) {\n if (error instanceof CliError && error.code === 'INVALID_ARGUMENT') {\n return false;\n }\n throw error;\n }\n },\n async run(options) {\n const { runCredentialSetup } = await import('../../setup/wizard.js');\n return runCredentialSetup(options);\n },\n },\n verification: [\n { javascript: 'pnpm', python: 'uv', scripts: ['check', 'agent:check'] },\n { javascript: 'npm', python: 'pip', scripts: ['check', 'agent:check'] },\n ],\n};\n","import { randomUUID } from 'node:crypto';\nimport { readFile, writeFile } from 'node:fs/promises';\nimport { basename, join } from 'node:path';\n\nimport {\n javascriptInstallCommand,\n javascriptRunCommand,\n pythonInstallCommands,\n type SelectedPackageManagers,\n} from '../../package-managers.js';\nimport type { TemplateConfiguration } from '../types.js';\n\ninterface PackageMetadata {\n allowScripts?: Record<string, boolean>;\n name: string;\n packageManager?: string;\n scripts: Record<string, string>;\n trustedDependencies?: string[];\n}\n\ninterface PackageLockMetadata {\n name: string;\n packages?: Record<string, { name?: string }>;\n}\n\nexport function toValidPackageName(value: string): string {\n const normalized = value\n .trim()\n .toLowerCase()\n .replace(/\\s+/gu, '-')\n .replace(/^[._-]+/u, '')\n .replace(/[^a-z\\d~._-]+/gu, '-')\n .replace(/-+/gu, '-')\n .slice(0, 214)\n .replace(/-$/u, '');\n\n return normalized === '' ? 'spatius-app' : normalized;\n}\n\nfunction managerDescription(name: string, version: string | undefined): string {\n return version === undefined || version === 'unknown'\n ? name\n : `${name} ${version}`;\n}\n\nfunction npmRequiresScriptAllowlist(version: string | undefined): boolean {\n const major = Number.parseInt(version?.split('.')[0] ?? '', 10);\n return Number.isFinite(major) && major >= 12;\n}\n\nfunction createReplacements(\n packageManagers: SelectedPackageManagers,\n platform: NodeJS.Platform,\n): ReadonlyMap<string, string> {\n const javascript = packageManagers.javascript;\n const python = packageManagers.python;\n\n return new Map([\n [\n '{{SPATIUS_JAVASCRIPT_PACKAGE_MANAGER}}',\n managerDescription(javascript.name, javascript.version),\n ],\n [\n '{{SPATIUS_PYTHON_PACKAGE_MANAGER}}',\n managerDescription(python.name, python.version),\n ],\n [\n '__SPATIUS_JAVASCRIPT_INSTALL_COMMAND__',\n javascriptInstallCommand(javascript.name),\n ],\n [\n '__SPATIUS_PYTHON_INSTALL_COMMANDS__',\n pythonInstallCommands(python, platform).join('\\n'),\n ],\n [\n '__SPATIUS_PYTHON_INSTALL_SUMMARY__',\n pythonInstallCommands(python, platform).join(' && '),\n ],\n ['__SPATIUS_DEV_COMMAND__', javascriptRunCommand(javascript.name, 'dev')],\n [\n '__SPATIUS_WEB_DEV_COMMAND__',\n javascriptRunCommand(javascript.name, 'dev:web'),\n ],\n [\n '__SPATIUS_CHECK_COMMAND__',\n javascriptRunCommand(javascript.name, 'check'),\n ],\n [\n '__SPATIUS_AGENT_CHECK_COMMAND__',\n javascriptRunCommand(javascript.name, 'agent:check'),\n ],\n [\n '__SPATIUS_AGENT_DEV_COMMAND__',\n javascriptRunCommand(javascript.name, 'agent:dev'),\n ],\n [\n '__SPATIUS_CF_TYPEGEN_COMMAND__',\n javascriptRunCommand(javascript.name, 'cf-typegen'),\n ],\n [\n '__SPATIUS_DEPLOY_COMMAND__',\n javascriptRunCommand(javascript.name, 'deploy'),\n ],\n [\n '__SPATIUS_WRANGLER_LOGIN_COMMAND__',\n javascriptRunCommand(javascript.name, 'wrangler -- login'),\n ],\n [\n '__SPATIUS_WRANGLER_API_KEY_COMMAND__',\n javascriptRunCommand(\n javascript.name,\n 'wrangler -- secret put LIVEKIT_API_KEY',\n ),\n ],\n [\n '__SPATIUS_WRANGLER_API_SECRET_COMMAND__',\n javascriptRunCommand(\n javascript.name,\n 'wrangler -- secret put LIVEKIT_API_SECRET',\n ),\n ],\n ]);\n}\n\nasync function renderFile(\n path: string,\n replacements: ReadonlyMap<string, string>,\n): Promise<void> {\n let contents = await readFile(path, 'utf8');\n\n for (const [token, replacement] of replacements) {\n contents = contents.replaceAll(token, replacement);\n }\n\n await writeFile(path, contents);\n}\n\nexport async function configureGeneratedTemplate(\n targetDirectory: string,\n {\n packageManagers,\n platform = process.platform,\n projectName = basename(targetDirectory),\n }: TemplateConfiguration,\n): Promise<void> {\n const packagePath = join(targetDirectory, 'package.json');\n const packageContents = await readFile(packagePath, 'utf8');\n const metadata = JSON.parse(packageContents) as PackageMetadata;\n const javascript = packageManagers.javascript;\n const run = (script: string) => javascriptRunCommand(javascript.name, script);\n\n metadata.name = toValidPackageName(projectName);\n if (javascript.version === undefined || javascript.version === 'unknown') {\n delete metadata.packageManager;\n } else {\n metadata.packageManager = `${javascript.name}@${javascript.version}`;\n }\n\n metadata.scripts.check = [\n 'format:check',\n 'lint',\n 'typecheck',\n 'test',\n 'test:dev',\n 'build',\n ]\n .map(run)\n .join(' && ');\n metadata.scripts.deploy = `${run('build')} && wrangler deploy`;\n metadata.scripts.dev = `node scripts/dev.mjs \"${run('dev:web')}\" \"${run('agent:dev')}\"`;\n\n if (\n javascript.name === 'npm' &&\n npmRequiresScriptAllowlist(javascript.version)\n ) {\n metadata.allowScripts = {\n 'core-js': true,\n esbuild: true,\n workerd: true,\n };\n delete metadata.trustedDependencies;\n } else if (javascript.name === 'bun') {\n metadata.trustedDependencies = ['core-js', 'esbuild', 'workerd'];\n delete metadata.allowScripts;\n } else {\n delete metadata.allowScripts;\n delete metadata.trustedDependencies;\n }\n\n await writeFile(packagePath, `${JSON.stringify(metadata, undefined, 2)}\\n`);\n\n if (javascript.name === 'npm') {\n const packageLockPath = join(targetDirectory, 'package-lock.json');\n const packageLock = JSON.parse(\n await readFile(packageLockPath, 'utf8'),\n ) as PackageLockMetadata;\n packageLock.name = metadata.name;\n if (packageLock.packages?.[''] !== undefined) {\n packageLock.packages[''].name = metadata.name;\n }\n await writeFile(\n packageLockPath,\n `${JSON.stringify(packageLock, undefined, 2)}\\n`,\n );\n }\n\n const replacements = createReplacements(packageManagers, platform);\n // Generate once per project so registration and dispatch always agree.\n const agentReplacements = new Map([\n ['spatius-agent', `spatius-agent-${randomUUID()}`],\n ]);\n await Promise.all(\n [\n '.dev.vars.example',\n 'wrangler.jsonc',\n 'agent/src/agent.py',\n 'agent/README.md',\n 'worker/index.test.ts',\n ].map(async (relativePath) =>\n renderFile(join(targetDirectory, relativePath), agentReplacements),\n ),\n );\n await Promise.all(\n ['README.md', 'AGENTS.md', 'agent/README.md'].map(async (relativePath) =>\n renderFile(join(targetDirectory, relativePath), replacements),\n ),\n );\n}\n","import { posix, win32 } from 'node:path';\n\nimport type { InstallStep } from '../../install.js';\nimport {\n javascriptInstallCommand,\n pythonInstallCommands,\n type CommandSpec,\n type SelectedPackageManagers,\n} from '../../package-managers.js';\n\nfunction commandStep(\n command: CommandSpec,\n args: string[],\n cwd: string,\n displayCommand: string,\n label: string,\n): InstallStep {\n return {\n args: [...command.argsPrefix, ...args],\n command: command.command,\n cwd,\n displayCommand,\n label,\n };\n}\n\nexport function createInstallPlan(\n targetDirectory: string,\n packageManagers: SelectedPackageManagers,\n platform: NodeJS.Platform = process.platform,\n): InstallStep[] {\n const path = platform === 'win32' ? win32 : posix;\n const javascript = packageManagers.javascript;\n const python = packageManagers.python;\n const steps = [\n commandStep(\n javascript.command,\n ['install'],\n targetDirectory,\n javascriptInstallCommand(javascript.name),\n `Installing JavaScript dependencies with ${javascript.name}`,\n ),\n ];\n\n if (python.name === 'uv') {\n steps.push(\n commandStep(\n python.command,\n ['sync', '--directory', 'agent', '--extra', 'dev'],\n targetDirectory,\n pythonInstallCommands(python, platform)[0]!,\n 'Installing Python dependencies with uv',\n ),\n );\n return steps;\n }\n\n const runtime = python.pythonRuntime;\n if (runtime === undefined) {\n throw new Error('pip was selected without a Python runtime.');\n }\n\n const displayedCommands = pythonInstallCommands(python, platform);\n steps.push(\n commandStep(\n runtime,\n ['-m', 'venv', 'agent/.venv'],\n targetDirectory,\n displayedCommands[0]!,\n 'Creating the Python virtual environment',\n ),\n );\n\n const virtualEnvironmentPython =\n platform === 'win32'\n ? path.join(targetDirectory, 'agent', '.venv', 'Scripts', 'python.exe')\n : path.join(targetDirectory, 'agent', '.venv', 'bin', 'python');\n steps.push({\n args: ['-m', 'pip', 'install', '-e', '.[dev]'],\n command: virtualEnvironmentPython,\n cwd: path.join(targetDirectory, 'agent'),\n displayCommand: displayedCommands[1]!,\n label: 'Installing Python dependencies with pip',\n });\n\n return steps;\n}\n","import { constants } from 'node:fs';\nimport { copyFile, lstat, mkdir, readdir, rm } from 'node:fs/promises';\nimport { basename, dirname, isAbsolute, join, win32 } from 'node:path';\n\nimport { CliError, EXIT_CODES } from './errors.js';\nimport {\n assertTargetDirectoryAvailable,\n normalizeTargetDirectory,\n type TargetState,\n} from './project-directory.js';\nimport {\n getTemplate,\n resolveTemplateDirectory,\n type TemplateConfiguration,\n type TemplateDefinition,\n} from './templates.js';\n\nexport type CopyEntry = (source: string, destination: string) => Promise<void>;\n\ninterface ScaffoldProjectOptions {\n configuration?: TemplateConfiguration;\n copyEntry?: CopyEntry;\n targetDirectory: string;\n template?: TemplateDefinition;\n /** Explicit source override for isolated fixtures. */\n templateDirectory?: string;\n}\n\ninterface PlannedFile {\n destination: string;\n source: string;\n}\n\ninterface ScaffoldPlan {\n entries: PlannedFile[];\n files: string[];\n targetDirectory: string;\n targetState: TargetState;\n templateDirectory: string;\n}\n\nexport interface ScaffoldResult {\n files: string[];\n targetDirectory: string;\n}\n\nconst defaultCopyEntry: CopyEntry = async (source, destination) => {\n await copyFile(source, destination, constants.COPYFILE_EXCL);\n};\n\nconst ignoredTemplateEntries = new Set([\n '.DS_Store',\n '.npmignore',\n '.pytest_cache',\n '.ruff_cache',\n '.venv',\n '.wrangler',\n '__pycache__',\n 'coverage',\n 'dist',\n 'node_modules',\n 'test-results',\n 'playwright-report',\n]);\n\nfunction shouldIgnoreTemplateEntry(entry: string): boolean {\n return (\n ignoredTemplateEntries.has(entry) ||\n /\\.py[cod]$/u.test(entry) ||\n (/^\\.(?:env|dev\\.vars)(?:\\.|$)/u.test(entry) && !entry.endsWith('.example'))\n );\n}\n\nfunction assertRelativeDestination(path: string): void {\n if (\n isAbsolute(path) ||\n win32.isAbsolute(path) ||\n path.includes('\\\\') ||\n path.includes(':') ||\n path.includes('\\0') ||\n path.split('/').some((segment) => ['', '.', '..'].includes(segment))\n ) {\n throw new Error('Template file mappings must stay inside the project.');\n }\n}\n\nasync function listTemplateFiles(\n templateDirectory: string,\n template: TemplateDefinition,\n configuration: TemplateConfiguration | undefined,\n relativeDirectory = '',\n): Promise<PlannedFile[]> {\n const entries = await readdir(join(templateDirectory, relativeDirectory), {\n withFileTypes: true,\n });\n const files: PlannedFile[] = [];\n for (const entry of entries) {\n if (shouldIgnoreTemplateEntry(entry.name)) continue;\n const source = [relativeDirectory, entry.name].filter(Boolean).join('/');\n if (!template.includeFile(source, configuration)) continue;\n if (entry.isSymbolicLink()) {\n throw new Error('Bundled templates must not contain symbolic links.');\n }\n if (entry.isDirectory()) {\n files.push(\n ...(await listTemplateFiles(\n templateDirectory,\n template,\n configuration,\n source,\n )),\n );\n } else if (entry.isFile()) {\n const destination = template.mapFile(source);\n assertRelativeDestination(destination);\n files.push({ source, destination });\n } else {\n throw new Error('Bundled templates must contain regular files.');\n }\n }\n return files;\n}\n\nexport async function createScaffoldPlan({\n configuration,\n targetDirectory: targetDirectoryInput,\n template = getTemplate(),\n templateDirectory = resolveTemplateDirectory(template),\n}: ScaffoldProjectOptions): Promise<ScaffoldPlan> {\n const targetDirectory = normalizeTargetDirectory(targetDirectoryInput);\n const targetState = await assertTargetDirectoryAvailable(targetDirectory);\n\n let entries: PlannedFile[];\n try {\n const root = await lstat(templateDirectory);\n if (!root.isDirectory() || root.isSymbolicLink()) {\n throw new Error('The template must be a regular directory.');\n }\n entries = await listTemplateFiles(\n templateDirectory,\n template,\n configuration,\n );\n const destinations = new Set<string>();\n const directories = new Map<string, string>();\n for (const { destination } of entries) {\n // Reject mappings that would collide on case-insensitive filesystems too.\n const key = destination.toLowerCase();\n if (destinations.has(key) || directories.has(key)) {\n throw new Error('Template file mappings collide.');\n }\n destinations.add(key);\n const segments = destination.split('/');\n for (let index = 1; index < segments.length; index++) {\n const parent = segments.slice(0, index).join('/');\n const parentKey = parent.toLowerCase();\n if (destinations.has(parentKey))\n throw new Error('Template file mappings collide.');\n const existingParent = directories.get(parentKey);\n if (existingParent !== undefined && existingParent !== parent) {\n throw new Error(\n 'Template directory mappings use inconsistent casing.',\n );\n }\n directories.set(parentKey, parent);\n }\n }\n } catch (error) {\n throw new CliError(\n 'TEMPLATE_NOT_FOUND',\n 'The bundled project template could not be loaded at ' +\n templateDirectory +\n ': ' +\n (error instanceof Error ? error.message : 'unknown filesystem error'),\n {\n exitCode: EXIT_CODES.filesystem,\n path: templateDirectory,\n recovery: 'Reinstall create-spatius-app and try again.',\n },\n );\n }\n\n if (entries.length === 0) {\n throw new CliError(\n 'TEMPLATE_NOT_FOUND',\n 'The bundled project template is empty.',\n {\n exitCode: EXIT_CODES.filesystem,\n path: templateDirectory,\n recovery: 'Reinstall create-spatius-app and try again.',\n },\n );\n }\n\n entries.sort((left, right) =>\n left.destination < right.destination\n ? -1\n : left.destination > right.destination\n ? 1\n : 0,\n );\n return {\n entries,\n files: entries.map((entry) => entry.destination),\n targetDirectory,\n targetState,\n templateDirectory,\n };\n}\n\nasync function rollback(\n targetDirectory: string,\n targetCreated: boolean,\n createdPaths: readonly string[],\n): Promise<void> {\n if (targetCreated) {\n await rm(targetDirectory, { force: true, recursive: true });\n return;\n }\n for (const path of [...createdPaths].reverse()) {\n await rm(path, { force: true, recursive: true });\n }\n}\n\nexport async function scaffoldProject({\n configuration,\n copyEntry = defaultCopyEntry,\n targetDirectory: targetDirectoryInput,\n template = getTemplate(),\n templateDirectory = resolveTemplateDirectory(template),\n}: ScaffoldProjectOptions): Promise<ScaffoldResult> {\n const plan = await createScaffoldPlan({\n configuration,\n targetDirectory: targetDirectoryInput,\n template,\n templateDirectory,\n });\n const { targetDirectory } = plan;\n const createdPaths: string[] = [];\n const createdDirectories = new Set([targetDirectory]);\n let targetCreated = false;\n\n async function createParent(directory: string): Promise<void> {\n if (createdDirectories.has(directory)) return;\n await createParent(dirname(directory));\n await mkdir(directory);\n createdPaths.push(directory);\n createdDirectories.add(directory);\n }\n\n try {\n // Recheck after planning so a destination populated during a slow read\n // is never treated as the originally empty directory.\n const targetState = await assertTargetDirectoryAvailable(targetDirectory);\n if (targetState === 'missing') {\n await mkdir(dirname(targetDirectory), { recursive: true });\n await mkdir(targetDirectory);\n targetCreated = true;\n }\n\n for (const entry of plan.entries) {\n const source = join(templateDirectory, entry.source);\n const destination = join(targetDirectory, entry.destination);\n const stats = await lstat(source);\n if (!stats.isFile() || stats.isSymbolicLink()) {\n throw new Error('A template source is no longer a regular file.');\n }\n await createParent(dirname(destination));\n createdPaths.push(destination);\n await copyEntry(source, destination);\n }\n if (configuration !== undefined) {\n await template.configure(targetDirectory, configuration);\n }\n } catch (error) {\n await rollback(targetDirectory, targetCreated, createdPaths).catch(\n () => undefined,\n );\n throw new CliError(\n 'FILESYSTEM_ERROR',\n 'Could not create ' +\n basename(targetDirectory) +\n ': ' +\n (error instanceof Error ? error.message : 'unknown filesystem error'),\n {\n exitCode: EXIT_CODES.filesystem,\n path: targetDirectory,\n recovery: 'Check filesystem permissions and try again.',\n },\n );\n }\n return { files: plan.files, targetDirectory };\n}\n","import { homedir } from 'node:os';\nimport { lstat, readdir } from 'node:fs/promises';\nimport { parse, resolve } from 'node:path';\n\nimport { CliError, EXIT_CODES } from './errors.js';\n\nexport type TargetState =\n 'empty-directory' | 'missing' | 'not-a-directory' | 'non-empty-directory';\n\nexport function normalizeTargetDirectory(\n input: string,\n currentWorkingDirectory = process.cwd(),\n): string {\n return resolve(currentWorkingDirectory, input);\n}\n\nexport function assertSafeTargetDirectory(\n targetDirectory: string,\n homeDirectory = homedir(),\n): void {\n const normalizedTarget = resolve(targetDirectory);\n\n if (normalizedTarget === parse(normalizedTarget).root) {\n throw new CliError(\n 'UNSAFE_TARGET',\n 'Refusing to create a project at the filesystem root.',\n {\n exitCode: EXIT_CODES.invalidArgument,\n path: normalizedTarget,\n recovery: 'Choose a dedicated project directory.',\n },\n );\n }\n\n if (normalizedTarget === resolve(homeDirectory)) {\n throw new CliError(\n 'UNSAFE_TARGET',\n 'Refusing to create a project directly in the home directory.',\n {\n exitCode: EXIT_CODES.invalidArgument,\n path: normalizedTarget,\n recovery:\n 'Choose a dedicated project directory inside your home directory.',\n },\n );\n }\n}\n\nexport async function inspectTargetDirectory(\n targetDirectory: string,\n): Promise<TargetState> {\n try {\n const stats = await lstat(targetDirectory);\n\n if (!stats.isDirectory() || stats.isSymbolicLink()) {\n return 'not-a-directory';\n }\n\n const entries = await readdir(targetDirectory);\n return entries.length === 0 ? 'empty-directory' : 'non-empty-directory';\n } catch (error) {\n if (isNodeError(error) && error.code === 'ENOENT') {\n return 'missing';\n }\n\n throw error;\n }\n}\n\nexport async function assertTargetDirectoryAvailable(\n targetDirectory: string,\n): Promise<TargetState> {\n assertSafeTargetDirectory(targetDirectory);\n\n const state = await inspectTargetDirectory(targetDirectory);\n\n if (state === 'not-a-directory') {\n throw new CliError(\n 'TARGET_NOT_DIRECTORY',\n `The target path is not a directory: ${targetDirectory}`,\n {\n exitCode: EXIT_CODES.targetConflict,\n path: targetDirectory,\n recovery: 'Choose a path that is missing or is an empty directory.',\n },\n );\n }\n\n if (state === 'non-empty-directory') {\n throw new CliError(\n 'TARGET_NOT_EMPTY',\n `The target directory is not empty: ${targetDirectory}\\nChoose a new directory or remove its contents first.`,\n {\n exitCode: EXIT_CODES.targetConflict,\n path: targetDirectory,\n recovery: 'Choose an empty directory or remove its contents first.',\n },\n );\n }\n\n return state;\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && 'code' in error;\n}\n"],"mappings":"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","names":["lstat","readFile","writeFile","randomUUID","join","spawn","chmod","readFile","rm","writeFile","join","tmpdir","execFile","key","index","app","avatar","basename","voice","join","runCredentialSetup","lstat","readdir","rm","basename","join","win32","lstat","win32","readdir","join","lstat","rm","basename"]}