@korajs/cli 0.5.0 → 1.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/bin.cjs +2656 -207
- package/dist/bin.cjs.map +1 -1
- package/dist/bin.js +152 -96
- package/dist/bin.js.map +1 -1
- package/dist/chunk-5NI2FEQL.js +92 -0
- package/dist/chunk-5NI2FEQL.js.map +1 -0
- package/dist/chunk-6C4BHSRA.js +82 -0
- package/dist/chunk-6C4BHSRA.js.map +1 -0
- package/dist/{chunk-3WNFM3QB.js → chunk-B5YS4STN.js} +78 -99
- package/dist/chunk-B5YS4STN.js.map +1 -0
- package/dist/{chunk-PSRM56B7.js → chunk-BWTKRKNJ.js} +60 -7
- package/dist/chunk-BWTKRKNJ.js.map +1 -0
- package/dist/{chunk-SOTZIWIF.js → chunk-EOWLAAIV.js} +5 -3
- package/dist/{chunk-SOTZIWIF.js.map → chunk-EOWLAAIV.js.map} +1 -1
- package/dist/create.cjs +82 -7
- package/dist/create.cjs.map +1 -1
- package/dist/create.js +3 -2
- package/dist/create.js.map +1 -1
- package/dist/index.cjs +65 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -2
- package/dist/lab-manager-KUDII6BT.js +280 -0
- package/dist/lab-manager-KUDII6BT.js.map +1 -0
- package/dist/schema-loader-GGHECMTM.js +9 -0
- package/dist/schema-loader-GGHECMTM.js.map +1 -0
- package/dist/spectator-manager-E2LH2P54.js +142 -0
- package/dist/spectator-manager-E2LH2P54.js.map +1 -0
- package/dist/studio-server-NIFKZI4F.js +1738 -0
- package/dist/studio-server-NIFKZI4F.js.map +1 -0
- package/package.json +8 -6
- package/templates/react-basic/AGENTS.md +87 -0
- package/templates/react-sync/AGENTS.md +87 -0
- package/templates/react-sync/src/App.tsx +8 -0
- package/templates/react-sync/src/index.css +11 -0
- package/templates/react-tailwind/AGENTS.md +87 -0
- package/templates/react-tailwind-sync/AGENTS.md +87 -0
- package/templates/react-tailwind-sync/src/App.tsx +28 -0
- package/templates/svelte-basic/.env.example +3 -0
- package/templates/svelte-basic/AGENTS.md +76 -0
- package/templates/svelte-basic/README.md.hbs +62 -0
- package/templates/svelte-basic/index.html.hbs +12 -0
- package/templates/svelte-basic/kora.config.ts +12 -0
- package/templates/svelte-basic/package.json.hbs +27 -0
- package/templates/svelte-basic/src/App.svelte +127 -0
- package/templates/svelte-basic/src/Root.svelte +14 -0
- package/templates/svelte-basic/src/index.css +287 -0
- package/templates/svelte-basic/src/kora-worker.ts +9 -0
- package/templates/svelte-basic/src/main.ts +16 -0
- package/templates/svelte-basic/src/modules/todos/todo.mutations.ts +25 -0
- package/templates/svelte-basic/src/modules/todos/todo.queries.ts +5 -0
- package/templates/svelte-basic/src/modules/todos/todo.schema.ts +10 -0
- package/templates/svelte-basic/src/modules/todos/useTodos.ts +25 -0
- package/templates/svelte-basic/src/schema.ts +9 -0
- package/templates/svelte-basic/src/vite-env.d.ts +12 -0
- package/templates/svelte-basic/svelte.config.js +5 -0
- package/templates/svelte-basic/tsconfig.json.hbs +14 -0
- package/templates/svelte-basic/vite.config.ts +52 -0
- package/templates/svelte-sync/.env.example +25 -0
- package/templates/svelte-sync/AGENTS.md +76 -0
- package/templates/svelte-sync/README.md.hbs +105 -0
- package/templates/svelte-sync/index.html.hbs +12 -0
- package/templates/svelte-sync/kora.config.ts +17 -0
- package/templates/svelte-sync/package.json.hbs +43 -0
- package/templates/svelte-sync/server.ts +90 -0
- package/templates/svelte-sync/src/App.svelte +150 -0
- package/templates/svelte-sync/src/Root.svelte +22 -0
- package/templates/svelte-sync/src/auth.ts +25 -0
- package/templates/svelte-sync/src/index.css +339 -0
- package/templates/svelte-sync/src/kora-worker.ts +9 -0
- package/templates/svelte-sync/src/main.ts +32 -0
- package/templates/svelte-sync/src/modules/todos/todo.mutations.ts +25 -0
- package/templates/svelte-sync/src/modules/todos/todo.queries.ts +5 -0
- package/templates/svelte-sync/src/modules/todos/todo.schema.ts +10 -0
- package/templates/svelte-sync/src/modules/todos/useTodos.ts +25 -0
- package/templates/svelte-sync/src/schema.ts +9 -0
- package/templates/svelte-sync/src/vite-env.d.ts +21 -0
- package/templates/svelte-sync/svelte.config.js +5 -0
- package/templates/svelte-sync/tsconfig.json.hbs +14 -0
- package/templates/svelte-sync/vite.config.ts +79 -0
- package/templates/svelte-tailwind/AGENTS.md +76 -0
- package/templates/svelte-tailwind/README.md.hbs +62 -0
- package/templates/svelte-tailwind/index.html.hbs +12 -0
- package/templates/svelte-tailwind/kora.config.ts +12 -0
- package/templates/svelte-tailwind/package.json.hbs +30 -0
- package/templates/svelte-tailwind/src/App.svelte +75 -0
- package/templates/svelte-tailwind/src/Root.svelte +14 -0
- package/templates/svelte-tailwind/src/index.css +7 -0
- package/templates/svelte-tailwind/src/kora-worker.ts +9 -0
- package/templates/svelte-tailwind/src/main.ts +16 -0
- package/templates/svelte-tailwind/src/modules/todos/todo.mutations.ts +25 -0
- package/templates/svelte-tailwind/src/modules/todos/todo.queries.ts +5 -0
- package/templates/svelte-tailwind/src/modules/todos/todo.schema.ts +10 -0
- package/templates/svelte-tailwind/src/modules/todos/useTodos.ts +25 -0
- package/templates/svelte-tailwind/src/schema.ts +9 -0
- package/templates/svelte-tailwind/src/vite-env.d.ts +12 -0
- package/templates/svelte-tailwind/svelte.config.js +5 -0
- package/templates/svelte-tailwind/tsconfig.json.hbs +14 -0
- package/templates/svelte-tailwind/vite.config.ts +53 -0
- package/templates/svelte-tailwind-sync/.env.example +25 -0
- package/templates/svelte-tailwind-sync/AGENTS.md +76 -0
- package/templates/svelte-tailwind-sync/README.md.hbs +105 -0
- package/templates/svelte-tailwind-sync/index.html.hbs +12 -0
- package/templates/svelte-tailwind-sync/kora.config.ts +17 -0
- package/templates/svelte-tailwind-sync/package.json.hbs +46 -0
- package/templates/svelte-tailwind-sync/server.ts +90 -0
- package/templates/svelte-tailwind-sync/src/App.svelte +192 -0
- package/templates/svelte-tailwind-sync/src/Root.svelte +26 -0
- package/templates/svelte-tailwind-sync/src/auth.ts +25 -0
- package/templates/svelte-tailwind-sync/src/index.css +7 -0
- package/templates/svelte-tailwind-sync/src/kora-worker.ts +9 -0
- package/templates/svelte-tailwind-sync/src/main.ts +32 -0
- package/templates/svelte-tailwind-sync/src/modules/todos/todo.mutations.ts +25 -0
- package/templates/svelte-tailwind-sync/src/modules/todos/todo.queries.ts +5 -0
- package/templates/svelte-tailwind-sync/src/modules/todos/todo.schema.ts +10 -0
- package/templates/svelte-tailwind-sync/src/modules/todos/useTodos.ts +25 -0
- package/templates/svelte-tailwind-sync/src/schema.ts +9 -0
- package/templates/svelte-tailwind-sync/src/vite-env.d.ts +21 -0
- package/templates/svelte-tailwind-sync/svelte.config.js +5 -0
- package/templates/svelte-tailwind-sync/tsconfig.json.hbs +14 -0
- package/templates/svelte-tailwind-sync/vite.config.ts +80 -0
- package/templates/tauri-react/AGENTS.md +91 -0
- package/templates/vue-basic/AGENTS.md +84 -0
- package/templates/vue-basic/README.md.hbs +62 -0
- package/templates/vue-basic/index.html.hbs +12 -0
- package/templates/vue-basic/kora.config.ts +12 -0
- package/templates/vue-basic/package.json.hbs +26 -0
- package/templates/vue-basic/src/App.vue +117 -0
- package/templates/vue-basic/src/index.css +287 -0
- package/templates/vue-basic/src/kora-worker.ts +9 -0
- package/templates/vue-basic/src/main.ts +20 -0
- package/templates/vue-basic/src/modules/todos/todo.mutations.ts +25 -0
- package/templates/vue-basic/src/modules/todos/todo.queries.ts +5 -0
- package/templates/vue-basic/src/modules/todos/todo.schema.ts +10 -0
- package/templates/vue-basic/src/modules/todos/useTodos.ts +32 -0
- package/templates/vue-basic/src/schema.ts +9 -0
- package/templates/vue-basic/src/vite-env.d.ts +17 -0
- package/templates/vue-basic/tsconfig.json.hbs +15 -0
- package/templates/vue-basic/vite.config.ts +69 -0
- package/templates/vue-sync/.env.example +25 -0
- package/templates/vue-sync/AGENTS.md +84 -0
- package/templates/vue-sync/README.md.hbs +105 -0
- package/templates/vue-sync/index.html.hbs +12 -0
- package/templates/vue-sync/kora.config.ts +17 -0
- package/templates/vue-sync/package.json.hbs +42 -0
- package/templates/vue-sync/server.ts +90 -0
- package/templates/vue-sync/src/App.vue +135 -0
- package/templates/vue-sync/src/auth.ts +25 -0
- package/templates/vue-sync/src/index.css +339 -0
- package/templates/vue-sync/src/kora-worker.ts +9 -0
- package/templates/vue-sync/src/main.ts +47 -0
- package/templates/vue-sync/src/modules/todos/todo.mutations.ts +25 -0
- package/templates/vue-sync/src/modules/todos/todo.queries.ts +5 -0
- package/templates/vue-sync/src/modules/todos/todo.schema.ts +10 -0
- package/templates/vue-sync/src/modules/todos/useTodos.ts +32 -0
- package/templates/vue-sync/src/schema.ts +9 -0
- package/templates/vue-sync/src/vite-env.d.ts +26 -0
- package/templates/vue-sync/tsconfig.json.hbs +15 -0
- package/templates/vue-sync/vite.config.ts +79 -0
- package/templates/vue-tailwind/AGENTS.md +84 -0
- package/templates/vue-tailwind/README.md.hbs +62 -0
- package/templates/vue-tailwind/index.html.hbs +12 -0
- package/templates/vue-tailwind/kora.config.ts +12 -0
- package/templates/vue-tailwind/package.json.hbs +29 -0
- package/templates/vue-tailwind/src/App.vue +135 -0
- package/templates/vue-tailwind/src/index.css +7 -0
- package/templates/vue-tailwind/src/kora-worker.ts +9 -0
- package/templates/vue-tailwind/src/main.ts +31 -0
- package/templates/vue-tailwind/src/modules/todos/todo.mutations.ts +25 -0
- package/templates/vue-tailwind/src/modules/todos/todo.queries.ts +5 -0
- package/templates/vue-tailwind/src/modules/todos/todo.schema.ts +10 -0
- package/templates/vue-tailwind/src/modules/todos/useTodos.ts +32 -0
- package/templates/vue-tailwind/src/schema.ts +9 -0
- package/templates/vue-tailwind/src/vite-env.d.ts +17 -0
- package/templates/vue-tailwind/tsconfig.json.hbs +15 -0
- package/templates/vue-tailwind/vite.config.ts +70 -0
- package/templates/vue-tailwind-sync/.env.example +25 -0
- package/templates/vue-tailwind-sync/AGENTS.md +84 -0
- package/templates/vue-tailwind-sync/README.md.hbs +105 -0
- package/templates/vue-tailwind-sync/index.html.hbs +12 -0
- package/templates/vue-tailwind-sync/kora.config.ts +17 -0
- package/templates/vue-tailwind-sync/package.json.hbs +45 -0
- package/templates/vue-tailwind-sync/server.ts +90 -0
- package/templates/vue-tailwind-sync/src/App.vue +245 -0
- package/templates/vue-tailwind-sync/src/auth.ts +25 -0
- package/templates/vue-tailwind-sync/src/index.css +7 -0
- package/templates/vue-tailwind-sync/src/kora-worker.ts +9 -0
- package/templates/vue-tailwind-sync/src/main.ts +56 -0
- package/templates/vue-tailwind-sync/src/modules/todos/todo.mutations.ts +25 -0
- package/templates/vue-tailwind-sync/src/modules/todos/todo.queries.ts +5 -0
- package/templates/vue-tailwind-sync/src/modules/todos/todo.schema.ts +10 -0
- package/templates/vue-tailwind-sync/src/modules/todos/useTodos.ts +32 -0
- package/templates/vue-tailwind-sync/src/schema.ts +9 -0
- package/templates/vue-tailwind-sync/src/vite-env.d.ts +26 -0
- package/templates/vue-tailwind-sync/tsconfig.json.hbs +15 -0
- package/templates/vue-tailwind-sync/vite.config.ts +80 -0
- package/dist/chunk-3WNFM3QB.js.map +0 -1
- package/dist/chunk-PSRM56B7.js.map +0 -1
package/dist/bin.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/bin.ts","../src/commands/backup/backup-command.ts","../src/utils/logger.ts","../src/commands/compact/compact-command.ts","../src/errors.ts","../src/utils/fs-helpers.ts","../src/commands/dev/kora-config.ts","../src/commands/migrate/schema-loader.ts","../src/commands/create/create-command.ts","../src/prompts/preferences.ts","../src/prompts/prompt-client.ts","../src/utils/prompt.ts","../src/types.ts","../src/utils/package-manager.ts","../src/commands/create/environment-detection.ts","../src/commands/create/options.ts","../src/commands/create/preferences-flow.ts","../src/commands/create/project-name.ts","../src/commands/create/sync-provider-preset.ts","../src/templates/composer.ts","../src/commands/create/template-engine.ts","../src/commands/deploy/deploy-command.ts","../src/commands/deploy/adapters/adapter.ts","../src/commands/deploy/adapters/aws-ecs-adapter.ts","../src/commands/deploy/builder/client-builder.ts","../src/commands/deploy/builder/server-bundler.ts","../src/commands/deploy/adapters/aws-lightsail-adapter.ts","../src/commands/deploy/adapters/fly-adapter.ts","../src/commands/deploy/artifacts/fly-toml-generator.ts","../src/commands/deploy/adapters/railway-adapter.ts","../src/commands/deploy/artifacts/railway-json-generator.ts","../src/commands/deploy/adapters/stub-adapter.ts","../src/commands/deploy/adapters/factory.ts","../src/commands/deploy/artifacts/dockerfile-generator.ts","../src/commands/deploy/state/deploy-state.ts","../src/commands/dev/dev-command.ts","../src/commands/dev/process-manager.ts","../src/commands/dev/schema-watcher.ts","../src/commands/doctor/doctor-command.ts","../src/commands/doctor/doctor-checks.ts","../src/commands/generate/generate-command.ts","../src/commands/generate/hook-generator.ts","../src/commands/generate/type-generator.ts","../src/commands/logs/logs-command.ts","../src/commands/migrate/migrate-command.ts","../src/commands/migrate/migration-generator.ts","../src/commands/migrate/schema-differ.ts","../src/commands/migrate/migration-runner.ts","../src/commands/migrate/operation-transform-generator.ts","../src/commands/status/status-command.ts"],"sourcesContent":["import { defineCommand, runMain } from 'citty'\nimport { backupCommand } from './commands/backup/backup-command'\nimport { compactCommand } from './commands/compact/compact-command'\nimport { createCommand } from './commands/create/create-command'\nimport { deployCommand } from './commands/deploy/deploy-command'\nimport { devCommand } from './commands/dev/dev-command'\nimport { doctorCommand } from './commands/doctor/doctor-command'\nimport { generateCommand } from './commands/generate/generate-command'\nimport { logsCommand } from './commands/logs/logs-command'\nimport { migrateCommand } from './commands/migrate/migrate-command'\nimport { statusCommand } from './commands/status/status-command'\n\nconst main = defineCommand({\n\tmeta: {\n\t\tname: 'kora',\n\t\tdescription: 'Kora.js — Offline-first application framework',\n\t},\n\tsubCommands: {\n\t\tbackup: backupCommand,\n\t\tcompact: compactCommand,\n\t\tcreate: createCommand,\n\t\tdev: devCommand,\n\t\tdoctor: doctorCommand,\n\t\tdeploy: deployCommand,\n\t\tgenerate: generateCommand,\n\t\tlogs: logsCommand,\n\t\tmigrate: migrateCommand,\n\t\tstatus: statusCommand,\n\t},\n})\n\nrunMain(main)\n","import { readFile, writeFile } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport { defineCommand } from 'citty'\nimport { createLogger } from '../../utils/logger'\n\nconst DEFAULT_SYNC_PORT = 3001\n\n/**\n * The `backup` command — creates and restores Kora sync server backups.\n */\nexport const backupCommand = defineCommand({\n\tmeta: {\n\t\tname: 'backup',\n\t\tdescription: 'Backup and restore Kora sync server data',\n\t},\n\tsubCommands: {\n\t\tcreate: defineCommand({\n\t\t\tmeta: {\n\t\t\t\tname: 'create',\n\t\t\t\tdescription: 'Create a backup of the sync server',\n\t\t\t},\n\t\t\targs: {\n\t\t\t\turl: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Sync server URL (default: http://localhost:3001)',\n\t\t\t\t\tdefault: `http://localhost:${DEFAULT_SYNC_PORT}`,\n\t\t\t\t},\n\t\t\t\tout: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Output file path (default: kora-backup-<timestamp>.kora)',\n\t\t\t\t},\n\t\t\t\ttoken: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Backup token (defaults to KORA_BACKUP_TOKEN or KORA_ADMIN_TOKEN)',\n\t\t\t\t},\n\t\t\t},\n\t\t\tasync run({ args }) {\n\t\t\t\tconst logger = createLogger()\n\t\t\t\tconst url =\n\t\t\t\t\ttypeof args.url === 'string' ? args.url : `http://localhost:${DEFAULT_SYNC_PORT}`\n\t\t\t\tconst outFile = typeof args.out === 'string' ? args.out : `kora-backup-${Date.now()}.kora`\n\t\t\t\tconst token =\n\t\t\t\t\ttypeof args.token === 'string'\n\t\t\t\t\t\t? args.token\n\t\t\t\t\t\t: (process.env.KORA_BACKUP_TOKEN ?? process.env.KORA_ADMIN_TOKEN)\n\n\t\t\t\tlogger.banner()\n\t\t\t\tlogger.info(`Exporting backup from ${url}...`)\n\n\t\t\t\ttry {\n\t\t\t\t\tconst backupUrl = `${url.replace(/\\/$/, '')}/__kora/backup/export`\n\t\t\t\t\tconst response = await fetch(backupUrl, {\n\t\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\t\theaders: token ? { Authorization: `Bearer ${token}` } : undefined,\n\t\t\t\t\t})\n\n\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\tconst error = await response.json().catch(() => ({ message: response.statusText }))\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Backup failed: ${(error as { message: string }).message ?? response.statusText}`,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\n\t\t\t\t\tconst buffer = await response.arrayBuffer()\n\t\t\t\t\tawait writeFile(outFile, new Uint8Array(buffer))\n\n\t\t\t\t\tconst size = (buffer.byteLength / 1024).toFixed(1)\n\t\t\t\t\tlogger.success(`Backup saved to ${outFile} (${size} KB)`)\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger.error('Backup failed')\n\t\t\t\t\tif (error instanceof Error) logger.error(error.message)\n\t\t\t\t\tlogger.blank()\n\t\t\t\t\tlogger.step('Make sure the Kora sync server is running.')\n\t\t\t\t\tprocess.exit(1)\n\t\t\t\t}\n\t\t\t},\n\t\t}),\n\n\t\trestore: defineCommand({\n\t\t\tmeta: {\n\t\t\t\tname: 'restore',\n\t\t\t\tdescription: 'Restore a backup to the sync server',\n\t\t\t},\n\t\t\targs: {\n\t\t\t\tfile: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Backup file path',\n\t\t\t\t\trequired: true,\n\t\t\t\t},\n\t\t\t\turl: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Sync server URL (default: http://localhost:3001)',\n\t\t\t\t\tdefault: `http://localhost:${DEFAULT_SYNC_PORT}`,\n\t\t\t\t},\n\t\t\t\tmerge: {\n\t\t\t\t\ttype: 'boolean',\n\t\t\t\t\tdescription: 'Merge with existing data instead of replacing',\n\t\t\t\t\tdefault: false,\n\t\t\t\t},\n\t\t\t\ttoken: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Backup token (defaults to KORA_BACKUP_TOKEN or KORA_ADMIN_TOKEN)',\n\t\t\t\t},\n\t\t\t},\n\t\t\tasync run({ args }) {\n\t\t\t\tconst logger = createLogger()\n\t\t\t\tconst filePath = typeof args.file === 'string' ? args.file : ''\n\t\t\t\tconst url =\n\t\t\t\t\ttypeof args.url === 'string' ? args.url : `http://localhost:${DEFAULT_SYNC_PORT}`\n\t\t\t\tconst merge = args.merge === true\n\t\t\t\tconst token =\n\t\t\t\t\ttypeof args.token === 'string'\n\t\t\t\t\t\t? args.token\n\t\t\t\t\t\t: (process.env.KORA_BACKUP_TOKEN ?? process.env.KORA_ADMIN_TOKEN)\n\n\t\t\t\tlogger.banner()\n\t\t\t\tlogger.info(`Restoring backup from ${filePath} to ${url}...`)\n\n\t\t\t\ttry {\n\t\t\t\t\tconst data = await readFile(filePath)\n\t\t\t\t\tconst restoreUrl = `${url.replace(/\\/$/, '')}/__kora/backup/import?merge=${merge}`\n\n\t\t\t\t\tconst response = await fetch(restoreUrl, {\n\t\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\t\theaders: token ? { Authorization: `Bearer ${token}` } : undefined,\n\t\t\t\t\t\tbody: data,\n\t\t\t\t\t})\n\n\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\tconst error = await response.json().catch(() => ({ message: response.statusText }))\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Restore failed: ${(error as { message: string }).message ?? response.statusText}`,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\n\t\t\t\t\tconst result = (await response.json()) as {\n\t\t\t\t\t\toperationsRestored: number\n\t\t\t\t\t\tsuccess: boolean\n\t\t\t\t\t\tduration?: number\n\t\t\t\t\t}\n\n\t\t\t\t\tif (result.success) {\n\t\t\t\t\t\tlogger.success(\n\t\t\t\t\t\t\t`Restored ${result.operationsRestored} operations${result.duration ? ` in ${result.duration}ms` : ''}`,\n\t\t\t\t\t\t)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger.error('Restore completed with errors')\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger.error('Restore failed')\n\t\t\t\t\tif (error instanceof Error) logger.error(error.message)\n\t\t\t\t\tprocess.exit(1)\n\t\t\t\t}\n\t\t\t},\n\t\t}),\n\n\t\tinfo: defineCommand({\n\t\t\tmeta: {\n\t\t\t\tname: 'info',\n\t\t\t\tdescription: 'Show backup file information',\n\t\t\t},\n\t\t\targs: {\n\t\t\t\tfile: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Backup file path',\n\t\t\t\t\trequired: true,\n\t\t\t\t},\n\t\t\t},\n\t\t\tasync run({ args }) {\n\t\t\t\tconst logger = createLogger()\n\t\t\t\tconst filePath = typeof args.file === 'string' ? args.file : ''\n\n\t\t\t\ttry {\n\t\t\t\t\tconst data = await readFile(filePath)\n\t\t\t\t\tconst { readBackupManifest } = await import('@korajs/store')\n\n\t\t\t\t\tconst manifest = readBackupManifest(\n\t\t\t\t\t\tnew Uint8Array(data.buffer, data.byteOffset, data.byteLength),\n\t\t\t\t\t)\n\n\t\t\t\t\tlogger.banner()\n\t\t\t\t\tlogger.info(`Backup: ${filePath}`)\n\t\t\t\t\tlogger.blank()\n\t\t\t\t\tlogger.step(`Created: ${new Date(manifest.createdAt).toISOString()}`)\n\t\t\t\t\tlogger.step(`Node ID: ${manifest.nodeId}`)\n\t\t\t\t\tlogger.step(`Schema: v${manifest.schemaVersion}`)\n\t\t\t\t\tlogger.step(`Operations: ${manifest.operationCount.toLocaleString()}`)\n\t\t\t\t\tlogger.step(`Collections: ${manifest.collections.join(', ') || '(none)'}`)\n\t\t\t\t\tlogger.step(`Checksum: ${manifest.checksum.slice(0, 16)}...`)\n\t\t\t\t\tlogger.blank()\n\t\t\t\t\tlogger.step(`Format version: ${manifest.version}`)\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger.error('Failed to read backup file')\n\t\t\t\t\tif (error instanceof Error) logger.error(error.message)\n\t\t\t\t\tprocess.exit(1)\n\t\t\t\t}\n\t\t\t},\n\t\t}),\n\t},\n})\n","/** ANSI escape codes for terminal colors */\nconst RESET = '\\x1b[0m'\nconst BOLD = '\\x1b[1m'\nconst DIM = '\\x1b[2m'\nconst GREEN = '\\x1b[32m'\nconst YELLOW = '\\x1b[33m'\nconst RED = '\\x1b[31m'\nconst CYAN = '\\x1b[36m'\n\nexport interface LoggerOptions {\n\t/** Disable ANSI colors */\n\tnoColor?: boolean\n}\n\nexport interface Logger {\n\tinfo(message: string): void\n\tsuccess(message: string): void\n\twarn(message: string): void\n\terror(message: string): void\n\tstep(message: string): void\n\tblank(): void\n\tbanner(): void\n}\n\n/**\n * Creates a logger with optional ANSI color support.\n * Respects the NO_COLOR environment variable and TTY detection.\n */\nexport function createLogger(options?: LoggerOptions): Logger {\n\tconst colorDisabled =\n\t\toptions?.noColor === true || process.env.NO_COLOR !== undefined || !process.stdout.isTTY\n\n\tfunction color(code: string, text: string): string {\n\t\treturn colorDisabled ? text : `${code}${text}${RESET}`\n\t}\n\n\treturn {\n\t\tinfo(message: string): void {\n\t\t\tconsole.log(color(CYAN, message))\n\t\t},\n\t\tsuccess(message: string): void {\n\t\t\tconsole.log(color(GREEN, ` ✓ ${message}`))\n\t\t},\n\t\twarn(message: string): void {\n\t\t\tconsole.warn(color(YELLOW, ` ⚠ ${message}`))\n\t\t},\n\t\terror(message: string): void {\n\t\t\tconsole.error(color(RED, ` ✗ ${message}`))\n\t\t},\n\t\tstep(message: string): void {\n\t\t\tconsole.log(color(DIM, ` ${message}`))\n\t\t},\n\t\tblank(): void {\n\t\t\tconsole.log()\n\t\t},\n\t\tbanner(): void {\n\t\t\tconsole.log()\n\t\t\tconsole.log(\n\t\t\t\tcolor(BOLD + CYAN, ' Kora.js') + color(DIM, ' — Offline-first application framework'),\n\t\t\t)\n\t\t\tconsole.log()\n\t\t},\n\t}\n}\n","import { resolve } from 'node:path'\nimport { defineCommand } from 'citty'\nimport { InvalidProjectError } from '../../errors'\nimport { findProjectRoot } from '../../utils/fs-helpers'\nimport { createLogger } from '../../utils/logger'\nimport { loadKoraConfig } from '../dev/kora-config'\nimport { loadSchemaDefinition } from '../migrate/schema-loader'\n\n/**\n * Compact the local client operation log (materialized rows are the baseline).\n */\nexport const compactCommand = defineCommand({\n\tmeta: {\n\t\tname: 'compact',\n\t\tdescription: 'Compact the local Kora operation log after server ack',\n\t},\n\targs: {\n\t\tdb: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Path to the local SQLite database (required)',\n\t\t},\n\t\tschema: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Path to schema file',\n\t\t},\n\t\tstrategy: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Compaction strategy: after-ack | after-days | never',\n\t\t\tdefault: 'after-ack',\n\t\t},\n\t\tdays: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Age threshold when strategy is after-days',\n\t\t\tdefault: '30',\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tconst logger = createLogger()\n\t\tconst projectRoot = await findProjectRoot()\n\t\tif (!projectRoot) {\n\t\t\tthrow new InvalidProjectError(process.cwd())\n\t\t}\n\n\t\tconst dbPath = typeof args.db === 'string' ? resolve(projectRoot, args.db) : undefined\n\t\tif (!dbPath) {\n\t\t\tthrow new Error('Missing --db <path> to the local SQLite database file.')\n\t\t}\n\n\t\tconst config = await loadKoraConfig(projectRoot)\n\t\tconst schemaPath =\n\t\t\ttypeof args.schema === 'string'\n\t\t\t\t? resolve(projectRoot, args.schema)\n\t\t\t\t: typeof config?.schema === 'string'\n\t\t\t\t\t? resolve(projectRoot, config.schema)\n\t\t\t\t\t: undefined\n\t\tif (!schemaPath) {\n\t\t\tthrow new Error('Could not resolve schema path. Pass --schema <path>.')\n\t\t}\n\n\t\tconst schema = await loadSchemaDefinition(schemaPath, projectRoot)\n\t\tconst { BetterSqlite3Adapter } = await import('@korajs/store/better-sqlite3')\n\t\tconst { Store } = await import('@korajs/store')\n\n\t\tconst strategyName = typeof args.strategy === 'string' ? args.strategy : 'after-ack'\n\t\tconst days = Number.parseInt(typeof args.days === 'string' ? args.days : '30', 10)\n\n\t\tconst store = new Store({\n\t\t\tschema,\n\t\t\tadapter: new BetterSqlite3Adapter(dbPath),\n\t\t})\n\t\tawait store.open()\n\n\t\tlet result: { deletedCount: number; watermark: Map<string, number> }\n\t\tif (strategyName === 'never') {\n\t\t\tresult = await store.compact({ mode: 'never' })\n\t\t} else if (strategyName === 'after-days') {\n\t\t\tresult = await store.compact({ mode: 'after-days', days })\n\t\t} else if (strategyName === 'after-ack') {\n\t\t\tresult = await store.compact({ mode: 'after-ack' })\n\t\t} else {\n\t\t\tawait store.close()\n\t\t\tthrow new Error(`Unknown strategy \"${strategyName}\". Use after-ack, after-days, or never.`)\n\t\t}\n\n\t\tawait store.close()\n\n\t\tlogger.banner()\n\t\tlogger.success(`Compacted ${result.deletedCount} operation log entries.`)\n\t\tfor (const [nodeId, seq] of result.watermark) {\n\t\t\tlogger.step(` ${nodeId}: seq <= ${seq}`)\n\t\t}\n\t},\n})\n","import { KoraError } from '@korajs/core'\n\n/**\n * Base error class for all CLI errors.\n */\nexport class CliError extends KoraError {\n\tconstructor(message: string, context?: Record<string, unknown>) {\n\t\tsuper(message, 'CLI_ERROR', context)\n\t\tthis.name = 'CliError'\n\t}\n}\n\n/**\n * Thrown when the target project directory already exists.\n */\nexport class ProjectExistsError extends KoraError {\n\tconstructor(public readonly directory: string) {\n\t\tsuper(\n\t\t\t`Directory \"${directory}\" already exists. Choose a different name or remove the existing directory.`,\n\t\t\t'PROJECT_EXISTS',\n\t\t\t{ directory },\n\t\t)\n\t\tthis.name = 'ProjectExistsError'\n\t}\n}\n\n/**\n * Thrown when a schema file cannot be found in the project.\n */\nexport class SchemaNotFoundError extends KoraError {\n\tconstructor(public readonly searchedPaths: string[]) {\n\t\tsuper(\n\t\t\t`Could not find a schema file. Searched: ${searchedPaths.join(', ')}. Create a schema file using defineSchema() from @korajs/core.`,\n\t\t\t'SCHEMA_NOT_FOUND',\n\t\t\t{ searchedPaths },\n\t\t)\n\t\tthis.name = 'SchemaNotFoundError'\n\t}\n}\n\n/**\n * Thrown when a command is run outside a valid Kora project.\n */\nexport class InvalidProjectError extends KoraError {\n\tconstructor(public readonly directory: string) {\n\t\tsuper(\n\t\t\t`\"${directory}\" is not a valid Kora project. No package.json with a kora dependency found. Run this command from inside a Kora project.`,\n\t\t\t'INVALID_PROJECT',\n\t\t\t{ directory },\n\t\t)\n\t\tthis.name = 'InvalidProjectError'\n\t}\n}\n\n/**\n * Thrown when a required local dev server binary cannot be found.\n */\nexport class DevServerError extends KoraError {\n\tconstructor(\n\t\tpublic readonly binary: string,\n\t\tpublic readonly searchPath: string,\n\t) {\n\t\tsuper(\n\t\t\t`Could not find required binary \"${binary}\" at ${searchPath}. Install project dependencies and try again.`,\n\t\t\t'DEV_SERVER_ERROR',\n\t\t\t{ binary, searchPath },\n\t\t)\n\t\tthis.name = 'DevServerError'\n\t}\n}\n","import { access, readFile } from 'node:fs/promises'\nimport { dirname, join, resolve } from 'node:path'\n\n/** Checks if a directory exists at the given path */\nexport async function directoryExists(path: string): Promise<boolean> {\n\ttry {\n\t\tawait access(path)\n\t\treturn true\n\t} catch {\n\t\treturn false\n\t}\n}\n\n/**\n * Walks up the directory tree from startDir looking for a package.json\n * that contains a kora or @korajs/* dependency.\n *\n * @param startDir - Directory to start searching from (defaults to cwd)\n * @returns Absolute path to the project root, or null if not found\n */\nexport async function findProjectRoot(startDir?: string): Promise<string | null> {\n\tlet current = resolve(startDir ?? process.cwd())\n\n\t// Walk up until the filesystem root (where dirname(x) === x)\n\tfor (;;) {\n\t\tconst pkgPath = join(current, 'package.json')\n\t\ttry {\n\t\t\tconst content = await readFile(pkgPath, 'utf-8')\n\t\t\tconst pkg: unknown = JSON.parse(content)\n\t\t\tif (isKoraProject(pkg)) {\n\t\t\t\treturn current\n\t\t\t}\n\t\t} catch {\n\t\t\t// No package.json at this level, keep walking up\n\t\t}\n\t\tconst parent = dirname(current)\n\t\tif (parent === current) break\n\t\tcurrent = parent\n\t}\n\n\treturn null\n}\n\n/**\n * Searches for a schema file in common locations within a project.\n *\n * @param projectRoot - The project root directory\n * @returns Absolute path to the schema file, or null if not found\n */\nexport async function findSchemaFile(projectRoot: string): Promise<string | null> {\n\tconst candidates = [\n\t\tjoin(projectRoot, 'src', 'schema.ts'),\n\t\tjoin(projectRoot, 'schema.ts'),\n\t\tjoin(projectRoot, 'src', 'schema.js'),\n\t\tjoin(projectRoot, 'schema.js'),\n\t]\n\n\tfor (const candidate of candidates) {\n\t\ttry {\n\t\t\tawait access(candidate)\n\t\t\treturn candidate\n\t\t} catch {\n\t\t\t// Not found, try next\n\t\t}\n\t}\n\n\treturn null\n}\n\n/**\n * Resolves a binary from a project's local node_modules/.bin directory.\n * On Windows, npm creates .cmd shims instead of extensionless files.\n *\n * @param projectRoot - The project root directory\n * @param binaryName - Binary filename (for example: vite, tsx, kora)\n * @returns Absolute path to the binary, or null if not found\n */\nexport async function resolveProjectBinary(\n\tprojectRoot: string,\n\tbinaryName: string,\n): Promise<string | null> {\n\tconst binDir = join(projectRoot, 'node_modules', '.bin')\n\t// On Windows, try .cmd first (npm/pnpm create .cmd shims)\n\tconst candidates =\n\t\tprocess.platform === 'win32'\n\t\t\t? [join(binDir, `${binaryName}.cmd`), join(binDir, binaryName)]\n\t\t\t: [join(binDir, binaryName)]\n\n\tfor (const candidate of candidates) {\n\t\ttry {\n\t\t\tawait access(candidate)\n\t\t\treturn candidate\n\t\t} catch {\n\t\t\t// continue\n\t\t}\n\t}\n\treturn null\n}\n\n/**\n * Checks whether the `tsx` package is installed in the project's node_modules.\n * Used to determine if we can use `--import tsx` with process.execPath.\n */\nexport async function hasTsxInstalled(projectRoot: string): Promise<boolean> {\n\ttry {\n\t\tawait access(join(projectRoot, 'node_modules', 'tsx', 'package.json'))\n\t\treturn true\n\t} catch {\n\t\treturn false\n\t}\n}\n\n/**\n * Resolves the JS entry point for a package binary.\n * Reads the package.json bin field to find the actual JS file,\n * avoiding .cmd shims and shell:true on Windows.\n *\n * @returns Absolute path to the JS entry point, or null if not found\n */\nexport async function resolveProjectBinaryEntryPoint(\n\tprojectRoot: string,\n\tpackageName: string,\n\tbinaryName: string,\n): Promise<string | null> {\n\tconst pkgJsonPath = join(projectRoot, 'node_modules', packageName, 'package.json')\n\ttry {\n\t\tconst content = await readFile(pkgJsonPath, 'utf-8')\n\t\tconst pkg = JSON.parse(content) as { bin?: string | Record<string, string> }\n\t\tlet binPath: string | undefined\n\t\tif (typeof pkg.bin === 'string') {\n\t\t\tbinPath = pkg.bin\n\t\t} else if (typeof pkg.bin === 'object' && pkg.bin !== null) {\n\t\t\tbinPath = pkg.bin[binaryName]\n\t\t}\n\t\tif (!binPath) return null\n\t\tconst fullPath = join(projectRoot, 'node_modules', packageName, binPath)\n\t\tawait access(fullPath)\n\t\treturn fullPath\n\t} catch {\n\t\treturn null\n\t}\n}\n\nfunction isKoraProject(pkg: unknown): boolean {\n\tif (typeof pkg !== 'object' || pkg === null) return false\n\tconst record = pkg as Record<string, unknown>\n\treturn hasKoraDep(record.dependencies) || hasKoraDep(record.devDependencies)\n}\n\nfunction hasKoraDep(deps: unknown): boolean {\n\tif (typeof deps !== 'object' || deps === null) return false\n\treturn Object.keys(deps).some((key) => key === 'kora' || key.startsWith('@korajs/'))\n}\n","import { spawn } from 'node:child_process'\nimport { access } from 'node:fs/promises'\nimport { extname, join } from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport { hasTsxInstalled } from '../../utils/fs-helpers'\n\nexport interface KoraConfigFile {\n\tschema?: string\n\tdev?: {\n\t\tport?: number\n\t\tsync?:\n\t\t\t| boolean\n\t\t\t| {\n\t\t\t\t\tenabled?: boolean\n\t\t\t\t\tport?: number\n\t\t\t\t\tstore?:\n\t\t\t\t\t\t| 'memory'\n\t\t\t\t\t\t| 'sqlite'\n\t\t\t\t\t\t| 'postgres'\n\t\t\t\t\t\t| {\n\t\t\t\t\t\t\t\ttype: 'memory'\n\t\t\t\t\t\t }\n\t\t\t\t\t\t| {\n\t\t\t\t\t\t\t\ttype: 'sqlite'\n\t\t\t\t\t\t\t\tfilename?: string\n\t\t\t\t\t\t }\n\t\t\t\t\t\t| {\n\t\t\t\t\t\t\t\ttype: 'postgres'\n\t\t\t\t\t\t\t\tconnectionString: string\n\t\t\t\t\t\t }\n\t\t\t }\n\t\twatch?:\n\t\t\t| boolean\n\t\t\t| {\n\t\t\t\t\tenabled?: boolean\n\t\t\t\t\tdebounceMs?: number\n\t\t\t }\n\t}\n}\n\nconst CONFIG_CANDIDATES = [\n\t'kora.config.ts',\n\t'kora.config.mts',\n\t'kora.config.cts',\n\t'kora.config.js',\n\t'kora.config.mjs',\n\t'kora.config.cjs',\n]\n\n/**\n * Loads `kora.config.*` from the project root if present.\n */\nexport async function loadKoraConfig(projectRoot: string): Promise<KoraConfigFile | null> {\n\tconst configPath = await findKoraConfigFile(projectRoot)\n\tif (!configPath) return null\n\n\tconst ext = extname(configPath)\n\tif (ext === '.ts' || ext === '.mts' || ext === '.cts') {\n\t\tconst loaded = await loadTypeScriptConfig(configPath, projectRoot)\n\t\treturn toConfigObject(loaded)\n\t}\n\n\tconst loaded = await import(pathToFileURL(configPath).href)\n\treturn toConfigObject(loaded)\n}\n\nasync function findKoraConfigFile(projectRoot: string): Promise<string | null> {\n\tfor (const file of CONFIG_CANDIDATES) {\n\t\tconst candidate = join(projectRoot, file)\n\t\ttry {\n\t\t\tawait access(candidate)\n\t\t\treturn candidate\n\t\t} catch {\n\t\t\t// continue\n\t\t}\n\t}\n\n\treturn null\n}\n\nasync function loadTypeScriptConfig(configPath: string, projectRoot: string): Promise<unknown> {\n\tif (!(await hasTsxInstalled(projectRoot))) {\n\t\tthrow new Error(\n\t\t\t`Found TypeScript config at ${configPath}, but \"tsx\" is not installed in this project. Install tsx or use kora.config.js.`,\n\t\t)\n\t}\n\n\t// Use process.execPath (node) + --import tsx to avoid .cmd shim issues on Windows.\n\t// Use dynamic import() with .then() since --eval may run as CJS (no top-level await).\n\tconst script =\n\t\t'const configPath = process.argv[process.argv.length - 1];' +\n\t\t\"import('node:url').then(u => import(u.pathToFileURL(configPath).href))\" +\n\t\t'.then(mod => { const v = mod.default ?? mod; process.stdout.write(JSON.stringify(v)) })' +\n\t\t'.catch(e => { process.stderr.write(String(e)); process.exit(1) })'\n\n\tconst output = await runCommand(\n\t\tprocess.execPath,\n\t\t['--import', 'tsx', '--eval', script, configPath],\n\t\tprojectRoot,\n\t)\n\n\ttry {\n\t\treturn JSON.parse(output)\n\t} catch {\n\t\tthrow new Error(`Failed to parse ${configPath} output as JSON.`)\n\t}\n}\n\nasync function runCommand(command: string, args: string[], cwd: string): Promise<string> {\n\treturn await new Promise<string>((resolve, reject) => {\n\t\tconst child = spawn(command, args, {\n\t\t\tcwd,\n\t\t\tstdio: ['ignore', 'pipe', 'pipe'],\n\t\t\tenv: process.env,\n\t\t})\n\n\t\tlet stdout = ''\n\t\tlet stderr = ''\n\n\t\tchild.stdout?.on('data', (chunk: Buffer) => {\n\t\t\tstdout += chunk.toString('utf-8')\n\t\t})\n\n\t\tchild.stderr?.on('data', (chunk: Buffer) => {\n\t\t\tstderr += chunk.toString('utf-8')\n\t\t})\n\n\t\tchild.on('error', (error) => {\n\t\t\treject(error)\n\t\t})\n\n\t\tchild.on('exit', (code) => {\n\t\t\tif (code === 0) {\n\t\t\t\tresolve(stdout.trim())\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\treject(new Error(`Failed to load kora config (exit ${code ?? 'unknown'}): ${stderr.trim()}`))\n\t\t})\n\t})\n}\n\nfunction toConfigObject(mod: unknown): KoraConfigFile {\n\tif (typeof mod !== 'object' || mod === null) {\n\t\tthrow new Error('kora config must export an object.')\n\t}\n\n\tconst value = (mod as Record<string, unknown>).default ?? mod\n\tif (typeof value !== 'object' || value === null || Array.isArray(value)) {\n\t\tthrow new Error('kora config must export an object.')\n\t}\n\n\treturn value as KoraConfigFile\n}\n","import { spawn } from 'node:child_process'\nimport { extname } from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport type { SchemaDefinition } from '@korajs/core'\nimport { hasTsxInstalled } from '../../utils/fs-helpers'\n\n/**\n * Loads a schema definition from a TS/JS module.\n */\nexport async function loadSchemaDefinition(\n\tschemaPath: string,\n\tprojectRoot: string,\n): Promise<SchemaDefinition> {\n\tconst ext = extname(schemaPath)\n\tconst moduleValue =\n\t\text === '.ts' || ext === '.mts' || ext === '.cts'\n\t\t\t? await loadTypeScriptModule(schemaPath, projectRoot)\n\t\t\t: await import(`${pathToFileURL(schemaPath).href}?t=${Date.now()}-${Math.random()}`)\n\n\treturn extractSchema(moduleValue)\n}\n\nfunction extractSchema(value: unknown): SchemaDefinition {\n\tif (typeof value !== 'object' || value === null) {\n\t\tthrow new Error('Schema module must export an object.')\n\t}\n\n\tconst moduleRecord = value as Record<string, unknown>\n\tconst candidate = moduleRecord.default ?? moduleRecord\n\n\tif (!isSchemaDefinition(candidate)) {\n\t\tthrow new Error('Schema module must export a valid SchemaDefinition as default export.')\n\t}\n\n\treturn candidate\n}\n\nfunction isSchemaDefinition(value: unknown): value is SchemaDefinition {\n\tif (typeof value !== 'object' || value === null) return false\n\tconst object = value as Record<string, unknown>\n\treturn (\n\t\ttypeof object.version === 'number' &&\n\t\ttypeof object.collections === 'object' &&\n\t\tobject.collections !== null &&\n\t\ttypeof object.relations === 'object' &&\n\t\tobject.relations !== null\n\t)\n}\n\nasync function loadTypeScriptModule(schemaPath: string, projectRoot: string): Promise<unknown> {\n\tif (!(await hasTsxInstalled(projectRoot))) {\n\t\tthrow new Error(\n\t\t\t`Schema file is TypeScript (${schemaPath}) but local \"tsx\" was not found. Install tsx in the project.`,\n\t\t)\n\t}\n\n\tconst script =\n\t\t'const modulePath = process.argv[process.argv.length - 1];' +\n\t\t\"import('node:url').then(u => import(u.pathToFileURL(modulePath).href))\" +\n\t\t'.then(mod => { const v = mod.default ?? mod; process.stdout.write(JSON.stringify(v)) })' +\n\t\t'.catch(e => { process.stderr.write(String(e)); process.exit(1) })'\n\n\tconst output = await runCommand(\n\t\tprocess.execPath,\n\t\t['--import', 'tsx', '--eval', script, schemaPath],\n\t\tprojectRoot,\n\t)\n\n\ttry {\n\t\treturn JSON.parse(output)\n\t} catch {\n\t\tthrow new Error(`Failed to parse schema module output for ${schemaPath}`)\n\t}\n}\n\nasync function runCommand(command: string, args: string[], cwd: string): Promise<string> {\n\treturn await new Promise<string>((resolve, reject) => {\n\t\tconst child = spawn(command, args, {\n\t\t\tcwd,\n\t\t\tstdio: ['ignore', 'pipe', 'pipe'],\n\t\t\tenv: process.env,\n\t\t})\n\n\t\tlet stdout = ''\n\t\tlet stderr = ''\n\n\t\tchild.stdout?.on('data', (chunk: Buffer) => {\n\t\t\tstdout += chunk.toString('utf-8')\n\t\t})\n\n\t\tchild.stderr?.on('data', (chunk: Buffer) => {\n\t\t\tstderr += chunk.toString('utf-8')\n\t\t})\n\n\t\tchild.on('error', (error) => {\n\t\t\treject(error)\n\t\t})\n\n\t\tchild.on('exit', (code) => {\n\t\t\tif (code === 0) {\n\t\t\t\tresolve(stdout.trim())\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\treject(\n\t\t\t\tnew Error(`Failed to load TypeScript schema (exit ${code ?? 'unknown'}): ${stderr.trim()}`),\n\t\t\t)\n\t\t})\n\t})\n}\n","import { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { dirname, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { defineCommand } from 'citty'\nimport { ProjectExistsError } from '../../errors'\nimport { PreferenceStore } from '../../prompts/preferences'\nimport { PromptCancelledError, createPromptClient } from '../../prompts/prompt-client'\nimport { PACKAGE_MANAGERS, TEMPLATES } from '../../types'\nimport type { PackageManager, TemplateName } from '../../types'\nimport { directoryExists } from '../../utils/fs-helpers'\nimport { createLogger } from '../../utils/logger'\nimport {\n\tdetectPackageManager,\n\tgetInstallCommand,\n\tgetRunDevCommand,\n} from '../../utils/package-manager'\nimport {\n\tapplyEditorWorkspacePreset,\n\tdetectEditorFromEnvironment,\n\tdetectGitContext,\n\tdetectMonorepoContext,\n\tresolveMonorepoTargetDirectory,\n} from './environment-detection'\nimport {\n\ttype CreateFlags,\n\tresolveCreatePreferencesFlow,\n\tsaveResolvedPreferences,\n\tshouldSavePreferences,\n} from './preferences-flow'\nimport { validateProjectName } from './project-name'\nimport { applySyncProviderPreset } from './sync-provider-preset'\nimport { scaffoldTemplate } from './template-engine'\n\n/**\n * The `create` command — scaffolds a new Kora project.\n * Used as `kora create <name>` or `create-kora-app <name>`.\n */\nexport const createCommand = defineCommand({\n\tmeta: {\n\t\tname: 'create',\n\t\tdescription: 'Create a new Kora application',\n\t},\n\targs: {\n\t\tname: {\n\t\t\ttype: 'positional',\n\t\t\tdescription: 'Project directory name',\n\t\t\trequired: false,\n\t\t},\n\t\tplatform: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Target platform (web, desktop-tauri)',\n\t\t},\n\t\ttemplate: {\n\t\t\ttype: 'string',\n\t\t\tdescription:\n\t\t\t\t'Project template (react-tailwind-sync, react-tailwind, react-sync, react-basic, tauri-react)',\n\t\t},\n\t\tpm: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Package manager (pnpm, npm, yarn, bun)',\n\t\t},\n\t\tframework: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'UI framework (react, vue, svelte, solid)',\n\t\t},\n\t\tdb: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Database backend for sync templates (sqlite, postgres)',\n\t\t},\n\t\t'db-provider': {\n\t\t\ttype: 'string',\n\t\t\tdescription:\n\t\t\t\t'Database provider for postgres (local, supabase, neon, railway, vercel-postgres, custom)',\n\t\t},\n\t\tauth: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Authentication mode (none, email-password, oauth)',\n\t\t},\n\t\t'skip-install': {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Skip installing dependencies',\n\t\t\tdefault: false,\n\t\t},\n\t\tyes: {\n\t\t\ttype: 'boolean',\n\t\t\talias: 'y',\n\t\t\tdescription: 'Accept all defaults (react-tailwind-sync + detected package manager)',\n\t\t\tdefault: false,\n\t\t},\n\t\ttailwind: {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Use Tailwind CSS (use --no-tailwind to skip)',\n\t\t},\n\t\tsync: {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Include sync server (use --no-sync to skip)',\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tconst logger = createLogger()\n\t\tconst prompts = createPromptClient()\n\t\tconst preferenceStore = new PreferenceStore()\n\t\tlogger.banner()\n\t\ttry {\n\t\t\tconst useDefaults = args.yes === true\n\t\t\tif (!useDefaults) {\n\t\t\t\tprompts.intro('Kora.js — Offline-first application framework')\n\t\t\t}\n\n\t\t\t// Resolve project name\n\t\t\tconst projectName =\n\t\t\t\targs.name ||\n\t\t\t\t(useDefaults ? 'my-kora-app' : await prompts.text('Project name', 'my-kora-app'))\n\t\t\tif (!projectName) {\n\t\t\t\tlogger.error('Project name is required')\n\t\t\t\tprocess.exitCode = 1\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst nameValidation = validateProjectName(projectName)\n\t\t\tif (!nameValidation.valid) {\n\t\t\t\tlogger.error('Invalid project name.')\n\t\t\t\tfor (const issue of nameValidation.issues) {\n\t\t\t\t\tlogger.step(`- ${issue}`)\n\t\t\t\t}\n\t\t\t\tif (!useDefaults) {\n\t\t\t\t\tprompts.outro('Project creation aborted.')\n\t\t\t\t}\n\t\t\t\tprocess.exitCode = 1\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst preferenceFlags: CreateFlags = {\n\t\t\t\tplatform: typeof args.platform === 'string' ? args.platform : undefined,\n\t\t\t\tframework: typeof args.framework === 'string' ? args.framework : undefined,\n\t\t\t\tauth: typeof args.auth === 'string' ? args.auth : undefined,\n\t\t\t\tdb: typeof args.db === 'string' ? args.db : undefined,\n\t\t\t\tdbProvider: typeof args['db-provider'] === 'string' ? args['db-provider'] : undefined,\n\t\t\t\ttailwind: args.tailwind,\n\t\t\t\tsync: args.sync,\n\t\t\t\tuseDefaults,\n\t\t\t}\n\n\t\t\tconst selection = await resolveCreatePreferencesFlow({\n\t\t\t\tflags: preferenceFlags,\n\t\t\t\tprompts,\n\t\t\t\tstore: preferenceStore,\n\t\t\t})\n\t\t\tif (selection.framework !== 'react') {\n\t\t\t\tlogger.error(`Framework \"${selection.framework}\" is not available yet. Use \"react\".`)\n\t\t\t\tif (!useDefaults) {\n\t\t\t\t\tprompts.outro('Project creation aborted.')\n\t\t\t\t}\n\t\t\t\tprocess.exitCode = 1\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (selection.auth !== 'none') {\n\t\t\t\tlogger.error(`Auth mode \"${selection.auth}\" is not available yet. Use \"none\".`)\n\t\t\t\tif (!useDefaults) {\n\t\t\t\t\tprompts.outro('Project creation aborted.')\n\t\t\t\t}\n\t\t\t\tprocess.exitCode = 1\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Resolve template (explicit --template still overrides all selections).\n\t\t\tconst template: TemplateName =\n\t\t\t\targs.template && isValidTemplate(args.template) ? args.template : selection.template\n\n\t\t\t// Resolve package manager\n\t\t\tlet pm: PackageManager\n\t\t\tif (args.pm && isValidPackageManager(args.pm)) {\n\t\t\t\tpm = args.pm\n\t\t\t} else if (useDefaults) {\n\t\t\t\tpm = detectPackageManager()\n\t\t\t} else if (selection.usedStoredPreferences) {\n\t\t\t\tpm = preferenceStore.getCreatePreferences()?.packageManager ?? detectPackageManager()\n\t\t\t} else {\n\t\t\t\tconst detected = detectPackageManager()\n\t\t\t\tpm = await prompts.select(\n\t\t\t\t\t'Package manager:',\n\t\t\t\t\tPACKAGE_MANAGERS.map((p) => ({\n\t\t\t\t\t\tlabel: p === detected ? `${p} (detected)` : p,\n\t\t\t\t\t\tvalue: p,\n\t\t\t\t\t})),\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tconst editorDetection = detectEditorFromEnvironment()\n\t\t\tconst gitContext = await detectGitContext(process.cwd())\n\t\t\tconst monorepoContext = await detectMonorepoContext(process.cwd())\n\n\t\t\tlet targetDir = resolve(process.cwd(), projectName)\n\t\t\tif (!useDefaults && monorepoContext.isMonorepo && monorepoContext.root !== null) {\n\t\t\t\tconst useWorkspaceTarget = await prompts.confirm(\n\t\t\t\t\t`Detected ${formatMonorepoKind(monorepoContext.kind)} at ${monorepoContext.root}. Create app under packages/${projectName}?`,\n\t\t\t\t\ttrue,\n\t\t\t\t)\n\t\t\t\tif (useWorkspaceTarget) {\n\t\t\t\t\ttargetDir = resolveMonorepoTargetDirectory(monorepoContext.root, projectName)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Validate target directory\n\t\t\tif (await directoryExists(targetDir)) {\n\t\t\t\tthrow new ProjectExistsError(projectName)\n\t\t\t}\n\n\t\t\t// Resolve kora version from this package's own package.json\n\t\t\tconst koraVersion = resolveKoraVersion()\n\n\t\t\t// Scaffold\n\t\t\tlogger.step(`Creating ${projectName} with ${template} template...`)\n\t\t\tawait scaffoldTemplate(template, targetDir, {\n\t\t\t\tprojectName,\n\t\t\t\tpackageManager: pm,\n\t\t\t\tkoraVersion,\n\t\t\t\tdbProvider: selection.dbProvider,\n\t\t\t})\n\t\t\tawait applySyncProviderPreset({\n\t\t\t\ttargetDir,\n\t\t\t\ttemplate,\n\t\t\t\tdb: selection.db,\n\t\t\t\tdbProvider: selection.dbProvider,\n\t\t\t})\n\t\t\tif (!useDefaults && editorDetection.editor !== 'unknown') {\n\t\t\t\tconst shouldApplyEditorPreset = await prompts.confirm(\n\t\t\t\t\t`Detected ${formatEditor(editorDetection.editor)}. Add workspace recommendations for ${formatEditor(editorDetection.editor)}?`,\n\t\t\t\t\ttrue,\n\t\t\t\t)\n\t\t\t\tif (shouldApplyEditorPreset) {\n\t\t\t\t\tconst appliedPreset = await applyEditorWorkspacePreset({\n\t\t\t\t\t\ttargetDir,\n\t\t\t\t\t\teditor: editorDetection.editor,\n\t\t\t\t\t})\n\t\t\t\t\tif (appliedPreset.applied) {\n\t\t\t\t\t\tlogger.step(\n\t\t\t\t\t\t\t`Added editor recommendations at ${relativeToTarget(targetDir, appliedPreset.filePath)}`,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (selection.db === 'postgres' && isSyncTemplate(template)) {\n\t\t\t\tlogger.info(\n\t\t\t\t\t`Applied PostgreSQL sync preset (${formatDbProviderForLog(selection.dbProvider)}). Update DATABASE_URL in .env.example before running the sync server.`,\n\t\t\t\t)\n\t\t\t}\n\t\t\tif (gitContext.hasRepository) {\n\t\t\t\tlogger.step(\n\t\t\t\t\t`Detected existing git repository at ${gitContext.repositoryRoot}. Skipping git initialization.`,\n\t\t\t\t)\n\t\t\t}\n\t\t\tlogger.success('Project scaffolded')\n\n\t\t\tif (shouldSavePreferences(preferenceFlags)) {\n\t\t\t\tsaveResolvedPreferences(preferenceStore, {\n\t\t\t\t\tplatform: selection.platform,\n\t\t\t\t\tframework: selection.framework,\n\t\t\t\t\tauth: selection.auth,\n\t\t\t\t\tdb: selection.db,\n\t\t\t\t\tdbProvider: selection.dbProvider,\n\t\t\t\t\ttailwind: selection.tailwind,\n\t\t\t\t\tsync: selection.sync,\n\t\t\t\t\tpackageManager: pm,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// Install dependencies\n\t\t\tif (!args['skip-install']) {\n\t\t\t\tlogger.step('Installing dependencies...')\n\t\t\t\ttry {\n\t\t\t\t\texecSync(getInstallCommand(pm), { cwd: targetDir, stdio: 'inherit' })\n\t\t\t\t\tlogger.success('Dependencies installed')\n\t\t\t\t} catch {\n\t\t\t\t\tlogger.warn('Failed to install dependencies. Run install manually.')\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Print next steps\n\t\t\tlogger.blank()\n\t\t\tlogger.info('Done! Next steps:')\n\t\t\tlogger.blank()\n\t\t\tlogger.step(` cd ${targetDir}`)\n\t\t\tlogger.step(` ${getRunDevCommand(pm)}`)\n\t\t\tlogger.blank()\n\t\t\tif (!useDefaults) {\n\t\t\t\tprompts.outro('Project ready. Happy building with Kora!')\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (error instanceof PromptCancelledError) {\n\t\t\t\tprocess.exitCode = 1\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (error instanceof Error && error.message.startsWith('Invalid --')) {\n\t\t\t\tlogger.error(error.message)\n\t\t\t\tif (!args.yes) {\n\t\t\t\t\tprompts.outro('Project creation aborted.')\n\t\t\t\t}\n\t\t\t\tprocess.exitCode = 1\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\t},\n})\n\nfunction isValidTemplate(value: string): value is TemplateName {\n\treturn (TEMPLATES as readonly string[]).includes(value)\n}\n\nfunction isValidPackageManager(value: string): value is PackageManager {\n\treturn (PACKAGE_MANAGERS as readonly string[]).includes(value)\n}\n\nfunction isSyncTemplate(template: TemplateName): boolean {\n\treturn (\n\t\ttemplate === 'react-sync' || template === 'react-tailwind-sync' || template === 'tauri-react'\n\t)\n}\n\nfunction formatDbProviderForLog(dbProvider: string): string {\n\tswitch (dbProvider) {\n\t\tcase 'supabase':\n\t\t\treturn 'Supabase'\n\t\tcase 'neon':\n\t\t\treturn 'Neon'\n\t\tcase 'railway':\n\t\t\treturn 'Railway'\n\t\tcase 'vercel-postgres':\n\t\t\treturn 'Vercel Postgres'\n\t\tcase 'custom':\n\t\t\treturn 'Custom'\n\t\tcase 'local':\n\t\t\treturn 'Local Postgres'\n\t\tcase 'none':\n\t\t\treturn 'PostgreSQL'\n\t\tdefault:\n\t\t\treturn dbProvider\n\t}\n}\n\nfunction formatEditor(editor: string): string {\n\tswitch (editor) {\n\t\tcase 'vscode':\n\t\t\treturn 'VS Code'\n\t\tcase 'cursor':\n\t\t\treturn 'Cursor'\n\t\tcase 'windsurf':\n\t\t\treturn 'Windsurf'\n\t\tcase 'zed':\n\t\t\treturn 'Zed'\n\t\tdefault:\n\t\t\treturn editor\n\t}\n}\n\nfunction formatMonorepoKind(kind: string): string {\n\tswitch (kind) {\n\t\tcase 'pnpm-workspace':\n\t\t\treturn 'pnpm workspace'\n\t\tcase 'npm-workspaces':\n\t\t\treturn 'npm workspace'\n\t\tcase 'turborepo':\n\t\t\treturn 'Turborepo'\n\t\tdefault:\n\t\t\treturn 'monorepo'\n\t}\n}\n\nfunction relativeToTarget(targetDir: string, filePath: string | null): string {\n\tif (filePath === null) return '.'\n\tconst normalizedTarget = targetDir.endsWith('/') ? targetDir : `${targetDir}/`\n\tif (filePath.startsWith(normalizedTarget)) {\n\t\treturn filePath.slice(normalizedTarget.length)\n\t}\n\tif (filePath === targetDir) {\n\t\treturn '.'\n\t}\n\treturn filePath\n}\n\n/**\n * Reads the version from @korajs/cli's own package.json and derives a\n * compatible version range for all @korajs packages.\n *\n * The CLI may be a patch ahead of other packages (e.g. CLI-only fixes),\n * so we use the major.minor range (^major.minor.0) which matches all\n * packages in the same release series.\n */\nfunction resolveKoraVersion(): string {\n\ttry {\n\t\tlet dir = dirname(fileURLToPath(import.meta.url))\n\t\tfor (let i = 0; i < 5; i++) {\n\t\t\tconst pkgPath = resolve(dir, 'package.json')\n\t\t\tif (existsSync(pkgPath)) {\n\t\t\t\tconst pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) as { name?: string; version: string }\n\t\t\t\tif (pkg.name === '@korajs/cli') {\n\t\t\t\t\tif (pkg.version === '0.0.0') return 'latest'\n\t\t\t\t\t// Use ^major.minor.0 so all packages in the series match\n\t\t\t\t\tconst parts = pkg.version.split('.')\n\t\t\t\t\treturn `^${parts[0]}.${parts[1]}.0`\n\t\t\t\t}\n\t\t\t}\n\t\t\tdir = dirname(dir)\n\t\t}\n\t\treturn 'latest'\n\t} catch {\n\t\treturn 'latest'\n\t}\n}\n","import Conf from 'conf'\nimport type {\n\tAuthOption,\n\tDatabaseOption,\n\tDatabaseProviderOption,\n\tFrameworkOption,\n\tPlatformOption,\n} from '../commands/create/options'\nimport type { PackageManager } from '../types'\n\nexport interface CreatePreferences {\n\tplatform: PlatformOption\n\tframework: FrameworkOption\n\ttailwind: boolean\n\tsync: boolean\n\tdb: DatabaseOption\n\tdbProvider: DatabaseProviderOption\n\tauth: AuthOption\n\tpackageManager: PackageManager\n}\n\nconst DEFAULT_PREFERENCES: CreatePreferences = {\n\tplatform: 'web',\n\tframework: 'react',\n\ttailwind: true,\n\tsync: true,\n\tdb: 'sqlite',\n\tdbProvider: 'none',\n\tauth: 'none',\n\tpackageManager: 'pnpm',\n}\n\nconst PREFERENCES_KEY = 'create.defaults'\n\n/**\n * Preference store for scaffold-time defaults in `create-kora-app`.\n */\nexport class PreferenceStore {\n\tprivate readonly store: Conf<{ [PREFERENCES_KEY]?: CreatePreferences }>\n\n\tpublic constructor() {\n\t\tthis.store = new Conf<{ [PREFERENCES_KEY]?: CreatePreferences }>({\n\t\t\tprojectName: 'korajs-cli',\n\t\t})\n\t}\n\n\tpublic getCreatePreferences(): CreatePreferences | null {\n\t\treturn this.store.get(PREFERENCES_KEY) ?? null\n\t}\n\n\tpublic saveCreatePreferences(preferences: CreatePreferences): void {\n\t\tthis.store.set(PREFERENCES_KEY, preferences)\n\t}\n\n\tpublic clearCreatePreferences(): void {\n\t\tthis.store.delete(PREFERENCES_KEY)\n\t}\n}\n\n/**\n * Gets preferences from storage or returns defaults when not available.\n */\nexport function getCreatePreferencesOrDefault(store: PreferenceStore): CreatePreferences {\n\treturn store.getCreatePreferences() ?? DEFAULT_PREFERENCES\n}\n\nexport function getDefaultCreatePreferences(): CreatePreferences {\n\treturn { ...DEFAULT_PREFERENCES }\n}\n","import {\n\tcancel as clackCancel,\n\tconfirm as clackConfirm,\n\tintro as clackIntro,\n\tisCancel as clackIsCancel,\n\toutro as clackOutro,\n\tselect as clackSelect,\n\ttext as clackText,\n} from '@clack/prompts'\nimport { promptConfirm, promptSelect, promptText } from '../utils/prompt'\n\nexport interface SelectOption<T extends string> {\n\tlabel: string\n\tvalue: T\n\thint?: string\n\tdisabled?: boolean\n}\n\ntype ClackSelectOption<T extends string> = {\n\tvalue: T\n\tlabel?: string\n\thint?: string\n\tdisabled?: boolean\n}\n\nexport interface PromptClient {\n\ttext(message: string, defaultValue?: string): Promise<string>\n\tselect<T extends string>(message: string, options: readonly SelectOption<T>[]): Promise<T>\n\tconfirm(message: string, defaultValue?: boolean): Promise<boolean>\n\tintro(message: string): void\n\toutro(message: string): void\n}\n\nexport class PromptCancelledError extends Error {\n\tpublic constructor(message = 'Prompt cancelled by user') {\n\t\tsuper(message)\n\t\tthis.name = 'PromptCancelledError'\n\t}\n}\n\n/**\n * Prompt client backed by the current readline helpers.\n *\n * Phase 12 will introduce a richer prompt backend. This adapter keeps command\n * logic decoupled from the prompt implementation so we can migrate without\n * reshaping command behavior.\n */\nexport class ReadlinePromptClient implements PromptClient {\n\tpublic async text(message: string, defaultValue?: string): Promise<string> {\n\t\treturn promptText(message, defaultValue)\n\t}\n\n\tpublic async select<T extends string>(\n\t\tmessage: string,\n\t\toptions: readonly SelectOption<T>[],\n\t): Promise<T> {\n\t\treturn promptSelect(\n\t\t\tmessage,\n\t\t\toptions\n\t\t\t\t.filter((option) => option.disabled !== true)\n\t\t\t\t.map((option) => ({ label: option.label, value: option.value })),\n\t\t)\n\t}\n\n\tpublic async confirm(message: string, defaultValue = false): Promise<boolean> {\n\t\treturn promptConfirm(message, defaultValue)\n\t}\n\n\tpublic intro(message: string): void {\n\t\t// The readline backend does not provide intro/outro framing.\n\t\t// Keep no-op semantics for compatibility.\n\t\tvoid message\n\t}\n\n\tpublic outro(message: string): void {\n\t\t// The readline backend does not provide intro/outro framing.\n\t\t// Keep no-op semantics for compatibility.\n\t\tvoid message\n\t}\n}\n\n/**\n * Returns the default prompt client for interactive CLI flows.\n */\nexport function createPromptClient(): PromptClient {\n\tconst canUseInteractiveClack =\n\t\ttypeof process !== 'undefined' && process.stdin.isTTY && process.stdout.isTTY\n\tif (canUseInteractiveClack) {\n\t\treturn new ClackPromptClient()\n\t}\n\treturn new ReadlinePromptClient()\n}\n\n/**\n * Prompt client backed by @clack/prompts for richer interactive UX.\n * Falls back to readline in non-interactive contexts.\n */\nexport class ClackPromptClient implements PromptClient {\n\tpublic async text(message: string, defaultValue?: string): Promise<string> {\n\t\tconst result = await clackText({\n\t\t\tmessage,\n\t\t\tplaceholder: defaultValue,\n\t\t\tdefaultValue,\n\t\t})\n\t\tif (clackIsCancel(result)) {\n\t\t\tclackCancel('Operation cancelled.')\n\t\t\tthrow new PromptCancelledError()\n\t\t}\n\t\tconst value = result.trim()\n\t\tif (value.length > 0) return value\n\t\treturn defaultValue ?? ''\n\t}\n\n\tpublic async select<T extends string>(\n\t\tmessage: string,\n\t\toptions: readonly SelectOption<T>[],\n\t): Promise<T> {\n\t\tconst mappedOptions: ClackSelectOption<T>[] = options.map((option) => ({\n\t\t\tlabel: option.label,\n\t\t\tvalue: option.value,\n\t\t\thint: option.hint,\n\t\t\tdisabled: option.disabled,\n\t\t}))\n\t\tconst result = await clackSelect({\n\t\t\tmessage,\n\t\t\toptions: mappedOptions as unknown as Parameters<typeof clackSelect>[0]['options'],\n\t\t})\n\t\tif (clackIsCancel(result)) {\n\t\t\tclackCancel('Operation cancelled.')\n\t\t\tthrow new PromptCancelledError()\n\t\t}\n\t\treturn result as T\n\t}\n\n\tpublic async confirm(message: string, defaultValue = false): Promise<boolean> {\n\t\tconst result = await clackConfirm({\n\t\t\tmessage,\n\t\t\tinitialValue: defaultValue,\n\t\t})\n\t\tif (clackIsCancel(result)) {\n\t\t\tclackCancel('Operation cancelled.')\n\t\t\tthrow new PromptCancelledError()\n\t\t}\n\t\treturn result\n\t}\n\n\tpublic intro(message: string): void {\n\t\tclackIntro(message)\n\t}\n\n\tpublic outro(message: string): void {\n\t\tclackOutro(message)\n\t}\n}\n","import { type Interface as ReadlineInterface, createInterface } from 'node:readline'\n\nexport interface PromptOptions {\n\t/** Input stream (defaults to process.stdin) */\n\tinput?: NodeJS.ReadableStream\n\t/** Output stream (defaults to process.stdout) */\n\toutput?: NodeJS.WritableStream\n}\n\n/**\n * Prompts the user for text input.\n *\n * @param message - The prompt message to display\n * @param defaultValue - Optional default value shown in brackets\n * @param options - Optional input/output streams for testing\n */\nexport function promptText(\n\tmessage: string,\n\tdefaultValue?: string,\n\toptions?: PromptOptions,\n): Promise<string> {\n\treturn new Promise((resolve) => {\n\t\tconst rl = createReadline(options)\n\t\tconst suffix = defaultValue !== undefined ? ` (${defaultValue})` : ''\n\t\trl.question(` ? ${message}${suffix}: `, (answer) => {\n\t\t\trl.close()\n\t\t\tconst trimmed = answer.trim()\n\t\t\tresolve(trimmed || defaultValue || '')\n\t\t})\n\t})\n}\n\n/**\n * Prompts the user to select from a numbered list of options.\n *\n * @param message - The prompt message to display\n * @param choices - Array of { label, value } options\n * @param options - Optional input/output streams for testing\n */\nexport function promptSelect<T extends string>(\n\tmessage: string,\n\tchoices: readonly { label: string; value: T }[],\n\toptions?: PromptOptions,\n): Promise<T> {\n\treturn new Promise((resolve) => {\n\t\tconst rl = createReadline(options)\n\t\tconst out = options?.output ?? process.stdout\n\n\t\tout.write(` ? ${message}\\n`)\n\t\tfor (let i = 0; i < choices.length; i++) {\n\t\t\tconst choice = choices[i]\n\t\t\tif (choice) {\n\t\t\t\tout.write(` ${i + 1}) ${choice.label}\\n`)\n\t\t\t}\n\t\t}\n\n\t\tconst ask = (): void => {\n\t\t\trl.question(' > ', (answer) => {\n\t\t\t\tconst index = Number.parseInt(answer.trim(), 10) - 1\n\t\t\t\tconst selected = choices[index]\n\t\t\t\tif (selected) {\n\t\t\t\t\trl.close()\n\t\t\t\t\tresolve(selected.value)\n\t\t\t\t} else {\n\t\t\t\t\tout.write(` Please enter a number between 1 and ${choices.length}\\n`)\n\t\t\t\t\task()\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\task()\n\t})\n}\n\n/**\n * Prompts the user with a yes/no confirmation.\n *\n * @param message - The prompt message to display\n * @param defaultValue - Default when input is empty (true => yes)\n * @param options - Optional input/output streams for testing\n */\nexport function promptConfirm(\n\tmessage: string,\n\tdefaultValue = false,\n\toptions?: PromptOptions,\n): Promise<boolean> {\n\treturn new Promise((resolve) => {\n\t\tconst rl = createReadline(options)\n\t\tconst suffix = defaultValue ? 'Y/n' : 'y/N'\n\n\t\tconst ask = (): void => {\n\t\t\trl.question(` ? ${message} (${suffix}): `, (answer) => {\n\t\t\t\tconst normalized = answer.trim().toLowerCase()\n\t\t\t\tif (normalized.length === 0) {\n\t\t\t\t\trl.close()\n\t\t\t\t\tresolve(defaultValue)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif (normalized === 'y' || normalized === 'yes') {\n\t\t\t\t\trl.close()\n\t\t\t\t\tresolve(true)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif (normalized === 'n' || normalized === 'no') {\n\t\t\t\t\trl.close()\n\t\t\t\t\tresolve(false)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t;(options?.output ?? process.stdout).write(' Please answer with y or n\\n')\n\t\t\t\task()\n\t\t\t})\n\t\t}\n\n\t\task()\n\t})\n}\n\nfunction createReadline(options?: PromptOptions): ReadlineInterface {\n\treturn createInterface({\n\t\tinput: options?.input ?? process.stdin,\n\t\toutput: options?.output ?? process.stdout,\n\t})\n}\n","/** Supported package managers */\nexport const PACKAGE_MANAGERS = ['pnpm', 'npm', 'yarn', 'bun'] as const\nexport type PackageManager = (typeof PACKAGE_MANAGERS)[number]\n\n/** Available project templates */\nexport const TEMPLATES = [\n\t'react-tailwind-sync',\n\t'react-tailwind',\n\t'react-sync',\n\t'react-basic',\n\t'tauri-react',\n] as const\nexport type TemplateName = (typeof TEMPLATES)[number]\n\n/** Metadata for a project template */\nexport interface TemplateInfo {\n\tname: TemplateName\n\tlabel: string\n\tdescription: string\n}\n\n/** Available templates with their descriptions */\nexport const TEMPLATE_INFO: readonly TemplateInfo[] = [\n\t{\n\t\tname: 'react-tailwind-sync',\n\t\tlabel: 'React + Tailwind (with sync)',\n\t\tdescription: 'Polished dark-themed app with Tailwind CSS and sync server (Recommended)',\n\t},\n\t{\n\t\tname: 'react-tailwind',\n\t\tlabel: 'React + Tailwind (local-only)',\n\t\tdescription: 'Polished dark-themed app with Tailwind CSS — no sync server',\n\t},\n\t{\n\t\tname: 'react-sync',\n\t\tlabel: 'React + CSS (with sync)',\n\t\tdescription: 'Clean CSS app with sync server included',\n\t},\n\t{\n\t\tname: 'react-basic',\n\t\tlabel: 'React + CSS (local-only)',\n\t\tdescription: 'Clean CSS app — no sync server',\n\t},\n\t{\n\t\tname: 'tauri-react',\n\t\tlabel: 'Tauri Desktop (native SQLite)',\n\t\tdescription: 'Desktop app with native SQLite — no WASM, includes sync server',\n\t},\n] as const\n\n/** Variables available for template substitution */\nexport interface TemplateContext {\n\tprojectName: string\n\tpackageManager: PackageManager\n\tkoraVersion: string\n\tdbProvider?: string\n}\n","import { execSync } from 'node:child_process'\nimport type { PackageManager } from '../types'\n\n/**\n * Detects the package manager used to invoke the current process\n * by reading the npm_config_user_agent environment variable.\n * Falls back to 'npm' if detection fails.\n */\nexport function detectPackageManager(): PackageManager {\n\tconst userAgent = process.env.npm_config_user_agent\n\tif (!userAgent) return 'npm'\n\n\tif (userAgent.startsWith('pnpm/')) return 'pnpm'\n\tif (userAgent.startsWith('yarn/')) return 'yarn'\n\tif (userAgent.startsWith('bun/')) return 'bun'\n\treturn 'npm'\n}\n\n/** Returns the install command for the given package manager */\nexport function getInstallCommand(pm: PackageManager): string {\n\treturn pm === 'yarn' ? 'yarn' : `${pm} install`\n}\n\n/** Returns the dev server run command for the given package manager */\nexport function getRunDevCommand(pm: PackageManager): string {\n\tif (pm === 'npm') return 'npm run dev'\n\treturn `${pm} dev`\n}\n\n/** Checks if a package manager is available on PATH */\nexport function isPackageManagerAvailable(pm: PackageManager): boolean {\n\ttry {\n\t\texecSync(`${pm} --version`, { stdio: 'ignore' })\n\t\treturn true\n\t} catch {\n\t\treturn false\n\t}\n}\n","import { access, mkdir, readFile, stat, writeFile } from 'node:fs/promises'\nimport { dirname, join, resolve } from 'node:path'\n\nexport type SupportedEditor = 'vscode' | 'cursor' | 'windsurf' | 'zed' | 'unknown'\n\nexport interface EditorDetectionResult {\n\teditor: SupportedEditor\n\tsource: 'env' | 'none'\n}\n\nexport interface GitContextResult {\n\thasRepository: boolean\n\trepositoryRoot: string | null\n}\n\nexport interface MonorepoContextResult {\n\tisMonorepo: boolean\n\troot: string | null\n\tkind: 'pnpm-workspace' | 'npm-workspaces' | 'turborepo' | 'none'\n}\n\nexport interface EditorWorkspacePresetResult {\n\tapplied: boolean\n\tfilePath: string | null\n}\n\n/**\n * Detects which editor is most likely being used by inspecting environment\n * variables commonly set by integrated terminals.\n */\nexport function detectEditorFromEnvironment(\n\tenv: Record<string, string | undefined> = process.env,\n): EditorDetectionResult {\n\tconst termProgram = String(env.TERM_PROGRAM ?? '').toLowerCase()\n\tconst editorValue = `${String(env.EDITOR ?? '')} ${String(env.VISUAL ?? '')}`.toLowerCase()\n\n\tif (\n\t\ttermProgram.includes('cursor') ||\n\t\tenv.CURSOR_TRACE_ID !== undefined ||\n\t\tenv.CURSOR_SESSION_ID !== undefined ||\n\t\teditorValue.includes('cursor')\n\t) {\n\t\treturn { editor: 'cursor', source: 'env' }\n\t}\n\tif (\n\t\ttermProgram.includes('windsurf') ||\n\t\tenv.WINDSURF_SESSION_ID !== undefined ||\n\t\teditorValue.includes('windsurf')\n\t) {\n\t\treturn { editor: 'windsurf', source: 'env' }\n\t}\n\tif (\n\t\ttermProgram.includes('vscode') ||\n\t\tenv.VSCODE_GIT_IPC_HANDLE !== undefined ||\n\t\tenv.VSCODE_IPC_HOOK !== undefined ||\n\t\tenv.VSCODE_PID !== undefined ||\n\t\teditorValue.includes('code')\n\t) {\n\t\treturn { editor: 'vscode', source: 'env' }\n\t}\n\tif (termProgram.includes('zed') || env.ZED_TERM !== undefined || editorValue.includes('zed')) {\n\t\treturn { editor: 'zed', source: 'env' }\n\t}\n\treturn { editor: 'unknown', source: 'none' }\n}\n\n/**\n * Finds the nearest ancestor directory that contains a `.git` entry.\n */\nexport async function detectGitContext(startDir: string): Promise<GitContextResult> {\n\tconst root = await findNearestAncestorWithEntry(startDir, '.git')\n\treturn {\n\t\thasRepository: root !== null,\n\t\trepositoryRoot: root,\n\t}\n}\n\n/**\n * Detects whether the given path is inside a monorepo workspace.\n * Detection currently supports pnpm workspaces, npm workspaces, and Turborepo.\n */\nexport async function detectMonorepoContext(startDir: string): Promise<MonorepoContextResult> {\n\tlet current = resolve(startDir)\n\tfor (;;) {\n\t\tif (await fileExists(join(current, 'pnpm-workspace.yaml'))) {\n\t\t\treturn { isMonorepo: true, root: current, kind: 'pnpm-workspace' }\n\t\t}\n\n\t\tif (await fileExists(join(current, 'turbo.json'))) {\n\t\t\treturn { isMonorepo: true, root: current, kind: 'turborepo' }\n\t\t}\n\n\t\tconst packageJsonPath = join(current, 'package.json')\n\t\tif (await fileExists(packageJsonPath)) {\n\t\t\ttry {\n\t\t\t\tconst packageJsonRaw = await readFile(packageJsonPath, 'utf-8')\n\t\t\t\tconst parsed = JSON.parse(packageJsonRaw) as { workspaces?: unknown }\n\t\t\t\tif (Array.isArray(parsed.workspaces) || isNpmWorkspaceObject(parsed.workspaces)) {\n\t\t\t\t\treturn { isMonorepo: true, root: current, kind: 'npm-workspaces' }\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Ignore malformed package.json and keep walking upward.\n\t\t\t}\n\t\t}\n\n\t\tconst parent = dirname(current)\n\t\tif (parent === current) {\n\t\t\treturn { isMonorepo: false, root: null, kind: 'none' }\n\t\t}\n\t\tcurrent = parent\n\t}\n}\n\n/**\n * Applies editor-specific workspace configuration. For VS Code-compatible\n * editors this creates or updates `.vscode/extensions.json` recommendations.\n */\nexport async function applyEditorWorkspacePreset(params: {\n\ttargetDir: string\n\teditor: SupportedEditor\n}): Promise<EditorWorkspacePresetResult> {\n\tconst { targetDir, editor } = params\n\tif (editor !== 'vscode' && editor !== 'cursor' && editor !== 'windsurf') {\n\t\treturn { applied: false, filePath: null }\n\t}\n\n\tconst vscodeDir = join(targetDir, '.vscode')\n\tconst extensionsPath = join(vscodeDir, 'extensions.json')\n\tawait mkdir(vscodeDir, { recursive: true })\n\n\tconst recommendations = ['korajs.kora-devtools']\n\tconst existing = await readJsonObject(extensionsPath)\n\tconst existingRecommendations = Array.isArray(existing?.recommendations)\n\t\t? existing.recommendations.filter((item): item is string => typeof item === 'string')\n\t\t: []\n\tconst mergedRecommendations = dedupeStrings([...existingRecommendations, ...recommendations])\n\n\tconst next = {\n\t\trecommendations: mergedRecommendations,\n\t}\n\tawait writeFile(extensionsPath, `${JSON.stringify(next, null, 2)}\\n`, 'utf-8')\n\treturn { applied: true, filePath: extensionsPath }\n}\n\n/**\n * Returns a workspace-aware target directory under the detected monorepo root.\n * This keeps generated apps in conventional package folders.\n */\nexport function resolveMonorepoTargetDirectory(monorepoRoot: string, projectName: string): string {\n\treturn join(monorepoRoot, 'packages', projectName)\n}\n\nfunction dedupeStrings(values: readonly string[]): string[] {\n\treturn Array.from(new Set(values))\n}\n\nasync function readJsonObject(path: string): Promise<Record<string, unknown> | null> {\n\ttry {\n\t\tconst content = await readFile(path, 'utf-8')\n\t\tconst parsed: unknown = JSON.parse(content)\n\t\tif (typeof parsed === 'object' && parsed !== null) {\n\t\t\treturn parsed as Record<string, unknown>\n\t\t}\n\t\treturn null\n\t} catch {\n\t\treturn null\n\t}\n}\n\nfunction isNpmWorkspaceObject(value: unknown): value is { packages: unknown } {\n\tif (typeof value !== 'object' || value === null) return false\n\tconst record = value as Record<string, unknown>\n\treturn Array.isArray(record.packages)\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n\ttry {\n\t\tawait access(path)\n\t\treturn true\n\t} catch {\n\t\treturn false\n\t}\n}\n\nasync function findNearestAncestorWithEntry(\n\tstartDir: string,\n\tentryName: string,\n): Promise<string | null> {\n\tlet current = resolve(startDir)\n\tfor (;;) {\n\t\tconst candidate = join(current, entryName)\n\t\ttry {\n\t\t\tawait stat(candidate)\n\t\t\treturn current\n\t\t} catch {\n\t\t\t// keep walking upward\n\t\t}\n\t\tconst parent = dirname(current)\n\t\tif (parent === current) {\n\t\t\treturn null\n\t\t}\n\t\tcurrent = parent\n\t}\n}\n","import type { TemplateName } from '../../types'\n\nexport type PlatformOption = 'web' | 'desktop-tauri'\nexport type FrameworkOption = 'react' | 'vue' | 'svelte' | 'solid'\nexport type AuthOption = 'none' | 'email-password' | 'oauth'\nexport type DatabaseOption = 'none' | 'sqlite' | 'postgres'\nexport type DatabaseProviderOption =\n\t| 'none'\n\t| 'local'\n\t| 'supabase'\n\t| 'neon'\n\t| 'railway'\n\t| 'vercel-postgres'\n\t| 'custom'\n\nexport interface TemplateSelectionInput {\n\tplatform: PlatformOption\n\ttailwind: boolean\n\tsync: boolean\n\tdb: DatabaseOption\n}\n\n/**\n * Converts high-level scaffold selections into the currently supported\n * concrete template names.\n */\nexport function determineTemplateFromSelections(input: TemplateSelectionInput): TemplateName {\n\tif (input.platform === 'desktop-tauri') return 'tauri-react'\n\tconst shouldSync = input.sync && input.db !== 'none'\n\tif (input.tailwind && shouldSync) return 'react-tailwind-sync'\n\tif (input.tailwind && !shouldSync) return 'react-tailwind'\n\tif (!input.tailwind && shouldSync) return 'react-sync'\n\treturn 'react-basic'\n}\n\nexport function isPlatformValue(value: string): value is PlatformOption {\n\treturn value === 'web' || value === 'desktop-tauri'\n}\n\nexport function isFrameworkValue(value: string): value is FrameworkOption {\n\treturn value === 'react' || value === 'vue' || value === 'svelte' || value === 'solid'\n}\n\nexport function isAuthValue(value: string): value is AuthOption {\n\treturn value === 'none' || value === 'email-password' || value === 'oauth'\n}\n\nexport function isDatabaseValue(value: string): value is DatabaseOption {\n\treturn value === 'none' || value === 'sqlite' || value === 'postgres'\n}\n\nexport function isDatabaseProviderValue(value: string): value is DatabaseProviderOption {\n\treturn (\n\t\tvalue === 'none' ||\n\t\tvalue === 'local' ||\n\t\tvalue === 'supabase' ||\n\t\tvalue === 'neon' ||\n\t\tvalue === 'railway' ||\n\t\tvalue === 'vercel-postgres' ||\n\t\tvalue === 'custom'\n\t)\n}\n","import {\n\ttype CreatePreferences,\n\ttype PreferenceStore,\n\tgetCreatePreferencesOrDefault,\n\tgetDefaultCreatePreferences,\n} from '../../prompts/preferences'\nimport type { PromptClient } from '../../prompts/prompt-client'\nimport {\n\ttype AuthOption,\n\ttype DatabaseOption,\n\ttype DatabaseProviderOption,\n\ttype FrameworkOption,\n\ttype PlatformOption,\n\tdetermineTemplateFromSelections,\n\tisAuthValue,\n\tisDatabaseProviderValue,\n\tisDatabaseValue,\n\tisFrameworkValue,\n\tisPlatformValue,\n} from './options'\n\nexport interface CreateFlags {\n\tplatform?: string\n\tframework?: string\n\tauth?: string\n\tdb?: string\n\tdbProvider?: string\n\ttailwind?: boolean\n\tsync?: boolean\n\tuseDefaults: boolean\n}\n\nexport interface PreferenceResolutionResult {\n\tplatform: PlatformOption\n\tframework: FrameworkOption\n\tauth: AuthOption\n\tdb: DatabaseOption\n\tdbProvider: DatabaseProviderOption\n\ttailwind: boolean\n\tsync: boolean\n\ttemplate: ReturnType<typeof determineTemplateFromSelections>\n\tusedStoredPreferences: boolean\n}\n\n/**\n * Resolves scaffold options with precedence:\n * CLI flags > --yes defaults > stored preferences > interactive prompts.\n */\nexport async function resolveCreatePreferencesFlow(params: {\n\tflags: CreateFlags\n\tprompts: PromptClient\n\tstore: PreferenceStore\n}): Promise<PreferenceResolutionResult> {\n\tconst { flags, prompts, store } = params\n\tconst stored = store.getCreatePreferences()\n\tconst base = getCreatePreferencesOrDefault(store)\n\tconst hasExplicitFlags = hasExplicitPreferenceFlags(flags)\n\tconst canOfferStored =\n\t\t!flags.useDefaults && !hasExplicitFlags && stored !== null && promptSupportsRichOptions()\n\n\tlet effective: CreatePreferences = { ...base }\n\tlet usedStoredPreferences = false\n\n\tif (flags.useDefaults) {\n\t\teffective = getDefaultCreatePreferences()\n\t} else if (canOfferStored && stored !== null) {\n\t\tconst reuseStored = await prompts.select('Welcome back! Choose setup mode:', [\n\t\t\t{ label: formatStoredPreferenceLabel(stored), value: 'reuse' },\n\t\t\t{ label: 'Customize', value: 'customize' },\n\t\t])\n\t\tif (reuseStored === 'reuse') {\n\t\t\teffective = { ...stored }\n\t\t\tusedStoredPreferences = true\n\t\t}\n\t}\n\n\tif (flags.platform !== undefined) {\n\t\tif (!isPlatformValue(flags.platform)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid --platform value \"${flags.platform}\". Expected one of: web, desktop-tauri.`,\n\t\t\t)\n\t\t}\n\t\teffective.platform = flags.platform\n\t} else if (!flags.useDefaults && !usedStoredPreferences) {\n\t\teffective.platform = await prompts.select('Platform:', [\n\t\t\t{ label: 'Web (browser)', value: 'web' },\n\t\t\t{ label: 'Desktop (Tauri — native SQLite)', value: 'desktop-tauri' },\n\t\t])\n\t}\n\n\tconst isTauri = effective.platform === 'desktop-tauri'\n\n\tif (isTauri) {\n\t\t// Tauri currently uses React and native SQLite on the client.\n\t\t// The sync server remains configurable so the same desktop scaffold can\n\t\t// run local-only, LAN sync, or cloud sync without switching templates.\n\t\teffective.framework = 'react'\n\t\teffective.tailwind = false\n\t\teffective.auth = 'none'\n\n\t\tif (flags.sync !== undefined) {\n\t\t\teffective.sync = flags.sync\n\t\t} else if (!flags.useDefaults && !usedStoredPreferences) {\n\t\t\teffective.sync = await prompts.confirm('Enable multi-device sync?', true)\n\t\t}\n\n\t\tif (flags.db !== undefined) {\n\t\t\tif (!isDatabaseValue(flags.db)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Invalid --db value \"${flags.db}\". Expected one of: none, sqlite, postgres.`,\n\t\t\t\t)\n\t\t\t}\n\t\t\teffective.db = flags.db\n\t\t} else if (!effective.sync) {\n\t\t\teffective.db = 'none'\n\t\t} else if (!flags.useDefaults && !usedStoredPreferences) {\n\t\t\teffective.db = await prompts.select('Sync server database:', [\n\t\t\t\t{ label: 'SQLite (zero-config; local, LAN, small teams)', value: 'sqlite' },\n\t\t\t\t{ label: 'PostgreSQL (production-scale)', value: 'postgres' },\n\t\t\t])\n\t\t}\n\n\t\tif (effective.db === 'none') {\n\t\t\teffective.sync = false\n\t\t}\n\n\t\tif (effective.db !== 'postgres') {\n\t\t\teffective.dbProvider = 'none'\n\t\t} else if (flags.dbProvider !== undefined) {\n\t\t\tif (!isDatabaseProviderValue(flags.dbProvider)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Invalid --db-provider value \"${flags.dbProvider}\". Expected one of: none, local, supabase, neon, railway, vercel-postgres, custom.`,\n\t\t\t\t)\n\t\t\t}\n\t\t\teffective.dbProvider = flags.dbProvider\n\t\t} else if (!flags.useDefaults && !usedStoredPreferences) {\n\t\t\teffective.dbProvider = await prompts.select('Database provider:', [\n\t\t\t\t{ label: 'Local Postgres', value: 'local' },\n\t\t\t\t{ label: 'Supabase', value: 'supabase' },\n\t\t\t\t{ label: 'Neon', value: 'neon' },\n\t\t\t\t{ label: 'Railway', value: 'railway' },\n\t\t\t\t{ label: 'Vercel Postgres', value: 'vercel-postgres' },\n\t\t\t\t{ label: 'Custom connection string', value: 'custom' },\n\t\t\t])\n\t\t}\n\t} else {\n\t\tif (flags.framework !== undefined) {\n\t\t\tif (!isFrameworkValue(flags.framework)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Invalid --framework value \"${flags.framework}\". Expected one of: react, vue, svelte, solid.`,\n\t\t\t\t)\n\t\t\t}\n\t\t\teffective.framework = flags.framework\n\t\t} else if (!flags.useDefaults && !usedStoredPreferences) {\n\t\t\teffective.framework = await prompts.select('UI framework:', [\n\t\t\t\t{ label: 'React', value: 'react' },\n\t\t\t\t{ label: 'Vue (coming soon)', value: 'vue', disabled: true },\n\t\t\t\t{ label: 'Svelte (coming soon)', value: 'svelte', disabled: true },\n\t\t\t\t{ label: 'Solid (coming soon)', value: 'solid', disabled: true },\n\t\t\t])\n\t\t}\n\n\t\tif (flags.auth !== undefined) {\n\t\t\tif (!isAuthValue(flags.auth)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Invalid --auth value \"${flags.auth}\". Expected one of: none, email-password, oauth.`,\n\t\t\t\t)\n\t\t\t}\n\t\t\teffective.auth = flags.auth\n\t\t} else if (!flags.useDefaults && !usedStoredPreferences) {\n\t\t\teffective.auth = await prompts.select('Authentication:', [\n\t\t\t\t{ label: 'None', value: 'none' },\n\t\t\t\t{ label: 'Email + Password (coming soon)', value: 'email-password', disabled: true },\n\t\t\t\t{ label: 'OAuth (coming soon)', value: 'oauth', disabled: true },\n\t\t\t])\n\t\t}\n\n\t\tif (flags.tailwind !== undefined) {\n\t\t\teffective.tailwind = flags.tailwind\n\t\t} else if (!flags.useDefaults && !usedStoredPreferences) {\n\t\t\teffective.tailwind = await prompts.confirm('Use Tailwind CSS?', true)\n\t\t}\n\n\t\tif (flags.sync !== undefined) {\n\t\t\teffective.sync = flags.sync\n\t\t} else if (!flags.useDefaults && !usedStoredPreferences) {\n\t\t\teffective.sync = await prompts.confirm('Enable multi-device sync?', true)\n\t\t}\n\n\t\tif (flags.db !== undefined) {\n\t\t\tif (!isDatabaseValue(flags.db)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Invalid --db value \"${flags.db}\". Expected one of: none, sqlite, postgres.`,\n\t\t\t\t)\n\t\t\t}\n\t\t\teffective.db = flags.db\n\t\t} else if (!effective.sync) {\n\t\t\teffective.db = 'none'\n\t\t} else if (!flags.useDefaults && !usedStoredPreferences) {\n\t\t\teffective.db = await prompts.select('Server-side database:', [\n\t\t\t\t{ label: 'SQLite (zero-config)', value: 'sqlite' },\n\t\t\t\t{ label: 'PostgreSQL (production-scale)', value: 'postgres' },\n\t\t\t])\n\t\t}\n\n\t\tif (effective.db !== 'postgres') {\n\t\t\teffective.dbProvider = 'none'\n\t\t} else if (flags.dbProvider !== undefined) {\n\t\t\tif (!isDatabaseProviderValue(flags.dbProvider)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Invalid --db-provider value \"${flags.dbProvider}\". Expected one of: none, local, supabase, neon, railway, vercel-postgres, custom.`,\n\t\t\t\t)\n\t\t\t}\n\t\t\teffective.dbProvider = flags.dbProvider\n\t\t} else if (!flags.useDefaults && !usedStoredPreferences) {\n\t\t\teffective.dbProvider = await prompts.select('Database provider:', [\n\t\t\t\t{ label: 'Local Postgres', value: 'local' },\n\t\t\t\t{ label: 'Supabase', value: 'supabase' },\n\t\t\t\t{ label: 'Neon', value: 'neon' },\n\t\t\t\t{ label: 'Railway', value: 'railway' },\n\t\t\t\t{ label: 'Vercel Postgres', value: 'vercel-postgres' },\n\t\t\t\t{ label: 'Custom connection string', value: 'custom' },\n\t\t\t])\n\t\t}\n\t}\n\n\tconst template = determineTemplateFromSelections({\n\t\tplatform: effective.platform,\n\t\ttailwind: effective.tailwind,\n\t\tsync: effective.sync,\n\t\tdb: effective.db,\n\t})\n\n\treturn {\n\t\tplatform: effective.platform,\n\t\tframework: effective.framework,\n\t\tauth: effective.auth,\n\t\tdb: effective.db,\n\t\tdbProvider: effective.dbProvider,\n\t\ttailwind: effective.tailwind,\n\t\tsync: effective.sync,\n\t\ttemplate,\n\t\tusedStoredPreferences,\n\t}\n}\n\nexport function shouldSavePreferences(flags: CreateFlags): boolean {\n\treturn !flags.useDefaults\n}\n\nexport function saveResolvedPreferences(\n\tstore: PreferenceStore,\n\tresolution: Omit<PreferenceResolutionResult, 'template' | 'usedStoredPreferences'> & {\n\t\tpackageManager: CreatePreferences['packageManager']\n\t},\n): void {\n\tstore.saveCreatePreferences({\n\t\tplatform: resolution.platform,\n\t\tframework: resolution.framework,\n\t\ttailwind: resolution.tailwind,\n\t\tsync: resolution.sync,\n\t\tdb: resolution.db,\n\t\tdbProvider: resolution.dbProvider,\n\t\tauth: resolution.auth,\n\t\tpackageManager: resolution.packageManager,\n\t})\n}\n\nfunction hasExplicitPreferenceFlags(flags: CreateFlags): boolean {\n\treturn (\n\t\tflags.platform !== undefined ||\n\t\tflags.framework !== undefined ||\n\t\tflags.auth !== undefined ||\n\t\tflags.db !== undefined ||\n\t\tflags.dbProvider !== undefined ||\n\t\tflags.tailwind !== undefined ||\n\t\tflags.sync !== undefined\n\t)\n}\n\nfunction promptSupportsRichOptions(): boolean {\n\treturn typeof process !== 'undefined' && process.stdin.isTTY && process.stdout.isTTY\n}\n\nfunction formatStoredPreferenceLabel(preferences: CreatePreferences): string {\n\tif (preferences.platform === 'desktop-tauri') {\n\t\treturn `Use previous settings (tauri-desktop + ${preferences.packageManager})`\n\t}\n\tconst syncLabel = preferences.sync ? `sync/${preferences.db}` : 'local-only'\n\tconst styleLabel = preferences.tailwind ? 'tailwind' : 'css'\n\treturn `Use previous settings (${preferences.framework} + ${styleLabel} + ${syncLabel} + ${preferences.packageManager})`\n}\n","import validateNpmPackageName from 'validate-npm-package-name'\n\nexport interface ProjectNameValidationResult {\n\tvalid: boolean\n\tissues: readonly string[]\n}\n\n/**\n * Validates a project name for scaffolded package creation.\n *\n * The create command uses this validation before writing files so users get a\n * clear, early error if the name cannot be used as an npm package name.\n */\nexport function validateProjectName(name: string): ProjectNameValidationResult {\n\tconst trimmedName = name.trim()\n\tif (trimmedName.length === 0) {\n\t\treturn {\n\t\t\tvalid: false,\n\t\t\tissues: ['Project name cannot be empty.'],\n\t\t}\n\t}\n\n\tconst validation = validateNpmPackageName(trimmedName)\n\tconst issues = [...(validation.errors ?? []), ...(validation.warnings ?? [])]\n\tif (!validation.validForNewPackages && issues.length === 0) {\n\t\treturn {\n\t\t\tvalid: false,\n\t\t\tissues: ['Project name is not a valid npm package name.'],\n\t\t}\n\t}\n\n\treturn {\n\t\tvalid: validation.validForNewPackages,\n\t\tissues,\n\t}\n}\n","import { readFile, writeFile } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport type { TemplateName } from '../../types'\nimport type { DatabaseOption, DatabaseProviderOption } from './options'\n\ninterface SyncProviderPresetOptions {\n\ttargetDir: string\n\ttemplate: TemplateName\n\tdb: DatabaseOption\n\tdbProvider: DatabaseProviderOption\n}\n\n/**\n * Applies provider-specific sync scaffolding adjustments after template copy.\n *\n * The sync server template is environment-driven: SQLite is used when\n * DATABASE_URL is absent, and PostgreSQL is used when DATABASE_URL is present.\n * Provider presets only add provider-specific guidance.\n */\nexport async function applySyncProviderPreset(options: SyncProviderPresetOptions): Promise<void> {\n\tif (!isSyncTemplate(options.template)) {\n\t\treturn\n\t}\n\tif (options.db !== 'postgres') {\n\t\treturn\n\t}\n\n\tconst providerName = getProviderDisplayName(options.dbProvider)\n\tconst providerConnectionString = getProviderConnectionStringExample(options.dbProvider)\n\tconst envPath = join(options.targetDir, '.env.example')\n\tconst readmePath = join(options.targetDir, 'README.md')\n\n\tconst existingReadme = await readFile(readmePath, 'utf-8')\n\tconst existingEnv = await readFile(envPath, 'utf-8')\n\tconst trimmedReadme = existingReadme.trimEnd()\n\tconst trimmedEnv = existingEnv.trimEnd()\n\tconst envSuffix = [\n\t\t'',\n\t\t`# PostgreSQL provider preset: ${providerName}`,\n\t\t`# Example: ${providerConnectionString}`,\n\t].join('\\n')\n\tconst readmeSuffix = [\n\t\t'',\n\t\t'## PostgreSQL Provider Preset',\n\t\t'',\n\t\t`Selected DB provider: ${options.dbProvider}`,\n\t\t'',\n\t\t'This scaffold keeps one sync server entrypoint. When `DATABASE_URL` is set, `server.ts` uses PostgreSQL. When it is empty, the same server uses SQLite at `KORA_SERVER_DB`.',\n\t\t'',\n\t\t'The generated server uses `createPostgresServerStore` automatically when `DATABASE_URL` is present.',\n\t\t'',\n\t].join('\\n')\n\tconst readmeTemplate = `${trimmedReadme}${readmeSuffix}`\n\n\tawait writeFile(envPath, `${trimmedEnv}${envSuffix}\\n`, 'utf-8')\n\tawait writeFile(readmePath, readmeTemplate, 'utf-8')\n}\n\nfunction isSyncTemplate(template: TemplateName): boolean {\n\treturn (\n\t\ttemplate === 'react-sync' || template === 'react-tailwind-sync' || template === 'tauri-react'\n\t)\n}\n\nfunction getProviderDisplayName(provider: DatabaseProviderOption): string {\n\tswitch (provider) {\n\t\tcase 'supabase':\n\t\t\treturn 'Supabase'\n\t\tcase 'neon':\n\t\t\treturn 'Neon'\n\t\tcase 'railway':\n\t\t\treturn 'Railway'\n\t\tcase 'vercel-postgres':\n\t\t\treturn 'Vercel Postgres'\n\t\tcase 'custom':\n\t\t\treturn 'Custom'\n\t\tcase 'local':\n\t\t\treturn 'Local Postgres'\n\t\tcase 'none':\n\t\t\treturn 'PostgreSQL'\n\t}\n}\n\nfunction getProviderConnectionStringExample(provider: DatabaseProviderOption): string {\n\tswitch (provider) {\n\t\tcase 'supabase':\n\t\t\treturn 'postgresql://postgres:<password>@db.<project-ref>.supabase.co:5432/postgres?sslmode=require'\n\t\tcase 'neon':\n\t\t\treturn 'postgresql://<user>:<password>@<branch>.<project>.neon.tech/neondb?sslmode=require'\n\t\tcase 'railway':\n\t\t\treturn 'postgresql://postgres:<password>@<host>.railway.app:<port>/railway?sslmode=require'\n\t\tcase 'vercel-postgres':\n\t\t\treturn 'postgresql://<user>:<password>@<host>.pooler.vercel-storage.com:5432/verceldb?sslmode=require'\n\t\tcase 'custom':\n\t\t\treturn 'postgresql://<user>:<password>@<host>:5432/<database>'\n\t\tcase 'local':\n\t\t\treturn 'postgresql://postgres:postgres@localhost:5432/kora'\n\t\tcase 'none':\n\t\t\treturn 'postgresql://postgres:postgres@localhost:5432/kora'\n\t}\n}\n","import { existsSync } from 'node:fs'\nimport { copyFile, mkdir, readFile, readdir, stat, writeFile } from 'node:fs/promises'\nimport { dirname, join, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport type { TemplateContext, TemplateName } from '../types'\n\nexport type TemplateLayerCategory = 'base' | 'ui' | 'style' | 'sync' | 'db' | 'auth'\n\nexport interface TemplateLayer {\n\tcategory: TemplateLayerCategory\n\tname: string\n\tsourceTemplate: TemplateName | null\n}\n\nexport interface TemplateLayerPlan {\n\tlayers: readonly TemplateLayer[]\n\tcompatibilityTarget: TemplateName\n}\n\n/**\n * Replaces {{variable}} placeholders in a template string with context values.\n *\n * @param template - The template string containing {{variable}} placeholders\n * @param context - Key-value pairs to substitute\n * @returns The template with all placeholders replaced\n */\nexport function substituteVariables(template: string, context: Record<string, string>): string {\n\treturn template.replace(/\\{\\{(\\w+)\\}\\}/g, (_match, key: string) => {\n\t\tconst value = context[key]\n\t\treturn value !== undefined ? value : `{{${key}}}`\n\t})\n}\n\n/**\n * Resolves the absolute path to a bundled template directory.\n *\n * After tsup bundling, import.meta.url points to dist/<file>.js (1 level from root).\n * In source, it's src/templates/composer.ts (2 levels from root).\n * We walk up from the current file to find the package root containing templates/.\n *\n * @param templateName - Name of the template (for example, 'react-basic')\n * @returns Absolute path to the template directory\n */\nexport function getTemplatePath(templateName: TemplateName): string {\n\tlet dir = dirname(fileURLToPath(import.meta.url))\n\tfor (let i = 0; i < 7; i++) {\n\t\tconst candidate = resolve(dir, 'templates', templateName)\n\t\tif (existsSync(candidate)) {\n\t\t\treturn candidate\n\t\t}\n\t\tdir = dirname(dir)\n\t}\n\t// Fallback: assume bundled output and step to package root.\n\tconst currentDir = dirname(fileURLToPath(import.meta.url))\n\treturn resolve(currentDir, '..', '..', '..', 'templates', templateName)\n}\n\n/**\n * Returns a v1 compatibility layer plan that composes to one of the existing\n * four concrete templates. This establishes the layer architecture while\n * preserving byte-for-byte output compatibility for current templates.\n */\nexport function createCompatibilityLayerPlan(templateName: TemplateName): TemplateLayerPlan {\n\tconst baseLayer: TemplateLayer = { category: 'base', name: 'base', sourceTemplate: 'react-basic' }\n\tconst uiLayer: TemplateLayer = { category: 'ui', name: 'react', sourceTemplate: null }\n\tconst authLayer: TemplateLayer = { category: 'auth', name: 'none', sourceTemplate: null }\n\n\tswitch (templateName) {\n\t\tcase 'react-basic':\n\t\t\treturn {\n\t\t\t\tcompatibilityTarget: templateName,\n\t\t\t\tlayers: [\n\t\t\t\t\tbaseLayer,\n\t\t\t\t\tuiLayer,\n\t\t\t\t\t{ category: 'style', name: 'plain', sourceTemplate: null },\n\t\t\t\t\t{ category: 'sync', name: 'disabled', sourceTemplate: null },\n\t\t\t\t\t{ category: 'db', name: 'none', sourceTemplate: null },\n\t\t\t\t\tauthLayer,\n\t\t\t\t],\n\t\t\t}\n\t\tcase 'react-tailwind':\n\t\t\treturn {\n\t\t\t\tcompatibilityTarget: templateName,\n\t\t\t\tlayers: [\n\t\t\t\t\tbaseLayer,\n\t\t\t\t\tuiLayer,\n\t\t\t\t\t{ category: 'style', name: 'tailwind', sourceTemplate: 'react-tailwind' },\n\t\t\t\t\t{ category: 'sync', name: 'disabled', sourceTemplate: null },\n\t\t\t\t\t{ category: 'db', name: 'none', sourceTemplate: null },\n\t\t\t\t\tauthLayer,\n\t\t\t\t],\n\t\t\t}\n\t\tcase 'react-sync':\n\t\t\treturn {\n\t\t\t\tcompatibilityTarget: templateName,\n\t\t\t\tlayers: [\n\t\t\t\t\tbaseLayer,\n\t\t\t\t\tuiLayer,\n\t\t\t\t\t{ category: 'style', name: 'plain', sourceTemplate: null },\n\t\t\t\t\t{ category: 'sync', name: 'enabled', sourceTemplate: 'react-sync' },\n\t\t\t\t\t{ category: 'db', name: 'sqlite', sourceTemplate: null },\n\t\t\t\t\tauthLayer,\n\t\t\t\t],\n\t\t\t}\n\t\tcase 'react-tailwind-sync':\n\t\t\treturn {\n\t\t\t\tcompatibilityTarget: templateName,\n\t\t\t\tlayers: [\n\t\t\t\t\tbaseLayer,\n\t\t\t\t\tuiLayer,\n\t\t\t\t\t{ category: 'style', name: 'tailwind', sourceTemplate: 'react-tailwind' },\n\t\t\t\t\t{ category: 'sync', name: 'enabled', sourceTemplate: 'react-tailwind-sync' },\n\t\t\t\t\t{ category: 'db', name: 'sqlite', sourceTemplate: null },\n\t\t\t\t\tauthLayer,\n\t\t\t\t],\n\t\t\t}\n\t\tcase 'tauri-react':\n\t\t\treturn {\n\t\t\t\tcompatibilityTarget: templateName,\n\t\t\t\tlayers: [\n\t\t\t\t\t{ category: 'base', name: 'tauri', sourceTemplate: 'tauri-react' },\n\t\t\t\t\tuiLayer,\n\t\t\t\t\t{ category: 'style', name: 'plain', sourceTemplate: null },\n\t\t\t\t\t{ category: 'sync', name: 'enabled', sourceTemplate: null },\n\t\t\t\t\t{ category: 'db', name: 'tauri-sqlite', sourceTemplate: null },\n\t\t\t\t\tauthLayer,\n\t\t\t\t],\n\t\t\t}\n\t}\n}\n\n/**\n * Composes a project by applying template layers in order. Later layers\n * overwrite earlier files, which allows progressive specialization.\n *\n * @param plan - Layer plan describing the composition\n * @param targetDir - Destination directory (must not exist yet)\n * @param context - Variables for template substitution\n */\nexport async function composeTemplateLayers(\n\tplan: TemplateLayerPlan,\n\ttargetDir: string,\n\tcontext: TemplateContext,\n): Promise<void> {\n\tconst vars: Record<string, string> = {\n\t\tprojectName: context.projectName,\n\t\tpackageManager: context.packageManager,\n\t\tkoraVersion: context.koraVersion,\n\t\tdbProvider: context.dbProvider ?? 'none',\n\t}\n\n\tfor (const layer of plan.layers) {\n\t\tif (layer.sourceTemplate === null) {\n\t\t\tcontinue\n\t\t}\n\t\tconst sourceDir = getTemplatePath(layer.sourceTemplate)\n\t\tawait copyDirectory(sourceDir, targetDir, vars)\n\t}\n}\n\nasync function copyDirectory(\n\tsrc: string,\n\tdest: string,\n\tvars: Record<string, string>,\n): Promise<void> {\n\tawait mkdir(dest, { recursive: true })\n\tconst entries = await readdir(src)\n\n\tfor (const entry of entries) {\n\t\tconst srcPath = join(src, entry)\n\t\tconst srcStat = await stat(srcPath)\n\n\t\tif (srcStat.isDirectory()) {\n\t\t\tawait copyDirectory(srcPath, join(dest, entry), vars)\n\t\t\tcontinue\n\t\t}\n\t\tif (entry.endsWith('.hbs')) {\n\t\t\tconst content = await readFile(srcPath, 'utf-8')\n\t\t\tconst outputName = entry.slice(0, -4)\n\t\t\tawait writeFile(join(dest, outputName), substituteVariables(content, vars), 'utf-8')\n\t\t\tcontinue\n\t\t}\n\t\tawait copyFile(srcPath, join(dest, entry))\n\t}\n}\n","import { composeTemplateLayers, createCompatibilityLayerPlan } from '../../templates/composer'\nimport type { TemplateContext, TemplateName } from '../../types'\n\n/**\n * Replaces {{variable}} placeholders in a template string with context values.\n *\n * @param template - The template string containing {{variable}} placeholders\n * @param context - Key-value pairs to substitute\n * @returns The template with all placeholders replaced\n */\nexport { substituteVariables, getTemplatePath } from '../../templates/composer'\n\n/**\n * Scaffolds a project from a bundled template.\n * Copies all files from the template directory to the target, applying\n * variable substitution to .hbs files and stripping the .hbs extension.\n *\n * @param templateName - Which template to use\n * @param targetDir - Destination directory (must not exist yet)\n * @param context - Variables for template substitution\n */\nexport async function scaffoldTemplate(\n\ttemplateName: TemplateName,\n\ttargetDir: string,\n\tcontext: TemplateContext,\n): Promise<void> {\n\tconst plan = createCompatibilityLayerPlan(templateName)\n\tawait composeTemplateLayers(plan, targetDir, context)\n}\n","import { existsSync } from 'node:fs'\nimport { basename, join } from 'node:path'\nimport { defineCommand } from 'citty'\nimport { InvalidProjectError } from '../../errors'\nimport { createPromptClient } from '../../prompts/prompt-client'\nimport { findProjectRoot } from '../../utils/fs-helpers'\nimport { createLogger } from '../../utils/logger'\nimport {\n\ttype ContextAwareDeployAdapter,\n\tDEPLOY_PLATFORMS,\n\ttype DeployAdapter,\n\ttype DeployPlatform,\n\ttype ProjectConfig,\n\tisDeployPlatform,\n} from './adapters/adapter'\nimport { createDeployAdapter } from './adapters/factory'\nimport {\n\twriteDockerIgnoreArtifact,\n\twriteDockerfileArtifact,\n} from './artifacts/dockerfile-generator'\nimport {\n\treadDeployState,\n\tresetDeployState,\n\tresolveDeployDirectory,\n\tupdateDeployState,\n\twriteDeployState,\n} from './state/deploy-state'\n\n/**\n * The `deploy` command for Phase 13.\n *\n * This command orchestrates:\n * - deploy state resolution and persistence\n * - artifact generation\n * - adapter-driven provision/build/deploy flows\n */\nexport const deployCommand = defineCommand({\n\tmeta: {\n\t\tname: 'deploy',\n\t\tdescription: 'Deploy a Kora project to your selected platform',\n\t},\n\targs: {\n\t\tplatform: {\n\t\t\ttype: 'string',\n\t\t\tdescription: `Deployment platform (${DEPLOY_PLATFORMS.join(', ')})`,\n\t\t},\n\t\tapp: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Application name used by the target platform',\n\t\t},\n\t\tregion: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Preferred deployment region (for example: iad, lhr, syd)',\n\t\t},\n\t\tprod: {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Deploy to production environment',\n\t\t\tdefault: false,\n\t\t},\n\t\tconfirm: {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Non-interactive mode (fail fast on missing required data)',\n\t\t\tdefault: false,\n\t\t},\n\t\treset: {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Delete .kora/deploy state and generated artifacts',\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tsubCommands: {\n\t\tstatus: defineCommand({\n\t\t\tmeta: {\n\t\t\t\tname: 'status',\n\t\t\t\tdescription: 'Show current deployment status',\n\t\t\t},\n\t\t\tasync run() {\n\t\t\t\tconst logger = createLogger()\n\t\t\t\tconst projectRoot = await requireProjectRoot()\n\t\t\t\tconst state = await readDeployState(projectRoot)\n\t\t\t\tif (!state) {\n\t\t\t\t\tlogger.warn('No deployment state found. Run `kora deploy` first.')\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tlogger.banner()\n\t\t\t\tlogger.info(`Platform: ${state.platform}`)\n\t\t\t\tlogger.step(`App: ${state.appName}`)\n\t\t\t\tlogger.step(`Region: ${state.region ?? 'n/a'}`)\n\t\t\t\tlogger.step(`Last deployment: ${state.lastDeploymentId ?? 'n/a'}`)\n\n\t\t\t\tconst adapter = createDeployAdapter(state.platform)\n\t\t\t\tconfigureAdapterContext(adapter, {\n\t\t\t\t\tprojectRoot,\n\t\t\t\t\tappName: state.appName,\n\t\t\t\t\tregion: state.region,\n\t\t\t\t})\n\t\t\t\tconst adapterStatus = await adapter.status()\n\t\t\t\tlogger.step(`Status: ${adapterStatus.state}`)\n\t\t\t\tlogger.step(`Message: ${adapterStatus.message}`)\n\t\t\t\tlogger.step(`Live URL: ${adapterStatus.liveUrl ?? state.liveUrl ?? 'n/a'}`)\n\t\t\t\tlogger.step(`Sync URL: ${state.syncUrl ?? 'n/a'}`)\n\t\t\t},\n\t\t}),\n\t\trollback: defineCommand({\n\t\t\tmeta: {\n\t\t\t\tname: 'rollback',\n\t\t\t\tdescription: 'Rollback the current deployment',\n\t\t\t},\n\t\t\targs: {\n\t\t\t\tid: {\n\t\t\t\t\ttype: 'positional',\n\t\t\t\t\tdescription: 'Optional deployment identifier',\n\t\t\t\t\trequired: false,\n\t\t\t\t},\n\t\t\t},\n\t\t\tasync run({ args }) {\n\t\t\t\tconst logger = createLogger()\n\t\t\t\tconst projectRoot = await requireProjectRoot()\n\t\t\t\tconst state = await readDeployState(projectRoot)\n\t\t\t\tif (!state) {\n\t\t\t\t\tlogger.warn('No deployment state found. Run `kora deploy` first.')\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tconst adapter = createDeployAdapter(state.platform)\n\t\t\t\tconfigureAdapterContext(adapter, {\n\t\t\t\t\tprojectRoot,\n\t\t\t\t\tappName: state.appName,\n\t\t\t\t\tregion: state.region,\n\t\t\t\t})\n\t\t\t\tconst deploymentId =\n\t\t\t\t\ttypeof args.id === 'string' && args.id.length > 0\n\t\t\t\t\t\t? args.id\n\t\t\t\t\t\t: (state.lastDeploymentId ?? 'latest')\n\t\t\t\tawait adapter.rollback(deploymentId)\n\t\t\t\tlogger.success(`Rolled back ${state.platform} deployment to ${deploymentId}.`)\n\t\t\t},\n\t\t}),\n\t\tlogs: defineCommand({\n\t\t\tmeta: {\n\t\t\t\tname: 'logs',\n\t\t\t\tdescription: 'Read deployment logs',\n\t\t\t},\n\t\t\tasync run() {\n\t\t\t\tconst logger = createLogger()\n\t\t\t\tconst projectRoot = await requireProjectRoot()\n\t\t\t\tconst state = await readDeployState(projectRoot)\n\t\t\t\tif (!state) {\n\t\t\t\t\tlogger.warn('No deployment state found. Run `kora deploy` first.')\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tconst adapter = createDeployAdapter(state.platform)\n\t\t\t\tconfigureAdapterContext(adapter, {\n\t\t\t\t\tprojectRoot,\n\t\t\t\t\tappName: state.appName,\n\t\t\t\t\tregion: state.region,\n\t\t\t\t})\n\t\t\t\tconst logLines = adapter.logs({ tail: 200 })\n\t\t\t\tlet hasLines = false\n\t\t\t\tfor await (const line of logLines) {\n\t\t\t\t\thasLines = true\n\t\t\t\t\tlogger.step(`[${line.level}] ${line.message}`)\n\t\t\t\t}\n\t\t\t\tif (!hasLines) {\n\t\t\t\t\tlogger.warn(`No logs returned from ${state.platform}.`)\n\t\t\t\t}\n\t\t\t},\n\t\t}),\n\t},\n\tasync run({ args, rawArgs }) {\n\t\t// Citty calls run() even after subcommand execution.\n\t\t// Guard against double-execution when a subcommand was invoked.\n\t\tconst subCommandNames = ['status', 'rollback', 'logs']\n\t\tif (rawArgs.some((arg) => subCommandNames.includes(arg))) {\n\t\t\treturn\n\t\t}\n\n\t\tconst logger = createLogger()\n\t\tconst prompts = createPromptClient()\n\t\tconst projectRoot = await requireProjectRoot()\n\n\t\tif (args.reset === true) {\n\t\t\tawait resetDeployState(projectRoot)\n\t\t\tlogger.success('Reset .kora/deploy state.')\n\t\t\treturn\n\t\t}\n\n\t\tconst existingState = await readDeployState(projectRoot)\n\t\tconst confirmMode = args.confirm === true\n\t\tconst platform = await resolvePlatform({\n\t\t\tpromptClient: prompts,\n\t\t\tplatformArg: args.platform,\n\t\t\tstoredPlatform: existingState?.platform,\n\t\t\tconfirm: confirmMode,\n\t\t})\n\t\tconst appName = resolveAppName(args.app, existingState?.appName, projectRoot, confirmMode)\n\t\tconst region = resolveRegion(args.region, existingState?.region, confirmMode)\n\t\tconst deployDirectory = resolveDeployDirectory(projectRoot)\n\t\tconst environment = args.prod === true ? 'production' : 'preview'\n\t\tconst deployTarget = detectDeployTarget(projectRoot)\n\t\tconst config: ProjectConfig = {\n\t\t\tprojectRoot,\n\t\t\tappName,\n\t\t\tregion,\n\t\t\tenvironment,\n\t\t\tconfirm: confirmMode,\n\t\t\tdeployTarget,\n\t\t}\n\t\tconst adapter = createDeployAdapter(platform)\n\t\tconfigureAdapterContext(adapter, {\n\t\t\tprojectRoot,\n\t\t\tappName,\n\t\t\tregion,\n\t\t})\n\n\t\tlogger.banner()\n\t\tlogger.info(\n\t\t\t`Deploying to ${platform} (${appName}${region ? `, ${region}` : ''}, ${environment})`,\n\t\t)\n\t\tif (deployTarget === 'sync-server') {\n\t\t\tlogger.step('Detected Tauri project. Deploying the sync server only.')\n\t\t}\n\t\tif (confirmMode) {\n\t\t\tlogger.step('Running in --confirm mode (non-interactive, fail-fast).')\n\t\t}\n\n\t\tawait writeDockerfileArtifact(deployDirectory, {\n\t\t\tclientDirectory: deployTarget === 'sync-server' ? null : undefined,\n\t\t\tnativeDependencies: {\n\t\t\t\t'better-sqlite3': '^11.0.0',\n\t\t\t\t'drizzle-orm': '^0.45.2',\n\t\t\t\tpostgres: '^3.4.0',\n\t\t\t},\n\t\t})\n\t\tawait writeDockerIgnoreArtifact(deployDirectory)\n\t\tconst detected = await adapter.detect()\n\t\tif (!detected) {\n\t\t\tawait adapter.install()\n\t\t}\n\t\tawait adapter.authenticate()\n\t\tconst provisionResult = await adapter.provision(config)\n\t\tconst artifacts = await adapter.build(config)\n\t\tconst deployResult = await adapter.deploy(artifacts)\n\n\t\tif (existingState) {\n\t\t\tawait updateDeployState(projectRoot, {\n\t\t\t\tplatform,\n\t\t\t\tappName,\n\t\t\t\tregion,\n\t\t\t\tprojectRoot,\n\t\t\t\tliveUrl: deployResult.liveUrl,\n\t\t\t\tsyncUrl: deployResult.syncUrl,\n\t\t\t\tdatabaseId: provisionResult.databaseId,\n\t\t\t\tlastDeploymentId: deployResult.deploymentId,\n\t\t\t})\n\t\t} else {\n\t\t\tawait writeDeployState(projectRoot, {\n\t\t\t\tplatform,\n\t\t\t\tappName,\n\t\t\t\tregion,\n\t\t\t\tprojectRoot,\n\t\t\t\tliveUrl: deployResult.liveUrl,\n\t\t\t\tsyncUrl: deployResult.syncUrl,\n\t\t\t\tdatabaseId: provisionResult.databaseId,\n\t\t\t\tlastDeploymentId: deployResult.deploymentId,\n\t\t\t})\n\t\t}\n\n\t\tlogger.success(`Deployment completed: ${deployResult.liveUrl}`)\n\t\tif (deployResult.syncUrl) {\n\t\t\tlogger.step(`Sync endpoint: ${deployResult.syncUrl}`)\n\t\t}\n\t},\n})\n\ninterface ResolvePlatformOptions {\n\tpromptClient: ReturnType<typeof createPromptClient>\n\tplatformArg: unknown\n\tstoredPlatform: DeployPlatform | undefined\n\tconfirm: boolean\n}\n\nasync function resolvePlatform(options: ResolvePlatformOptions): Promise<DeployPlatform> {\n\tif (typeof options.platformArg === 'string') {\n\t\tif (!isDeployPlatform(options.platformArg)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid --platform value \"${options.platformArg}\". Valid options: ${DEPLOY_PLATFORMS.join(', ')}`,\n\t\t\t)\n\t\t}\n\t\treturn options.platformArg\n\t}\n\n\tif (options.storedPlatform) {\n\t\treturn options.storedPlatform\n\t}\n\n\tif (options.confirm || !isInteractiveTerminal()) {\n\t\tthrow new Error(\n\t\t\t'Missing deploy platform in --confirm mode. Provide --platform or run an interactive deploy first.',\n\t\t)\n\t}\n\n\treturn await options.promptClient.select('Where do you want to deploy?', [\n\t\t{\n\t\t\tlabel: 'Fly.io (recommended for sync apps)',\n\t\t\tvalue: 'fly',\n\t\t},\n\t\t{\n\t\t\tlabel: 'Railway',\n\t\t\tvalue: 'railway',\n\t\t},\n\t\t{\n\t\t\tlabel: 'AWS ECS Fargate (production multi-instance)',\n\t\t\tvalue: 'aws-ecs',\n\t\t},\n\t\t{\n\t\t\tlabel: 'AWS Lightsail Containers (simple, cost-effective)',\n\t\t\tvalue: 'aws-lightsail',\n\t\t},\n\t\t{\n\t\t\tlabel: 'Render',\n\t\t\tvalue: 'render',\n\t\t},\n\t\t{\n\t\t\tlabel: 'Docker (self-hosted)',\n\t\t\tvalue: 'docker',\n\t\t},\n\t\t{\n\t\t\tlabel: 'Kora Cloud (coming soon)',\n\t\t\tvalue: 'kora-cloud',\n\t\t},\n\t])\n}\n\nfunction resolveAppName(\n\targValue: unknown,\n\tstoredValue: string | undefined,\n\tprojectRoot: string,\n\tconfirm: boolean,\n): string {\n\tif (typeof argValue === 'string' && argValue.length > 0) {\n\t\treturn sanitizeAppName(argValue)\n\t}\n\n\tif (storedValue && storedValue.length > 0) {\n\t\treturn storedValue\n\t}\n\n\tif (confirm) {\n\t\tthrow new Error(\n\t\t\t'Missing app name in --confirm mode. Provide --app or run an interactive deploy first.',\n\t\t)\n\t}\n\n\treturn sanitizeAppName(basename(projectRoot))\n}\n\nfunction resolveRegion(\n\targValue: unknown,\n\tstoredValue: string | null | undefined,\n\tconfirm: boolean,\n): string | null {\n\tif (typeof argValue === 'string' && argValue.length > 0) return argValue\n\tif (storedValue !== undefined) return storedValue\n\tif (confirm) {\n\t\tthrow new Error(\n\t\t\t'Missing region in --confirm mode. Provide --region or run an interactive deploy first.',\n\t\t)\n\t}\n\treturn 'iad'\n}\n\nfunction sanitizeAppName(value: string): string {\n\tconst normalized = value\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9-]+/g, '-')\n\t\t.replace(/-{2,}/g, '-')\n\t\t.replace(/^-|-$/g, '')\n\n\tif (normalized.length === 0) {\n\t\treturn 'kora-app'\n\t}\n\treturn normalized\n}\n\nasync function requireProjectRoot(): Promise<string> {\n\tconst projectRoot = await findProjectRoot()\n\tif (!projectRoot) {\n\t\tthrow new InvalidProjectError(process.cwd())\n\t}\n\treturn projectRoot\n}\n\nfunction isInteractiveTerminal(): boolean {\n\treturn process.stdin.isTTY === true && process.stdout.isTTY === true\n}\n\nfunction configureAdapterContext(\n\tadapter: DeployAdapter,\n\tcontext: { projectRoot: string; appName: string; region: string | null },\n): void {\n\tif (hasContextSetter(adapter)) {\n\t\tadapter.setContext(context)\n\t}\n}\n\nfunction detectDeployTarget(projectRoot: string): ProjectConfig['deployTarget'] {\n\treturn existsSync(join(projectRoot, 'src-tauri')) ? 'sync-server' : 'full-stack'\n}\n\nfunction hasContextSetter(adapter: DeployAdapter): adapter is ContextAwareDeployAdapter {\n\treturn typeof (adapter as ContextAwareDeployAdapter).setContext === 'function'\n}\n","export const DEPLOY_PLATFORMS = [\n\t'fly',\n\t'railway',\n\t'aws-ecs',\n\t'aws-lightsail',\n\t'render',\n\t'docker',\n\t'kora-cloud',\n] as const\n\nexport type DeployPlatform = (typeof DEPLOY_PLATFORMS)[number]\n\nexport interface ProjectConfig {\n\tprojectRoot: string\n\tappName: string\n\tregion: string | null\n\tenvironment: 'preview' | 'production'\n\tconfirm: boolean\n\tdeployTarget?: 'full-stack' | 'sync-server'\n}\n\nexport interface ProvisionResult {\n\tapplicationId: string\n\tdatabaseId: string | null\n\tsecretsSet: string[]\n}\n\nexport interface BuildArtifacts {\n\tclientDirectory: string | null\n\tserverBundlePath: string | null\n\tdeployDirectory: string\n}\n\nexport interface DeployResult {\n\tdeploymentId: string\n\tliveUrl: string\n\tsyncUrl: string | null\n}\n\nexport interface LogOptions {\n\tsince?: string\n\ttail?: number\n}\n\nexport interface LogLine {\n\ttimestamp: string\n\tlevel: 'debug' | 'info' | 'warn' | 'error'\n\tmessage: string\n}\n\nexport interface DeploymentStatus {\n\tstate: 'pending' | 'healthy' | 'failed' | 'unknown'\n\tmessage: string\n\tliveUrl?: string\n}\n\n/**\n * Contract implemented by each deployment platform integration.\n */\nexport interface DeployAdapter {\n\tname: DeployPlatform\n\tdetect(): Promise<boolean>\n\tinstall(): Promise<void>\n\tauthenticate(): Promise<void>\n\tprovision(config: ProjectConfig): Promise<ProvisionResult>\n\tbuild(config: ProjectConfig): Promise<BuildArtifacts>\n\tdeploy(artifacts: BuildArtifacts): Promise<DeployResult>\n\trollback(deploymentId: string): Promise<void>\n\tlogs(options: LogOptions): AsyncIterable<LogLine>\n\tstatus(): Promise<DeploymentStatus>\n}\n\n/**\n * Optional adapter extension for commands that require runtime context\n * (project root, app name, region) outside an initial provisioning run.\n */\nexport interface ContextAwareDeployAdapter extends DeployAdapter {\n\tsetContext(context: {\n\t\tprojectRoot: string\n\t\tappName: string\n\t\tregion: string | null\n\t}): void\n}\n\n/**\n * Checks whether the provided value is a known deploy platform.\n */\nexport function isDeployPlatform(value: string): value is DeployPlatform {\n\treturn (DEPLOY_PLATFORMS as readonly string[]).includes(value)\n}\n","import { spawn } from 'node:child_process'\nimport { join } from 'node:path'\nimport { createLogger } from '../../../utils/logger'\nimport { buildClient } from '../builder/client-builder'\nimport { bundleServer } from '../builder/server-bundler'\nimport type {\n\tBuildArtifacts,\n\tContextAwareDeployAdapter,\n\tDeployResult,\n\tDeploymentStatus,\n\tLogLine,\n\tLogOptions,\n\tProjectConfig,\n\tProvisionResult,\n} from './adapter'\n\n/**\n * Execution abstraction for AWS CLI interactions.\n */\nexport interface AwsCommandRunner {\n\trun(command: string, args: string[], cwd: string): Promise<AwsCommandResult>\n}\n\nexport interface AwsCommandResult {\n\texitCode: number\n\tstdout: string\n\tstderr: string\n}\n\nexport interface AwsEcsAdapterOptions {\n\trunner?: AwsCommandRunner\n\tcontext?: AwsEcsAdapterContext\n}\n\nexport interface AwsEcsAdapterContext {\n\tprojectRoot: string\n\tappName: string\n\tregion: string | null\n}\n\n/**\n * AWS ECS Fargate deploy adapter.\n *\n * Uses the AWS CLI to:\n * 1. Create an ECR repository for the Docker image\n * 2. Build and push the image to ECR\n * 3. Create/update an ECS Fargate service with an ALB\n *\n * Requires: `aws` CLI installed and configured with valid credentials.\n * Optionally uses `DATABASE_URL` env var for PostgreSQL (no EFS needed).\n *\n * Recommended for production multi-instance deployments.\n */\nexport class AwsEcsAdapter implements ContextAwareDeployAdapter {\n\tpublic readonly name = 'aws-ecs' as const\n\n\tprivate readonly logger = createLogger()\n\tprivate readonly runner: AwsCommandRunner\n\tprivate currentContext: AwsEcsAdapterContext | null\n\n\tpublic constructor(options: AwsEcsAdapterOptions = {}) {\n\t\tthis.runner = options.runner ?? new NodeAwsCommandRunner()\n\t\tthis.currentContext = options.context ?? null\n\t}\n\n\tpublic setContext(context: AwsEcsAdapterContext): void {\n\t\tthis.currentContext = context\n\t}\n\n\tpublic async detect(): Promise<boolean> {\n\t\tconst result = await this.runner.run('aws', ['--version'], process.cwd())\n\t\treturn result.exitCode === 0\n\t}\n\n\tpublic async install(): Promise<void> {\n\t\tconst available = await this.detect()\n\t\tif (!available) {\n\t\t\tthrow new Error(\n\t\t\t\t'AWS CLI is required but not installed. Install from https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html',\n\t\t\t)\n\t\t}\n\t}\n\n\tpublic async authenticate(): Promise<void> {\n\t\tconst cwd = this.currentContext?.projectRoot ?? process.cwd()\n\t\tconst result = await this.runner.run('aws', ['sts', 'get-caller-identity'], cwd)\n\t\tif (result.exitCode !== 0) {\n\t\t\tthrow new Error(\n\t\t\t\t'AWS CLI is not authenticated. Run `aws configure` or set AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY environment variables.',\n\t\t\t)\n\t\t}\n\t}\n\n\tpublic async provision(config: ProjectConfig): Promise<ProvisionResult> {\n\t\tthis.currentContext = {\n\t\t\tprojectRoot: config.projectRoot,\n\t\t\tappName: config.appName,\n\t\t\tregion: config.region ?? 'us-east-1',\n\t\t}\n\n\t\tconst region = config.region ?? 'us-east-1'\n\t\tconst repoName = `kora/${config.appName}`\n\n\t\t// Create ECR repository (idempotent)\n\t\tconst createRepo = await this.runner.run(\n\t\t\t'aws',\n\t\t\t[\n\t\t\t\t'ecr',\n\t\t\t\t'create-repository',\n\t\t\t\t'--repository-name',\n\t\t\t\trepoName,\n\t\t\t\t'--region',\n\t\t\t\tregion,\n\t\t\t\t'--image-scanning-configuration',\n\t\t\t\t'scanOnPush=true',\n\t\t\t],\n\t\t\tconfig.projectRoot,\n\t\t)\n\n\t\tif (\n\t\t\tcreateRepo.exitCode !== 0 &&\n\t\t\t!createRepo.stderr.includes('RepositoryAlreadyExistsException')\n\t\t) {\n\t\t\tthrow new Error(`Failed to create ECR repository: ${createRepo.stderr}`)\n\t\t}\n\n\t\t// Get AWS account ID for ECR URI\n\t\tconst identity = await this.runner.run(\n\t\t\t'aws',\n\t\t\t['sts', 'get-caller-identity', '--query', 'Account', '--output', 'text'],\n\t\t\tconfig.projectRoot,\n\t\t)\n\t\tconst accountId = identity.stdout.trim()\n\n\t\t// Create ECS cluster (idempotent)\n\t\tawait this.runner.run(\n\t\t\t'aws',\n\t\t\t['ecs', 'create-cluster', '--cluster-name', config.appName, '--region', region],\n\t\t\tconfig.projectRoot,\n\t\t)\n\n\t\t// Create CloudWatch log group\n\t\tawait this.runner.run(\n\t\t\t'aws',\n\t\t\t[\n\t\t\t\t'logs',\n\t\t\t\t'create-log-group',\n\t\t\t\t'--log-group-name',\n\t\t\t\t`/ecs/${config.appName}`,\n\t\t\t\t'--region',\n\t\t\t\tregion,\n\t\t\t],\n\t\t\tconfig.projectRoot,\n\t\t)\n\n\t\treturn {\n\t\t\tapplicationId: `${accountId}.dkr.ecr.${region}.amazonaws.com/${repoName}`,\n\t\t\tdatabaseId: null,\n\t\t\tsecretsSet: ['PORT'],\n\t\t}\n\t}\n\n\tpublic async build(config: ProjectConfig): Promise<BuildArtifacts> {\n\t\tthis.currentContext = {\n\t\t\tprojectRoot: config.projectRoot,\n\t\t\tappName: config.appName,\n\t\t\tregion: config.region,\n\t\t}\n\n\t\tconst deployDirectory = join(config.projectRoot, '.kora', 'deploy')\n\n\t\tawait bundleServer({\n\t\t\tprojectRoot: config.projectRoot,\n\t\t\tdeployDirectory,\n\t\t})\n\n\t\tconst client =\n\t\t\tconfig.deployTarget === 'sync-server'\n\t\t\t\t? null\n\t\t\t\t: await buildClient({\n\t\t\t\t\t\tprojectRoot: config.projectRoot,\n\t\t\t\t\t\toutDir: join(deployDirectory, 'dist'),\n\t\t\t\t\t\tmode: 'production',\n\t\t\t\t\t})\n\n\t\treturn {\n\t\t\tclientDirectory: client?.outDir ?? null,\n\t\t\tserverBundlePath: join(deployDirectory, 'server-bundled.js'),\n\t\t\tdeployDirectory,\n\t\t}\n\t}\n\n\tpublic async deploy(artifacts: BuildArtifacts): Promise<DeployResult> {\n\t\tconst context = this.requireContext()\n\t\tconst region = context.region ?? 'us-east-1'\n\t\tconst repoName = `kora/${context.appName}`\n\n\t\t// Get ECR login token\n\t\tconst loginPassword = await this.runner.run(\n\t\t\t'aws',\n\t\t\t['ecr', 'get-login-password', '--region', region],\n\t\t\tcontext.projectRoot,\n\t\t)\n\n\t\tif (loginPassword.exitCode !== 0) {\n\t\t\tthrow new Error(`ECR login failed: ${loginPassword.stderr}`)\n\t\t}\n\n\t\t// Get account ID\n\t\tconst identity = await this.runner.run(\n\t\t\t'aws',\n\t\t\t['sts', 'get-caller-identity', '--query', 'Account', '--output', 'text'],\n\t\t\tcontext.projectRoot,\n\t\t)\n\t\tconst accountId = identity.stdout.trim()\n\t\tconst ecrUri = `${accountId}.dkr.ecr.${region}.amazonaws.com`\n\t\tconst imageUri = `${ecrUri}/${repoName}:latest`\n\n\t\t// Docker login to ECR\n\t\tconst dockerLogin = await this.runner.run(\n\t\t\t'docker',\n\t\t\t['login', '--username', 'AWS', '--password-stdin', ecrUri],\n\t\t\tartifacts.deployDirectory,\n\t\t)\n\t\t// Note: password is piped via stdin in real usage; for the adapter we use the password result\n\n\t\t// Build Docker image\n\t\tthis.logger.step('Building Docker image...')\n\t\tconst dockerBuild = await this.runner.run(\n\t\t\t'docker',\n\t\t\t['build', '--platform', 'linux/amd64', '-t', imageUri, '.'],\n\t\t\tartifacts.deployDirectory,\n\t\t)\n\n\t\tif (dockerBuild.exitCode !== 0) {\n\t\t\tthrow new Error(`Docker build failed: ${dockerBuild.stderr}`)\n\t\t}\n\n\t\t// Push to ECR\n\t\tthis.logger.step('Pushing image to ECR...')\n\t\tconst dockerPush = await this.runner.run(\n\t\t\t'docker',\n\t\t\t['push', imageUri],\n\t\t\tartifacts.deployDirectory,\n\t\t)\n\n\t\tif (dockerPush.exitCode !== 0) {\n\t\t\tthrow new Error(`Docker push failed: ${dockerPush.stderr}`)\n\t\t}\n\n\t\t// Register task definition\n\t\tconst taskDef = JSON.stringify({\n\t\t\tfamily: context.appName,\n\t\t\tnetworkMode: 'awsvpc',\n\t\t\trequiresCompatibilities: ['FARGATE'],\n\t\t\tcpu: '256',\n\t\t\tmemory: '512',\n\t\t\texecutionRoleArn: `arn:aws:iam::${accountId}:role/ecsTaskExecutionRole`,\n\t\t\tcontainerDefinitions: [\n\t\t\t\t{\n\t\t\t\t\tname: context.appName,\n\t\t\t\t\timage: imageUri,\n\t\t\t\t\tessential: true,\n\t\t\t\t\tportMappings: [{ containerPort: 3001, protocol: 'tcp' }],\n\t\t\t\t\tlogConfiguration: {\n\t\t\t\t\t\tlogDriver: 'awslogs',\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\t'awslogs-group': `/ecs/${context.appName}`,\n\t\t\t\t\t\t\t'awslogs-region': region,\n\t\t\t\t\t\t\t'awslogs-stream-prefix': 'ecs',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\thealthCheck: {\n\t\t\t\t\t\tcommand: ['CMD-SHELL', 'curl -f http://localhost:3001/health || exit 1'],\n\t\t\t\t\t\tinterval: 30,\n\t\t\t\t\t\ttimeout: 5,\n\t\t\t\t\t\tretries: 3,\n\t\t\t\t\t\tstartPeriod: 60,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t})\n\n\t\tconst registerTask = await this.runner.run(\n\t\t\t'aws',\n\t\t\t['ecs', 'register-task-definition', '--cli-input-json', taskDef, '--region', region],\n\t\t\tcontext.projectRoot,\n\t\t)\n\n\t\tif (registerTask.exitCode !== 0) {\n\t\t\tthrow new Error(`Task definition registration failed: ${registerTask.stderr}`)\n\t\t}\n\n\t\t// Update or create ECS service\n\t\tconst updateService = await this.runner.run(\n\t\t\t'aws',\n\t\t\t[\n\t\t\t\t'ecs',\n\t\t\t\t'update-service',\n\t\t\t\t'--cluster',\n\t\t\t\tcontext.appName,\n\t\t\t\t'--service',\n\t\t\t\tcontext.appName,\n\t\t\t\t'--task-definition',\n\t\t\t\tcontext.appName,\n\t\t\t\t'--force-new-deployment',\n\t\t\t\t'--region',\n\t\t\t\tregion,\n\t\t\t],\n\t\t\tcontext.projectRoot,\n\t\t)\n\n\t\tconst deploymentId = new Date().toISOString()\n\n\t\tif (updateService.exitCode !== 0) {\n\t\t\tthis.logger.step('Service not found, creating new service...')\n\t\t\t// Service doesn't exist — developer needs to create it with proper VPC/subnet/ALB config.\n\t\t\t// We can't auto-create the full networking stack, so provide guidance.\n\t\t\tthis.logger.step(\n\t\t\t\t`Task definition registered. Create the ECS service with:\\n aws ecs create-service \\\\\\n --cluster ${context.appName} \\\\\\n --service-name ${context.appName} \\\\\\n --task-definition ${context.appName} \\\\\\n --desired-count 1 \\\\\\n --launch-type FARGATE \\\\\\n --network-configuration \"awsvpcConfiguration={subnets=[<subnet-id>],securityGroups=[<sg-id>],assignPublicIp=ENABLED}\" \\\\\\n --region ${region}`,\n\t\t\t)\n\t\t}\n\n\t\treturn {\n\t\t\tdeploymentId,\n\t\t\tliveUrl: `https://${context.appName}.${region}.amazonaws.com`,\n\t\t\tsyncUrl: `wss://${context.appName}.${region}.amazonaws.com/kora-sync`,\n\t\t}\n\t}\n\n\tpublic async rollback(deploymentId: string): Promise<void> {\n\t\tconst context = this.requireContext()\n\t\tconst region = context.region ?? 'us-east-1'\n\n\t\t// List task definition revisions and deploy the previous one\n\t\tconst result = await this.runner.run(\n\t\t\t'aws',\n\t\t\t[\n\t\t\t\t'ecs',\n\t\t\t\t'update-service',\n\t\t\t\t'--cluster',\n\t\t\t\tcontext.appName,\n\t\t\t\t'--service',\n\t\t\t\tcontext.appName,\n\t\t\t\t'--task-definition',\n\t\t\t\t`${context.appName}:${deploymentId}`,\n\t\t\t\t'--force-new-deployment',\n\t\t\t\t'--region',\n\t\t\t\tregion,\n\t\t\t],\n\t\t\tcontext.projectRoot,\n\t\t)\n\n\t\tif (result.exitCode !== 0) {\n\t\t\tthrow new Error(`ECS rollback failed: ${result.stderr}`)\n\t\t}\n\t}\n\n\tpublic async *logs(options: LogOptions): AsyncIterable<LogLine> {\n\t\tconst context = this.requireContext()\n\t\tconst region = context.region ?? 'us-east-1'\n\n\t\tconst args = [\n\t\t\t'logs',\n\t\t\t'get-log-events',\n\t\t\t'--log-group-name',\n\t\t\t`/ecs/${context.appName}`,\n\t\t\t'--log-stream-name',\n\t\t\t'ecs/latest',\n\t\t\t'--region',\n\t\t\tregion,\n\t\t]\n\n\t\tif (options.tail) {\n\t\t\targs.push('--limit', String(options.tail))\n\t\t}\n\n\t\tconst result = await this.runner.run('aws', args, context.projectRoot)\n\t\tif (result.exitCode !== 0) {\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(result.stdout) as {\n\t\t\t\tevents?: Array<{ timestamp: number; message: string }>\n\t\t\t}\n\t\t\tfor (const event of parsed.events ?? []) {\n\t\t\t\tyield {\n\t\t\t\t\ttimestamp: new Date(event.timestamp).toISOString(),\n\t\t\t\t\tlevel: inferLogLevel(event.message),\n\t\t\t\t\tmessage: event.message,\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Non-JSON output, yield raw lines\n\t\t\tfor (const line of result.stdout.split('\\n').filter(Boolean)) {\n\t\t\t\tyield { timestamp: new Date().toISOString(), level: 'info', message: line }\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic async status(): Promise<DeploymentStatus> {\n\t\tconst context = this.requireContext()\n\t\tconst region = context.region ?? 'us-east-1'\n\n\t\tconst result = await this.runner.run(\n\t\t\t'aws',\n\t\t\t[\n\t\t\t\t'ecs',\n\t\t\t\t'describe-services',\n\t\t\t\t'--cluster',\n\t\t\t\tcontext.appName,\n\t\t\t\t'--services',\n\t\t\t\tcontext.appName,\n\t\t\t\t'--region',\n\t\t\t\tregion,\n\t\t\t],\n\t\t\tcontext.projectRoot,\n\t\t)\n\n\t\tif (result.exitCode !== 0) {\n\t\t\treturn { state: 'failed', message: result.stderr }\n\t\t}\n\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(result.stdout) as {\n\t\t\t\tservices?: Array<{ status: string; runningCount: number; desiredCount: number }>\n\t\t\t}\n\t\t\tconst service = parsed.services?.[0]\n\t\t\tif (!service) {\n\t\t\t\treturn { state: 'unknown', message: 'Service not found' }\n\t\t\t}\n\n\t\t\tif (service.status === 'ACTIVE' && service.runningCount > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tstate: 'healthy',\n\t\t\t\t\tmessage: `Running ${service.runningCount}/${service.desiredCount} tasks`,\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tstate: service.runningCount === 0 ? 'pending' : 'healthy',\n\t\t\t\tmessage: `Status: ${service.status}, running: ${service.runningCount}/${service.desiredCount}`,\n\t\t\t}\n\t\t} catch {\n\t\t\treturn { state: 'unknown', message: 'Could not parse service status' }\n\t\t}\n\t}\n\n\tprivate requireContext(): AwsEcsAdapterContext {\n\t\tif (!this.currentContext) {\n\t\t\tthrow new Error('AWS ECS adapter context is not initialized. Run provision() first.')\n\t\t}\n\t\treturn this.currentContext\n\t}\n}\n\n/**\n * Default subprocess-backed runner for AWS CLI commands.\n */\nexport class NodeAwsCommandRunner implements AwsCommandRunner {\n\tpublic async run(command: string, args: string[], cwd: string): Promise<AwsCommandResult> {\n\t\treturn new Promise<AwsCommandResult>((resolve) => {\n\t\t\tconst child = spawn(command, args, {\n\t\t\t\tcwd,\n\t\t\t\tenv: process.env,\n\t\t\t\tstdio: ['ignore', 'pipe', 'pipe'],\n\t\t\t})\n\n\t\t\tlet stdout = ''\n\t\t\tlet stderr = ''\n\t\t\tchild.stdout?.on('data', (chunk: Buffer) => {\n\t\t\t\tstdout += chunk.toString('utf-8')\n\t\t\t})\n\t\t\tchild.stderr?.on('data', (chunk: Buffer) => {\n\t\t\t\tstderr += chunk.toString('utf-8')\n\t\t\t})\n\t\t\tchild.on('error', (error) => {\n\t\t\t\tresolve({ exitCode: 1, stdout, stderr: `${stderr}\\n${error.message}` })\n\t\t\t})\n\t\t\tchild.on('exit', (code) => {\n\t\t\t\tresolve({ exitCode: code ?? 1, stdout: stdout.trim(), stderr: stderr.trim() })\n\t\t\t})\n\t\t})\n\t}\n}\n\nfunction inferLogLevel(line: string): LogLine['level'] {\n\tconst normalized = line.toLowerCase()\n\tif (normalized.includes('error')) return 'error'\n\tif (normalized.includes('warn')) return 'warn'\n\tif (normalized.includes('debug')) return 'debug'\n\treturn 'info'\n}\n","import { spawn } from 'node:child_process'\nimport { existsSync } from 'node:fs'\nimport { copyFile, readdir } from 'node:fs/promises'\nimport { join, resolve } from 'node:path'\nimport { resolveProjectBinaryEntryPoint } from '../../../utils/fs-helpers'\n\n/**\n * Inputs used to execute a client build through Vite.\n */\nexport interface ClientBuildOptions {\n\tprojectRoot: string\n\toutDir: string\n\tmode?: 'development' | 'production'\n}\n\n/**\n * Result returned after a successful Vite build.\n */\nexport interface ClientBuildResult {\n\toutDir: string\n}\n\n/**\n * Builds the client bundle with the project's local Vite installation.\n *\n * After Vite completes, patches the output to ensure SQLite WASM assets\n * are present. The template's sqliteWasmHotfix Vite plugin writes to the\n * default `dist/` directory, but `kora deploy` redirects output to\n * `.kora/deploy/dist/`. This post-build step fills in any missing assets.\n */\nexport async function buildClient(options: ClientBuildOptions): Promise<ClientBuildResult> {\n\tconst viteEntryPoint = await resolveProjectBinaryEntryPoint(options.projectRoot, 'vite', 'vite')\n\tif (!viteEntryPoint) {\n\t\tthrow new Error(\n\t\t\t`Could not find local Vite binary in ${options.projectRoot}. Install dependencies before deploying.`,\n\t\t)\n\t}\n\n\tconst args = [\n\t\tviteEntryPoint,\n\t\t'build',\n\t\t'--outDir',\n\t\toptions.outDir,\n\t\t'--mode',\n\t\toptions.mode ?? 'production',\n\t]\n\n\tawait runProcess(process.execPath, args, options.projectRoot)\n\tawait patchSqliteWasmAssets(options.projectRoot, options.outDir)\n\treturn { outDir: options.outDir }\n}\n\n/**\n * Ensures the SQLite WASM assets required for OPFS are present in the build output.\n *\n * 1. Copies the content-hashed `sqlite3-XXXX.wasm` to `sqlite3.wasm` (Emscripten's\n * locateFile expects the unhashed name).\n * 2. Copies `sqlite3-opfs-async-proxy.js` from node_modules (dynamically loaded by\n * sqlite3, invisible to Vite's bundler).\n */\nasync function patchSqliteWasmAssets(projectRoot: string, outDir: string): Promise<void> {\n\tconst assetsDir = join(outDir, 'assets')\n\tif (!existsSync(assetsDir)) return\n\n\tconst files = await readdir(assetsDir)\n\n\t// Copy hashed sqlite3 WASM to unhashed name\n\tconst hashedWasm = files.find((f) => /^sqlite3-.+\\.wasm$/.test(f))\n\tif (hashedWasm && !files.includes('sqlite3.wasm')) {\n\t\tawait copyFile(join(assetsDir, hashedWasm), join(assetsDir, 'sqlite3.wasm'))\n\t}\n\n\t// Copy OPFS async proxy worker\n\tif (!files.includes('sqlite3-opfs-async-proxy.js')) {\n\t\tconst proxyFile = resolve(\n\t\t\tprojectRoot,\n\t\t\t'node_modules',\n\t\t\t'@sqlite.org',\n\t\t\t'sqlite-wasm',\n\t\t\t'sqlite-wasm',\n\t\t\t'jswasm',\n\t\t\t'sqlite3-opfs-async-proxy.js',\n\t\t)\n\t\tif (existsSync(proxyFile)) {\n\t\t\tawait copyFile(proxyFile, join(assetsDir, 'sqlite3-opfs-async-proxy.js'))\n\t\t}\n\t}\n}\n\nasync function runProcess(command: string, args: string[], cwd: string): Promise<void> {\n\tawait new Promise<void>((resolve, reject) => {\n\t\tconst child = spawn(command, args, {\n\t\t\tcwd,\n\t\t\tstdio: 'inherit',\n\t\t\tenv: process.env,\n\t\t})\n\n\t\tchild.on('error', (error) => {\n\t\t\treject(error)\n\t\t})\n\n\t\tchild.on('exit', (code) => {\n\t\t\tif (code === 0) {\n\t\t\t\tresolve()\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\treject(new Error(`Client build failed with exit code ${String(code ?? 'unknown')}.`))\n\t\t})\n\t})\n}\n","import { mkdir } from 'node:fs/promises'\nimport { access } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport { build } from 'esbuild'\n\n/**\n * Options used to produce a deployable server bundle artifact.\n */\nexport interface ServerBundleOptions {\n\tprojectRoot: string\n\tdeployDirectory: string\n\tentryFileCandidates?: readonly string[]\n}\n\n/**\n * Result details for the generated server bundle artifact.\n */\nexport interface ServerBundleResult {\n\tentryFilePath: string\n\toutputFilePath: string\n}\n\nconst DEFAULT_ENTRY_CANDIDATES = [\n\t'server.ts',\n\t'server.js',\n\t'src/server.ts',\n\t'src/server.js',\n] as const\n/**\n * Bundles the server entry into a single deployable JavaScript file.\n */\nexport async function bundleServer(options: ServerBundleOptions): Promise<ServerBundleResult> {\n\tconst candidates = options.entryFileCandidates ?? DEFAULT_ENTRY_CANDIDATES\n\tconst entryFilePath = await resolveServerEntry(options.projectRoot, candidates)\n\tif (!entryFilePath) {\n\t\tthrow new Error(\n\t\t\t`Could not find a server entry file in ${options.projectRoot}. Looked for: ${candidates.join(', ')}`,\n\t\t)\n\t}\n\n\tawait mkdir(options.deployDirectory, { recursive: true })\n\tconst outputFilePath = join(options.deployDirectory, 'server-bundled.js')\n\n\tawait build({\n\t\tentryPoints: [entryFilePath],\n\t\toutfile: outputFilePath,\n\t\tbundle: true,\n\t\tplatform: 'node',\n\t\tformat: 'esm',\n\t\ttarget: ['node20'],\n\t\tsourcemap: false,\n\t\tlogLevel: 'silent',\n\t\texternal: ['better-sqlite3'],\n\t\tbanner: {\n\t\t\tjs: \"import { createRequire as __createRequire } from 'module'; const require = __createRequire(import.meta.url);\",\n\t\t},\n\t})\n\n\treturn {\n\t\tentryFilePath,\n\t\toutputFilePath,\n\t}\n}\n\nasync function resolveServerEntry(\n\tprojectRoot: string,\n\tcandidates: readonly string[],\n): Promise<string | null> {\n\tfor (const candidate of candidates) {\n\t\tconst fullPath = join(projectRoot, candidate)\n\t\ttry {\n\t\t\tawait access(fullPath)\n\t\t\treturn fullPath\n\t\t} catch {\n\t\t\t// continue scanning candidates\n\t\t}\n\t}\n\n\treturn null\n}\n","import { spawn } from 'node:child_process'\nimport { join } from 'node:path'\nimport { createLogger } from '../../../utils/logger'\nimport { buildClient } from '../builder/client-builder'\nimport { bundleServer } from '../builder/server-bundler'\nimport type {\n\tBuildArtifacts,\n\tContextAwareDeployAdapter,\n\tDeployResult,\n\tDeploymentStatus,\n\tLogLine,\n\tLogOptions,\n\tProjectConfig,\n\tProvisionResult,\n} from './adapter'\n\n/**\n * Execution abstraction for AWS CLI interactions.\n */\nexport interface AwsLightsailCommandRunner {\n\trun(command: string, args: string[], cwd: string): Promise<AwsLightsailCommandResult>\n}\n\nexport interface AwsLightsailCommandResult {\n\texitCode: number\n\tstdout: string\n\tstderr: string\n}\n\nexport interface AwsLightsailAdapterOptions {\n\trunner?: AwsLightsailCommandRunner\n\tcontext?: AwsLightsailAdapterContext\n}\n\nexport interface AwsLightsailAdapterContext {\n\tprojectRoot: string\n\tappName: string\n\tregion: string | null\n}\n\n/**\n * AWS Lightsail Container Service deploy adapter.\n *\n * Uses the AWS CLI to:\n * 1. Create a Lightsail container service\n * 2. Build and push the Docker image\n * 3. Create a deployment with the container image\n *\n * Requires: `aws` CLI installed and configured with valid credentials,\n * plus the `lightsailctl` plugin for container image pushes.\n *\n * Recommended for simple, cost-effective container deployments.\n */\nexport class AwsLightsailAdapter implements ContextAwareDeployAdapter {\n\tpublic readonly name = 'aws-lightsail' as const\n\n\tprivate readonly logger = createLogger()\n\tprivate readonly runner: AwsLightsailCommandRunner\n\tprivate currentContext: AwsLightsailAdapterContext | null\n\n\tpublic constructor(options: AwsLightsailAdapterOptions = {}) {\n\t\tthis.runner = options.runner ?? new NodeAwsLightsailCommandRunner()\n\t\tthis.currentContext = options.context ?? null\n\t}\n\n\tpublic setContext(context: AwsLightsailAdapterContext): void {\n\t\tthis.currentContext = context\n\t}\n\n\tpublic async detect(): Promise<boolean> {\n\t\tconst result = await this.runner.run('aws', ['--version'], process.cwd())\n\t\treturn result.exitCode === 0\n\t}\n\n\tpublic async install(): Promise<void> {\n\t\tconst available = await this.detect()\n\t\tif (!available) {\n\t\t\tthrow new Error(\n\t\t\t\t'AWS CLI is required but not installed. Install from https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html',\n\t\t\t)\n\t\t}\n\t}\n\n\tpublic async authenticate(): Promise<void> {\n\t\tconst cwd = this.currentContext?.projectRoot ?? process.cwd()\n\t\tconst result = await this.runner.run('aws', ['sts', 'get-caller-identity'], cwd)\n\t\tif (result.exitCode !== 0) {\n\t\t\tthrow new Error(\n\t\t\t\t'AWS CLI is not authenticated. Run `aws configure` or set AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY environment variables.',\n\t\t\t)\n\t\t}\n\t}\n\n\tpublic async provision(config: ProjectConfig): Promise<ProvisionResult> {\n\t\tthis.currentContext = {\n\t\t\tprojectRoot: config.projectRoot,\n\t\t\tappName: config.appName,\n\t\t\tregion: config.region ?? 'us-east-1',\n\t\t}\n\n\t\tconst region = config.region ?? 'us-east-1'\n\t\tconst serviceName = sanitizeLightsailName(config.appName)\n\n\t\t// Create Lightsail container service (idempotent — errors if already exists)\n\t\tconst createService = await this.runner.run(\n\t\t\t'aws',\n\t\t\t[\n\t\t\t\t'lightsail',\n\t\t\t\t'create-container-service',\n\t\t\t\t'--service-name',\n\t\t\t\tserviceName,\n\t\t\t\t'--power',\n\t\t\t\t'nano',\n\t\t\t\t'--scale',\n\t\t\t\t'1',\n\t\t\t\t'--region',\n\t\t\t\tregion,\n\t\t\t],\n\t\t\tconfig.projectRoot,\n\t\t)\n\n\t\tif (createService.exitCode !== 0 && !createService.stderr.includes('already exists')) {\n\t\t\tthrow new Error(`Failed to create Lightsail container service: ${createService.stderr}`)\n\t\t}\n\n\t\treturn {\n\t\t\tapplicationId: serviceName,\n\t\t\tdatabaseId: null,\n\t\t\tsecretsSet: ['PORT'],\n\t\t}\n\t}\n\n\tpublic async build(config: ProjectConfig): Promise<BuildArtifacts> {\n\t\tthis.currentContext = {\n\t\t\tprojectRoot: config.projectRoot,\n\t\t\tappName: config.appName,\n\t\t\tregion: config.region,\n\t\t}\n\n\t\tconst deployDirectory = join(config.projectRoot, '.kora', 'deploy')\n\n\t\tawait bundleServer({\n\t\t\tprojectRoot: config.projectRoot,\n\t\t\tdeployDirectory,\n\t\t})\n\n\t\tconst client =\n\t\t\tconfig.deployTarget === 'sync-server'\n\t\t\t\t? null\n\t\t\t\t: await buildClient({\n\t\t\t\t\t\tprojectRoot: config.projectRoot,\n\t\t\t\t\t\toutDir: join(deployDirectory, 'dist'),\n\t\t\t\t\t\tmode: 'production',\n\t\t\t\t\t})\n\n\t\treturn {\n\t\t\tclientDirectory: client?.outDir ?? null,\n\t\t\tserverBundlePath: join(deployDirectory, 'server-bundled.js'),\n\t\t\tdeployDirectory,\n\t\t}\n\t}\n\n\tpublic async deploy(artifacts: BuildArtifacts): Promise<DeployResult> {\n\t\tconst context = this.requireContext()\n\t\tconst region = context.region ?? 'us-east-1'\n\t\tconst serviceName = sanitizeLightsailName(context.appName)\n\t\tconst imageTag = `${serviceName}:latest`\n\n\t\t// Build Docker image locally\n\t\tthis.logger.step('Building Docker image...')\n\t\tconst dockerBuild = await this.runner.run(\n\t\t\t'docker',\n\t\t\t['build', '--platform', 'linux/amd64', '-t', imageTag, '.'],\n\t\t\tartifacts.deployDirectory,\n\t\t)\n\n\t\tif (dockerBuild.exitCode !== 0) {\n\t\t\tthrow new Error(`Docker build failed: ${dockerBuild.stderr}`)\n\t\t}\n\n\t\t// Push image to Lightsail using lightsailctl plugin\n\t\tthis.logger.step('Pushing image to Lightsail...')\n\t\tconst pushImage = await this.runner.run(\n\t\t\t'aws',\n\t\t\t[\n\t\t\t\t'lightsail',\n\t\t\t\t'push-container-image',\n\t\t\t\t'--service-name',\n\t\t\t\tserviceName,\n\t\t\t\t'--label',\n\t\t\t\t'latest',\n\t\t\t\t'--image',\n\t\t\t\timageTag,\n\t\t\t\t'--region',\n\t\t\t\tregion,\n\t\t\t],\n\t\t\tartifacts.deployDirectory,\n\t\t)\n\n\t\tif (pushImage.exitCode !== 0) {\n\t\t\tthrow new Error(`Lightsail image push failed: ${pushImage.stderr}`)\n\t\t}\n\n\t\t// Parse the image reference from the push output\n\t\tconst lightsailImage = parseLightsailImageRef(pushImage.stdout) ?? `:${serviceName}.latest.1`\n\n\t\t// Create deployment\n\t\tthis.logger.step('Creating Lightsail deployment...')\n\t\tconst environment: Record<string, string> = { PORT: '3001' }\n\t\t// Pass through deployment-relevant env vars\n\t\tfor (const key of PASSTHROUGH_ENV_VARS) {\n\t\t\tconst value = process.env[key]\n\t\t\tif (value) {\n\t\t\t\tenvironment[key] = value\n\t\t\t}\n\t\t}\n\t\tconst containers = JSON.stringify({\n\t\t\t[serviceName]: {\n\t\t\t\timage: lightsailImage,\n\t\t\t\tports: { '3001': 'HTTP' },\n\t\t\t\tenvironment,\n\t\t\t},\n\t\t})\n\t\tconst publicEndpoint = JSON.stringify({\n\t\t\tcontainerName: serviceName,\n\t\t\tcontainerPort: 3001,\n\t\t\thealthCheck: {\n\t\t\t\tpath: '/health',\n\t\t\t\tintervalSeconds: 30,\n\t\t\t\ttimeoutSeconds: 5,\n\t\t\t\thealthyThreshold: 2,\n\t\t\t\tunhealthyThreshold: 3,\n\t\t\t},\n\t\t})\n\n\t\tconst createDeploy = await this.runner.run(\n\t\t\t'aws',\n\t\t\t[\n\t\t\t\t'lightsail',\n\t\t\t\t'create-container-service-deployment',\n\t\t\t\t'--service-name',\n\t\t\t\tserviceName,\n\t\t\t\t'--containers',\n\t\t\t\tcontainers,\n\t\t\t\t'--public-endpoint',\n\t\t\t\tpublicEndpoint,\n\t\t\t\t'--region',\n\t\t\t\tregion,\n\t\t\t],\n\t\t\tcontext.projectRoot,\n\t\t)\n\n\t\tif (createDeploy.exitCode !== 0) {\n\t\t\tthrow new Error(`Lightsail deployment failed: ${createDeploy.stderr}`)\n\t\t}\n\n\t\t// Get the service URL\n\t\tconst serviceInfo = await this.runner.run(\n\t\t\t'aws',\n\t\t\t['lightsail', 'get-container-services', '--service-name', serviceName, '--region', region],\n\t\t\tcontext.projectRoot,\n\t\t)\n\n\t\tconst rawUrl =\n\t\t\tparseLightsailUrl(serviceInfo.stdout) ??\n\t\t\t`https://${serviceName}.${region}.cs.amazonlightsail.com`\n\t\tconst serviceUrl = rawUrl.replace(/\\/+$/, '')\n\t\tconst deploymentId = new Date().toISOString()\n\n\t\treturn {\n\t\t\tdeploymentId,\n\t\t\tliveUrl: serviceUrl,\n\t\t\tsyncUrl: `${serviceUrl.replace('https://', 'wss://')}/kora-sync`,\n\t\t}\n\t}\n\n\tpublic async rollback(_deploymentId: string): Promise<void> {\n\t\tconst context = this.requireContext()\n\t\tconst region = context.region ?? 'us-east-1'\n\t\tconst serviceName = sanitizeLightsailName(context.appName)\n\n\t\t// Lightsail doesn't have a native rollback — get previous deployment version\n\t\t// and redeploy. For now, we list deployments and use the previous container image.\n\t\tconst deployments = await this.runner.run(\n\t\t\t'aws',\n\t\t\t[\n\t\t\t\t'lightsail',\n\t\t\t\t'get-container-service-deployments',\n\t\t\t\t'--service-name',\n\t\t\t\tserviceName,\n\t\t\t\t'--region',\n\t\t\t\tregion,\n\t\t\t],\n\t\t\tcontext.projectRoot,\n\t\t)\n\n\t\tif (deployments.exitCode !== 0) {\n\t\t\tthrow new Error(`Lightsail rollback failed: ${deployments.stderr}`)\n\t\t}\n\n\t\t// Parse previous deployment and re-create it\n\t\tconst previousDeployment = parsePreviousDeployment(deployments.stdout, serviceName)\n\t\tif (!previousDeployment) {\n\t\t\tthrow new Error('No previous deployment found to rollback to.')\n\t\t}\n\n\t\tconst redeploy = await this.runner.run(\n\t\t\t'aws',\n\t\t\t[\n\t\t\t\t'lightsail',\n\t\t\t\t'create-container-service-deployment',\n\t\t\t\t'--service-name',\n\t\t\t\tserviceName,\n\t\t\t\t'--containers',\n\t\t\t\tJSON.stringify(previousDeployment.containers),\n\t\t\t\t'--public-endpoint',\n\t\t\t\tJSON.stringify(previousDeployment.publicEndpoint),\n\t\t\t\t'--region',\n\t\t\t\tregion,\n\t\t\t],\n\t\t\tcontext.projectRoot,\n\t\t)\n\n\t\tif (redeploy.exitCode !== 0) {\n\t\t\tthrow new Error(`Lightsail rollback deployment failed: ${redeploy.stderr}`)\n\t\t}\n\t}\n\n\tpublic async *logs(options: LogOptions): AsyncIterable<LogLine> {\n\t\tconst context = this.requireContext()\n\t\tconst region = context.region ?? 'us-east-1'\n\t\tconst serviceName = sanitizeLightsailName(context.appName)\n\n\t\tconst args = [\n\t\t\t'lightsail',\n\t\t\t'get-container-log',\n\t\t\t'--service-name',\n\t\t\tserviceName,\n\t\t\t'--container-name',\n\t\t\tserviceName,\n\t\t\t'--region',\n\t\t\tregion,\n\t\t]\n\n\t\tif (options.since) {\n\t\t\targs.push('--start-time', options.since)\n\t\t}\n\n\t\tconst result = await this.runner.run('aws', args, context.projectRoot)\n\t\tif (result.exitCode !== 0) {\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(result.stdout) as {\n\t\t\t\tlogEvents?: Array<{ createdAt: string; message: string }>\n\t\t\t}\n\t\t\tconst events = parsed.logEvents ?? []\n\t\t\tconst limited = options.tail ? events.slice(-options.tail) : events\n\t\t\tfor (const event of limited) {\n\t\t\t\tyield {\n\t\t\t\t\ttimestamp: event.createdAt,\n\t\t\t\t\tlevel: inferLogLevel(event.message),\n\t\t\t\t\tmessage: event.message,\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\tfor (const line of result.stdout.split('\\n').filter(Boolean)) {\n\t\t\t\tyield { timestamp: new Date().toISOString(), level: 'info', message: line }\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic async status(): Promise<DeploymentStatus> {\n\t\tconst context = this.requireContext()\n\t\tconst region = context.region ?? 'us-east-1'\n\t\tconst serviceName = sanitizeLightsailName(context.appName)\n\n\t\tconst result = await this.runner.run(\n\t\t\t'aws',\n\t\t\t['lightsail', 'get-container-services', '--service-name', serviceName, '--region', region],\n\t\t\tcontext.projectRoot,\n\t\t)\n\n\t\tif (result.exitCode !== 0) {\n\t\t\treturn { state: 'failed', message: result.stderr }\n\t\t}\n\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(result.stdout) as {\n\t\t\t\tcontainerServices?: Array<{\n\t\t\t\t\tstate: string\n\t\t\t\t\turl: string\n\t\t\t\t\tcurrentDeployment?: { state: string }\n\t\t\t\t}>\n\t\t\t}\n\t\t\tconst service = parsed.containerServices?.[0]\n\t\t\tif (!service) {\n\t\t\t\treturn { state: 'unknown', message: 'Container service not found' }\n\t\t\t}\n\n\t\t\tconst deployState = service.currentDeployment?.state ?? 'UNKNOWN'\n\t\t\tif (service.state === 'RUNNING' && deployState === 'ACTIVE') {\n\t\t\t\treturn {\n\t\t\t\t\tstate: 'healthy',\n\t\t\t\t\tmessage: 'Lightsail container service is running',\n\t\t\t\t\tliveUrl: service.url,\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (service.state === 'DEPLOYING' || deployState === 'ACTIVATING') {\n\t\t\t\treturn {\n\t\t\t\t\tstate: 'pending',\n\t\t\t\t\tmessage: `Service: ${service.state}, Deployment: ${deployState}`,\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tstate: service.state === 'DISABLED' ? 'failed' : 'unknown',\n\t\t\t\tmessage: `Service: ${service.state}, Deployment: ${deployState}`,\n\t\t\t}\n\t\t} catch {\n\t\t\treturn { state: 'unknown', message: 'Could not parse service status' }\n\t\t}\n\t}\n\n\tprivate requireContext(): AwsLightsailAdapterContext {\n\t\tif (!this.currentContext) {\n\t\t\tthrow new Error('AWS Lightsail adapter context is not initialized. Run provision() first.')\n\t\t}\n\t\treturn this.currentContext\n\t}\n}\n\n/**\n * Default subprocess-backed runner for AWS CLI commands.\n */\nexport class NodeAwsLightsailCommandRunner implements AwsLightsailCommandRunner {\n\tpublic async run(\n\t\tcommand: string,\n\t\targs: string[],\n\t\tcwd: string,\n\t): Promise<AwsLightsailCommandResult> {\n\t\treturn new Promise<AwsLightsailCommandResult>((resolve) => {\n\t\t\tconst child = spawn(command, args, {\n\t\t\t\tcwd,\n\t\t\t\tenv: process.env,\n\t\t\t\tstdio: ['ignore', 'pipe', 'pipe'],\n\t\t\t})\n\n\t\t\tlet stdout = ''\n\t\t\tlet stderr = ''\n\t\t\tchild.stdout?.on('data', (chunk: Buffer) => {\n\t\t\t\tstdout += chunk.toString('utf-8')\n\t\t\t})\n\t\t\tchild.stderr?.on('data', (chunk: Buffer) => {\n\t\t\t\tstderr += chunk.toString('utf-8')\n\t\t\t})\n\t\t\tchild.on('error', (error) => {\n\t\t\t\tresolve({ exitCode: 1, stdout, stderr: `${stderr}\\n${error.message}` })\n\t\t\t})\n\t\t\tchild.on('exit', (code) => {\n\t\t\t\tresolve({ exitCode: code ?? 1, stdout: stdout.trim(), stderr: stderr.trim() })\n\t\t\t})\n\t\t})\n\t}\n}\n\n/**\n * Environment variables automatically forwarded from the host to the Lightsail container.\n */\nconst PASSTHROUGH_ENV_VARS = ['DATABASE_URL', 'AUTH_SECRET', 'PUBLIC_URL', 'NODE_ENV'] as const\n\n/**\n * Lightsail service names must be 2-255 chars, lowercase alphanumeric and hyphens only.\n */\nfunction sanitizeLightsailName(name: string): string {\n\treturn (\n\t\tname\n\t\t\t.toLowerCase()\n\t\t\t.replace(/[^a-z0-9-]/g, '-')\n\t\t\t.replace(/-{2,}/g, '-')\n\t\t\t.replace(/^-|-$/g, '')\n\t\t\t.slice(0, 255) || 'kora-app'\n\t)\n}\n\nfunction parseLightsailImageRef(output: string): string | null {\n\t// The push output contains a line like: \"Refer to this image as `:service.label.N` ...\"\n\tconst match = output.match(/Refer to this image as\\s+\"?(:[^\"\\s]+)\"?/i)\n\tif (match?.[1]) {\n\t\treturn match[1]\n\t}\n\t// Fallback: look for the image reference pattern\n\tconst refMatch = output.match(/(:\\S+\\.\\S+\\.\\d+)/)\n\treturn refMatch?.[1] ?? null\n}\n\nfunction parseLightsailUrl(rawJson: string): string | null {\n\ttry {\n\t\tconst parsed = JSON.parse(rawJson) as {\n\t\t\tcontainerServices?: Array<{ url?: string }>\n\t\t}\n\t\tconst url = parsed.containerServices?.[0]?.url\n\t\tif (typeof url === 'string' && url.length > 0) {\n\t\t\treturn url.startsWith('https://') ? url : `https://${url}`\n\t\t}\n\t\treturn null\n\t} catch {\n\t\treturn null\n\t}\n}\n\ninterface DeploymentConfig {\n\tcontainers: Record<string, unknown>\n\tpublicEndpoint: Record<string, unknown>\n}\n\nfunction parsePreviousDeployment(rawJson: string, serviceName: string): DeploymentConfig | null {\n\ttry {\n\t\tconst parsed = JSON.parse(rawJson) as {\n\t\t\tdeployments?: Array<{\n\t\t\t\tstate: string\n\t\t\t\tcontainers: Record<string, unknown>\n\t\t\t\tpublicEndpoint: Record<string, unknown>\n\t\t\t}>\n\t\t}\n\t\tconst deployments = parsed.deployments ?? []\n\t\t// Find the second deployment (index 1) — first is current, second is previous\n\t\tconst previous = deployments.length > 1 ? deployments[1] : null\n\t\tif (!previous) return null\n\n\t\treturn {\n\t\t\tcontainers: previous.containers,\n\t\t\tpublicEndpoint: previous.publicEndpoint,\n\t\t}\n\t} catch {\n\t\treturn null\n\t}\n}\n\nfunction inferLogLevel(line: string): LogLine['level'] {\n\tconst normalized = line.toLowerCase()\n\tif (normalized.includes('error')) return 'error'\n\tif (normalized.includes('warn')) return 'warn'\n\tif (normalized.includes('debug')) return 'debug'\n\treturn 'info'\n}\n","import { spawn } from 'node:child_process'\nimport { join } from 'node:path'\nimport { createLogger } from '../../../utils/logger'\nimport { writeFlyTomlArtifact } from '../artifacts/fly-toml-generator'\nimport { buildClient } from '../builder/client-builder'\nimport { bundleServer } from '../builder/server-bundler'\nimport type {\n\tBuildArtifacts,\n\tContextAwareDeployAdapter,\n\tDeployResult,\n\tDeploymentStatus,\n\tLogLine,\n\tLogOptions,\n\tProjectConfig,\n\tProvisionResult,\n} from './adapter'\n\n/**\n * Execution abstraction for Fly CLI shell interactions.\n * This keeps FlyAdapter deterministic and fully mockable in tests.\n */\nexport interface FlyCommandRunner {\n\trun(command: string, args: string[], cwd: string): Promise<FlyCommandResult>\n}\n\nexport interface FlyCommandResult {\n\texitCode: number\n\tstdout: string\n\tstderr: string\n}\n\nexport interface FlyAdapterOptions {\n\trunner?: FlyCommandRunner\n\tcontext?: FlyAdapterContext\n\tcommandCandidates?: readonly string[]\n}\n\n/**\n * Fly.io deploy adapter implementation for Phase 13.\n */\nexport class FlyAdapter implements ContextAwareDeployAdapter {\n\tpublic readonly name = 'fly' as const\n\n\tprivate readonly logger = createLogger()\n\tprivate readonly runner: FlyCommandRunner\n\tprivate readonly commandCandidates: readonly string[]\n\tprivate flyCommand: string | null = null\n\tprivate currentContext: FlyAdapterContext | null\n\tprivate lastDeploymentId: string | null = null\n\n\tpublic constructor(options: FlyAdapterOptions = {}) {\n\t\tthis.runner = options.runner ?? new NodeFlyCommandRunner()\n\t\tthis.commandCandidates = options.commandCandidates ?? DEFAULT_FLY_COMMAND_CANDIDATES\n\t\tthis.currentContext = options.context ?? null\n\t}\n\n\t/**\n\t * Seeds runtime context for non-provisioning commands.\n\t */\n\tpublic setContext(context: FlyAdapterContext): void {\n\t\tthis.currentContext = context\n\t}\n\n\t/**\n\t * Checks whether a Fly CLI executable can be resolved.\n\t */\n\tpublic async detect(): Promise<boolean> {\n\t\tconst command = await this.tryResolveFlyCommand(process.cwd())\n\t\treturn command !== null\n\t}\n\n\t/**\n\t * Ensures Fly CLI is available before deployment.\n\t */\n\tpublic async install(): Promise<void> {\n\t\tconst available = await this.detect()\n\t\tif (!available) {\n\t\t\tthrow new Error(\n\t\t\t\t'Fly CLI is required but not installed. Install from https://fly.io/docs/hands-on/install-flyctl/.',\n\t\t\t)\n\t\t}\n\t}\n\n\t/**\n\t * Performs Fly authentication check/login.\n\t */\n\tpublic async authenticate(): Promise<void> {\n\t\tconst projectRoot = this.currentContext?.projectRoot ?? process.cwd()\n\t\tconst status = await this.runFlyCommand(['auth', 'whoami', '--json'], projectRoot, false)\n\t\tif (status.exitCode === 0) return\n\n\t\tconst login = await this.runFlyCommand(['auth', 'login'], projectRoot, true)\n\t\tif (login.exitCode !== 0) {\n\t\t\tthrow new Error(`Fly authentication failed: ${normalizeError(login.stderr, login.stdout)}`)\n\t\t}\n\t}\n\n\t/**\n\t * Provisions app and optionally region-bound resources in Fly.\n\t */\n\tpublic async provision(config: ProjectConfig): Promise<ProvisionResult> {\n\t\tthis.currentContext = {\n\t\t\tprojectRoot: config.projectRoot,\n\t\t\tappName: config.appName,\n\t\t\tregion: config.region ?? 'iad',\n\t\t}\n\n\t\tconst appCreateArgs = ['apps', 'create', config.appName]\n\n\t\tconst createApp = await this.runFlyCommand(appCreateArgs, config.projectRoot, false)\n\t\tif (createApp.exitCode !== 0 && !isAlreadyExistsResponse(createApp.stderr, createApp.stdout)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Fly app provisioning failed for \"${config.appName}\": ${normalizeError(createApp.stderr, createApp.stdout)}`,\n\t\t\t)\n\t\t}\n\n\t\tconst secrets: string[] = []\n\t\tconst portSecret = await this.runFlyCommand(\n\t\t\t['secrets', 'set', 'PORT=3000', '--app', config.appName],\n\t\t\tconfig.projectRoot,\n\t\t\tfalse,\n\t\t)\n\t\tif (portSecret.exitCode === 0) {\n\t\t\tsecrets.push('PORT')\n\t\t}\n\n\t\treturn {\n\t\t\tapplicationId: config.appName,\n\t\t\tdatabaseId: null,\n\t\t\tsecretsSet: secrets,\n\t\t}\n\t}\n\n\t/**\n\t * Builds local artifacts consumed by Fly deploy.\n\t */\n\tpublic async build(config: ProjectConfig): Promise<BuildArtifacts> {\n\t\tthis.currentContext = {\n\t\t\tprojectRoot: config.projectRoot,\n\t\t\tappName: config.appName,\n\t\t\tregion: config.region,\n\t\t}\n\t\tconst deployDirectory = join(config.projectRoot, '.kora', 'deploy')\n\t\tawait writeFlyTomlArtifact(deployDirectory, {\n\t\t\tappName: config.appName,\n\t\t\tregion: config.region ?? 'iad',\n\t\t})\n\n\t\tawait bundleServer({\n\t\t\tprojectRoot: config.projectRoot,\n\t\t\tdeployDirectory,\n\t\t})\n\t\tconst client =\n\t\t\tconfig.deployTarget === 'sync-server'\n\t\t\t\t? null\n\t\t\t\t: await buildClient({\n\t\t\t\t\t\tprojectRoot: config.projectRoot,\n\t\t\t\t\t\toutDir: join(deployDirectory, 'dist'),\n\t\t\t\t\t\tmode: 'production',\n\t\t\t\t\t})\n\n\t\treturn {\n\t\t\tclientDirectory: client?.outDir ?? null,\n\t\t\tserverBundlePath: join(deployDirectory, 'server-bundled.js'),\n\t\t\tdeployDirectory,\n\t\t}\n\t}\n\n\t/**\n\t * Deploys generated artifacts to Fly and returns live endpoints.\n\t */\n\tpublic async deploy(artifacts: BuildArtifacts): Promise<DeployResult> {\n\t\tconst context = this.requireContext()\n\t\tconst deploy = await this.runFlyCommand(\n\t\t\t['deploy', '--config', 'fly.toml', '--app', context.appName],\n\t\t\tartifacts.deployDirectory,\n\t\t\ttrue,\n\t\t)\n\t\tif (deploy.exitCode !== 0) {\n\t\t\tthrow new Error(`Fly deployment failed: ${normalizeError(deploy.stderr, deploy.stdout)}`)\n\t\t}\n\n\t\tconst info = await this.runFlyCommand(\n\t\t\t['status', '--app', context.appName, '--json'],\n\t\t\tcontext.projectRoot,\n\t\t\tfalse,\n\t\t)\n\t\tconst hostname = parseFlyHostname(info.stdout) ?? `${context.appName}.fly.dev`\n\t\tconst deploymentId = parseFlyDeploymentId(info.stdout) ?? new Date().toISOString()\n\t\tthis.lastDeploymentId = deploymentId\n\n\t\treturn {\n\t\t\tdeploymentId,\n\t\t\tliveUrl: `https://${hostname}`,\n\t\t\tsyncUrl: `wss://${hostname}/kora-sync`,\n\t\t}\n\t}\n\n\t/**\n\t * Rolls back to a deployment version.\n\t */\n\tpublic async rollback(deploymentId: string): Promise<void> {\n\t\tconst context = this.requireContext()\n\t\tconst rollback = await this.runFlyCommand(\n\t\t\t['releases', 'revert', deploymentId, '--app', context.appName],\n\t\t\tcontext.projectRoot,\n\t\t\ttrue,\n\t\t)\n\t\tif (rollback.exitCode !== 0) {\n\t\t\tthrow new Error(`Fly rollback failed: ${normalizeError(rollback.stderr, rollback.stdout)}`)\n\t\t}\n\t}\n\n\t/**\n\t * Returns deployment logs as an async iterable.\n\t */\n\tpublic async *logs(options: LogOptions): AsyncIterable<LogLine> {\n\t\tconst context = this.requireContext()\n\t\tconst args = ['logs', '--app', context.appName, '--no-tail']\n\t\tif (typeof options.since === 'string' && options.since.length > 0) {\n\t\t\targs.push('--region', options.since)\n\t\t}\n\t\tconst result = await this.runFlyCommand(args, context.projectRoot, false)\n\t\tif (result.exitCode !== 0) {\n\t\t\tthrow new Error(`Fly logs failed: ${normalizeError(result.stderr, result.stdout)}`)\n\t\t}\n\n\t\tconst lines = result.stdout.split(/\\r?\\n/).filter((line) => line.length > 0)\n\t\tfor (const line of lines) {\n\t\t\tyield {\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\tlevel: inferLogLevel(line),\n\t\t\t\tmessage: line,\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Reads current deployment status from Fly.\n\t */\n\tpublic async status(): Promise<DeploymentStatus> {\n\t\tconst context = this.requireContext()\n\t\tconst status = await this.runFlyCommand(\n\t\t\t['status', '--app', context.appName, '--json'],\n\t\t\tcontext.projectRoot,\n\t\t\tfalse,\n\t\t)\n\t\tif (status.exitCode !== 0) {\n\t\t\treturn {\n\t\t\t\tstate: 'failed',\n\t\t\t\tmessage: normalizeError(status.stderr, status.stdout),\n\t\t\t}\n\t\t}\n\n\t\tconst hostname = parseFlyHostname(status.stdout)\n\t\treturn {\n\t\t\tstate: 'healthy',\n\t\t\tmessage: 'Fly deployment is healthy.',\n\t\t\tliveUrl: hostname ? `https://${hostname}` : undefined,\n\t\t}\n\t}\n\n\tprivate async runFlyCommand(\n\t\tflyArgs: string[],\n\t\tcwd: string,\n\t\tinheritOutput: boolean,\n\t): Promise<FlyCommandResult> {\n\t\tconst flyBinary = await this.resolveFlyCommand(cwd)\n\n\t\tif (inheritOutput) {\n\t\t\tthis.logger.step(`fly ${flyArgs.join(' ')}`)\n\t\t}\n\t\treturn await this.runner.run(flyBinary, flyArgs, cwd)\n\t}\n\n\tprivate requireContext(): FlyAdapterContext {\n\t\tif (!this.currentContext) {\n\t\t\tthrow new Error('Fly adapter context is not initialized. Run provision() first.')\n\t\t}\n\t\treturn this.currentContext\n\t}\n\n\tprivate async resolveFlyCommand(cwd: string): Promise<string> {\n\t\tif (this.flyCommand) {\n\t\t\treturn this.flyCommand\n\t\t}\n\n\t\tconst resolved = await this.tryResolveFlyCommand(cwd)\n\t\tif (!resolved) {\n\t\t\tthrow new Error('Could not resolve a usable Fly CLI command (tried flyctl, fly).')\n\t\t}\n\t\tthis.flyCommand = resolved\n\t\treturn resolved\n\t}\n\n\tprivate async tryResolveFlyCommand(cwd: string): Promise<string | null> {\n\t\tfor (const command of this.commandCandidates) {\n\t\t\tconst versionCheck = await this.runner.run(command, ['version'], cwd)\n\t\t\tif (versionCheck.exitCode === 0) {\n\t\t\t\treturn command\n\t\t\t}\n\t\t}\n\n\t\treturn null\n\t}\n}\n\n/**\n * Default subprocess-backed runner for Fly commands.\n */\nexport class NodeFlyCommandRunner implements FlyCommandRunner {\n\tpublic async run(command: string, args: string[], cwd: string): Promise<FlyCommandResult> {\n\t\treturn await new Promise<FlyCommandResult>((resolve) => {\n\t\t\tconst child = spawn(command, args, {\n\t\t\t\tcwd,\n\t\t\t\tenv: process.env,\n\t\t\t\tstdio: ['ignore', 'pipe', 'pipe'],\n\t\t\t})\n\n\t\t\tlet stdout = ''\n\t\t\tlet stderr = ''\n\t\t\tchild.stdout?.on('data', (chunk: Buffer) => {\n\t\t\t\tstdout += chunk.toString('utf-8')\n\t\t\t})\n\t\t\tchild.stderr?.on('data', (chunk: Buffer) => {\n\t\t\t\tstderr += chunk.toString('utf-8')\n\t\t\t})\n\t\t\tchild.on('error', (error) => {\n\t\t\t\tresolve({\n\t\t\t\t\texitCode: 1,\n\t\t\t\t\tstdout,\n\t\t\t\t\tstderr: `${stderr}\\n${error.message}`,\n\t\t\t\t})\n\t\t\t})\n\t\t\tchild.on('exit', (code) => {\n\t\t\t\tresolve({\n\t\t\t\t\texitCode: code ?? 1,\n\t\t\t\t\tstdout: stdout.trim(),\n\t\t\t\t\tstderr: stderr.trim(),\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t}\n}\n\nexport interface FlyAdapterContext {\n\tprojectRoot: string\n\tappName: string\n\tregion: string | null\n}\n\nconst DEFAULT_FLY_COMMAND_CANDIDATES = ['flyctl', 'fly'] as const\n\nfunction parseFlyHostname(rawJson: string): string | null {\n\tconst parsed = parseJsonRecord(rawJson)\n\tif (!parsed) return null\n\n\tconst hostname = parsed.Hostname\n\tif (typeof hostname === 'string' && hostname.length > 0) {\n\t\treturn hostname\n\t}\n\n\tconst hostnames = parsed.Hostnames\n\tif (Array.isArray(hostnames)) {\n\t\tconst first = hostnames.find((item) => typeof item === 'string')\n\t\tif (typeof first === 'string' && first.length > 0) {\n\t\t\treturn first\n\t\t}\n\t}\n\n\treturn null\n}\n\nfunction parseFlyDeploymentId(rawJson: string): string | null {\n\tconst parsed = parseJsonRecord(rawJson)\n\tif (!parsed) return null\n\n\tconst deploymentId = parsed.DeploymentID\n\tif (typeof deploymentId === 'string' && deploymentId.length > 0) {\n\t\treturn deploymentId\n\t}\n\n\tconst latestDeployment = parsed.LatestDeployment\n\tif (typeof latestDeployment === 'object' && latestDeployment !== null) {\n\t\tconst id = (latestDeployment as Record<string, unknown>).ID\n\t\tif (typeof id === 'string' && id.length > 0) {\n\t\t\treturn id\n\t\t}\n\t}\n\n\treturn null\n}\n\nfunction parseJsonRecord(value: string): Record<string, unknown> | null {\n\ttry {\n\t\tconst parsed = JSON.parse(value) as unknown\n\t\tif (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n\t\t\treturn parsed as Record<string, unknown>\n\t\t}\n\t\treturn null\n\t} catch {\n\t\treturn null\n\t}\n}\n\nfunction inferLogLevel(line: string): LogLine['level'] {\n\tconst normalized = line.toLowerCase()\n\tif (normalized.includes('error')) return 'error'\n\tif (normalized.includes('warn')) return 'warn'\n\tif (normalized.includes('debug')) return 'debug'\n\treturn 'info'\n}\n\nfunction normalizeError(stderr: string, stdout: string): string {\n\tif (stderr.length > 0) return stderr\n\tif (stdout.length > 0) return stdout\n\treturn 'unknown fly CLI error'\n}\n\nfunction isAlreadyExistsResponse(stderr: string, stdout: string): boolean {\n\tconst text = `${stderr}\\n${stdout}`.toLowerCase()\n\treturn text.includes('already exists') || text.includes('already been taken')\n}\n","import { mkdir, writeFile } from 'node:fs/promises'\nimport { join } from 'node:path'\n\nconst GENERATED_HEADER = '# Generated by kora deploy — do not edit manually'\n\n/**\n * Configuration options used to render `fly.toml`.\n */\nexport interface FlyTomlOptions {\n\tappName: string\n\tregion: string\n\tinternalPort?: number\n}\n\n/**\n * Generates a minimal Fly.io configuration file for Kora sync apps.\n */\nexport function generateFlyToml(options: FlyTomlOptions): string {\n\tconst internalPort = options.internalPort ?? 3000\n\n\treturn [\n\t\tGENERATED_HEADER,\n\t\t'',\n\t\t`app = \"${options.appName}\"`,\n\t\t`primary_region = \"${options.region}\"`,\n\t\t'',\n\t\t'[build]',\n\t\t` dockerfile = \"Dockerfile\"`,\n\t\t'',\n\t\t'[http_service]',\n\t\t` internal_port = ${String(internalPort)}`,\n\t\t' force_https = true',\n\t\t' auto_stop_machines = \"stop\"',\n\t\t' auto_start_machines = true',\n\t\t' min_machines_running = 0',\n\t\t'',\n\t\t' [[http_service.checks]]',\n\t\t' grace_period = \"10s\"',\n\t\t' interval = \"30s\"',\n\t\t' method = \"GET\"',\n\t\t' timeout = \"5s\"',\n\t\t' path = \"/health\"',\n\t\t'',\n\t].join('\\n')\n}\n\n/**\n * Writes `fly.toml` into `.kora/deploy`.\n */\nexport async function writeFlyTomlArtifact(\n\tdeployDirectory: string,\n\toptions: FlyTomlOptions,\n): Promise<string> {\n\tawait mkdir(deployDirectory, { recursive: true })\n\tconst filePath = join(deployDirectory, 'fly.toml')\n\tawait writeFile(filePath, generateFlyToml(options), 'utf-8')\n\treturn filePath\n}\n","import { spawn } from 'node:child_process'\nimport { join } from 'node:path'\nimport { createLogger } from '../../../utils/logger'\nimport { writeRailwayJsonArtifact } from '../artifacts/railway-json-generator'\nimport { buildClient } from '../builder/client-builder'\nimport { bundleServer } from '../builder/server-bundler'\nimport type {\n\tBuildArtifacts,\n\tContextAwareDeployAdapter,\n\tDeployResult,\n\tDeploymentStatus,\n\tLogLine,\n\tLogOptions,\n\tProjectConfig,\n\tProvisionResult,\n} from './adapter'\n\n/**\n * Execution abstraction for Railway CLI shell interactions.\n */\nexport interface RailwayCommandRunner {\n\trun(command: string, args: string[], cwd: string): Promise<RailwayCommandResult>\n}\n\nexport interface RailwayCommandResult {\n\texitCode: number\n\tstdout: string\n\tstderr: string\n}\n\nexport interface RailwayAdapterOptions {\n\trunner?: RailwayCommandRunner\n\tcontext?: RailwayAdapterContext\n\tcommandCandidates?: readonly string[]\n}\n\n/**\n * Railway deploy adapter implementation for Phase 13.\n */\nexport class RailwayAdapter implements ContextAwareDeployAdapter {\n\tpublic readonly name = 'railway' as const\n\n\tprivate readonly logger = createLogger()\n\tprivate readonly runner: RailwayCommandRunner\n\tprivate readonly commandCandidates: readonly string[]\n\tprivate railwayCommand: string | null = null\n\tprivate currentContext: RailwayAdapterContext | null\n\tprivate lastDeploymentId: string | null = null\n\n\tpublic constructor(options: RailwayAdapterOptions = {}) {\n\t\tthis.runner = options.runner ?? new NodeRailwayCommandRunner()\n\t\tthis.commandCandidates = options.commandCandidates ?? DEFAULT_RAILWAY_COMMAND_CANDIDATES\n\t\tthis.currentContext = options.context ?? null\n\t}\n\n\tpublic setContext(context: RailwayAdapterContext): void {\n\t\tthis.currentContext = context\n\t}\n\n\tpublic async detect(): Promise<boolean> {\n\t\tconst command = await this.tryResolveRailwayCommand(process.cwd())\n\t\treturn command !== null\n\t}\n\n\tpublic async install(): Promise<void> {\n\t\tconst available = await this.detect()\n\t\tif (!available) {\n\t\t\tthrow new Error(\n\t\t\t\t'Railway CLI is required but not installed. Install with `npm i -g @railway/cli` or see https://docs.railway.com/guides/cli.',\n\t\t\t)\n\t\t}\n\t}\n\n\tpublic async authenticate(): Promise<void> {\n\t\tconst projectRoot = this.currentContext?.projectRoot ?? process.cwd()\n\t\tconst whoami = await this.runRailwayCommand(['whoami'], projectRoot, false)\n\t\tif (whoami.exitCode === 0) return\n\n\t\tconst login = await this.runRailwayCommand(['login'], projectRoot, true)\n\t\tif (login.exitCode !== 0) {\n\t\t\tthrow new Error(\n\t\t\t\t`Railway authentication failed: ${normalizeError(login.stderr, login.stdout)}`,\n\t\t\t)\n\t\t}\n\t}\n\n\tpublic async provision(config: ProjectConfig): Promise<ProvisionResult> {\n\t\tthis.currentContext = {\n\t\t\tprojectRoot: config.projectRoot,\n\t\t\tappName: config.appName,\n\t\t\tregion: config.region,\n\t\t}\n\n\t\tconst init = await this.runRailwayCommand(\n\t\t\t['init', '--name', config.appName, '--confirm'],\n\t\t\tconfig.projectRoot,\n\t\t\tfalse,\n\t\t)\n\t\tif (init.exitCode !== 0 && !isAlreadyExistsResponse(init.stderr, init.stdout)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Railway project provisioning failed for \"${config.appName}\": ${normalizeError(init.stderr, init.stdout)}`,\n\t\t\t)\n\t\t}\n\n\t\tconst link = await this.runRailwayCommand(\n\t\t\t['link', '--project', config.appName, '--environment', config.environment, '--yes'],\n\t\t\tconfig.projectRoot,\n\t\t\tfalse,\n\t\t)\n\t\tif (link.exitCode !== 0 && !isAlreadyExistsResponse(link.stderr, link.stdout)) {\n\t\t\tthrow new Error(`Railway link failed: ${normalizeError(link.stderr, link.stdout)}`)\n\t\t}\n\n\t\tconst vars: string[] = []\n\t\tconst setPort = await this.runRailwayCommand(\n\t\t\t['variables', 'set', 'PORT=3000', '--yes'],\n\t\t\tconfig.projectRoot,\n\t\t\tfalse,\n\t\t)\n\t\tif (setPort.exitCode === 0) {\n\t\t\tvars.push('PORT')\n\t\t}\n\n\t\treturn {\n\t\t\tapplicationId: config.appName,\n\t\t\tdatabaseId: null,\n\t\t\tsecretsSet: vars,\n\t\t}\n\t}\n\n\tpublic async build(config: ProjectConfig): Promise<BuildArtifacts> {\n\t\tthis.currentContext = {\n\t\t\tprojectRoot: config.projectRoot,\n\t\t\tappName: config.appName,\n\t\t\tregion: config.region,\n\t\t}\n\t\tconst deployDirectory = join(config.projectRoot, '.kora', 'deploy')\n\t\tawait writeRailwayJsonArtifact(deployDirectory, {\n\t\t\tappName: config.appName,\n\t\t\tenvironment: config.environment,\n\t\t})\n\n\t\tawait bundleServer({\n\t\t\tprojectRoot: config.projectRoot,\n\t\t\tdeployDirectory,\n\t\t})\n\t\tconst client =\n\t\t\tconfig.deployTarget === 'sync-server'\n\t\t\t\t? null\n\t\t\t\t: await buildClient({\n\t\t\t\t\t\tprojectRoot: config.projectRoot,\n\t\t\t\t\t\toutDir: join(deployDirectory, 'dist'),\n\t\t\t\t\t\tmode: 'production',\n\t\t\t\t\t})\n\n\t\treturn {\n\t\t\tclientDirectory: client?.outDir ?? null,\n\t\t\tserverBundlePath: join(deployDirectory, 'server-bundled.js'),\n\t\t\tdeployDirectory,\n\t\t}\n\t}\n\n\tpublic async deploy(artifacts: BuildArtifacts): Promise<DeployResult> {\n\t\tconst context = this.requireContext()\n\t\tconst up = await this.runRailwayCommand(['up', '--yes'], artifacts.deployDirectory, true)\n\t\tif (up.exitCode !== 0) {\n\t\t\tthrow new Error(`Railway deployment failed: ${normalizeError(up.stderr, up.stdout)}`)\n\t\t}\n\n\t\tconst status = await this.runRailwayCommand(['status', '--json'], context.projectRoot, false)\n\t\tconst deploymentId = parseRailwayDeploymentId(status.stdout) ?? new Date().toISOString()\n\t\tconst liveUrl = parseRailwayUrl(status.stdout) ?? `https://${context.appName}.up.railway.app`\n\t\tthis.lastDeploymentId = deploymentId\n\n\t\treturn {\n\t\t\tdeploymentId,\n\t\t\tliveUrl,\n\t\t\tsyncUrl: toSyncUrl(liveUrl),\n\t\t}\n\t}\n\n\tpublic async rollback(deploymentId: string): Promise<void> {\n\t\tconst context = this.requireContext()\n\t\tconst rollback = await this.runRailwayCommand(\n\t\t\t['redeploy', '--deployment', deploymentId, '--yes'],\n\t\t\tcontext.projectRoot,\n\t\t\ttrue,\n\t\t)\n\t\tif (rollback.exitCode !== 0) {\n\t\t\tthrow new Error(\n\t\t\t\t`Railway rollback failed: ${normalizeError(rollback.stderr, rollback.stdout)}`,\n\t\t\t)\n\t\t}\n\t}\n\n\tpublic async *logs(options: LogOptions): AsyncIterable<LogLine> {\n\t\tconst context = this.requireContext()\n\t\tconst args = ['logs']\n\t\tif (typeof options.tail === 'number' && options.tail > 0) {\n\t\t\targs.push('--lines', String(options.tail))\n\t\t}\n\n\t\tconst result = await this.runRailwayCommand(args, context.projectRoot, false)\n\t\tif (result.exitCode !== 0) {\n\t\t\tthrow new Error(`Railway logs failed: ${normalizeError(result.stderr, result.stdout)}`)\n\t\t}\n\n\t\tconst lines = result.stdout.split(/\\r?\\n/).filter((line) => line.length > 0)\n\t\tfor (const line of lines) {\n\t\t\tyield {\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\tlevel: inferLogLevel(line),\n\t\t\t\tmessage: line,\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic async status(): Promise<DeploymentStatus> {\n\t\tconst context = this.requireContext()\n\t\tconst status = await this.runRailwayCommand(['status', '--json'], context.projectRoot, false)\n\t\tif (status.exitCode !== 0) {\n\t\t\treturn {\n\t\t\t\tstate: 'failed',\n\t\t\t\tmessage: normalizeError(status.stderr, status.stdout),\n\t\t\t}\n\t\t}\n\n\t\tconst liveUrl = parseRailwayUrl(status.stdout)\n\t\treturn {\n\t\t\tstate: 'healthy',\n\t\t\tmessage: 'Railway deployment is healthy.',\n\t\t\tliveUrl: liveUrl ?? undefined,\n\t\t}\n\t}\n\n\tprivate async runRailwayCommand(\n\t\trailwayArgs: string[],\n\t\tcwd: string,\n\t\tinheritOutput: boolean,\n\t): Promise<RailwayCommandResult> {\n\t\tconst command = await this.resolveRailwayCommand(cwd)\n\t\tif (inheritOutput) {\n\t\t\tthis.logger.step(`railway ${railwayArgs.join(' ')}`)\n\t\t}\n\t\treturn await this.runner.run(command, railwayArgs, cwd)\n\t}\n\n\tprivate requireContext(): RailwayAdapterContext {\n\t\tif (!this.currentContext) {\n\t\t\tthrow new Error('Railway adapter context is not initialized. Run provision() first.')\n\t\t}\n\t\treturn this.currentContext\n\t}\n\n\tprivate async resolveRailwayCommand(cwd: string): Promise<string> {\n\t\tif (this.railwayCommand) {\n\t\t\treturn this.railwayCommand\n\t\t}\n\t\tconst resolved = await this.tryResolveRailwayCommand(cwd)\n\t\tif (!resolved) {\n\t\t\tthrow new Error('Could not resolve a usable Railway CLI command (tried railway).')\n\t\t}\n\t\tthis.railwayCommand = resolved\n\t\treturn resolved\n\t}\n\n\tprivate async tryResolveRailwayCommand(cwd: string): Promise<string | null> {\n\t\tfor (const command of this.commandCandidates) {\n\t\t\tconst version = await this.runner.run(command, ['--version'], cwd)\n\t\t\tif (version.exitCode === 0) {\n\t\t\t\treturn command\n\t\t\t}\n\t\t}\n\t\treturn null\n\t}\n}\n\n/**\n * Default subprocess-backed runner for Railway commands.\n */\nexport class NodeRailwayCommandRunner implements RailwayCommandRunner {\n\tpublic async run(command: string, args: string[], cwd: string): Promise<RailwayCommandResult> {\n\t\treturn await new Promise<RailwayCommandResult>((resolve) => {\n\t\t\tconst child = spawn(command, args, {\n\t\t\t\tcwd,\n\t\t\t\tenv: process.env,\n\t\t\t\tstdio: ['ignore', 'pipe', 'pipe'],\n\t\t\t})\n\n\t\t\tlet stdout = ''\n\t\t\tlet stderr = ''\n\t\t\tchild.stdout?.on('data', (chunk: Buffer) => {\n\t\t\t\tstdout += chunk.toString('utf-8')\n\t\t\t})\n\t\t\tchild.stderr?.on('data', (chunk: Buffer) => {\n\t\t\t\tstderr += chunk.toString('utf-8')\n\t\t\t})\n\t\t\tchild.on('error', (error) => {\n\t\t\t\tresolve({\n\t\t\t\t\texitCode: 1,\n\t\t\t\t\tstdout,\n\t\t\t\t\tstderr: `${stderr}\\n${error.message}`,\n\t\t\t\t})\n\t\t\t})\n\t\t\tchild.on('exit', (code) => {\n\t\t\t\tresolve({\n\t\t\t\t\texitCode: code ?? 1,\n\t\t\t\t\tstdout: stdout.trim(),\n\t\t\t\t\tstderr: stderr.trim(),\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t}\n}\n\nexport interface RailwayAdapterContext {\n\tprojectRoot: string\n\tappName: string\n\tregion: string | null\n}\n\nconst DEFAULT_RAILWAY_COMMAND_CANDIDATES = ['railway'] as const\n\nfunction parseRailwayUrl(rawJson: string): string | null {\n\tconst record = parseJsonRecord(rawJson)\n\tif (!record) return null\n\n\tconst url = record.url\n\tif (typeof url === 'string' && url.length > 0) {\n\t\treturn ensureHttpsUrl(url)\n\t}\n\n\tconst service = record.service\n\tif (typeof service === 'object' && service !== null) {\n\t\tconst domain = (service as Record<string, unknown>).domain\n\t\tif (typeof domain === 'string' && domain.length > 0) {\n\t\t\treturn ensureHttpsUrl(domain)\n\t\t}\n\t}\n\n\treturn null\n}\n\nfunction parseRailwayDeploymentId(rawJson: string): string | null {\n\tconst record = parseJsonRecord(rawJson)\n\tif (!record) return null\n\n\tconst deploymentId = record.deploymentId\n\tif (typeof deploymentId === 'string' && deploymentId.length > 0) {\n\t\treturn deploymentId\n\t}\n\n\tconst deployment = record.deployment\n\tif (typeof deployment === 'object' && deployment !== null) {\n\t\tconst id = (deployment as Record<string, unknown>).id\n\t\tif (typeof id === 'string' && id.length > 0) {\n\t\t\treturn id\n\t\t}\n\t}\n\n\treturn null\n}\n\nfunction parseJsonRecord(value: string): Record<string, unknown> | null {\n\ttry {\n\t\tconst parsed = JSON.parse(value) as unknown\n\t\tif (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n\t\t\treturn parsed as Record<string, unknown>\n\t\t}\n\t\treturn null\n\t} catch {\n\t\treturn null\n\t}\n}\n\nfunction toSyncUrl(liveUrl: string): string | null {\n\ttry {\n\t\tconst url = new URL(liveUrl)\n\t\turl.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:'\n\t\turl.pathname = '/kora-sync'\n\t\treturn url.toString().replace(/\\/$/, '')\n\t} catch {\n\t\treturn null\n\t}\n}\n\nfunction ensureHttpsUrl(value: string): string {\n\tif (value.startsWith('http://') || value.startsWith('https://')) {\n\t\treturn value\n\t}\n\treturn `https://${value}`\n}\n\nfunction inferLogLevel(line: string): LogLine['level'] {\n\tconst normalized = line.toLowerCase()\n\tif (normalized.includes('error')) return 'error'\n\tif (normalized.includes('warn')) return 'warn'\n\tif (normalized.includes('debug')) return 'debug'\n\treturn 'info'\n}\n\nfunction normalizeError(stderr: string, stdout: string): string {\n\tif (stderr.length > 0) return stderr\n\tif (stdout.length > 0) return stdout\n\treturn 'unknown railway CLI error'\n}\n\nfunction isAlreadyExistsResponse(stderr: string, stdout: string): boolean {\n\tconst text = `${stderr}\\n${stdout}`.toLowerCase()\n\treturn text.includes('already exists')\n}\n","import { mkdir, writeFile } from 'node:fs/promises'\nimport { join } from 'node:path'\n\nconst GENERATED_HEADER = 'Generated by kora deploy - do not edit manually.'\n\n/**\n * Configuration used to render `railway.json`.\n */\nexport interface RailwayJsonOptions {\n\tappName: string\n\tregion?: string\n\tenvironment?: string\n\tstartCommand?: string\n\thealthcheckPath?: string\n}\n\ninterface RailwayJsonFile {\n\t$schema: string\n\tbuild: {\n\t\tbuilder: string\n\t\tdockerfilePath: string\n\t}\n\tdeploy: {\n\t\tstartCommand: string\n\t\thealthcheckPath: string\n\t\trestartPolicyType: 'on_failure'\n\t\trestartPolicyMaxRetries: number\n\t}\n\tmetadata: {\n\t\tgeneratedBy: string\n\t\tappName: string\n\t\tregion: string | undefined\n\t}\n}\n\n/**\n * Generates Railway deployment configuration in JSON format.\n */\nexport function generateRailwayJson(options: RailwayJsonOptions): string {\n\tconst file: RailwayJsonFile = {\n\t\t$schema: 'https://railway.app/railway.schema.json',\n\t\tbuild: {\n\t\t\tbuilder: 'DOCKERFILE',\n\t\t\tdockerfilePath: 'Dockerfile',\n\t\t},\n\t\tdeploy: {\n\t\t\tstartCommand: options.startCommand ?? 'node ./server-bundled.js',\n\t\t\thealthcheckPath: options.healthcheckPath ?? '/health',\n\t\t\trestartPolicyType: 'on_failure',\n\t\t\trestartPolicyMaxRetries: 3,\n\t\t},\n\t\tmetadata: {\n\t\t\tgeneratedBy: GENERATED_HEADER,\n\t\t\tappName: options.appName,\n\t\t\tregion: options.region,\n\t\t},\n\t}\n\n\treturn `${JSON.stringify(file, null, 2)}\\n`\n}\n\n/**\n * Writes `railway.json` into `.kora/deploy`.\n */\nexport async function writeRailwayJsonArtifact(\n\tdeployDirectory: string,\n\toptions: RailwayJsonOptions,\n): Promise<string> {\n\tawait mkdir(deployDirectory, { recursive: true })\n\tconst filePath = join(deployDirectory, 'railway.json')\n\tawait writeFile(filePath, generateRailwayJson(options), 'utf-8')\n\treturn filePath\n}\n","import type {\n\tBuildArtifacts,\n\tContextAwareDeployAdapter,\n\tDeployPlatform,\n\tDeployResult,\n\tDeploymentStatus,\n\tLogLine,\n\tLogOptions,\n\tProjectConfig,\n\tProvisionResult,\n} from './adapter'\n\n/**\n * Lightweight scaffold adapter used for platforms not yet implemented.\n * It provides explicit, deterministic errors while preserving the shared\n * adapter contract and command wiring across all platforms.\n */\nexport class StubDeployAdapter implements ContextAwareDeployAdapter {\n\tpublic readonly name: DeployPlatform\n\tprivate readonly contextLabel: string\n\n\tpublic constructor(platform: DeployPlatform) {\n\t\tthis.name = platform\n\t\tthis.contextLabel = `Deploy adapter \"${platform}\" is not implemented yet.`\n\t}\n\n\tpublic setContext(_context: {\n\t\tprojectRoot: string\n\t\tappName: string\n\t\tregion: string | null\n\t}): void {\n\t\t// Context is intentionally ignored for stub implementations.\n\t}\n\n\tpublic async detect(): Promise<boolean> {\n\t\treturn false\n\t}\n\n\tpublic async install(): Promise<void> {\n\t\tthrow this.notImplementedError()\n\t}\n\n\tpublic async authenticate(): Promise<void> {\n\t\tthrow this.notImplementedError()\n\t}\n\n\tpublic async provision(_config: ProjectConfig): Promise<ProvisionResult> {\n\t\tthrow this.notImplementedError()\n\t}\n\n\tpublic async build(_config: ProjectConfig): Promise<BuildArtifacts> {\n\t\tthrow this.notImplementedError()\n\t}\n\n\tpublic async deploy(_artifacts: BuildArtifacts): Promise<DeployResult> {\n\t\tthrow this.notImplementedError()\n\t}\n\n\tpublic async rollback(_deploymentId: string): Promise<void> {\n\t\tthrow this.notImplementedError()\n\t}\n\n\tpublic logs(_options: LogOptions): AsyncIterable<LogLine> {\n\t\tthrow this.notImplementedError()\n\t}\n\n\tpublic async status(): Promise<DeploymentStatus> {\n\t\treturn {\n\t\t\tstate: 'unknown',\n\t\t\tmessage: this.notImplementedMessage(),\n\t\t}\n\t}\n\n\tprivate notImplementedError(): Error {\n\t\treturn new Error(this.notImplementedMessage())\n\t}\n\n\tprivate notImplementedMessage(): string {\n\t\treturn `${this.contextLabel} Start with --platform fly for now.`\n\t}\n}\n","import type { DeployAdapter, DeployPlatform } from './adapter'\nimport { AwsEcsAdapter } from './aws-ecs-adapter'\nimport { AwsLightsailAdapter } from './aws-lightsail-adapter'\nimport { FlyAdapter } from './fly-adapter'\nimport { RailwayAdapter } from './railway-adapter'\nimport { StubDeployAdapter } from './stub-adapter'\n\n/**\n * Creates a deploy adapter instance for the selected platform.\n */\nexport function createDeployAdapter(platform: DeployPlatform): DeployAdapter {\n\tswitch (platform) {\n\t\tcase 'fly':\n\t\t\treturn new FlyAdapter()\n\t\tcase 'railway':\n\t\t\treturn new RailwayAdapter()\n\t\tcase 'aws-ecs':\n\t\t\treturn new AwsEcsAdapter()\n\t\tcase 'aws-lightsail':\n\t\t\treturn new AwsLightsailAdapter()\n\t\tcase 'render':\n\t\tcase 'docker':\n\t\tcase 'kora-cloud':\n\t\t\treturn new StubDeployAdapter(platform)\n\t\tdefault: {\n\t\t\tconst exhaustiveCheck: never = platform\n\t\t\treturn exhaustiveCheck\n\t\t}\n\t}\n}\n","import { mkdir, writeFile } from 'node:fs/promises'\nimport { join } from 'node:path'\n\nconst GENERATED_HEADER = '# Generated by kora deploy — do not edit manually'\n\n/**\n * Configuration for generating a production Dockerfile.\n */\nexport interface DockerfileOptions {\n\tnodeVersion?: string\n\tport?: number\n\tclientDirectory?: string | null\n\tserverBundleFile?: string\n\t/** Native modules that must be installed at runtime (externalized from bundle). */\n\tnativeDependencies?: Record<string, string>\n}\n\n/**\n * Generates a multi-stage Dockerfile for Kora deployments.\n *\n * The generated image expects artifacts produced under `.kora/deploy`:\n * - `dist/` for client assets\n * - `server-bundled.js` for server runtime entry\n * - `package.json` (if native dependencies are needed)\n */\nexport function generateDockerfile(options: DockerfileOptions = {}): string {\n\tconst nodeVersion = options.nodeVersion ?? '20-alpine'\n\tconst port = options.port ?? 3000\n\tconst clientDirectory = options.clientDirectory === undefined ? 'dist' : options.clientDirectory\n\tconst serverBundleFile = options.serverBundleFile ?? 'server-bundled.js'\n\tconst hasNativeDeps =\n\t\toptions.nativeDependencies && Object.keys(options.nativeDependencies).length > 0\n\n\tconst lines: string[] = [\n\t\tGENERATED_HEADER,\n\t\t'',\n\t\t`FROM node:${nodeVersion} AS runtime`,\n\t\t'WORKDIR /app',\n\t\t'ENV NODE_ENV=production',\n\t\t`ENV PORT=${String(port)}`,\n\t\t'',\n\t]\n\n\tif (hasNativeDeps) {\n\t\t// Alpine needs build tools for native modules like better-sqlite3\n\t\tlines.push('# Install build tools for native modules')\n\t\tlines.push('RUN apk add --no-cache python3 make g++')\n\t\tlines.push('')\n\t\tlines.push('COPY package.json ./package.json')\n\t\tlines.push('RUN npm install --omit=dev')\n\t\tlines.push('')\n\t}\n\n\tif (clientDirectory !== null) {\n\t\tlines.push(`COPY ${clientDirectory} ./dist`)\n\t}\n\tlines.push(`COPY ${serverBundleFile} ./server-bundled.js`)\n\tlines.push('')\n\tlines.push(`EXPOSE ${String(port)}`)\n\tlines.push('CMD [\"node\", \"./server-bundled.js\"]')\n\tlines.push('')\n\n\treturn lines.join('\\n')\n}\n\n/**\n * Generates a minimal package.json for native dependencies in the deploy container.\n */\nexport function generateDeployPackageJson(nativeDependencies: Record<string, string>): string {\n\tconst pkg = {\n\t\tname: 'kora-deploy',\n\t\tversion: '1.0.0',\n\t\tprivate: true,\n\t\ttype: 'module',\n\t\tdependencies: nativeDependencies,\n\t}\n\treturn `${JSON.stringify(pkg, null, 2)}\\n`\n}\n\n/**\n * Generates a `.dockerignore` tuned for Kora deploy output.\n */\nexport function generateDockerIgnore(): string {\n\treturn [\n\t\tGENERATED_HEADER,\n\t\t'',\n\t\t'node_modules',\n\t\t'npm-debug.log*',\n\t\t'pnpm-debug.log*',\n\t\t'yarn-error.log*',\n\t\t'.env',\n\t\t'.env.*',\n\t\t'.git',\n\t\t'.gitignore',\n\t\t'coverage',\n\t\t'.turbo',\n\t\t'*.test.ts',\n\t\t'*.spec.ts',\n\t\t'',\n\t].join('\\n')\n}\n\n/**\n * Writes the generated Dockerfile (and package.json if needed) to `.kora/deploy/`.\n */\nexport async function writeDockerfileArtifact(\n\tdeployDirectory: string,\n\toptions: DockerfileOptions = {},\n): Promise<string> {\n\tawait mkdir(deployDirectory, { recursive: true })\n\tconst dockerfilePath = join(deployDirectory, 'Dockerfile')\n\tawait writeFile(dockerfilePath, generateDockerfile(options), 'utf-8')\n\n\tif (options.nativeDependencies && Object.keys(options.nativeDependencies).length > 0) {\n\t\tconst pkgJsonPath = join(deployDirectory, 'package.json')\n\t\tawait writeFile(pkgJsonPath, generateDeployPackageJson(options.nativeDependencies), 'utf-8')\n\t}\n\n\treturn dockerfilePath\n}\n\n/**\n * Writes the generated `.dockerignore` to `.kora/deploy/.dockerignore`.\n */\nexport async function writeDockerIgnoreArtifact(deployDirectory: string): Promise<string> {\n\tawait mkdir(deployDirectory, { recursive: true })\n\tconst dockerIgnorePath = join(deployDirectory, '.dockerignore')\n\tawait writeFile(dockerIgnorePath, generateDockerIgnore(), 'utf-8')\n\treturn dockerIgnorePath\n}\n","import { mkdir, readFile, rm, writeFile } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport type { DeployPlatform } from '../adapters/adapter'\nimport { isDeployPlatform } from '../adapters/adapter'\n\nconst KORA_DEPLOY_DIRECTORY = join('.kora', 'deploy')\nconst DEPLOY_STATE_FILENAME = 'deploy.json'\n\n/**\n * Durable deployment settings stored for subsequent `kora deploy` runs.\n */\nexport interface DeployState {\n\tplatform: DeployPlatform\n\tappName: string\n\tregion: string | null\n\tprojectRoot: string\n\tliveUrl: string | null\n\tsyncUrl: string | null\n\tdatabaseId: string | null\n\tlastDeploymentId: string | null\n\tcreatedAt: string\n\tupdatedAt: string\n}\n\n/**\n * Input required to create a new deployment state record.\n */\nexport interface DeployStateCreateInput {\n\tplatform: DeployPlatform\n\tappName: string\n\tregion: string | null\n\tprojectRoot: string\n\tliveUrl?: string | null\n\tsyncUrl?: string | null\n\tdatabaseId?: string | null\n\tlastDeploymentId?: string | null\n}\n\n/**\n * Partial update fields for an existing deployment state record.\n */\nexport interface DeployStatePatch {\n\tplatform?: DeployPlatform\n\tappName?: string\n\tregion?: string | null\n\tprojectRoot?: string\n\tliveUrl?: string | null\n\tsyncUrl?: string | null\n\tdatabaseId?: string | null\n\tlastDeploymentId?: string | null\n}\n\n/**\n * Returns the absolute path to `.kora/deploy`.\n */\nexport function resolveDeployDirectory(projectRoot: string): string {\n\treturn join(projectRoot, KORA_DEPLOY_DIRECTORY)\n}\n\n/**\n * Returns the absolute path to `.kora/deploy/deploy.json`.\n */\nexport function resolveDeployStatePath(projectRoot: string): string {\n\treturn join(resolveDeployDirectory(projectRoot), DEPLOY_STATE_FILENAME)\n}\n\n/**\n * Loads deployment state from `.kora/deploy/deploy.json`.\n * Returns null when the file does not exist.\n */\nexport async function readDeployState(projectRoot: string): Promise<DeployState | null> {\n\tconst statePath = resolveDeployStatePath(projectRoot)\n\n\ttry {\n\t\tconst source = await readFile(statePath, 'utf-8')\n\t\tconst parsed = JSON.parse(source) as unknown\n\t\treturn parseDeployState(parsed)\n\t} catch (error) {\n\t\tconst code = (error as NodeJS.ErrnoException).code\n\t\tif (code === 'ENOENT') return null\n\t\tthrow error\n\t}\n}\n\n/**\n * Writes a brand-new deployment state record, replacing any existing file.\n */\nexport async function writeDeployState(\n\tprojectRoot: string,\n\tinput: DeployStateCreateInput,\n\tnow = new Date(),\n): Promise<DeployState> {\n\tconst timestamp = now.toISOString()\n\tconst state: DeployState = {\n\t\tplatform: input.platform,\n\t\tappName: input.appName,\n\t\tregion: input.region,\n\t\tprojectRoot: input.projectRoot,\n\t\tliveUrl: input.liveUrl ?? null,\n\t\tsyncUrl: input.syncUrl ?? null,\n\t\tdatabaseId: input.databaseId ?? null,\n\t\tlastDeploymentId: input.lastDeploymentId ?? null,\n\t\tcreatedAt: timestamp,\n\t\tupdatedAt: timestamp,\n\t}\n\n\tawait persistDeployState(projectRoot, state)\n\treturn state\n}\n\n/**\n * Applies a partial update to deployment state.\n * Throws when state does not exist.\n */\nexport async function updateDeployState(\n\tprojectRoot: string,\n\tpatch: DeployStatePatch,\n\tnow = new Date(),\n): Promise<DeployState> {\n\tconst existing = await readDeployState(projectRoot)\n\tif (!existing) {\n\t\tthrow new Error('Cannot update deploy state because deploy.json does not exist yet.')\n\t}\n\n\tconst nextState: DeployState = {\n\t\tplatform: patch.platform ?? existing.platform,\n\t\tappName: patch.appName ?? existing.appName,\n\t\tregion: patch.region === undefined ? existing.region : patch.region,\n\t\tprojectRoot: patch.projectRoot ?? existing.projectRoot,\n\t\tliveUrl: patch.liveUrl === undefined ? existing.liveUrl : patch.liveUrl,\n\t\tsyncUrl: patch.syncUrl === undefined ? existing.syncUrl : patch.syncUrl,\n\t\tdatabaseId: patch.databaseId === undefined ? existing.databaseId : patch.databaseId,\n\t\tlastDeploymentId:\n\t\t\tpatch.lastDeploymentId === undefined ? existing.lastDeploymentId : patch.lastDeploymentId,\n\t\tcreatedAt: existing.createdAt,\n\t\tupdatedAt: now.toISOString(),\n\t}\n\n\tawait persistDeployState(projectRoot, nextState)\n\treturn nextState\n}\n\n/**\n * Removes the entire `.kora/deploy` directory tree.\n */\nexport async function resetDeployState(projectRoot: string): Promise<void> {\n\tawait rm(resolveDeployDirectory(projectRoot), { recursive: true, force: true })\n}\n\nasync function persistDeployState(projectRoot: string, state: DeployState): Promise<void> {\n\tconst deployDir = resolveDeployDirectory(projectRoot)\n\tconst statePath = resolveDeployStatePath(projectRoot)\n\tawait mkdir(deployDir, { recursive: true })\n\tawait writeFile(statePath, `${JSON.stringify(state, null, 2)}\\n`, 'utf-8')\n}\n\nfunction parseDeployState(value: unknown): DeployState {\n\tif (typeof value !== 'object' || value === null || Array.isArray(value)) {\n\t\tthrow new Error('Invalid deploy state: expected an object.')\n\t}\n\n\tconst record = value as Record<string, unknown>\n\n\tconst platform = readPlatform(record.platform)\n\tconst appName = readString(record.appName, 'appName')\n\tconst region = readOptionalString(record.region, 'region')\n\tconst projectRoot = readString(record.projectRoot, 'projectRoot')\n\tconst liveUrl = readOptionalString(record.liveUrl, 'liveUrl')\n\tconst syncUrl = readOptionalString(record.syncUrl, 'syncUrl')\n\tconst databaseId = readOptionalString(record.databaseId, 'databaseId')\n\tconst lastDeploymentId = readOptionalString(record.lastDeploymentId, 'lastDeploymentId')\n\tconst createdAt = readString(record.createdAt, 'createdAt')\n\tconst updatedAt = readString(record.updatedAt, 'updatedAt')\n\n\treturn {\n\t\tplatform,\n\t\tappName,\n\t\tregion,\n\t\tprojectRoot,\n\t\tliveUrl,\n\t\tsyncUrl,\n\t\tdatabaseId,\n\t\tlastDeploymentId,\n\t\tcreatedAt,\n\t\tupdatedAt,\n\t}\n}\n\nfunction readPlatform(value: unknown): DeployPlatform {\n\tif (typeof value !== 'string' || !isDeployPlatform(value)) {\n\t\tthrow new Error('Invalid deploy state: \"platform\" must be a supported platform.')\n\t}\n\treturn value\n}\n\nfunction readString(value: unknown, field: string): string {\n\tif (typeof value !== 'string' || value.length === 0) {\n\t\tthrow new Error(`Invalid deploy state: \"${field}\" must be a non-empty string.`)\n\t}\n\treturn value\n}\n\nfunction readOptionalString(value: unknown, field: string): string | null {\n\tif (value === null) return null\n\tif (typeof value === 'string') return value\n\tthrow new Error(`Invalid deploy state: \"${field}\" must be a string or null.`)\n}\n","import { access } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport { resolve } from 'node:path'\nimport { defineCommand } from 'citty'\nimport { DevServerError, InvalidProjectError } from '../../errors'\nimport {\n\tfindProjectRoot,\n\tfindSchemaFile,\n\thasTsxInstalled,\n\tresolveProjectBinaryEntryPoint,\n} from '../../utils/fs-helpers'\nimport { createLogger } from '../../utils/logger'\nimport { loadKoraConfig } from './kora-config'\nimport type { KoraConfigFile } from './kora-config'\nimport { ProcessManager } from './process-manager'\nimport { SchemaWatcher } from './schema-watcher'\n\ninterface ManagedSyncStoreConfig {\n\ttype: 'memory' | 'sqlite' | 'postgres'\n\tfilename?: string\n\tconnectionString?: string\n}\n\n/**\n * The `dev` command — starts the Kora development environment.\n */\nexport const devCommand = defineCommand({\n\tmeta: {\n\t\tname: 'dev',\n\t\tdescription: 'Start the Kora development environment',\n\t},\n\targs: {\n\t\tport: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Vite dev server port',\n\t\t},\n\t\t'sync-port': {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Kora sync server port',\n\t\t},\n\t\t'no-sync': {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Disable sync server startup',\n\t\t\tdefault: false,\n\t\t},\n\t\t'no-watch': {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Disable schema file watching',\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tconst logger = createLogger()\n\n\t\tconst projectRoot = await findProjectRoot()\n\t\tif (!projectRoot) {\n\t\t\tthrow new InvalidProjectError(process.cwd())\n\t\t}\n\n\t\tconst config = await loadKoraConfig(projectRoot)\n\t\tconst vitePort = typeof args.port === 'string' ? args.port : String(config?.dev?.port ?? 5173)\n\t\tconst syncPortFromConfig =\n\t\t\ttypeof config?.dev?.sync === 'object' && typeof config.dev.sync.port === 'number'\n\t\t\t\t? config.dev.sync.port\n\t\t\t\t: 3001\n\t\tconst syncPort =\n\t\t\ttypeof args['sync-port'] === 'string' ? args['sync-port'] : String(syncPortFromConfig)\n\n\t\tconst configSyncEnabled =\n\t\t\tconfig?.dev?.sync === undefined ||\n\t\t\tconfig.dev.sync === true ||\n\t\t\t(typeof config.dev.sync === 'object' && config.dev.sync.enabled !== false)\n\n\t\tconst configWatchEnabled =\n\t\t\tconfig?.dev?.watch === undefined ||\n\t\t\tconfig.dev.watch === true ||\n\t\t\t(typeof config.dev.watch === 'object' && config.dev.watch.enabled !== false)\n\n\t\tconst watchDebounceMs =\n\t\t\ttypeof config?.dev?.watch === 'object' && typeof config.dev.watch.debounceMs === 'number'\n\t\t\t\t? config.dev.watch.debounceMs\n\t\t\t\t: 300\n\n\t\tconst viteEntryPoint = await resolveProjectBinaryEntryPoint(projectRoot, 'vite', 'vite')\n\t\tif (!viteEntryPoint) {\n\t\t\tthrow new DevServerError('vite', join(projectRoot, 'node_modules', '.bin', 'vite'))\n\t\t}\n\n\t\tconst syncServerFile = await findSyncServerFile(projectRoot)\n\t\tlet managedSyncStore = normalizeManagedSyncStore(config, projectRoot)\n\t\tconst postgresEnvRequested = isPostgresEnvRequested(config)\n\t\tconst syncAllowed = args['no-sync'] !== true && configSyncEnabled\n\t\tlet shouldStartSync = syncAllowed && (syncServerFile !== null || managedSyncStore !== null)\n\n\t\tlet hasTsx = false\n\t\tif (shouldStartSync && syncServerFile !== null) {\n\t\t\thasTsx = await hasTsxInstalled(projectRoot)\n\t\t\tif (!hasTsx) {\n\t\t\t\tlogger.warn('Sync server detected, but \"tsx\" is not installed. Skipping sync.')\n\t\t\t}\n\t\t}\n\n\t\tif (shouldStartSync && syncServerFile === null && managedSyncStore) {\n\t\t\tconst hasServerPackage = await fileExists(\n\t\t\t\tjoin(projectRoot, 'node_modules', '@korajs', 'server', 'package.json'),\n\t\t\t)\n\t\t\tif (!hasServerPackage) {\n\t\t\t\tlogger.warn(\n\t\t\t\t\t'Managed sync is configured, but @korajs/server is not installed. Install it or add server.ts.',\n\t\t\t\t)\n\t\t\t\tmanagedSyncStore = null\n\t\t\t\tshouldStartSync = syncAllowed && (syncServerFile !== null || managedSyncStore !== null)\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\tsyncAllowed &&\n\t\t\tsyncServerFile === null &&\n\t\t\tmanagedSyncStore === null &&\n\t\t\tpostgresEnvRequested\n\t\t) {\n\t\t\tlogger.warn(\n\t\t\t\t'Managed postgres sync requested but no connection string found. Set dev.sync.store.connectionString or DATABASE_URL.',\n\t\t\t)\n\t\t}\n\n\t\tlet configuredSchemaPath: string | null = null\n\t\tif (typeof config?.schema === 'string') {\n\t\t\tconst candidate = resolve(projectRoot, config.schema)\n\t\t\tif (await fileExists(candidate)) {\n\t\t\t\tconfiguredSchemaPath = candidate\n\t\t\t} else {\n\t\t\t\tlogger.warn(\n\t\t\t\t\t`Configured schema file not found: ${candidate}. Falling back to auto-detection.`,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\tconst schemaPath = configuredSchemaPath ?? (await findSchemaFile(projectRoot))\n\t\tconst watchEnabled = args['no-watch'] !== true && configWatchEnabled && schemaPath !== null\n\n\t\tconst processManager = new ProcessManager()\n\t\tlet schemaWatcher: SchemaWatcher | null = null\n\t\tlet shuttingDown = false\n\t\tlet resolveFinished: (() => void) | undefined\n\t\tconst finished = new Promise<void>((resolve) => {\n\t\t\tresolveFinished = resolve\n\t\t})\n\n\t\tconst onManagedProcessExit = () => {\n\t\t\tif (!processManager.hasRunning() && !shuttingDown) {\n\t\t\t\tresolveFinished?.()\n\t\t\t}\n\t\t}\n\n\t\tconst shutdown = async () => {\n\t\t\tif (shuttingDown) return\n\t\t\tshuttingDown = true\n\t\t\tschemaWatcher?.stop()\n\t\t\tawait processManager.shutdownAll()\n\t\t\tresolveFinished?.()\n\t\t}\n\n\t\tconst onSigInt = () => {\n\t\t\tvoid shutdown()\n\t\t}\n\t\tconst onSigTerm = () => {\n\t\t\tvoid shutdown()\n\t\t}\n\n\t\tprocess.on('SIGINT', onSigInt)\n\t\tprocess.on('SIGTERM', onSigTerm)\n\n\t\tlogger.banner()\n\t\tlogger.info('Starting development environment:')\n\t\tlogger.blank()\n\t\tlogger.step(` Vite dev server on port ${vitePort}`)\n\t\tif (shouldStartSync && hasTsx && syncServerFile) {\n\t\t\tlogger.step(` Sync server on port ${syncPort}`)\n\t\t} else if (shouldStartSync && syncServerFile === null && managedSyncStore !== null) {\n\t\t\tlogger.step(` Managed sync server on port ${syncPort} (${managedSyncStore.type})`)\n\t\t} else if (syncAllowed && syncServerFile === null) {\n\t\t\tlogger.step(' Sync server configured but no server.ts/server.js or managed store found')\n\t\t} else if (!syncAllowed) {\n\t\t\tlogger.step(' Sync server disabled via --no-sync')\n\t\t}\n\n\t\tif (watchEnabled && schemaPath) {\n\t\t\tlogger.step(` Schema watcher enabled (${schemaPath})`)\n\t\t} else if (args['no-watch'] === true) {\n\t\t\tlogger.step(' Schema watcher disabled via --no-watch')\n\t\t} else {\n\t\t\tlogger.step(' Schema watcher disabled (schema.ts not found)')\n\t\t}\n\t\tlogger.blank()\n\n\t\tlogger.step(' Kora DevTools overlay: Ctrl+Shift+K (Cmd+Shift+K on macOS) when devtools: true')\n\n\t\tprocessManager.spawn({\n\t\t\tlabel: 'vite',\n\t\t\tcommand: process.execPath,\n\t\t\targs: [viteEntryPoint, '--port', String(vitePort)],\n\t\t\tcwd: projectRoot,\n\t\t\tenv: {\n\t\t\t\tKORA_DEV: '1',\n\t\t\t},\n\t\t\tonExit: onManagedProcessExit,\n\t\t})\n\n\t\tif (shouldStartSync && hasTsx && syncServerFile) {\n\t\t\tprocessManager.spawn({\n\t\t\t\tlabel: 'sync',\n\t\t\t\tcommand: process.execPath,\n\t\t\t\targs: ['--import', 'tsx', syncServerFile],\n\t\t\t\tcwd: projectRoot,\n\t\t\t\tenv: {\n\t\t\t\t\tPORT: String(syncPort),\n\t\t\t\t\tKORA_SYNC_PORT: String(syncPort),\n\t\t\t\t},\n\t\t\t\tonExit: onManagedProcessExit,\n\t\t\t})\n\t\t}\n\n\t\tif (shouldStartSync && syncServerFile === null && managedSyncStore !== null) {\n\t\t\tprocessManager.spawn({\n\t\t\t\tlabel: 'sync',\n\t\t\t\tcommand: process.execPath,\n\t\t\t\targs: ['--input-type=module', '--eval', MANAGED_SYNC_BOOTSTRAP_SCRIPT],\n\t\t\t\tcwd: projectRoot,\n\t\t\t\tenv: {\n\t\t\t\t\tKORA_DEV_SYNC_CONFIG: JSON.stringify({\n\t\t\t\t\t\tport: Number(syncPort),\n\t\t\t\t\t\tstore: managedSyncStore,\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\tonExit: onManagedProcessExit,\n\t\t\t})\n\t\t}\n\n\t\tif (watchEnabled && schemaPath) {\n\t\t\tschemaWatcher = new SchemaWatcher({\n\t\t\t\tschemaPath,\n\t\t\t\tprojectRoot,\n\t\t\t\tdebounceMs: watchDebounceMs,\n\t\t\t\tonRegenerate: () => {\n\t\t\t\t\tlogger.success('Regenerated types from schema changes')\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\tlogger.error(`Schema watcher error: ${error.message}`)\n\t\t\t\t},\n\t\t\t})\n\t\t\tschemaWatcher.start()\n\t\t}\n\n\t\tawait finished\n\t\tprocess.off('SIGINT', onSigInt)\n\t\tprocess.off('SIGTERM', onSigTerm)\n\t},\n})\n\nasync function findSyncServerFile(projectRoot: string): Promise<string | null> {\n\tconst candidates = [join(projectRoot, 'server.ts'), join(projectRoot, 'server.js')]\n\n\tfor (const candidate of candidates) {\n\t\ttry {\n\t\t\tawait access(candidate)\n\t\t\treturn candidate\n\t\t} catch {\n\t\t\t// continue\n\t\t}\n\t}\n\n\treturn null\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n\ttry {\n\t\tawait access(path)\n\t\treturn true\n\t} catch {\n\t\treturn false\n\t}\n}\n\nfunction normalizeManagedSyncStore(\n\tconfig: KoraConfigFile | null,\n\tprojectRoot: string,\n): ManagedSyncStoreConfig | null {\n\tconst sync = config?.dev?.sync\n\tif (typeof sync !== 'object' || sync === null) return null\n\n\tconst store = sync.store\n\tif (store === undefined) return { type: 'memory' }\n\n\tif (store === 'memory') return { type: 'memory' }\n\tif (store === 'sqlite') return { type: 'sqlite', filename: join(projectRoot, 'kora-sync.db') }\n\tif (store === 'postgres') {\n\t\tconst connectionString = process.env.DATABASE_URL\n\t\tif (!connectionString) return null\n\t\treturn { type: 'postgres', connectionString }\n\t}\n\n\tif (typeof store === 'object' && store !== null) {\n\t\tif (store.type === 'memory') return { type: 'memory' }\n\t\tif (store.type === 'sqlite') {\n\t\t\tconst filename =\n\t\t\t\ttypeof store.filename === 'string' && store.filename.length > 0\n\t\t\t\t\t? resolve(projectRoot, store.filename)\n\t\t\t\t\t: join(projectRoot, 'kora-sync.db')\n\t\t\treturn { type: 'sqlite', filename }\n\t\t}\n\t\tif (store.type === 'postgres' && typeof store.connectionString === 'string') {\n\t\t\treturn { type: 'postgres', connectionString: store.connectionString }\n\t\t}\n\t}\n\n\treturn null\n}\n\nfunction isPostgresEnvRequested(config: KoraConfigFile | null): boolean {\n\tconst sync = config?.dev?.sync\n\tif (typeof sync !== 'object' || sync === null) return false\n\tif (sync.store === 'postgres') return true\n\tif (typeof sync.store === 'object' && sync.store !== null && sync.store.type === 'postgres')\n\t\treturn true\n\treturn false\n}\n\nconst MANAGED_SYNC_BOOTSTRAP_SCRIPT = `\nconst config = JSON.parse(process.env.KORA_DEV_SYNC_CONFIG ?? '{}');\nconst {\n createKoraServer,\n MemoryServerStore,\n createSqliteServerStore,\n createPostgresServerStore,\n} = await import('@korajs/server');\nconst storeConfig = config.store ?? { type: 'memory' };\nlet store;\nif (storeConfig.type === 'memory') {\n store = new MemoryServerStore();\n} else if (storeConfig.type === 'sqlite') {\n const filename = typeof storeConfig.filename === 'string' && storeConfig.filename.length > 0\n ? storeConfig.filename\n : './kora-sync.db';\n store = createSqliteServerStore({ filename });\n} else if (storeConfig.type === 'postgres') {\n if (typeof storeConfig.connectionString !== 'string' || storeConfig.connectionString.length === 0) {\n throw new Error('Managed postgres sync requires a connectionString');\n }\n store = await createPostgresServerStore({\n connectionString: storeConfig.connectionString,\n });\n} else {\n throw new Error('Unsupported managed sync store type: ' + String(storeConfig.type));\n}\nconst server = createKoraServer({ store, port: Number(config.port ?? 3001) });\nconst shutdown = async () => {\n try {\n await server.stop();\n } catch {\n }\n process.exit(0);\n};\nprocess.on('SIGINT', () => {\n void shutdown();\n});\nprocess.on('SIGTERM', () => {\n void shutdown();\n});\nawait server.start();\nprocess.stdout.write('Managed sync server running on ws://localhost:' + String(config.port ?? 3001) + '\\\\n');\nawait new Promise(() => {});\n`\n","import { spawn as spawnChild } from 'node:child_process'\nimport type { ChildProcess, SpawnOptions } from 'node:child_process'\n\nexport interface ManagedProcessConfig {\n\tlabel: string\n\tcommand: string\n\targs: string[]\n\tcwd: string\n\tenv?: Record<string, string>\n\tonExit?: (code: number | null, signal: NodeJS.Signals | null) => void\n}\n\ninterface RunningProcess {\n\tchild: ChildProcess\n\texitPromise: Promise<void>\n\tstdoutBuffer: string\n\tstderrBuffer: string\n}\n\n/**\n * Manages long-running child processes for the dev command.\n */\nexport class ProcessManager {\n\tprivate readonly processes = new Map<string, RunningProcess>()\n\n\tspawn(config: ManagedProcessConfig): void {\n\t\tconst options: SpawnOptions = {\n\t\t\tcwd: config.cwd,\n\t\t\tenv: { ...process.env, ...config.env },\n\t\t\tstdio: ['ignore', 'pipe', 'pipe'],\n\t\t}\n\n\t\tconst child = spawnChild(config.command, config.args, options)\n\t\tlet resolveExit: (() => void) | undefined\n\n\t\tconst runningProcess: RunningProcess = {\n\t\t\tchild,\n\t\t\texitPromise: new Promise<void>((resolve) => {\n\t\t\t\tresolveExit = resolve\n\t\t\t}),\n\t\t\tstdoutBuffer: '',\n\t\t\tstderrBuffer: '',\n\t\t}\n\n\t\tthis.processes.set(config.label, runningProcess)\n\n\t\tchild.stdout?.on('data', (chunk: Buffer) => {\n\t\t\trunningProcess.stdoutBuffer = this.writeChunk(\n\t\t\t\tconfig.label,\n\t\t\t\trunningProcess.stdoutBuffer,\n\t\t\t\tchunk,\n\t\t\t\tfalse,\n\t\t\t)\n\t\t})\n\n\t\tchild.stderr?.on('data', (chunk: Buffer) => {\n\t\t\trunningProcess.stderrBuffer = this.writeChunk(\n\t\t\t\tconfig.label,\n\t\t\t\trunningProcess.stderrBuffer,\n\t\t\t\tchunk,\n\t\t\t\ttrue,\n\t\t\t)\n\t\t})\n\n\t\tchild.on('exit', (code, signal) => {\n\t\t\tthis.flushBuffer(config.label, runningProcess.stdoutBuffer, false)\n\t\t\tthis.flushBuffer(config.label, runningProcess.stderrBuffer, true)\n\t\t\tthis.processes.delete(config.label)\n\t\t\tconfig.onExit?.(code, signal)\n\t\t\tresolveExit?.()\n\t\t})\n\t}\n\n\thasRunning(): boolean {\n\t\treturn this.processes.size > 0\n\t}\n\n\tasync shutdownAll(): Promise<void> {\n\t\tconst running = Array.from(this.processes.values())\n\t\tif (running.length === 0) return\n\n\t\tfor (const processEntry of running) {\n\t\t\tprocessEntry.child.kill('SIGTERM')\n\t\t}\n\n\t\tawait Promise.race([Promise.all(running.map((entry) => entry.exitPromise)), delay(5000)])\n\n\t\tconst remaining = Array.from(this.processes.values())\n\t\tif (remaining.length === 0) return\n\n\t\tfor (const processEntry of remaining) {\n\t\t\tprocessEntry.child.kill('SIGKILL')\n\t\t}\n\n\t\tawait Promise.all(remaining.map((entry) => entry.exitPromise))\n\t}\n\n\tprivate writeChunk(label: string, buffer: string, chunk: Buffer, isError: boolean): string {\n\t\tconst combined = `${buffer}${chunk.toString('utf-8')}`\n\t\tconst lines = combined.split(/\\r?\\n/)\n\t\tconst remaining = lines.pop() ?? ''\n\n\t\tfor (const line of lines) {\n\t\t\tthis.writeLine(label, line, isError)\n\t\t}\n\n\t\treturn remaining\n\t}\n\n\tprivate flushBuffer(label: string, buffer: string, isError: boolean): void {\n\t\tif (!buffer) return\n\t\tthis.writeLine(label, buffer, isError)\n\t}\n\n\tprivate writeLine(label: string, line: string, isError: boolean): void {\n\t\tconst stream = isError ? process.stderr : process.stdout\n\t\tstream.write(`[${label}] ${line}\\n`)\n\t}\n}\n\nfunction delay(ms: number): Promise<void> {\n\treturn new Promise((resolve) => {\n\t\tsetTimeout(resolve, ms)\n\t})\n}\n","import { spawn } from 'node:child_process'\nimport { watch } from 'node:fs'\nimport type { FSWatcher } from 'node:fs'\nimport { join } from 'node:path'\nimport { hasTsxInstalled } from '../../utils/fs-helpers'\n\nexport interface SchemaWatcherConfig {\n\tschemaPath: string\n\tprojectRoot: string\n\tdebounceMs?: number\n\tonRegenerate?: () => void\n\tonError?: (error: Error) => void\n}\n\n/**\n * Watches a schema file and regenerates types when it changes.\n */\nexport class SchemaWatcher {\n\tprivate readonly debounceMs: number\n\tprivate watcher: FSWatcher | null = null\n\tprivate debounceTimer: NodeJS.Timeout | null = null\n\n\tconstructor(private readonly config: SchemaWatcherConfig) {\n\t\tthis.debounceMs = config.debounceMs ?? 300\n\t}\n\n\tstart(): void {\n\t\tif (this.watcher) return\n\n\t\tthis.watcher = watch(this.config.schemaPath, () => {\n\t\t\tthis.scheduleRegeneration()\n\t\t})\n\n\t\tthis.watcher.on('error', (error) => {\n\t\t\tthis.config.onError?.(toError(error))\n\t\t})\n\t}\n\n\tstop(): void {\n\t\tif (this.debounceTimer) {\n\t\t\tclearTimeout(this.debounceTimer)\n\t\t\tthis.debounceTimer = null\n\t\t}\n\n\t\tthis.watcher?.close()\n\t\tthis.watcher = null\n\t}\n\n\tasync regenerate(): Promise<void> {\n\t\t// Use process.execPath (node) + --import tsx to run kora generate,\n\t\t// avoiding .cmd shim issues on Windows with paths containing spaces.\n\t\tconst koraBinJs = join(\n\t\t\tthis.config.projectRoot,\n\t\t\t'node_modules',\n\t\t\t'@korajs',\n\t\t\t'cli',\n\t\t\t'dist',\n\t\t\t'bin.js',\n\t\t)\n\t\tconst hasTsx = await hasTsxInstalled(this.config.projectRoot)\n\n\t\tconst command = process.execPath\n\t\tconst args = hasTsx\n\t\t\t? ['--import', 'tsx', koraBinJs, 'generate', 'types', '--schema', this.config.schemaPath]\n\t\t\t: [koraBinJs, 'generate', 'types', '--schema', this.config.schemaPath]\n\n\t\tawait spawnCommand(command, args, this.config.projectRoot)\n\t\tthis.config.onRegenerate?.()\n\t}\n\n\tprivate scheduleRegeneration(): void {\n\t\tif (this.debounceTimer) {\n\t\t\tclearTimeout(this.debounceTimer)\n\t\t}\n\n\t\tthis.debounceTimer = setTimeout(() => {\n\t\t\tthis.debounceTimer = null\n\t\t\tvoid this.regenerate().catch((error) => {\n\t\t\t\tthis.config.onError?.(toError(error))\n\t\t\t})\n\t\t}, this.debounceMs)\n\t}\n}\n\nasync function spawnCommand(command: string, args: string[], cwd: string): Promise<void> {\n\tawait new Promise<void>((resolve, reject) => {\n\t\tconst child = spawn(command, args, {\n\t\t\tcwd,\n\t\t\tstdio: ['ignore', 'pipe', 'pipe'],\n\t\t\tenv: process.env,\n\t\t})\n\n\t\tchild.stdout?.on('data', (chunk: Buffer) => {\n\t\t\twritePrefixedLines(chunk, false)\n\t\t})\n\n\t\tchild.stderr?.on('data', (chunk: Buffer) => {\n\t\t\twritePrefixedLines(chunk, true)\n\t\t})\n\n\t\tchild.on('error', (error) => {\n\t\t\treject(error)\n\t\t})\n\n\t\tchild.on('exit', (code) => {\n\t\t\tif (code === 0) {\n\t\t\t\tresolve()\n\t\t\t\treturn\n\t\t\t}\n\t\t\treject(new Error(`Type generation exited with code ${code ?? 'unknown'}.`))\n\t\t})\n\t})\n}\n\nfunction writePrefixedLines(chunk: Buffer, isError: boolean): void {\n\tconst text = chunk.toString('utf-8')\n\tconst lines = text.split(/\\r?\\n/).filter((line) => line.length > 0)\n\tconst stream = isError ? process.stderr : process.stdout\n\n\tfor (const line of lines) {\n\t\tstream.write(`[kora] ${line}\\n`)\n\t}\n}\n\nfunction toError(error: unknown): Error {\n\tif (error instanceof Error) return error\n\treturn new Error(String(error))\n}\n","import { defineCommand } from 'citty'\nimport { InvalidProjectError } from '../../errors'\nimport { findProjectRoot } from '../../utils/fs-helpers'\nimport { createLogger } from '../../utils/logger'\nimport { doctorHasFailures, runDoctorChecks } from './doctor-checks'\n\n/**\n * Diagnose common Kora project setup issues (schema, worker, sync, versions).\n */\nexport const doctorCommand = defineCommand({\n\tmeta: {\n\t\tname: 'doctor',\n\t\tdescription: 'Check Kora project setup (schema, worker, sync server, versions)',\n\t},\n\targs: {\n\t\turl: {\n\t\t\ttype: 'string',\n\t\t\tdescription:\n\t\t\t\t'Sync server HTTP base URL for status probe (default: from .env or localhost:3001)',\n\t\t},\n\t\t'skip-network': {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Skip sync server and schema version network checks',\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tconst logger = createLogger()\n\t\tconst projectRoot = await findProjectRoot()\n\t\tif (!projectRoot) {\n\t\t\tthrow new InvalidProjectError(process.cwd())\n\t\t}\n\n\t\tconst syncHttpUrl = typeof args.url === 'string' ? args.url : undefined\n\t\tconst skipNetwork = args['skip-network'] === true\n\n\t\tlogger.banner()\n\t\tlogger.info(`Checking project at ${projectRoot}`)\n\t\tlogger.blank()\n\n\t\tconst results = await runDoctorChecks({\n\t\t\tprojectRoot,\n\t\t\tsyncHttpUrl,\n\t\t\tskipNetwork,\n\t\t})\n\n\t\tfor (const check of results) {\n\t\t\tconst prefix =\n\t\t\t\tcheck.status === 'pass'\n\t\t\t\t\t? 'success'\n\t\t\t\t\t: check.status === 'warn'\n\t\t\t\t\t\t? 'warn'\n\t\t\t\t\t\t: check.status === 'fail'\n\t\t\t\t\t\t\t? 'error'\n\t\t\t\t\t\t\t: 'step'\n\t\t\tlogger[prefix](`${check.title}: ${check.message}`)\n\t\t\tif (check.fix && check.status !== 'pass' && check.status !== 'skip') {\n\t\t\t\tlogger.step(` Fix: ${check.fix}`)\n\t\t\t}\n\t\t}\n\n\t\tlogger.blank()\n\t\tif (doctorHasFailures(results)) {\n\t\t\tlogger.error('Doctor found blocking issues.')\n\t\t\tprocess.exitCode = 1\n\t\t\treturn\n\t\t}\n\n\t\tconst warnings = results.filter((r) => r.status === 'warn').length\n\t\tif (warnings > 0) {\n\t\t\tlogger.warn(`Doctor finished with ${warnings} warning(s).`)\n\t\t} else {\n\t\t\tlogger.success('All checks passed.')\n\t\t}\n\t},\n})\n","import { access, readFile } from 'node:fs/promises'\nimport { join, resolve } from 'node:path'\nimport type { SchemaDefinition } from '@korajs/core'\nimport { findSchemaFile } from '../../utils/fs-helpers'\nimport { loadKoraConfig } from '../dev/kora-config'\nimport { loadSchemaDefinition } from '../migrate/schema-loader'\n\nexport type DoctorCheckStatus = 'pass' | 'warn' | 'fail' | 'skip'\n\nexport interface DoctorCheckResult {\n\tid: string\n\ttitle: string\n\tstatus: DoctorCheckStatus\n\tmessage: string\n\tfix?: string\n}\n\nexport interface DoctorRunOptions {\n\tprojectRoot: string\n\t/** HTTP base URL for sync status probe (e.g. http://localhost:3001) */\n\tsyncHttpUrl?: string\n\t/** Skip network checks */\n\tskipNetwork?: boolean\n}\n\nconst STATUS_ENDPOINT = '/__kora/status'\n\n/**\n * Run all static and optional network diagnostics for a Kora project.\n */\nexport async function runDoctorChecks(options: DoctorRunOptions): Promise<DoctorCheckResult[]> {\n\tconst { projectRoot } = options\n\tconst results: DoctorCheckResult[] = []\n\n\tresults.push({\n\t\tid: 'project-root',\n\t\ttitle: 'Project root',\n\t\tstatus: 'pass',\n\t\tmessage: projectRoot,\n\t})\n\n\tconst config = await loadKoraConfig(projectRoot)\n\tif (!config) {\n\t\tresults.push({\n\t\t\tid: 'kora-config',\n\t\t\ttitle: 'kora.config',\n\t\t\tstatus: 'warn',\n\t\t\tmessage: 'No kora.config.* file found.',\n\t\t\tfix: 'Add kora.config.ts with schema path and dev settings (see create-kora-app templates).',\n\t\t})\n\t} else {\n\t\tresults.push({\n\t\t\tid: 'kora-config',\n\t\t\ttitle: 'kora.config',\n\t\t\tstatus: 'pass',\n\t\t\tmessage: 'Configuration file loaded.',\n\t\t})\n\t}\n\n\tconst schemaPath = await resolveSchemaPath(projectRoot, config?.schema)\n\tif (!schemaPath) {\n\t\tresults.push({\n\t\t\tid: 'schema',\n\t\t\ttitle: 'Schema',\n\t\t\tstatus: 'fail',\n\t\t\tmessage: 'Could not find schema.ts in src/ or project root.',\n\t\t\tfix: 'Add src/schema.ts or set schema in kora.config.ts.',\n\t\t})\n\t} else {\n\t\ttry {\n\t\t\tconst schema = await loadSchemaDefinition(schemaPath, projectRoot)\n\t\t\tresults.push({\n\t\t\t\tid: 'schema',\n\t\t\t\ttitle: 'Schema',\n\t\t\t\tstatus: 'pass',\n\t\t\t\tmessage: `Loaded schema v${schema.version} (${Object.keys(schema.collections).length} collection(s)).`,\n\t\t\t})\n\n\t\t\tconst workerCheck = await checkWorkerFile(projectRoot)\n\t\t\tresults.push(workerCheck)\n\n\t\t\tconst depsCheck = await checkDependencies(projectRoot)\n\t\t\tresults.push(depsCheck)\n\n\t\t\tresults.push(opfsBrowserNote())\n\n\t\t\tif (!options.skipNetwork) {\n\t\t\t\tconst syncUrl = options.syncHttpUrl ?? (await resolveSyncHttpUrl(projectRoot, config))\n\t\t\t\tconst syncChecks = await checkSyncServer(syncUrl, schema)\n\t\t\t\tresults.push(...syncChecks)\n\t\t\t} else {\n\t\t\t\tresults.push({\n\t\t\t\t\tid: 'sync-server',\n\t\t\t\t\ttitle: 'Sync server',\n\t\t\t\t\tstatus: 'skip',\n\t\t\t\t\tmessage: 'Network checks skipped.',\n\t\t\t\t})\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error)\n\t\t\tresults.push({\n\t\t\t\tid: 'schema',\n\t\t\t\ttitle: 'Schema',\n\t\t\t\tstatus: 'fail',\n\t\t\t\tmessage: `Failed to load schema: ${message}`,\n\t\t\t\tfix: 'Ensure the schema exports defineSchema() as default and TypeScript can be evaluated (install tsx).',\n\t\t\t})\n\t\t}\n\t}\n\n\treturn results\n}\n\nasync function resolveSchemaPath(\n\tprojectRoot: string,\n\tconfigSchema?: string,\n): Promise<string | null> {\n\tif (typeof configSchema === 'string') {\n\t\tconst resolved = resolve(projectRoot, configSchema)\n\t\ttry {\n\t\t\tawait access(resolved)\n\t\t\treturn resolved\n\t\t} catch {\n\t\t\t// fall through to search\n\t\t}\n\t}\n\treturn findSchemaFile(projectRoot)\n}\n\nasync function checkWorkerFile(projectRoot: string): Promise<DoctorCheckResult> {\n\tconst candidates = [\n\t\tjoin(projectRoot, 'src', 'kora-worker.ts'),\n\t\tjoin(projectRoot, 'src', 'kora-worker.js'),\n\t]\n\n\tfor (const path of candidates) {\n\t\ttry {\n\t\t\tawait access(path)\n\t\t\treturn {\n\t\t\t\tid: 'worker',\n\t\t\t\ttitle: 'SQLite WASM worker',\n\t\t\t\tstatus: 'pass',\n\t\t\t\tmessage: `Found ${path.replace(projectRoot, '.')}.`,\n\t\t\t}\n\t\t} catch {\n\t\t\t// try next\n\t\t}\n\t}\n\n\treturn {\n\t\tid: 'worker',\n\t\ttitle: 'SQLite WASM worker',\n\t\tstatus: 'warn',\n\t\tmessage: 'No src/kora-worker.ts found.',\n\t\tfix: 'Add kora-worker.ts and pass store.workerUrl from Vite (?worker&url) in createApp().',\n\t}\n}\n\nasync function checkDependencies(projectRoot: string): Promise<DoctorCheckResult> {\n\ttry {\n\t\tconst raw = await readFile(join(projectRoot, 'package.json'), 'utf-8')\n\t\tconst pkg = JSON.parse(raw) as {\n\t\t\tdependencies?: Record<string, string>\n\t\t\tdevDependencies?: Record<string, string>\n\t\t}\n\t\tconst deps = { ...pkg.dependencies, ...pkg.devDependencies }\n\t\tconst hasKora = Boolean(deps.korajs || deps.kora)\n\t\tconst hasStore = Boolean(deps['@korajs/store'])\n\t\tif (hasKora || hasStore) {\n\t\t\treturn {\n\t\t\t\tid: 'dependencies',\n\t\t\t\ttitle: 'Dependencies',\n\t\t\t\tstatus: 'pass',\n\t\t\t\tmessage: hasKora\n\t\t\t\t\t? 'korajs is listed in package.json.'\n\t\t\t\t\t: '@korajs/store is listed in package.json.',\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tid: 'dependencies',\n\t\t\ttitle: 'Dependencies',\n\t\t\tstatus: 'fail',\n\t\t\tmessage: 'No korajs or @korajs/store dependency found.',\n\t\t\tfix: 'Run pnpm add korajs @korajs/react (or your package manager equivalent).',\n\t\t}\n\t} catch {\n\t\treturn {\n\t\t\tid: 'dependencies',\n\t\t\ttitle: 'Dependencies',\n\t\t\tstatus: 'fail',\n\t\t\tmessage: 'Could not read package.json.',\n\t\t\tfix: 'Run this command from a Kora app directory with a valid package.json.',\n\t\t}\n\t}\n}\n\nfunction opfsBrowserNote(): DoctorCheckResult {\n\treturn {\n\t\tid: 'opfs',\n\t\ttitle: 'OPFS persistence',\n\t\tstatus: 'skip',\n\t\tmessage:\n\t\t\t'OPFS availability is checked in the browser at runtime. Open the app and confirm no IndexedDB fallback warning in the console.',\n\t\tfix: 'Use a Chromium-based browser with storage access; avoid private mode if persistence fails.',\n\t}\n}\n\nasync function resolveSyncHttpUrl(\n\tprojectRoot: string,\n\tconfig: Awaited<ReturnType<typeof loadKoraConfig>>,\n): Promise<string> {\n\tconst envUrl = await readEnvSyncUrl(projectRoot)\n\tif (envUrl) {\n\t\treturn toSyncStatusHttpBase(envUrl)\n\t}\n\n\tconst syncPort =\n\t\ttypeof config?.dev?.sync === 'object' && typeof config.dev.sync.port === 'number'\n\t\t\t? config.dev.sync.port\n\t\t\t: 3001\n\n\treturn `http://localhost:${syncPort}`\n}\n\nasync function readEnvSyncUrl(projectRoot: string): Promise<string | null> {\n\tfor (const file of ['.env', '.env.local']) {\n\t\tconst path = join(projectRoot, file)\n\t\ttry {\n\t\t\tconst content = await readFile(path, 'utf-8')\n\t\t\tfor (const line of content.split('\\n')) {\n\t\t\t\tconst trimmed = line.trim()\n\t\t\t\tif (!trimmed || trimmed.startsWith('#')) continue\n\t\t\t\tconst match = trimmed.match(/^VITE_SYNC_URL=(.+)$/)\n\t\t\t\tif (match?.[1]) {\n\t\t\t\t\treturn match[1].trim().replace(/^[\"']|[\"']$/g, '')\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// continue\n\t\t}\n\t}\n\treturn null\n}\n\n/** Converts a WebSocket sync URL to an HTTP base for {@link STATUS_ENDPOINT}. */\nexport function toSyncStatusHttpBase(url: string): string {\n\ttry {\n\t\tconst parsed = new URL(url)\n\t\tif (parsed.protocol === 'ws:') {\n\t\t\tparsed.protocol = 'http:'\n\t\t} else if (parsed.protocol === 'wss:') {\n\t\t\tparsed.protocol = 'https:'\n\t\t}\n\t\tparsed.pathname = ''\n\t\tparsed.search = ''\n\t\tparsed.hash = ''\n\t\treturn parsed.toString().replace(/\\/$/, '')\n\t} catch {\n\t\treturn 'http://localhost:3001'\n\t}\n}\n\ninterface ServerStatusResponse {\n\tschemaVersion: number\n\trunning: boolean\n\tversion: string\n}\n\nasync function checkSyncServer(\n\thttpBase: string,\n\tschema: SchemaDefinition,\n): Promise<DoctorCheckResult[]> {\n\tconst statusUrl = `${httpBase.replace(/\\/$/, '')}${STATUS_ENDPOINT}`\n\n\ttry {\n\t\tconst response = await fetch(statusUrl, {\n\t\t\tsignal: AbortSignal.timeout(5000),\n\t\t})\n\t\tif (!response.ok) {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tid: 'sync-server',\n\t\t\t\t\ttitle: 'Sync server',\n\t\t\t\t\tstatus: 'fail',\n\t\t\t\t\tmessage: `GET ${statusUrl} returned ${response.status}.`,\n\t\t\t\t\tfix: 'Start the sync server with `kora dev` or `pnpm run dev` in a sync template.',\n\t\t\t\t},\n\t\t\t]\n\t\t}\n\n\t\tconst body = (await response.json()) as ServerStatusResponse\n\t\tconst results: DoctorCheckResult[] = [\n\t\t\t{\n\t\t\t\tid: 'sync-server',\n\t\t\t\ttitle: 'Sync server',\n\t\t\t\tstatus: 'pass',\n\t\t\t\tmessage: `Reachable at ${statusUrl} (server v${body.version ?? 'unknown'}).`,\n\t\t\t},\n\t\t]\n\n\t\tif (typeof body.schemaVersion === 'number' && body.schemaVersion !== schema.version) {\n\t\t\tresults.push({\n\t\t\t\tid: 'schema-version',\n\t\t\t\ttitle: 'Schema version',\n\t\t\t\tstatus: 'warn',\n\t\t\t\tmessage: `Client schema v${schema.version} differs from server schema v${body.schemaVersion}.`,\n\t\t\t\tfix: 'Run migrations on the server and client, or align schema.version before syncing.',\n\t\t\t})\n\t\t} else {\n\t\t\tresults.push({\n\t\t\t\tid: 'schema-version',\n\t\t\t\ttitle: 'Schema version',\n\t\t\t\tstatus: 'pass',\n\t\t\t\tmessage: `Client and server both use schema v${schema.version}.`,\n\t\t\t})\n\t\t}\n\n\t\treturn results\n\t} catch (error) {\n\t\tconst detail = error instanceof Error ? error.message : String(error)\n\t\treturn [\n\t\t\t{\n\t\t\t\tid: 'sync-server',\n\t\t\t\ttitle: 'Sync server',\n\t\t\t\tstatus: 'warn',\n\t\t\t\tmessage: `Could not reach ${statusUrl}: ${detail}`,\n\t\t\t\tfix: 'Start the sync server, or pass --skip-network for local-only checks.',\n\t\t\t},\n\t\t]\n\t}\n}\n\n/**\n * True when any check failed (doctor should exit non-zero).\n */\nexport function doctorHasFailures(results: DoctorCheckResult[]): boolean {\n\treturn results.some((r) => r.status === 'fail')\n}\n","import { mkdir, writeFile } from 'node:fs/promises'\nimport { dirname, resolve } from 'node:path'\nimport type { SchemaDefinition } from '@korajs/core'\nimport { defineCommand } from 'citty'\nimport { InvalidProjectError, SchemaNotFoundError } from '../../errors'\nimport { findProjectRoot, findSchemaFile } from '../../utils/fs-helpers'\nimport { createLogger } from '../../utils/logger'\nimport { loadSchemaDefinition } from '../migrate/schema-loader'\nimport { generateCollectionHooks } from './hook-generator'\nimport { generateTypes } from './type-generator'\n\n/**\n * The `generate` command with `types` subcommand.\n * Reads a schema file and generates TypeScript interfaces.\n */\nexport const generateCommand = defineCommand({\n\tmeta: {\n\t\tname: 'generate',\n\t\tdescription: 'Generate code from your Kora schema',\n\t},\n\tsubCommands: {\n\t\ttypes: defineCommand({\n\t\t\tmeta: {\n\t\t\t\tname: 'types',\n\t\t\t\tdescription: 'Generate TypeScript types from your schema',\n\t\t\t},\n\t\t\targs: {\n\t\t\t\tschema: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Path to schema file',\n\t\t\t\t},\n\t\t\t\toutput: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Output file path',\n\t\t\t\t\tdefault: 'kora/generated/types.ts',\n\t\t\t\t},\n\t\t\t},\n\t\t\tasync run({ args }) {\n\t\t\t\tconst logger = createLogger()\n\n\t\t\t\t// Find project root\n\t\t\t\tconst projectRoot = await findProjectRoot()\n\t\t\t\tif (!projectRoot) {\n\t\t\t\t\tthrow new InvalidProjectError(process.cwd())\n\t\t\t\t}\n\n\t\t\t\t// Find schema file\n\t\t\t\tlet schemaPath: string\n\t\t\t\tif (args.schema && typeof args.schema === 'string') {\n\t\t\t\t\tschemaPath = resolve(args.schema)\n\t\t\t\t} else {\n\t\t\t\t\tconst found = await findSchemaFile(projectRoot)\n\t\t\t\t\tif (!found) {\n\t\t\t\t\t\tthrow new SchemaNotFoundError([\n\t\t\t\t\t\t\t'src/schema.ts',\n\t\t\t\t\t\t\t'schema.ts',\n\t\t\t\t\t\t\t'src/schema.js',\n\t\t\t\t\t\t\t'schema.js',\n\t\t\t\t\t\t])\n\t\t\t\t\t}\n\t\t\t\t\tschemaPath = found\n\t\t\t\t}\n\n\t\t\t\tlogger.step(`Reading schema from ${schemaPath}...`)\n\n\t\t\t\t// Dynamic import the schema file\n\t\t\t\tconst schemaModule: unknown = await import(schemaPath)\n\t\t\t\tconst schema = extractSchema(schemaModule)\n\n\t\t\t\tif (!schema) {\n\t\t\t\t\tlogger.error('Schema file must export a SchemaDefinition as the default export.')\n\t\t\t\t\tprocess.exitCode = 1\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// Generate types\n\t\t\t\tconst output = generateTypes(schema)\n\t\t\t\tconst outputFile = typeof args.output === 'string' ? args.output : 'kora/generated/types.ts'\n\t\t\t\tconst outputPath = resolve(projectRoot, outputFile)\n\n\t\t\t\tawait mkdir(dirname(outputPath), { recursive: true })\n\t\t\t\tawait writeFile(outputPath, output, 'utf-8')\n\n\t\t\t\tlogger.success(`Generated types at ${outputPath}`)\n\t\t\t},\n\t\t}),\n\t\thooks: defineCommand({\n\t\t\tmeta: {\n\t\t\t\tname: 'hooks',\n\t\t\t\tdescription: 'Generate per-collection React hook stubs',\n\t\t\t},\n\t\t\targs: {\n\t\t\t\tschema: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Path to schema file',\n\t\t\t\t},\n\t\t\t\toutput: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Output directory for hooks',\n\t\t\t\t\tdefault: 'kora/generated/hooks',\n\t\t\t\t},\n\t\t\t\ttypes: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Relative import path to generated types from hook files',\n\t\t\t\t\tdefault: '../types',\n\t\t\t\t},\n\t\t\t},\n\t\t\tasync run({ args }) {\n\t\t\t\tconst logger = createLogger()\n\t\t\t\tconst projectRoot = await findProjectRoot()\n\t\t\t\tif (!projectRoot) {\n\t\t\t\t\tthrow new InvalidProjectError(process.cwd())\n\t\t\t\t}\n\n\t\t\t\tlet schemaPath: string\n\t\t\t\tif (args.schema && typeof args.schema === 'string') {\n\t\t\t\t\tschemaPath = resolve(projectRoot, args.schema)\n\t\t\t\t} else {\n\t\t\t\t\tconst found = await findSchemaFile(projectRoot)\n\t\t\t\t\tif (!found) {\n\t\t\t\t\t\tthrow new SchemaNotFoundError([\n\t\t\t\t\t\t\t'src/schema.ts',\n\t\t\t\t\t\t\t'schema.ts',\n\t\t\t\t\t\t\t'src/schema.js',\n\t\t\t\t\t\t\t'schema.js',\n\t\t\t\t\t\t])\n\t\t\t\t\t}\n\t\t\t\t\tschemaPath = found\n\t\t\t\t}\n\n\t\t\t\tconst schema = await loadSchemaDefinition(schemaPath, projectRoot)\n\t\t\t\tconst outputDir =\n\t\t\t\t\ttypeof args.output === 'string'\n\t\t\t\t\t\t? resolve(projectRoot, args.output)\n\t\t\t\t\t\t: resolve(projectRoot, 'kora/generated/hooks')\n\n\t\t\t\tconst files = generateCollectionHooks(schema)\n\t\t\t\tfor (const [name, content] of files) {\n\t\t\t\t\tconst adjusted =\n\t\t\t\t\t\ttypeof args.types === 'string' && args.types !== '../types'\n\t\t\t\t\t\t\t? content.replace(\"from '../types'\", `from '${args.types}'`)\n\t\t\t\t\t\t\t: content\n\t\t\t\t\tconst filePath = resolve(outputDir, name)\n\t\t\t\t\tawait mkdir(dirname(filePath), { recursive: true })\n\t\t\t\t\tawait writeFile(filePath, adjusted, 'utf-8')\n\t\t\t\t}\n\n\t\t\t\tlogger.success(`Generated ${String(files.size)} hook file(s) at ${outputDir}`)\n\t\t\t\tlogger.step('Run `kora generate types` first if ../types is missing.')\n\t\t\t},\n\t\t}),\n\t},\n})\n\nfunction extractSchema(mod: unknown): SchemaDefinition | null {\n\tif (typeof mod !== 'object' || mod === null) return null\n\tconst record = mod as Record<string, unknown>\n\n\t// Check for default export\n\tconst candidate = record.default ?? record\n\tif (isSchemaDefinition(candidate)) return candidate\n\n\treturn null\n}\n\nfunction isSchemaDefinition(value: unknown): value is SchemaDefinition {\n\tif (typeof value !== 'object' || value === null) return false\n\tconst obj = value as Record<string, unknown>\n\treturn (\n\t\ttypeof obj.version === 'number' &&\n\t\ttypeof obj.collections === 'object' &&\n\t\tobj.collections !== null\n\t)\n}\n","import type { SchemaDefinition } from '@korajs/core'\n\n/**\n * Generates per-collection React hook stubs from a schema.\n *\n * @param schema - Validated schema definition\n * @returns Map of file basename to file contents\n */\nexport function generateCollectionHooks(schema: SchemaDefinition): Map<string, string> {\n\tconst files = new Map<string, string>()\n\n\tfor (const collectionName of Object.keys(schema.collections)) {\n\t\tconst pascal = toPascalCase(collectionName)\n\t\tconst hookName = `use${pascal}`\n\n\t\tconst content = [\n\t\t\t'// Auto-generated by `kora generate hooks` — safe to edit',\n\t\t\t`// Schema v${String(schema.version)}`,\n\t\t\t'',\n\t\t\t\"import { useCollection, useMutation, useQuery } from '@korajs/react'\",\n\t\t\t`import type { ${pascal}InsertInput, ${pascal}Record, ${pascal}UpdateInput } from '../types'`,\n\t\t\t'',\n\t\t\t'/**',\n\t\t\t` * Collection hook for \\`${collectionName}\\`.`,\n\t\t\t' * Add useQuery(...) calls with your QueryBuilder factories.',\n\t\t\t' */',\n\t\t\t`export function ${hookName}() {`,\n\t\t\t`\\tconst ${collectionName} = useCollection('${collectionName}')`,\n\t\t\t'',\n\t\t\t`\\tconst insert = useMutation((data: ${pascal}InsertInput) => ${collectionName}.insert(data))`,\n\t\t\t`\\tconst update = useMutation((id: string, data: ${pascal}UpdateInput) =>`,\n\t\t\t`\\t\\t${collectionName}.update(id, data),`,\n\t\t\t'\\t)',\n\t\t\t`\\tconst remove = useMutation((id: string) => ${collectionName}.delete(id))`,\n\t\t\t'',\n\t\t\t'\\treturn {',\n\t\t\t`\\t\\t${collectionName},`,\n\t\t\t'\\t\\tinsert,',\n\t\t\t'\\t\\tupdate,',\n\t\t\t'\\t\\tremove,',\n\t\t\t'\\t}',\n\t\t\t'}',\n\t\t\t'',\n\t\t].join('\\n')\n\n\t\tfiles.set(`${collectionName}.ts`, content)\n\t}\n\n\tconst indexLines = [\n\t\t'// Auto-generated by `kora generate hooks`',\n\t\t'',\n\t\t...Object.keys(schema.collections).map((name) => {\n\t\t\tconst pascal = toPascalCase(name)\n\t\t\treturn `export { use${pascal} } from './${name}'`\n\t\t}),\n\t\t'',\n\t]\n\n\tfiles.set('index.ts', indexLines.join('\\n'))\n\treturn files\n}\n\nfunction toPascalCase(value: string): string {\n\treturn value\n\t\t.split(/[-_]/)\n\t\t.filter((part) => part.length > 0)\n\t\t.map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n\t\t.join('')\n}\n","import type { FieldDescriptor, FieldKind, SchemaDefinition } from '@korajs/core'\n\n/**\n * Generates TypeScript interfaces from a SchemaDefinition.\n * For each collection, produces three interfaces:\n * - {Name}Record: full record type (all fields + id)\n * - {Name}InsertInput: insert input (omit auto fields, optional for fields with defaults)\n * - {Name}UpdateInput: update input (all non-auto fields optional)\n *\n * @param schema - A validated SchemaDefinition from defineSchema()\n * @returns A complete TypeScript file as a string\n */\nexport function generateTypes(schema: SchemaDefinition): string {\n\tconst lines: string[] = [\n\t\t'// Auto-generated by @korajs/cli — do not edit manually',\n\t\t`// Generated from schema version ${String(schema.version)}`,\n\t\t'',\n\t]\n\n\tconst collectionNames = Object.keys(schema.collections)\n\tif (collectionNames.length === 0) {\n\t\treturn lines.join('\\n')\n\t}\n\n\tfor (const [name, collection] of Object.entries(schema.collections)) {\n\t\tconst pascal = toPascalCase(name)\n\t\tconst fields = collection.fields\n\n\t\t// Record type: all fields + id\n\t\tlines.push(`export interface ${pascal}Record {`)\n\t\tlines.push('\\treadonly id: string')\n\t\tfor (const [fieldName, descriptor] of Object.entries(fields)) {\n\t\t\tconst tsType = fieldKindToTypeScript(descriptor)\n\t\t\tconst optional = !descriptor.required && !descriptor.auto ? '?' : ''\n\t\t\tlines.push(`\\treadonly ${fieldName}${optional}: ${tsType}`)\n\t\t}\n\t\tlines.push('}')\n\t\tlines.push('')\n\n\t\t// Insert input: omit auto fields, optional for fields with defaults\n\t\tlines.push(`export interface ${pascal}InsertInput {`)\n\t\tfor (const [fieldName, descriptor] of Object.entries(fields)) {\n\t\t\tif (descriptor.auto) continue\n\t\t\tconst tsType = fieldKindToTypeScript(descriptor)\n\t\t\tconst optional = !descriptor.required || descriptor.defaultValue !== undefined ? '?' : ''\n\t\t\tlines.push(`\\t${fieldName}${optional}: ${tsType}`)\n\t\t}\n\t\tlines.push('}')\n\t\tlines.push('')\n\n\t\t// Update input: all non-auto fields optional\n\t\tlines.push(`export interface ${pascal}UpdateInput {`)\n\t\tfor (const [fieldName, descriptor] of Object.entries(fields)) {\n\t\t\tif (descriptor.auto) continue\n\t\t\tconst tsType = fieldKindToTypeScript(descriptor)\n\t\t\tlines.push(`\\t${fieldName}?: ${tsType}`)\n\t\t}\n\t\tlines.push('}')\n\t\tlines.push('')\n\t}\n\n\treturn lines.join('\\n')\n}\n\n/** Maps a FieldDescriptor to its TypeScript type string */\nfunction fieldKindToTypeScript(descriptor: FieldDescriptor): string {\n\tswitch (descriptor.kind) {\n\t\tcase 'string':\n\t\t\treturn 'string'\n\t\tcase 'number':\n\t\t\treturn 'number'\n\t\tcase 'boolean':\n\t\t\treturn 'boolean'\n\t\tcase 'timestamp':\n\t\t\treturn 'number'\n\t\tcase 'richtext':\n\t\t\treturn 'string'\n\t\tcase 'enum': {\n\t\t\tif (descriptor.enumValues && descriptor.enumValues.length > 0) {\n\t\t\t\treturn descriptor.enumValues.map((v) => `'${v}'`).join(' | ')\n\t\t\t}\n\t\t\treturn 'string'\n\t\t}\n\t\tcase 'array': {\n\t\t\tconst itemType = itemKindToTypeScript(descriptor.itemKind)\n\t\t\treturn `Array<${itemType}>`\n\t\t}\n\t\tdefault:\n\t\t\treturn 'unknown'\n\t}\n}\n\n/** Maps an item FieldKind to its TypeScript type string */\nfunction itemKindToTypeScript(kind: FieldKind | null): string {\n\tswitch (kind) {\n\t\tcase 'string':\n\t\t\treturn 'string'\n\t\tcase 'number':\n\t\t\treturn 'number'\n\t\tcase 'boolean':\n\t\t\treturn 'boolean'\n\t\tcase 'timestamp':\n\t\t\treturn 'number'\n\t\tcase 'richtext':\n\t\t\treturn 'string'\n\t\tcase 'enum':\n\t\t\treturn 'string'\n\t\tcase 'array':\n\t\t\treturn 'unknown[]'\n\t\tdefault:\n\t\t\treturn 'unknown'\n\t}\n}\n\n/** Converts a snake_case or kebab-case name to PascalCase */\nfunction toPascalCase(name: string): string {\n\treturn name\n\t\t.split(/[_-]/)\n\t\t.map((part) => {\n\t\t\tif (part.length === 0) return ''\n\t\t\tconst first = part[0]\n\t\t\treturn first ? first.toUpperCase() + part.slice(1) : ''\n\t\t})\n\t\t.join('')\n}\n","import { defineCommand } from 'citty'\nimport { createLogger } from '../../utils/logger'\n\nconst DEFAULT_SYNC_PORT = 3001\nconst EVENTS_ENDPOINT = '/__kora/events'\n\n/**\n * The `logs` command — streams real-time events from a Kora sync server.\n */\nexport const logsCommand = defineCommand({\n\tmeta: {\n\t\tname: 'logs',\n\t\tdescription: 'Stream real-time events from a Kora sync server',\n\t},\n\targs: {\n\t\turl: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Sync server URL (default: http://localhost:3001)',\n\t\t\tdefault: `http://localhost:${DEFAULT_SYNC_PORT}`,\n\t\t},\n\t\tfollow: {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Follow log output (like tail -f)',\n\t\t\tdefault: true,\n\t\t\talias: 'f',\n\t\t},\n\t\tlevel: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Filter by log level (info, warn, error)',\n\t\t},\n\t\ttoken: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Admin token (defaults to KORA_ADMIN_TOKEN)',\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tconst logger = createLogger()\n\t\tconst url = typeof args.url === 'string' ? args.url : `http://localhost:${DEFAULT_SYNC_PORT}`\n\t\tconst follow = args.follow !== false\n\t\tconst levelFilter = typeof args.level === 'string' ? args.level : null\n\t\tconst token =\n\t\t\ttypeof args.token === 'string' ? args.token : (process.env.KORA_ADMIN_TOKEN ?? undefined)\n\t\tconst eventsUrl = `${url.replace(/\\/$/, '')}${EVENTS_ENDPOINT}`\n\n\t\tlogger.banner()\n\t\tlogger.info(`Connecting to ${eventsUrl}...`)\n\t\tlogger.blank()\n\n\t\ttry {\n\t\t\tconst response = await fetch(eventsUrl, {\n\t\t\t\theaders: token ? { Authorization: `Bearer ${token}` } : undefined,\n\t\t\t})\n\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Failed to connect to ${eventsUrl}: ${response.status} ${response.statusText}`,\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tconst reader = response.body?.getReader()\n\t\t\tif (!reader) {\n\t\t\t\tthrow new Error('Response body is not readable')\n\t\t\t}\n\n\t\t\tconst decoder = new TextDecoder()\n\t\t\tlet buffer = ''\n\n\t\t\tconst processLine = (line: string) => {\n\t\t\t\t// SSE format: \"event: <type>\\ndata: <json>\\n\\n\"\n\t\t\t\tif (line.startsWith('event: ')) {\n\t\t\t\t\treturn // We handle the data line\n\t\t\t\t}\n\t\t\t\tif (line.startsWith('data: ')) {\n\t\t\t\t\tconst data = line.slice(6)\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst parsed = JSON.parse(data) as Record<string, unknown>\n\t\t\t\t\t\tconst level = String(parsed.level ?? 'info')\n\n\t\t\t\t\t\tif (levelFilter && level !== levelFilter) return\n\n\t\t\t\t\t\tconst timestamp = parsed.timestamp\n\t\t\t\t\t\t\t? new Date(parsed.timestamp as number).toISOString()\n\t\t\t\t\t\t\t: ''\n\t\t\t\t\t\tconst event = String(parsed.event ?? 'unknown')\n\t\t\t\t\t\tconst nodeId = parsed.nodeId ? ` [${parsed.nodeId}]` : ''\n\t\t\t\t\t\tconst session = parsed.sessionId ? ` <${parsed.sessionId}>` : ''\n\t\t\t\t\t\tconst count = parsed.count ? ` (${parsed.count})` : ''\n\t\t\t\t\t\tconst error = parsed.error ? ` — ${parsed.error}` : ''\n\n\t\t\t\t\t\tconst prefix = level === 'error' ? '✗' : level === 'warn' ? '⚠' : '●'\n\t\t\t\t\t\tconst color =\n\t\t\t\t\t\t\tlevel === 'error' ? '\\x1b[31m' : level === 'warn' ? '\\x1b[33m' : '\\x1b[36m'\n\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t`${color}${prefix}${'\\x1b[0m'} ${timestamp.slice(11, 23)} ${event}${nodeId}${session}${count}${error}`,\n\t\t\t\t\t\t)\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Ignore parse errors on malformed data\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst read = async () => {\n\t\t\t\twhile (true) {\n\t\t\t\t\tconst { done, value } = await reader.read()\n\t\t\t\t\tif (done) break\n\n\t\t\t\t\tbuffer += decoder.decode(value, { stream: true })\n\t\t\t\t\tconst lines = buffer.split('\\n')\n\t\t\t\t\tbuffer = lines.pop() ?? ''\n\n\t\t\t\t\tfor (const line of lines) {\n\t\t\t\t\t\tprocessLine(line.trim())\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!follow) break\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait read()\n\t\t} catch (error) {\n\t\t\tlogger.error(`Failed to connect to ${eventsUrl}`)\n\t\t\tif (error instanceof Error) {\n\t\t\t\tlogger.error(error.message)\n\t\t\t}\n\t\t\tlogger.blank()\n\t\t\tlogger.step('Make sure the Kora sync server is running.')\n\t\t\tlogger.step('Start it with: kora dev')\n\t\t\tprocess.exit(1)\n\t\t}\n\t},\n})\n","import { mkdir, readFile, readdir, writeFile } from 'node:fs/promises'\nimport { dirname, join, resolve } from 'node:path'\nimport type { SchemaDefinition } from '@korajs/core'\nimport { defineCommand } from 'citty'\nimport { InvalidProjectError, SchemaNotFoundError } from '../../errors'\nimport { findProjectRoot, findSchemaFile } from '../../utils/fs-helpers'\nimport { createLogger } from '../../utils/logger'\nimport { promptConfirm } from '../../utils/prompt'\nimport { loadKoraConfig } from '../dev/kora-config'\nimport { generateMigration } from './migration-generator'\nimport { runMigration } from './migration-runner'\nimport { generateOperationTransformModule } from './operation-transform-generator'\nimport { diffSchemas } from './schema-differ'\nimport { loadSchemaDefinition } from './schema-loader'\n\nconst SNAPSHOT_PATH = 'kora/schema.snapshot.json'\nconst MIGRATIONS_DIR = 'kora/migrations'\n\ninterface MigrationManifest {\n\tid: string\n\tfromVersion: number\n\ttoVersion: number\n\tup: string[]\n\tdown: string[]\n\tsummary: string[]\n\tcontainsBreakingChanges: boolean\n}\n\n/**\n * The `migrate` command — detects schema changes and generates migration artifacts.\n */\nexport const migrateCommand = defineCommand({\n\tmeta: {\n\t\tname: 'migrate',\n\t\tdescription: 'Detect schema changes and generate/apply migrations',\n\t},\n\targs: {\n\t\tapply: {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Apply migration to configured database backends',\n\t\t\tdefault: false,\n\t\t},\n\t\tschema: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Path to schema file',\n\t\t},\n\t\tdb: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'SQLite database path for --apply (overrides config)',\n\t\t},\n\t\t'output-dir': {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Migration output directory',\n\t\t\tdefault: MIGRATIONS_DIR,\n\t\t},\n\t\t'dry-run': {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Preview migration changes without writing files',\n\t\t\tdefault: false,\n\t\t},\n\t\tforce: {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Skip breaking-change confirmation prompts',\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tconst logger = createLogger()\n\n\t\tconst projectRoot = await findProjectRoot()\n\t\tif (!projectRoot) {\n\t\t\tthrow new InvalidProjectError(process.cwd())\n\t\t}\n\n\t\tconst config = await loadKoraConfig(projectRoot)\n\t\tconst resolvedSchemaPath =\n\t\t\ttypeof args.schema === 'string'\n\t\t\t\t? resolve(projectRoot, args.schema)\n\t\t\t\t: typeof config?.schema === 'string'\n\t\t\t\t\t? resolve(projectRoot, config.schema)\n\t\t\t\t\t: await findSchemaFile(projectRoot)\n\n\t\tif (!resolvedSchemaPath) {\n\t\t\tthrow new SchemaNotFoundError(['src/schema.ts', 'schema.ts', 'src/schema.js', 'schema.js'])\n\t\t}\n\n\t\tconst currentSchema = await loadSchemaDefinition(resolvedSchemaPath, projectRoot)\n\n\t\tconst snapshotFile = join(projectRoot, SNAPSHOT_PATH)\n\t\tconst previousSchema = await readSchemaSnapshot(snapshotFile)\n\n\t\tif (!previousSchema) {\n\t\t\tif (args['dry-run'] === true) {\n\t\t\t\tlogger.info('No schema snapshot found. Dry run: baseline snapshot would be created.')\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tawait writeSchemaSnapshot(snapshotFile, currentSchema)\n\t\t\tlogger.success(`Initialized schema snapshot at ${snapshotFile}`)\n\t\t\tlogger.step('Run `kora migrate` again after schema changes to generate migrations.')\n\t\t\treturn\n\t\t}\n\n\t\tconst diff = diffSchemas(previousSchema, currentSchema)\n\t\tconst outputDir =\n\t\t\ttypeof args['output-dir'] === 'string'\n\t\t\t\t? resolve(projectRoot, args['output-dir'])\n\t\t\t\t: resolve(projectRoot, MIGRATIONS_DIR)\n\n\t\tif (!diff.hasChanges) {\n\t\t\tlogger.success('No schema changes detected.')\n\t\t\tif (args.apply === true) {\n\t\t\t\tconst sqlitePath = resolveSqliteApplyPath(args.db, projectRoot, config)\n\t\t\t\tconst postgresConnectionString = resolvePostgresConnectionString(config)\n\t\t\t\tconst pending = await listMigrationManifests(outputDir)\n\n\t\t\t\tif (pending.length === 0) {\n\t\t\t\t\tlogger.step('No migration files found to apply.')\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tfor (const manifest of pending) {\n\t\t\t\t\tconst report = await runMigration({\n\t\t\t\t\t\tupStatements: manifest.up,\n\t\t\t\t\t\tmigrationId: manifest.id,\n\t\t\t\t\t\tfromVersion: manifest.fromVersion,\n\t\t\t\t\t\ttoVersion: manifest.toVersion,\n\t\t\t\t\t\tsqlitePath,\n\t\t\t\t\t\tpostgresConnectionString,\n\t\t\t\t\t\tprojectRoot,\n\t\t\t\t\t})\n\n\t\t\t\t\tfor (const backend of report.backends) {\n\t\t\t\t\t\tlogger.step(\n\t\t\t\t\t\t\t` ${manifest.id} -> ${backend.backend}: applied=${backend.statementsApplied}, skipped=${backend.skipped}`,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tconst generated = generateMigration(previousSchema, currentSchema, diff)\n\n\t\tlogger.banner()\n\t\tlogger.info(`Detected schema change: v${diff.fromVersion} → v${diff.toVersion}`)\n\t\tlogger.blank()\n\t\tlogger.info('Changes:')\n\t\tfor (const line of generated.summary) {\n\t\t\tlogger.step(` ${line}`)\n\t\t}\n\n\t\tif (diff.hasBreakingChanges && args['dry-run'] !== true) {\n\t\t\tlogger.blank()\n\t\t\tlogger.warn('Breaking schema changes detected.')\n\t\t\tconst shouldContinue = await confirmBreakingChanges(args.force === true)\n\t\t\tif (!shouldContinue) {\n\t\t\t\tlogger.warn('Migration generation aborted.')\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tif (args['dry-run'] === true) {\n\t\t\tlogger.blank()\n\t\t\tlogger.warn('Dry run enabled: no files written, no migrations applied.')\n\t\t\treturn\n\t\t}\n\n\t\tawait mkdir(outputDir, { recursive: true })\n\n\t\tconst migrationPath = await writeMigrationFile(\n\t\t\toutputDir,\n\t\t\tdiff.fromVersion,\n\t\t\tdiff.toVersion,\n\t\t\tgenerated,\n\t\t)\n\t\tawait writeSchemaSnapshot(snapshotFile, currentSchema)\n\n\t\tlogger.blank()\n\t\tlogger.success(`Generated migration: ${migrationPath}`)\n\n\t\tif (args.apply === true) {\n\t\t\tconst sqlitePath = resolveSqliteApplyPath(args.db, projectRoot, config)\n\t\t\tconst postgresConnectionString = resolvePostgresConnectionString(config)\n\t\t\tconst pending = await listMigrationManifests(outputDir)\n\n\t\t\tfor (const manifest of pending) {\n\t\t\t\tconst report = await runMigration({\n\t\t\t\t\tupStatements: manifest.up,\n\t\t\t\t\tmigrationId: manifest.id,\n\t\t\t\t\tfromVersion: manifest.fromVersion,\n\t\t\t\t\ttoVersion: manifest.toVersion,\n\t\t\t\t\tsqlitePath,\n\t\t\t\t\tpostgresConnectionString,\n\t\t\t\t\tprojectRoot,\n\t\t\t\t})\n\n\t\t\t\tfor (const backend of report.backends) {\n\t\t\t\t\tlogger.step(\n\t\t\t\t\t\t` ${manifest.id} -> ${backend.backend}: applied=${backend.statementsApplied}, skipped=${backend.skipped}, history=${backend.historyRecorded}`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlogger.success('Applied pending migrations successfully.')\n\t\t}\n\t},\n})\n\nasync function readSchemaSnapshot(path: string): Promise<SchemaDefinition | null> {\n\ttry {\n\t\tconst content = await readFile(path, 'utf-8')\n\t\treturn JSON.parse(content) as SchemaDefinition\n\t} catch {\n\t\treturn null\n\t}\n}\n\nasync function confirmBreakingChanges(force: boolean): Promise<boolean> {\n\tif (force) {\n\t\treturn true\n\t}\n\n\tif (!isInteractiveTerminal()) {\n\t\tthrow new Error(\n\t\t\t'Breaking schema changes require confirmation. Re-run with --force to continue or --dry-run to preview.',\n\t\t)\n\t}\n\n\treturn await promptConfirm('Continue and generate a breaking migration?', false)\n}\n\nfunction isInteractiveTerminal(): boolean {\n\treturn process.stdin.isTTY === true && process.stdout.isTTY === true\n}\n\nasync function writeSchemaSnapshot(path: string, schema: SchemaDefinition): Promise<void> {\n\tawait mkdir(dirname(path), { recursive: true })\n\tawait writeFile(path, `${JSON.stringify(schema, null, 2)}\\n`, 'utf-8')\n}\n\nasync function writeMigrationFile(\n\toutputDir: string,\n\tfromVersion: number,\n\ttoVersion: number,\n\tgenerated: ReturnType<typeof generateMigration>,\n): Promise<string> {\n\tconst existing = await readdir(outputDir).catch(() => [])\n\tconst sequence = existing.filter((file) => /^\\d{3}-/.test(file)).length + 1\n\tconst filename = `${String(sequence).padStart(3, '0')}-v${fromVersion}-to-v${toVersion}.ts`\n\tconst path = join(outputDir, filename)\n\tconst migrationId = filename.replace(/\\.ts$/, '')\n\n\tconst fileContent = [\n\t\t`export const up = ${JSON.stringify(generated.up, null, 2)} as const`,\n\t\t'',\n\t\t`export const down = ${JSON.stringify(generated.down, null, 2)} as const`,\n\t\t'',\n\t\t`export const summary = ${JSON.stringify(generated.summary, null, 2)} as const`,\n\t\t'',\n\t\t`export const containsBreakingChanges = ${generated.containsBreakingChanges}`,\n\t\t'',\n\t].join('\\n')\n\n\tawait writeFile(path, fileContent, 'utf-8')\n\n\tconst transformsPath = join(outputDir, `${migrationId}.transforms.ts`)\n\tawait writeFile(transformsPath, generateOperationTransformModule(fromVersion, toVersion), 'utf-8')\n\tawait writeMigrationManifest(join(outputDir, `${migrationId}.json`), {\n\t\tid: migrationId,\n\t\tfromVersion,\n\t\ttoVersion,\n\t\tup: generated.up,\n\t\tdown: generated.down,\n\t\tsummary: generated.summary,\n\t\tcontainsBreakingChanges: generated.containsBreakingChanges,\n\t})\n\treturn path\n}\n\nasync function writeMigrationManifest(path: string, manifest: MigrationManifest): Promise<void> {\n\tawait writeFile(path, `${JSON.stringify(manifest, null, 2)}\\n`, 'utf-8')\n}\n\nasync function listMigrationManifests(outputDir: string): Promise<MigrationManifest[]> {\n\tconst files = await readdir(outputDir).catch(() => [])\n\tconst migrationFiles = files\n\t\t.filter((file) => /^\\d{3}-.*\\.ts$/.test(file))\n\t\t.sort((left, right) => left.localeCompare(right))\n\n\tconst manifests: MigrationManifest[] = []\n\tfor (const file of migrationFiles) {\n\t\tconst id = file.replace(/\\.ts$/, '')\n\t\tconst manifestPath = join(outputDir, `${id}.json`)\n\t\tconst jsonManifest = await readMigrationManifest(manifestPath)\n\n\t\tif (jsonManifest) {\n\t\t\tmanifests.push({ ...jsonManifest, id })\n\t\t\tcontinue\n\t\t}\n\n\t\tconst migrationPath = join(outputDir, file)\n\t\tconst sourceManifest = await readMigrationManifestFromSource(migrationPath, id)\n\t\tmanifests.push(sourceManifest)\n\t}\n\n\treturn manifests\n}\n\nasync function readMigrationManifest(path: string): Promise<MigrationManifest | null> {\n\ttry {\n\t\tconst content = await readFile(path, 'utf-8')\n\t\treturn JSON.parse(content) as MigrationManifest\n\t} catch (error) {\n\t\tconst code = (error as NodeJS.ErrnoException).code\n\t\tif (code === 'ENOENT') {\n\t\t\treturn null\n\t\t}\n\t\tthrow error\n\t}\n}\n\nasync function readMigrationManifestFromSource(\n\tpath: string,\n\tid: string,\n): Promise<MigrationManifest> {\n\tconst content = await readFile(path, 'utf-8')\n\tconst versions = parseVersionsFromMigrationId(id)\n\n\treturn {\n\t\tid,\n\t\tfromVersion: versions.fromVersion,\n\t\ttoVersion: versions.toVersion,\n\t\tup: parseStringArrayExport(content, 'up'),\n\t\tdown: parseStringArrayExport(content, 'down'),\n\t\tsummary: parseStringArrayExport(content, 'summary'),\n\t\tcontainsBreakingChanges: parseBooleanExport(content, 'containsBreakingChanges'),\n\t}\n}\n\nfunction parseVersionsFromMigrationId(id: string): { fromVersion: number; toVersion: number } {\n\tconst match = id.match(/-v(\\d+)-to-v(\\d+)$/)\n\tif (!match) {\n\t\tthrow new Error(`Migration id \"${id}\" does not include a vX-to-vY version suffix.`)\n\t}\n\n\tconst fromVersionText = match[1]\n\tconst toVersionText = match[2]\n\tif (fromVersionText === undefined || toVersionText === undefined) {\n\t\tthrow new Error(`Migration id \"${id}\" does not include a vX-to-vY version suffix.`)\n\t}\n\n\treturn {\n\t\tfromVersion: Number.parseInt(fromVersionText, 10),\n\t\ttoVersion: Number.parseInt(toVersionText, 10),\n\t}\n}\n\nfunction parseStringArrayExport(source: string, exportName: 'up' | 'down' | 'summary'): string[] {\n\tconst expression = parseExportExpression(source, exportName)\n\tconst parsed = JSON.parse(expression) as unknown\n\tif (!Array.isArray(parsed) || parsed.some((item) => typeof item !== 'string')) {\n\t\tthrow new Error(`Migration export \"${exportName}\" must be a string array.`)\n\t}\n\n\treturn parsed\n}\n\nfunction parseBooleanExport(source: string, exportName: 'containsBreakingChanges'): boolean {\n\tconst expression = parseLiteralExport(source, exportName)\n\tif (expression === 'true') return true\n\tif (expression === 'false') return false\n\tthrow new Error(`Migration export \"${exportName}\" must be a boolean literal.`)\n}\n\nfunction parseExportExpression(source: string, exportName: string): string {\n\tconst escapedName = exportName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\tconst regex = new RegExp(`export const ${escapedName} = ([\\\\s\\\\S]*?) as const`)\n\tconst match = source.match(regex)\n\tif (!match || !match[1]) {\n\t\tthrow new Error(`Failed to read migration export \"${exportName}\".`)\n\t}\n\n\treturn match[1].trim()\n}\n\nfunction parseLiteralExport(source: string, exportName: string): string {\n\tconst escapedName = exportName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\tconst regex = new RegExp(`export const ${escapedName} = ([^\\n\\r]+)`)\n\tconst match = source.match(regex)\n\tif (!match || !match[1]) {\n\t\tthrow new Error(`Failed to read migration export \"${exportName}\".`)\n\t}\n\n\treturn match[1].trim()\n}\n\nfunction resolveSqliteApplyPath(\n\tdbArg: unknown,\n\tprojectRoot: string,\n\tconfig: Awaited<ReturnType<typeof loadKoraConfig>>,\n): string | undefined {\n\tif (typeof dbArg === 'string') {\n\t\treturn resolve(projectRoot, dbArg)\n\t}\n\n\tconst sync = config?.dev?.sync\n\tif (typeof sync === 'object' && sync !== null) {\n\t\tif (sync.store === 'sqlite') {\n\t\t\treturn join(projectRoot, 'kora-sync.db')\n\t\t}\n\t\tif (typeof sync.store === 'object' && sync.store !== null && sync.store.type === 'sqlite') {\n\t\t\tif (typeof sync.store.filename === 'string' && sync.store.filename.length > 0) {\n\t\t\t\treturn resolve(projectRoot, sync.store.filename)\n\t\t\t}\n\t\t\treturn join(projectRoot, 'kora-sync.db')\n\t\t}\n\t}\n\n\treturn undefined\n}\n\nfunction resolvePostgresConnectionString(\n\tconfig: Awaited<ReturnType<typeof loadKoraConfig>>,\n): string | undefined {\n\tconst sync = config?.dev?.sync\n\tif (typeof sync !== 'object' || sync === null) return undefined\n\n\tif (sync.store === 'postgres') {\n\t\treturn process.env.DATABASE_URL\n\t}\n\n\tif (typeof sync.store === 'object' && sync.store !== null && sync.store.type === 'postgres') {\n\t\treturn sync.store.connectionString\n\t}\n\n\treturn undefined\n}\n","import { generateSQL } from '@korajs/core'\nimport type { CollectionDefinition, FieldDescriptor, SchemaDefinition } from '@korajs/core'\nimport type { SchemaDiff } from './schema-differ'\nimport { getChangedCollections } from './schema-differ'\n\nexport interface GeneratedMigration {\n\tup: string[]\n\tdown: string[]\n\tsummary: string[]\n\tcontainsBreakingChanges: boolean\n}\n\n/**\n * Generates SQL up/down migration statements from a schema diff.\n */\nexport function generateMigration(\n\tprevious: SchemaDefinition,\n\tcurrent: SchemaDefinition,\n\tdiff: SchemaDiff,\n): GeneratedMigration {\n\tconst up: string[] = []\n\tconst down: string[] = []\n\n\tfor (const change of diff.changes) {\n\t\tif (change.type === 'collection-added') {\n\t\t\tconst collectionDef = current.collections[change.collection]\n\t\t\tif (!collectionDef) continue\n\t\t\tup.push(...generateSQL(change.collection, collectionDef))\n\t\t\tdown.push(...dropCollectionStatements(change.collection))\n\t\t}\n\n\t\tif (change.type === 'collection-removed') {\n\t\t\tconst collectionDef = previous.collections[change.collection]\n\t\t\tup.push(...dropCollectionStatements(change.collection))\n\t\t\tif (collectionDef) {\n\t\t\t\tdown.push(...generateSQL(change.collection, collectionDef))\n\t\t\t}\n\t\t}\n\t}\n\n\tconst changedCollections = getChangedCollections(diff).filter(\n\t\t(collection) =>\n\t\t\tcollection in previous.collections &&\n\t\t\tcollection in current.collections &&\n\t\t\tdiff.changes.some(\n\t\t\t\t(change) =>\n\t\t\t\t\tchange.collection === collection &&\n\t\t\t\t\t(change.type === 'field-added' ||\n\t\t\t\t\t\tchange.type === 'field-removed' ||\n\t\t\t\t\t\tchange.type === 'field-changed' ||\n\t\t\t\t\t\tchange.type === 'index-added' ||\n\t\t\t\t\t\tchange.type === 'index-removed'),\n\t\t\t),\n\t)\n\n\tfor (const collection of changedCollections) {\n\t\tconst previousDef = previous.collections[collection]\n\t\tconst currentDef = current.collections[collection]\n\t\tif (!previousDef || !currentDef) continue\n\n\t\tvalidateRebuildSafety(collection, previousDef, currentDef)\n\n\t\tup.push(...generateRebuildStatements(collection, previousDef, currentDef))\n\t\tdown.push(...generateRebuildStatements(collection, currentDef, previousDef))\n\t}\n\n\tdown.reverse()\n\n\treturn {\n\t\tup,\n\t\tdown,\n\t\tsummary: diff.changes.map(formatChange),\n\t\tcontainsBreakingChanges: diff.hasBreakingChanges,\n\t}\n}\n\nfunction generateRebuildStatements(\n\tcollection: string,\n\tfrom: CollectionDefinition,\n\tto: CollectionDefinition,\n): string[] {\n\tconst table = quoteIdentifier(collection)\n\tconst tempTable = quoteIdentifier(`_kora_mig_${collection}_new`)\n\n\tconst targetColumns = [\n\t\t'id TEXT PRIMARY KEY NOT NULL',\n\t\t...Object.entries(to.fields).map(([field, descriptor]) => columnDefinition(field, descriptor)),\n\t\t'_created_at INTEGER NOT NULL',\n\t\t'_updated_at INTEGER NOT NULL',\n\t\t'_deleted INTEGER NOT NULL DEFAULT 0',\n\t]\n\n\tconst statements: string[] = []\n\tstatements.push(`CREATE TABLE ${tempTable} (\\n ${targetColumns.join(',\\n ')}\\n)`)\n\n\tconst toFields = Object.keys(to.fields)\n\tconst columns = ['id', ...toFields, '_created_at', '_updated_at', '_deleted']\n\tconst selectExpressions = columns.map((column) =>\n\t\tprojectionForColumn(column, from.fields, to.fields[column] ?? null),\n\t)\n\n\tstatements.push(\n\t\t`INSERT INTO ${tempTable} (${columns.map(quoteIdentifier).join(', ')}) SELECT ${selectExpressions.join(', ')} FROM ${table}`,\n\t)\n\tstatements.push(`DROP TABLE ${table}`)\n\tstatements.push(`ALTER TABLE ${tempTable} RENAME TO ${table}`)\n\n\tfor (const indexField of to.indexes) {\n\t\tstatements.push(\n\t\t\t`CREATE INDEX IF NOT EXISTS idx_${collection}_${indexField} ON ${table} (${quoteIdentifier(indexField)})`,\n\t\t)\n\t}\n\n\treturn statements\n}\n\nfunction validateRebuildSafety(\n\tcollection: string,\n\tfrom: CollectionDefinition,\n\tto: CollectionDefinition,\n): void {\n\tfor (const [fieldName, descriptor] of Object.entries(to.fields)) {\n\t\tif (fieldName in from.fields) continue\n\t\tif (descriptor.required && descriptor.defaultValue === undefined && !descriptor.auto) {\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot auto-migrate collection \"${collection}\": added required field \"${fieldName}\" has no default value.`,\n\t\t\t)\n\t\t}\n\t}\n\n\tfor (const [fieldName, targetDescriptor] of Object.entries(to.fields)) {\n\t\tconst sourceDescriptor = from.fields[fieldName]\n\t\tif (!sourceDescriptor) continue\n\t\tif (canTransformField(sourceDescriptor, targetDescriptor)) continue\n\n\t\tif (\n\t\t\ttargetDescriptor.required &&\n\t\t\ttargetDescriptor.defaultValue === undefined &&\n\t\t\t!targetDescriptor.auto\n\t\t) {\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot auto-migrate collection \"${collection}\": changed required field \"${fieldName}\" from ${sourceDescriptor.kind} to ${targetDescriptor.kind} without a safe transform/default.`,\n\t\t\t)\n\t\t}\n\t}\n}\n\nfunction projectionForColumn(\n\tcolumn: string,\n\tfromFields: Record<string, FieldDescriptor>,\n\ttargetDescriptor: FieldDescriptor | null,\n): string {\n\tif (\n\t\tcolumn === 'id' ||\n\t\tcolumn === '_created_at' ||\n\t\tcolumn === '_updated_at' ||\n\t\tcolumn === '_deleted'\n\t) {\n\t\treturn quoteIdentifier(column)\n\t}\n\n\tconst sourceDescriptor = fromFields[column]\n\tif (sourceDescriptor && targetDescriptor) {\n\t\treturn projectionForFieldTransform(column, sourceDescriptor, targetDescriptor)\n\t}\n\n\tif (sourceDescriptor) {\n\t\treturn quoteIdentifier(column)\n\t}\n\n\tif (!targetDescriptor) {\n\t\treturn 'NULL'\n\t}\n\n\tif (targetDescriptor.auto && targetDescriptor.kind === 'timestamp') {\n\t\treturn \"CAST(strftime('%s','now') AS INTEGER) * 1000\"\n\t}\n\n\tif (targetDescriptor.defaultValue !== undefined) {\n\t\treturn sqlLiteral(targetDescriptor.defaultValue)\n\t}\n\n\treturn 'NULL'\n}\n\nfunction projectionForFieldTransform(\n\tcolumn: string,\n\tsource: FieldDescriptor,\n\ttarget: FieldDescriptor,\n): string {\n\tconst sourceColumn = quoteIdentifier(column)\n\tif (source.kind === target.kind && source.itemKind === target.itemKind) {\n\t\tif (target.kind === 'enum' && target.enumValues && target.enumValues.length > 0) {\n\t\t\tconst allowed = target.enumValues.map((value) => sqlLiteral(value)).join(', ')\n\t\t\tconst fallback =\n\t\t\t\ttarget.defaultValue !== undefined ? sqlLiteral(target.defaultValue) : sourceColumn\n\t\t\treturn `CASE WHEN ${sourceColumn} IN (${allowed}) THEN ${sourceColumn} ELSE ${fallback} END`\n\t\t}\n\t\treturn sourceColumn\n\t}\n\n\tif (target.kind === 'string') {\n\t\treturn `CAST(${sourceColumn} AS TEXT)`\n\t}\n\n\tif (target.kind === 'number' || target.kind === 'timestamp') {\n\t\tif (\n\t\t\tsource.kind === 'string' ||\n\t\t\tsource.kind === 'enum' ||\n\t\t\tsource.kind === 'number' ||\n\t\t\tsource.kind === 'timestamp' ||\n\t\t\tsource.kind === 'boolean'\n\t\t) {\n\t\t\tconst castType = target.kind === 'number' ? 'REAL' : 'INTEGER'\n\t\t\treturn `CASE WHEN ${sourceColumn} IS NULL THEN NULL ELSE CAST(${sourceColumn} AS ${castType}) END`\n\t\t}\n\t}\n\n\tif (target.kind === 'boolean') {\n\t\tif (source.kind === 'number' || source.kind === 'timestamp' || source.kind === 'boolean') {\n\t\t\treturn `CASE WHEN ${sourceColumn} IS NULL THEN NULL WHEN CAST(${sourceColumn} AS REAL) = 0 THEN 0 ELSE 1 END`\n\t\t}\n\n\t\tif (source.kind === 'string' || source.kind === 'enum') {\n\t\t\treturn `CASE WHEN ${sourceColumn} IS NULL THEN NULL WHEN LOWER(TRIM(CAST(${sourceColumn} AS TEXT))) IN ('1','true','t','yes','y','on') THEN 1 WHEN LOWER(TRIM(CAST(${sourceColumn} AS TEXT))) IN ('0','false','f','no','n','off') THEN 0 ELSE ${projectionFallback(target)} END`\n\t\t}\n\t}\n\n\tif (target.kind === 'enum' && target.enumValues && target.enumValues.length > 0) {\n\t\tif (source.kind === 'string' || source.kind === 'enum') {\n\t\t\tconst allowed = target.enumValues.map((value) => sqlLiteral(value)).join(', ')\n\t\t\treturn `CASE WHEN ${sourceColumn} IN (${allowed}) THEN ${sourceColumn} ELSE ${projectionFallback(target)} END`\n\t\t}\n\t}\n\n\tif (target.kind === 'array' && source.kind === 'array' && source.itemKind === target.itemKind) {\n\t\treturn sourceColumn\n\t}\n\n\tif (target.auto && target.kind === 'timestamp') {\n\t\treturn \"CAST(strftime('%s','now') AS INTEGER) * 1000\"\n\t}\n\n\treturn projectionFallback(target)\n}\n\nfunction canTransformField(source: FieldDescriptor, target: FieldDescriptor): boolean {\n\tif (source.kind === target.kind && source.itemKind === target.itemKind) {\n\t\treturn true\n\t}\n\n\tif (target.kind === 'string') {\n\t\treturn true\n\t}\n\n\tif (target.kind === 'number' || target.kind === 'timestamp') {\n\t\treturn (\n\t\t\tsource.kind === 'string' ||\n\t\t\tsource.kind === 'enum' ||\n\t\t\tsource.kind === 'number' ||\n\t\t\tsource.kind === 'timestamp' ||\n\t\t\tsource.kind === 'boolean'\n\t\t)\n\t}\n\n\tif (target.kind === 'boolean') {\n\t\treturn (\n\t\t\tsource.kind === 'number' ||\n\t\t\tsource.kind === 'timestamp' ||\n\t\t\tsource.kind === 'boolean' ||\n\t\t\tsource.kind === 'string' ||\n\t\t\tsource.kind === 'enum'\n\t\t)\n\t}\n\n\tif (target.kind === 'enum') {\n\t\treturn source.kind === 'string' || source.kind === 'enum'\n\t}\n\n\tif (target.kind === 'array') {\n\t\treturn source.kind === 'array' && source.itemKind === target.itemKind\n\t}\n\n\tif (target.kind === 'richtext') {\n\t\treturn source.kind === 'richtext'\n\t}\n\n\treturn false\n}\n\nfunction projectionFallback(target: FieldDescriptor): string {\n\tif (target.auto && target.kind === 'timestamp') {\n\t\treturn \"CAST(strftime('%s','now') AS INTEGER) * 1000\"\n\t}\n\n\tif (target.defaultValue !== undefined) {\n\t\treturn sqlLiteral(target.defaultValue)\n\t}\n\n\treturn 'NULL'\n}\n\nfunction dropCollectionStatements(collection: string): string[] {\n\tconst table = quoteIdentifier(collection)\n\tconst opsTable = quoteIdentifier(`_kora_ops_${collection}`)\n\treturn [`DROP TABLE IF EXISTS ${table}`, `DROP TABLE IF EXISTS ${opsTable}`]\n}\n\nfunction columnDefinition(fieldName: string, descriptor: FieldDescriptor): string {\n\tconst sqlType = mapFieldType(descriptor)\n\tconst parts = [quoteIdentifier(fieldName), sqlType]\n\n\tif (descriptor.required && descriptor.defaultValue === undefined && !descriptor.auto) {\n\t\tparts.push('NOT NULL')\n\t}\n\n\tif (descriptor.defaultValue !== undefined) {\n\t\tparts.push(`DEFAULT ${sqlLiteral(descriptor.defaultValue)}`)\n\t}\n\n\tif (descriptor.kind === 'enum' && descriptor.enumValues) {\n\t\tconst values = descriptor.enumValues.map((value) => sqlLiteral(value)).join(', ')\n\t\tparts.push(`CHECK (${quoteIdentifier(fieldName)} IN (${values}))`)\n\t}\n\n\treturn parts.join(' ')\n}\n\nfunction mapFieldType(descriptor: FieldDescriptor): string {\n\tswitch (descriptor.kind) {\n\t\tcase 'string':\n\t\t\treturn 'TEXT'\n\t\tcase 'number':\n\t\t\treturn 'REAL'\n\t\tcase 'boolean':\n\t\t\treturn 'INTEGER'\n\t\tcase 'enum':\n\t\t\treturn 'TEXT'\n\t\tcase 'timestamp':\n\t\t\treturn 'INTEGER'\n\t\tcase 'array':\n\t\t\treturn 'TEXT'\n\t\tcase 'richtext':\n\t\t\treturn 'BLOB'\n\t}\n}\n\nfunction sqlLiteral(value: unknown): string {\n\tif (value === null) return 'NULL'\n\tif (typeof value === 'number') return String(value)\n\tif (typeof value === 'boolean') return value ? '1' : '0'\n\tif (typeof value === 'string') return `'${value.replaceAll(\"'\", \"''\")}'`\n\treturn `'${JSON.stringify(value).replaceAll(\"'\", \"''\")}'`\n}\n\nfunction quoteIdentifier(identifier: string): string {\n\tif (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(identifier)) {\n\t\tthrow new Error(`Invalid SQL identifier: ${identifier}`)\n\t}\n\treturn identifier\n}\n\nfunction formatChange(change: SchemaDiff['changes'][number]): string {\n\tswitch (change.type) {\n\t\tcase 'collection-added':\n\t\t\treturn `+ collection ${change.collection}`\n\t\tcase 'collection-removed':\n\t\t\treturn `- collection ${change.collection}`\n\t\tcase 'field-added':\n\t\t\treturn `+ ${change.collection}.${change.field}`\n\t\tcase 'field-removed':\n\t\t\treturn `- ${change.collection}.${change.field}`\n\t\tcase 'field-changed':\n\t\t\treturn `~ ${change.collection}.${change.field}`\n\t\tcase 'index-added':\n\t\t\treturn `+ index ${change.collection}.${change.index}`\n\t\tcase 'index-removed':\n\t\t\treturn `- index ${change.collection}.${change.index}`\n\t}\n}\n","import type { FieldDescriptor, SchemaDefinition } from '@korajs/core'\n\nexport type SchemaChange =\n\t| { type: 'collection-added'; collection: string }\n\t| { type: 'collection-removed'; collection: string }\n\t| { type: 'field-added'; collection: string; field: string; descriptor: FieldDescriptor }\n\t| { type: 'field-removed'; collection: string; field: string; descriptor: FieldDescriptor }\n\t| {\n\t\t\ttype: 'field-changed'\n\t\t\tcollection: string\n\t\t\tfield: string\n\t\t\tbefore: FieldDescriptor\n\t\t\tafter: FieldDescriptor\n\t }\n\t| { type: 'index-added'; collection: string; index: string }\n\t| { type: 'index-removed'; collection: string; index: string }\n\nexport interface SchemaDiff {\n\tfromVersion: number\n\ttoVersion: number\n\tchanges: SchemaChange[]\n\thasChanges: boolean\n\thasBreakingChanges: boolean\n}\n\n/**\n * Computes a structural schema diff.\n */\nexport function diffSchemas(previous: SchemaDefinition, current: SchemaDefinition): SchemaDiff {\n\tconst changes: SchemaChange[] = []\n\n\tconst previousCollections = new Set(Object.keys(previous.collections))\n\tconst currentCollections = new Set(Object.keys(current.collections))\n\n\tfor (const collection of currentCollections) {\n\t\tif (!previousCollections.has(collection)) {\n\t\t\tchanges.push({ type: 'collection-added', collection })\n\t\t}\n\t}\n\n\tfor (const collection of previousCollections) {\n\t\tif (!currentCollections.has(collection)) {\n\t\t\tchanges.push({ type: 'collection-removed', collection })\n\t\t}\n\t}\n\n\tfor (const collection of currentCollections) {\n\t\tif (!previousCollections.has(collection)) continue\n\n\t\tconst previousDef = previous.collections[collection]\n\t\tconst currentDef = current.collections[collection]\n\t\tif (!previousDef || !currentDef) continue\n\n\t\tconst previousFields = previousDef.fields\n\t\tconst currentFields = currentDef.fields\n\n\t\tfor (const [fieldName, currentField] of Object.entries(currentFields)) {\n\t\t\tconst previousField = previousFields[fieldName]\n\t\t\tif (!previousField) {\n\t\t\t\tchanges.push({\n\t\t\t\t\ttype: 'field-added',\n\t\t\t\t\tcollection,\n\t\t\t\t\tfield: fieldName,\n\t\t\t\t\tdescriptor: currentField,\n\t\t\t\t})\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (!fieldDescriptorsEqual(previousField, currentField)) {\n\t\t\t\tchanges.push({\n\t\t\t\t\ttype: 'field-changed',\n\t\t\t\t\tcollection,\n\t\t\t\t\tfield: fieldName,\n\t\t\t\t\tbefore: previousField,\n\t\t\t\t\tafter: currentField,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tfor (const [fieldName, previousField] of Object.entries(previousFields)) {\n\t\t\tif (!(fieldName in currentFields)) {\n\t\t\t\tchanges.push({\n\t\t\t\t\ttype: 'field-removed',\n\t\t\t\t\tcollection,\n\t\t\t\t\tfield: fieldName,\n\t\t\t\t\tdescriptor: previousField,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tconst previousIndexes = new Set(previousDef.indexes)\n\t\tconst currentIndexes = new Set(currentDef.indexes)\n\n\t\tfor (const index of currentIndexes) {\n\t\t\tif (!previousIndexes.has(index)) {\n\t\t\t\tchanges.push({ type: 'index-added', collection, index })\n\t\t\t}\n\t\t}\n\n\t\tfor (const index of previousIndexes) {\n\t\t\tif (!currentIndexes.has(index)) {\n\t\t\t\tchanges.push({ type: 'index-removed', collection, index })\n\t\t\t}\n\t\t}\n\t}\n\n\tchanges.sort(compareChanges)\n\n\treturn {\n\t\tfromVersion: previous.version,\n\t\ttoVersion: current.version,\n\t\tchanges,\n\t\thasChanges: changes.length > 0,\n\t\thasBreakingChanges: changes.some(isBreakingChange),\n\t}\n}\n\nexport function getChangedCollections(diff: SchemaDiff): string[] {\n\tconst collections = new Set<string>()\n\tfor (const change of diff.changes) {\n\t\tcollections.add(change.collection)\n\t}\n\treturn [...collections].sort()\n}\n\nfunction isBreakingChange(change: SchemaChange): boolean {\n\tif (change.type === 'collection-removed' || change.type === 'field-removed') return true\n\tif (change.type === 'field-changed') {\n\t\tif (change.before.kind !== change.after.kind) return true\n\t\tif (change.before.itemKind !== change.after.itemKind) return true\n\t\tif (serializeEnum(change.before.enumValues) !== serializeEnum(change.after.enumValues))\n\t\t\treturn true\n\t\tif (change.before.required !== change.after.required && change.after.required) return true\n\t\treturn false\n\t}\n\tif (change.type === 'field-added') {\n\t\tconst descriptor = change.descriptor\n\t\treturn descriptor.required && descriptor.defaultValue === undefined && !descriptor.auto\n\t}\n\treturn false\n}\n\nfunction fieldDescriptorsEqual(left: FieldDescriptor, right: FieldDescriptor): boolean {\n\treturn (\n\t\tleft.kind === right.kind &&\n\t\tleft.required === right.required &&\n\t\tleft.defaultValue === right.defaultValue &&\n\t\tleft.auto === right.auto &&\n\t\tleft.itemKind === right.itemKind &&\n\t\tserializeEnum(left.enumValues) === serializeEnum(right.enumValues)\n\t)\n}\n\nfunction serializeEnum(values: readonly string[] | null): string {\n\tif (!values) return ''\n\treturn values.join('|')\n}\n\nfunction compareChanges(left: SchemaChange, right: SchemaChange): number {\n\tif (left.collection < right.collection) return -1\n\tif (left.collection > right.collection) return 1\n\n\tif (left.type < right.type) return -1\n\tif (left.type > right.type) return 1\n\n\tconst leftKey = 'field' in left ? left.field : 'index' in left ? left.index : ''\n\tconst rightKey = 'field' in right ? right.field : 'index' in right ? right.index : ''\n\n\tif (leftKey < rightKey) return -1\n\tif (leftKey > rightKey) return 1\n\treturn 0\n}\n","export interface RunMigrationOptions {\n\tupStatements: string[]\n\tmigrationId?: string\n\tfromVersion?: number\n\ttoVersion?: number\n\tsqlitePath?: string\n\tpostgresConnectionString?: string\n\tprojectRoot?: string\n\tsqliteDriver?: {\n\t\topen(path: string): {\n\t\t\texec(sql: string): void\n\t\t\tisMigrationApplied?(id: string): boolean\n\t\t\tclose?(): void\n\t\t}\n\t}\n\tpostgresClientFactory?: (connectionString: string) => {\n\t\tunsafe(query: string): Promise<unknown>\n\t\tend?(): Promise<void>\n\t}\n}\n\nexport interface BackendApplyReport {\n\tbackend: 'sqlite' | 'postgres'\n\tstatementsApplied: number\n\thistoryRecorded: boolean\n\tskipped: boolean\n}\n\nexport interface RunMigrationReport {\n\tbackends: BackendApplyReport[]\n}\n\nexport class MigrationApplyError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly backend: 'sqlite' | 'postgres',\n\t\tpublic readonly report: RunMigrationReport,\n\t) {\n\t\tsuper(message)\n\t\tthis.name = 'MigrationApplyError'\n\t}\n}\n\n/**\n * Applies migration statements to configured backends.\n */\nexport async function runMigration(options: RunMigrationOptions): Promise<RunMigrationReport> {\n\tconst report: RunMigrationReport = { backends: [] }\n\tconst migrationId = options.migrationId ?? `migration-${Date.now()}`\n\tconst fromVersion = options.fromVersion ?? 0\n\tconst toVersion = options.toVersion ?? 0\n\n\tif (options.sqlitePath) {\n\t\ttry {\n\t\t\tconst sqliteReport = await runSqliteMigration(\n\t\t\t\toptions.sqlitePath,\n\t\t\t\toptions.upStatements,\n\t\t\t\tmigrationId,\n\t\t\t\tfromVersion,\n\t\t\t\ttoVersion,\n\t\t\t\toptions.projectRoot,\n\t\t\t\toptions.sqliteDriver,\n\t\t\t)\n\t\t\treport.backends.push(sqliteReport)\n\t\t} catch (error) {\n\t\t\tthrow new MigrationApplyError((error as Error).message, 'sqlite', report)\n\t\t}\n\t}\n\n\tif (options.postgresConnectionString) {\n\t\ttry {\n\t\t\tconst postgresReport = await runPostgresMigration(\n\t\t\t\toptions.postgresConnectionString,\n\t\t\t\toptions.upStatements,\n\t\t\t\tmigrationId,\n\t\t\t\tfromVersion,\n\t\t\t\ttoVersion,\n\t\t\t\toptions.postgresClientFactory,\n\t\t\t)\n\t\t\treport.backends.push(postgresReport)\n\t\t} catch (error) {\n\t\t\tthrow new MigrationApplyError((error as Error).message, 'postgres', report)\n\t\t}\n\t}\n\n\treturn report\n}\n\nasync function runSqliteMigration(\n\tpath: string,\n\tstatements: string[],\n\tmigrationId: string,\n\tfromVersion: number,\n\ttoVersion: number,\n\tprojectRoot?: string,\n\tdriverOverride?: RunMigrationOptions['sqliteDriver'],\n): Promise<BackendApplyReport> {\n\tconst driver = driverOverride ?? (await loadSqliteDriver(projectRoot))\n\tconst db = driver.open(path)\n\tlet statementsApplied = 0\n\n\ttry {\n\t\tdb.exec('BEGIN')\n\t\tdb.exec(\n\t\t\t'CREATE TABLE IF NOT EXISTS _kora_migrations (id TEXT PRIMARY KEY NOT NULL, from_version INTEGER NOT NULL, to_version INTEGER NOT NULL, applied_at INTEGER NOT NULL)',\n\t\t)\n\t\tconst alreadyApplied =\n\t\t\ttypeof db.isMigrationApplied === 'function' ? db.isMigrationApplied(migrationId) : false\n\t\tif (alreadyApplied) {\n\t\t\tdb.exec('COMMIT')\n\t\t\treturn {\n\t\t\t\tbackend: 'sqlite',\n\t\t\t\tstatementsApplied: 0,\n\t\t\t\thistoryRecorded: true,\n\t\t\t\tskipped: true,\n\t\t\t}\n\t\t}\n\t\tfor (const statement of statements) {\n\t\t\tdb.exec(statement)\n\t\t\tstatementsApplied++\n\t\t}\n\t\tdb.exec(\n\t\t\t`INSERT OR REPLACE INTO _kora_migrations (id, from_version, to_version, applied_at) VALUES (${sqlLiteral(migrationId)}, ${fromVersion}, ${toVersion}, ${Date.now()})`,\n\t\t)\n\t\tdb.exec('COMMIT')\n\n\t\treturn {\n\t\t\tbackend: 'sqlite',\n\t\t\tstatementsApplied,\n\t\t\thistoryRecorded: true,\n\t\t\tskipped: false,\n\t\t}\n\t} catch (error) {\n\t\ttry {\n\t\t\tdb.exec('ROLLBACK')\n\t\t} catch {\n\t\t\t// best effort\n\t\t}\n\t\tthrow error\n\t} finally {\n\t\tif (typeof db.close === 'function') {\n\t\t\tdb.close()\n\t\t}\n\t}\n}\n\nasync function loadSqliteDriver(projectRoot?: string): Promise<{\n\topen(path: string): {\n\t\texec(sql: string): void\n\t\tisMigrationApplied(id: string): boolean\n\t\tclose(): void\n\t}\n}> {\n\ttry {\n\t\tconst { createRequire } = await import('node:module')\n\t\tconst requireFrom = createRequire(projectRoot ? `${projectRoot}/package.json` : import.meta.url)\n\t\tconst Database = requireFrom('better-sqlite3') as new (\n\t\t\tpath: string,\n\t\t) => {\n\t\t\texec(sql: string): void\n\t\t\tprepare(sql: string): {\n\t\t\t\tget(...params: unknown[]): { count?: number } | undefined\n\t\t\t}\n\t\t\tclose(): void\n\t\t}\n\n\t\treturn {\n\t\t\topen(path: string) {\n\t\t\t\tconst db = new Database(path)\n\t\t\t\treturn {\n\t\t\t\t\texec(sql: string) {\n\t\t\t\t\t\tdb.exec(sql)\n\t\t\t\t\t},\n\t\t\t\t\tisMigrationApplied(id: string) {\n\t\t\t\t\t\tconst row = db\n\t\t\t\t\t\t\t.prepare('SELECT COUNT(*) AS count FROM _kora_migrations WHERE id = ?')\n\t\t\t\t\t\t\t.get(id)\n\t\t\t\t\t\treturn (row?.count ?? 0) > 0\n\t\t\t\t\t},\n\t\t\t\t\tclose() {\n\t\t\t\t\t\tdb.close()\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\t} catch {\n\t\tthrow new Error(\n\t\t\t'SQLite migration apply requires the \"better-sqlite3\" package in the target project dependencies.',\n\t\t)\n\t}\n}\n\nasync function runPostgresMigration(\n\tconnectionString: string,\n\tstatements: string[],\n\tmigrationId: string,\n\tfromVersion: number,\n\ttoVersion: number,\n\tclientFactoryOverride?: RunMigrationOptions['postgresClientFactory'],\n): Promise<BackendApplyReport> {\n\tconst sql =\n\t\ttypeof clientFactoryOverride === 'function'\n\t\t\t? clientFactoryOverride(connectionString)\n\t\t\t: (await loadPostgresModule()).default(connectionString)\n\tlet statementsApplied = 0\n\n\ttry {\n\t\tawait sql.unsafe('BEGIN')\n\t\tawait sql.unsafe(\n\t\t\t'CREATE TABLE IF NOT EXISTS _kora_migrations (id TEXT PRIMARY KEY, from_version INTEGER NOT NULL, to_version INTEGER NOT NULL, applied_at BIGINT NOT NULL)',\n\t\t)\n\t\tconst existing = (await sql.unsafe(\n\t\t\t`SELECT COUNT(*)::int AS count FROM _kora_migrations WHERE id = ${sqlLiteral(migrationId)}`,\n\t\t)) as Array<{ count: number }>\n\t\tif ((existing[0]?.count ?? 0) > 0) {\n\t\t\tawait sql.unsafe('COMMIT')\n\t\t\treturn {\n\t\t\t\tbackend: 'postgres',\n\t\t\t\tstatementsApplied: 0,\n\t\t\t\thistoryRecorded: true,\n\t\t\t\tskipped: true,\n\t\t\t}\n\t\t}\n\t\tfor (const statement of statements) {\n\t\t\tawait sql.unsafe(statement)\n\t\t\tstatementsApplied++\n\t\t}\n\t\tawait sql.unsafe(\n\t\t\t`INSERT INTO _kora_migrations (id, from_version, to_version, applied_at) VALUES (${sqlLiteral(migrationId)}, ${fromVersion}, ${toVersion}, ${Date.now()}) ON CONFLICT (id) DO UPDATE SET from_version = EXCLUDED.from_version, to_version = EXCLUDED.to_version, applied_at = EXCLUDED.applied_at`,\n\t\t)\n\t\tawait sql.unsafe('COMMIT')\n\n\t\treturn {\n\t\t\tbackend: 'postgres',\n\t\t\tstatementsApplied,\n\t\t\thistoryRecorded: true,\n\t\t\tskipped: false,\n\t\t}\n\t} catch (error) {\n\t\ttry {\n\t\t\tawait sql.unsafe('ROLLBACK')\n\t\t} catch {\n\t\t\t// best effort\n\t\t}\n\t\tthrow error\n\t} finally {\n\t\tif (typeof sql.end === 'function') {\n\t\t\tawait sql.end()\n\t\t}\n\t}\n}\n\nfunction sqlLiteral(value: string): string {\n\treturn `'${value.replaceAll(\"'\", \"''\")}'`\n}\n\nasync function loadPostgresModule(): Promise<{\n\tdefault: (connectionString: string) => {\n\t\tunsafe: (query: string) => Promise<unknown>\n\t\tend?: () => Promise<void>\n\t}\n}> {\n\ttry {\n\t\tconst dynamicImport = new Function('specifier', 'return import(specifier)') as (\n\t\t\tspecifier: string,\n\t\t) => Promise<unknown>\n\t\tconst mod = await dynamicImport('postgres')\n\t\tif (typeof mod === 'object' && mod !== null && 'default' in mod) {\n\t\t\treturn mod as {\n\t\t\t\tdefault: (connectionString: string) => {\n\t\t\t\t\tunsafe: (query: string) => Promise<unknown>\n\t\t\t\t\tend?: () => Promise<void>\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthrow new Error('Invalid postgres module')\n\t} catch {\n\t\tthrow new Error(\n\t\t\t'PostgreSQL migration apply requires the \"postgres\" package in the target project dependencies.',\n\t\t)\n\t}\n}\n","/**\n * Generates a stub operation-transform module for sync-time op log migration.\n */\nexport function generateOperationTransformModule(fromVersion: number, toVersion: number): string {\n\treturn [\n\t\t\"import type { Operation, OperationTransform } from '@korajs/core'\",\n\t\t'',\n\t\t'/**',\n\t\t` * Operation transforms for schema v${fromVersion} → v${toVersion}.`,\n\t\t' * Implement `transform` to rewrite or drop legacy operations during sync.',\n\t\t' * @see https://korajs.dev/docs/migrations',\n\t\t' */',\n\t\t'export const operationTransforms: OperationTransform[] = [',\n\t\t' {',\n\t\t` fromVersion: ${fromVersion},`,\n\t\t` toVersion: ${toVersion},`,\n\t\t' transform(operation: Operation): Operation | null {',\n\t\t' // Return null to drop unmigratable operations.',\n\t\t' return operation',\n\t\t' },',\n\t\t' },',\n\t\t']',\n\t\t'',\n\t].join('\\n')\n}\n","import { defineCommand } from 'citty'\nimport { createLogger } from '../../utils/logger'\n\nconst DEFAULT_SYNC_PORT = 3001\nconst STATUS_ENDPOINT = '/__kora/status'\n\ninterface ServerStatusResponse {\n\trunning: boolean\n\tconnectedClients: number\n\tport: number | null\n\ttotalOperations: number\n\tuptime: number\n\tversion: string\n\tschemaVersion: number\n\tconnectedNodeIds: string[]\n\tpeakConnections: number\n\tconnectionsTotal: number\n\toperationsReceived: number\n\toperationsSent: number\n\terrorCount: number\n}\n\n/**\n * Fetch server status from a Kora sync server.\n */\nasync function fetchServerStatus(url: string, token?: string): Promise<ServerStatusResponse> {\n\tconst statusUrl = `${url.replace(/\\/$/, '')}${STATUS_ENDPOINT}`\n\tconst response = await fetch(statusUrl, {\n\t\theaders: token ? { Authorization: `Bearer ${token}` } : undefined,\n\t})\n\tif (!response.ok) {\n\t\tthrow new Error(\n\t\t\t`Failed to fetch status from ${statusUrl}: ${response.status} ${response.statusText}`,\n\t\t)\n\t}\n\n\treturn (await response.json()) as ServerStatusResponse\n}\n\nfunction formatUptime(ms: number): string {\n\tconst seconds = Math.floor(ms / 1000)\n\tconst minutes = Math.floor(seconds / 60)\n\tconst hours = Math.floor(minutes / 60)\n\tconst days = Math.floor(hours / 24)\n\tconst parts: string[] = []\n\tif (days > 0) parts.push(`${days}d`)\n\tif (hours % 24 > 0) parts.push(`${hours % 24}h`)\n\tif (minutes % 60 > 0) parts.push(`${minutes % 60}m`)\n\tparts.push(`${seconds % 60}s`)\n\treturn parts.join(' ')\n}\n\n/**\n * The `status` command — shows the current status of a Kora sync server.\n */\nexport const statusCommand = defineCommand({\n\tmeta: {\n\t\tname: 'status',\n\t\tdescription: 'Show Kora sync server status',\n\t},\n\targs: {\n\t\turl: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Sync server URL (default: http://localhost:3001)',\n\t\t\tdefault: `http://localhost:${DEFAULT_SYNC_PORT}`,\n\t\t},\n\t\twatch: {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Live-updating status (like htop)',\n\t\t\tdefault: false,\n\t\t\talias: 'w',\n\t\t},\n\t\ttoken: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Admin token (defaults to KORA_ADMIN_TOKEN)',\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tconst logger = createLogger()\n\t\tconst url = typeof args.url === 'string' ? args.url : `http://localhost:${DEFAULT_SYNC_PORT}`\n\t\tconst watch = args.watch === true\n\t\tconst token =\n\t\t\ttypeof args.token === 'string' ? args.token : (process.env.KORA_ADMIN_TOKEN ?? undefined)\n\n\t\ttry {\n\t\t\tif (watch) {\n\t\t\t\t// Live-updating mode\n\t\t\t\tconsole.clear()\n\t\t\t\tlogger.banner()\n\t\t\t\tlogger.info(`Connecting to ${url}...`)\n\n\t\t\t\tconst interval = setInterval(async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst status = await fetchServerStatus(url, token)\n\t\t\t\t\t\tprintStatus(status, url, logger)\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Clear the previous status output\n\t\t\t\t\t\t// On next iteration, we'll try again\n\t\t\t\t\t}\n\t\t\t\t}, 2000)\n\n\t\t\t\t// Initial fetch\n\t\t\t\ttry {\n\t\t\t\t\tconst status = await fetchServerStatus(url, token)\n\t\t\t\t\tprintStatus(status, url, logger)\n\t\t\t\t} catch {\n\t\t\t\t\t// Will retry on interval\n\t\t\t\t}\n\n\t\t\t\t// Keep running until Ctrl+C\n\t\t\t\tawait new Promise(() => {\n\t\t\t\t\tprocess.on('SIGINT', () => {\n\t\t\t\t\t\tclearInterval(interval)\n\t\t\t\t\t\tprocess.exit(0)\n\t\t\t\t\t})\n\t\t\t\t\tprocess.on('SIGTERM', () => {\n\t\t\t\t\t\tclearInterval(interval)\n\t\t\t\t\t\tprocess.exit(0)\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tconst status = await fetchServerStatus(url, token)\n\t\t\t\tprintStatus(status, url, logger)\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tlogger.error(`Failed to connect to ${url}`)\n\t\t\tif (error instanceof Error) {\n\t\t\t\tlogger.error(error.message)\n\t\t\t}\n\t\t\tlogger.blank()\n\t\t\tlogger.step('Make sure the Kora sync server is running.')\n\t\t\tlogger.step('Start it with: kora dev')\n\t\t\tprocess.exit(1)\n\t\t}\n\t},\n})\n\nfunction printStatus(\n\tstatus: ServerStatusResponse,\n\turl: string,\n\tlogger: ReturnType<typeof createLogger>,\n): void {\n\tconsole.clear()\n\tlogger.banner()\n\tlogger.info(`Kora Sync Server — ${url}`)\n\tlogger.blank()\n\n\tif (!status.running) {\n\t\tlogger.error('Server is not running')\n\t\treturn\n\t}\n\n\t// Server info\n\tlogger.step(`Status: Running (uptime: ${formatUptime(status.uptime)}) — v${status.version}`)\n\tlogger.step(`Schema: v${status.schemaVersion}`)\n\tlogger.blank()\n\n\t// Connections\n\tlogger.step(`Connections: ${status.connectedClients} connected`)\n\tlogger.step(` Peak: ${status.peakConnections}`)\n\tlogger.step(` Total: ${status.connectionsTotal}`)\n\n\tif (status.connectedNodeIds.length > 0) {\n\t\tlogger.step(' Active nodes:')\n\t\tfor (const nodeId of status.connectedNodeIds) {\n\t\t\tlogger.step(` • ${nodeId}`)\n\t\t}\n\t}\n\tlogger.blank()\n\n\t// Operations\n\tlogger.step('Operations:')\n\tlogger.step(` Received: ${status.operationsReceived.toLocaleString()}`)\n\tlogger.step(` Sent: ${status.operationsSent.toLocaleString()}`)\n\tlogger.step(` Total: ${status.totalOperations.toLocaleString()}`)\n\tlogger.blank()\n\n\t// Errors\n\tif (status.errorCount > 0) {\n\t\tlogger.warn(`Errors: ${status.errorCount}`)\n\t} else {\n\t\tlogger.step('Errors: 0')\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,iBAAuC;;;ACAvC,sBAAoC;AACpC,uBAAqB;AACrB,mBAA8B;;;ACD9B,IAAM,QAAQ;AACd,IAAM,OAAO;AACb,IAAM,MAAM;AACZ,IAAM,QAAQ;AACd,IAAM,SAAS;AACf,IAAM,MAAM;AACZ,IAAM,OAAO;AAqBN,SAAS,aAAa,SAAiC;AAC7D,QAAM,gBACL,SAAS,YAAY,QAAQ,QAAQ,IAAI,aAAa,UAAa,CAAC,QAAQ,OAAO;AAEpF,WAAS,MAAM,MAAc,MAAsB;AAClD,WAAO,gBAAgB,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK;AAAA,EACrD;AAEA,SAAO;AAAA,IACN,KAAK,SAAuB;AAC3B,cAAQ,IAAI,MAAM,MAAM,OAAO,CAAC;AAAA,IACjC;AAAA,IACA,QAAQ,SAAuB;AAC9B,cAAQ,IAAI,MAAM,OAAO,YAAO,OAAO,EAAE,CAAC;AAAA,IAC3C;AAAA,IACA,KAAK,SAAuB;AAC3B,cAAQ,KAAK,MAAM,QAAQ,YAAO,OAAO,EAAE,CAAC;AAAA,IAC7C;AAAA,IACA,MAAM,SAAuB;AAC5B,cAAQ,MAAM,MAAM,KAAK,YAAO,OAAO,EAAE,CAAC;AAAA,IAC3C;AAAA,IACA,KAAK,SAAuB;AAC3B,cAAQ,IAAI,MAAM,KAAK,KAAK,OAAO,EAAE,CAAC;AAAA,IACvC;AAAA,IACA,QAAc;AACb,cAAQ,IAAI;AAAA,IACb;AAAA,IACA,SAAe;AACd,cAAQ,IAAI;AACZ,cAAQ;AAAA,QACP,MAAM,OAAO,MAAM,WAAW,IAAI,MAAM,KAAK,6CAAwC;AAAA,MACtF;AACA,cAAQ,IAAI;AAAA,IACb;AAAA,EACD;AACD;;;AD1DA,IAAM,oBAAoB;AAKnB,IAAM,oBAAgB,4BAAc;AAAA,EAC1C,MAAM;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,EACd;AAAA,EACA,aAAa;AAAA,IACZ,YAAQ,4BAAc;AAAA,MACrB,MAAM;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,MACd;AAAA,MACA,MAAM;AAAA,QACL,KAAK;AAAA,UACJ,MAAM;AAAA,UACN,aAAa;AAAA,UACb,SAAS,oBAAoB,iBAAiB;AAAA,QAC/C;AAAA,QACA,KAAK;AAAA,UACJ,MAAM;AAAA,UACN,aAAa;AAAA,QACd;AAAA,QACA,OAAO;AAAA,UACN,MAAM;AAAA,UACN,aAAa;AAAA,QACd;AAAA,MACD;AAAA,MACA,MAAM,IAAI,EAAE,KAAK,GAAG;AACnB,cAAM,SAAS,aAAa;AAC5B,cAAM,MACL,OAAO,KAAK,QAAQ,WAAW,KAAK,MAAM,oBAAoB,iBAAiB;AAChF,cAAM,UAAU,OAAO,KAAK,QAAQ,WAAW,KAAK,MAAM,eAAe,KAAK,IAAI,CAAC;AACnF,cAAM,QACL,OAAO,KAAK,UAAU,WACnB,KAAK,QACJ,QAAQ,IAAI,qBAAqB,QAAQ,IAAI;AAElD,eAAO,OAAO;AACd,eAAO,KAAK,yBAAyB,GAAG,KAAK;AAE7C,YAAI;AACH,gBAAM,YAAY,GAAG,IAAI,QAAQ,OAAO,EAAE,CAAC;AAC3C,gBAAM,WAAW,MAAM,MAAM,WAAW;AAAA,YACvC,QAAQ;AAAA,YACR,SAAS,QAAQ,EAAE,eAAe,UAAU,KAAK,GAAG,IAAI;AAAA,UACzD,CAAC;AAED,cAAI,CAAC,SAAS,IAAI;AACjB,kBAAM,QAAQ,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,EAAE,SAAS,SAAS,WAAW,EAAE;AAClF,kBAAM,IAAI;AAAA,cACT,kBAAmB,MAA8B,WAAW,SAAS,UAAU;AAAA,YAChF;AAAA,UACD;AAEA,gBAAM,SAAS,MAAM,SAAS,YAAY;AAC1C,oBAAM,2BAAU,SAAS,IAAI,WAAW,MAAM,CAAC;AAE/C,gBAAM,QAAQ,OAAO,aAAa,MAAM,QAAQ,CAAC;AACjD,iBAAO,QAAQ,mBAAmB,OAAO,KAAK,IAAI,MAAM;AAAA,QACzD,SAAS,OAAO;AACf,iBAAO,MAAM,eAAe;AAC5B,cAAI,iBAAiB,MAAO,QAAO,MAAM,MAAM,OAAO;AACtD,iBAAO,MAAM;AACb,iBAAO,KAAK,4CAA4C;AACxD,kBAAQ,KAAK,CAAC;AAAA,QACf;AAAA,MACD;AAAA,IACD,CAAC;AAAA,IAED,aAAS,4BAAc;AAAA,MACtB,MAAM;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,MACd;AAAA,MACA,MAAM;AAAA,QACL,MAAM;AAAA,UACL,MAAM;AAAA,UACN,aAAa;AAAA,UACb,UAAU;AAAA,QACX;AAAA,QACA,KAAK;AAAA,UACJ,MAAM;AAAA,UACN,aAAa;AAAA,UACb,SAAS,oBAAoB,iBAAiB;AAAA,QAC/C;AAAA,QACA,OAAO;AAAA,UACN,MAAM;AAAA,UACN,aAAa;AAAA,UACb,SAAS;AAAA,QACV;AAAA,QACA,OAAO;AAAA,UACN,MAAM;AAAA,UACN,aAAa;AAAA,QACd;AAAA,MACD;AAAA,MACA,MAAM,IAAI,EAAE,KAAK,GAAG;AACnB,cAAM,SAAS,aAAa;AAC5B,cAAM,WAAW,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO;AAC7D,cAAM,MACL,OAAO,KAAK,QAAQ,WAAW,KAAK,MAAM,oBAAoB,iBAAiB;AAChF,cAAM,QAAQ,KAAK,UAAU;AAC7B,cAAM,QACL,OAAO,KAAK,UAAU,WACnB,KAAK,QACJ,QAAQ,IAAI,qBAAqB,QAAQ,IAAI;AAElD,eAAO,OAAO;AACd,eAAO,KAAK,yBAAyB,QAAQ,OAAO,GAAG,KAAK;AAE5D,YAAI;AACH,gBAAM,OAAO,UAAM,0BAAS,QAAQ;AACpC,gBAAM,aAAa,GAAG,IAAI,QAAQ,OAAO,EAAE,CAAC,+BAA+B,KAAK;AAEhF,gBAAM,WAAW,MAAM,MAAM,YAAY;AAAA,YACxC,QAAQ;AAAA,YACR,SAAS,QAAQ,EAAE,eAAe,UAAU,KAAK,GAAG,IAAI;AAAA,YACxD,MAAM;AAAA,UACP,CAAC;AAED,cAAI,CAAC,SAAS,IAAI;AACjB,kBAAM,QAAQ,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,EAAE,SAAS,SAAS,WAAW,EAAE;AAClF,kBAAM,IAAI;AAAA,cACT,mBAAoB,MAA8B,WAAW,SAAS,UAAU;AAAA,YACjF;AAAA,UACD;AAEA,gBAAM,SAAU,MAAM,SAAS,KAAK;AAMpC,cAAI,OAAO,SAAS;AACnB,mBAAO;AAAA,cACN,YAAY,OAAO,kBAAkB,cAAc,OAAO,WAAW,OAAO,OAAO,QAAQ,OAAO,EAAE;AAAA,YACrG;AAAA,UACD,OAAO;AACN,mBAAO,MAAM,+BAA+B;AAAA,UAC7C;AAAA,QACD,SAAS,OAAO;AACf,iBAAO,MAAM,gBAAgB;AAC7B,cAAI,iBAAiB,MAAO,QAAO,MAAM,MAAM,OAAO;AACtD,kBAAQ,KAAK,CAAC;AAAA,QACf;AAAA,MACD;AAAA,IACD,CAAC;AAAA,IAED,UAAM,4BAAc;AAAA,MACnB,MAAM;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,MACd;AAAA,MACA,MAAM;AAAA,QACL,MAAM;AAAA,UACL,MAAM;AAAA,UACN,aAAa;AAAA,UACb,UAAU;AAAA,QACX;AAAA,MACD;AAAA,MACA,MAAM,IAAI,EAAE,KAAK,GAAG;AACnB,cAAM,SAAS,aAAa;AAC5B,cAAM,WAAW,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO;AAE7D,YAAI;AACH,gBAAM,OAAO,UAAM,0BAAS,QAAQ;AACpC,gBAAM,EAAE,mBAAmB,IAAI,MAAM,OAAO,eAAe;AAE3D,gBAAM,WAAW;AAAA,YAChB,IAAI,WAAW,KAAK,QAAQ,KAAK,YAAY,KAAK,UAAU;AAAA,UAC7D;AAEA,iBAAO,OAAO;AACd,iBAAO,KAAK,WAAW,QAAQ,EAAE;AACjC,iBAAO,MAAM;AACb,iBAAO,KAAK,gBAAgB,IAAI,KAAK,SAAS,SAAS,EAAE,YAAY,CAAC,EAAE;AACxE,iBAAO,KAAK,gBAAgB,SAAS,MAAM,EAAE;AAC7C,iBAAO,KAAK,iBAAiB,SAAS,aAAa,EAAE;AACrD,iBAAO,KAAK,gBAAgB,SAAS,eAAe,eAAe,CAAC,EAAE;AACtE,iBAAO,KAAK,gBAAgB,SAAS,YAAY,KAAK,IAAI,KAAK,QAAQ,EAAE;AACzE,iBAAO,KAAK,gBAAgB,SAAS,SAAS,MAAM,GAAG,EAAE,CAAC,KAAK;AAC/D,iBAAO,MAAM;AACb,iBAAO,KAAK,mBAAmB,SAAS,OAAO,EAAE;AAAA,QAClD,SAAS,OAAO;AACf,iBAAO,MAAM,4BAA4B;AACzC,cAAI,iBAAiB,MAAO,QAAO,MAAM,MAAM,OAAO;AACtD,kBAAQ,KAAK,CAAC;AAAA,QACf;AAAA,MACD;AAAA,IACD,CAAC;AAAA,EACF;AACD,CAAC;;;AEvMD,IAAAC,oBAAwB;AACxB,IAAAC,gBAA8B;;;ACD9B,kBAA0B;AAenB,IAAM,qBAAN,cAAiC,sBAAU;AAAA,EACjD,YAA4B,WAAmB;AAC9C;AAAA,MACC,cAAc,SAAS;AAAA,MACvB;AAAA,MACA,EAAE,UAAU;AAAA,IACb;AAL2B;AAM3B,SAAK,OAAO;AAAA,EACb;AAAA,EAP4B;AAQ7B;AAKO,IAAM,sBAAN,cAAkC,sBAAU;AAAA,EAClD,YAA4B,eAAyB;AACpD;AAAA,MACC,2CAA2C,cAAc,KAAK,IAAI,CAAC;AAAA,MACnE;AAAA,MACA,EAAE,cAAc;AAAA,IACjB;AAL2B;AAM3B,SAAK,OAAO;AAAA,EACb;AAAA,EAP4B;AAQ7B;AAKO,IAAM,sBAAN,cAAkC,sBAAU;AAAA,EAClD,YAA4B,WAAmB;AAC9C;AAAA,MACC,IAAI,SAAS;AAAA,MACb;AAAA,MACA,EAAE,UAAU;AAAA,IACb;AAL2B;AAM3B,SAAK,OAAO;AAAA,EACb;AAAA,EAP4B;AAQ7B;AAKO,IAAM,iBAAN,cAA6B,sBAAU;AAAA,EAC7C,YACiB,QACA,YACf;AACD;AAAA,MACC,mCAAmC,MAAM,QAAQ,UAAU;AAAA,MAC3D;AAAA,MACA,EAAE,QAAQ,WAAW;AAAA,IACtB;AAPgB;AACA;AAOhB,SAAK,OAAO;AAAA,EACb;AAAA,EATiB;AAAA,EACA;AASlB;;;ACrEA,IAAAC,mBAAiC;AACjC,IAAAC,oBAAuC;AAGvC,eAAsB,gBAAgB,MAAgC;AACrE,MAAI;AACH,cAAM,yBAAO,IAAI;AACjB,WAAO;AAAA,EACR,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AASA,eAAsB,gBAAgB,UAA2C;AAChF,MAAI,cAAU,2BAAQ,YAAY,QAAQ,IAAI,CAAC;AAG/C,aAAS;AACR,UAAM,cAAU,wBAAK,SAAS,cAAc;AAC5C,QAAI;AACH,YAAM,UAAU,UAAM,2BAAS,SAAS,OAAO;AAC/C,YAAM,MAAe,KAAK,MAAM,OAAO;AACvC,UAAI,cAAc,GAAG,GAAG;AACvB,eAAO;AAAA,MACR;AAAA,IACD,QAAQ;AAAA,IAER;AACA,UAAM,aAAS,2BAAQ,OAAO;AAC9B,QAAI,WAAW,QAAS;AACxB,cAAU;AAAA,EACX;AAEA,SAAO;AACR;AAQA,eAAsB,eAAe,aAA6C;AACjF,QAAM,aAAa;AAAA,QAClB,wBAAK,aAAa,OAAO,WAAW;AAAA,QACpC,wBAAK,aAAa,WAAW;AAAA,QAC7B,wBAAK,aAAa,OAAO,WAAW;AAAA,QACpC,wBAAK,aAAa,WAAW;AAAA,EAC9B;AAEA,aAAW,aAAa,YAAY;AACnC,QAAI;AACH,gBAAM,yBAAO,SAAS;AACtB,aAAO;AAAA,IACR,QAAQ;AAAA,IAER;AAAA,EACD;AAEA,SAAO;AACR;AAoCA,eAAsB,gBAAgB,aAAuC;AAC5E,MAAI;AACH,cAAM,6BAAO,wBAAK,aAAa,gBAAgB,OAAO,cAAc,CAAC;AACrE,WAAO;AAAA,EACR,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AASA,eAAsB,+BACrB,aACA,aACA,YACyB;AACzB,QAAM,kBAAc,wBAAK,aAAa,gBAAgB,aAAa,cAAc;AACjF,MAAI;AACH,UAAM,UAAU,UAAM,2BAAS,aAAa,OAAO;AACnD,UAAM,MAAM,KAAK,MAAM,OAAO;AAC9B,QAAI;AACJ,QAAI,OAAO,IAAI,QAAQ,UAAU;AAChC,gBAAU,IAAI;AAAA,IACf,WAAW,OAAO,IAAI,QAAQ,YAAY,IAAI,QAAQ,MAAM;AAC3D,gBAAU,IAAI,IAAI,UAAU;AAAA,IAC7B;AACA,QAAI,CAAC,QAAS,QAAO;AACrB,UAAM,eAAW,wBAAK,aAAa,gBAAgB,aAAa,OAAO;AACvE,cAAM,yBAAO,QAAQ;AACrB,WAAO;AAAA,EACR,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AAEA,SAAS,cAAc,KAAuB;AAC7C,MAAI,OAAO,QAAQ,YAAY,QAAQ,KAAM,QAAO;AACpD,QAAM,SAAS;AACf,SAAO,WAAW,OAAO,YAAY,KAAK,WAAW,OAAO,eAAe;AAC5E;AAEA,SAAS,WAAW,MAAwB;AAC3C,MAAI,OAAO,SAAS,YAAY,SAAS,KAAM,QAAO;AACtD,SAAO,OAAO,KAAK,IAAI,EAAE,KAAK,CAAC,QAAQ,QAAQ,UAAU,IAAI,WAAW,UAAU,CAAC;AACpF;;;ACxJA,gCAAsB;AACtB,IAAAC,mBAAuB;AACvB,IAAAC,oBAA8B;AAC9B,sBAA8B;AAqC9B,IAAM,oBAAoB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AAKA,eAAsB,eAAe,aAAqD;AACzF,QAAM,aAAa,MAAM,mBAAmB,WAAW;AACvD,MAAI,CAAC,WAAY,QAAO;AAExB,QAAM,UAAM,2BAAQ,UAAU;AAC9B,MAAI,QAAQ,SAAS,QAAQ,UAAU,QAAQ,QAAQ;AACtD,UAAMC,UAAS,MAAM,qBAAqB,YAAY,WAAW;AACjE,WAAO,eAAeA,OAAM;AAAA,EAC7B;AAEA,QAAM,SAAS,MAAM,WAAO,+BAAc,UAAU,EAAE;AACtD,SAAO,eAAe,MAAM;AAC7B;AAEA,eAAe,mBAAmB,aAA6C;AAC9E,aAAW,QAAQ,mBAAmB;AACrC,UAAM,gBAAY,wBAAK,aAAa,IAAI;AACxC,QAAI;AACH,gBAAM,yBAAO,SAAS;AACtB,aAAO;AAAA,IACR,QAAQ;AAAA,IAER;AAAA,EACD;AAEA,SAAO;AACR;AAEA,eAAe,qBAAqB,YAAoB,aAAuC;AAC9F,MAAI,CAAE,MAAM,gBAAgB,WAAW,GAAI;AAC1C,UAAM,IAAI;AAAA,MACT,8BAA8B,UAAU;AAAA,IACzC;AAAA,EACD;AAIA,QAAM,SACL;AAKD,QAAM,SAAS,MAAM;AAAA,IACpB,QAAQ;AAAA,IACR,CAAC,YAAY,OAAO,UAAU,QAAQ,UAAU;AAAA,IAChD;AAAA,EACD;AAEA,MAAI;AACH,WAAO,KAAK,MAAM,MAAM;AAAA,EACzB,QAAQ;AACP,UAAM,IAAI,MAAM,mBAAmB,UAAU,kBAAkB;AAAA,EAChE;AACD;AAEA,eAAe,WAAW,SAAiB,MAAgB,KAA8B;AACxF,SAAO,MAAM,IAAI,QAAgB,CAACC,WAAS,WAAW;AACrD,UAAM,YAAQ,iCAAM,SAAS,MAAM;AAAA,MAClC;AAAA,MACA,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,MAChC,KAAK,QAAQ;AAAA,IACd,CAAC;AAED,QAAI,SAAS;AACb,QAAI,SAAS;AAEb,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB;AAC3C,gBAAU,MAAM,SAAS,OAAO;AAAA,IACjC,CAAC;AAED,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB;AAC3C,gBAAU,MAAM,SAAS,OAAO;AAAA,IACjC,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,UAAU;AAC5B,aAAO,KAAK;AAAA,IACb,CAAC;AAED,UAAM,GAAG,QAAQ,CAAC,SAAS;AAC1B,UAAI,SAAS,GAAG;AACf,QAAAA,UAAQ,OAAO,KAAK,CAAC;AACrB;AAAA,MACD;AAEA,aAAO,IAAI,MAAM,oCAAoC,QAAQ,SAAS,MAAM,OAAO,KAAK,CAAC,EAAE,CAAC;AAAA,IAC7F,CAAC;AAAA,EACF,CAAC;AACF;AAEA,SAAS,eAAe,KAA8B;AACrD,MAAI,OAAO,QAAQ,YAAY,QAAQ,MAAM;AAC5C,UAAM,IAAI,MAAM,oCAAoC;AAAA,EACrD;AAEA,QAAM,QAAS,IAAgC,WAAW;AAC1D,MAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GAAG;AACxE,UAAM,IAAI,MAAM,oCAAoC;AAAA,EACrD;AAEA,SAAO;AACR;;;ACzJA,IAAAC,6BAAsB;AACtB,IAAAC,oBAAwB;AACxB,IAAAC,mBAA8B;AAO9B,eAAsB,qBACrB,YACA,aAC4B;AAC5B,QAAM,UAAM,2BAAQ,UAAU;AAC9B,QAAM,cACL,QAAQ,SAAS,QAAQ,UAAU,QAAQ,SACxC,MAAM,qBAAqB,YAAY,WAAW,IAClD,MAAM,OAAO,OAAG,gCAAc,UAAU,EAAE,IAAI,MAAM,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC;AAEnF,SAAO,cAAc,WAAW;AACjC;AAEA,SAAS,cAAc,OAAkC;AACxD,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAChD,UAAM,IAAI,MAAM,sCAAsC;AAAA,EACvD;AAEA,QAAM,eAAe;AACrB,QAAM,YAAY,aAAa,WAAW;AAE1C,MAAI,CAAC,mBAAmB,SAAS,GAAG;AACnC,UAAM,IAAI,MAAM,uEAAuE;AAAA,EACxF;AAEA,SAAO;AACR;AAEA,SAAS,mBAAmB,OAA2C;AACtE,MAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,QAAM,SAAS;AACf,SACC,OAAO,OAAO,YAAY,YAC1B,OAAO,OAAO,gBAAgB,YAC9B,OAAO,gBAAgB,QACvB,OAAO,OAAO,cAAc,YAC5B,OAAO,cAAc;AAEvB;AAEA,eAAe,qBAAqB,YAAoB,aAAuC;AAC9F,MAAI,CAAE,MAAM,gBAAgB,WAAW,GAAI;AAC1C,UAAM,IAAI;AAAA,MACT,8BAA8B,UAAU;AAAA,IACzC;AAAA,EACD;AAEA,QAAM,SACL;AAKD,QAAM,SAAS,MAAMC;AAAA,IACpB,QAAQ;AAAA,IACR,CAAC,YAAY,OAAO,UAAU,QAAQ,UAAU;AAAA,IAChD;AAAA,EACD;AAEA,MAAI;AACH,WAAO,KAAK,MAAM,MAAM;AAAA,EACzB,QAAQ;AACP,UAAM,IAAI,MAAM,4CAA4C,UAAU,EAAE;AAAA,EACzE;AACD;AAEA,eAAeA,YAAW,SAAiB,MAAgB,KAA8B;AACxF,SAAO,MAAM,IAAI,QAAgB,CAACC,WAAS,WAAW;AACrD,UAAM,YAAQ,kCAAM,SAAS,MAAM;AAAA,MAClC;AAAA,MACA,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,MAChC,KAAK,QAAQ;AAAA,IACd,CAAC;AAED,QAAI,SAAS;AACb,QAAI,SAAS;AAEb,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB;AAC3C,gBAAU,MAAM,SAAS,OAAO;AAAA,IACjC,CAAC;AAED,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB;AAC3C,gBAAU,MAAM,SAAS,OAAO;AAAA,IACjC,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,UAAU;AAC5B,aAAO,KAAK;AAAA,IACb,CAAC;AAED,UAAM,GAAG,QAAQ,CAAC,SAAS;AAC1B,UAAI,SAAS,GAAG;AACf,QAAAA,UAAQ,OAAO,KAAK,CAAC;AACrB;AAAA,MACD;AAEA;AAAA,QACC,IAAI,MAAM,0CAA0C,QAAQ,SAAS,MAAM,OAAO,KAAK,CAAC,EAAE;AAAA,MAC3F;AAAA,IACD,CAAC;AAAA,EACF,CAAC;AACF;;;AJlGO,IAAM,qBAAiB,6BAAc;AAAA,EAC3C,MAAM;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,EACd;AAAA,EACA,MAAM;AAAA,IACL,IAAI;AAAA,MACH,MAAM;AAAA,MACN,aAAa;AAAA,IACd;AAAA,IACA,QAAQ;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IACd;AAAA,IACA,UAAU;AAAA,MACT,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACV;AAAA,IACA,MAAM;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACV;AAAA,EACD;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AACnB,UAAM,SAAS,aAAa;AAC5B,UAAM,cAAc,MAAM,gBAAgB;AAC1C,QAAI,CAAC,aAAa;AACjB,YAAM,IAAI,oBAAoB,QAAQ,IAAI,CAAC;AAAA,IAC5C;AAEA,UAAM,SAAS,OAAO,KAAK,OAAO,eAAW,2BAAQ,aAAa,KAAK,EAAE,IAAI;AAC7E,QAAI,CAAC,QAAQ;AACZ,YAAM,IAAI,MAAM,wDAAwD;AAAA,IACzE;AAEA,UAAM,SAAS,MAAM,eAAe,WAAW;AAC/C,UAAM,aACL,OAAO,KAAK,WAAW,eACpB,2BAAQ,aAAa,KAAK,MAAM,IAChC,OAAO,QAAQ,WAAW,eACzB,2BAAQ,aAAa,OAAO,MAAM,IAClC;AACL,QAAI,CAAC,YAAY;AAChB,YAAM,IAAI,MAAM,sDAAsD;AAAA,IACvE;AAEA,UAAM,SAAS,MAAM,qBAAqB,YAAY,WAAW;AACjE,UAAM,EAAE,qBAAqB,IAAI,MAAM,OAAO,8BAA8B;AAC5E,UAAM,EAAE,MAAM,IAAI,MAAM,OAAO,eAAe;AAE9C,UAAM,eAAe,OAAO,KAAK,aAAa,WAAW,KAAK,WAAW;AACzE,UAAM,OAAO,OAAO,SAAS,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO,MAAM,EAAE;AAEjF,UAAM,QAAQ,IAAI,MAAM;AAAA,MACvB;AAAA,MACA,SAAS,IAAI,qBAAqB,MAAM;AAAA,IACzC,CAAC;AACD,UAAM,MAAM,KAAK;AAEjB,QAAI;AACJ,QAAI,iBAAiB,SAAS;AAC7B,eAAS,MAAM,MAAM,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAAA,IAC/C,WAAW,iBAAiB,cAAc;AACzC,eAAS,MAAM,MAAM,QAAQ,EAAE,MAAM,cAAc,KAAK,CAAC;AAAA,IAC1D,WAAW,iBAAiB,aAAa;AACxC,eAAS,MAAM,MAAM,QAAQ,EAAE,MAAM,YAAY,CAAC;AAAA,IACnD,OAAO;AACN,YAAM,MAAM,MAAM;AAClB,YAAM,IAAI,MAAM,qBAAqB,YAAY,yCAAyC;AAAA,IAC3F;AAEA,UAAM,MAAM,MAAM;AAElB,WAAO,OAAO;AACd,WAAO,QAAQ,aAAa,OAAO,YAAY,yBAAyB;AACxE,eAAW,CAAC,QAAQ,GAAG,KAAK,OAAO,WAAW;AAC7C,aAAO,KAAK,KAAK,MAAM,YAAY,GAAG,EAAE;AAAA,IACzC;AAAA,EACD;AACD,CAAC;;;AK5FD,IAAAC,6BAAyB;AACzB,IAAAC,kBAAyC;AACzC,IAAAC,oBAAiC;AACjC,IAAAC,mBAA8B;AAC9B,IAAAC,gBAA8B;;;ACJ9B,kBAAiB;AAqBjB,IAAM,sBAAyC;AAAA,EAC9C,UAAU;AAAA,EACV,WAAW;AAAA,EACX,UAAU;AAAA,EACV,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,gBAAgB;AACjB;AAEA,IAAM,kBAAkB;AAKjB,IAAM,kBAAN,MAAsB;AAAA,EACX;AAAA,EAEV,cAAc;AACpB,SAAK,QAAQ,IAAI,YAAAC,QAAgD;AAAA,MAChE,aAAa;AAAA,IACd,CAAC;AAAA,EACF;AAAA,EAEO,uBAAiD;AACvD,WAAO,KAAK,MAAM,IAAI,eAAe,KAAK;AAAA,EAC3C;AAAA,EAEO,sBAAsB,aAAsC;AAClE,SAAK,MAAM,IAAI,iBAAiB,WAAW;AAAA,EAC5C;AAAA,EAEO,yBAA+B;AACrC,SAAK,MAAM,OAAO,eAAe;AAAA,EAClC;AACD;AAKO,SAAS,8BAA8B,OAA2C;AACxF,SAAO,MAAM,qBAAqB,KAAK;AACxC;AAEO,SAAS,8BAAiD;AAChE,SAAO,EAAE,GAAG,oBAAoB;AACjC;;;ACpEA,qBAQO;;;ACRP,2BAAqE;AAgB9D,SAAS,WACf,SACA,cACA,SACkB;AAClB,SAAO,IAAI,QAAQ,CAACC,cAAY;AAC/B,UAAM,KAAK,eAAe,OAAO;AACjC,UAAM,SAAS,iBAAiB,SAAY,KAAK,YAAY,MAAM;AACnE,OAAG,SAAS,OAAO,OAAO,GAAG,MAAM,MAAM,CAAC,WAAW;AACpD,SAAG,MAAM;AACT,YAAM,UAAU,OAAO,KAAK;AAC5B,MAAAA,UAAQ,WAAW,gBAAgB,EAAE;AAAA,IACtC,CAAC;AAAA,EACF,CAAC;AACF;AASO,SAAS,aACf,SACA,SACA,SACa;AACb,SAAO,IAAI,QAAQ,CAACA,cAAY;AAC/B,UAAM,KAAK,eAAe,OAAO;AACjC,UAAM,MAAM,SAAS,UAAU,QAAQ;AAEvC,QAAI,MAAM,OAAO,OAAO;AAAA,CAAI;AAC5B,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACxC,YAAM,SAAS,QAAQ,CAAC;AACxB,UAAI,QAAQ;AACX,YAAI,MAAM,OAAO,IAAI,CAAC,KAAK,OAAO,KAAK;AAAA,CAAI;AAAA,MAC5C;AAAA,IACD;AAEA,UAAM,MAAM,MAAY;AACvB,SAAG,SAAS,QAAQ,CAAC,WAAW;AAC/B,cAAM,QAAQ,OAAO,SAAS,OAAO,KAAK,GAAG,EAAE,IAAI;AACnD,cAAM,WAAW,QAAQ,KAAK;AAC9B,YAAI,UAAU;AACb,aAAG,MAAM;AACT,UAAAA,UAAQ,SAAS,KAAK;AAAA,QACvB,OAAO;AACN,cAAI,MAAM,yCAAyC,QAAQ,MAAM;AAAA,CAAI;AACrE,cAAI;AAAA,QACL;AAAA,MACD,CAAC;AAAA,IACF;AAEA,QAAI;AAAA,EACL,CAAC;AACF;AASO,SAAS,cACf,SACA,eAAe,OACf,SACmB;AACnB,SAAO,IAAI,QAAQ,CAACA,cAAY;AAC/B,UAAM,KAAK,eAAe,OAAO;AACjC,UAAM,SAAS,eAAe,QAAQ;AAEtC,UAAM,MAAM,MAAY;AACvB,SAAG,SAAS,OAAO,OAAO,KAAK,MAAM,OAAO,CAAC,WAAW;AACvD,cAAM,aAAa,OAAO,KAAK,EAAE,YAAY;AAC7C,YAAI,WAAW,WAAW,GAAG;AAC5B,aAAG,MAAM;AACT,UAAAA,UAAQ,YAAY;AACpB;AAAA,QACD;AAEA,YAAI,eAAe,OAAO,eAAe,OAAO;AAC/C,aAAG,MAAM;AACT,UAAAA,UAAQ,IAAI;AACZ;AAAA,QACD;AAEA,YAAI,eAAe,OAAO,eAAe,MAAM;AAC9C,aAAG,MAAM;AACT,UAAAA,UAAQ,KAAK;AACb;AAAA,QACD;AACA;AAAC,SAAC,SAAS,UAAU,QAAQ,QAAQ,MAAM,+BAA+B;AAC1E,YAAI;AAAA,MACL,CAAC;AAAA,IACF;AAEA,QAAI;AAAA,EACL,CAAC;AACF;AAEA,SAAS,eAAe,SAA4C;AACnE,aAAO,sCAAgB;AAAA,IACtB,OAAO,SAAS,SAAS,QAAQ;AAAA,IACjC,QAAQ,SAAS,UAAU,QAAQ;AAAA,EACpC,CAAC;AACF;;;AD3FO,IAAM,uBAAN,cAAmC,MAAM;AAAA,EACxC,YAAY,UAAU,4BAA4B;AACxD,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACb;AACD;AASO,IAAM,uBAAN,MAAmD;AAAA,EACzD,MAAa,KAAK,SAAiB,cAAwC;AAC1E,WAAO,WAAW,SAAS,YAAY;AAAA,EACxC;AAAA,EAEA,MAAa,OACZ,SACA,SACa;AACb,WAAO;AAAA,MACN;AAAA,MACA,QACE,OAAO,CAAC,WAAW,OAAO,aAAa,IAAI,EAC3C,IAAI,CAAC,YAAY,EAAE,OAAO,OAAO,OAAO,OAAO,OAAO,MAAM,EAAE;AAAA,IACjE;AAAA,EACD;AAAA,EAEA,MAAa,QAAQ,SAAiB,eAAe,OAAyB;AAC7E,WAAO,cAAc,SAAS,YAAY;AAAA,EAC3C;AAAA,EAEO,MAAM,SAAuB;AAGnC,SAAK;AAAA,EACN;AAAA,EAEO,MAAM,SAAuB;AAGnC,SAAK;AAAA,EACN;AACD;AAKO,SAAS,qBAAmC;AAClD,QAAM,yBACL,OAAO,YAAY,eAAe,QAAQ,MAAM,SAAS,QAAQ,OAAO;AACzE,MAAI,wBAAwB;AAC3B,WAAO,IAAI,kBAAkB;AAAA,EAC9B;AACA,SAAO,IAAI,qBAAqB;AACjC;AAMO,IAAM,oBAAN,MAAgD;AAAA,EACtD,MAAa,KAAK,SAAiB,cAAwC;AAC1E,UAAM,SAAS,UAAM,eAAAC,MAAU;AAAA,MAC9B;AAAA,MACA,aAAa;AAAA,MACb;AAAA,IACD,CAAC;AACD,YAAI,eAAAC,UAAc,MAAM,GAAG;AAC1B,yBAAAC,QAAY,sBAAsB;AAClC,YAAM,IAAI,qBAAqB;AAAA,IAChC;AACA,UAAM,QAAQ,OAAO,KAAK;AAC1B,QAAI,MAAM,SAAS,EAAG,QAAO;AAC7B,WAAO,gBAAgB;AAAA,EACxB;AAAA,EAEA,MAAa,OACZ,SACA,SACa;AACb,UAAM,gBAAwC,QAAQ,IAAI,CAAC,YAAY;AAAA,MACtE,OAAO,OAAO;AAAA,MACd,OAAO,OAAO;AAAA,MACd,MAAM,OAAO;AAAA,MACb,UAAU,OAAO;AAAA,IAClB,EAAE;AACF,UAAM,SAAS,UAAM,eAAAC,QAAY;AAAA,MAChC;AAAA,MACA,SAAS;AAAA,IACV,CAAC;AACD,YAAI,eAAAF,UAAc,MAAM,GAAG;AAC1B,yBAAAC,QAAY,sBAAsB;AAClC,YAAM,IAAI,qBAAqB;AAAA,IAChC;AACA,WAAO;AAAA,EACR;AAAA,EAEA,MAAa,QAAQ,SAAiB,eAAe,OAAyB;AAC7E,UAAM,SAAS,UAAM,eAAAE,SAAa;AAAA,MACjC;AAAA,MACA,cAAc;AAAA,IACf,CAAC;AACD,YAAI,eAAAH,UAAc,MAAM,GAAG;AAC1B,yBAAAC,QAAY,sBAAsB;AAClC,YAAM,IAAI,qBAAqB;AAAA,IAChC;AACA,WAAO;AAAA,EACR;AAAA,EAEO,MAAM,SAAuB;AACnC,uBAAAG,OAAW,OAAO;AAAA,EACnB;AAAA,EAEO,MAAM,SAAuB;AACnC,uBAAAC,OAAW,OAAO;AAAA,EACnB;AACD;;;AExJO,IAAM,mBAAmB,CAAC,QAAQ,OAAO,QAAQ,KAAK;AAItD,IAAM,YAAY;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;;;ACXA,IAAAC,6BAAyB;AAQlB,SAAS,uBAAuC;AACtD,QAAM,YAAY,QAAQ,IAAI;AAC9B,MAAI,CAAC,UAAW,QAAO;AAEvB,MAAI,UAAU,WAAW,OAAO,EAAG,QAAO;AAC1C,MAAI,UAAU,WAAW,OAAO,EAAG,QAAO;AAC1C,MAAI,UAAU,WAAW,MAAM,EAAG,QAAO;AACzC,SAAO;AACR;AAGO,SAAS,kBAAkB,IAA4B;AAC7D,SAAO,OAAO,SAAS,SAAS,GAAG,EAAE;AACtC;AAGO,SAAS,iBAAiB,IAA4B;AAC5D,MAAI,OAAO,MAAO,QAAO;AACzB,SAAO,GAAG,EAAE;AACb;;;AC3BA,IAAAC,mBAAyD;AACzD,IAAAC,oBAAuC;AA6BhC,SAAS,4BACf,MAA0C,QAAQ,KAC1B;AACxB,QAAM,cAAc,OAAO,IAAI,gBAAgB,EAAE,EAAE,YAAY;AAC/D,QAAM,cAAc,GAAG,OAAO,IAAI,UAAU,EAAE,CAAC,IAAI,OAAO,IAAI,UAAU,EAAE,CAAC,GAAG,YAAY;AAE1F,MACC,YAAY,SAAS,QAAQ,KAC7B,IAAI,oBAAoB,UACxB,IAAI,sBAAsB,UAC1B,YAAY,SAAS,QAAQ,GAC5B;AACD,WAAO,EAAE,QAAQ,UAAU,QAAQ,MAAM;AAAA,EAC1C;AACA,MACC,YAAY,SAAS,UAAU,KAC/B,IAAI,wBAAwB,UAC5B,YAAY,SAAS,UAAU,GAC9B;AACD,WAAO,EAAE,QAAQ,YAAY,QAAQ,MAAM;AAAA,EAC5C;AACA,MACC,YAAY,SAAS,QAAQ,KAC7B,IAAI,0BAA0B,UAC9B,IAAI,oBAAoB,UACxB,IAAI,eAAe,UACnB,YAAY,SAAS,MAAM,GAC1B;AACD,WAAO,EAAE,QAAQ,UAAU,QAAQ,MAAM;AAAA,EAC1C;AACA,MAAI,YAAY,SAAS,KAAK,KAAK,IAAI,aAAa,UAAa,YAAY,SAAS,KAAK,GAAG;AAC7F,WAAO,EAAE,QAAQ,OAAO,QAAQ,MAAM;AAAA,EACvC;AACA,SAAO,EAAE,QAAQ,WAAW,QAAQ,OAAO;AAC5C;AAKA,eAAsB,iBAAiB,UAA6C;AACnF,QAAM,OAAO,MAAM,6BAA6B,UAAU,MAAM;AAChE,SAAO;AAAA,IACN,eAAe,SAAS;AAAA,IACxB,gBAAgB;AAAA,EACjB;AACD;AAMA,eAAsB,sBAAsB,UAAkD;AAC7F,MAAI,cAAU,2BAAQ,QAAQ;AAC9B,aAAS;AACR,QAAI,MAAM,eAAW,wBAAK,SAAS,qBAAqB,CAAC,GAAG;AAC3D,aAAO,EAAE,YAAY,MAAM,MAAM,SAAS,MAAM,iBAAiB;AAAA,IAClE;AAEA,QAAI,MAAM,eAAW,wBAAK,SAAS,YAAY,CAAC,GAAG;AAClD,aAAO,EAAE,YAAY,MAAM,MAAM,SAAS,MAAM,YAAY;AAAA,IAC7D;AAEA,UAAM,sBAAkB,wBAAK,SAAS,cAAc;AACpD,QAAI,MAAM,WAAW,eAAe,GAAG;AACtC,UAAI;AACH,cAAM,iBAAiB,UAAM,2BAAS,iBAAiB,OAAO;AAC9D,cAAM,SAAS,KAAK,MAAM,cAAc;AACxC,YAAI,MAAM,QAAQ,OAAO,UAAU,KAAK,qBAAqB,OAAO,UAAU,GAAG;AAChF,iBAAO,EAAE,YAAY,MAAM,MAAM,SAAS,MAAM,iBAAiB;AAAA,QAClE;AAAA,MACD,QAAQ;AAAA,MAER;AAAA,IACD;AAEA,UAAM,aAAS,2BAAQ,OAAO;AAC9B,QAAI,WAAW,SAAS;AACvB,aAAO,EAAE,YAAY,OAAO,MAAM,MAAM,MAAM,OAAO;AAAA,IACtD;AACA,cAAU;AAAA,EACX;AACD;AAMA,eAAsB,2BAA2B,QAGR;AACxC,QAAM,EAAE,WAAW,OAAO,IAAI;AAC9B,MAAI,WAAW,YAAY,WAAW,YAAY,WAAW,YAAY;AACxE,WAAO,EAAE,SAAS,OAAO,UAAU,KAAK;AAAA,EACzC;AAEA,QAAM,gBAAY,wBAAK,WAAW,SAAS;AAC3C,QAAM,qBAAiB,wBAAK,WAAW,iBAAiB;AACxD,YAAM,wBAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAE1C,QAAM,kBAAkB,CAAC,sBAAsB;AAC/C,QAAM,WAAW,MAAM,eAAe,cAAc;AACpD,QAAM,0BAA0B,MAAM,QAAQ,UAAU,eAAe,IACpE,SAAS,gBAAgB,OAAO,CAAC,SAAyB,OAAO,SAAS,QAAQ,IAClF,CAAC;AACJ,QAAM,wBAAwB,cAAc,CAAC,GAAG,yBAAyB,GAAG,eAAe,CAAC;AAE5F,QAAM,OAAO;AAAA,IACZ,iBAAiB;AAAA,EAClB;AACA,YAAM,4BAAU,gBAAgB,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,GAAM,OAAO;AAC7E,SAAO,EAAE,SAAS,MAAM,UAAU,eAAe;AAClD;AAMO,SAAS,+BAA+B,cAAsB,aAA6B;AACjG,aAAO,wBAAK,cAAc,YAAY,WAAW;AAClD;AAEA,SAAS,cAAc,QAAqC;AAC3D,SAAO,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC;AAClC;AAEA,eAAe,eAAe,MAAuD;AACpF,MAAI;AACH,UAAM,UAAU,UAAM,2BAAS,MAAM,OAAO;AAC5C,UAAM,SAAkB,KAAK,MAAM,OAAO;AAC1C,QAAI,OAAO,WAAW,YAAY,WAAW,MAAM;AAClD,aAAO;AAAA,IACR;AACA,WAAO;AAAA,EACR,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AAEA,SAAS,qBAAqB,OAAgD;AAC7E,MAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,QAAM,SAAS;AACf,SAAO,MAAM,QAAQ,OAAO,QAAQ;AACrC;AAEA,eAAe,WAAW,MAAgC;AACzD,MAAI;AACH,cAAM,yBAAO,IAAI;AACjB,WAAO;AAAA,EACR,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AAEA,eAAe,6BACd,UACA,WACyB;AACzB,MAAI,cAAU,2BAAQ,QAAQ;AAC9B,aAAS;AACR,UAAM,gBAAY,wBAAK,SAAS,SAAS;AACzC,QAAI;AACH,gBAAM,uBAAK,SAAS;AACpB,aAAO;AAAA,IACR,QAAQ;AAAA,IAER;AACA,UAAM,aAAS,2BAAQ,OAAO;AAC9B,QAAI,WAAW,SAAS;AACvB,aAAO;AAAA,IACR;AACA,cAAU;AAAA,EACX;AACD;;;ACjLO,SAAS,gCAAgC,OAA6C;AAC5F,MAAI,MAAM,aAAa,gBAAiB,QAAO;AAC/C,QAAM,aAAa,MAAM,QAAQ,MAAM,OAAO;AAC9C,MAAI,MAAM,YAAY,WAAY,QAAO;AACzC,MAAI,MAAM,YAAY,CAAC,WAAY,QAAO;AAC1C,MAAI,CAAC,MAAM,YAAY,WAAY,QAAO;AAC1C,SAAO;AACR;AAEO,SAAS,gBAAgB,OAAwC;AACvE,SAAO,UAAU,SAAS,UAAU;AACrC;AAEO,SAAS,iBAAiB,OAAyC;AACzE,SAAO,UAAU,WAAW,UAAU,SAAS,UAAU,YAAY,UAAU;AAChF;AAEO,SAAS,YAAY,OAAoC;AAC/D,SAAO,UAAU,UAAU,UAAU,oBAAoB,UAAU;AACpE;AAEO,SAAS,gBAAgB,OAAwC;AACvE,SAAO,UAAU,UAAU,UAAU,YAAY,UAAU;AAC5D;AAEO,SAAS,wBAAwB,OAAgD;AACvF,SACC,UAAU,UACV,UAAU,WACV,UAAU,cACV,UAAU,UACV,UAAU,aACV,UAAU,qBACV,UAAU;AAEZ;;;ACbA,eAAsB,6BAA6B,QAIX;AACvC,QAAM,EAAE,OAAO,SAAS,MAAM,IAAI;AAClC,QAAM,SAAS,MAAM,qBAAqB;AAC1C,QAAM,OAAO,8BAA8B,KAAK;AAChD,QAAM,mBAAmB,2BAA2B,KAAK;AACzD,QAAM,iBACL,CAAC,MAAM,eAAe,CAAC,oBAAoB,WAAW,QAAQ,0BAA0B;AAEzF,MAAI,YAA+B,EAAE,GAAG,KAAK;AAC7C,MAAI,wBAAwB;AAE5B,MAAI,MAAM,aAAa;AACtB,gBAAY,4BAA4B;AAAA,EACzC,WAAW,kBAAkB,WAAW,MAAM;AAC7C,UAAM,cAAc,MAAM,QAAQ,OAAO,oCAAoC;AAAA,MAC5E,EAAE,OAAO,4BAA4B,MAAM,GAAG,OAAO,QAAQ;AAAA,MAC7D,EAAE,OAAO,aAAa,OAAO,YAAY;AAAA,IAC1C,CAAC;AACD,QAAI,gBAAgB,SAAS;AAC5B,kBAAY,EAAE,GAAG,OAAO;AACxB,8BAAwB;AAAA,IACzB;AAAA,EACD;AAEA,MAAI,MAAM,aAAa,QAAW;AACjC,QAAI,CAAC,gBAAgB,MAAM,QAAQ,GAAG;AACrC,YAAM,IAAI;AAAA,QACT,6BAA6B,MAAM,QAAQ;AAAA,MAC5C;AAAA,IACD;AACA,cAAU,WAAW,MAAM;AAAA,EAC5B,WAAW,CAAC,MAAM,eAAe,CAAC,uBAAuB;AACxD,cAAU,WAAW,MAAM,QAAQ,OAAO,aAAa;AAAA,MACtD,EAAE,OAAO,iBAAiB,OAAO,MAAM;AAAA,MACvC,EAAE,OAAO,wCAAmC,OAAO,gBAAgB;AAAA,IACpE,CAAC;AAAA,EACF;AAEA,QAAM,UAAU,UAAU,aAAa;AAEvC,MAAI,SAAS;AAIZ,cAAU,YAAY;AACtB,cAAU,WAAW;AACrB,cAAU,OAAO;AAEjB,QAAI,MAAM,SAAS,QAAW;AAC7B,gBAAU,OAAO,MAAM;AAAA,IACxB,WAAW,CAAC,MAAM,eAAe,CAAC,uBAAuB;AACxD,gBAAU,OAAO,MAAM,QAAQ,QAAQ,6BAA6B,IAAI;AAAA,IACzE;AAEA,QAAI,MAAM,OAAO,QAAW;AAC3B,UAAI,CAAC,gBAAgB,MAAM,EAAE,GAAG;AAC/B,cAAM,IAAI;AAAA,UACT,uBAAuB,MAAM,EAAE;AAAA,QAChC;AAAA,MACD;AACA,gBAAU,KAAK,MAAM;AAAA,IACtB,WAAW,CAAC,UAAU,MAAM;AAC3B,gBAAU,KAAK;AAAA,IAChB,WAAW,CAAC,MAAM,eAAe,CAAC,uBAAuB;AACxD,gBAAU,KAAK,MAAM,QAAQ,OAAO,yBAAyB;AAAA,QAC5D,EAAE,OAAO,iDAAiD,OAAO,SAAS;AAAA,QAC1E,EAAE,OAAO,iCAAiC,OAAO,WAAW;AAAA,MAC7D,CAAC;AAAA,IACF;AAEA,QAAI,UAAU,OAAO,QAAQ;AAC5B,gBAAU,OAAO;AAAA,IAClB;AAEA,QAAI,UAAU,OAAO,YAAY;AAChC,gBAAU,aAAa;AAAA,IACxB,WAAW,MAAM,eAAe,QAAW;AAC1C,UAAI,CAAC,wBAAwB,MAAM,UAAU,GAAG;AAC/C,cAAM,IAAI;AAAA,UACT,gCAAgC,MAAM,UAAU;AAAA,QACjD;AAAA,MACD;AACA,gBAAU,aAAa,MAAM;AAAA,IAC9B,WAAW,CAAC,MAAM,eAAe,CAAC,uBAAuB;AACxD,gBAAU,aAAa,MAAM,QAAQ,OAAO,sBAAsB;AAAA,QACjE,EAAE,OAAO,kBAAkB,OAAO,QAAQ;AAAA,QAC1C,EAAE,OAAO,YAAY,OAAO,WAAW;AAAA,QACvC,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,QAC/B,EAAE,OAAO,WAAW,OAAO,UAAU;AAAA,QACrC,EAAE,OAAO,mBAAmB,OAAO,kBAAkB;AAAA,QACrD,EAAE,OAAO,4BAA4B,OAAO,SAAS;AAAA,MACtD,CAAC;AAAA,IACF;AAAA,EACD,OAAO;AACN,QAAI,MAAM,cAAc,QAAW;AAClC,UAAI,CAAC,iBAAiB,MAAM,SAAS,GAAG;AACvC,cAAM,IAAI;AAAA,UACT,8BAA8B,MAAM,SAAS;AAAA,QAC9C;AAAA,MACD;AACA,gBAAU,YAAY,MAAM;AAAA,IAC7B,WAAW,CAAC,MAAM,eAAe,CAAC,uBAAuB;AACxD,gBAAU,YAAY,MAAM,QAAQ,OAAO,iBAAiB;AAAA,QAC3D,EAAE,OAAO,SAAS,OAAO,QAAQ;AAAA,QACjC,EAAE,OAAO,qBAAqB,OAAO,OAAO,UAAU,KAAK;AAAA,QAC3D,EAAE,OAAO,wBAAwB,OAAO,UAAU,UAAU,KAAK;AAAA,QACjE,EAAE,OAAO,uBAAuB,OAAO,SAAS,UAAU,KAAK;AAAA,MAChE,CAAC;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,QAAW;AAC7B,UAAI,CAAC,YAAY,MAAM,IAAI,GAAG;AAC7B,cAAM,IAAI;AAAA,UACT,yBAAyB,MAAM,IAAI;AAAA,QACpC;AAAA,MACD;AACA,gBAAU,OAAO,MAAM;AAAA,IACxB,WAAW,CAAC,MAAM,eAAe,CAAC,uBAAuB;AACxD,gBAAU,OAAO,MAAM,QAAQ,OAAO,mBAAmB;AAAA,QACxD,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,QAC/B,EAAE,OAAO,kCAAkC,OAAO,kBAAkB,UAAU,KAAK;AAAA,QACnF,EAAE,OAAO,uBAAuB,OAAO,SAAS,UAAU,KAAK;AAAA,MAChE,CAAC;AAAA,IACF;AAEA,QAAI,MAAM,aAAa,QAAW;AACjC,gBAAU,WAAW,MAAM;AAAA,IAC5B,WAAW,CAAC,MAAM,eAAe,CAAC,uBAAuB;AACxD,gBAAU,WAAW,MAAM,QAAQ,QAAQ,qBAAqB,IAAI;AAAA,IACrE;AAEA,QAAI,MAAM,SAAS,QAAW;AAC7B,gBAAU,OAAO,MAAM;AAAA,IACxB,WAAW,CAAC,MAAM,eAAe,CAAC,uBAAuB;AACxD,gBAAU,OAAO,MAAM,QAAQ,QAAQ,6BAA6B,IAAI;AAAA,IACzE;AAEA,QAAI,MAAM,OAAO,QAAW;AAC3B,UAAI,CAAC,gBAAgB,MAAM,EAAE,GAAG;AAC/B,cAAM,IAAI;AAAA,UACT,uBAAuB,MAAM,EAAE;AAAA,QAChC;AAAA,MACD;AACA,gBAAU,KAAK,MAAM;AAAA,IACtB,WAAW,CAAC,UAAU,MAAM;AAC3B,gBAAU,KAAK;AAAA,IAChB,WAAW,CAAC,MAAM,eAAe,CAAC,uBAAuB;AACxD,gBAAU,KAAK,MAAM,QAAQ,OAAO,yBAAyB;AAAA,QAC5D,EAAE,OAAO,wBAAwB,OAAO,SAAS;AAAA,QACjD,EAAE,OAAO,iCAAiC,OAAO,WAAW;AAAA,MAC7D,CAAC;AAAA,IACF;AAEA,QAAI,UAAU,OAAO,YAAY;AAChC,gBAAU,aAAa;AAAA,IACxB,WAAW,MAAM,eAAe,QAAW;AAC1C,UAAI,CAAC,wBAAwB,MAAM,UAAU,GAAG;AAC/C,cAAM,IAAI;AAAA,UACT,gCAAgC,MAAM,UAAU;AAAA,QACjD;AAAA,MACD;AACA,gBAAU,aAAa,MAAM;AAAA,IAC9B,WAAW,CAAC,MAAM,eAAe,CAAC,uBAAuB;AACxD,gBAAU,aAAa,MAAM,QAAQ,OAAO,sBAAsB;AAAA,QACjE,EAAE,OAAO,kBAAkB,OAAO,QAAQ;AAAA,QAC1C,EAAE,OAAO,YAAY,OAAO,WAAW;AAAA,QACvC,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,QAC/B,EAAE,OAAO,WAAW,OAAO,UAAU;AAAA,QACrC,EAAE,OAAO,mBAAmB,OAAO,kBAAkB;AAAA,QACrD,EAAE,OAAO,4BAA4B,OAAO,SAAS;AAAA,MACtD,CAAC;AAAA,IACF;AAAA,EACD;AAEA,QAAM,WAAW,gCAAgC;AAAA,IAChD,UAAU,UAAU;AAAA,IACpB,UAAU,UAAU;AAAA,IACpB,MAAM,UAAU;AAAA,IAChB,IAAI,UAAU;AAAA,EACf,CAAC;AAED,SAAO;AAAA,IACN,UAAU,UAAU;AAAA,IACpB,WAAW,UAAU;AAAA,IACrB,MAAM,UAAU;AAAA,IAChB,IAAI,UAAU;AAAA,IACd,YAAY,UAAU;AAAA,IACtB,UAAU,UAAU;AAAA,IACpB,MAAM,UAAU;AAAA,IAChB;AAAA,IACA;AAAA,EACD;AACD;AAEO,SAAS,sBAAsB,OAA6B;AAClE,SAAO,CAAC,MAAM;AACf;AAEO,SAAS,wBACf,OACA,YAGO;AACP,QAAM,sBAAsB;AAAA,IAC3B,UAAU,WAAW;AAAA,IACrB,WAAW,WAAW;AAAA,IACtB,UAAU,WAAW;AAAA,IACrB,MAAM,WAAW;AAAA,IACjB,IAAI,WAAW;AAAA,IACf,YAAY,WAAW;AAAA,IACvB,MAAM,WAAW;AAAA,IACjB,gBAAgB,WAAW;AAAA,EAC5B,CAAC;AACF;AAEA,SAAS,2BAA2B,OAA6B;AAChE,SACC,MAAM,aAAa,UACnB,MAAM,cAAc,UACpB,MAAM,SAAS,UACf,MAAM,OAAO,UACb,MAAM,eAAe,UACrB,MAAM,aAAa,UACnB,MAAM,SAAS;AAEjB;AAEA,SAAS,4BAAqC;AAC7C,SAAO,OAAO,YAAY,eAAe,QAAQ,MAAM,SAAS,QAAQ,OAAO;AAChF;AAEA,SAAS,4BAA4B,aAAwC;AAC5E,MAAI,YAAY,aAAa,iBAAiB;AAC7C,WAAO,0CAA0C,YAAY,cAAc;AAAA,EAC5E;AACA,QAAM,YAAY,YAAY,OAAO,QAAQ,YAAY,EAAE,KAAK;AAChE,QAAM,aAAa,YAAY,WAAW,aAAa;AACvD,SAAO,0BAA0B,YAAY,SAAS,MAAM,UAAU,MAAM,SAAS,MAAM,YAAY,cAAc;AACtH;;;ACnSA,uCAAmC;AAa5B,SAAS,oBAAoB,MAA2C;AAC9E,QAAM,cAAc,KAAK,KAAK;AAC9B,MAAI,YAAY,WAAW,GAAG;AAC7B,WAAO;AAAA,MACN,OAAO;AAAA,MACP,QAAQ,CAAC,+BAA+B;AAAA,IACzC;AAAA,EACD;AAEA,QAAM,iBAAa,iCAAAC,SAAuB,WAAW;AACrD,QAAM,SAAS,CAAC,GAAI,WAAW,UAAU,CAAC,GAAI,GAAI,WAAW,YAAY,CAAC,CAAE;AAC5E,MAAI,CAAC,WAAW,uBAAuB,OAAO,WAAW,GAAG;AAC3D,WAAO;AAAA,MACN,OAAO;AAAA,MACP,QAAQ,CAAC,+CAA+C;AAAA,IACzD;AAAA,EACD;AAEA,SAAO;AAAA,IACN,OAAO,WAAW;AAAA,IAClB;AAAA,EACD;AACD;;;ACnCA,IAAAC,mBAAoC;AACpC,IAAAC,oBAAqB;AAkBrB,eAAsB,wBAAwB,SAAmD;AAChG,MAAI,CAAC,eAAe,QAAQ,QAAQ,GAAG;AACtC;AAAA,EACD;AACA,MAAI,QAAQ,OAAO,YAAY;AAC9B;AAAA,EACD;AAEA,QAAM,eAAe,uBAAuB,QAAQ,UAAU;AAC9D,QAAM,2BAA2B,mCAAmC,QAAQ,UAAU;AACtF,QAAM,cAAU,wBAAK,QAAQ,WAAW,cAAc;AACtD,QAAM,iBAAa,wBAAK,QAAQ,WAAW,WAAW;AAEtD,QAAM,iBAAiB,UAAM,2BAAS,YAAY,OAAO;AACzD,QAAM,cAAc,UAAM,2BAAS,SAAS,OAAO;AACnD,QAAM,gBAAgB,eAAe,QAAQ;AAC7C,QAAM,aAAa,YAAY,QAAQ;AACvC,QAAM,YAAY;AAAA,IACjB;AAAA,IACA,iCAAiC,YAAY;AAAA,IAC7C,cAAc,wBAAwB;AAAA,EACvC,EAAE,KAAK,IAAI;AACX,QAAM,eAAe;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA,yBAAyB,QAAQ,UAAU;AAAA,IAC3C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,EAAE,KAAK,IAAI;AACX,QAAM,iBAAiB,GAAG,aAAa,GAAG,YAAY;AAEtD,YAAM,4BAAU,SAAS,GAAG,UAAU,GAAG,SAAS;AAAA,GAAM,OAAO;AAC/D,YAAM,4BAAU,YAAY,gBAAgB,OAAO;AACpD;AAEA,SAAS,eAAe,UAAiC;AACxD,SACC,aAAa,gBAAgB,aAAa,yBAAyB,aAAa;AAElF;AAEA,SAAS,uBAAuB,UAA0C;AACzE,UAAQ,UAAU;AAAA,IACjB,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,EACT;AACD;AAEA,SAAS,mCAAmC,UAA0C;AACrF,UAAQ,UAAU;AAAA,IACjB,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,EACT;AACD;;;ACpGA,qBAA2B;AAC3B,IAAAC,mBAAoE;AACpE,IAAAC,oBAAuC;AACvC,IAAAC,mBAA8B;AAH9B;AA0BO,SAAS,oBAAoB,UAAkB,SAAyC;AAC9F,SAAO,SAAS,QAAQ,kBAAkB,CAAC,QAAQ,QAAgB;AAClE,UAAM,QAAQ,QAAQ,GAAG;AACzB,WAAO,UAAU,SAAY,QAAQ,KAAK,GAAG;AAAA,EAC9C,CAAC;AACF;AAYO,SAAS,gBAAgB,cAAoC;AACnE,MAAI,UAAM,+BAAQ,gCAAc,YAAY,GAAG,CAAC;AAChD,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC3B,UAAM,gBAAY,2BAAQ,KAAK,aAAa,YAAY;AACxD,YAAI,2BAAW,SAAS,GAAG;AAC1B,aAAO;AAAA,IACR;AACA,cAAM,2BAAQ,GAAG;AAAA,EAClB;AAEA,QAAM,iBAAa,+BAAQ,gCAAc,YAAY,GAAG,CAAC;AACzD,aAAO,2BAAQ,YAAY,MAAM,MAAM,MAAM,aAAa,YAAY;AACvE;AAOO,SAAS,6BAA6B,cAA+C;AAC3F,QAAM,YAA2B,EAAE,UAAU,QAAQ,MAAM,QAAQ,gBAAgB,cAAc;AACjG,QAAM,UAAyB,EAAE,UAAU,MAAM,MAAM,SAAS,gBAAgB,KAAK;AACrF,QAAM,YAA2B,EAAE,UAAU,QAAQ,MAAM,QAAQ,gBAAgB,KAAK;AAExF,UAAQ,cAAc;AAAA,IACrB,KAAK;AACJ,aAAO;AAAA,QACN,qBAAqB;AAAA,QACrB,QAAQ;AAAA,UACP;AAAA,UACA;AAAA,UACA,EAAE,UAAU,SAAS,MAAM,SAAS,gBAAgB,KAAK;AAAA,UACzD,EAAE,UAAU,QAAQ,MAAM,YAAY,gBAAgB,KAAK;AAAA,UAC3D,EAAE,UAAU,MAAM,MAAM,QAAQ,gBAAgB,KAAK;AAAA,UACrD;AAAA,QACD;AAAA,MACD;AAAA,IACD,KAAK;AACJ,aAAO;AAAA,QACN,qBAAqB;AAAA,QACrB,QAAQ;AAAA,UACP;AAAA,UACA;AAAA,UACA,EAAE,UAAU,SAAS,MAAM,YAAY,gBAAgB,iBAAiB;AAAA,UACxE,EAAE,UAAU,QAAQ,MAAM,YAAY,gBAAgB,KAAK;AAAA,UAC3D,EAAE,UAAU,MAAM,MAAM,QAAQ,gBAAgB,KAAK;AAAA,UACrD;AAAA,QACD;AAAA,MACD;AAAA,IACD,KAAK;AACJ,aAAO;AAAA,QACN,qBAAqB;AAAA,QACrB,QAAQ;AAAA,UACP;AAAA,UACA;AAAA,UACA,EAAE,UAAU,SAAS,MAAM,SAAS,gBAAgB,KAAK;AAAA,UACzD,EAAE,UAAU,QAAQ,MAAM,WAAW,gBAAgB,aAAa;AAAA,UAClE,EAAE,UAAU,MAAM,MAAM,UAAU,gBAAgB,KAAK;AAAA,UACvD;AAAA,QACD;AAAA,MACD;AAAA,IACD,KAAK;AACJ,aAAO;AAAA,QACN,qBAAqB;AAAA,QACrB,QAAQ;AAAA,UACP;AAAA,UACA;AAAA,UACA,EAAE,UAAU,SAAS,MAAM,YAAY,gBAAgB,iBAAiB;AAAA,UACxE,EAAE,UAAU,QAAQ,MAAM,WAAW,gBAAgB,sBAAsB;AAAA,UAC3E,EAAE,UAAU,MAAM,MAAM,UAAU,gBAAgB,KAAK;AAAA,UACvD;AAAA,QACD;AAAA,MACD;AAAA,IACD,KAAK;AACJ,aAAO;AAAA,QACN,qBAAqB;AAAA,QACrB,QAAQ;AAAA,UACP,EAAE,UAAU,QAAQ,MAAM,SAAS,gBAAgB,cAAc;AAAA,UACjE;AAAA,UACA,EAAE,UAAU,SAAS,MAAM,SAAS,gBAAgB,KAAK;AAAA,UACzD,EAAE,UAAU,QAAQ,MAAM,WAAW,gBAAgB,KAAK;AAAA,UAC1D,EAAE,UAAU,MAAM,MAAM,gBAAgB,gBAAgB,KAAK;AAAA,UAC7D;AAAA,QACD;AAAA,MACD;AAAA,EACF;AACD;AAUA,eAAsB,sBACrB,MACA,WACA,SACgB;AAChB,QAAM,OAA+B;AAAA,IACpC,aAAa,QAAQ;AAAA,IACrB,gBAAgB,QAAQ;AAAA,IACxB,aAAa,QAAQ;AAAA,IACrB,YAAY,QAAQ,cAAc;AAAA,EACnC;AAEA,aAAW,SAAS,KAAK,QAAQ;AAChC,QAAI,MAAM,mBAAmB,MAAM;AAClC;AAAA,IACD;AACA,UAAM,YAAY,gBAAgB,MAAM,cAAc;AACtD,UAAM,cAAc,WAAW,WAAW,IAAI;AAAA,EAC/C;AACD;AAEA,eAAe,cACd,KACA,MACA,MACgB;AAChB,YAAM,wBAAM,MAAM,EAAE,WAAW,KAAK,CAAC;AACrC,QAAM,UAAU,UAAM,0BAAQ,GAAG;AAEjC,aAAW,SAAS,SAAS;AAC5B,UAAM,cAAU,wBAAK,KAAK,KAAK;AAC/B,UAAM,UAAU,UAAM,uBAAK,OAAO;AAElC,QAAI,QAAQ,YAAY,GAAG;AAC1B,YAAM,cAAc,aAAS,wBAAK,MAAM,KAAK,GAAG,IAAI;AACpD;AAAA,IACD;AACA,QAAI,MAAM,SAAS,MAAM,GAAG;AAC3B,YAAM,UAAU,UAAM,2BAAS,SAAS,OAAO;AAC/C,YAAM,aAAa,MAAM,MAAM,GAAG,EAAE;AACpC,gBAAM,gCAAU,wBAAK,MAAM,UAAU,GAAG,oBAAoB,SAAS,IAAI,GAAG,OAAO;AACnF;AAAA,IACD;AACA,cAAM,2BAAS,aAAS,wBAAK,MAAM,KAAK,CAAC;AAAA,EAC1C;AACD;;;ACnKA,eAAsB,iBACrB,cACA,WACA,SACgB;AAChB,QAAM,OAAO,6BAA6B,YAAY;AACtD,QAAM,sBAAsB,MAAM,WAAW,OAAO;AACrD;;;AZ5BA,IAAAC,eAAA;AAsCO,IAAM,oBAAgB,6BAAc;AAAA,EAC1C,MAAM;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,EACd;AAAA,EACA,MAAM;AAAA,IACL,MAAM;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACX;AAAA,IACA,UAAU;AAAA,MACT,MAAM;AAAA,MACN,aAAa;AAAA,IACd;AAAA,IACA,UAAU;AAAA,MACT,MAAM;AAAA,MACN,aACC;AAAA,IACF;AAAA,IACA,IAAI;AAAA,MACH,MAAM;AAAA,MACN,aAAa;AAAA,IACd;AAAA,IACA,WAAW;AAAA,MACV,MAAM;AAAA,MACN,aAAa;AAAA,IACd;AAAA,IACA,IAAI;AAAA,MACH,MAAM;AAAA,MACN,aAAa;AAAA,IACd;AAAA,IACA,eAAe;AAAA,MACd,MAAM;AAAA,MACN,aACC;AAAA,IACF;AAAA,IACA,MAAM;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,IACd;AAAA,IACA,gBAAgB;AAAA,MACf,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACV;AAAA,IACA,KAAK;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,IACV;AAAA,IACA,UAAU;AAAA,MACT,MAAM;AAAA,MACN,aAAa;AAAA,IACd;AAAA,IACA,MAAM;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,IACd;AAAA,EACD;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AACnB,UAAM,SAAS,aAAa;AAC5B,UAAM,UAAU,mBAAmB;AACnC,UAAM,kBAAkB,IAAI,gBAAgB;AAC5C,WAAO,OAAO;AACd,QAAI;AACH,YAAM,cAAc,KAAK,QAAQ;AACjC,UAAI,CAAC,aAAa;AACjB,gBAAQ,MAAM,oDAA+C;AAAA,MAC9D;AAGA,YAAM,cACL,KAAK,SACJ,cAAc,gBAAgB,MAAM,QAAQ,KAAK,gBAAgB,aAAa;AAChF,UAAI,CAAC,aAAa;AACjB,eAAO,MAAM,0BAA0B;AACvC,gBAAQ,WAAW;AACnB;AAAA,MACD;AACA,YAAM,iBAAiB,oBAAoB,WAAW;AACtD,UAAI,CAAC,eAAe,OAAO;AAC1B,eAAO,MAAM,uBAAuB;AACpC,mBAAW,SAAS,eAAe,QAAQ;AAC1C,iBAAO,KAAK,KAAK,KAAK,EAAE;AAAA,QACzB;AACA,YAAI,CAAC,aAAa;AACjB,kBAAQ,MAAM,2BAA2B;AAAA,QAC1C;AACA,gBAAQ,WAAW;AACnB;AAAA,MACD;AAEA,YAAM,kBAA+B;AAAA,QACpC,UAAU,OAAO,KAAK,aAAa,WAAW,KAAK,WAAW;AAAA,QAC9D,WAAW,OAAO,KAAK,cAAc,WAAW,KAAK,YAAY;AAAA,QACjE,MAAM,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO;AAAA,QAClD,IAAI,OAAO,KAAK,OAAO,WAAW,KAAK,KAAK;AAAA,QAC5C,YAAY,OAAO,KAAK,aAAa,MAAM,WAAW,KAAK,aAAa,IAAI;AAAA,QAC5E,UAAU,KAAK;AAAA,QACf,MAAM,KAAK;AAAA,QACX;AAAA,MACD;AAEA,YAAM,YAAY,MAAM,6BAA6B;AAAA,QACpD,OAAO;AAAA,QACP;AAAA,QACA,OAAO;AAAA,MACR,CAAC;AACD,UAAI,UAAU,cAAc,SAAS;AACpC,eAAO,MAAM,cAAc,UAAU,SAAS,sCAAsC;AACpF,YAAI,CAAC,aAAa;AACjB,kBAAQ,MAAM,2BAA2B;AAAA,QAC1C;AACA,gBAAQ,WAAW;AACnB;AAAA,MACD;AACA,UAAI,UAAU,SAAS,QAAQ;AAC9B,eAAO,MAAM,cAAc,UAAU,IAAI,qCAAqC;AAC9E,YAAI,CAAC,aAAa;AACjB,kBAAQ,MAAM,2BAA2B;AAAA,QAC1C;AACA,gBAAQ,WAAW;AACnB;AAAA,MACD;AAGA,YAAM,WACL,KAAK,YAAY,gBAAgB,KAAK,QAAQ,IAAI,KAAK,WAAW,UAAU;AAG7E,UAAI;AACJ,UAAI,KAAK,MAAM,sBAAsB,KAAK,EAAE,GAAG;AAC9C,aAAK,KAAK;AAAA,MACX,WAAW,aAAa;AACvB,aAAK,qBAAqB;AAAA,MAC3B,WAAW,UAAU,uBAAuB;AAC3C,aAAK,gBAAgB,qBAAqB,GAAG,kBAAkB,qBAAqB;AAAA,MACrF,OAAO;AACN,cAAM,WAAW,qBAAqB;AACtC,aAAK,MAAM,QAAQ;AAAA,UAClB;AAAA,UACA,iBAAiB,IAAI,CAAC,OAAO;AAAA,YAC5B,OAAO,MAAM,WAAW,GAAG,CAAC,gBAAgB;AAAA,YAC5C,OAAO;AAAA,UACR,EAAE;AAAA,QACH;AAAA,MACD;AAEA,YAAM,kBAAkB,4BAA4B;AACpD,YAAM,aAAa,MAAM,iBAAiB,QAAQ,IAAI,CAAC;AACvD,YAAM,kBAAkB,MAAM,sBAAsB,QAAQ,IAAI,CAAC;AAEjE,UAAI,gBAAY,2BAAQ,QAAQ,IAAI,GAAG,WAAW;AAClD,UAAI,CAAC,eAAe,gBAAgB,cAAc,gBAAgB,SAAS,MAAM;AAChF,cAAM,qBAAqB,MAAM,QAAQ;AAAA,UACxC,YAAY,mBAAmB,gBAAgB,IAAI,CAAC,OAAO,gBAAgB,IAAI,+BAA+B,WAAW;AAAA,UACzH;AAAA,QACD;AACA,YAAI,oBAAoB;AACvB,sBAAY,+BAA+B,gBAAgB,MAAM,WAAW;AAAA,QAC7E;AAAA,MACD;AAGA,UAAI,MAAM,gBAAgB,SAAS,GAAG;AACrC,cAAM,IAAI,mBAAmB,WAAW;AAAA,MACzC;AAGA,YAAM,cAAc,mBAAmB;AAGvC,aAAO,KAAK,YAAY,WAAW,SAAS,QAAQ,cAAc;AAClE,YAAM,iBAAiB,UAAU,WAAW;AAAA,QAC3C;AAAA,QACA,gBAAgB;AAAA,QAChB;AAAA,QACA,YAAY,UAAU;AAAA,MACvB,CAAC;AACD,YAAM,wBAAwB;AAAA,QAC7B;AAAA,QACA;AAAA,QACA,IAAI,UAAU;AAAA,QACd,YAAY,UAAU;AAAA,MACvB,CAAC;AACD,UAAI,CAAC,eAAe,gBAAgB,WAAW,WAAW;AACzD,cAAM,0BAA0B,MAAM,QAAQ;AAAA,UAC7C,YAAY,aAAa,gBAAgB,MAAM,CAAC,uCAAuC,aAAa,gBAAgB,MAAM,CAAC;AAAA,UAC3H;AAAA,QACD;AACA,YAAI,yBAAyB;AAC5B,gBAAM,gBAAgB,MAAM,2BAA2B;AAAA,YACtD;AAAA,YACA,QAAQ,gBAAgB;AAAA,UACzB,CAAC;AACD,cAAI,cAAc,SAAS;AAC1B,mBAAO;AAAA,cACN,mCAAmC,iBAAiB,WAAW,cAAc,QAAQ,CAAC;AAAA,YACvF;AAAA,UACD;AAAA,QACD;AAAA,MACD;AACA,UAAI,UAAU,OAAO,cAAcC,gBAAe,QAAQ,GAAG;AAC5D,eAAO;AAAA,UACN,mCAAmC,uBAAuB,UAAU,UAAU,CAAC;AAAA,QAChF;AAAA,MACD;AACA,UAAI,WAAW,eAAe;AAC7B,eAAO;AAAA,UACN,uCAAuC,WAAW,cAAc;AAAA,QACjE;AAAA,MACD;AACA,aAAO,QAAQ,oBAAoB;AAEnC,UAAI,sBAAsB,eAAe,GAAG;AAC3C,gCAAwB,iBAAiB;AAAA,UACxC,UAAU,UAAU;AAAA,UACpB,WAAW,UAAU;AAAA,UACrB,MAAM,UAAU;AAAA,UAChB,IAAI,UAAU;AAAA,UACd,YAAY,UAAU;AAAA,UACtB,UAAU,UAAU;AAAA,UACpB,MAAM,UAAU;AAAA,UAChB,gBAAgB;AAAA,QACjB,CAAC;AAAA,MACF;AAGA,UAAI,CAAC,KAAK,cAAc,GAAG;AAC1B,eAAO,KAAK,4BAA4B;AACxC,YAAI;AACH,mDAAS,kBAAkB,EAAE,GAAG,EAAE,KAAK,WAAW,OAAO,UAAU,CAAC;AACpE,iBAAO,QAAQ,wBAAwB;AAAA,QACxC,QAAQ;AACP,iBAAO,KAAK,uDAAuD;AAAA,QACpE;AAAA,MACD;AAGA,aAAO,MAAM;AACb,aAAO,KAAK,mBAAmB;AAC/B,aAAO,MAAM;AACb,aAAO,KAAK,QAAQ,SAAS,EAAE;AAC/B,aAAO,KAAK,KAAK,iBAAiB,EAAE,CAAC,EAAE;AACvC,aAAO,MAAM;AACb,UAAI,CAAC,aAAa;AACjB,gBAAQ,MAAM,0CAA0C;AAAA,MACzD;AAAA,IACD,SAAS,OAAO;AACf,UAAI,iBAAiB,sBAAsB;AAC1C,gBAAQ,WAAW;AACnB;AAAA,MACD;AACA,UAAI,iBAAiB,SAAS,MAAM,QAAQ,WAAW,YAAY,GAAG;AACrE,eAAO,MAAM,MAAM,OAAO;AAC1B,YAAI,CAAC,KAAK,KAAK;AACd,kBAAQ,MAAM,2BAA2B;AAAA,QAC1C;AACA,gBAAQ,WAAW;AACnB;AAAA,MACD;AACA,YAAM;AAAA,IACP;AAAA,EACD;AACD,CAAC;AAED,SAAS,gBAAgB,OAAsC;AAC9D,SAAQ,UAAgC,SAAS,KAAK;AACvD;AAEA,SAAS,sBAAsB,OAAwC;AACtE,SAAQ,iBAAuC,SAAS,KAAK;AAC9D;AAEA,SAASA,gBAAe,UAAiC;AACxD,SACC,aAAa,gBAAgB,aAAa,yBAAyB,aAAa;AAElF;AAEA,SAAS,uBAAuB,YAA4B;AAC3D,UAAQ,YAAY;AAAA,IACnB,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR;AACC,aAAO;AAAA,EACT;AACD;AAEA,SAAS,aAAa,QAAwB;AAC7C,UAAQ,QAAQ;AAAA,IACf,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR;AACC,aAAO;AAAA,EACT;AACD;AAEA,SAAS,mBAAmB,MAAsB;AACjD,UAAQ,MAAM;AAAA,IACb,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR;AACC,aAAO;AAAA,EACT;AACD;AAEA,SAAS,iBAAiB,WAAmB,UAAiC;AAC7E,MAAI,aAAa,KAAM,QAAO;AAC9B,QAAM,mBAAmB,UAAU,SAAS,GAAG,IAAI,YAAY,GAAG,SAAS;AAC3E,MAAI,SAAS,WAAW,gBAAgB,GAAG;AAC1C,WAAO,SAAS,MAAM,iBAAiB,MAAM;AAAA,EAC9C;AACA,MAAI,aAAa,WAAW;AAC3B,WAAO;AAAA,EACR;AACA,SAAO;AACR;AAUA,SAAS,qBAA6B;AACrC,MAAI;AACH,QAAI,UAAM,+BAAQ,gCAAcD,aAAY,GAAG,CAAC;AAChD,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC3B,YAAM,cAAU,2BAAQ,KAAK,cAAc;AAC3C,cAAI,4BAAW,OAAO,GAAG;AACxB,cAAM,MAAM,KAAK,UAAM,8BAAa,SAAS,OAAO,CAAC;AACrD,YAAI,IAAI,SAAS,eAAe;AAC/B,cAAI,IAAI,YAAY,QAAS,QAAO;AAEpC,gBAAM,QAAQ,IAAI,QAAQ,MAAM,GAAG;AACnC,iBAAO,IAAI,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AAAA,QAChC;AAAA,MACD;AACA,gBAAM,2BAAQ,GAAG;AAAA,IAClB;AACA,WAAO;AAAA,EACR,QAAQ;AACP,WAAO;AAAA,EACR;AACD;;;AazZA,IAAAE,kBAA2B;AAC3B,IAAAC,qBAA+B;AAC/B,IAAAC,gBAA8B;;;ACFvB,IAAM,mBAAmB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AA+EO,SAAS,iBAAiB,OAAwC;AACxE,SAAQ,iBAAuC,SAAS,KAAK;AAC9D;;;ACzFA,IAAAC,6BAAsB;AACtB,IAAAC,qBAAqB;;;ACDrB,IAAAC,6BAAsB;AACtB,IAAAC,kBAA2B;AAC3B,IAAAC,mBAAkC;AAClC,IAAAC,qBAA8B;AA2B9B,eAAsB,YAAY,SAAyD;AAC1F,QAAM,iBAAiB,MAAM,+BAA+B,QAAQ,aAAa,QAAQ,MAAM;AAC/F,MAAI,CAAC,gBAAgB;AACpB,UAAM,IAAI;AAAA,MACT,uCAAuC,QAAQ,WAAW;AAAA,IAC3D;AAAA,EACD;AAEA,QAAM,OAAO;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA,QAAQ,QAAQ;AAAA,EACjB;AAEA,QAAM,WAAW,QAAQ,UAAU,MAAM,QAAQ,WAAW;AAC5D,QAAM,sBAAsB,QAAQ,aAAa,QAAQ,MAAM;AAC/D,SAAO,EAAE,QAAQ,QAAQ,OAAO;AACjC;AAUA,eAAe,sBAAsB,aAAqB,QAA+B;AACxF,QAAM,gBAAY,yBAAK,QAAQ,QAAQ;AACvC,MAAI,KAAC,4BAAW,SAAS,EAAG;AAE5B,QAAM,QAAQ,UAAM,0BAAQ,SAAS;AAGrC,QAAM,aAAa,MAAM,KAAK,CAAC,MAAM,qBAAqB,KAAK,CAAC,CAAC;AACjE,MAAI,cAAc,CAAC,MAAM,SAAS,cAAc,GAAG;AAClD,cAAM,+BAAS,yBAAK,WAAW,UAAU,OAAG,yBAAK,WAAW,cAAc,CAAC;AAAA,EAC5E;AAGA,MAAI,CAAC,MAAM,SAAS,6BAA6B,GAAG;AACnD,UAAM,gBAAY;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AACA,YAAI,4BAAW,SAAS,GAAG;AAC1B,gBAAM,2BAAS,eAAW,yBAAK,WAAW,6BAA6B,CAAC;AAAA,IACzE;AAAA,EACD;AACD;AAEA,eAAe,WAAW,SAAiB,MAAgB,KAA4B;AACtF,QAAM,IAAI,QAAc,CAACC,WAAS,WAAW;AAC5C,UAAM,YAAQ,kCAAM,SAAS,MAAM;AAAA,MAClC;AAAA,MACA,OAAO;AAAA,MACP,KAAK,QAAQ;AAAA,IACd,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,UAAU;AAC5B,aAAO,KAAK;AAAA,IACb,CAAC;AAED,UAAM,GAAG,QAAQ,CAAC,SAAS;AAC1B,UAAI,SAAS,GAAG;AACf,QAAAA,UAAQ;AACR;AAAA,MACD;AAEA,aAAO,IAAI,MAAM,sCAAsC,OAAO,QAAQ,SAAS,CAAC,GAAG,CAAC;AAAA,IACrF,CAAC;AAAA,EACF,CAAC;AACF;;;AC9GA,IAAAC,mBAAsB;AACtB,IAAAA,mBAAuB;AACvB,IAAAC,qBAAqB;AACrB,qBAAsB;AAmBtB,IAAM,2BAA2B;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AAIA,eAAsB,aAAa,SAA2D;AAC7F,QAAM,aAAa,QAAQ,uBAAuB;AAClD,QAAM,gBAAgB,MAAM,mBAAmB,QAAQ,aAAa,UAAU;AAC9E,MAAI,CAAC,eAAe;AACnB,UAAM,IAAI;AAAA,MACT,yCAAyC,QAAQ,WAAW,iBAAiB,WAAW,KAAK,IAAI,CAAC;AAAA,IACnG;AAAA,EACD;AAEA,YAAM,wBAAM,QAAQ,iBAAiB,EAAE,WAAW,KAAK,CAAC;AACxD,QAAM,qBAAiB,yBAAK,QAAQ,iBAAiB,mBAAmB;AAExE,YAAM,sBAAM;AAAA,IACX,aAAa,CAAC,aAAa;AAAA,IAC3B,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,QAAQ,CAAC,QAAQ;AAAA,IACjB,WAAW;AAAA,IACX,UAAU;AAAA,IACV,UAAU,CAAC,gBAAgB;AAAA,IAC3B,QAAQ;AAAA,MACP,IAAI;AAAA,IACL;AAAA,EACD,CAAC;AAED,SAAO;AAAA,IACN;AAAA,IACA;AAAA,EACD;AACD;AAEA,eAAe,mBACd,aACA,YACyB;AACzB,aAAW,aAAa,YAAY;AACnC,UAAM,eAAW,yBAAK,aAAa,SAAS;AAC5C,QAAI;AACH,gBAAM,yBAAO,QAAQ;AACrB,aAAO;AAAA,IACR,QAAQ;AAAA,IAER;AAAA,EACD;AAEA,SAAO;AACR;;;AF1BO,IAAM,gBAAN,MAAyD;AAAA,EAC/C,OAAO;AAAA,EAEN,SAAS,aAAa;AAAA,EACtB;AAAA,EACT;AAAA,EAED,YAAY,UAAgC,CAAC,GAAG;AACtD,SAAK,SAAS,QAAQ,UAAU,IAAI,qBAAqB;AACzD,SAAK,iBAAiB,QAAQ,WAAW;AAAA,EAC1C;AAAA,EAEO,WAAW,SAAqC;AACtD,SAAK,iBAAiB;AAAA,EACvB;AAAA,EAEA,MAAa,SAA2B;AACvC,UAAM,SAAS,MAAM,KAAK,OAAO,IAAI,OAAO,CAAC,WAAW,GAAG,QAAQ,IAAI,CAAC;AACxE,WAAO,OAAO,aAAa;AAAA,EAC5B;AAAA,EAEA,MAAa,UAAyB;AACrC,UAAM,YAAY,MAAM,KAAK,OAAO;AACpC,QAAI,CAAC,WAAW;AACf,YAAM,IAAI;AAAA,QACT;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAa,eAA8B;AAC1C,UAAM,MAAM,KAAK,gBAAgB,eAAe,QAAQ,IAAI;AAC5D,UAAM,SAAS,MAAM,KAAK,OAAO,IAAI,OAAO,CAAC,OAAO,qBAAqB,GAAG,GAAG;AAC/E,QAAI,OAAO,aAAa,GAAG;AAC1B,YAAM,IAAI;AAAA,QACT;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAa,UAAU,QAAiD;AACvE,SAAK,iBAAiB;AAAA,MACrB,aAAa,OAAO;AAAA,MACpB,SAAS,OAAO;AAAA,MAChB,QAAQ,OAAO,UAAU;AAAA,IAC1B;AAEA,UAAM,SAAS,OAAO,UAAU;AAChC,UAAM,WAAW,QAAQ,OAAO,OAAO;AAGvC,UAAM,aAAa,MAAM,KAAK,OAAO;AAAA,MACpC;AAAA,MACA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAAA,MACA,OAAO;AAAA,IACR;AAEA,QACC,WAAW,aAAa,KACxB,CAAC,WAAW,OAAO,SAAS,kCAAkC,GAC7D;AACD,YAAM,IAAI,MAAM,oCAAoC,WAAW,MAAM,EAAE;AAAA,IACxE;AAGA,UAAM,WAAW,MAAM,KAAK,OAAO;AAAA,MAClC;AAAA,MACA,CAAC,OAAO,uBAAuB,WAAW,WAAW,YAAY,MAAM;AAAA,MACvE,OAAO;AAAA,IACR;AACA,UAAM,YAAY,SAAS,OAAO,KAAK;AAGvC,UAAM,KAAK,OAAO;AAAA,MACjB;AAAA,MACA,CAAC,OAAO,kBAAkB,kBAAkB,OAAO,SAAS,YAAY,MAAM;AAAA,MAC9E,OAAO;AAAA,IACR;AAGA,UAAM,KAAK,OAAO;AAAA,MACjB;AAAA,MACA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ,OAAO,OAAO;AAAA,QACtB;AAAA,QACA;AAAA,MACD;AAAA,MACA,OAAO;AAAA,IACR;AAEA,WAAO;AAAA,MACN,eAAe,GAAG,SAAS,YAAY,MAAM,kBAAkB,QAAQ;AAAA,MACvE,YAAY;AAAA,MACZ,YAAY,CAAC,MAAM;AAAA,IACpB;AAAA,EACD;AAAA,EAEA,MAAa,MAAM,QAAgD;AAClE,SAAK,iBAAiB;AAAA,MACrB,aAAa,OAAO;AAAA,MACpB,SAAS,OAAO;AAAA,MAChB,QAAQ,OAAO;AAAA,IAChB;AAEA,UAAM,sBAAkB,yBAAK,OAAO,aAAa,SAAS,QAAQ;AAElE,UAAM,aAAa;AAAA,MAClB,aAAa,OAAO;AAAA,MACpB;AAAA,IACD,CAAC;AAED,UAAM,SACL,OAAO,iBAAiB,gBACrB,OACA,MAAM,YAAY;AAAA,MAClB,aAAa,OAAO;AAAA,MACpB,YAAQ,yBAAK,iBAAiB,MAAM;AAAA,MACpC,MAAM;AAAA,IACP,CAAC;AAEJ,WAAO;AAAA,MACN,iBAAiB,QAAQ,UAAU;AAAA,MACnC,sBAAkB,yBAAK,iBAAiB,mBAAmB;AAAA,MAC3D;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAa,OAAO,WAAkD;AACrE,UAAM,UAAU,KAAK,eAAe;AACpC,UAAM,SAAS,QAAQ,UAAU;AACjC,UAAM,WAAW,QAAQ,QAAQ,OAAO;AAGxC,UAAM,gBAAgB,MAAM,KAAK,OAAO;AAAA,MACvC;AAAA,MACA,CAAC,OAAO,sBAAsB,YAAY,MAAM;AAAA,MAChD,QAAQ;AAAA,IACT;AAEA,QAAI,cAAc,aAAa,GAAG;AACjC,YAAM,IAAI,MAAM,qBAAqB,cAAc,MAAM,EAAE;AAAA,IAC5D;AAGA,UAAM,WAAW,MAAM,KAAK,OAAO;AAAA,MAClC;AAAA,MACA,CAAC,OAAO,uBAAuB,WAAW,WAAW,YAAY,MAAM;AAAA,MACvE,QAAQ;AAAA,IACT;AACA,UAAM,YAAY,SAAS,OAAO,KAAK;AACvC,UAAM,SAAS,GAAG,SAAS,YAAY,MAAM;AAC7C,UAAM,WAAW,GAAG,MAAM,IAAI,QAAQ;AAGtC,UAAM,cAAc,MAAM,KAAK,OAAO;AAAA,MACrC;AAAA,MACA,CAAC,SAAS,cAAc,OAAO,oBAAoB,MAAM;AAAA,MACzD,UAAU;AAAA,IACX;AAIA,SAAK,OAAO,KAAK,0BAA0B;AAC3C,UAAM,cAAc,MAAM,KAAK,OAAO;AAAA,MACrC;AAAA,MACA,CAAC,SAAS,cAAc,eAAe,MAAM,UAAU,GAAG;AAAA,MAC1D,UAAU;AAAA,IACX;AAEA,QAAI,YAAY,aAAa,GAAG;AAC/B,YAAM,IAAI,MAAM,wBAAwB,YAAY,MAAM,EAAE;AAAA,IAC7D;AAGA,SAAK,OAAO,KAAK,yBAAyB;AAC1C,UAAM,aAAa,MAAM,KAAK,OAAO;AAAA,MACpC;AAAA,MACA,CAAC,QAAQ,QAAQ;AAAA,MACjB,UAAU;AAAA,IACX;AAEA,QAAI,WAAW,aAAa,GAAG;AAC9B,YAAM,IAAI,MAAM,uBAAuB,WAAW,MAAM,EAAE;AAAA,IAC3D;AAGA,UAAM,UAAU,KAAK,UAAU;AAAA,MAC9B,QAAQ,QAAQ;AAAA,MAChB,aAAa;AAAA,MACb,yBAAyB,CAAC,SAAS;AAAA,MACnC,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,kBAAkB,gBAAgB,SAAS;AAAA,MAC3C,sBAAsB;AAAA,QACrB;AAAA,UACC,MAAM,QAAQ;AAAA,UACd,OAAO;AAAA,UACP,WAAW;AAAA,UACX,cAAc,CAAC,EAAE,eAAe,MAAM,UAAU,MAAM,CAAC;AAAA,UACvD,kBAAkB;AAAA,YACjB,WAAW;AAAA,YACX,SAAS;AAAA,cACR,iBAAiB,QAAQ,QAAQ,OAAO;AAAA,cACxC,kBAAkB;AAAA,cAClB,yBAAyB;AAAA,YAC1B;AAAA,UACD;AAAA,UACA,aAAa;AAAA,YACZ,SAAS,CAAC,aAAa,gDAAgD;AAAA,YACvE,UAAU;AAAA,YACV,SAAS;AAAA,YACT,SAAS;AAAA,YACT,aAAa;AAAA,UACd;AAAA,QACD;AAAA,MACD;AAAA,IACD,CAAC;AAED,UAAM,eAAe,MAAM,KAAK,OAAO;AAAA,MACtC;AAAA,MACA,CAAC,OAAO,4BAA4B,oBAAoB,SAAS,YAAY,MAAM;AAAA,MACnF,QAAQ;AAAA,IACT;AAEA,QAAI,aAAa,aAAa,GAAG;AAChC,YAAM,IAAI,MAAM,wCAAwC,aAAa,MAAM,EAAE;AAAA,IAC9E;AAGA,UAAM,gBAAgB,MAAM,KAAK,OAAO;AAAA,MACvC;AAAA,MACA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAAA,MACA,QAAQ;AAAA,IACT;AAEA,UAAM,gBAAe,oBAAI,KAAK,GAAE,YAAY;AAE5C,QAAI,cAAc,aAAa,GAAG;AACjC,WAAK,OAAO,KAAK,4CAA4C;AAG7D,WAAK,OAAO;AAAA,QACX;AAAA;AAAA,gBAAwG,QAAQ,OAAO;AAAA,qBAA2B,QAAQ,OAAO;AAAA,wBAA8B,QAAQ,OAAO;AAAA;AAAA;AAAA;AAAA,eAA2M,MAAM;AAAA,MACha;AAAA,IACD;AAEA,WAAO;AAAA,MACN;AAAA,MACA,SAAS,WAAW,QAAQ,OAAO,IAAI,MAAM;AAAA,MAC7C,SAAS,SAAS,QAAQ,OAAO,IAAI,MAAM;AAAA,IAC5C;AAAA,EACD;AAAA,EAEA,MAAa,SAAS,cAAqC;AAC1D,UAAM,UAAU,KAAK,eAAe;AACpC,UAAM,SAAS,QAAQ,UAAU;AAGjC,UAAM,SAAS,MAAM,KAAK,OAAO;AAAA,MAChC;AAAA,MACA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,QACA,GAAG,QAAQ,OAAO,IAAI,YAAY;AAAA,QAClC;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAAA,MACA,QAAQ;AAAA,IACT;AAEA,QAAI,OAAO,aAAa,GAAG;AAC1B,YAAM,IAAI,MAAM,wBAAwB,OAAO,MAAM,EAAE;AAAA,IACxD;AAAA,EACD;AAAA,EAEA,OAAc,KAAK,SAA6C;AAC/D,UAAM,UAAU,KAAK,eAAe;AACpC,UAAM,SAAS,QAAQ,UAAU;AAEjC,UAAM,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,QAAQ,OAAO;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAEA,QAAI,QAAQ,MAAM;AACjB,WAAK,KAAK,WAAW,OAAO,QAAQ,IAAI,CAAC;AAAA,IAC1C;AAEA,UAAM,SAAS,MAAM,KAAK,OAAO,IAAI,OAAO,MAAM,QAAQ,WAAW;AACrE,QAAI,OAAO,aAAa,GAAG;AAC1B;AAAA,IACD;AAEA,QAAI;AACH,YAAM,SAAS,KAAK,MAAM,OAAO,MAAM;AAGvC,iBAAW,SAAS,OAAO,UAAU,CAAC,GAAG;AACxC,cAAM;AAAA,UACL,WAAW,IAAI,KAAK,MAAM,SAAS,EAAE,YAAY;AAAA,UACjD,OAAO,cAAc,MAAM,OAAO;AAAA,UAClC,SAAS,MAAM;AAAA,QAChB;AAAA,MACD;AAAA,IACD,QAAQ;AAEP,iBAAW,QAAQ,OAAO,OAAO,MAAM,IAAI,EAAE,OAAO,OAAO,GAAG;AAC7D,cAAM,EAAE,YAAW,oBAAI,KAAK,GAAE,YAAY,GAAG,OAAO,QAAQ,SAAS,KAAK;AAAA,MAC3E;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAa,SAAoC;AAChD,UAAM,UAAU,KAAK,eAAe;AACpC,UAAM,SAAS,QAAQ,UAAU;AAEjC,UAAM,SAAS,MAAM,KAAK,OAAO;AAAA,MAChC;AAAA,MACA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,MACD;AAAA,MACA,QAAQ;AAAA,IACT;AAEA,QAAI,OAAO,aAAa,GAAG;AAC1B,aAAO,EAAE,OAAO,UAAU,SAAS,OAAO,OAAO;AAAA,IAClD;AAEA,QAAI;AACH,YAAM,SAAS,KAAK,MAAM,OAAO,MAAM;AAGvC,YAAM,UAAU,OAAO,WAAW,CAAC;AACnC,UAAI,CAAC,SAAS;AACb,eAAO,EAAE,OAAO,WAAW,SAAS,oBAAoB;AAAA,MACzD;AAEA,UAAI,QAAQ,WAAW,YAAY,QAAQ,eAAe,GAAG;AAC5D,eAAO;AAAA,UACN,OAAO;AAAA,UACP,SAAS,WAAW,QAAQ,YAAY,IAAI,QAAQ,YAAY;AAAA,QACjE;AAAA,MACD;AAEA,aAAO;AAAA,QACN,OAAO,QAAQ,iBAAiB,IAAI,YAAY;AAAA,QAChD,SAAS,WAAW,QAAQ,MAAM,cAAc,QAAQ,YAAY,IAAI,QAAQ,YAAY;AAAA,MAC7F;AAAA,IACD,QAAQ;AACP,aAAO,EAAE,OAAO,WAAW,SAAS,iCAAiC;AAAA,IACtE;AAAA,EACD;AAAA,EAEQ,iBAAuC;AAC9C,QAAI,CAAC,KAAK,gBAAgB;AACzB,YAAM,IAAI,MAAM,oEAAoE;AAAA,IACrF;AACA,WAAO,KAAK;AAAA,EACb;AACD;AAKO,IAAM,uBAAN,MAAuD;AAAA,EAC7D,MAAa,IAAI,SAAiB,MAAgB,KAAwC;AACzF,WAAO,IAAI,QAA0B,CAACC,cAAY;AACjD,YAAM,YAAQ,kCAAM,SAAS,MAAM;AAAA,QAClC;AAAA,QACA,KAAK,QAAQ;AAAA,QACb,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,MACjC,CAAC;AAED,UAAI,SAAS;AACb,UAAI,SAAS;AACb,YAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB;AAC3C,kBAAU,MAAM,SAAS,OAAO;AAAA,MACjC,CAAC;AACD,YAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB;AAC3C,kBAAU,MAAM,SAAS,OAAO;AAAA,MACjC,CAAC;AACD,YAAM,GAAG,SAAS,CAAC,UAAU;AAC5B,QAAAA,UAAQ,EAAE,UAAU,GAAG,QAAQ,QAAQ,GAAG,MAAM;AAAA,EAAK,MAAM,OAAO,GAAG,CAAC;AAAA,MACvE,CAAC;AACD,YAAM,GAAG,QAAQ,CAAC,SAAS;AAC1B,QAAAA,UAAQ,EAAE,UAAU,QAAQ,GAAG,QAAQ,OAAO,KAAK,GAAG,QAAQ,OAAO,KAAK,EAAE,CAAC;AAAA,MAC9E,CAAC;AAAA,IACF,CAAC;AAAA,EACF;AACD;AAEA,SAAS,cAAc,MAAgC;AACtD,QAAM,aAAa,KAAK,YAAY;AACpC,MAAI,WAAW,SAAS,OAAO,EAAG,QAAO;AACzC,MAAI,WAAW,SAAS,MAAM,EAAG,QAAO;AACxC,MAAI,WAAW,SAAS,OAAO,EAAG,QAAO;AACzC,SAAO;AACR;;;AG7eA,IAAAC,6BAAsB;AACtB,IAAAC,qBAAqB;AAoDd,IAAM,sBAAN,MAA+D;AAAA,EACrD,OAAO;AAAA,EAEN,SAAS,aAAa;AAAA,EACtB;AAAA,EACT;AAAA,EAED,YAAY,UAAsC,CAAC,GAAG;AAC5D,SAAK,SAAS,QAAQ,UAAU,IAAI,8BAA8B;AAClE,SAAK,iBAAiB,QAAQ,WAAW;AAAA,EAC1C;AAAA,EAEO,WAAW,SAA2C;AAC5D,SAAK,iBAAiB;AAAA,EACvB;AAAA,EAEA,MAAa,SAA2B;AACvC,UAAM,SAAS,MAAM,KAAK,OAAO,IAAI,OAAO,CAAC,WAAW,GAAG,QAAQ,IAAI,CAAC;AACxE,WAAO,OAAO,aAAa;AAAA,EAC5B;AAAA,EAEA,MAAa,UAAyB;AACrC,UAAM,YAAY,MAAM,KAAK,OAAO;AACpC,QAAI,CAAC,WAAW;AACf,YAAM,IAAI;AAAA,QACT;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAa,eAA8B;AAC1C,UAAM,MAAM,KAAK,gBAAgB,eAAe,QAAQ,IAAI;AAC5D,UAAM,SAAS,MAAM,KAAK,OAAO,IAAI,OAAO,CAAC,OAAO,qBAAqB,GAAG,GAAG;AAC/E,QAAI,OAAO,aAAa,GAAG;AAC1B,YAAM,IAAI;AAAA,QACT;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAa,UAAU,QAAiD;AACvE,SAAK,iBAAiB;AAAA,MACrB,aAAa,OAAO;AAAA,MACpB,SAAS,OAAO;AAAA,MAChB,QAAQ,OAAO,UAAU;AAAA,IAC1B;AAEA,UAAM,SAAS,OAAO,UAAU;AAChC,UAAM,cAAc,sBAAsB,OAAO,OAAO;AAGxD,UAAM,gBAAgB,MAAM,KAAK,OAAO;AAAA,MACvC;AAAA,MACA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAAA,MACA,OAAO;AAAA,IACR;AAEA,QAAI,cAAc,aAAa,KAAK,CAAC,cAAc,OAAO,SAAS,gBAAgB,GAAG;AACrF,YAAM,IAAI,MAAM,iDAAiD,cAAc,MAAM,EAAE;AAAA,IACxF;AAEA,WAAO;AAAA,MACN,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,YAAY,CAAC,MAAM;AAAA,IACpB;AAAA,EACD;AAAA,EAEA,MAAa,MAAM,QAAgD;AAClE,SAAK,iBAAiB;AAAA,MACrB,aAAa,OAAO;AAAA,MACpB,SAAS,OAAO;AAAA,MAChB,QAAQ,OAAO;AAAA,IAChB;AAEA,UAAM,sBAAkB,yBAAK,OAAO,aAAa,SAAS,QAAQ;AAElE,UAAM,aAAa;AAAA,MAClB,aAAa,OAAO;AAAA,MACpB;AAAA,IACD,CAAC;AAED,UAAM,SACL,OAAO,iBAAiB,gBACrB,OACA,MAAM,YAAY;AAAA,MAClB,aAAa,OAAO;AAAA,MACpB,YAAQ,yBAAK,iBAAiB,MAAM;AAAA,MACpC,MAAM;AAAA,IACP,CAAC;AAEJ,WAAO;AAAA,MACN,iBAAiB,QAAQ,UAAU;AAAA,MACnC,sBAAkB,yBAAK,iBAAiB,mBAAmB;AAAA,MAC3D;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAa,OAAO,WAAkD;AACrE,UAAM,UAAU,KAAK,eAAe;AACpC,UAAM,SAAS,QAAQ,UAAU;AACjC,UAAM,cAAc,sBAAsB,QAAQ,OAAO;AACzD,UAAM,WAAW,GAAG,WAAW;AAG/B,SAAK,OAAO,KAAK,0BAA0B;AAC3C,UAAM,cAAc,MAAM,KAAK,OAAO;AAAA,MACrC;AAAA,MACA,CAAC,SAAS,cAAc,eAAe,MAAM,UAAU,GAAG;AAAA,MAC1D,UAAU;AAAA,IACX;AAEA,QAAI,YAAY,aAAa,GAAG;AAC/B,YAAM,IAAI,MAAM,wBAAwB,YAAY,MAAM,EAAE;AAAA,IAC7D;AAGA,SAAK,OAAO,KAAK,+BAA+B;AAChD,UAAM,YAAY,MAAM,KAAK,OAAO;AAAA,MACnC;AAAA,MACA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAAA,MACA,UAAU;AAAA,IACX;AAEA,QAAI,UAAU,aAAa,GAAG;AAC7B,YAAM,IAAI,MAAM,gCAAgC,UAAU,MAAM,EAAE;AAAA,IACnE;AAGA,UAAM,iBAAiB,uBAAuB,UAAU,MAAM,KAAK,IAAI,WAAW;AAGlF,SAAK,OAAO,KAAK,kCAAkC;AACnD,UAAM,cAAsC,EAAE,MAAM,OAAO;AAE3D,eAAW,OAAO,sBAAsB;AACvC,YAAM,QAAQ,QAAQ,IAAI,GAAG;AAC7B,UAAI,OAAO;AACV,oBAAY,GAAG,IAAI;AAAA,MACpB;AAAA,IACD;AACA,UAAM,aAAa,KAAK,UAAU;AAAA,MACjC,CAAC,WAAW,GAAG;AAAA,QACd,OAAO;AAAA,QACP,OAAO,EAAE,QAAQ,OAAO;AAAA,QACxB;AAAA,MACD;AAAA,IACD,CAAC;AACD,UAAM,iBAAiB,KAAK,UAAU;AAAA,MACrC,eAAe;AAAA,MACf,eAAe;AAAA,MACf,aAAa;AAAA,QACZ,MAAM;AAAA,QACN,iBAAiB;AAAA,QACjB,gBAAgB;AAAA,QAChB,kBAAkB;AAAA,QAClB,oBAAoB;AAAA,MACrB;AAAA,IACD,CAAC;AAED,UAAM,eAAe,MAAM,KAAK,OAAO;AAAA,MACtC;AAAA,MACA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAAA,MACA,QAAQ;AAAA,IACT;AAEA,QAAI,aAAa,aAAa,GAAG;AAChC,YAAM,IAAI,MAAM,gCAAgC,aAAa,MAAM,EAAE;AAAA,IACtE;AAGA,UAAM,cAAc,MAAM,KAAK,OAAO;AAAA,MACrC;AAAA,MACA,CAAC,aAAa,0BAA0B,kBAAkB,aAAa,YAAY,MAAM;AAAA,MACzF,QAAQ;AAAA,IACT;AAEA,UAAM,SACL,kBAAkB,YAAY,MAAM,KACpC,WAAW,WAAW,IAAI,MAAM;AACjC,UAAM,aAAa,OAAO,QAAQ,QAAQ,EAAE;AAC5C,UAAM,gBAAe,oBAAI,KAAK,GAAE,YAAY;AAE5C,WAAO;AAAA,MACN;AAAA,MACA,SAAS;AAAA,MACT,SAAS,GAAG,WAAW,QAAQ,YAAY,QAAQ,CAAC;AAAA,IACrD;AAAA,EACD;AAAA,EAEA,MAAa,SAAS,eAAsC;AAC3D,UAAM,UAAU,KAAK,eAAe;AACpC,UAAM,SAAS,QAAQ,UAAU;AACjC,UAAM,cAAc,sBAAsB,QAAQ,OAAO;AAIzD,UAAM,cAAc,MAAM,KAAK,OAAO;AAAA,MACrC;AAAA,MACA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAAA,MACA,QAAQ;AAAA,IACT;AAEA,QAAI,YAAY,aAAa,GAAG;AAC/B,YAAM,IAAI,MAAM,8BAA8B,YAAY,MAAM,EAAE;AAAA,IACnE;AAGA,UAAM,qBAAqB,wBAAwB,YAAY,QAAQ,WAAW;AAClF,QAAI,CAAC,oBAAoB;AACxB,YAAM,IAAI,MAAM,8CAA8C;AAAA,IAC/D;AAEA,UAAM,WAAW,MAAM,KAAK,OAAO;AAAA,MAClC;AAAA,MACA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK,UAAU,mBAAmB,UAAU;AAAA,QAC5C;AAAA,QACA,KAAK,UAAU,mBAAmB,cAAc;AAAA,QAChD;AAAA,QACA;AAAA,MACD;AAAA,MACA,QAAQ;AAAA,IACT;AAEA,QAAI,SAAS,aAAa,GAAG;AAC5B,YAAM,IAAI,MAAM,yCAAyC,SAAS,MAAM,EAAE;AAAA,IAC3E;AAAA,EACD;AAAA,EAEA,OAAc,KAAK,SAA6C;AAC/D,UAAM,UAAU,KAAK,eAAe;AACpC,UAAM,SAAS,QAAQ,UAAU;AACjC,UAAM,cAAc,sBAAsB,QAAQ,OAAO;AAEzD,UAAM,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAEA,QAAI,QAAQ,OAAO;AAClB,WAAK,KAAK,gBAAgB,QAAQ,KAAK;AAAA,IACxC;AAEA,UAAM,SAAS,MAAM,KAAK,OAAO,IAAI,OAAO,MAAM,QAAQ,WAAW;AACrE,QAAI,OAAO,aAAa,GAAG;AAC1B;AAAA,IACD;AAEA,QAAI;AACH,YAAM,SAAS,KAAK,MAAM,OAAO,MAAM;AAGvC,YAAM,SAAS,OAAO,aAAa,CAAC;AACpC,YAAM,UAAU,QAAQ,OAAO,OAAO,MAAM,CAAC,QAAQ,IAAI,IAAI;AAC7D,iBAAW,SAAS,SAAS;AAC5B,cAAM;AAAA,UACL,WAAW,MAAM;AAAA,UACjB,OAAOC,eAAc,MAAM,OAAO;AAAA,UAClC,SAAS,MAAM;AAAA,QAChB;AAAA,MACD;AAAA,IACD,QAAQ;AACP,iBAAW,QAAQ,OAAO,OAAO,MAAM,IAAI,EAAE,OAAO,OAAO,GAAG;AAC7D,cAAM,EAAE,YAAW,oBAAI,KAAK,GAAE,YAAY,GAAG,OAAO,QAAQ,SAAS,KAAK;AAAA,MAC3E;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAa,SAAoC;AAChD,UAAM,UAAU,KAAK,eAAe;AACpC,UAAM,SAAS,QAAQ,UAAU;AACjC,UAAM,cAAc,sBAAsB,QAAQ,OAAO;AAEzD,UAAM,SAAS,MAAM,KAAK,OAAO;AAAA,MAChC;AAAA,MACA,CAAC,aAAa,0BAA0B,kBAAkB,aAAa,YAAY,MAAM;AAAA,MACzF,QAAQ;AAAA,IACT;AAEA,QAAI,OAAO,aAAa,GAAG;AAC1B,aAAO,EAAE,OAAO,UAAU,SAAS,OAAO,OAAO;AAAA,IAClD;AAEA,QAAI;AACH,YAAM,SAAS,KAAK,MAAM,OAAO,MAAM;AAOvC,YAAM,UAAU,OAAO,oBAAoB,CAAC;AAC5C,UAAI,CAAC,SAAS;AACb,eAAO,EAAE,OAAO,WAAW,SAAS,8BAA8B;AAAA,MACnE;AAEA,YAAM,cAAc,QAAQ,mBAAmB,SAAS;AACxD,UAAI,QAAQ,UAAU,aAAa,gBAAgB,UAAU;AAC5D,eAAO;AAAA,UACN,OAAO;AAAA,UACP,SAAS;AAAA,UACT,SAAS,QAAQ;AAAA,QAClB;AAAA,MACD;AAEA,UAAI,QAAQ,UAAU,eAAe,gBAAgB,cAAc;AAClE,eAAO;AAAA,UACN,OAAO;AAAA,UACP,SAAS,YAAY,QAAQ,KAAK,iBAAiB,WAAW;AAAA,QAC/D;AAAA,MACD;AAEA,aAAO;AAAA,QACN,OAAO,QAAQ,UAAU,aAAa,WAAW;AAAA,QACjD,SAAS,YAAY,QAAQ,KAAK,iBAAiB,WAAW;AAAA,MAC/D;AAAA,IACD,QAAQ;AACP,aAAO,EAAE,OAAO,WAAW,SAAS,iCAAiC;AAAA,IACtE;AAAA,EACD;AAAA,EAEQ,iBAA6C;AACpD,QAAI,CAAC,KAAK,gBAAgB;AACzB,YAAM,IAAI,MAAM,0EAA0E;AAAA,IAC3F;AACA,WAAO,KAAK;AAAA,EACb;AACD;AAKO,IAAM,gCAAN,MAAyE;AAAA,EAC/E,MAAa,IACZ,SACA,MACA,KACqC;AACrC,WAAO,IAAI,QAAmC,CAACC,cAAY;AAC1D,YAAM,YAAQ,kCAAM,SAAS,MAAM;AAAA,QAClC;AAAA,QACA,KAAK,QAAQ;AAAA,QACb,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,MACjC,CAAC;AAED,UAAI,SAAS;AACb,UAAI,SAAS;AACb,YAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB;AAC3C,kBAAU,MAAM,SAAS,OAAO;AAAA,MACjC,CAAC;AACD,YAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB;AAC3C,kBAAU,MAAM,SAAS,OAAO;AAAA,MACjC,CAAC;AACD,YAAM,GAAG,SAAS,CAAC,UAAU;AAC5B,QAAAA,UAAQ,EAAE,UAAU,GAAG,QAAQ,QAAQ,GAAG,MAAM;AAAA,EAAK,MAAM,OAAO,GAAG,CAAC;AAAA,MACvE,CAAC;AACD,YAAM,GAAG,QAAQ,CAAC,SAAS;AAC1B,QAAAA,UAAQ,EAAE,UAAU,QAAQ,GAAG,QAAQ,OAAO,KAAK,GAAG,QAAQ,OAAO,KAAK,EAAE,CAAC;AAAA,MAC9E,CAAC;AAAA,IACF,CAAC;AAAA,EACF;AACD;AAKA,IAAM,uBAAuB,CAAC,gBAAgB,eAAe,cAAc,UAAU;AAKrF,SAAS,sBAAsB,MAAsB;AACpD,SACC,KACE,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,UAAU,GAAG,EACrB,QAAQ,UAAU,EAAE,EACpB,MAAM,GAAG,GAAG,KAAK;AAErB;AAEA,SAAS,uBAAuB,QAA+B;AAE9D,QAAM,QAAQ,OAAO,MAAM,0CAA0C;AACrE,MAAI,QAAQ,CAAC,GAAG;AACf,WAAO,MAAM,CAAC;AAAA,EACf;AAEA,QAAM,WAAW,OAAO,MAAM,kBAAkB;AAChD,SAAO,WAAW,CAAC,KAAK;AACzB;AAEA,SAAS,kBAAkB,SAAgC;AAC1D,MAAI;AACH,UAAM,SAAS,KAAK,MAAM,OAAO;AAGjC,UAAM,MAAM,OAAO,oBAAoB,CAAC,GAAG;AAC3C,QAAI,OAAO,QAAQ,YAAY,IAAI,SAAS,GAAG;AAC9C,aAAO,IAAI,WAAW,UAAU,IAAI,MAAM,WAAW,GAAG;AAAA,IACzD;AACA,WAAO;AAAA,EACR,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AAOA,SAAS,wBAAwB,SAAiB,aAA8C;AAC/F,MAAI;AACH,UAAM,SAAS,KAAK,MAAM,OAAO;AAOjC,UAAM,cAAc,OAAO,eAAe,CAAC;AAE3C,UAAM,WAAW,YAAY,SAAS,IAAI,YAAY,CAAC,IAAI;AAC3D,QAAI,CAAC,SAAU,QAAO;AAEtB,WAAO;AAAA,MACN,YAAY,SAAS;AAAA,MACrB,gBAAgB,SAAS;AAAA,IAC1B;AAAA,EACD,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AAEA,SAASD,eAAc,MAAgC;AACtD,QAAM,aAAa,KAAK,YAAY;AACpC,MAAI,WAAW,SAAS,OAAO,EAAG,QAAO;AACzC,MAAI,WAAW,SAAS,MAAM,EAAG,QAAO;AACxC,MAAI,WAAW,SAAS,OAAO,EAAG,QAAO;AACzC,SAAO;AACR;;;ACniBA,IAAAE,6BAAsB;AACtB,IAAAC,qBAAqB;;;ACDrB,IAAAC,oBAAiC;AACjC,IAAAC,qBAAqB;AAErB,IAAM,mBAAmB;AAclB,SAAS,gBAAgB,SAAiC;AAChE,QAAM,eAAe,QAAQ,gBAAgB;AAE7C,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA,UAAU,QAAQ,OAAO;AAAA,IACzB,qBAAqB,QAAQ,MAAM;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,qBAAqB,OAAO,YAAY,CAAC;AAAA,IACzC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,EAAE,KAAK,IAAI;AACZ;AAKA,eAAsB,qBACrB,iBACA,SACkB;AAClB,YAAM,yBAAM,iBAAiB,EAAE,WAAW,KAAK,CAAC;AAChD,QAAM,eAAW,yBAAK,iBAAiB,UAAU;AACjD,YAAM,6BAAU,UAAU,gBAAgB,OAAO,GAAG,OAAO;AAC3D,SAAO;AACR;;;ADjBO,IAAM,aAAN,MAAsD;AAAA,EAC5C,OAAO;AAAA,EAEN,SAAS,aAAa;AAAA,EACtB;AAAA,EACA;AAAA,EACT,aAA4B;AAAA,EAC5B;AAAA,EACA,mBAAkC;AAAA,EAEnC,YAAY,UAA6B,CAAC,GAAG;AACnD,SAAK,SAAS,QAAQ,UAAU,IAAI,qBAAqB;AACzD,SAAK,oBAAoB,QAAQ,qBAAqB;AACtD,SAAK,iBAAiB,QAAQ,WAAW;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKO,WAAW,SAAkC;AACnD,SAAK,iBAAiB;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,SAA2B;AACvC,UAAM,UAAU,MAAM,KAAK,qBAAqB,QAAQ,IAAI,CAAC;AAC7D,WAAO,YAAY;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,UAAyB;AACrC,UAAM,YAAY,MAAM,KAAK,OAAO;AACpC,QAAI,CAAC,WAAW;AACf,YAAM,IAAI;AAAA,QACT;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,eAA8B;AAC1C,UAAM,cAAc,KAAK,gBAAgB,eAAe,QAAQ,IAAI;AACpE,UAAM,SAAS,MAAM,KAAK,cAAc,CAAC,QAAQ,UAAU,QAAQ,GAAG,aAAa,KAAK;AACxF,QAAI,OAAO,aAAa,EAAG;AAE3B,UAAM,QAAQ,MAAM,KAAK,cAAc,CAAC,QAAQ,OAAO,GAAG,aAAa,IAAI;AAC3E,QAAI,MAAM,aAAa,GAAG;AACzB,YAAM,IAAI,MAAM,8BAA8B,eAAe,MAAM,QAAQ,MAAM,MAAM,CAAC,EAAE;AAAA,IAC3F;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,UAAU,QAAiD;AACvE,SAAK,iBAAiB;AAAA,MACrB,aAAa,OAAO;AAAA,MACpB,SAAS,OAAO;AAAA,MAChB,QAAQ,OAAO,UAAU;AAAA,IAC1B;AAEA,UAAM,gBAAgB,CAAC,QAAQ,UAAU,OAAO,OAAO;AAEvD,UAAM,YAAY,MAAM,KAAK,cAAc,eAAe,OAAO,aAAa,KAAK;AACnF,QAAI,UAAU,aAAa,KAAK,CAAC,wBAAwB,UAAU,QAAQ,UAAU,MAAM,GAAG;AAC7F,YAAM,IAAI;AAAA,QACT,oCAAoC,OAAO,OAAO,MAAM,eAAe,UAAU,QAAQ,UAAU,MAAM,CAAC;AAAA,MAC3G;AAAA,IACD;AAEA,UAAM,UAAoB,CAAC;AAC3B,UAAM,aAAa,MAAM,KAAK;AAAA,MAC7B,CAAC,WAAW,OAAO,aAAa,SAAS,OAAO,OAAO;AAAA,MACvD,OAAO;AAAA,MACP;AAAA,IACD;AACA,QAAI,WAAW,aAAa,GAAG;AAC9B,cAAQ,KAAK,MAAM;AAAA,IACpB;AAEA,WAAO;AAAA,MACN,eAAe,OAAO;AAAA,MACtB,YAAY;AAAA,MACZ,YAAY;AAAA,IACb;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,MAAM,QAAgD;AAClE,SAAK,iBAAiB;AAAA,MACrB,aAAa,OAAO;AAAA,MACpB,SAAS,OAAO;AAAA,MAChB,QAAQ,OAAO;AAAA,IAChB;AACA,UAAM,sBAAkB,yBAAK,OAAO,aAAa,SAAS,QAAQ;AAClE,UAAM,qBAAqB,iBAAiB;AAAA,MAC3C,SAAS,OAAO;AAAA,MAChB,QAAQ,OAAO,UAAU;AAAA,IAC1B,CAAC;AAED,UAAM,aAAa;AAAA,MAClB,aAAa,OAAO;AAAA,MACpB;AAAA,IACD,CAAC;AACD,UAAM,SACL,OAAO,iBAAiB,gBACrB,OACA,MAAM,YAAY;AAAA,MAClB,aAAa,OAAO;AAAA,MACpB,YAAQ,yBAAK,iBAAiB,MAAM;AAAA,MACpC,MAAM;AAAA,IACP,CAAC;AAEJ,WAAO;AAAA,MACN,iBAAiB,QAAQ,UAAU;AAAA,MACnC,sBAAkB,yBAAK,iBAAiB,mBAAmB;AAAA,MAC3D;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,OAAO,WAAkD;AACrE,UAAM,UAAU,KAAK,eAAe;AACpC,UAAM,SAAS,MAAM,KAAK;AAAA,MACzB,CAAC,UAAU,YAAY,YAAY,SAAS,QAAQ,OAAO;AAAA,MAC3D,UAAU;AAAA,MACV;AAAA,IACD;AACA,QAAI,OAAO,aAAa,GAAG;AAC1B,YAAM,IAAI,MAAM,0BAA0B,eAAe,OAAO,QAAQ,OAAO,MAAM,CAAC,EAAE;AAAA,IACzF;AAEA,UAAM,OAAO,MAAM,KAAK;AAAA,MACvB,CAAC,UAAU,SAAS,QAAQ,SAAS,QAAQ;AAAA,MAC7C,QAAQ;AAAA,MACR;AAAA,IACD;AACA,UAAM,WAAW,iBAAiB,KAAK,MAAM,KAAK,GAAG,QAAQ,OAAO;AACpE,UAAM,eAAe,qBAAqB,KAAK,MAAM,MAAK,oBAAI,KAAK,GAAE,YAAY;AACjF,SAAK,mBAAmB;AAExB,WAAO;AAAA,MACN;AAAA,MACA,SAAS,WAAW,QAAQ;AAAA,MAC5B,SAAS,SAAS,QAAQ;AAAA,IAC3B;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,SAAS,cAAqC;AAC1D,UAAM,UAAU,KAAK,eAAe;AACpC,UAAM,WAAW,MAAM,KAAK;AAAA,MAC3B,CAAC,YAAY,UAAU,cAAc,SAAS,QAAQ,OAAO;AAAA,MAC7D,QAAQ;AAAA,MACR;AAAA,IACD;AACA,QAAI,SAAS,aAAa,GAAG;AAC5B,YAAM,IAAI,MAAM,wBAAwB,eAAe,SAAS,QAAQ,SAAS,MAAM,CAAC,EAAE;AAAA,IAC3F;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAc,KAAK,SAA6C;AAC/D,UAAM,UAAU,KAAK,eAAe;AACpC,UAAM,OAAO,CAAC,QAAQ,SAAS,QAAQ,SAAS,WAAW;AAC3D,QAAI,OAAO,QAAQ,UAAU,YAAY,QAAQ,MAAM,SAAS,GAAG;AAClE,WAAK,KAAK,YAAY,QAAQ,KAAK;AAAA,IACpC;AACA,UAAM,SAAS,MAAM,KAAK,cAAc,MAAM,QAAQ,aAAa,KAAK;AACxE,QAAI,OAAO,aAAa,GAAG;AAC1B,YAAM,IAAI,MAAM,oBAAoB,eAAe,OAAO,QAAQ,OAAO,MAAM,CAAC,EAAE;AAAA,IACnF;AAEA,UAAM,QAAQ,OAAO,OAAO,MAAM,OAAO,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AAC3E,eAAW,QAAQ,OAAO;AACzB,YAAM;AAAA,QACL,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC,OAAOC,eAAc,IAAI;AAAA,QACzB,SAAS;AAAA,MACV;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,SAAoC;AAChD,UAAM,UAAU,KAAK,eAAe;AACpC,UAAM,SAAS,MAAM,KAAK;AAAA,MACzB,CAAC,UAAU,SAAS,QAAQ,SAAS,QAAQ;AAAA,MAC7C,QAAQ;AAAA,MACR;AAAA,IACD;AACA,QAAI,OAAO,aAAa,GAAG;AAC1B,aAAO;AAAA,QACN,OAAO;AAAA,QACP,SAAS,eAAe,OAAO,QAAQ,OAAO,MAAM;AAAA,MACrD;AAAA,IACD;AAEA,UAAM,WAAW,iBAAiB,OAAO,MAAM;AAC/C,WAAO;AAAA,MACN,OAAO;AAAA,MACP,SAAS;AAAA,MACT,SAAS,WAAW,WAAW,QAAQ,KAAK;AAAA,IAC7C;AAAA,EACD;AAAA,EAEA,MAAc,cACb,SACA,KACA,eAC4B;AAC5B,UAAM,YAAY,MAAM,KAAK,kBAAkB,GAAG;AAElD,QAAI,eAAe;AAClB,WAAK,OAAO,KAAK,OAAO,QAAQ,KAAK,GAAG,CAAC,EAAE;AAAA,IAC5C;AACA,WAAO,MAAM,KAAK,OAAO,IAAI,WAAW,SAAS,GAAG;AAAA,EACrD;AAAA,EAEQ,iBAAoC;AAC3C,QAAI,CAAC,KAAK,gBAAgB;AACzB,YAAM,IAAI,MAAM,gEAAgE;AAAA,IACjF;AACA,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,MAAc,kBAAkB,KAA8B;AAC7D,QAAI,KAAK,YAAY;AACpB,aAAO,KAAK;AAAA,IACb;AAEA,UAAM,WAAW,MAAM,KAAK,qBAAqB,GAAG;AACpD,QAAI,CAAC,UAAU;AACd,YAAM,IAAI,MAAM,iEAAiE;AAAA,IAClF;AACA,SAAK,aAAa;AAClB,WAAO;AAAA,EACR;AAAA,EAEA,MAAc,qBAAqB,KAAqC;AACvE,eAAW,WAAW,KAAK,mBAAmB;AAC7C,YAAM,eAAe,MAAM,KAAK,OAAO,IAAI,SAAS,CAAC,SAAS,GAAG,GAAG;AACpE,UAAI,aAAa,aAAa,GAAG;AAChC,eAAO;AAAA,MACR;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AACD;AAKO,IAAM,uBAAN,MAAuD;AAAA,EAC7D,MAAa,IAAI,SAAiB,MAAgB,KAAwC;AACzF,WAAO,MAAM,IAAI,QAA0B,CAACC,cAAY;AACvD,YAAM,YAAQ,kCAAM,SAAS,MAAM;AAAA,QAClC;AAAA,QACA,KAAK,QAAQ;AAAA,QACb,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,MACjC,CAAC;AAED,UAAI,SAAS;AACb,UAAI,SAAS;AACb,YAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB;AAC3C,kBAAU,MAAM,SAAS,OAAO;AAAA,MACjC,CAAC;AACD,YAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB;AAC3C,kBAAU,MAAM,SAAS,OAAO;AAAA,MACjC,CAAC;AACD,YAAM,GAAG,SAAS,CAAC,UAAU;AAC5B,QAAAA,UAAQ;AAAA,UACP,UAAU;AAAA,UACV;AAAA,UACA,QAAQ,GAAG,MAAM;AAAA,EAAK,MAAM,OAAO;AAAA,QACpC,CAAC;AAAA,MACF,CAAC;AACD,YAAM,GAAG,QAAQ,CAAC,SAAS;AAC1B,QAAAA,UAAQ;AAAA,UACP,UAAU,QAAQ;AAAA,UAClB,QAAQ,OAAO,KAAK;AAAA,UACpB,QAAQ,OAAO,KAAK;AAAA,QACrB,CAAC;AAAA,MACF,CAAC;AAAA,IACF,CAAC;AAAA,EACF;AACD;AAQA,IAAM,iCAAiC,CAAC,UAAU,KAAK;AAEvD,SAAS,iBAAiB,SAAgC;AACzD,QAAM,SAAS,gBAAgB,OAAO;AACtC,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAM,WAAW,OAAO;AACxB,MAAI,OAAO,aAAa,YAAY,SAAS,SAAS,GAAG;AACxD,WAAO;AAAA,EACR;AAEA,QAAM,YAAY,OAAO;AACzB,MAAI,MAAM,QAAQ,SAAS,GAAG;AAC7B,UAAM,QAAQ,UAAU,KAAK,CAAC,SAAS,OAAO,SAAS,QAAQ;AAC/D,QAAI,OAAO,UAAU,YAAY,MAAM,SAAS,GAAG;AAClD,aAAO;AAAA,IACR;AAAA,EACD;AAEA,SAAO;AACR;AAEA,SAAS,qBAAqB,SAAgC;AAC7D,QAAM,SAAS,gBAAgB,OAAO;AACtC,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAM,eAAe,OAAO;AAC5B,MAAI,OAAO,iBAAiB,YAAY,aAAa,SAAS,GAAG;AAChE,WAAO;AAAA,EACR;AAEA,QAAM,mBAAmB,OAAO;AAChC,MAAI,OAAO,qBAAqB,YAAY,qBAAqB,MAAM;AACtE,UAAM,KAAM,iBAA6C;AACzD,QAAI,OAAO,OAAO,YAAY,GAAG,SAAS,GAAG;AAC5C,aAAO;AAAA,IACR;AAAA,EACD;AAEA,SAAO;AACR;AAEA,SAAS,gBAAgB,OAA+C;AACvE,MAAI;AACH,UAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,QAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC5E,aAAO;AAAA,IACR;AACA,WAAO;AAAA,EACR,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AAEA,SAASD,eAAc,MAAgC;AACtD,QAAM,aAAa,KAAK,YAAY;AACpC,MAAI,WAAW,SAAS,OAAO,EAAG,QAAO;AACzC,MAAI,WAAW,SAAS,MAAM,EAAG,QAAO;AACxC,MAAI,WAAW,SAAS,OAAO,EAAG,QAAO;AACzC,SAAO;AACR;AAEA,SAAS,eAAe,QAAgB,QAAwB;AAC/D,MAAI,OAAO,SAAS,EAAG,QAAO;AAC9B,MAAI,OAAO,SAAS,EAAG,QAAO;AAC9B,SAAO;AACR;AAEA,SAAS,wBAAwB,QAAgB,QAAyB;AACzE,QAAM,OAAO,GAAG,MAAM;AAAA,EAAK,MAAM,GAAG,YAAY;AAChD,SAAO,KAAK,SAAS,gBAAgB,KAAK,KAAK,SAAS,oBAAoB;AAC7E;;;AEtaA,IAAAE,6BAAsB;AACtB,IAAAC,qBAAqB;;;ACDrB,IAAAC,oBAAiC;AACjC,IAAAC,qBAAqB;AAErB,IAAMC,oBAAmB;AAmClB,SAAS,oBAAoB,SAAqC;AACxE,QAAM,OAAwB;AAAA,IAC7B,SAAS;AAAA,IACT,OAAO;AAAA,MACN,SAAS;AAAA,MACT,gBAAgB;AAAA,IACjB;AAAA,IACA,QAAQ;AAAA,MACP,cAAc,QAAQ,gBAAgB;AAAA,MACtC,iBAAiB,QAAQ,mBAAmB;AAAA,MAC5C,mBAAmB;AAAA,MACnB,yBAAyB;AAAA,IAC1B;AAAA,IACA,UAAU;AAAA,MACT,aAAaA;AAAA,MACb,SAAS,QAAQ;AAAA,MACjB,QAAQ,QAAQ;AAAA,IACjB;AAAA,EACD;AAEA,SAAO,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA;AACxC;AAKA,eAAsB,yBACrB,iBACA,SACkB;AAClB,YAAM,yBAAM,iBAAiB,EAAE,WAAW,KAAK,CAAC;AAChD,QAAM,eAAW,yBAAK,iBAAiB,cAAc;AACrD,YAAM,6BAAU,UAAU,oBAAoB,OAAO,GAAG,OAAO;AAC/D,SAAO;AACR;;;ADjCO,IAAM,iBAAN,MAA0D;AAAA,EAChD,OAAO;AAAA,EAEN,SAAS,aAAa;AAAA,EACtB;AAAA,EACA;AAAA,EACT,iBAAgC;AAAA,EAChC;AAAA,EACA,mBAAkC;AAAA,EAEnC,YAAY,UAAiC,CAAC,GAAG;AACvD,SAAK,SAAS,QAAQ,UAAU,IAAI,yBAAyB;AAC7D,SAAK,oBAAoB,QAAQ,qBAAqB;AACtD,SAAK,iBAAiB,QAAQ,WAAW;AAAA,EAC1C;AAAA,EAEO,WAAW,SAAsC;AACvD,SAAK,iBAAiB;AAAA,EACvB;AAAA,EAEA,MAAa,SAA2B;AACvC,UAAM,UAAU,MAAM,KAAK,yBAAyB,QAAQ,IAAI,CAAC;AACjE,WAAO,YAAY;AAAA,EACpB;AAAA,EAEA,MAAa,UAAyB;AACrC,UAAM,YAAY,MAAM,KAAK,OAAO;AACpC,QAAI,CAAC,WAAW;AACf,YAAM,IAAI;AAAA,QACT;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAa,eAA8B;AAC1C,UAAM,cAAc,KAAK,gBAAgB,eAAe,QAAQ,IAAI;AACpE,UAAM,SAAS,MAAM,KAAK,kBAAkB,CAAC,QAAQ,GAAG,aAAa,KAAK;AAC1E,QAAI,OAAO,aAAa,EAAG;AAE3B,UAAM,QAAQ,MAAM,KAAK,kBAAkB,CAAC,OAAO,GAAG,aAAa,IAAI;AACvE,QAAI,MAAM,aAAa,GAAG;AACzB,YAAM,IAAI;AAAA,QACT,kCAAkCC,gBAAe,MAAM,QAAQ,MAAM,MAAM,CAAC;AAAA,MAC7E;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAa,UAAU,QAAiD;AACvE,SAAK,iBAAiB;AAAA,MACrB,aAAa,OAAO;AAAA,MACpB,SAAS,OAAO;AAAA,MAChB,QAAQ,OAAO;AAAA,IAChB;AAEA,UAAM,OAAO,MAAM,KAAK;AAAA,MACvB,CAAC,QAAQ,UAAU,OAAO,SAAS,WAAW;AAAA,MAC9C,OAAO;AAAA,MACP;AAAA,IACD;AACA,QAAI,KAAK,aAAa,KAAK,CAACC,yBAAwB,KAAK,QAAQ,KAAK,MAAM,GAAG;AAC9E,YAAM,IAAI;AAAA,QACT,4CAA4C,OAAO,OAAO,MAAMD,gBAAe,KAAK,QAAQ,KAAK,MAAM,CAAC;AAAA,MACzG;AAAA,IACD;AAEA,UAAM,OAAO,MAAM,KAAK;AAAA,MACvB,CAAC,QAAQ,aAAa,OAAO,SAAS,iBAAiB,OAAO,aAAa,OAAO;AAAA,MAClF,OAAO;AAAA,MACP;AAAA,IACD;AACA,QAAI,KAAK,aAAa,KAAK,CAACC,yBAAwB,KAAK,QAAQ,KAAK,MAAM,GAAG;AAC9E,YAAM,IAAI,MAAM,wBAAwBD,gBAAe,KAAK,QAAQ,KAAK,MAAM,CAAC,EAAE;AAAA,IACnF;AAEA,UAAM,OAAiB,CAAC;AACxB,UAAM,UAAU,MAAM,KAAK;AAAA,MAC1B,CAAC,aAAa,OAAO,aAAa,OAAO;AAAA,MACzC,OAAO;AAAA,MACP;AAAA,IACD;AACA,QAAI,QAAQ,aAAa,GAAG;AAC3B,WAAK,KAAK,MAAM;AAAA,IACjB;AAEA,WAAO;AAAA,MACN,eAAe,OAAO;AAAA,MACtB,YAAY;AAAA,MACZ,YAAY;AAAA,IACb;AAAA,EACD;AAAA,EAEA,MAAa,MAAM,QAAgD;AAClE,SAAK,iBAAiB;AAAA,MACrB,aAAa,OAAO;AAAA,MACpB,SAAS,OAAO;AAAA,MAChB,QAAQ,OAAO;AAAA,IAChB;AACA,UAAM,sBAAkB,yBAAK,OAAO,aAAa,SAAS,QAAQ;AAClE,UAAM,yBAAyB,iBAAiB;AAAA,MAC/C,SAAS,OAAO;AAAA,MAChB,aAAa,OAAO;AAAA,IACrB,CAAC;AAED,UAAM,aAAa;AAAA,MAClB,aAAa,OAAO;AAAA,MACpB;AAAA,IACD,CAAC;AACD,UAAM,SACL,OAAO,iBAAiB,gBACrB,OACA,MAAM,YAAY;AAAA,MAClB,aAAa,OAAO;AAAA,MACpB,YAAQ,yBAAK,iBAAiB,MAAM;AAAA,MACpC,MAAM;AAAA,IACP,CAAC;AAEJ,WAAO;AAAA,MACN,iBAAiB,QAAQ,UAAU;AAAA,MACnC,sBAAkB,yBAAK,iBAAiB,mBAAmB;AAAA,MAC3D;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAa,OAAO,WAAkD;AACrE,UAAM,UAAU,KAAK,eAAe;AACpC,UAAM,KAAK,MAAM,KAAK,kBAAkB,CAAC,MAAM,OAAO,GAAG,UAAU,iBAAiB,IAAI;AACxF,QAAI,GAAG,aAAa,GAAG;AACtB,YAAM,IAAI,MAAM,8BAA8BA,gBAAe,GAAG,QAAQ,GAAG,MAAM,CAAC,EAAE;AAAA,IACrF;AAEA,UAAM,SAAS,MAAM,KAAK,kBAAkB,CAAC,UAAU,QAAQ,GAAG,QAAQ,aAAa,KAAK;AAC5F,UAAM,eAAe,yBAAyB,OAAO,MAAM,MAAK,oBAAI,KAAK,GAAE,YAAY;AACvF,UAAM,UAAU,gBAAgB,OAAO,MAAM,KAAK,WAAW,QAAQ,OAAO;AAC5E,SAAK,mBAAmB;AAExB,WAAO;AAAA,MACN;AAAA,MACA;AAAA,MACA,SAAS,UAAU,OAAO;AAAA,IAC3B;AAAA,EACD;AAAA,EAEA,MAAa,SAAS,cAAqC;AAC1D,UAAM,UAAU,KAAK,eAAe;AACpC,UAAM,WAAW,MAAM,KAAK;AAAA,MAC3B,CAAC,YAAY,gBAAgB,cAAc,OAAO;AAAA,MAClD,QAAQ;AAAA,MACR;AAAA,IACD;AACA,QAAI,SAAS,aAAa,GAAG;AAC5B,YAAM,IAAI;AAAA,QACT,4BAA4BA,gBAAe,SAAS,QAAQ,SAAS,MAAM,CAAC;AAAA,MAC7E;AAAA,IACD;AAAA,EACD;AAAA,EAEA,OAAc,KAAK,SAA6C;AAC/D,UAAM,UAAU,KAAK,eAAe;AACpC,UAAM,OAAO,CAAC,MAAM;AACpB,QAAI,OAAO,QAAQ,SAAS,YAAY,QAAQ,OAAO,GAAG;AACzD,WAAK,KAAK,WAAW,OAAO,QAAQ,IAAI,CAAC;AAAA,IAC1C;AAEA,UAAM,SAAS,MAAM,KAAK,kBAAkB,MAAM,QAAQ,aAAa,KAAK;AAC5E,QAAI,OAAO,aAAa,GAAG;AAC1B,YAAM,IAAI,MAAM,wBAAwBA,gBAAe,OAAO,QAAQ,OAAO,MAAM,CAAC,EAAE;AAAA,IACvF;AAEA,UAAM,QAAQ,OAAO,OAAO,MAAM,OAAO,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AAC3E,eAAW,QAAQ,OAAO;AACzB,YAAM;AAAA,QACL,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC,OAAOE,eAAc,IAAI;AAAA,QACzB,SAAS;AAAA,MACV;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAa,SAAoC;AAChD,UAAM,UAAU,KAAK,eAAe;AACpC,UAAM,SAAS,MAAM,KAAK,kBAAkB,CAAC,UAAU,QAAQ,GAAG,QAAQ,aAAa,KAAK;AAC5F,QAAI,OAAO,aAAa,GAAG;AAC1B,aAAO;AAAA,QACN,OAAO;AAAA,QACP,SAASF,gBAAe,OAAO,QAAQ,OAAO,MAAM;AAAA,MACrD;AAAA,IACD;AAEA,UAAM,UAAU,gBAAgB,OAAO,MAAM;AAC7C,WAAO;AAAA,MACN,OAAO;AAAA,MACP,SAAS;AAAA,MACT,SAAS,WAAW;AAAA,IACrB;AAAA,EACD;AAAA,EAEA,MAAc,kBACb,aACA,KACA,eACgC;AAChC,UAAM,UAAU,MAAM,KAAK,sBAAsB,GAAG;AACpD,QAAI,eAAe;AAClB,WAAK,OAAO,KAAK,WAAW,YAAY,KAAK,GAAG,CAAC,EAAE;AAAA,IACpD;AACA,WAAO,MAAM,KAAK,OAAO,IAAI,SAAS,aAAa,GAAG;AAAA,EACvD;AAAA,EAEQ,iBAAwC;AAC/C,QAAI,CAAC,KAAK,gBAAgB;AACzB,YAAM,IAAI,MAAM,oEAAoE;AAAA,IACrF;AACA,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,MAAc,sBAAsB,KAA8B;AACjE,QAAI,KAAK,gBAAgB;AACxB,aAAO,KAAK;AAAA,IACb;AACA,UAAM,WAAW,MAAM,KAAK,yBAAyB,GAAG;AACxD,QAAI,CAAC,UAAU;AACd,YAAM,IAAI,MAAM,iEAAiE;AAAA,IAClF;AACA,SAAK,iBAAiB;AACtB,WAAO;AAAA,EACR;AAAA,EAEA,MAAc,yBAAyB,KAAqC;AAC3E,eAAW,WAAW,KAAK,mBAAmB;AAC7C,YAAM,UAAU,MAAM,KAAK,OAAO,IAAI,SAAS,CAAC,WAAW,GAAG,GAAG;AACjE,UAAI,QAAQ,aAAa,GAAG;AAC3B,eAAO;AAAA,MACR;AAAA,IACD;AACA,WAAO;AAAA,EACR;AACD;AAKO,IAAM,2BAAN,MAA+D;AAAA,EACrE,MAAa,IAAI,SAAiB,MAAgB,KAA4C;AAC7F,WAAO,MAAM,IAAI,QAA8B,CAACG,cAAY;AAC3D,YAAM,YAAQ,kCAAM,SAAS,MAAM;AAAA,QAClC;AAAA,QACA,KAAK,QAAQ;AAAA,QACb,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,MACjC,CAAC;AAED,UAAI,SAAS;AACb,UAAI,SAAS;AACb,YAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB;AAC3C,kBAAU,MAAM,SAAS,OAAO;AAAA,MACjC,CAAC;AACD,YAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB;AAC3C,kBAAU,MAAM,SAAS,OAAO;AAAA,MACjC,CAAC;AACD,YAAM,GAAG,SAAS,CAAC,UAAU;AAC5B,QAAAA,UAAQ;AAAA,UACP,UAAU;AAAA,UACV;AAAA,UACA,QAAQ,GAAG,MAAM;AAAA,EAAK,MAAM,OAAO;AAAA,QACpC,CAAC;AAAA,MACF,CAAC;AACD,YAAM,GAAG,QAAQ,CAAC,SAAS;AAC1B,QAAAA,UAAQ;AAAA,UACP,UAAU,QAAQ;AAAA,UAClB,QAAQ,OAAO,KAAK;AAAA,UACpB,QAAQ,OAAO,KAAK;AAAA,QACrB,CAAC;AAAA,MACF,CAAC;AAAA,IACF,CAAC;AAAA,EACF;AACD;AAQA,IAAM,qCAAqC,CAAC,SAAS;AAErD,SAAS,gBAAgB,SAAgC;AACxD,QAAM,SAASC,iBAAgB,OAAO;AACtC,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAM,MAAM,OAAO;AACnB,MAAI,OAAO,QAAQ,YAAY,IAAI,SAAS,GAAG;AAC9C,WAAO,eAAe,GAAG;AAAA,EAC1B;AAEA,QAAM,UAAU,OAAO;AACvB,MAAI,OAAO,YAAY,YAAY,YAAY,MAAM;AACpD,UAAM,SAAU,QAAoC;AACpD,QAAI,OAAO,WAAW,YAAY,OAAO,SAAS,GAAG;AACpD,aAAO,eAAe,MAAM;AAAA,IAC7B;AAAA,EACD;AAEA,SAAO;AACR;AAEA,SAAS,yBAAyB,SAAgC;AACjE,QAAM,SAASA,iBAAgB,OAAO;AACtC,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAM,eAAe,OAAO;AAC5B,MAAI,OAAO,iBAAiB,YAAY,aAAa,SAAS,GAAG;AAChE,WAAO;AAAA,EACR;AAEA,QAAM,aAAa,OAAO;AAC1B,MAAI,OAAO,eAAe,YAAY,eAAe,MAAM;AAC1D,UAAM,KAAM,WAAuC;AACnD,QAAI,OAAO,OAAO,YAAY,GAAG,SAAS,GAAG;AAC5C,aAAO;AAAA,IACR;AAAA,EACD;AAEA,SAAO;AACR;AAEA,SAASA,iBAAgB,OAA+C;AACvE,MAAI;AACH,UAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,QAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC5E,aAAO;AAAA,IACR;AACA,WAAO;AAAA,EACR,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AAEA,SAAS,UAAU,SAAgC;AAClD,MAAI;AACH,UAAM,MAAM,IAAI,IAAI,OAAO;AAC3B,QAAI,WAAW,IAAI,aAAa,WAAW,SAAS;AACpD,QAAI,WAAW;AACf,WAAO,IAAI,SAAS,EAAE,QAAQ,OAAO,EAAE;AAAA,EACxC,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AAEA,SAAS,eAAe,OAAuB;AAC9C,MAAI,MAAM,WAAW,SAAS,KAAK,MAAM,WAAW,UAAU,GAAG;AAChE,WAAO;AAAA,EACR;AACA,SAAO,WAAW,KAAK;AACxB;AAEA,SAASF,eAAc,MAAgC;AACtD,QAAM,aAAa,KAAK,YAAY;AACpC,MAAI,WAAW,SAAS,OAAO,EAAG,QAAO;AACzC,MAAI,WAAW,SAAS,MAAM,EAAG,QAAO;AACxC,MAAI,WAAW,SAAS,OAAO,EAAG,QAAO;AACzC,SAAO;AACR;AAEA,SAASF,gBAAe,QAAgB,QAAwB;AAC/D,MAAI,OAAO,SAAS,EAAG,QAAO;AAC9B,MAAI,OAAO,SAAS,EAAG,QAAO;AAC9B,SAAO;AACR;AAEA,SAASC,yBAAwB,QAAgB,QAAyB;AACzE,QAAM,OAAO,GAAG,MAAM;AAAA,EAAK,MAAM,GAAG,YAAY;AAChD,SAAO,KAAK,SAAS,gBAAgB;AACtC;;;AEzYO,IAAM,oBAAN,MAA6D;AAAA,EACnD;AAAA,EACC;AAAA,EAEV,YAAY,UAA0B;AAC5C,SAAK,OAAO;AACZ,SAAK,eAAe,mBAAmB,QAAQ;AAAA,EAChD;AAAA,EAEO,WAAW,UAIT;AAAA,EAET;AAAA,EAEA,MAAa,SAA2B;AACvC,WAAO;AAAA,EACR;AAAA,EAEA,MAAa,UAAyB;AACrC,UAAM,KAAK,oBAAoB;AAAA,EAChC;AAAA,EAEA,MAAa,eAA8B;AAC1C,UAAM,KAAK,oBAAoB;AAAA,EAChC;AAAA,EAEA,MAAa,UAAU,SAAkD;AACxE,UAAM,KAAK,oBAAoB;AAAA,EAChC;AAAA,EAEA,MAAa,MAAM,SAAiD;AACnE,UAAM,KAAK,oBAAoB;AAAA,EAChC;AAAA,EAEA,MAAa,OAAO,YAAmD;AACtE,UAAM,KAAK,oBAAoB;AAAA,EAChC;AAAA,EAEA,MAAa,SAAS,eAAsC;AAC3D,UAAM,KAAK,oBAAoB;AAAA,EAChC;AAAA,EAEO,KAAK,UAA8C;AACzD,UAAM,KAAK,oBAAoB;AAAA,EAChC;AAAA,EAEA,MAAa,SAAoC;AAChD,WAAO;AAAA,MACN,OAAO;AAAA,MACP,SAAS,KAAK,sBAAsB;AAAA,IACrC;AAAA,EACD;AAAA,EAEQ,sBAA6B;AACpC,WAAO,IAAI,MAAM,KAAK,sBAAsB,CAAC;AAAA,EAC9C;AAAA,EAEQ,wBAAgC;AACvC,WAAO,GAAG,KAAK,YAAY;AAAA,EAC5B;AACD;;;ACtEO,SAAS,oBAAoB,UAAyC;AAC5E,UAAQ,UAAU;AAAA,IACjB,KAAK;AACJ,aAAO,IAAI,WAAW;AAAA,IACvB,KAAK;AACJ,aAAO,IAAI,eAAe;AAAA,IAC3B,KAAK;AACJ,aAAO,IAAI,cAAc;AAAA,IAC1B,KAAK;AACJ,aAAO,IAAI,oBAAoB;AAAA,IAChC,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACJ,aAAO,IAAI,kBAAkB,QAAQ;AAAA,IACtC,SAAS;AACR,YAAM,kBAAyB;AAC/B,aAAO;AAAA,IACR;AAAA,EACD;AACD;;;AC7BA,IAAAI,oBAAiC;AACjC,IAAAC,qBAAqB;AAErB,IAAMC,oBAAmB;AAsBlB,SAAS,mBAAmB,UAA6B,CAAC,GAAW;AAC3E,QAAM,cAAc,QAAQ,eAAe;AAC3C,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,kBAAkB,QAAQ,oBAAoB,SAAY,SAAS,QAAQ;AACjF,QAAM,mBAAmB,QAAQ,oBAAoB;AACrD,QAAM,gBACL,QAAQ,sBAAsB,OAAO,KAAK,QAAQ,kBAAkB,EAAE,SAAS;AAEhF,QAAM,QAAkB;AAAA,IACvBA;AAAA,IACA;AAAA,IACA,aAAa,WAAW;AAAA,IACxB;AAAA,IACA;AAAA,IACA,YAAY,OAAO,IAAI,CAAC;AAAA,IACxB;AAAA,EACD;AAEA,MAAI,eAAe;AAElB,UAAM,KAAK,0CAA0C;AACrD,UAAM,KAAK,yCAAyC;AACpD,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,kCAAkC;AAC7C,UAAM,KAAK,4BAA4B;AACvC,UAAM,KAAK,EAAE;AAAA,EACd;AAEA,MAAI,oBAAoB,MAAM;AAC7B,UAAM,KAAK,QAAQ,eAAe,SAAS;AAAA,EAC5C;AACA,QAAM,KAAK,QAAQ,gBAAgB,sBAAsB;AACzD,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,UAAU,OAAO,IAAI,CAAC,EAAE;AACnC,QAAM,KAAK,qCAAqC;AAChD,QAAM,KAAK,EAAE;AAEb,SAAO,MAAM,KAAK,IAAI;AACvB;AAKO,SAAS,0BAA0B,oBAAoD;AAC7F,QAAM,MAAM;AAAA,IACX,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,MAAM;AAAA,IACN,cAAc;AAAA,EACf;AACA,SAAO,GAAG,KAAK,UAAU,KAAK,MAAM,CAAC,CAAC;AAAA;AACvC;AAKO,SAAS,uBAA+B;AAC9C,SAAO;AAAA,IACNA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,EAAE,KAAK,IAAI;AACZ;AAKA,eAAsB,wBACrB,iBACA,UAA6B,CAAC,GACZ;AAClB,YAAM,yBAAM,iBAAiB,EAAE,WAAW,KAAK,CAAC;AAChD,QAAM,qBAAiB,yBAAK,iBAAiB,YAAY;AACzD,YAAM,6BAAU,gBAAgB,mBAAmB,OAAO,GAAG,OAAO;AAEpE,MAAI,QAAQ,sBAAsB,OAAO,KAAK,QAAQ,kBAAkB,EAAE,SAAS,GAAG;AACrF,UAAM,kBAAc,yBAAK,iBAAiB,cAAc;AACxD,cAAM,6BAAU,aAAa,0BAA0B,QAAQ,kBAAkB,GAAG,OAAO;AAAA,EAC5F;AAEA,SAAO;AACR;AAKA,eAAsB,0BAA0B,iBAA0C;AACzF,YAAM,yBAAM,iBAAiB,EAAE,WAAW,KAAK,CAAC;AAChD,QAAM,uBAAmB,yBAAK,iBAAiB,eAAe;AAC9D,YAAM,6BAAU,kBAAkB,qBAAqB,GAAG,OAAO;AACjE,SAAO;AACR;;;ACjIA,IAAAC,oBAA+C;AAC/C,IAAAC,qBAAqB;AAIrB,IAAM,4BAAwB,yBAAK,SAAS,QAAQ;AACpD,IAAM,wBAAwB;AAiDvB,SAAS,uBAAuB,aAA6B;AACnE,aAAO,yBAAK,aAAa,qBAAqB;AAC/C;AAKO,SAAS,uBAAuB,aAA6B;AACnE,aAAO,yBAAK,uBAAuB,WAAW,GAAG,qBAAqB;AACvE;AAMA,eAAsB,gBAAgB,aAAkD;AACvF,QAAM,YAAY,uBAAuB,WAAW;AAEpD,MAAI;AACH,UAAM,SAAS,UAAM,4BAAS,WAAW,OAAO;AAChD,UAAM,SAAS,KAAK,MAAM,MAAM;AAChC,WAAO,iBAAiB,MAAM;AAAA,EAC/B,SAAS,OAAO;AACf,UAAM,OAAQ,MAAgC;AAC9C,QAAI,SAAS,SAAU,QAAO;AAC9B,UAAM;AAAA,EACP;AACD;AAKA,eAAsB,iBACrB,aACA,OACA,MAAM,oBAAI,KAAK,GACQ;AACvB,QAAM,YAAY,IAAI,YAAY;AAClC,QAAM,QAAqB;AAAA,IAC1B,UAAU,MAAM;AAAA,IAChB,SAAS,MAAM;AAAA,IACf,QAAQ,MAAM;AAAA,IACd,aAAa,MAAM;AAAA,IACnB,SAAS,MAAM,WAAW;AAAA,IAC1B,SAAS,MAAM,WAAW;AAAA,IAC1B,YAAY,MAAM,cAAc;AAAA,IAChC,kBAAkB,MAAM,oBAAoB;AAAA,IAC5C,WAAW;AAAA,IACX,WAAW;AAAA,EACZ;AAEA,QAAM,mBAAmB,aAAa,KAAK;AAC3C,SAAO;AACR;AAMA,eAAsB,kBACrB,aACA,OACA,MAAM,oBAAI,KAAK,GACQ;AACvB,QAAM,WAAW,MAAM,gBAAgB,WAAW;AAClD,MAAI,CAAC,UAAU;AACd,UAAM,IAAI,MAAM,oEAAoE;AAAA,EACrF;AAEA,QAAM,YAAyB;AAAA,IAC9B,UAAU,MAAM,YAAY,SAAS;AAAA,IACrC,SAAS,MAAM,WAAW,SAAS;AAAA,IACnC,QAAQ,MAAM,WAAW,SAAY,SAAS,SAAS,MAAM;AAAA,IAC7D,aAAa,MAAM,eAAe,SAAS;AAAA,IAC3C,SAAS,MAAM,YAAY,SAAY,SAAS,UAAU,MAAM;AAAA,IAChE,SAAS,MAAM,YAAY,SAAY,SAAS,UAAU,MAAM;AAAA,IAChE,YAAY,MAAM,eAAe,SAAY,SAAS,aAAa,MAAM;AAAA,IACzE,kBACC,MAAM,qBAAqB,SAAY,SAAS,mBAAmB,MAAM;AAAA,IAC1E,WAAW,SAAS;AAAA,IACpB,WAAW,IAAI,YAAY;AAAA,EAC5B;AAEA,QAAM,mBAAmB,aAAa,SAAS;AAC/C,SAAO;AACR;AAKA,eAAsB,iBAAiB,aAAoC;AAC1E,YAAM,sBAAG,uBAAuB,WAAW,GAAG,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAC/E;AAEA,eAAe,mBAAmB,aAAqB,OAAmC;AACzF,QAAM,YAAY,uBAAuB,WAAW;AACpD,QAAM,YAAY,uBAAuB,WAAW;AACpD,YAAM,yBAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAC1C,YAAM,6BAAU,WAAW,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,GAAM,OAAO;AAC1E;AAEA,SAAS,iBAAiB,OAA6B;AACtD,MAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GAAG;AACxE,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC5D;AAEA,QAAM,SAAS;AAEf,QAAM,WAAW,aAAa,OAAO,QAAQ;AAC7C,QAAM,UAAU,WAAW,OAAO,SAAS,SAAS;AACpD,QAAM,SAAS,mBAAmB,OAAO,QAAQ,QAAQ;AACzD,QAAM,cAAc,WAAW,OAAO,aAAa,aAAa;AAChE,QAAM,UAAU,mBAAmB,OAAO,SAAS,SAAS;AAC5D,QAAM,UAAU,mBAAmB,OAAO,SAAS,SAAS;AAC5D,QAAM,aAAa,mBAAmB,OAAO,YAAY,YAAY;AACrE,QAAM,mBAAmB,mBAAmB,OAAO,kBAAkB,kBAAkB;AACvF,QAAM,YAAY,WAAW,OAAO,WAAW,WAAW;AAC1D,QAAM,YAAY,WAAW,OAAO,WAAW,WAAW;AAE1D,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;AAEA,SAAS,aAAa,OAAgC;AACrD,MAAI,OAAO,UAAU,YAAY,CAAC,iBAAiB,KAAK,GAAG;AAC1D,UAAM,IAAI,MAAM,gEAAgE;AAAA,EACjF;AACA,SAAO;AACR;AAEA,SAAS,WAAW,OAAgB,OAAuB;AAC1D,MAAI,OAAO,UAAU,YAAY,MAAM,WAAW,GAAG;AACpD,UAAM,IAAI,MAAM,0BAA0B,KAAK,+BAA+B;AAAA,EAC/E;AACA,SAAO;AACR;AAEA,SAAS,mBAAmB,OAAgB,OAA8B;AACzE,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,IAAI,MAAM,0BAA0B,KAAK,6BAA6B;AAC7E;;;Ab1KO,IAAM,oBAAgB,6BAAc;AAAA,EAC1C,MAAM;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,EACd;AAAA,EACA,MAAM;AAAA,IACL,UAAU;AAAA,MACT,MAAM;AAAA,MACN,aAAa,wBAAwB,iBAAiB,KAAK,IAAI,CAAC;AAAA,IACjE;AAAA,IACA,KAAK;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,IACd;AAAA,IACA,QAAQ;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IACd;AAAA,IACA,MAAM;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACV;AAAA,IACA,SAAS;AAAA,MACR,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACV;AAAA,IACA,OAAO;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACV;AAAA,EACD;AAAA,EACA,aAAa;AAAA,IACZ,YAAQ,6BAAc;AAAA,MACrB,MAAM;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,MACd;AAAA,MACA,MAAM,MAAM;AACX,cAAM,SAAS,aAAa;AAC5B,cAAM,cAAc,MAAM,mBAAmB;AAC7C,cAAM,QAAQ,MAAM,gBAAgB,WAAW;AAC/C,YAAI,CAAC,OAAO;AACX,iBAAO,KAAK,qDAAqD;AACjE;AAAA,QACD;AAEA,eAAO,OAAO;AACd,eAAO,KAAK,aAAa,MAAM,QAAQ,EAAE;AACzC,eAAO,KAAK,QAAQ,MAAM,OAAO,EAAE;AACnC,eAAO,KAAK,WAAW,MAAM,UAAU,KAAK,EAAE;AAC9C,eAAO,KAAK,oBAAoB,MAAM,oBAAoB,KAAK,EAAE;AAEjE,cAAM,UAAU,oBAAoB,MAAM,QAAQ;AAClD,gCAAwB,SAAS;AAAA,UAChC;AAAA,UACA,SAAS,MAAM;AAAA,UACf,QAAQ,MAAM;AAAA,QACf,CAAC;AACD,cAAM,gBAAgB,MAAM,QAAQ,OAAO;AAC3C,eAAO,KAAK,WAAW,cAAc,KAAK,EAAE;AAC5C,eAAO,KAAK,YAAY,cAAc,OAAO,EAAE;AAC/C,eAAO,KAAK,aAAa,cAAc,WAAW,MAAM,WAAW,KAAK,EAAE;AAC1E,eAAO,KAAK,aAAa,MAAM,WAAW,KAAK,EAAE;AAAA,MAClD;AAAA,IACD,CAAC;AAAA,IACD,cAAU,6BAAc;AAAA,MACvB,MAAM;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,MACd;AAAA,MACA,MAAM;AAAA,QACL,IAAI;AAAA,UACH,MAAM;AAAA,UACN,aAAa;AAAA,UACb,UAAU;AAAA,QACX;AAAA,MACD;AAAA,MACA,MAAM,IAAI,EAAE,KAAK,GAAG;AACnB,cAAM,SAAS,aAAa;AAC5B,cAAM,cAAc,MAAM,mBAAmB;AAC7C,cAAM,QAAQ,MAAM,gBAAgB,WAAW;AAC/C,YAAI,CAAC,OAAO;AACX,iBAAO,KAAK,qDAAqD;AACjE;AAAA,QACD;AAEA,cAAM,UAAU,oBAAoB,MAAM,QAAQ;AAClD,gCAAwB,SAAS;AAAA,UAChC;AAAA,UACA,SAAS,MAAM;AAAA,UACf,QAAQ,MAAM;AAAA,QACf,CAAC;AACD,cAAM,eACL,OAAO,KAAK,OAAO,YAAY,KAAK,GAAG,SAAS,IAC7C,KAAK,KACJ,MAAM,oBAAoB;AAC/B,cAAM,QAAQ,SAAS,YAAY;AACnC,eAAO,QAAQ,eAAe,MAAM,QAAQ,kBAAkB,YAAY,GAAG;AAAA,MAC9E;AAAA,IACD,CAAC;AAAA,IACD,UAAM,6BAAc;AAAA,MACnB,MAAM;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,MACd;AAAA,MACA,MAAM,MAAM;AACX,cAAM,SAAS,aAAa;AAC5B,cAAM,cAAc,MAAM,mBAAmB;AAC7C,cAAM,QAAQ,MAAM,gBAAgB,WAAW;AAC/C,YAAI,CAAC,OAAO;AACX,iBAAO,KAAK,qDAAqD;AACjE;AAAA,QACD;AAEA,cAAM,UAAU,oBAAoB,MAAM,QAAQ;AAClD,gCAAwB,SAAS;AAAA,UAChC;AAAA,UACA,SAAS,MAAM;AAAA,UACf,QAAQ,MAAM;AAAA,QACf,CAAC;AACD,cAAM,WAAW,QAAQ,KAAK,EAAE,MAAM,IAAI,CAAC;AAC3C,YAAI,WAAW;AACf,yBAAiB,QAAQ,UAAU;AAClC,qBAAW;AACX,iBAAO,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,OAAO,EAAE;AAAA,QAC9C;AACA,YAAI,CAAC,UAAU;AACd,iBAAO,KAAK,yBAAyB,MAAM,QAAQ,GAAG;AAAA,QACvD;AAAA,MACD;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EACA,MAAM,IAAI,EAAE,MAAM,QAAQ,GAAG;AAG5B,UAAM,kBAAkB,CAAC,UAAU,YAAY,MAAM;AACrD,QAAI,QAAQ,KAAK,CAAC,QAAQ,gBAAgB,SAAS,GAAG,CAAC,GAAG;AACzD;AAAA,IACD;AAEA,UAAM,SAAS,aAAa;AAC5B,UAAM,UAAU,mBAAmB;AACnC,UAAM,cAAc,MAAM,mBAAmB;AAE7C,QAAI,KAAK,UAAU,MAAM;AACxB,YAAM,iBAAiB,WAAW;AAClC,aAAO,QAAQ,2BAA2B;AAC1C;AAAA,IACD;AAEA,UAAM,gBAAgB,MAAM,gBAAgB,WAAW;AACvD,UAAM,cAAc,KAAK,YAAY;AACrC,UAAM,WAAW,MAAM,gBAAgB;AAAA,MACtC,cAAc;AAAA,MACd,aAAa,KAAK;AAAA,MAClB,gBAAgB,eAAe;AAAA,MAC/B,SAAS;AAAA,IACV,CAAC;AACD,UAAM,UAAU,eAAe,KAAK,KAAK,eAAe,SAAS,aAAa,WAAW;AACzF,UAAM,SAAS,cAAc,KAAK,QAAQ,eAAe,QAAQ,WAAW;AAC5E,UAAM,kBAAkB,uBAAuB,WAAW;AAC1D,UAAM,cAAc,KAAK,SAAS,OAAO,eAAe;AACxD,UAAM,eAAe,mBAAmB,WAAW;AACnD,UAAM,SAAwB;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT;AAAA,IACD;AACA,UAAM,UAAU,oBAAoB,QAAQ;AAC5C,4BAAwB,SAAS;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,IACD,CAAC;AAED,WAAO,OAAO;AACd,WAAO;AAAA,MACN,gBAAgB,QAAQ,KAAK,OAAO,GAAG,SAAS,KAAK,MAAM,KAAK,EAAE,KAAK,WAAW;AAAA,IACnF;AACA,QAAI,iBAAiB,eAAe;AACnC,aAAO,KAAK,yDAAyD;AAAA,IACtE;AACA,QAAI,aAAa;AAChB,aAAO,KAAK,yDAAyD;AAAA,IACtE;AAEA,UAAM,wBAAwB,iBAAiB;AAAA,MAC9C,iBAAiB,iBAAiB,gBAAgB,OAAO;AAAA,MACzD,oBAAoB;AAAA,QACnB,kBAAkB;AAAA,QAClB,eAAe;AAAA,QACf,UAAU;AAAA,MACX;AAAA,IACD,CAAC;AACD,UAAM,0BAA0B,eAAe;AAC/C,UAAM,WAAW,MAAM,QAAQ,OAAO;AACtC,QAAI,CAAC,UAAU;AACd,YAAM,QAAQ,QAAQ;AAAA,IACvB;AACA,UAAM,QAAQ,aAAa;AAC3B,UAAM,kBAAkB,MAAM,QAAQ,UAAU,MAAM;AACtD,UAAM,YAAY,MAAM,QAAQ,MAAM,MAAM;AAC5C,UAAM,eAAe,MAAM,QAAQ,OAAO,SAAS;AAEnD,QAAI,eAAe;AAClB,YAAM,kBAAkB,aAAa;AAAA,QACpC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,aAAa;AAAA,QACtB,SAAS,aAAa;AAAA,QACtB,YAAY,gBAAgB;AAAA,QAC5B,kBAAkB,aAAa;AAAA,MAChC,CAAC;AAAA,IACF,OAAO;AACN,YAAM,iBAAiB,aAAa;AAAA,QACnC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,aAAa;AAAA,QACtB,SAAS,aAAa;AAAA,QACtB,YAAY,gBAAgB;AAAA,QAC5B,kBAAkB,aAAa;AAAA,MAChC,CAAC;AAAA,IACF;AAEA,WAAO,QAAQ,yBAAyB,aAAa,OAAO,EAAE;AAC9D,QAAI,aAAa,SAAS;AACzB,aAAO,KAAK,kBAAkB,aAAa,OAAO,EAAE;AAAA,IACrD;AAAA,EACD;AACD,CAAC;AASD,eAAe,gBAAgB,SAA0D;AACxF,MAAI,OAAO,QAAQ,gBAAgB,UAAU;AAC5C,QAAI,CAAC,iBAAiB,QAAQ,WAAW,GAAG;AAC3C,YAAM,IAAI;AAAA,QACT,6BAA6B,QAAQ,WAAW,qBAAqB,iBAAiB,KAAK,IAAI,CAAC;AAAA,MACjG;AAAA,IACD;AACA,WAAO,QAAQ;AAAA,EAChB;AAEA,MAAI,QAAQ,gBAAgB;AAC3B,WAAO,QAAQ;AAAA,EAChB;AAEA,MAAI,QAAQ,WAAW,CAAC,sBAAsB,GAAG;AAChD,UAAM,IAAI;AAAA,MACT;AAAA,IACD;AAAA,EACD;AAEA,SAAO,MAAM,QAAQ,aAAa,OAAO,gCAAgC;AAAA,IACxE;AAAA,MACC,OAAO;AAAA,MACP,OAAO;AAAA,IACR;AAAA,IACA;AAAA,MACC,OAAO;AAAA,MACP,OAAO;AAAA,IACR;AAAA,IACA;AAAA,MACC,OAAO;AAAA,MACP,OAAO;AAAA,IACR;AAAA,IACA;AAAA,MACC,OAAO;AAAA,MACP,OAAO;AAAA,IACR;AAAA,IACA;AAAA,MACC,OAAO;AAAA,MACP,OAAO;AAAA,IACR;AAAA,IACA;AAAA,MACC,OAAO;AAAA,MACP,OAAO;AAAA,IACR;AAAA,IACA;AAAA,MACC,OAAO;AAAA,MACP,OAAO;AAAA,IACR;AAAA,EACD,CAAC;AACF;AAEA,SAAS,eACR,UACA,aACA,aACA,SACS;AACT,MAAI,OAAO,aAAa,YAAY,SAAS,SAAS,GAAG;AACxD,WAAO,gBAAgB,QAAQ;AAAA,EAChC;AAEA,MAAI,eAAe,YAAY,SAAS,GAAG;AAC1C,WAAO;AAAA,EACR;AAEA,MAAI,SAAS;AACZ,UAAM,IAAI;AAAA,MACT;AAAA,IACD;AAAA,EACD;AAEA,SAAO,oBAAgB,6BAAS,WAAW,CAAC;AAC7C;AAEA,SAAS,cACR,UACA,aACA,SACgB;AAChB,MAAI,OAAO,aAAa,YAAY,SAAS,SAAS,EAAG,QAAO;AAChE,MAAI,gBAAgB,OAAW,QAAO;AACtC,MAAI,SAAS;AACZ,UAAM,IAAI;AAAA,MACT;AAAA,IACD;AAAA,EACD;AACA,SAAO;AACR;AAEA,SAAS,gBAAgB,OAAuB;AAC/C,QAAM,aAAa,MACjB,YAAY,EACZ,QAAQ,gBAAgB,GAAG,EAC3B,QAAQ,UAAU,GAAG,EACrB,QAAQ,UAAU,EAAE;AAEtB,MAAI,WAAW,WAAW,GAAG;AAC5B,WAAO;AAAA,EACR;AACA,SAAO;AACR;AAEA,eAAe,qBAAsC;AACpD,QAAM,cAAc,MAAM,gBAAgB;AAC1C,MAAI,CAAC,aAAa;AACjB,UAAM,IAAI,oBAAoB,QAAQ,IAAI,CAAC;AAAA,EAC5C;AACA,SAAO;AACR;AAEA,SAAS,wBAAiC;AACzC,SAAO,QAAQ,MAAM,UAAU,QAAQ,QAAQ,OAAO,UAAU;AACjE;AAEA,SAAS,wBACR,SACA,SACO;AACP,MAAI,iBAAiB,OAAO,GAAG;AAC9B,YAAQ,WAAW,OAAO;AAAA,EAC3B;AACD;AAEA,SAAS,mBAAmB,aAAoD;AAC/E,aAAO,gCAAW,yBAAK,aAAa,WAAW,CAAC,IAAI,gBAAgB;AACrE;AAEA,SAAS,iBAAiB,SAA8D;AACvF,SAAO,OAAQ,QAAsC,eAAe;AACrE;;;Ac9ZA,IAAAC,oBAAuB;AACvB,IAAAC,qBAAqB;AACrB,IAAAA,qBAAwB;AACxB,IAAAC,gBAA8B;;;ACH9B,IAAAC,8BAAoC;AAsB7B,IAAM,iBAAN,MAAqB;AAAA,EACV,YAAY,oBAAI,IAA4B;AAAA,EAE7D,MAAM,QAAoC;AACzC,UAAM,UAAwB;AAAA,MAC7B,KAAK,OAAO;AAAA,MACZ,KAAK,EAAE,GAAG,QAAQ,KAAK,GAAG,OAAO,IAAI;AAAA,MACrC,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,IACjC;AAEA,UAAM,YAAQ,4BAAAC,OAAW,OAAO,SAAS,OAAO,MAAM,OAAO;AAC7D,QAAI;AAEJ,UAAM,iBAAiC;AAAA,MACtC;AAAA,MACA,aAAa,IAAI,QAAc,CAACC,cAAY;AAC3C,sBAAcA;AAAA,MACf,CAAC;AAAA,MACD,cAAc;AAAA,MACd,cAAc;AAAA,IACf;AAEA,SAAK,UAAU,IAAI,OAAO,OAAO,cAAc;AAE/C,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB;AAC3C,qBAAe,eAAe,KAAK;AAAA,QAClC,OAAO;AAAA,QACP,eAAe;AAAA,QACf;AAAA,QACA;AAAA,MACD;AAAA,IACD,CAAC;AAED,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB;AAC3C,qBAAe,eAAe,KAAK;AAAA,QAClC,OAAO;AAAA,QACP,eAAe;AAAA,QACf;AAAA,QACA;AAAA,MACD;AAAA,IACD,CAAC;AAED,UAAM,GAAG,QAAQ,CAAC,MAAM,WAAW;AAClC,WAAK,YAAY,OAAO,OAAO,eAAe,cAAc,KAAK;AACjE,WAAK,YAAY,OAAO,OAAO,eAAe,cAAc,IAAI;AAChE,WAAK,UAAU,OAAO,OAAO,KAAK;AAClC,aAAO,SAAS,MAAM,MAAM;AAC5B,oBAAc;AAAA,IACf,CAAC;AAAA,EACF;AAAA,EAEA,aAAsB;AACrB,WAAO,KAAK,UAAU,OAAO;AAAA,EAC9B;AAAA,EAEA,MAAM,cAA6B;AAClC,UAAM,UAAU,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC;AAClD,QAAI,QAAQ,WAAW,EAAG;AAE1B,eAAW,gBAAgB,SAAS;AACnC,mBAAa,MAAM,KAAK,SAAS;AAAA,IAClC;AAEA,UAAM,QAAQ,KAAK,CAAC,QAAQ,IAAI,QAAQ,IAAI,CAAC,UAAU,MAAM,WAAW,CAAC,GAAG,MAAM,GAAI,CAAC,CAAC;AAExF,UAAM,YAAY,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC;AACpD,QAAI,UAAU,WAAW,EAAG;AAE5B,eAAW,gBAAgB,WAAW;AACrC,mBAAa,MAAM,KAAK,SAAS;AAAA,IAClC;AAEA,UAAM,QAAQ,IAAI,UAAU,IAAI,CAAC,UAAU,MAAM,WAAW,CAAC;AAAA,EAC9D;AAAA,EAEQ,WAAW,OAAe,QAAgB,OAAe,SAA0B;AAC1F,UAAM,WAAW,GAAG,MAAM,GAAG,MAAM,SAAS,OAAO,CAAC;AACpD,UAAM,QAAQ,SAAS,MAAM,OAAO;AACpC,UAAM,YAAY,MAAM,IAAI,KAAK;AAEjC,eAAW,QAAQ,OAAO;AACzB,WAAK,UAAU,OAAO,MAAM,OAAO;AAAA,IACpC;AAEA,WAAO;AAAA,EACR;AAAA,EAEQ,YAAY,OAAe,QAAgB,SAAwB;AAC1E,QAAI,CAAC,OAAQ;AACb,SAAK,UAAU,OAAO,QAAQ,OAAO;AAAA,EACtC;AAAA,EAEQ,UAAU,OAAe,MAAc,SAAwB;AACtE,UAAM,SAAS,UAAU,QAAQ,SAAS,QAAQ;AAClD,WAAO,MAAM,IAAI,KAAK,KAAK,IAAI;AAAA,CAAI;AAAA,EACpC;AACD;AAEA,SAAS,MAAM,IAA2B;AACzC,SAAO,IAAI,QAAQ,CAACA,cAAY;AAC/B,eAAWA,WAAS,EAAE;AAAA,EACvB,CAAC;AACF;;;AC5HA,IAAAC,8BAAsB;AACtB,IAAAC,kBAAsB;AAEtB,IAAAC,qBAAqB;AAcd,IAAM,gBAAN,MAAoB;AAAA,EAK1B,YAA6B,QAA6B;AAA7B;AAC5B,SAAK,aAAa,OAAO,cAAc;AAAA,EACxC;AAAA,EAF6B;AAAA,EAJZ;AAAA,EACT,UAA4B;AAAA,EAC5B,gBAAuC;AAAA,EAM/C,QAAc;AACb,QAAI,KAAK,QAAS;AAElB,SAAK,cAAU,uBAAM,KAAK,OAAO,YAAY,MAAM;AAClD,WAAK,qBAAqB;AAAA,IAC3B,CAAC;AAED,SAAK,QAAQ,GAAG,SAAS,CAAC,UAAU;AACnC,WAAK,OAAO,UAAU,QAAQ,KAAK,CAAC;AAAA,IACrC,CAAC;AAAA,EACF;AAAA,EAEA,OAAa;AACZ,QAAI,KAAK,eAAe;AACvB,mBAAa,KAAK,aAAa;AAC/B,WAAK,gBAAgB;AAAA,IACtB;AAEA,SAAK,SAAS,MAAM;AACpB,SAAK,UAAU;AAAA,EAChB;AAAA,EAEA,MAAM,aAA4B;AAGjC,UAAM,gBAAY;AAAA,MACjB,KAAK,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AACA,UAAM,SAAS,MAAM,gBAAgB,KAAK,OAAO,WAAW;AAE5D,UAAM,UAAU,QAAQ;AACxB,UAAM,OAAO,SACV,CAAC,YAAY,OAAO,WAAW,YAAY,SAAS,YAAY,KAAK,OAAO,UAAU,IACtF,CAAC,WAAW,YAAY,SAAS,YAAY,KAAK,OAAO,UAAU;AAEtE,UAAM,aAAa,SAAS,MAAM,KAAK,OAAO,WAAW;AACzD,SAAK,OAAO,eAAe;AAAA,EAC5B;AAAA,EAEQ,uBAA6B;AACpC,QAAI,KAAK,eAAe;AACvB,mBAAa,KAAK,aAAa;AAAA,IAChC;AAEA,SAAK,gBAAgB,WAAW,MAAM;AACrC,WAAK,gBAAgB;AACrB,WAAK,KAAK,WAAW,EAAE,MAAM,CAAC,UAAU;AACvC,aAAK,OAAO,UAAU,QAAQ,KAAK,CAAC;AAAA,MACrC,CAAC;AAAA,IACF,GAAG,KAAK,UAAU;AAAA,EACnB;AACD;AAEA,eAAe,aAAa,SAAiB,MAAgB,KAA4B;AACxF,QAAM,IAAI,QAAc,CAACC,WAAS,WAAW;AAC5C,UAAM,YAAQ,mCAAM,SAAS,MAAM;AAAA,MAClC;AAAA,MACA,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,MAChC,KAAK,QAAQ;AAAA,IACd,CAAC;AAED,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB;AAC3C,yBAAmB,OAAO,KAAK;AAAA,IAChC,CAAC;AAED,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB;AAC3C,yBAAmB,OAAO,IAAI;AAAA,IAC/B,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,UAAU;AAC5B,aAAO,KAAK;AAAA,IACb,CAAC;AAED,UAAM,GAAG,QAAQ,CAAC,SAAS;AAC1B,UAAI,SAAS,GAAG;AACf,QAAAA,UAAQ;AACR;AAAA,MACD;AACA,aAAO,IAAI,MAAM,oCAAoC,QAAQ,SAAS,GAAG,CAAC;AAAA,IAC3E,CAAC;AAAA,EACF,CAAC;AACF;AAEA,SAAS,mBAAmB,OAAe,SAAwB;AAClE,QAAM,OAAO,MAAM,SAAS,OAAO;AACnC,QAAM,QAAQ,KAAK,MAAM,OAAO,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AAClE,QAAM,SAAS,UAAU,QAAQ,SAAS,QAAQ;AAElD,aAAW,QAAQ,OAAO;AACzB,WAAO,MAAM,UAAU,IAAI;AAAA,CAAI;AAAA,EAChC;AACD;AAEA,SAAS,QAAQ,OAAuB;AACvC,MAAI,iBAAiB,MAAO,QAAO;AACnC,SAAO,IAAI,MAAM,OAAO,KAAK,CAAC;AAC/B;;;AFrGO,IAAM,iBAAa,6BAAc;AAAA,EACvC,MAAM;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,EACd;AAAA,EACA,MAAM;AAAA,IACL,MAAM;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,IACd;AAAA,IACA,aAAa;AAAA,MACZ,MAAM;AAAA,MACN,aAAa;AAAA,IACd;AAAA,IACA,WAAW;AAAA,MACV,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACV;AAAA,IACA,YAAY;AAAA,MACX,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACV;AAAA,EACD;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AACnB,UAAM,SAAS,aAAa;AAE5B,UAAM,cAAc,MAAM,gBAAgB;AAC1C,QAAI,CAAC,aAAa;AACjB,YAAM,IAAI,oBAAoB,QAAQ,IAAI,CAAC;AAAA,IAC5C;AAEA,UAAM,SAAS,MAAM,eAAe,WAAW;AAC/C,UAAM,WAAW,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO,OAAO,QAAQ,KAAK,QAAQ,IAAI;AAC7F,UAAM,qBACL,OAAO,QAAQ,KAAK,SAAS,YAAY,OAAO,OAAO,IAAI,KAAK,SAAS,WACtE,OAAO,IAAI,KAAK,OAChB;AACJ,UAAM,WACL,OAAO,KAAK,WAAW,MAAM,WAAW,KAAK,WAAW,IAAI,OAAO,kBAAkB;AAEtF,UAAM,oBACL,QAAQ,KAAK,SAAS,UACtB,OAAO,IAAI,SAAS,QACnB,OAAO,OAAO,IAAI,SAAS,YAAY,OAAO,IAAI,KAAK,YAAY;AAErE,UAAM,qBACL,QAAQ,KAAK,UAAU,UACvB,OAAO,IAAI,UAAU,QACpB,OAAO,OAAO,IAAI,UAAU,YAAY,OAAO,IAAI,MAAM,YAAY;AAEvE,UAAM,kBACL,OAAO,QAAQ,KAAK,UAAU,YAAY,OAAO,OAAO,IAAI,MAAM,eAAe,WAC9E,OAAO,IAAI,MAAM,aACjB;AAEJ,UAAM,iBAAiB,MAAM,+BAA+B,aAAa,QAAQ,MAAM;AACvF,QAAI,CAAC,gBAAgB;AACpB,YAAM,IAAI,eAAe,YAAQ,yBAAK,aAAa,gBAAgB,QAAQ,MAAM,CAAC;AAAA,IACnF;AAEA,UAAM,iBAAiB,MAAM,mBAAmB,WAAW;AAC3D,QAAI,mBAAmB,0BAA0B,QAAQ,WAAW;AACpE,UAAM,uBAAuB,uBAAuB,MAAM;AAC1D,UAAM,cAAc,KAAK,SAAS,MAAM,QAAQ;AAChD,QAAI,kBAAkB,gBAAgB,mBAAmB,QAAQ,qBAAqB;AAEtF,QAAI,SAAS;AACb,QAAI,mBAAmB,mBAAmB,MAAM;AAC/C,eAAS,MAAM,gBAAgB,WAAW;AAC1C,UAAI,CAAC,QAAQ;AACZ,eAAO,KAAK,kEAAkE;AAAA,MAC/E;AAAA,IACD;AAEA,QAAI,mBAAmB,mBAAmB,QAAQ,kBAAkB;AACnE,YAAM,mBAAmB,MAAMC;AAAA,YAC9B,yBAAK,aAAa,gBAAgB,WAAW,UAAU,cAAc;AAAA,MACtE;AACA,UAAI,CAAC,kBAAkB;AACtB,eAAO;AAAA,UACN;AAAA,QACD;AACA,2BAAmB;AACnB,0BAAkB,gBAAgB,mBAAmB,QAAQ,qBAAqB;AAAA,MACnF;AAAA,IACD;AAEA,QACC,eACA,mBAAmB,QACnB,qBAAqB,QACrB,sBACC;AACD,aAAO;AAAA,QACN;AAAA,MACD;AAAA,IACD;AAEA,QAAI,uBAAsC;AAC1C,QAAI,OAAO,QAAQ,WAAW,UAAU;AACvC,YAAM,gBAAY,4BAAQ,aAAa,OAAO,MAAM;AACpD,UAAI,MAAMA,YAAW,SAAS,GAAG;AAChC,+BAAuB;AAAA,MACxB,OAAO;AACN,eAAO;AAAA,UACN,qCAAqC,SAAS;AAAA,QAC/C;AAAA,MACD;AAAA,IACD;AAEA,UAAM,aAAa,wBAAyB,MAAM,eAAe,WAAW;AAC5E,UAAM,eAAe,KAAK,UAAU,MAAM,QAAQ,sBAAsB,eAAe;AAEvF,UAAM,iBAAiB,IAAI,eAAe;AAC1C,QAAI,gBAAsC;AAC1C,QAAI,eAAe;AACnB,QAAI;AACJ,UAAM,WAAW,IAAI,QAAc,CAACC,cAAY;AAC/C,wBAAkBA;AAAA,IACnB,CAAC;AAED,UAAM,uBAAuB,MAAM;AAClC,UAAI,CAAC,eAAe,WAAW,KAAK,CAAC,cAAc;AAClD,0BAAkB;AAAA,MACnB;AAAA,IACD;AAEA,UAAM,WAAW,YAAY;AAC5B,UAAI,aAAc;AAClB,qBAAe;AACf,qBAAe,KAAK;AACpB,YAAM,eAAe,YAAY;AACjC,wBAAkB;AAAA,IACnB;AAEA,UAAM,WAAW,MAAM;AACtB,WAAK,SAAS;AAAA,IACf;AACA,UAAM,YAAY,MAAM;AACvB,WAAK,SAAS;AAAA,IACf;AAEA,YAAQ,GAAG,UAAU,QAAQ;AAC7B,YAAQ,GAAG,WAAW,SAAS;AAE/B,WAAO,OAAO;AACd,WAAO,KAAK,mCAAmC;AAC/C,WAAO,MAAM;AACb,WAAO,KAAK,6BAA6B,QAAQ,EAAE;AACnD,QAAI,mBAAmB,UAAU,gBAAgB;AAChD,aAAO,KAAK,yBAAyB,QAAQ,EAAE;AAAA,IAChD,WAAW,mBAAmB,mBAAmB,QAAQ,qBAAqB,MAAM;AACnF,aAAO,KAAK,iCAAiC,QAAQ,KAAK,iBAAiB,IAAI,GAAG;AAAA,IACnF,WAAW,eAAe,mBAAmB,MAAM;AAClD,aAAO,KAAK,4EAA4E;AAAA,IACzF,WAAW,CAAC,aAAa;AACxB,aAAO,KAAK,sCAAsC;AAAA,IACnD;AAEA,QAAI,gBAAgB,YAAY;AAC/B,aAAO,KAAK,6BAA6B,UAAU,GAAG;AAAA,IACvD,WAAW,KAAK,UAAU,MAAM,MAAM;AACrC,aAAO,KAAK,0CAA0C;AAAA,IACvD,OAAO;AACN,aAAO,KAAK,iDAAiD;AAAA,IAC9D;AACA,WAAO,MAAM;AAEb,WAAO,KAAK,kFAAkF;AAE9F,mBAAe,MAAM;AAAA,MACpB,OAAO;AAAA,MACP,SAAS,QAAQ;AAAA,MACjB,MAAM,CAAC,gBAAgB,UAAU,OAAO,QAAQ,CAAC;AAAA,MACjD,KAAK;AAAA,MACL,KAAK;AAAA,QACJ,UAAU;AAAA,MACX;AAAA,MACA,QAAQ;AAAA,IACT,CAAC;AAED,QAAI,mBAAmB,UAAU,gBAAgB;AAChD,qBAAe,MAAM;AAAA,QACpB,OAAO;AAAA,QACP,SAAS,QAAQ;AAAA,QACjB,MAAM,CAAC,YAAY,OAAO,cAAc;AAAA,QACxC,KAAK;AAAA,QACL,KAAK;AAAA,UACJ,MAAM,OAAO,QAAQ;AAAA,UACrB,gBAAgB,OAAO,QAAQ;AAAA,QAChC;AAAA,QACA,QAAQ;AAAA,MACT,CAAC;AAAA,IACF;AAEA,QAAI,mBAAmB,mBAAmB,QAAQ,qBAAqB,MAAM;AAC5E,qBAAe,MAAM;AAAA,QACpB,OAAO;AAAA,QACP,SAAS,QAAQ;AAAA,QACjB,MAAM,CAAC,uBAAuB,UAAU,6BAA6B;AAAA,QACrE,KAAK;AAAA,QACL,KAAK;AAAA,UACJ,sBAAsB,KAAK,UAAU;AAAA,YACpC,MAAM,OAAO,QAAQ;AAAA,YACrB,OAAO;AAAA,UACR,CAAC;AAAA,QACF;AAAA,QACA,QAAQ;AAAA,MACT,CAAC;AAAA,IACF;AAEA,QAAI,gBAAgB,YAAY;AAC/B,sBAAgB,IAAI,cAAc;AAAA,QACjC;AAAA,QACA;AAAA,QACA,YAAY;AAAA,QACZ,cAAc,MAAM;AACnB,iBAAO,QAAQ,uCAAuC;AAAA,QACvD;AAAA,QACA,SAAS,CAAC,UAAU;AACnB,iBAAO,MAAM,yBAAyB,MAAM,OAAO,EAAE;AAAA,QACtD;AAAA,MACD,CAAC;AACD,oBAAc,MAAM;AAAA,IACrB;AAEA,UAAM;AACN,YAAQ,IAAI,UAAU,QAAQ;AAC9B,YAAQ,IAAI,WAAW,SAAS;AAAA,EACjC;AACD,CAAC;AAED,eAAe,mBAAmB,aAA6C;AAC9E,QAAM,aAAa,KAAC,yBAAK,aAAa,WAAW,OAAG,yBAAK,aAAa,WAAW,CAAC;AAElF,aAAW,aAAa,YAAY;AACnC,QAAI;AACH,gBAAM,0BAAO,SAAS;AACtB,aAAO;AAAA,IACR,QAAQ;AAAA,IAER;AAAA,EACD;AAEA,SAAO;AACR;AAEA,eAAeD,YAAW,MAAgC;AACzD,MAAI;AACH,cAAM,0BAAO,IAAI;AACjB,WAAO;AAAA,EACR,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AAEA,SAAS,0BACR,QACA,aACgC;AAChC,QAAM,OAAO,QAAQ,KAAK;AAC1B,MAAI,OAAO,SAAS,YAAY,SAAS,KAAM,QAAO;AAEtD,QAAM,QAAQ,KAAK;AACnB,MAAI,UAAU,OAAW,QAAO,EAAE,MAAM,SAAS;AAEjD,MAAI,UAAU,SAAU,QAAO,EAAE,MAAM,SAAS;AAChD,MAAI,UAAU,SAAU,QAAO,EAAE,MAAM,UAAU,cAAU,yBAAK,aAAa,cAAc,EAAE;AAC7F,MAAI,UAAU,YAAY;AACzB,UAAM,mBAAmB,QAAQ,IAAI;AACrC,QAAI,CAAC,iBAAkB,QAAO;AAC9B,WAAO,EAAE,MAAM,YAAY,iBAAiB;AAAA,EAC7C;AAEA,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAChD,QAAI,MAAM,SAAS,SAAU,QAAO,EAAE,MAAM,SAAS;AACrD,QAAI,MAAM,SAAS,UAAU;AAC5B,YAAM,WACL,OAAO,MAAM,aAAa,YAAY,MAAM,SAAS,SAAS,QAC3D,4BAAQ,aAAa,MAAM,QAAQ,QACnC,yBAAK,aAAa,cAAc;AACpC,aAAO,EAAE,MAAM,UAAU,SAAS;AAAA,IACnC;AACA,QAAI,MAAM,SAAS,cAAc,OAAO,MAAM,qBAAqB,UAAU;AAC5E,aAAO,EAAE,MAAM,YAAY,kBAAkB,MAAM,iBAAiB;AAAA,IACrE;AAAA,EACD;AAEA,SAAO;AACR;AAEA,SAAS,uBAAuB,QAAwC;AACvE,QAAM,OAAO,QAAQ,KAAK;AAC1B,MAAI,OAAO,SAAS,YAAY,SAAS,KAAM,QAAO;AACtD,MAAI,KAAK,UAAU,WAAY,QAAO;AACtC,MAAI,OAAO,KAAK,UAAU,YAAY,KAAK,UAAU,QAAQ,KAAK,MAAM,SAAS;AAChF,WAAO;AACR,SAAO;AACR;AAEA,IAAM,gCAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AGxUtC,IAAAE,gBAA8B;;;ACA9B,IAAAC,oBAAiC;AACjC,IAAAC,qBAA8B;AAwB9B,IAAM,kBAAkB;AAKxB,eAAsB,gBAAgB,SAAyD;AAC9F,QAAM,EAAE,YAAY,IAAI;AACxB,QAAM,UAA+B,CAAC;AAEtC,UAAQ,KAAK;AAAA,IACZ,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,EACV,CAAC;AAED,QAAM,SAAS,MAAM,eAAe,WAAW;AAC/C,MAAI,CAAC,QAAQ;AACZ,YAAQ,KAAK;AAAA,MACZ,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,KAAK;AAAA,IACN,CAAC;AAAA,EACF,OAAO;AACN,YAAQ,KAAK;AAAA,MACZ,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS;AAAA,IACV,CAAC;AAAA,EACF;AAEA,QAAM,aAAa,MAAM,kBAAkB,aAAa,QAAQ,MAAM;AACtE,MAAI,CAAC,YAAY;AAChB,YAAQ,KAAK;AAAA,MACZ,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,KAAK;AAAA,IACN,CAAC;AAAA,EACF,OAAO;AACN,QAAI;AACH,YAAM,SAAS,MAAM,qBAAqB,YAAY,WAAW;AACjE,cAAQ,KAAK;AAAA,QACZ,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS,kBAAkB,OAAO,OAAO,KAAK,OAAO,KAAK,OAAO,WAAW,EAAE,MAAM;AAAA,MACrF,CAAC;AAED,YAAM,cAAc,MAAM,gBAAgB,WAAW;AACrD,cAAQ,KAAK,WAAW;AAExB,YAAM,YAAY,MAAM,kBAAkB,WAAW;AACrD,cAAQ,KAAK,SAAS;AAEtB,cAAQ,KAAK,gBAAgB,CAAC;AAE9B,UAAI,CAAC,QAAQ,aAAa;AACzB,cAAM,UAAU,QAAQ,eAAgB,MAAM,mBAAmB,aAAa,MAAM;AACpF,cAAM,aAAa,MAAM,gBAAgB,SAAS,MAAM;AACxD,gBAAQ,KAAK,GAAG,UAAU;AAAA,MAC3B,OAAO;AACN,gBAAQ,KAAK;AAAA,UACZ,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,SAAS;AAAA,QACV,CAAC;AAAA,MACF;AAAA,IACD,SAAS,OAAO;AACf,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,cAAQ,KAAK;AAAA,QACZ,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS,0BAA0B,OAAO;AAAA,QAC1C,KAAK;AAAA,MACN,CAAC;AAAA,IACF;AAAA,EACD;AAEA,SAAO;AACR;AAEA,eAAe,kBACd,aACA,cACyB;AACzB,MAAI,OAAO,iBAAiB,UAAU;AACrC,UAAM,eAAW,4BAAQ,aAAa,YAAY;AAClD,QAAI;AACH,gBAAM,0BAAO,QAAQ;AACrB,aAAO;AAAA,IACR,QAAQ;AAAA,IAER;AAAA,EACD;AACA,SAAO,eAAe,WAAW;AAClC;AAEA,eAAe,gBAAgB,aAAiD;AAC/E,QAAM,aAAa;AAAA,QAClB,yBAAK,aAAa,OAAO,gBAAgB;AAAA,QACzC,yBAAK,aAAa,OAAO,gBAAgB;AAAA,EAC1C;AAEA,aAAW,QAAQ,YAAY;AAC9B,QAAI;AACH,gBAAM,0BAAO,IAAI;AACjB,aAAO;AAAA,QACN,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS,SAAS,KAAK,QAAQ,aAAa,GAAG,CAAC;AAAA,MACjD;AAAA,IACD,QAAQ;AAAA,IAER;AAAA,EACD;AAEA,SAAO;AAAA,IACN,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,KAAK;AAAA,EACN;AACD;AAEA,eAAe,kBAAkB,aAAiD;AACjF,MAAI;AACH,UAAM,MAAM,UAAM,gCAAS,yBAAK,aAAa,cAAc,GAAG,OAAO;AACrE,UAAM,MAAM,KAAK,MAAM,GAAG;AAI1B,UAAM,OAAO,EAAE,GAAG,IAAI,cAAc,GAAG,IAAI,gBAAgB;AAC3D,UAAM,UAAU,QAAQ,KAAK,UAAU,KAAK,IAAI;AAChD,UAAM,WAAW,QAAQ,KAAK,eAAe,CAAC;AAC9C,QAAI,WAAW,UAAU;AACxB,aAAO;AAAA,QACN,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS,UACN,sCACA;AAAA,MACJ;AAAA,IACD;AACA,WAAO;AAAA,MACN,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,KAAK;AAAA,IACN;AAAA,EACD,QAAQ;AACP,WAAO;AAAA,MACN,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,KAAK;AAAA,IACN;AAAA,EACD;AACD;AAEA,SAAS,kBAAqC;AAC7C,SAAO;AAAA,IACN,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SACC;AAAA,IACD,KAAK;AAAA,EACN;AACD;AAEA,eAAe,mBACd,aACA,QACkB;AAClB,QAAM,SAAS,MAAM,eAAe,WAAW;AAC/C,MAAI,QAAQ;AACX,WAAO,qBAAqB,MAAM;AAAA,EACnC;AAEA,QAAM,WACL,OAAO,QAAQ,KAAK,SAAS,YAAY,OAAO,OAAO,IAAI,KAAK,SAAS,WACtE,OAAO,IAAI,KAAK,OAChB;AAEJ,SAAO,oBAAoB,QAAQ;AACpC;AAEA,eAAe,eAAe,aAA6C;AAC1E,aAAW,QAAQ,CAAC,QAAQ,YAAY,GAAG;AAC1C,UAAM,WAAO,yBAAK,aAAa,IAAI;AACnC,QAAI;AACH,YAAM,UAAU,UAAM,4BAAS,MAAM,OAAO;AAC5C,iBAAW,QAAQ,QAAQ,MAAM,IAAI,GAAG;AACvC,cAAM,UAAU,KAAK,KAAK;AAC1B,YAAI,CAAC,WAAW,QAAQ,WAAW,GAAG,EAAG;AACzC,cAAM,QAAQ,QAAQ,MAAM,sBAAsB;AAClD,YAAI,QAAQ,CAAC,GAAG;AACf,iBAAO,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,gBAAgB,EAAE;AAAA,QAClD;AAAA,MACD;AAAA,IACD,QAAQ;AAAA,IAER;AAAA,EACD;AACA,SAAO;AACR;AAGO,SAAS,qBAAqB,KAAqB;AACzD,MAAI;AACH,UAAM,SAAS,IAAI,IAAI,GAAG;AAC1B,QAAI,OAAO,aAAa,OAAO;AAC9B,aAAO,WAAW;AAAA,IACnB,WAAW,OAAO,aAAa,QAAQ;AACtC,aAAO,WAAW;AAAA,IACnB;AACA,WAAO,WAAW;AAClB,WAAO,SAAS;AAChB,WAAO,OAAO;AACd,WAAO,OAAO,SAAS,EAAE,QAAQ,OAAO,EAAE;AAAA,EAC3C,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AAQA,eAAe,gBACd,UACA,QAC+B;AAC/B,QAAM,YAAY,GAAG,SAAS,QAAQ,OAAO,EAAE,CAAC,GAAG,eAAe;AAElE,MAAI;AACH,UAAM,WAAW,MAAM,MAAM,WAAW;AAAA,MACvC,QAAQ,YAAY,QAAQ,GAAI;AAAA,IACjC,CAAC;AACD,QAAI,CAAC,SAAS,IAAI;AACjB,aAAO;AAAA,QACN;AAAA,UACC,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,SAAS,OAAO,SAAS,aAAa,SAAS,MAAM;AAAA,UACrD,KAAK;AAAA,QACN;AAAA,MACD;AAAA,IACD;AAEA,UAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,UAAM,UAA+B;AAAA,MACpC;AAAA,QACC,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS,gBAAgB,SAAS,aAAa,KAAK,WAAW,SAAS;AAAA,MACzE;AAAA,IACD;AAEA,QAAI,OAAO,KAAK,kBAAkB,YAAY,KAAK,kBAAkB,OAAO,SAAS;AACpF,cAAQ,KAAK;AAAA,QACZ,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS,kBAAkB,OAAO,OAAO,gCAAgC,KAAK,aAAa;AAAA,QAC3F,KAAK;AAAA,MACN,CAAC;AAAA,IACF,OAAO;AACN,cAAQ,KAAK;AAAA,QACZ,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS,sCAAsC,OAAO,OAAO;AAAA,MAC9D,CAAC;AAAA,IACF;AAEA,WAAO;AAAA,EACR,SAAS,OAAO;AACf,UAAM,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACpE,WAAO;AAAA,MACN;AAAA,QACC,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS,mBAAmB,SAAS,KAAK,MAAM;AAAA,QAChD,KAAK;AAAA,MACN;AAAA,IACD;AAAA,EACD;AACD;AAKO,SAAS,kBAAkB,SAAuC;AACxE,SAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,WAAW,MAAM;AAC/C;;;ADxUO,IAAM,oBAAgB,6BAAc;AAAA,EAC1C,MAAM;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,EACd;AAAA,EACA,MAAM;AAAA,IACL,KAAK;AAAA,MACJ,MAAM;AAAA,MACN,aACC;AAAA,IACF;AAAA,IACA,gBAAgB;AAAA,MACf,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACV;AAAA,EACD;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AACnB,UAAM,SAAS,aAAa;AAC5B,UAAM,cAAc,MAAM,gBAAgB;AAC1C,QAAI,CAAC,aAAa;AACjB,YAAM,IAAI,oBAAoB,QAAQ,IAAI,CAAC;AAAA,IAC5C;AAEA,UAAM,cAAc,OAAO,KAAK,QAAQ,WAAW,KAAK,MAAM;AAC9D,UAAM,cAAc,KAAK,cAAc,MAAM;AAE7C,WAAO,OAAO;AACd,WAAO,KAAK,uBAAuB,WAAW,EAAE;AAChD,WAAO,MAAM;AAEb,UAAM,UAAU,MAAM,gBAAgB;AAAA,MACrC;AAAA,MACA;AAAA,MACA;AAAA,IACD,CAAC;AAED,eAAW,SAAS,SAAS;AAC5B,YAAM,SACL,MAAM,WAAW,SACd,YACA,MAAM,WAAW,SAChB,SACA,MAAM,WAAW,SAChB,UACA;AACN,aAAO,MAAM,EAAE,GAAG,MAAM,KAAK,KAAK,MAAM,OAAO,EAAE;AACjD,UAAI,MAAM,OAAO,MAAM,WAAW,UAAU,MAAM,WAAW,QAAQ;AACpE,eAAO,KAAK,UAAU,MAAM,GAAG,EAAE;AAAA,MAClC;AAAA,IACD;AAEA,WAAO,MAAM;AACb,QAAI,kBAAkB,OAAO,GAAG;AAC/B,aAAO,MAAM,+BAA+B;AAC5C,cAAQ,WAAW;AACnB;AAAA,IACD;AAEA,UAAM,WAAW,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM,EAAE;AAC5D,QAAI,WAAW,GAAG;AACjB,aAAO,KAAK,wBAAwB,QAAQ,cAAc;AAAA,IAC3D,OAAO;AACN,aAAO,QAAQ,oBAAoB;AAAA,IACpC;AAAA,EACD;AACD,CAAC;;;AE3ED,IAAAC,oBAAiC;AACjC,IAAAC,qBAAiC;AAEjC,IAAAC,gBAA8B;;;ACKvB,SAAS,wBAAwB,QAA+C;AACtF,QAAM,QAAQ,oBAAI,IAAoB;AAEtC,aAAW,kBAAkB,OAAO,KAAK,OAAO,WAAW,GAAG;AAC7D,UAAM,SAAS,aAAa,cAAc;AAC1C,UAAM,WAAW,MAAM,MAAM;AAE7B,UAAM,UAAU;AAAA,MACf;AAAA,MACA,cAAc,OAAO,OAAO,OAAO,CAAC;AAAA,MACpC;AAAA,MACA;AAAA,MACA,iBAAiB,MAAM,gBAAgB,MAAM,WAAW,MAAM;AAAA,MAC9D;AAAA,MACA;AAAA,MACA,4BAA4B,cAAc;AAAA,MAC1C;AAAA,MACA;AAAA,MACA,mBAAmB,QAAQ;AAAA,MAC3B,UAAW,cAAc,qBAAqB,cAAc;AAAA,MAC5D;AAAA,MACA,sCAAuC,MAAM,mBAAmB,cAAc;AAAA,MAC9E,kDAAmD,MAAM;AAAA,MACzD,KAAO,cAAc;AAAA,MACrB;AAAA,MACA,+CAAgD,cAAc;AAAA,MAC9D;AAAA,MACA;AAAA,MACA,KAAO,cAAc;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD,EAAE,KAAK,IAAI;AAEX,UAAM,IAAI,GAAG,cAAc,OAAO,OAAO;AAAA,EAC1C;AAEA,QAAM,aAAa;AAAA,IAClB;AAAA,IACA;AAAA,IACA,GAAG,OAAO,KAAK,OAAO,WAAW,EAAE,IAAI,CAAC,SAAS;AAChD,YAAM,SAAS,aAAa,IAAI;AAChC,aAAO,eAAe,MAAM,cAAc,IAAI;AAAA,IAC/C,CAAC;AAAA,IACD;AAAA,EACD;AAEA,QAAM,IAAI,YAAY,WAAW,KAAK,IAAI,CAAC;AAC3C,SAAO;AACR;AAEA,SAAS,aAAa,OAAuB;AAC5C,SAAO,MACL,MAAM,MAAM,EACZ,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,EAChC,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC,EAC1D,KAAK,EAAE;AACV;;;ACxDO,SAAS,cAAc,QAAkC;AAC/D,QAAM,QAAkB;AAAA,IACvB;AAAA,IACA,oCAAoC,OAAO,OAAO,OAAO,CAAC;AAAA,IAC1D;AAAA,EACD;AAEA,QAAM,kBAAkB,OAAO,KAAK,OAAO,WAAW;AACtD,MAAI,gBAAgB,WAAW,GAAG;AACjC,WAAO,MAAM,KAAK,IAAI;AAAA,EACvB;AAEA,aAAW,CAAC,MAAM,UAAU,KAAK,OAAO,QAAQ,OAAO,WAAW,GAAG;AACpE,UAAM,SAASC,cAAa,IAAI;AAChC,UAAM,SAAS,WAAW;AAG1B,UAAM,KAAK,oBAAoB,MAAM,UAAU;AAC/C,UAAM,KAAK,sBAAuB;AAClC,eAAW,CAAC,WAAW,UAAU,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC7D,YAAM,SAAS,sBAAsB,UAAU;AAC/C,YAAM,WAAW,CAAC,WAAW,YAAY,CAAC,WAAW,OAAO,MAAM;AAClE,YAAM,KAAK,aAAc,SAAS,GAAG,QAAQ,KAAK,MAAM,EAAE;AAAA,IAC3D;AACA,UAAM,KAAK,GAAG;AACd,UAAM,KAAK,EAAE;AAGb,UAAM,KAAK,oBAAoB,MAAM,eAAe;AACpD,eAAW,CAAC,WAAW,UAAU,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC7D,UAAI,WAAW,KAAM;AACrB,YAAM,SAAS,sBAAsB,UAAU;AAC/C,YAAM,WAAW,CAAC,WAAW,YAAY,WAAW,iBAAiB,SAAY,MAAM;AACvF,YAAM,KAAK,IAAK,SAAS,GAAG,QAAQ,KAAK,MAAM,EAAE;AAAA,IAClD;AACA,UAAM,KAAK,GAAG;AACd,UAAM,KAAK,EAAE;AAGb,UAAM,KAAK,oBAAoB,MAAM,eAAe;AACpD,eAAW,CAAC,WAAW,UAAU,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC7D,UAAI,WAAW,KAAM;AACrB,YAAM,SAAS,sBAAsB,UAAU;AAC/C,YAAM,KAAK,IAAK,SAAS,MAAM,MAAM,EAAE;AAAA,IACxC;AACA,UAAM,KAAK,GAAG;AACd,UAAM,KAAK,EAAE;AAAA,EACd;AAEA,SAAO,MAAM,KAAK,IAAI;AACvB;AAGA,SAAS,sBAAsB,YAAqC;AACnE,UAAQ,WAAW,MAAM;AAAA,IACxB,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK,QAAQ;AACZ,UAAI,WAAW,cAAc,WAAW,WAAW,SAAS,GAAG;AAC9D,eAAO,WAAW,WAAW,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,KAAK;AAAA,MAC7D;AACA,aAAO;AAAA,IACR;AAAA,IACA,KAAK,SAAS;AACb,YAAM,WAAW,qBAAqB,WAAW,QAAQ;AACzD,aAAO,SAAS,QAAQ;AAAA,IACzB;AAAA,IACA;AACC,aAAO;AAAA,EACT;AACD;AAGA,SAAS,qBAAqB,MAAgC;AAC7D,UAAQ,MAAM;AAAA,IACb,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR;AACC,aAAO;AAAA,EACT;AACD;AAGA,SAASA,cAAa,MAAsB;AAC3C,SAAO,KACL,MAAM,MAAM,EACZ,IAAI,CAAC,SAAS;AACd,QAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,UAAM,QAAQ,KAAK,CAAC;AACpB,WAAO,QAAQ,MAAM,YAAY,IAAI,KAAK,MAAM,CAAC,IAAI;AAAA,EACtD,CAAC,EACA,KAAK,EAAE;AACV;;;AF7GO,IAAM,sBAAkB,6BAAc;AAAA,EAC5C,MAAM;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,EACd;AAAA,EACA,aAAa;AAAA,IACZ,WAAO,6BAAc;AAAA,MACpB,MAAM;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,MACd;AAAA,MACA,MAAM;AAAA,QACL,QAAQ;AAAA,UACP,MAAM;AAAA,UACN,aAAa;AAAA,QACd;AAAA,QACA,QAAQ;AAAA,UACP,MAAM;AAAA,UACN,aAAa;AAAA,UACb,SAAS;AAAA,QACV;AAAA,MACD;AAAA,MACA,MAAM,IAAI,EAAE,KAAK,GAAG;AACnB,cAAM,SAAS,aAAa;AAG5B,cAAM,cAAc,MAAM,gBAAgB;AAC1C,YAAI,CAAC,aAAa;AACjB,gBAAM,IAAI,oBAAoB,QAAQ,IAAI,CAAC;AAAA,QAC5C;AAGA,YAAI;AACJ,YAAI,KAAK,UAAU,OAAO,KAAK,WAAW,UAAU;AACnD,2BAAa,4BAAQ,KAAK,MAAM;AAAA,QACjC,OAAO;AACN,gBAAM,QAAQ,MAAM,eAAe,WAAW;AAC9C,cAAI,CAAC,OAAO;AACX,kBAAM,IAAI,oBAAoB;AAAA,cAC7B;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACD,CAAC;AAAA,UACF;AACA,uBAAa;AAAA,QACd;AAEA,eAAO,KAAK,uBAAuB,UAAU,KAAK;AAGlD,cAAM,eAAwB,MAAM,OAAO;AAC3C,cAAM,SAASC,eAAc,YAAY;AAEzC,YAAI,CAAC,QAAQ;AACZ,iBAAO,MAAM,mEAAmE;AAChF,kBAAQ,WAAW;AACnB;AAAA,QACD;AAGA,cAAM,SAAS,cAAc,MAAM;AACnC,cAAM,aAAa,OAAO,KAAK,WAAW,WAAW,KAAK,SAAS;AACnE,cAAM,iBAAa,4BAAQ,aAAa,UAAU;AAElD,kBAAM,6BAAM,4BAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AACpD,kBAAM,6BAAU,YAAY,QAAQ,OAAO;AAE3C,eAAO,QAAQ,sBAAsB,UAAU,EAAE;AAAA,MAClD;AAAA,IACD,CAAC;AAAA,IACD,WAAO,6BAAc;AAAA,MACpB,MAAM;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,MACd;AAAA,MACA,MAAM;AAAA,QACL,QAAQ;AAAA,UACP,MAAM;AAAA,UACN,aAAa;AAAA,QACd;AAAA,QACA,QAAQ;AAAA,UACP,MAAM;AAAA,UACN,aAAa;AAAA,UACb,SAAS;AAAA,QACV;AAAA,QACA,OAAO;AAAA,UACN,MAAM;AAAA,UACN,aAAa;AAAA,UACb,SAAS;AAAA,QACV;AAAA,MACD;AAAA,MACA,MAAM,IAAI,EAAE,KAAK,GAAG;AACnB,cAAM,SAAS,aAAa;AAC5B,cAAM,cAAc,MAAM,gBAAgB;AAC1C,YAAI,CAAC,aAAa;AACjB,gBAAM,IAAI,oBAAoB,QAAQ,IAAI,CAAC;AAAA,QAC5C;AAEA,YAAI;AACJ,YAAI,KAAK,UAAU,OAAO,KAAK,WAAW,UAAU;AACnD,2BAAa,4BAAQ,aAAa,KAAK,MAAM;AAAA,QAC9C,OAAO;AACN,gBAAM,QAAQ,MAAM,eAAe,WAAW;AAC9C,cAAI,CAAC,OAAO;AACX,kBAAM,IAAI,oBAAoB;AAAA,cAC7B;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACD,CAAC;AAAA,UACF;AACA,uBAAa;AAAA,QACd;AAEA,cAAM,SAAS,MAAM,qBAAqB,YAAY,WAAW;AACjE,cAAM,YACL,OAAO,KAAK,WAAW,eACpB,4BAAQ,aAAa,KAAK,MAAM,QAChC,4BAAQ,aAAa,sBAAsB;AAE/C,cAAM,QAAQ,wBAAwB,MAAM;AAC5C,mBAAW,CAAC,MAAM,OAAO,KAAK,OAAO;AACpC,gBAAM,WACL,OAAO,KAAK,UAAU,YAAY,KAAK,UAAU,aAC9C,QAAQ,QAAQ,mBAAmB,SAAS,KAAK,KAAK,GAAG,IACzD;AACJ,gBAAM,eAAW,4BAAQ,WAAW,IAAI;AACxC,oBAAM,6BAAM,4BAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAClD,oBAAM,6BAAU,UAAU,UAAU,OAAO;AAAA,QAC5C;AAEA,eAAO,QAAQ,aAAa,OAAO,MAAM,IAAI,CAAC,oBAAoB,SAAS,EAAE;AAC7E,eAAO,KAAK,yDAAyD;AAAA,MACtE;AAAA,IACD,CAAC;AAAA,EACF;AACD,CAAC;AAED,SAASA,eAAc,KAAuC;AAC7D,MAAI,OAAO,QAAQ,YAAY,QAAQ,KAAM,QAAO;AACpD,QAAM,SAAS;AAGf,QAAM,YAAY,OAAO,WAAW;AACpC,MAAIC,oBAAmB,SAAS,EAAG,QAAO;AAE1C,SAAO;AACR;AAEA,SAASA,oBAAmB,OAA2C;AACtE,MAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,QAAM,MAAM;AACZ,SACC,OAAO,IAAI,YAAY,YACvB,OAAO,IAAI,gBAAgB,YAC3B,IAAI,gBAAgB;AAEtB;;;AG7KA,IAAAC,gBAA8B;AAG9B,IAAMC,qBAAoB;AAC1B,IAAM,kBAAkB;AAKjB,IAAM,kBAAc,6BAAc;AAAA,EACxC,MAAM;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,EACd;AAAA,EACA,MAAM;AAAA,IACL,KAAK;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS,oBAAoBA,kBAAiB;AAAA,IAC/C;AAAA,IACA,QAAQ;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,MACT,OAAO;AAAA,IACR;AAAA,IACA,OAAO;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,IACd;AAAA,IACA,OAAO;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,IACd;AAAA,EACD;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AACnB,UAAM,SAAS,aAAa;AAC5B,UAAM,MAAM,OAAO,KAAK,QAAQ,WAAW,KAAK,MAAM,oBAAoBA,kBAAiB;AAC3F,UAAM,SAAS,KAAK,WAAW;AAC/B,UAAM,cAAc,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAClE,UAAM,QACL,OAAO,KAAK,UAAU,WAAW,KAAK,QAAS,QAAQ,IAAI,oBAAoB;AAChF,UAAM,YAAY,GAAG,IAAI,QAAQ,OAAO,EAAE,CAAC,GAAG,eAAe;AAE7D,WAAO,OAAO;AACd,WAAO,KAAK,iBAAiB,SAAS,KAAK;AAC3C,WAAO,MAAM;AAEb,QAAI;AACH,YAAM,WAAW,MAAM,MAAM,WAAW;AAAA,QACvC,SAAS,QAAQ,EAAE,eAAe,UAAU,KAAK,GAAG,IAAI;AAAA,MACzD,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AACjB,cAAM,IAAI;AAAA,UACT,wBAAwB,SAAS,KAAK,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,QAC7E;AAAA,MACD;AAEA,YAAM,SAAS,SAAS,MAAM,UAAU;AACxC,UAAI,CAAC,QAAQ;AACZ,cAAM,IAAI,MAAM,+BAA+B;AAAA,MAChD;AAEA,YAAM,UAAU,IAAI,YAAY;AAChC,UAAI,SAAS;AAEb,YAAM,cAAc,CAAC,SAAiB;AAErC,YAAI,KAAK,WAAW,SAAS,GAAG;AAC/B;AAAA,QACD;AACA,YAAI,KAAK,WAAW,QAAQ,GAAG;AAC9B,gBAAM,OAAO,KAAK,MAAM,CAAC;AACzB,cAAI;AACH,kBAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,kBAAM,QAAQ,OAAO,OAAO,SAAS,MAAM;AAE3C,gBAAI,eAAe,UAAU,YAAa;AAE1C,kBAAM,YAAY,OAAO,YACtB,IAAI,KAAK,OAAO,SAAmB,EAAE,YAAY,IACjD;AACH,kBAAM,QAAQ,OAAO,OAAO,SAAS,SAAS;AAC9C,kBAAM,SAAS,OAAO,SAAS,KAAK,OAAO,MAAM,MAAM;AACvD,kBAAM,UAAU,OAAO,YAAY,KAAK,OAAO,SAAS,MAAM;AAC9D,kBAAM,QAAQ,OAAO,QAAQ,KAAK,OAAO,KAAK,MAAM;AACpD,kBAAM,QAAQ,OAAO,QAAQ,WAAM,OAAO,KAAK,KAAK;AAEpD,kBAAM,SAAS,UAAU,UAAU,WAAM,UAAU,SAAS,WAAM;AAClE,kBAAM,QACL,UAAU,UAAU,aAAa,UAAU,SAAS,aAAa;AAElE,oBAAQ;AAAA,cACP,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,IAAI,UAAU,MAAM,IAAI,EAAE,CAAC,IAAI,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK;AAAA,YACrG;AAAA,UACD,QAAQ;AAAA,UAER;AAAA,QACD;AAAA,MACD;AAEA,YAAM,OAAO,YAAY;AACxB,eAAO,MAAM;AACZ,gBAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,cAAI,KAAM;AAEV,oBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,gBAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,mBAAS,MAAM,IAAI,KAAK;AAExB,qBAAW,QAAQ,OAAO;AACzB,wBAAY,KAAK,KAAK,CAAC;AAAA,UACxB;AAEA,cAAI,CAAC,OAAQ;AAAA,QACd;AAAA,MACD;AAEA,YAAM,KAAK;AAAA,IACZ,SAAS,OAAO;AACf,aAAO,MAAM,wBAAwB,SAAS,EAAE;AAChD,UAAI,iBAAiB,OAAO;AAC3B,eAAO,MAAM,MAAM,OAAO;AAAA,MAC3B;AACA,aAAO,MAAM;AACb,aAAO,KAAK,4CAA4C;AACxD,aAAO,KAAK,yBAAyB;AACrC,cAAQ,KAAK,CAAC;AAAA,IACf;AAAA,EACD;AACD,CAAC;;;ACnID,IAAAC,oBAAoD;AACpD,IAAAC,qBAAuC;AAEvC,IAAAC,gBAA8B;;;ACH9B,IAAAC,eAA4B;;;AC4BrB,SAAS,YAAY,UAA4B,SAAuC;AAC9F,QAAM,UAA0B,CAAC;AAEjC,QAAM,sBAAsB,IAAI,IAAI,OAAO,KAAK,SAAS,WAAW,CAAC;AACrE,QAAM,qBAAqB,IAAI,IAAI,OAAO,KAAK,QAAQ,WAAW,CAAC;AAEnE,aAAW,cAAc,oBAAoB;AAC5C,QAAI,CAAC,oBAAoB,IAAI,UAAU,GAAG;AACzC,cAAQ,KAAK,EAAE,MAAM,oBAAoB,WAAW,CAAC;AAAA,IACtD;AAAA,EACD;AAEA,aAAW,cAAc,qBAAqB;AAC7C,QAAI,CAAC,mBAAmB,IAAI,UAAU,GAAG;AACxC,cAAQ,KAAK,EAAE,MAAM,sBAAsB,WAAW,CAAC;AAAA,IACxD;AAAA,EACD;AAEA,aAAW,cAAc,oBAAoB;AAC5C,QAAI,CAAC,oBAAoB,IAAI,UAAU,EAAG;AAE1C,UAAM,cAAc,SAAS,YAAY,UAAU;AACnD,UAAM,aAAa,QAAQ,YAAY,UAAU;AACjD,QAAI,CAAC,eAAe,CAAC,WAAY;AAEjC,UAAM,iBAAiB,YAAY;AACnC,UAAM,gBAAgB,WAAW;AAEjC,eAAW,CAAC,WAAW,YAAY,KAAK,OAAO,QAAQ,aAAa,GAAG;AACtE,YAAM,gBAAgB,eAAe,SAAS;AAC9C,UAAI,CAAC,eAAe;AACnB,gBAAQ,KAAK;AAAA,UACZ,MAAM;AAAA,UACN;AAAA,UACA,OAAO;AAAA,UACP,YAAY;AAAA,QACb,CAAC;AACD;AAAA,MACD;AAEA,UAAI,CAAC,sBAAsB,eAAe,YAAY,GAAG;AACxD,gBAAQ,KAAK;AAAA,UACZ,MAAM;AAAA,UACN;AAAA,UACA,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,OAAO;AAAA,QACR,CAAC;AAAA,MACF;AAAA,IACD;AAEA,eAAW,CAAC,WAAW,aAAa,KAAK,OAAO,QAAQ,cAAc,GAAG;AACxE,UAAI,EAAE,aAAa,gBAAgB;AAClC,gBAAQ,KAAK;AAAA,UACZ,MAAM;AAAA,UACN;AAAA,UACA,OAAO;AAAA,UACP,YAAY;AAAA,QACb,CAAC;AAAA,MACF;AAAA,IACD;AAEA,UAAM,kBAAkB,IAAI,IAAI,YAAY,OAAO;AACnD,UAAM,iBAAiB,IAAI,IAAI,WAAW,OAAO;AAEjD,eAAW,SAAS,gBAAgB;AACnC,UAAI,CAAC,gBAAgB,IAAI,KAAK,GAAG;AAChC,gBAAQ,KAAK,EAAE,MAAM,eAAe,YAAY,MAAM,CAAC;AAAA,MACxD;AAAA,IACD;AAEA,eAAW,SAAS,iBAAiB;AACpC,UAAI,CAAC,eAAe,IAAI,KAAK,GAAG;AAC/B,gBAAQ,KAAK,EAAE,MAAM,iBAAiB,YAAY,MAAM,CAAC;AAAA,MAC1D;AAAA,IACD;AAAA,EACD;AAEA,UAAQ,KAAK,cAAc;AAE3B,SAAO;AAAA,IACN,aAAa,SAAS;AAAA,IACtB,WAAW,QAAQ;AAAA,IACnB;AAAA,IACA,YAAY,QAAQ,SAAS;AAAA,IAC7B,oBAAoB,QAAQ,KAAK,gBAAgB;AAAA,EAClD;AACD;AAEO,SAAS,sBAAsB,MAA4B;AACjE,QAAM,cAAc,oBAAI,IAAY;AACpC,aAAW,UAAU,KAAK,SAAS;AAClC,gBAAY,IAAI,OAAO,UAAU;AAAA,EAClC;AACA,SAAO,CAAC,GAAG,WAAW,EAAE,KAAK;AAC9B;AAEA,SAAS,iBAAiB,QAA+B;AACxD,MAAI,OAAO,SAAS,wBAAwB,OAAO,SAAS,gBAAiB,QAAO;AACpF,MAAI,OAAO,SAAS,iBAAiB;AACpC,QAAI,OAAO,OAAO,SAAS,OAAO,MAAM,KAAM,QAAO;AACrD,QAAI,OAAO,OAAO,aAAa,OAAO,MAAM,SAAU,QAAO;AAC7D,QAAI,cAAc,OAAO,OAAO,UAAU,MAAM,cAAc,OAAO,MAAM,UAAU;AACpF,aAAO;AACR,QAAI,OAAO,OAAO,aAAa,OAAO,MAAM,YAAY,OAAO,MAAM,SAAU,QAAO;AACtF,WAAO;AAAA,EACR;AACA,MAAI,OAAO,SAAS,eAAe;AAClC,UAAM,aAAa,OAAO;AAC1B,WAAO,WAAW,YAAY,WAAW,iBAAiB,UAAa,CAAC,WAAW;AAAA,EACpF;AACA,SAAO;AACR;AAEA,SAAS,sBAAsB,MAAuB,OAAiC;AACtF,SACC,KAAK,SAAS,MAAM,QACpB,KAAK,aAAa,MAAM,YACxB,KAAK,iBAAiB,MAAM,gBAC5B,KAAK,SAAS,MAAM,QACpB,KAAK,aAAa,MAAM,YACxB,cAAc,KAAK,UAAU,MAAM,cAAc,MAAM,UAAU;AAEnE;AAEA,SAAS,cAAc,QAA0C;AAChE,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO,OAAO,KAAK,GAAG;AACvB;AAEA,SAAS,eAAe,MAAoB,OAA6B;AACxE,MAAI,KAAK,aAAa,MAAM,WAAY,QAAO;AAC/C,MAAI,KAAK,aAAa,MAAM,WAAY,QAAO;AAE/C,MAAI,KAAK,OAAO,MAAM,KAAM,QAAO;AACnC,MAAI,KAAK,OAAO,MAAM,KAAM,QAAO;AAEnC,QAAM,UAAU,WAAW,OAAO,KAAK,QAAQ,WAAW,OAAO,KAAK,QAAQ;AAC9E,QAAM,WAAW,WAAW,QAAQ,MAAM,QAAQ,WAAW,QAAQ,MAAM,QAAQ;AAEnF,MAAI,UAAU,SAAU,QAAO;AAC/B,MAAI,UAAU,SAAU,QAAO;AAC/B,SAAO;AACR;;;AD5JO,SAAS,kBACf,UACA,SACA,MACqB;AACrB,QAAM,KAAe,CAAC;AACtB,QAAM,OAAiB,CAAC;AAExB,aAAW,UAAU,KAAK,SAAS;AAClC,QAAI,OAAO,SAAS,oBAAoB;AACvC,YAAM,gBAAgB,QAAQ,YAAY,OAAO,UAAU;AAC3D,UAAI,CAAC,cAAe;AACpB,SAAG,KAAK,OAAG,0BAAY,OAAO,YAAY,aAAa,CAAC;AACxD,WAAK,KAAK,GAAG,yBAAyB,OAAO,UAAU,CAAC;AAAA,IACzD;AAEA,QAAI,OAAO,SAAS,sBAAsB;AACzC,YAAM,gBAAgB,SAAS,YAAY,OAAO,UAAU;AAC5D,SAAG,KAAK,GAAG,yBAAyB,OAAO,UAAU,CAAC;AACtD,UAAI,eAAe;AAClB,aAAK,KAAK,OAAG,0BAAY,OAAO,YAAY,aAAa,CAAC;AAAA,MAC3D;AAAA,IACD;AAAA,EACD;AAEA,QAAM,qBAAqB,sBAAsB,IAAI,EAAE;AAAA,IACtD,CAAC,eACA,cAAc,SAAS,eACvB,cAAc,QAAQ,eACtB,KAAK,QAAQ;AAAA,MACZ,CAAC,WACA,OAAO,eAAe,eACrB,OAAO,SAAS,iBAChB,OAAO,SAAS,mBAChB,OAAO,SAAS,mBAChB,OAAO,SAAS,iBAChB,OAAO,SAAS;AAAA,IACnB;AAAA,EACF;AAEA,aAAW,cAAc,oBAAoB;AAC5C,UAAM,cAAc,SAAS,YAAY,UAAU;AACnD,UAAM,aAAa,QAAQ,YAAY,UAAU;AACjD,QAAI,CAAC,eAAe,CAAC,WAAY;AAEjC,0BAAsB,YAAY,aAAa,UAAU;AAEzD,OAAG,KAAK,GAAG,0BAA0B,YAAY,aAAa,UAAU,CAAC;AACzE,SAAK,KAAK,GAAG,0BAA0B,YAAY,YAAY,WAAW,CAAC;AAAA,EAC5E;AAEA,OAAK,QAAQ;AAEb,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA,SAAS,KAAK,QAAQ,IAAI,YAAY;AAAA,IACtC,yBAAyB,KAAK;AAAA,EAC/B;AACD;AAEA,SAAS,0BACR,YACA,MACA,IACW;AACX,QAAM,QAAQ,gBAAgB,UAAU;AACxC,QAAM,YAAY,gBAAgB,aAAa,UAAU,MAAM;AAE/D,QAAM,gBAAgB;AAAA,IACrB;AAAA,IACA,GAAG,OAAO,QAAQ,GAAG,MAAM,EAAE,IAAI,CAAC,CAAC,OAAO,UAAU,MAAM,iBAAiB,OAAO,UAAU,CAAC;AAAA,IAC7F;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAEA,QAAM,aAAuB,CAAC;AAC9B,aAAW,KAAK,gBAAgB,SAAS;AAAA,IAAS,cAAc,KAAK,OAAO,CAAC;AAAA,EAAK;AAElF,QAAM,WAAW,OAAO,KAAK,GAAG,MAAM;AACtC,QAAM,UAAU,CAAC,MAAM,GAAG,UAAU,eAAe,eAAe,UAAU;AAC5E,QAAM,oBAAoB,QAAQ;AAAA,IAAI,CAAC,WACtC,oBAAoB,QAAQ,KAAK,QAAQ,GAAG,OAAO,MAAM,KAAK,IAAI;AAAA,EACnE;AAEA,aAAW;AAAA,IACV,eAAe,SAAS,KAAK,QAAQ,IAAI,eAAe,EAAE,KAAK,IAAI,CAAC,YAAY,kBAAkB,KAAK,IAAI,CAAC,SAAS,KAAK;AAAA,EAC3H;AACA,aAAW,KAAK,cAAc,KAAK,EAAE;AACrC,aAAW,KAAK,eAAe,SAAS,cAAc,KAAK,EAAE;AAE7D,aAAW,cAAc,GAAG,SAAS;AACpC,eAAW;AAAA,MACV,kCAAkC,UAAU,IAAI,UAAU,OAAO,KAAK,KAAK,gBAAgB,UAAU,CAAC;AAAA,IACvG;AAAA,EACD;AAEA,SAAO;AACR;AAEA,SAAS,sBACR,YACA,MACA,IACO;AACP,aAAW,CAAC,WAAW,UAAU,KAAK,OAAO,QAAQ,GAAG,MAAM,GAAG;AAChE,QAAI,aAAa,KAAK,OAAQ;AAC9B,QAAI,WAAW,YAAY,WAAW,iBAAiB,UAAa,CAAC,WAAW,MAAM;AACrF,YAAM,IAAI;AAAA,QACT,mCAAmC,UAAU,4BAA4B,SAAS;AAAA,MACnF;AAAA,IACD;AAAA,EACD;AAEA,aAAW,CAAC,WAAW,gBAAgB,KAAK,OAAO,QAAQ,GAAG,MAAM,GAAG;AACtE,UAAM,mBAAmB,KAAK,OAAO,SAAS;AAC9C,QAAI,CAAC,iBAAkB;AACvB,QAAI,kBAAkB,kBAAkB,gBAAgB,EAAG;AAE3D,QACC,iBAAiB,YACjB,iBAAiB,iBAAiB,UAClC,CAAC,iBAAiB,MACjB;AACD,YAAM,IAAI;AAAA,QACT,mCAAmC,UAAU,8BAA8B,SAAS,UAAU,iBAAiB,IAAI,OAAO,iBAAiB,IAAI;AAAA,MAChJ;AAAA,IACD;AAAA,EACD;AACD;AAEA,SAAS,oBACR,QACA,YACA,kBACS;AACT,MACC,WAAW,QACX,WAAW,iBACX,WAAW,iBACX,WAAW,YACV;AACD,WAAO,gBAAgB,MAAM;AAAA,EAC9B;AAEA,QAAM,mBAAmB,WAAW,MAAM;AAC1C,MAAI,oBAAoB,kBAAkB;AACzC,WAAO,4BAA4B,QAAQ,kBAAkB,gBAAgB;AAAA,EAC9E;AAEA,MAAI,kBAAkB;AACrB,WAAO,gBAAgB,MAAM;AAAA,EAC9B;AAEA,MAAI,CAAC,kBAAkB;AACtB,WAAO;AAAA,EACR;AAEA,MAAI,iBAAiB,QAAQ,iBAAiB,SAAS,aAAa;AACnE,WAAO;AAAA,EACR;AAEA,MAAI,iBAAiB,iBAAiB,QAAW;AAChD,WAAO,WAAW,iBAAiB,YAAY;AAAA,EAChD;AAEA,SAAO;AACR;AAEA,SAAS,4BACR,QACA,QACA,QACS;AACT,QAAM,eAAe,gBAAgB,MAAM;AAC3C,MAAI,OAAO,SAAS,OAAO,QAAQ,OAAO,aAAa,OAAO,UAAU;AACvE,QAAI,OAAO,SAAS,UAAU,OAAO,cAAc,OAAO,WAAW,SAAS,GAAG;AAChF,YAAM,UAAU,OAAO,WAAW,IAAI,CAAC,UAAU,WAAW,KAAK,CAAC,EAAE,KAAK,IAAI;AAC7E,YAAM,WACL,OAAO,iBAAiB,SAAY,WAAW,OAAO,YAAY,IAAI;AACvE,aAAO,aAAa,YAAY,QAAQ,OAAO,UAAU,YAAY,SAAS,QAAQ;AAAA,IACvF;AACA,WAAO;AAAA,EACR;AAEA,MAAI,OAAO,SAAS,UAAU;AAC7B,WAAO,QAAQ,YAAY;AAAA,EAC5B;AAEA,MAAI,OAAO,SAAS,YAAY,OAAO,SAAS,aAAa;AAC5D,QACC,OAAO,SAAS,YAChB,OAAO,SAAS,UAChB,OAAO,SAAS,YAChB,OAAO,SAAS,eAChB,OAAO,SAAS,WACf;AACD,YAAM,WAAW,OAAO,SAAS,WAAW,SAAS;AACrD,aAAO,aAAa,YAAY,gCAAgC,YAAY,OAAO,QAAQ;AAAA,IAC5F;AAAA,EACD;AAEA,MAAI,OAAO,SAAS,WAAW;AAC9B,QAAI,OAAO,SAAS,YAAY,OAAO,SAAS,eAAe,OAAO,SAAS,WAAW;AACzF,aAAO,aAAa,YAAY,gCAAgC,YAAY;AAAA,IAC7E;AAEA,QAAI,OAAO,SAAS,YAAY,OAAO,SAAS,QAAQ;AACvD,aAAO,aAAa,YAAY,2CAA2C,YAAY,8EAA8E,YAAY,+DAA+D,mBAAmB,MAAM,CAAC;AAAA,IAC3Q;AAAA,EACD;AAEA,MAAI,OAAO,SAAS,UAAU,OAAO,cAAc,OAAO,WAAW,SAAS,GAAG;AAChF,QAAI,OAAO,SAAS,YAAY,OAAO,SAAS,QAAQ;AACvD,YAAM,UAAU,OAAO,WAAW,IAAI,CAAC,UAAU,WAAW,KAAK,CAAC,EAAE,KAAK,IAAI;AAC7E,aAAO,aAAa,YAAY,QAAQ,OAAO,UAAU,YAAY,SAAS,mBAAmB,MAAM,CAAC;AAAA,IACzG;AAAA,EACD;AAEA,MAAI,OAAO,SAAS,WAAW,OAAO,SAAS,WAAW,OAAO,aAAa,OAAO,UAAU;AAC9F,WAAO;AAAA,EACR;AAEA,MAAI,OAAO,QAAQ,OAAO,SAAS,aAAa;AAC/C,WAAO;AAAA,EACR;AAEA,SAAO,mBAAmB,MAAM;AACjC;AAEA,SAAS,kBAAkB,QAAyB,QAAkC;AACrF,MAAI,OAAO,SAAS,OAAO,QAAQ,OAAO,aAAa,OAAO,UAAU;AACvE,WAAO;AAAA,EACR;AAEA,MAAI,OAAO,SAAS,UAAU;AAC7B,WAAO;AAAA,EACR;AAEA,MAAI,OAAO,SAAS,YAAY,OAAO,SAAS,aAAa;AAC5D,WACC,OAAO,SAAS,YAChB,OAAO,SAAS,UAChB,OAAO,SAAS,YAChB,OAAO,SAAS,eAChB,OAAO,SAAS;AAAA,EAElB;AAEA,MAAI,OAAO,SAAS,WAAW;AAC9B,WACC,OAAO,SAAS,YAChB,OAAO,SAAS,eAChB,OAAO,SAAS,aAChB,OAAO,SAAS,YAChB,OAAO,SAAS;AAAA,EAElB;AAEA,MAAI,OAAO,SAAS,QAAQ;AAC3B,WAAO,OAAO,SAAS,YAAY,OAAO,SAAS;AAAA,EACpD;AAEA,MAAI,OAAO,SAAS,SAAS;AAC5B,WAAO,OAAO,SAAS,WAAW,OAAO,aAAa,OAAO;AAAA,EAC9D;AAEA,MAAI,OAAO,SAAS,YAAY;AAC/B,WAAO,OAAO,SAAS;AAAA,EACxB;AAEA,SAAO;AACR;AAEA,SAAS,mBAAmB,QAAiC;AAC5D,MAAI,OAAO,QAAQ,OAAO,SAAS,aAAa;AAC/C,WAAO;AAAA,EACR;AAEA,MAAI,OAAO,iBAAiB,QAAW;AACtC,WAAO,WAAW,OAAO,YAAY;AAAA,EACtC;AAEA,SAAO;AACR;AAEA,SAAS,yBAAyB,YAA8B;AAC/D,QAAM,QAAQ,gBAAgB,UAAU;AACxC,QAAM,WAAW,gBAAgB,aAAa,UAAU,EAAE;AAC1D,SAAO,CAAC,wBAAwB,KAAK,IAAI,wBAAwB,QAAQ,EAAE;AAC5E;AAEA,SAAS,iBAAiB,WAAmB,YAAqC;AACjF,QAAM,UAAU,aAAa,UAAU;AACvC,QAAM,QAAQ,CAAC,gBAAgB,SAAS,GAAG,OAAO;AAElD,MAAI,WAAW,YAAY,WAAW,iBAAiB,UAAa,CAAC,WAAW,MAAM;AACrF,UAAM,KAAK,UAAU;AAAA,EACtB;AAEA,MAAI,WAAW,iBAAiB,QAAW;AAC1C,UAAM,KAAK,WAAW,WAAW,WAAW,YAAY,CAAC,EAAE;AAAA,EAC5D;AAEA,MAAI,WAAW,SAAS,UAAU,WAAW,YAAY;AACxD,UAAM,SAAS,WAAW,WAAW,IAAI,CAAC,UAAU,WAAW,KAAK,CAAC,EAAE,KAAK,IAAI;AAChF,UAAM,KAAK,UAAU,gBAAgB,SAAS,CAAC,QAAQ,MAAM,IAAI;AAAA,EAClE;AAEA,SAAO,MAAM,KAAK,GAAG;AACtB;AAEA,SAAS,aAAa,YAAqC;AAC1D,UAAQ,WAAW,MAAM;AAAA,IACxB,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,EACT;AACD;AAEA,SAAS,WAAW,OAAwB;AAC3C,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,OAAO,UAAU,SAAU,QAAO,OAAO,KAAK;AAClD,MAAI,OAAO,UAAU,UAAW,QAAO,QAAQ,MAAM;AACrD,MAAI,OAAO,UAAU,SAAU,QAAO,IAAI,MAAM,WAAW,KAAK,IAAI,CAAC;AACrE,SAAO,IAAI,KAAK,UAAU,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;AACvD;AAEA,SAAS,gBAAgB,YAA4B;AACpD,MAAI,CAAC,2BAA2B,KAAK,UAAU,GAAG;AACjD,UAAM,IAAI,MAAM,2BAA2B,UAAU,EAAE;AAAA,EACxD;AACA,SAAO;AACR;AAEA,SAAS,aAAa,QAA+C;AACpE,UAAQ,OAAO,MAAM;AAAA,IACpB,KAAK;AACJ,aAAO,gBAAgB,OAAO,UAAU;AAAA,IACzC,KAAK;AACJ,aAAO,gBAAgB,OAAO,UAAU;AAAA,IACzC,KAAK;AACJ,aAAO,KAAK,OAAO,UAAU,IAAI,OAAO,KAAK;AAAA,IAC9C,KAAK;AACJ,aAAO,KAAK,OAAO,UAAU,IAAI,OAAO,KAAK;AAAA,IAC9C,KAAK;AACJ,aAAO,KAAK,OAAO,UAAU,IAAI,OAAO,KAAK;AAAA,IAC9C,KAAK;AACJ,aAAO,WAAW,OAAO,UAAU,IAAI,OAAO,KAAK;AAAA,IACpD,KAAK;AACJ,aAAO,WAAW,OAAO,UAAU,IAAI,OAAO,KAAK;AAAA,EACrD;AACD;;;AE3XA,IAAAC,eAAA;AAgCO,IAAM,sBAAN,cAAkC,MAAM;AAAA,EAC9C,YACC,SACgB,SACA,QACf;AACD,UAAM,OAAO;AAHG;AACA;AAGhB,SAAK,OAAO;AAAA,EACb;AAAA,EALiB;AAAA,EACA;AAKlB;AAKA,eAAsB,aAAa,SAA2D;AAC7F,QAAM,SAA6B,EAAE,UAAU,CAAC,EAAE;AAClD,QAAM,cAAc,QAAQ,eAAe,aAAa,KAAK,IAAI,CAAC;AAClE,QAAM,cAAc,QAAQ,eAAe;AAC3C,QAAM,YAAY,QAAQ,aAAa;AAEvC,MAAI,QAAQ,YAAY;AACvB,QAAI;AACH,YAAM,eAAe,MAAM;AAAA,QAC1B,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,QAAQ;AAAA,MACT;AACA,aAAO,SAAS,KAAK,YAAY;AAAA,IAClC,SAAS,OAAO;AACf,YAAM,IAAI,oBAAqB,MAAgB,SAAS,UAAU,MAAM;AAAA,IACzE;AAAA,EACD;AAEA,MAAI,QAAQ,0BAA0B;AACrC,QAAI;AACH,YAAM,iBAAiB,MAAM;AAAA,QAC5B,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACT;AACA,aAAO,SAAS,KAAK,cAAc;AAAA,IACpC,SAAS,OAAO;AACf,YAAM,IAAI,oBAAqB,MAAgB,SAAS,YAAY,MAAM;AAAA,IAC3E;AAAA,EACD;AAEA,SAAO;AACR;AAEA,eAAe,mBACd,MACA,YACA,aACA,aACA,WACA,aACA,gBAC8B;AAC9B,QAAM,SAAS,kBAAmB,MAAM,iBAAiB,WAAW;AACpE,QAAM,KAAK,OAAO,KAAK,IAAI;AAC3B,MAAI,oBAAoB;AAExB,MAAI;AACH,OAAG,KAAK,OAAO;AACf,OAAG;AAAA,MACF;AAAA,IACD;AACA,UAAM,iBACL,OAAO,GAAG,uBAAuB,aAAa,GAAG,mBAAmB,WAAW,IAAI;AACpF,QAAI,gBAAgB;AACnB,SAAG,KAAK,QAAQ;AAChB,aAAO;AAAA,QACN,SAAS;AAAA,QACT,mBAAmB;AAAA,QACnB,iBAAiB;AAAA,QACjB,SAAS;AAAA,MACV;AAAA,IACD;AACA,eAAW,aAAa,YAAY;AACnC,SAAG,KAAK,SAAS;AACjB;AAAA,IACD;AACA,OAAG;AAAA,MACF,8FAA8FC,YAAW,WAAW,CAAC,KAAK,WAAW,KAAK,SAAS,KAAK,KAAK,IAAI,CAAC;AAAA,IACnK;AACA,OAAG,KAAK,QAAQ;AAEhB,WAAO;AAAA,MACN,SAAS;AAAA,MACT;AAAA,MACA,iBAAiB;AAAA,MACjB,SAAS;AAAA,IACV;AAAA,EACD,SAAS,OAAO;AACf,QAAI;AACH,SAAG,KAAK,UAAU;AAAA,IACnB,QAAQ;AAAA,IAER;AACA,UAAM;AAAA,EACP,UAAE;AACD,QAAI,OAAO,GAAG,UAAU,YAAY;AACnC,SAAG,MAAM;AAAA,IACV;AAAA,EACD;AACD;AAEA,eAAe,iBAAiB,aAM7B;AACF,MAAI;AACH,UAAM,EAAE,cAAc,IAAI,MAAM,OAAO,QAAa;AACpD,UAAM,cAAc,cAAc,cAAc,GAAG,WAAW,kBAAkBD,aAAY,GAAG;AAC/F,UAAM,WAAW,YAAY,gBAAgB;AAU7C,WAAO;AAAA,MACN,KAAK,MAAc;AAClB,cAAM,KAAK,IAAI,SAAS,IAAI;AAC5B,eAAO;AAAA,UACN,KAAK,KAAa;AACjB,eAAG,KAAK,GAAG;AAAA,UACZ;AAAA,UACA,mBAAmB,IAAY;AAC9B,kBAAM,MAAM,GACV,QAAQ,6DAA6D,EACrE,IAAI,EAAE;AACR,oBAAQ,KAAK,SAAS,KAAK;AAAA,UAC5B;AAAA,UACA,QAAQ;AACP,eAAG,MAAM;AAAA,UACV;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD,QAAQ;AACP,UAAM,IAAI;AAAA,MACT;AAAA,IACD;AAAA,EACD;AACD;AAEA,eAAe,qBACd,kBACA,YACA,aACA,aACA,WACA,uBAC8B;AAC9B,QAAM,MACL,OAAO,0BAA0B,aAC9B,sBAAsB,gBAAgB,KACrC,MAAM,mBAAmB,GAAG,QAAQ,gBAAgB;AACzD,MAAI,oBAAoB;AAExB,MAAI;AACH,UAAM,IAAI,OAAO,OAAO;AACxB,UAAM,IAAI;AAAA,MACT;AAAA,IACD;AACA,UAAM,WAAY,MAAM,IAAI;AAAA,MAC3B,kEAAkEC,YAAW,WAAW,CAAC;AAAA,IAC1F;AACA,SAAK,SAAS,CAAC,GAAG,SAAS,KAAK,GAAG;AAClC,YAAM,IAAI,OAAO,QAAQ;AACzB,aAAO;AAAA,QACN,SAAS;AAAA,QACT,mBAAmB;AAAA,QACnB,iBAAiB;AAAA,QACjB,SAAS;AAAA,MACV;AAAA,IACD;AACA,eAAW,aAAa,YAAY;AACnC,YAAM,IAAI,OAAO,SAAS;AAC1B;AAAA,IACD;AACA,UAAM,IAAI;AAAA,MACT,mFAAmFA,YAAW,WAAW,CAAC,KAAK,WAAW,KAAK,SAAS,KAAK,KAAK,IAAI,CAAC;AAAA,IACxJ;AACA,UAAM,IAAI,OAAO,QAAQ;AAEzB,WAAO;AAAA,MACN,SAAS;AAAA,MACT;AAAA,MACA,iBAAiB;AAAA,MACjB,SAAS;AAAA,IACV;AAAA,EACD,SAAS,OAAO;AACf,QAAI;AACH,YAAM,IAAI,OAAO,UAAU;AAAA,IAC5B,QAAQ;AAAA,IAER;AACA,UAAM;AAAA,EACP,UAAE;AACD,QAAI,OAAO,IAAI,QAAQ,YAAY;AAClC,YAAM,IAAI,IAAI;AAAA,IACf;AAAA,EACD;AACD;AAEA,SAASA,YAAW,OAAuB;AAC1C,SAAO,IAAI,MAAM,WAAW,KAAK,IAAI,CAAC;AACvC;AAEA,eAAe,qBAKZ;AACF,MAAI;AACH,UAAM,gBAAgB,IAAI,SAAS,aAAa,0BAA0B;AAG1E,UAAM,MAAM,MAAM,cAAc,UAAU;AAC1C,QAAI,OAAO,QAAQ,YAAY,QAAQ,QAAQ,aAAa,KAAK;AAChE,aAAO;AAAA,IAMR;AACA,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC1C,QAAQ;AACP,UAAM,IAAI;AAAA,MACT;AAAA,IACD;AAAA,EACD;AACD;;;ACtRO,SAAS,iCAAiC,aAAqB,WAA2B;AAChG,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA,uCAAuC,WAAW,YAAO,SAAS;AAAA,IAClE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,oBAAoB,WAAW;AAAA,IAC/B,kBAAkB,SAAS;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,EAAE,KAAK,IAAI;AACZ;;;AJTA,IAAM,gBAAgB;AACtB,IAAM,iBAAiB;AAehB,IAAM,qBAAiB,6BAAc;AAAA,EAC3C,MAAM;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,EACd;AAAA,EACA,MAAM;AAAA,IACL,OAAO;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACV;AAAA,IACA,QAAQ;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IACd;AAAA,IACA,IAAI;AAAA,MACH,MAAM;AAAA,MACN,aAAa;AAAA,IACd;AAAA,IACA,cAAc;AAAA,MACb,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACV;AAAA,IACA,WAAW;AAAA,MACV,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACV;AAAA,IACA,OAAO;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACV;AAAA,EACD;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AACnB,UAAM,SAAS,aAAa;AAE5B,UAAM,cAAc,MAAM,gBAAgB;AAC1C,QAAI,CAAC,aAAa;AACjB,YAAM,IAAI,oBAAoB,QAAQ,IAAI,CAAC;AAAA,IAC5C;AAEA,UAAM,SAAS,MAAM,eAAe,WAAW;AAC/C,UAAM,qBACL,OAAO,KAAK,WAAW,eACpB,4BAAQ,aAAa,KAAK,MAAM,IAChC,OAAO,QAAQ,WAAW,eACzB,4BAAQ,aAAa,OAAO,MAAM,IAClC,MAAM,eAAe,WAAW;AAErC,QAAI,CAAC,oBAAoB;AACxB,YAAM,IAAI,oBAAoB,CAAC,iBAAiB,aAAa,iBAAiB,WAAW,CAAC;AAAA,IAC3F;AAEA,UAAM,gBAAgB,MAAM,qBAAqB,oBAAoB,WAAW;AAEhF,UAAM,mBAAe,yBAAK,aAAa,aAAa;AACpD,UAAM,iBAAiB,MAAM,mBAAmB,YAAY;AAE5D,QAAI,CAAC,gBAAgB;AACpB,UAAI,KAAK,SAAS,MAAM,MAAM;AAC7B,eAAO,KAAK,wEAAwE;AACpF;AAAA,MACD;AAEA,YAAM,oBAAoB,cAAc,aAAa;AACrD,aAAO,QAAQ,kCAAkC,YAAY,EAAE;AAC/D,aAAO,KAAK,uEAAuE;AACnF;AAAA,IACD;AAEA,UAAM,OAAO,YAAY,gBAAgB,aAAa;AACtD,UAAM,YACL,OAAO,KAAK,YAAY,MAAM,eAC3B,4BAAQ,aAAa,KAAK,YAAY,CAAC,QACvC,4BAAQ,aAAa,cAAc;AAEvC,QAAI,CAAC,KAAK,YAAY;AACrB,aAAO,QAAQ,6BAA6B;AAC5C,UAAI,KAAK,UAAU,MAAM;AACxB,cAAM,aAAa,uBAAuB,KAAK,IAAI,aAAa,MAAM;AACtE,cAAM,2BAA2B,gCAAgC,MAAM;AACvE,cAAM,UAAU,MAAM,uBAAuB,SAAS;AAEtD,YAAI,QAAQ,WAAW,GAAG;AACzB,iBAAO,KAAK,oCAAoC;AAChD;AAAA,QACD;AAEA,mBAAW,YAAY,SAAS;AAC/B,gBAAM,SAAS,MAAM,aAAa;AAAA,YACjC,cAAc,SAAS;AAAA,YACvB,aAAa,SAAS;AAAA,YACtB,aAAa,SAAS;AAAA,YACtB,WAAW,SAAS;AAAA,YACpB;AAAA,YACA;AAAA,YACA;AAAA,UACD,CAAC;AAED,qBAAW,WAAW,OAAO,UAAU;AACtC,mBAAO;AAAA,cACN,KAAK,SAAS,EAAE,OAAO,QAAQ,OAAO,aAAa,QAAQ,iBAAiB,aAAa,QAAQ,OAAO;AAAA,YACzG;AAAA,UACD;AAAA,QACD;AAAA,MACD;AACA;AAAA,IACD;AAEA,UAAM,YAAY,kBAAkB,gBAAgB,eAAe,IAAI;AAEvE,WAAO,OAAO;AACd,WAAO,KAAK,4BAA4B,KAAK,WAAW,YAAO,KAAK,SAAS,EAAE;AAC/E,WAAO,MAAM;AACb,WAAO,KAAK,UAAU;AACtB,eAAW,QAAQ,UAAU,SAAS;AACrC,aAAO,KAAK,KAAK,IAAI,EAAE;AAAA,IACxB;AAEA,QAAI,KAAK,sBAAsB,KAAK,SAAS,MAAM,MAAM;AACxD,aAAO,MAAM;AACb,aAAO,KAAK,mCAAmC;AAC/C,YAAM,iBAAiB,MAAM,uBAAuB,KAAK,UAAU,IAAI;AACvE,UAAI,CAAC,gBAAgB;AACpB,eAAO,KAAK,+BAA+B;AAC3C;AAAA,MACD;AAAA,IACD;AAEA,QAAI,KAAK,SAAS,MAAM,MAAM;AAC7B,aAAO,MAAM;AACb,aAAO,KAAK,2DAA2D;AACvE;AAAA,IACD;AAEA,cAAM,yBAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAE1C,UAAM,gBAAgB,MAAM;AAAA,MAC3B;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AAAA,IACD;AACA,UAAM,oBAAoB,cAAc,aAAa;AAErD,WAAO,MAAM;AACb,WAAO,QAAQ,wBAAwB,aAAa,EAAE;AAEtD,QAAI,KAAK,UAAU,MAAM;AACxB,YAAM,aAAa,uBAAuB,KAAK,IAAI,aAAa,MAAM;AACtE,YAAM,2BAA2B,gCAAgC,MAAM;AACvE,YAAM,UAAU,MAAM,uBAAuB,SAAS;AAEtD,iBAAW,YAAY,SAAS;AAC/B,cAAM,SAAS,MAAM,aAAa;AAAA,UACjC,cAAc,SAAS;AAAA,UACvB,aAAa,SAAS;AAAA,UACtB,aAAa,SAAS;AAAA,UACtB,WAAW,SAAS;AAAA,UACpB;AAAA,UACA;AAAA,UACA;AAAA,QACD,CAAC;AAED,mBAAW,WAAW,OAAO,UAAU;AACtC,iBAAO;AAAA,YACN,KAAK,SAAS,EAAE,OAAO,QAAQ,OAAO,aAAa,QAAQ,iBAAiB,aAAa,QAAQ,OAAO,aAAa,QAAQ,eAAe;AAAA,UAC7I;AAAA,QACD;AAAA,MACD;AAEA,aAAO,QAAQ,0CAA0C;AAAA,IAC1D;AAAA,EACD;AACD,CAAC;AAED,eAAe,mBAAmB,MAAgD;AACjF,MAAI;AACH,UAAM,UAAU,UAAM,4BAAS,MAAM,OAAO;AAC5C,WAAO,KAAK,MAAM,OAAO;AAAA,EAC1B,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AAEA,eAAe,uBAAuB,OAAkC;AACvE,MAAI,OAAO;AACV,WAAO;AAAA,EACR;AAEA,MAAI,CAACC,uBAAsB,GAAG;AAC7B,UAAM,IAAI;AAAA,MACT;AAAA,IACD;AAAA,EACD;AAEA,SAAO,MAAM,cAAc,+CAA+C,KAAK;AAChF;AAEA,SAASA,yBAAiC;AACzC,SAAO,QAAQ,MAAM,UAAU,QAAQ,QAAQ,OAAO,UAAU;AACjE;AAEA,eAAe,oBAAoB,MAAc,QAAyC;AACzF,YAAM,6BAAM,4BAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9C,YAAM,6BAAU,MAAM,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,GAAM,OAAO;AACtE;AAEA,eAAe,mBACd,WACA,aACA,WACA,WACkB;AAClB,QAAM,WAAW,UAAM,2BAAQ,SAAS,EAAE,MAAM,MAAM,CAAC,CAAC;AACxD,QAAM,WAAW,SAAS,OAAO,CAAC,SAAS,UAAU,KAAK,IAAI,CAAC,EAAE,SAAS;AAC1E,QAAM,WAAW,GAAG,OAAO,QAAQ,EAAE,SAAS,GAAG,GAAG,CAAC,KAAK,WAAW,QAAQ,SAAS;AACtF,QAAM,WAAO,yBAAK,WAAW,QAAQ;AACrC,QAAM,cAAc,SAAS,QAAQ,SAAS,EAAE;AAEhD,QAAM,cAAc;AAAA,IACnB,qBAAqB,KAAK,UAAU,UAAU,IAAI,MAAM,CAAC,CAAC;AAAA,IAC1D;AAAA,IACA,uBAAuB,KAAK,UAAU,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,IAC9D;AAAA,IACA,0BAA0B,KAAK,UAAU,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,IACpE;AAAA,IACA,0CAA0C,UAAU,uBAAuB;AAAA,IAC3E;AAAA,EACD,EAAE,KAAK,IAAI;AAEX,YAAM,6BAAU,MAAM,aAAa,OAAO;AAE1C,QAAM,qBAAiB,yBAAK,WAAW,GAAG,WAAW,gBAAgB;AACrE,YAAM,6BAAU,gBAAgB,iCAAiC,aAAa,SAAS,GAAG,OAAO;AACjG,QAAM,2BAAuB,yBAAK,WAAW,GAAG,WAAW,OAAO,GAAG;AAAA,IACpE,IAAI;AAAA,IACJ;AAAA,IACA;AAAA,IACA,IAAI,UAAU;AAAA,IACd,MAAM,UAAU;AAAA,IAChB,SAAS,UAAU;AAAA,IACnB,yBAAyB,UAAU;AAAA,EACpC,CAAC;AACD,SAAO;AACR;AAEA,eAAe,uBAAuB,MAAc,UAA4C;AAC/F,YAAM,6BAAU,MAAM,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,GAAM,OAAO;AACxE;AAEA,eAAe,uBAAuB,WAAiD;AACtF,QAAM,QAAQ,UAAM,2BAAQ,SAAS,EAAE,MAAM,MAAM,CAAC,CAAC;AACrD,QAAM,iBAAiB,MACrB,OAAO,CAAC,SAAS,iBAAiB,KAAK,IAAI,CAAC,EAC5C,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC;AAEjD,QAAM,YAAiC,CAAC;AACxC,aAAW,QAAQ,gBAAgB;AAClC,UAAM,KAAK,KAAK,QAAQ,SAAS,EAAE;AACnC,UAAM,mBAAe,yBAAK,WAAW,GAAG,EAAE,OAAO;AACjD,UAAM,eAAe,MAAM,sBAAsB,YAAY;AAE7D,QAAI,cAAc;AACjB,gBAAU,KAAK,EAAE,GAAG,cAAc,GAAG,CAAC;AACtC;AAAA,IACD;AAEA,UAAM,oBAAgB,yBAAK,WAAW,IAAI;AAC1C,UAAM,iBAAiB,MAAM,gCAAgC,eAAe,EAAE;AAC9E,cAAU,KAAK,cAAc;AAAA,EAC9B;AAEA,SAAO;AACR;AAEA,eAAe,sBAAsB,MAAiD;AACrF,MAAI;AACH,UAAM,UAAU,UAAM,4BAAS,MAAM,OAAO;AAC5C,WAAO,KAAK,MAAM,OAAO;AAAA,EAC1B,SAAS,OAAO;AACf,UAAM,OAAQ,MAAgC;AAC9C,QAAI,SAAS,UAAU;AACtB,aAAO;AAAA,IACR;AACA,UAAM;AAAA,EACP;AACD;AAEA,eAAe,gCACd,MACA,IAC6B;AAC7B,QAAM,UAAU,UAAM,4BAAS,MAAM,OAAO;AAC5C,QAAM,WAAW,6BAA6B,EAAE;AAEhD,SAAO;AAAA,IACN;AAAA,IACA,aAAa,SAAS;AAAA,IACtB,WAAW,SAAS;AAAA,IACpB,IAAI,uBAAuB,SAAS,IAAI;AAAA,IACxC,MAAM,uBAAuB,SAAS,MAAM;AAAA,IAC5C,SAAS,uBAAuB,SAAS,SAAS;AAAA,IAClD,yBAAyB,mBAAmB,SAAS,yBAAyB;AAAA,EAC/E;AACD;AAEA,SAAS,6BAA6B,IAAwD;AAC7F,QAAM,QAAQ,GAAG,MAAM,oBAAoB;AAC3C,MAAI,CAAC,OAAO;AACX,UAAM,IAAI,MAAM,iBAAiB,EAAE,+CAA+C;AAAA,EACnF;AAEA,QAAM,kBAAkB,MAAM,CAAC;AAC/B,QAAM,gBAAgB,MAAM,CAAC;AAC7B,MAAI,oBAAoB,UAAa,kBAAkB,QAAW;AACjE,UAAM,IAAI,MAAM,iBAAiB,EAAE,+CAA+C;AAAA,EACnF;AAEA,SAAO;AAAA,IACN,aAAa,OAAO,SAAS,iBAAiB,EAAE;AAAA,IAChD,WAAW,OAAO,SAAS,eAAe,EAAE;AAAA,EAC7C;AACD;AAEA,SAAS,uBAAuB,QAAgB,YAAiD;AAChG,QAAM,aAAa,sBAAsB,QAAQ,UAAU;AAC3D,QAAM,SAAS,KAAK,MAAM,UAAU;AACpC,MAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,KAAK,CAAC,SAAS,OAAO,SAAS,QAAQ,GAAG;AAC9E,UAAM,IAAI,MAAM,qBAAqB,UAAU,2BAA2B;AAAA,EAC3E;AAEA,SAAO;AACR;AAEA,SAAS,mBAAmB,QAAgB,YAAgD;AAC3F,QAAM,aAAa,mBAAmB,QAAQ,UAAU;AACxD,MAAI,eAAe,OAAQ,QAAO;AAClC,MAAI,eAAe,QAAS,QAAO;AACnC,QAAM,IAAI,MAAM,qBAAqB,UAAU,8BAA8B;AAC9E;AAEA,SAAS,sBAAsB,QAAgB,YAA4B;AAC1E,QAAM,cAAc,WAAW,QAAQ,uBAAuB,MAAM;AACpE,QAAM,QAAQ,IAAI,OAAO,gBAAgB,WAAW,0BAA0B;AAC9E,QAAM,QAAQ,OAAO,MAAM,KAAK;AAChC,MAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG;AACxB,UAAM,IAAI,MAAM,oCAAoC,UAAU,IAAI;AAAA,EACnE;AAEA,SAAO,MAAM,CAAC,EAAE,KAAK;AACtB;AAEA,SAAS,mBAAmB,QAAgB,YAA4B;AACvE,QAAM,cAAc,WAAW,QAAQ,uBAAuB,MAAM;AACpE,QAAM,QAAQ,IAAI,OAAO,gBAAgB,WAAW;AAAA,MAAe;AACnE,QAAM,QAAQ,OAAO,MAAM,KAAK;AAChC,MAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG;AACxB,UAAM,IAAI,MAAM,oCAAoC,UAAU,IAAI;AAAA,EACnE;AAEA,SAAO,MAAM,CAAC,EAAE,KAAK;AACtB;AAEA,SAAS,uBACR,OACA,aACA,QACqB;AACrB,MAAI,OAAO,UAAU,UAAU;AAC9B,eAAO,4BAAQ,aAAa,KAAK;AAAA,EAClC;AAEA,QAAM,OAAO,QAAQ,KAAK;AAC1B,MAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC9C,QAAI,KAAK,UAAU,UAAU;AAC5B,iBAAO,yBAAK,aAAa,cAAc;AAAA,IACxC;AACA,QAAI,OAAO,KAAK,UAAU,YAAY,KAAK,UAAU,QAAQ,KAAK,MAAM,SAAS,UAAU;AAC1F,UAAI,OAAO,KAAK,MAAM,aAAa,YAAY,KAAK,MAAM,SAAS,SAAS,GAAG;AAC9E,mBAAO,4BAAQ,aAAa,KAAK,MAAM,QAAQ;AAAA,MAChD;AACA,iBAAO,yBAAK,aAAa,cAAc;AAAA,IACxC;AAAA,EACD;AAEA,SAAO;AACR;AAEA,SAAS,gCACR,QACqB;AACrB,QAAM,OAAO,QAAQ,KAAK;AAC1B,MAAI,OAAO,SAAS,YAAY,SAAS,KAAM,QAAO;AAEtD,MAAI,KAAK,UAAU,YAAY;AAC9B,WAAO,QAAQ,IAAI;AAAA,EACpB;AAEA,MAAI,OAAO,KAAK,UAAU,YAAY,KAAK,UAAU,QAAQ,KAAK,MAAM,SAAS,YAAY;AAC5F,WAAO,KAAK,MAAM;AAAA,EACnB;AAEA,SAAO;AACR;;;AKrbA,IAAAC,iBAA8B;AAG9B,IAAMC,qBAAoB;AAC1B,IAAMC,mBAAkB;AAqBxB,eAAe,kBAAkB,KAAa,OAA+C;AAC5F,QAAM,YAAY,GAAG,IAAI,QAAQ,OAAO,EAAE,CAAC,GAAGA,gBAAe;AAC7D,QAAM,WAAW,MAAM,MAAM,WAAW;AAAA,IACvC,SAAS,QAAQ,EAAE,eAAe,UAAU,KAAK,GAAG,IAAI;AAAA,EACzD,CAAC;AACD,MAAI,CAAC,SAAS,IAAI;AACjB,UAAM,IAAI;AAAA,MACT,+BAA+B,SAAS,KAAK,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,IACpF;AAAA,EACD;AAEA,SAAQ,MAAM,SAAS,KAAK;AAC7B;AAEA,SAAS,aAAa,IAAoB;AACzC,QAAM,UAAU,KAAK,MAAM,KAAK,GAAI;AACpC,QAAM,UAAU,KAAK,MAAM,UAAU,EAAE;AACvC,QAAM,QAAQ,KAAK,MAAM,UAAU,EAAE;AACrC,QAAM,OAAO,KAAK,MAAM,QAAQ,EAAE;AAClC,QAAM,QAAkB,CAAC;AACzB,MAAI,OAAO,EAAG,OAAM,KAAK,GAAG,IAAI,GAAG;AACnC,MAAI,QAAQ,KAAK,EAAG,OAAM,KAAK,GAAG,QAAQ,EAAE,GAAG;AAC/C,MAAI,UAAU,KAAK,EAAG,OAAM,KAAK,GAAG,UAAU,EAAE,GAAG;AACnD,QAAM,KAAK,GAAG,UAAU,EAAE,GAAG;AAC7B,SAAO,MAAM,KAAK,GAAG;AACtB;AAKO,IAAM,oBAAgB,8BAAc;AAAA,EAC1C,MAAM;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,EACd;AAAA,EACA,MAAM;AAAA,IACL,KAAK;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS,oBAAoBD,kBAAiB;AAAA,IAC/C;AAAA,IACA,OAAO;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,MACT,OAAO;AAAA,IACR;AAAA,IACA,OAAO;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,IACd;AAAA,EACD;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AACnB,UAAM,SAAS,aAAa;AAC5B,UAAM,MAAM,OAAO,KAAK,QAAQ,WAAW,KAAK,MAAM,oBAAoBA,kBAAiB;AAC3F,UAAME,SAAQ,KAAK,UAAU;AAC7B,UAAM,QACL,OAAO,KAAK,UAAU,WAAW,KAAK,QAAS,QAAQ,IAAI,oBAAoB;AAEhF,QAAI;AACH,UAAIA,QAAO;AAEV,gBAAQ,MAAM;AACd,eAAO,OAAO;AACd,eAAO,KAAK,iBAAiB,GAAG,KAAK;AAErC,cAAM,WAAW,YAAY,YAAY;AACxC,cAAI;AACH,kBAAM,SAAS,MAAM,kBAAkB,KAAK,KAAK;AACjD,wBAAY,QAAQ,KAAK,MAAM;AAAA,UAChC,QAAQ;AAAA,UAGR;AAAA,QACD,GAAG,GAAI;AAGP,YAAI;AACH,gBAAM,SAAS,MAAM,kBAAkB,KAAK,KAAK;AACjD,sBAAY,QAAQ,KAAK,MAAM;AAAA,QAChC,QAAQ;AAAA,QAER;AAGA,cAAM,IAAI,QAAQ,MAAM;AACvB,kBAAQ,GAAG,UAAU,MAAM;AAC1B,0BAAc,QAAQ;AACtB,oBAAQ,KAAK,CAAC;AAAA,UACf,CAAC;AACD,kBAAQ,GAAG,WAAW,MAAM;AAC3B,0BAAc,QAAQ;AACtB,oBAAQ,KAAK,CAAC;AAAA,UACf,CAAC;AAAA,QACF,CAAC;AAAA,MACF,OAAO;AACN,cAAM,SAAS,MAAM,kBAAkB,KAAK,KAAK;AACjD,oBAAY,QAAQ,KAAK,MAAM;AAAA,MAChC;AAAA,IACD,SAAS,OAAO;AACf,aAAO,MAAM,wBAAwB,GAAG,EAAE;AAC1C,UAAI,iBAAiB,OAAO;AAC3B,eAAO,MAAM,MAAM,OAAO;AAAA,MAC3B;AACA,aAAO,MAAM;AACb,aAAO,KAAK,4CAA4C;AACxD,aAAO,KAAK,yBAAyB;AACrC,cAAQ,KAAK,CAAC;AAAA,IACf;AAAA,EACD;AACD,CAAC;AAED,SAAS,YACR,QACA,KACA,QACO;AACP,UAAQ,MAAM;AACd,SAAO,OAAO;AACd,SAAO,KAAK,2BAAsB,GAAG,EAAE;AACvC,SAAO,MAAM;AAEb,MAAI,CAAC,OAAO,SAAS;AACpB,WAAO,MAAM,uBAAuB;AACpC;AAAA,EACD;AAGA,SAAO,KAAK,gCAAgC,aAAa,OAAO,MAAM,CAAC,aAAQ,OAAO,OAAO,EAAE;AAC/F,SAAO,KAAK,gBAAgB,OAAO,aAAa,EAAE;AAClD,SAAO,MAAM;AAGb,SAAO,KAAK,gBAAgB,OAAO,gBAAgB,YAAY;AAC/D,SAAO,KAAK,gBAAgB,OAAO,eAAe,EAAE;AACpD,SAAO,KAAK,gBAAgB,OAAO,gBAAgB,EAAE;AAErD,MAAI,OAAO,iBAAiB,SAAS,GAAG;AACvC,WAAO,KAAK,iBAAiB;AAC7B,eAAW,UAAU,OAAO,kBAAkB;AAC7C,aAAO,KAAK,cAAS,MAAM,EAAE;AAAA,IAC9B;AAAA,EACD;AACA,SAAO,MAAM;AAGb,SAAO,KAAK,aAAa;AACzB,SAAO,KAAK,gBAAgB,OAAO,mBAAmB,eAAe,CAAC,EAAE;AACxE,SAAO,KAAK,gBAAgB,OAAO,eAAe,eAAe,CAAC,EAAE;AACpE,SAAO,KAAK,gBAAgB,OAAO,gBAAgB,eAAe,CAAC,EAAE;AACrE,SAAO,MAAM;AAGb,MAAI,OAAO,aAAa,GAAG;AAC1B,WAAO,KAAK,WAAW,OAAO,UAAU,EAAE;AAAA,EAC3C,OAAO;AACN,WAAO,KAAK,eAAe;AAAA,EAC5B;AACD;;;AjD3KA,IAAM,WAAO,8BAAc;AAAA,EAC1B,MAAM;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,EACd;AAAA,EACA,aAAa;AAAA,IACZ,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,MAAM;AAAA,IACN,SAAS;AAAA,IACT,QAAQ;AAAA,EACT;AACD,CAAC;AAAA,IAED,wBAAQ,IAAI;","names":["import_citty","import_node_path","import_citty","import_promises","import_node_path","import_promises","import_node_path","loaded","resolve","import_node_child_process","import_node_path","import_node_url","runCommand","resolve","import_node_child_process","import_node_fs","import_node_path","import_node_url","import_citty","Conf","resolve","clackText","clackIsCancel","clackCancel","clackSelect","clackConfirm","clackIntro","clackOutro","import_node_child_process","import_promises","import_node_path","validateNpmPackageName","import_promises","import_node_path","import_promises","import_node_path","import_node_url","import_meta","isSyncTemplate","import_node_fs","import_node_path","import_citty","import_node_child_process","import_node_path","import_node_child_process","import_node_fs","import_promises","import_node_path","resolve","import_promises","import_node_path","resolve","import_node_child_process","import_node_path","inferLogLevel","resolve","import_node_child_process","import_node_path","import_promises","import_node_path","inferLogLevel","resolve","import_node_child_process","import_node_path","import_promises","import_node_path","GENERATED_HEADER","normalizeError","isAlreadyExistsResponse","inferLogLevel","resolve","parseJsonRecord","import_promises","import_node_path","GENERATED_HEADER","import_promises","import_node_path","import_promises","import_node_path","import_citty","import_node_child_process","spawnChild","resolve","import_node_child_process","import_node_fs","import_node_path","resolve","fileExists","resolve","import_citty","import_promises","import_node_path","import_promises","import_node_path","import_citty","toPascalCase","extractSchema","isSchemaDefinition","import_citty","DEFAULT_SYNC_PORT","import_promises","import_node_path","import_citty","import_core","import_meta","sqlLiteral","isInteractiveTerminal","import_citty","DEFAULT_SYNC_PORT","STATUS_ENDPOINT","watch"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/fs-helpers.ts","../src/commands/migrate/schema-loader.ts","../src/commands/studio/db-reader.ts","../src/commands/studio/studio-replay.ts","../src/commands/studio/studio-ui.ts","../src/commands/studio/studio-ui-app.ts","../src/commands/studio/studio-ui-css.ts","../src/commands/studio/studio-server.ts","../src/commands/studio/spectator-manager.ts","../src/commands/studio/lab-manager.ts","../src/bin.ts","../src/commands/backup/backup-command.ts","../src/utils/logger.ts","../src/commands/compact/compact-command.ts","../src/errors.ts","../src/commands/dev/kora-config.ts","../src/commands/create/create-command.ts","../src/prompts/preferences.ts","../src/prompts/prompt-client.ts","../src/utils/prompt.ts","../src/types.ts","../src/utils/package-manager.ts","../src/commands/create/environment-detection.ts","../src/commands/create/options.ts","../src/commands/create/preferences-flow.ts","../src/commands/create/project-name.ts","../src/commands/create/sync-provider-preset.ts","../src/templates/composer.ts","../src/commands/create/template-engine.ts","../src/commands/deploy/deploy-command.ts","../src/commands/deploy/adapters/adapter.ts","../src/commands/deploy/adapters/aws-ecs-adapter.ts","../src/commands/deploy/builder/client-builder.ts","../src/commands/deploy/builder/server-bundler.ts","../src/commands/deploy/adapters/aws-lightsail-adapter.ts","../src/commands/deploy/adapters/fly-adapter.ts","../src/commands/deploy/artifacts/fly-toml-generator.ts","../src/commands/deploy/adapters/railway-adapter.ts","../src/commands/deploy/artifacts/railway-json-generator.ts","../src/commands/deploy/adapters/stub-adapter.ts","../src/commands/deploy/adapters/factory.ts","../src/commands/deploy/artifacts/dockerfile-generator.ts","../src/commands/deploy/state/deploy-state.ts","../src/commands/dev/dev-command.ts","../src/commands/dev/process-manager.ts","../src/commands/dev/schema-watcher.ts","../src/commands/doctor/doctor-command.ts","../src/commands/doctor/doctor-checks.ts","../src/commands/generate/generate-command.ts","../src/commands/generate/hook-generator.ts","../src/commands/generate/type-generator.ts","../src/commands/logs/logs-command.ts","../src/commands/migrate/migrate-command.ts","../src/commands/migrate/migration-generator.ts","../src/commands/migrate/schema-differ.ts","../src/commands/migrate/migration-runner.ts","../src/commands/migrate/operation-transform-generator.ts","../src/commands/status/status-command.ts","../src/commands/studio/studio-command.ts"],"sourcesContent":["import { access, readFile } from 'node:fs/promises'\nimport { dirname, join, resolve } from 'node:path'\n\n/** Checks if a directory exists at the given path */\nexport async function directoryExists(path: string): Promise<boolean> {\n\ttry {\n\t\tawait access(path)\n\t\treturn true\n\t} catch {\n\t\treturn false\n\t}\n}\n\n/**\n * Walks up the directory tree from startDir looking for a package.json\n * that contains a kora or @korajs/* dependency.\n *\n * @param startDir - Directory to start searching from (defaults to cwd)\n * @returns Absolute path to the project root, or null if not found\n */\nexport async function findProjectRoot(startDir?: string): Promise<string | null> {\n\tlet current = resolve(startDir ?? process.cwd())\n\n\t// Walk up until the filesystem root (where dirname(x) === x)\n\tfor (;;) {\n\t\tconst pkgPath = join(current, 'package.json')\n\t\ttry {\n\t\t\tconst content = await readFile(pkgPath, 'utf-8')\n\t\t\tconst pkg: unknown = JSON.parse(content)\n\t\t\tif (isKoraProject(pkg)) {\n\t\t\t\treturn current\n\t\t\t}\n\t\t} catch {\n\t\t\t// No package.json at this level, keep walking up\n\t\t}\n\t\tconst parent = dirname(current)\n\t\tif (parent === current) break\n\t\tcurrent = parent\n\t}\n\n\treturn null\n}\n\n/**\n * Searches for a schema file in common locations within a project.\n *\n * @param projectRoot - The project root directory\n * @returns Absolute path to the schema file, or null if not found\n */\nexport async function findSchemaFile(projectRoot: string): Promise<string | null> {\n\tconst candidates = [\n\t\tjoin(projectRoot, 'src', 'schema.ts'),\n\t\tjoin(projectRoot, 'schema.ts'),\n\t\tjoin(projectRoot, 'src', 'schema.js'),\n\t\tjoin(projectRoot, 'schema.js'),\n\t]\n\n\tfor (const candidate of candidates) {\n\t\ttry {\n\t\t\tawait access(candidate)\n\t\t\treturn candidate\n\t\t} catch {\n\t\t\t// Not found, try next\n\t\t}\n\t}\n\n\treturn null\n}\n\n/**\n * Resolves a binary from a project's local node_modules/.bin directory.\n * On Windows, npm creates .cmd shims instead of extensionless files.\n *\n * @param projectRoot - The project root directory\n * @param binaryName - Binary filename (for example: vite, tsx, kora)\n * @returns Absolute path to the binary, or null if not found\n */\nexport async function resolveProjectBinary(\n\tprojectRoot: string,\n\tbinaryName: string,\n): Promise<string | null> {\n\tconst binDir = join(projectRoot, 'node_modules', '.bin')\n\t// On Windows, try .cmd first (npm/pnpm create .cmd shims)\n\tconst candidates =\n\t\tprocess.platform === 'win32'\n\t\t\t? [join(binDir, `${binaryName}.cmd`), join(binDir, binaryName)]\n\t\t\t: [join(binDir, binaryName)]\n\n\tfor (const candidate of candidates) {\n\t\ttry {\n\t\t\tawait access(candidate)\n\t\t\treturn candidate\n\t\t} catch {\n\t\t\t// continue\n\t\t}\n\t}\n\treturn null\n}\n\n/**\n * Checks whether the `tsx` package is installed in the project's node_modules.\n * Used to determine if we can use `--import tsx` with process.execPath.\n */\nexport async function hasTsxInstalled(projectRoot: string): Promise<boolean> {\n\ttry {\n\t\tawait access(join(projectRoot, 'node_modules', 'tsx', 'package.json'))\n\t\treturn true\n\t} catch {\n\t\treturn false\n\t}\n}\n\n/**\n * Resolves the JS entry point for a package binary.\n * Reads the package.json bin field to find the actual JS file,\n * avoiding .cmd shims and shell:true on Windows.\n *\n * @returns Absolute path to the JS entry point, or null if not found\n */\nexport async function resolveProjectBinaryEntryPoint(\n\tprojectRoot: string,\n\tpackageName: string,\n\tbinaryName: string,\n): Promise<string | null> {\n\tconst pkgJsonPath = join(projectRoot, 'node_modules', packageName, 'package.json')\n\ttry {\n\t\tconst content = await readFile(pkgJsonPath, 'utf-8')\n\t\tconst pkg = JSON.parse(content) as { bin?: string | Record<string, string> }\n\t\tlet binPath: string | undefined\n\t\tif (typeof pkg.bin === 'string') {\n\t\t\tbinPath = pkg.bin\n\t\t} else if (typeof pkg.bin === 'object' && pkg.bin !== null) {\n\t\t\tbinPath = pkg.bin[binaryName]\n\t\t}\n\t\tif (!binPath) return null\n\t\tconst fullPath = join(projectRoot, 'node_modules', packageName, binPath)\n\t\tawait access(fullPath)\n\t\treturn fullPath\n\t} catch {\n\t\treturn null\n\t}\n}\n\nfunction isKoraProject(pkg: unknown): boolean {\n\tif (typeof pkg !== 'object' || pkg === null) return false\n\tconst record = pkg as Record<string, unknown>\n\treturn hasKoraDep(record.dependencies) || hasKoraDep(record.devDependencies)\n}\n\nfunction hasKoraDep(deps: unknown): boolean {\n\tif (typeof deps !== 'object' || deps === null) return false\n\treturn Object.keys(deps).some((key) => key === 'kora' || key.startsWith('@korajs/'))\n}\n","import { spawn } from 'node:child_process'\nimport { extname } from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport type { SchemaDefinition } from '@korajs/core'\nimport { hasTsxInstalled } from '../../utils/fs-helpers'\n\n/**\n * Loads a schema definition from a TS/JS module.\n */\nexport async function loadSchemaDefinition(\n\tschemaPath: string,\n\tprojectRoot: string,\n): Promise<SchemaDefinition> {\n\tconst ext = extname(schemaPath)\n\tconst moduleValue =\n\t\text === '.ts' || ext === '.mts' || ext === '.cts'\n\t\t\t? await loadTypeScriptModule(schemaPath, projectRoot)\n\t\t\t: await import(`${pathToFileURL(schemaPath).href}?t=${Date.now()}-${Math.random()}`)\n\n\treturn extractSchema(moduleValue)\n}\n\nfunction extractSchema(value: unknown): SchemaDefinition {\n\tif (typeof value !== 'object' || value === null) {\n\t\tthrow new Error('Schema module must export an object.')\n\t}\n\n\tconst moduleRecord = value as Record<string, unknown>\n\tconst candidate = moduleRecord.default ?? moduleRecord\n\n\tif (!isSchemaDefinition(candidate)) {\n\t\tthrow new Error('Schema module must export a valid SchemaDefinition as default export.')\n\t}\n\n\treturn candidate\n}\n\nfunction isSchemaDefinition(value: unknown): value is SchemaDefinition {\n\tif (typeof value !== 'object' || value === null) return false\n\tconst object = value as Record<string, unknown>\n\treturn (\n\t\ttypeof object.version === 'number' &&\n\t\ttypeof object.collections === 'object' &&\n\t\tobject.collections !== null &&\n\t\ttypeof object.relations === 'object' &&\n\t\tobject.relations !== null\n\t)\n}\n\nasync function loadTypeScriptModule(schemaPath: string, projectRoot: string): Promise<unknown> {\n\tif (!(await hasTsxInstalled(projectRoot))) {\n\t\tthrow new Error(\n\t\t\t`Schema file is TypeScript (${schemaPath}) but local \"tsx\" was not found. Install tsx in the project.`,\n\t\t)\n\t}\n\n\tconst script =\n\t\t'const modulePath = process.argv[process.argv.length - 1];' +\n\t\t\"import('node:url').then(u => import(u.pathToFileURL(modulePath).href))\" +\n\t\t'.then(mod => { const v = mod.default ?? mod; process.stdout.write(JSON.stringify(v)) })' +\n\t\t'.catch(e => { process.stderr.write(String(e)); process.exit(1) })'\n\n\tconst output = await runCommand(\n\t\tprocess.execPath,\n\t\t['--import', 'tsx', '--eval', script, schemaPath],\n\t\tprojectRoot,\n\t)\n\n\ttry {\n\t\treturn JSON.parse(output)\n\t} catch {\n\t\tthrow new Error(`Failed to parse schema module output for ${schemaPath}`)\n\t}\n}\n\nasync function runCommand(command: string, args: string[], cwd: string): Promise<string> {\n\treturn await new Promise<string>((resolve, reject) => {\n\t\tconst child = spawn(command, args, {\n\t\t\tcwd,\n\t\t\tstdio: ['ignore', 'pipe', 'pipe'],\n\t\t\tenv: process.env,\n\t\t})\n\n\t\tlet stdout = ''\n\t\tlet stderr = ''\n\n\t\tchild.stdout?.on('data', (chunk: Buffer) => {\n\t\t\tstdout += chunk.toString('utf-8')\n\t\t})\n\n\t\tchild.stderr?.on('data', (chunk: Buffer) => {\n\t\t\tstderr += chunk.toString('utf-8')\n\t\t})\n\n\t\tchild.on('error', (error) => {\n\t\t\treject(error)\n\t\t})\n\n\t\tchild.on('exit', (code) => {\n\t\t\tif (code === 0) {\n\t\t\t\tresolve(stdout.trim())\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\treject(\n\t\t\t\tnew Error(`Failed to load TypeScript schema (exit ${code ?? 'unknown'}): ${stderr.trim()}`),\n\t\t\t)\n\t\t})\n\t})\n}\n","import type BetterSqlite3 from 'better-sqlite3'\n\n/**\n * Read-only access layer for Kora Studio.\n *\n * Opens the SQLite database with `readonly: true` — Studio can NEVER write.\n * Any future editing feature must create real operations through the store\n * pipeline (never raw SQL), or it would corrupt the append-only op log and\n * violate content addressing.\n *\n * No schema file is required: collections are introspected as tables that\n * have a companion `_kora_ops_<name>` operation log table.\n */\n\n/** A parsed serialized HLC version stamp (\"wallTime:logical:nodeId\"). */\nexport interface ParsedVersion {\n\twallTime: number\n\tlogical: number\n\tnodeId: string\n}\n\nexport interface StudioCollectionInfo {\n\tname: string\n\tliveRecords: number\n\ttombstones: number\n\toperations: number\n\tcolumns: string[]\n}\n\nexport interface StudioOverview {\n\tdbPath: string\n\tcollections: StudioCollectionInfo[]\n\tversionVector: Array<{ nodeId: string; sequenceNumber: number }>\n\tmeta: Array<{ key: string; value: string }>\n\tpendingSyncOps: number\n\tauditTraces: number\n}\n\nexport interface StudioRecord {\n\tid: string\n\tfields: Record<string, unknown>\n\tcreatedAt: number\n\tupdatedAt: number\n\tdeleted: boolean\n\tversion: ParsedVersion | null\n\tfieldVersions: Record<string, ParsedVersion>\n}\n\nexport interface StudioOperation {\n\tid: string\n\tnodeId: string\n\ttype: string\n\trecordId: string\n\tdata: Record<string, unknown> | null\n\tpreviousData: Record<string, unknown> | null\n\ttimestamp: ParsedVersion | null\n\tsequenceNumber: number\n\tcausalDeps: string[]\n\tschemaVersion: number\n}\n\nexport interface StudioAuditTrace {\n\tid: string\n\trecordedAt: number\n\teventType: string\n\tcollection: string\n\trecordId: string\n\tfield: string\n\tstrategy: string\n\ttier: number\n\tconstraintName: string | null\n}\n\nconst KORA_TABLE_PREFIX = '_kora_'\nconst OPS_TABLE_PREFIX = '_kora_ops_'\n/** Metadata columns present on every materialized row. */\nconst META_COLUMNS = new Set([\n\t'id',\n\t'_created_at',\n\t'_updated_at',\n\t'_version',\n\t'_field_versions',\n\t'_deleted',\n])\n\n/** Parse a serialized HLC stamp; tolerates legacy/empty values with null. */\nexport function parseVersionStamp(raw: unknown): ParsedVersion | null {\n\tif (typeof raw !== 'string' || raw.length === 0) {\n\t\treturn null\n\t}\n\tconst parts = raw.split(':')\n\tif (parts.length < 3) {\n\t\treturn null\n\t}\n\tconst wallTime = Number.parseInt(parts[0] ?? '', 10)\n\tconst logical = Number.parseInt(parts[1] ?? '', 10)\n\tif (Number.isNaN(wallTime) || Number.isNaN(logical)) {\n\t\treturn null\n\t}\n\treturn { wallTime, logical, nodeId: parts.slice(2).join(':') }\n}\n\nfunction parseFieldVersionsColumn(raw: unknown): Record<string, ParsedVersion> {\n\tif (typeof raw !== 'string' || raw.length === 0) {\n\t\treturn {}\n\t}\n\ttry {\n\t\tconst parsed = JSON.parse(raw) as Record<string, unknown>\n\t\tconst result: Record<string, ParsedVersion> = {}\n\t\tfor (const [field, value] of Object.entries(parsed)) {\n\t\t\tconst version = parseVersionStamp(value)\n\t\t\tif (version) {\n\t\t\t\tresult[field] = version\n\t\t\t}\n\t\t}\n\t\treturn result\n\t} catch {\n\t\treturn {}\n\t}\n}\n\nfunction safeIdentifier(name: string): string {\n\tif (!/^[a-zA-Z0-9_]+$/.test(name)) {\n\t\tthrow new Error(`Unsafe SQL identifier: \"${name}\"`)\n\t}\n\treturn name\n}\n\nfunction parseJsonColumn(raw: unknown): Record<string, unknown> | null {\n\tif (typeof raw !== 'string' || raw.length === 0) {\n\t\treturn null\n\t}\n\ttry {\n\t\treturn JSON.parse(raw) as Record<string, unknown>\n\t} catch {\n\t\treturn null\n\t}\n}\n\nfunction parseJsonArrayColumn(raw: unknown): string[] {\n\tif (typeof raw !== 'string' || raw.length === 0) {\n\t\treturn []\n\t}\n\ttry {\n\t\tconst parsed = JSON.parse(raw) as unknown\n\t\treturn Array.isArray(parsed) ? parsed.map(String) : []\n\t} catch {\n\t\treturn []\n\t}\n}\n\n/**\n * Read-only Studio access to a Kora SQLite database.\n */\nexport class StudioDbReader {\n\tprivate constructor(\n\t\tprivate readonly db: BetterSqlite3.Database,\n\t\tprivate readonly dbPath: string,\n\t) {}\n\n\t/**\n\t * Open a Kora database strictly read-only.\n\t * @throws when the file does not exist or is not a Kora database\n\t */\n\tstatic async open(dbPath: string): Promise<StudioDbReader> {\n\t\t// Dynamic import so better-sqlite3 loads only when Studio runs.\n\t\tlet Database: typeof BetterSqlite3\n\t\ttry {\n\t\t\tDatabase = (await import('better-sqlite3')).default\n\t\t} catch {\n\t\t\tthrow new Error(\n\t\t\t\t'Kora Studio needs the \"better-sqlite3\" package to open database files. Install it in your project: pnpm add -D better-sqlite3',\n\t\t\t)\n\t\t}\n\t\tconst db = new Database(dbPath, { readonly: true, fileMustExist: true })\n\t\tconst reader = new StudioDbReader(db, dbPath)\n\t\tif (reader.listCollections().length === 0 && !reader.hasKoraTables()) {\n\t\t\tdb.close()\n\t\t\tthrow new Error(`\"${dbPath}\" does not look like a Kora database (no _kora_* tables found).`)\n\t\t}\n\t\treturn reader\n\t}\n\n\tclose(): void {\n\t\tthis.db.close()\n\t}\n\n\tprivate hasKoraTables(): boolean {\n\t\tconst row = this.db\n\t\t\t.prepare(\"SELECT COUNT(*) as count FROM sqlite_master WHERE type='table' AND name LIKE ?\")\n\t\t\t.get(`${KORA_TABLE_PREFIX}%`) as { count: number }\n\t\treturn row.count > 0\n\t}\n\n\t/** Collections = tables that have a companion _kora_ops_<name> table. */\n\tlistCollections(): string[] {\n\t\tconst tables = this.db\n\t\t\t.prepare(\"SELECT name FROM sqlite_master WHERE type='table' ORDER BY name\")\n\t\t\t.all() as Array<{ name: string }>\n\t\tconst names = new Set(tables.map((t) => t.name))\n\t\tconst collections: string[] = []\n\t\tfor (const { name } of tables) {\n\t\t\tif (name.startsWith(OPS_TABLE_PREFIX)) {\n\t\t\t\tconst collection = name.slice(OPS_TABLE_PREFIX.length)\n\t\t\t\tif (names.has(collection)) {\n\t\t\t\t\tcollections.push(collection)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn collections.sort()\n\t}\n\n\toverview(): StudioOverview {\n\t\tconst collections: StudioCollectionInfo[] = this.listCollections().map((name) => {\n\t\t\tconst table = safeIdentifier(name)\n\t\t\tconst live = this.db\n\t\t\t\t.prepare(`SELECT COUNT(*) as count FROM ${table} WHERE _deleted = 0`)\n\t\t\t\t.get() as { count: number }\n\t\t\tconst tombstones = this.db\n\t\t\t\t.prepare(`SELECT COUNT(*) as count FROM ${table} WHERE _deleted = 1`)\n\t\t\t\t.get() as { count: number }\n\t\t\tconst operations = this.db\n\t\t\t\t.prepare(`SELECT COUNT(*) as count FROM ${OPS_TABLE_PREFIX}${table}`)\n\t\t\t\t.get() as { count: number }\n\t\t\tconst columnRows = this.db.prepare(`PRAGMA table_info(${table})`).all() as Array<{\n\t\t\t\tname: string\n\t\t\t}>\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\tliveRecords: live.count,\n\t\t\t\ttombstones: tombstones.count,\n\t\t\t\toperations: operations.count,\n\t\t\t\tcolumns: columnRows.map((c) => c.name).filter((c) => !META_COLUMNS.has(c)),\n\t\t\t}\n\t\t})\n\n\t\tconst versionVector = this.tableExists('_kora_version_vector')\n\t\t\t? (this.db\n\t\t\t\t\t.prepare(\n\t\t\t\t\t\t'SELECT node_id as nodeId, sequence_number as sequenceNumber FROM _kora_version_vector ORDER BY node_id',\n\t\t\t\t\t)\n\t\t\t\t\t.all() as Array<{ nodeId: string; sequenceNumber: number }>)\n\t\t\t: []\n\n\t\tconst meta = this.tableExists('_kora_meta')\n\t\t\t? (this.db.prepare('SELECT key, value FROM _kora_meta ORDER BY key').all() as Array<{\n\t\t\t\t\tkey: string\n\t\t\t\t\tvalue: string\n\t\t\t\t}>)\n\t\t\t: []\n\n\t\tconst pendingSyncOps = this.tableExists('_kora_sync_queue')\n\t\t\t? (\n\t\t\t\t\tthis.db.prepare('SELECT COUNT(*) as count FROM _kora_sync_queue').get() as {\n\t\t\t\t\t\tcount: number\n\t\t\t\t\t}\n\t\t\t\t).count\n\t\t\t: 0\n\n\t\tconst auditTraces = this.tableExists('_kora_audit_traces')\n\t\t\t? (\n\t\t\t\t\tthis.db.prepare('SELECT COUNT(*) as count FROM _kora_audit_traces').get() as {\n\t\t\t\t\t\tcount: number\n\t\t\t\t\t}\n\t\t\t\t).count\n\t\t\t: 0\n\n\t\treturn { dbPath: this.dbPath, collections, versionVector, meta, pendingSyncOps, auditTraces }\n\t}\n\n\trecords(\n\t\tcollection: string,\n\t\toptions: {\n\t\t\tlimit?: number\n\t\t\toffset?: number\n\t\t\tincludeDeleted?: boolean\n\t\t\tsearch?: string\n\t\t} = {},\n\t): { records: StudioRecord[]; total: number } {\n\t\tconst table = safeIdentifier(collection)\n\t\tconst limit = Math.min(Math.max(options.limit ?? 50, 1), 500)\n\t\tconst offset = Math.max(options.offset ?? 0, 0)\n\n\t\tconst clauses: string[] = []\n\t\tconst params: unknown[] = []\n\t\tif (!options.includeDeleted) {\n\t\t\tclauses.push('_deleted = 0')\n\t\t}\n\t\tif (options.search && options.search.trim().length > 0) {\n\t\t\t// Search across id and every TEXT-affinity column.\n\t\t\tconst textColumns = (\n\t\t\t\tthis.db.prepare(`PRAGMA table_info(${table})`).all() as Array<{\n\t\t\t\t\tname: string\n\t\t\t\t\ttype: string\n\t\t\t\t}>\n\t\t\t).filter((c) => c.type.toUpperCase().includes('TEXT') || c.name === 'id')\n\t\t\tconst term = `%${options.search.trim()}%`\n\t\t\tconst likes = textColumns.map((c) => {\n\t\t\t\tparams.push(term)\n\t\t\t\treturn `${safeIdentifier(c.name)} LIKE ?`\n\t\t\t})\n\t\t\tif (likes.length > 0) {\n\t\t\t\tclauses.push(`(${likes.join(' OR ')})`)\n\t\t\t}\n\t\t}\n\t\tconst where = clauses.length > 0 ? `WHERE ${clauses.join(' AND ')}` : ''\n\n\t\tconst total = (\n\t\t\tthis.db.prepare(`SELECT COUNT(*) as count FROM ${table} ${where}`).get(...params) as {\n\t\t\t\tcount: number\n\t\t\t}\n\t\t).count\n\t\tconst rows = this.db\n\t\t\t.prepare(`SELECT * FROM ${table} ${where} ORDER BY _updated_at DESC LIMIT ? OFFSET ?`)\n\t\t\t.all(...params, limit, offset) as Array<Record<string, unknown>>\n\n\t\treturn { records: rows.map((row) => this.toStudioRecord(row)), total }\n\t}\n\n\t/** Full operation log for one collection (capped), for replay and the DAG. */\n\tallOperations(collection: string, cap = 5000): StudioOperation[] {\n\t\tconst table = safeIdentifier(collection)\n\t\tconst rows = this.db\n\t\t\t.prepare(`SELECT * FROM ${OPS_TABLE_PREFIX}${table} ORDER BY timestamp ASC LIMIT ?`)\n\t\t\t.all(Math.min(Math.max(cap, 1), 20000)) as Array<Record<string, unknown>>\n\t\treturn rows.map((row) => this.toStudioOperation(row))\n\t}\n\n\t/**\n\t * Cheap change fingerprint for live updates. SQLite's `data_version` PRAGMA\n\t * increments whenever ANOTHER connection commits — exactly what a read-only\n\t * watcher needs to know \"something changed, refetch\".\n\t */\n\tfingerprint(): string {\n\t\tconst row = this.db.prepare('PRAGMA data_version').get() as { data_version: number }\n\t\treturn String(row.data_version)\n\t}\n\n\t/** Raw value of a single column on a record (for richtext preview decode). */\n\trawFieldValue(collection: string, recordId: string, field: string): unknown {\n\t\tconst table = safeIdentifier(collection)\n\t\tconst column = safeIdentifier(field)\n\t\tconst row = this.db\n\t\t\t.prepare(`SELECT ${column} as value FROM ${table} WHERE id = ?`)\n\t\t\t.get(recordId) as { value: unknown } | undefined\n\t\treturn row?.value\n\t}\n\n\trecord(collection: string, recordId: string): StudioRecord | null {\n\t\tconst table = safeIdentifier(collection)\n\t\tconst row = this.db.prepare(`SELECT * FROM ${table} WHERE id = ?`).get(recordId) as\n\t\t\t| Record<string, unknown>\n\t\t\t| undefined\n\t\treturn row ? this.toStudioRecord(row) : null\n\t}\n\n\t/** Full operation history for one record, newest first. */\n\trecordOperations(collection: string, recordId: string): StudioOperation[] {\n\t\tconst table = safeIdentifier(collection)\n\t\tconst rows = this.db\n\t\t\t.prepare(\n\t\t\t\t`SELECT * FROM ${OPS_TABLE_PREFIX}${table} WHERE record_id = ? ORDER BY timestamp DESC`,\n\t\t\t)\n\t\t\t.all(recordId) as Array<Record<string, unknown>>\n\t\treturn rows.map((row) => this.toStudioOperation(row))\n\t}\n\n\toperations(\n\t\tcollection: string,\n\t\toptions: { limit?: number; offset?: number } = {},\n\t): { operations: StudioOperation[]; total: number } {\n\t\tconst table = safeIdentifier(collection)\n\t\tconst limit = Math.min(Math.max(options.limit ?? 50, 1), 500)\n\t\tconst offset = Math.max(options.offset ?? 0, 0)\n\t\tconst total = (\n\t\t\tthis.db.prepare(`SELECT COUNT(*) as count FROM ${OPS_TABLE_PREFIX}${table}`).get() as {\n\t\t\t\tcount: number\n\t\t\t}\n\t\t).count\n\t\tconst rows = this.db\n\t\t\t.prepare(`SELECT * FROM ${OPS_TABLE_PREFIX}${table} ORDER BY timestamp DESC LIMIT ? OFFSET ?`)\n\t\t\t.all(limit, offset) as Array<Record<string, unknown>>\n\t\treturn { operations: rows.map((row) => this.toStudioOperation(row)), total }\n\t}\n\n\tauditTraces(limit = 100): StudioAuditTrace[] {\n\t\tif (!this.tableExists('_kora_audit_traces')) {\n\t\t\treturn []\n\t\t}\n\t\tconst rows = this.db\n\t\t\t.prepare(\n\t\t\t\t`SELECT id, recorded_at, event_type, collection, record_id, field, strategy, tier, constraint_name\n\t\t\t\t FROM _kora_audit_traces ORDER BY recorded_at DESC LIMIT ?`,\n\t\t\t)\n\t\t\t.all(Math.min(Math.max(limit, 1), 500)) as Array<Record<string, unknown>>\n\t\treturn rows.map((row) => ({\n\t\t\tid: String(row.id),\n\t\t\trecordedAt: Number(row.recorded_at),\n\t\t\teventType: String(row.event_type),\n\t\t\tcollection: String(row.collection),\n\t\t\trecordId: String(row.record_id),\n\t\t\tfield: String(row.field),\n\t\t\tstrategy: String(row.strategy),\n\t\t\ttier: Number(row.tier),\n\t\t\tconstraintName: row.constraint_name === null ? null : String(row.constraint_name),\n\t\t}))\n\t}\n\n\tprivate tableExists(name: string): boolean {\n\t\tconst row = this.db\n\t\t\t.prepare(\"SELECT COUNT(*) as count FROM sqlite_master WHERE type='table' AND name = ?\")\n\t\t\t.get(name) as { count: number }\n\t\treturn row.count > 0\n\t}\n\n\tprivate toStudioRecord(row: Record<string, unknown>): StudioRecord {\n\t\tconst fields: Record<string, unknown> = {}\n\t\tfor (const [key, value] of Object.entries(row)) {\n\t\t\tif (!META_COLUMNS.has(key)) {\n\t\t\t\t// BLOBs (richtext Yjs state) are summarized, not dumped raw.\n\t\t\t\tfields[key] =\n\t\t\t\t\tvalue instanceof Uint8Array || Buffer.isBuffer(value)\n\t\t\t\t\t\t? `<binary ${(value as Uint8Array).byteLength} bytes>`\n\t\t\t\t\t\t: value\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tid: String(row.id),\n\t\t\tfields,\n\t\t\tcreatedAt: Number(row._created_at),\n\t\t\tupdatedAt: Number(row._updated_at),\n\t\t\tdeleted: row._deleted === 1,\n\t\t\tversion: parseVersionStamp(row._version),\n\t\t\tfieldVersions: parseFieldVersionsColumn(row._field_versions),\n\t\t}\n\t}\n\n\tprivate toStudioOperation(row: Record<string, unknown>): StudioOperation {\n\t\treturn {\n\t\t\tid: String(row.id),\n\t\t\tnodeId: String(row.node_id),\n\t\t\ttype: String(row.type),\n\t\t\trecordId: String(row.record_id),\n\t\t\tdata: parseJsonColumn(row.data),\n\t\t\tpreviousData: parseJsonColumn(row.previous_data),\n\t\t\ttimestamp: parseVersionStamp(row.timestamp),\n\t\t\tsequenceNumber: Number(row.sequence_number),\n\t\t\tcausalDeps: parseJsonArrayColumn(row.causal_deps),\n\t\t\tschemaVersion: Number(row.schema_version),\n\t\t}\n\t}\n}\n","import type { ParsedVersion, StudioOperation } from './db-reader'\n\n/**\n * Time travel and causal-graph helpers for Kora Studio.\n *\n * `replayToOperation` folds the operation log up to (and including) a chosen\n * operation, in HLC order, producing the record set as it existed at that\n * causal cut. Because per-field last-write-wins is deterministic and\n * order-independent, folding in HLC order reproduces exactly the state every\n * in-order device computed at that point — the same principle the store's own\n * materializer uses, applied read-only for inspection.\n */\n\nexport interface ReplayRecord {\n\tid: string\n\tfields: Record<string, unknown>\n\tdeleted: boolean\n\tlastWriterByField: Record<string, string>\n}\n\nexport interface ReplayResult {\n\t/** Records alive (or tombstoned) at the causal cut, keyed by record id. */\n\trecords: ReplayRecord[]\n\t/** How many operations were folded (position of the cut, 1-based). */\n\tappliedCount: number\n\ttotalCount: number\n\t/** The operation at the cut. */\n\tcutOperation: StudioOperation | null\n}\n\nfunction compareVersion(a: ParsedVersion | null, b: ParsedVersion | null): number {\n\tif (!a || !b) {\n\t\treturn a === b ? 0 : a ? 1 : -1\n\t}\n\tif (a.wallTime !== b.wallTime) {\n\t\treturn a.wallTime - b.wallTime\n\t}\n\tif (a.logical !== b.logical) {\n\t\treturn a.logical - b.logical\n\t}\n\treturn a.nodeId < b.nodeId ? -1 : a.nodeId > b.nodeId ? 1 : 0\n}\n\n/** Sort operations into the HLC total order (the canonical replay order). */\nexport function sortByHlc(ops: StudioOperation[]): StudioOperation[] {\n\treturn [...ops].sort((a, b) => compareVersion(a.timestamp, b.timestamp))\n}\n\n/**\n * Fold operations up to and including `upToOpId` (or all when null).\n */\nexport function replayToOperation(ops: StudioOperation[], upToOpId: string | null): ReplayResult {\n\tconst ordered = sortByHlc(ops)\n\tlet cutIndex = ordered.length - 1\n\tif (upToOpId !== null) {\n\t\tconst found = ordered.findIndex((o) => o.id === upToOpId)\n\t\tif (found === -1) {\n\t\t\tthrow new Error(`Operation \"${upToOpId}\" not found in the log`)\n\t\t}\n\t\tcutIndex = found\n\t}\n\n\tconst records = new Map<\n\t\tstring,\n\t\t{ fields: Record<string, unknown>; deleted: boolean; writers: Record<string, string> }\n\t>()\n\n\tfor (let i = 0; i <= cutIndex; i++) {\n\t\tconst operation = ordered[i]\n\t\tif (!operation) {\n\t\t\tcontinue\n\t\t}\n\t\tconst writer = operation.timestamp ? shortNode(operation.timestamp.nodeId) : '?'\n\t\tif (operation.type === 'insert' && operation.data) {\n\t\t\tconst writers: Record<string, string> = {}\n\t\t\tfor (const field of Object.keys(operation.data)) {\n\t\t\t\twriters[field] = writer\n\t\t\t}\n\t\t\trecords.set(operation.recordId, {\n\t\t\t\tfields: { ...operation.data },\n\t\t\t\tdeleted: false,\n\t\t\t\twriters,\n\t\t\t})\n\t\t} else if (operation.type === 'update' && operation.data) {\n\t\t\tconst existing = records.get(operation.recordId)\n\t\t\tif (existing) {\n\t\t\t\tfor (const [field, value] of Object.entries(operation.data)) {\n\t\t\t\t\texisting.fields[field] = value\n\t\t\t\t\texisting.writers[field] = writer\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Orphaned update (insert later in HLC order than the update is\n\t\t\t\t// impossible in HLC order — but a compacted log can lose the insert).\n\t\t\t\tconst writers: Record<string, string> = {}\n\t\t\t\tfor (const field of Object.keys(operation.data)) {\n\t\t\t\t\twriters[field] = writer\n\t\t\t\t}\n\t\t\t\trecords.set(operation.recordId, {\n\t\t\t\t\tfields: { ...operation.data },\n\t\t\t\t\tdeleted: false,\n\t\t\t\t\twriters,\n\t\t\t\t})\n\t\t\t}\n\t\t} else if (operation.type === 'delete') {\n\t\t\tconst existing = records.get(operation.recordId)\n\t\t\tif (existing) {\n\t\t\t\texisting.deleted = true\n\t\t\t} else {\n\t\t\t\trecords.set(operation.recordId, { fields: {}, deleted: true, writers: {} })\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\trecords: [...records.entries()].map(([id, r]) => ({\n\t\t\tid,\n\t\t\tfields: r.fields,\n\t\t\tdeleted: r.deleted,\n\t\t\tlastWriterByField: r.writers,\n\t\t})),\n\t\tappliedCount: cutIndex + 1,\n\t\ttotalCount: ordered.length,\n\t\tcutOperation: ordered[cutIndex] ?? null,\n\t}\n}\n\n// ── Causal DAG ───────────────────────────────────────────────────────────────\n\nexport interface DagNode {\n\tid: string\n\ttype: string\n\trecordId: string\n\tnodeId: string\n\tshortNodeId: string\n\tsequenceNumber: number\n\twallTime: number\n\t/** Column in the layered layout (HLC order). */\n\tx: number\n\t/** Lane index (one lane per originating device). */\n\tlane: number\n\tdataPreview: string\n}\n\nexport interface DagEdge {\n\tfrom: string\n\tto: string\n}\n\nexport interface DagResult {\n\tnodes: DagNode[]\n\tedges: DagEdge[]\n\tlanes: Array<{ nodeId: string; shortNodeId: string }>\n}\n\n/**\n * Build a layered causal graph from operations: x = HLC order, one horizontal\n * lane per originating device, edges = causal dependencies. Concurrency is\n * VISIBLE as operations sharing an x-neighborhood on different lanes with no\n * path between them.\n */\nexport function buildCausalDag(ops: StudioOperation[]): DagResult {\n\tconst ordered = sortByHlc(ops)\n\tconst laneByNode = new Map<string, number>()\n\tconst lanes: Array<{ nodeId: string; shortNodeId: string }> = []\n\n\tfor (const operation of ordered) {\n\t\tif (!laneByNode.has(operation.nodeId)) {\n\t\t\tlaneByNode.set(operation.nodeId, lanes.length)\n\t\t\tlanes.push({ nodeId: operation.nodeId, shortNodeId: shortNode(operation.nodeId) })\n\t\t}\n\t}\n\n\tconst idSet = new Set(ordered.map((o) => o.id))\n\tconst nodes: DagNode[] = ordered.map((operation, index) => ({\n\t\tid: operation.id,\n\t\ttype: operation.type,\n\t\trecordId: operation.recordId,\n\t\tnodeId: operation.nodeId,\n\t\tshortNodeId: shortNode(operation.nodeId),\n\t\tsequenceNumber: operation.sequenceNumber,\n\t\twallTime: operation.timestamp?.wallTime ?? 0,\n\t\tx: index,\n\t\tlane: laneByNode.get(operation.nodeId) ?? 0,\n\t\tdataPreview: operation.data ? JSON.stringify(operation.data).slice(0, 80) : '',\n\t}))\n\n\tconst edges: DagEdge[] = []\n\tfor (const operation of ordered) {\n\t\tfor (const dep of operation.causalDeps) {\n\t\t\tif (idSet.has(dep)) {\n\t\t\t\tedges.push({ from: dep, to: operation.id })\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { nodes, edges, lanes }\n}\n\nfunction shortNode(nodeId: string): string {\n\treturn nodeId.length > 8 ? nodeId.slice(-8) : nodeId\n}\n","/**\n * Kora Studio HTML shell (served at /). The stylesheet and application are\n * served as separate routes so each stays an editable module; everything is\n * still fully self-contained — no CDN, no build step, works offline.\n */\nexport const STUDIO_HTML = `<!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<title>Kora Studio</title>\n<link rel=\"stylesheet\" href=\"/style.css\" />\n</head>\n<body>\n<header>\n <div class=\"logo\">kora <span>studio</span></div>\n <div class=\"modebadge\" id=\"modebadge\"></div>\n <div class=\"dbpath mono\" id=\"dbpath\"></div>\n <div class=\"live\" id=\"live\"><div class=\"dot\"></div><span>live</span></div>\n <button id=\"refresh\">Refresh</button>\n</header>\n<div class=\"tabs\" id=\"tabs\"></div>\n<div class=\"layout\">\n <nav class=\"sidebar\" id=\"sidebar\"></nav>\n <main id=\"main\"><div class=\"empty\">Loading…</div></main>\n</div>\n<div class=\"drawer\" id=\"drawer\"></div>\n<div class=\"dag-tip\" id=\"dagtip\"></div>\n<script src=\"/app.js\"></script>\n</body>\n</html>\n`\n","/** Kora Studio application (served at /app.js). Vanilla DOM, zero dependencies. */\nexport const STUDIO_APP_JS = `\n(function () {\n 'use strict';\n\n // ── State ──────────────────────────────────────────────────────────────────\n var state = {\n mode: 'file', // 'file' | 'lab'\n tab: 'data', // data | ops | timetravel | merges | sync | lab\n device: null, // selected lab device for data-ish tabs\n devices: [],\n collection: null,\n page: 0,\n includeDeleted: false,\n search: '',\n overview: null,\n ttPosition: null, // time-travel slider position\n ttPlaying: null,\n labState: null,\n feed: [],\n deviceColors: {},\n live: false\n };\n var PAGE = 50;\n var refreshTimer = null;\n\n // ── Utilities ──────────────────────────────────────────────────────────────\n function qs(sel) { return document.querySelector(sel); }\n function api(path) {\n var sep = path.indexOf('?') === -1 ? '?' : '&';\n var url = state.device ? path + sep + 'device=' + encodeURIComponent(state.device) : path;\n return fetch(url).then(function (r) {\n if (!r.ok) { return r.json().then(function (b) { throw new Error(b.error || r.statusText); }); }\n return r.json();\n });\n }\n function post(path, body) {\n return fetch(path, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(body || {})\n }).then(function (r) {\n if (!r.ok) { return r.json().then(function (b) { throw new Error(b.error || r.statusText); }); }\n return r.json();\n });\n }\n function el(tag, attrs, children) {\n var node = document.createElement(tag);\n if (attrs) { Object.keys(attrs).forEach(function (k) {\n if (k === 'class') node.className = attrs[k];\n else if (k === 'text') node.textContent = attrs[k];\n else if (k === 'html') node.innerHTML = attrs[k];\n else if (k.slice(0, 2) === 'on') node.addEventListener(k.slice(2), attrs[k]);\n else node.setAttribute(k, attrs[k]);\n }); }\n (children || []).forEach(function (c) { if (c) node.appendChild(c); });\n return node;\n }\n function fmtTime(ms) {\n if (!ms) return '·';\n var d = new Date(ms);\n return d.toLocaleTimeString() + '.' + ('00' + d.getMilliseconds()).slice(-3);\n }\n function fmtDateTime(ms) {\n if (!ms) return '·';\n var d = new Date(ms);\n return d.toLocaleDateString() + ' ' + d.toLocaleTimeString();\n }\n function shortNode(id) { return id && id.length > 8 ? id.slice(-8) : (id || '·'); }\n function shortId(id) { return id && id.length > 13 ? id.slice(0, 13) + '…' : (id || ''); }\n function fmtVal(v) {\n if (v === null || v === undefined) return 'null';\n if (typeof v === 'object') return JSON.stringify(v);\n return String(v);\n }\n function deviceColor(name) {\n if (!(name in state.deviceColors)) {\n state.deviceColors[name] = 'dev-c' + (Object.keys(state.deviceColors).length % 6);\n }\n return state.deviceColors[name];\n }\n function debounceRefresh() {\n if (refreshTimer) clearTimeout(refreshTimer);\n refreshTimer = setTimeout(function () { render(false); }, 250);\n }\n\n // ── Boot + live events ─────────────────────────────────────────────────────\n fetch('/api/mode').then(function (r) { return r.json(); }).then(function (info) {\n state.mode = info.mode;\n state.devices = info.devices || [];\n if (state.mode === 'lab') { state.tab = 'lab'; state.device = state.devices[0] || null; }\n qs('#modebadge').textContent = state.mode;\n if (info.spectator) {\n qs('#dbpath').textContent = '⇄ ' + info.spectator.url +\n (info.spectator.connected ? ' · connected' : ' · connecting…') +\n ' · ' + info.spectator.operationsReceived + ' ops received';\n }\n connectEvents();\n render(true);\n });\n\n function connectEvents() {\n var source = new EventSource('/api/events');\n source.addEventListener('hello', function () {\n state.live = true; qs('#live').className = 'live on';\n });\n source.addEventListener('change', function () {\n if (state.tab !== 'timetravel') debounceRefresh();\n });\n source.addEventListener('lab', function (event) {\n var data = JSON.parse(event.data);\n state.feed.push(data);\n if (state.feed.length > 400) state.feed.shift();\n appendFeedLine(data);\n });\n source.addEventListener('spectator', function (event) {\n var data = JSON.parse(event.data);\n data.device = 'server';\n state.feed.push(data);\n if (state.feed.length > 400) state.feed.shift();\n appendFeedLine(data);\n // Keep the header status fresh as ops stream in.\n fetch('/api/spectator/status').then(function (r) { return r.json(); }).then(function (s) {\n qs('#dbpath').textContent = '⇄ ' + s.url +\n (s.connected ? ' · connected' : ' · reconnecting…') +\n ' · ' + s.operationsReceived + ' ops received';\n }).catch(function () {});\n });\n source.onerror = function () {\n state.live = false; qs('#live').className = 'live';\n };\n }\n\n // ── Tabs + chrome ──────────────────────────────────────────────────────────\n function renderTabs() {\n var tabs = qs('#tabs');\n tabs.textContent = '';\n var defs = [];\n if (state.mode === 'lab') defs.push(['lab', 'Lab']);\n defs.push(['data', 'Data'], ['ops', 'Operations'], ['timetravel', 'Time Travel'], ['merges', 'Merges'], ['sync', 'Sync']);\n defs.forEach(function (d) {\n tabs.appendChild(el('div', {\n class: 'tab' + (state.tab === d[0] ? ' active' : ''),\n text: d[1],\n onclick: function () { state.tab = d[0]; state.page = 0; closeDrawer(); render(true); }\n }));\n });\n tabs.appendChild(el('div', { class: 'spacer' }));\n if (state.mode === 'lab' && state.tab !== 'lab') {\n var pick = el('select', { onchange: function () { state.device = pick.value; state.page = 0; render(true); } },\n state.devices.map(function (d) {\n var o = el('option', { value: d, text: d });\n if (d === state.device) o.selected = true;\n return o;\n }));\n tabs.appendChild(el('div', { class: 'devicepick' }, [el('span', { text: 'device:' }), pick]));\n }\n }\n\n function renderSidebar() {\n var nav = qs('#sidebar');\n nav.textContent = '';\n if (state.tab === 'lab' || state.tab === 'sync' || state.tab === 'merges') {\n nav.style.display = 'none';\n return;\n }\n nav.style.display = '';\n nav.appendChild(el('h3', { text: 'Collections' }));\n (state.overview ? state.overview.collections : []).forEach(function (c) {\n nav.appendChild(el('div', {\n class: 'item' + (state.collection === c.name ? ' active' : ''),\n onclick: function () { state.collection = c.name; state.page = 0; closeDrawer(); render(false); }\n }, [\n el('span', { text: c.name }),\n el('span', { class: 'count', text: String(c.liveRecords) + (c.tombstones ? ' +' + c.tombstones + '†' : '') })\n ]));\n });\n }\n\n // ── Main render ────────────────────────────────────────────────────────────\n function render(full) {\n renderTabs();\n if (state.tab === 'lab') { renderSidebar(); renderLab(full); return; }\n api('/api/overview').then(function (overview) {\n state.overview = overview;\n qs('#dbpath').textContent = overview.dbPath || '';\n if (!state.collection || !overview.collections.some(function (c) { return c.name === state.collection; })) {\n state.collection = overview.collections.length ? overview.collections[0].name : null;\n }\n renderSidebar();\n var main = qs('#main');\n main.textContent = '';\n if (state.tab === 'data') return renderData(main);\n if (state.tab === 'ops') return renderOps(main);\n if (state.tab === 'timetravel') return renderTimeTravel(main);\n if (state.tab === 'merges') return renderMerges(main);\n if (state.tab === 'sync') return renderSync(main);\n }).catch(function (e) {\n qs('#main').innerHTML = '<div class=\"error\">' + e.message + '</div>';\n });\n }\n\n function toolbar(main, title, extra) {\n main.appendChild(el('div', { class: 'toolbar' }, [el('h2', { text: title })].concat(extra || [])));\n }\n function pager(main, total) {\n var pages = Math.max(1, Math.ceil(total / PAGE));\n main.appendChild(el('div', { class: 'pager' }, [\n el('button', { text: '‹ Prev', onclick: function () { if (state.page > 0) { state.page--; render(false); } } }),\n el('span', { text: 'page ' + (state.page + 1) + ' / ' + pages + ' · ' + total + ' total' }),\n el('button', { text: 'Next ›', onclick: function () { if (state.page < pages - 1) { state.page++; render(false); } } })\n ]));\n }\n\n // ── Data tab ───────────────────────────────────────────────────────────────\n function renderData(main) {\n if (!state.collection) { main.appendChild(el('div', { class: 'empty', text: 'No collections.' })); return; }\n var searchBox = el('input', { type: 'text', placeholder: 'search…', value: state.search });\n searchBox.oninput = function () { state.search = searchBox.value; state.page = 0; debounceRefresh(); };\n var deletedToggle = el('label', {}, [\n (function () { var cb = el('input', { type: 'checkbox' }); cb.checked = state.includeDeleted;\n cb.onchange = function () { state.includeDeleted = cb.checked; state.page = 0; render(false); }; return cb; })(),\n el('span', { text: 'tombstones' })\n ]);\n toolbar(main, state.collection, [searchBox, deletedToggle]);\n\n var q = '/api/collections/' + state.collection + '/records?limit=' + PAGE +\n '&offset=' + (state.page * PAGE) + '&includeDeleted=' + state.includeDeleted +\n (state.search ? '&search=' + encodeURIComponent(state.search) : '');\n api(q).then(function (data) {\n var info = state.overview.collections.filter(function (c) { return c.name === state.collection; })[0];\n var columns = info ? info.columns : [];\n if (!data.records.length) { main.appendChild(el('div', { class: 'empty', text: 'No records.' })); return; }\n var thead = el('tr', {}, [el('th', { text: 'id' })].concat(\n columns.map(function (c) { return el('th', { text: c }); }),\n [el('th', { text: 'updated' })]\n ));\n var tbody = el('tbody', {}, data.records.map(function (r) {\n return el('tr', { class: 'clickable' + (r.deleted ? ' tombstone' : ''), onclick: function () { openRecord(r.id); } },\n [el('td', { class: 'mono', text: shortId(r.id) })].concat(\n columns.map(function (c) { return el('td', { text: fmtVal(r.fields[c]).slice(0, 60) }); }),\n [el('td', { class: 'mono', text: fmtDateTime(r.updatedAt) })]\n ));\n }));\n main.appendChild(el('table', { class: 'grid' }, [el('thead', {}, [thead]), tbody]));\n pager(main, data.total);\n }).catch(showError(main));\n }\n\n // ── Record drawer ──────────────────────────────────────────────────────────\n function openRecord(id) {\n api('/api/collections/' + state.collection + '/records/' + encodeURIComponent(id)).then(function (data) {\n var drawer = qs('#drawer');\n drawer.textContent = '';\n var r = data.record;\n drawer.appendChild(el('h3', {}, [\n el('span', { class: 'mono', text: r.id }),\n el('span', { class: 'close', text: '✕', onclick: closeDrawer })\n ]));\n if (r.deleted) drawer.appendChild(el('span', { class: 'badge delete', text: 'tombstone' }));\n\n drawer.appendChild(el('h4', { text: 'Fields — with last writer per field' }));\n Object.keys(r.fields).forEach(function (f) {\n var fv = r.fieldVersions[f];\n var val = fmtVal(r.fields[f]);\n var preview = data.richtextPreviews && data.richtextPreviews[f];\n drawer.appendChild(el('div', { class: 'fieldrow' }, [\n el('div', { class: 'fname mono', text: f }),\n el('div', { class: 'fval', text: val }),\n preview ? el('div', { class: 'preview', text: '“' + preview + '”' }) : null,\n fv ? el('span', { class: 'chip' }, [\n el('span', { text: 'last writer' }),\n el('b', { class: 'mono', text: shortNode(fv.nodeId) }),\n el('span', { class: 'mono', text: fmtDateTime(fv.wallTime) })\n ]) : el('span', { class: 'chip', text: 'no field version' })\n ]));\n });\n\n drawer.appendChild(el('h4', { text: 'Causal graph for this record' }));\n var dagBox = el('div', { class: 'dagwrap' });\n drawer.appendChild(dagBox);\n api('/api/collections/' + state.collection + '/dag?record=' + encodeURIComponent(id)).then(function (dag) {\n renderDag(dagBox, dag, 500);\n });\n\n drawer.appendChild(el('h4', { text: 'Operation history (newest first)' }));\n if (!data.operations.length) drawer.appendChild(el('div', { class: 'empty', text: 'No operations (compacted?).' }));\n data.operations.forEach(function (o) {\n var body = el('div', { class: 'op ' + o.type }, [\n el('div', {}, [\n el('span', { class: 'badge ' + o.type, text: o.type }),\n el('span', { class: 'meta', text: ' ' + shortNode(o.nodeId) + ' · seq ' + o.sequenceNumber + ' · ' + (o.timestamp ? fmtDateTime(o.timestamp.wallTime) : '·') })\n ])\n ]);\n if (o.data) {\n var pre = el('pre', { class: 'mono' });\n pre.textContent = JSON.stringify(o.data, null, 1);\n body.appendChild(pre);\n }\n drawer.appendChild(body);\n });\n drawer.className = 'drawer open';\n }).catch(function (e) { alertError(e); });\n }\n function closeDrawer() { qs('#drawer').className = 'drawer'; }\n\n // ── Operations tab (DAG + table) ───────────────────────────────────────────\n function renderOps(main) {\n if (!state.collection) { main.appendChild(el('div', { class: 'empty', text: 'No collections.' })); return; }\n toolbar(main, state.collection + ' — operation log');\n var dagBox = el('div', { class: 'dagwrap' });\n main.appendChild(dagBox);\n api('/api/collections/' + state.collection + '/dag?limit=120').then(function (dag) {\n renderDag(dagBox, dag, null);\n });\n\n api('/api/collections/' + state.collection + '/ops?limit=' + PAGE + '&offset=' + (state.page * PAGE)).then(function (data) {\n if (!data.operations.length) { main.appendChild(el('div', { class: 'empty', text: 'Empty (compacted?).' })); return; }\n var thead = el('tr', {}, ['type', 'record', 'node', 'seq', 'time', 'data'].map(function (h) { return el('th', { text: h }); }));\n var tbody = el('tbody', {}, data.operations.map(function (o) {\n return el('tr', { class: 'clickable', onclick: function () { openRecord(o.recordId); } }, [\n el('td', {}, [el('span', { class: 'badge ' + o.type, text: o.type })]),\n el('td', { class: 'mono', text: shortId(o.recordId) }),\n el('td', { class: 'mono', text: shortNode(o.nodeId) }),\n el('td', { class: 'mono', text: String(o.sequenceNumber) }),\n el('td', { class: 'mono', text: o.timestamp ? fmtDateTime(o.timestamp.wallTime) : '·' }),\n el('td', { class: 'mono', text: o.data ? JSON.stringify(o.data).slice(0, 70) : '·' })\n ]);\n }));\n main.appendChild(el('table', { class: 'grid' }, [el('thead', {}, [thead]), tbody]));\n pager(main, data.total);\n }).catch(showError(main));\n }\n\n // ── Causal DAG renderer (SVG) ──────────────────────────────────────────────\n function renderDag(container, dag, maxWidth) {\n container.textContent = '';\n if (!dag.nodes.length) { container.appendChild(el('div', { class: 'empty', text: 'No operations to graph.' })); return; }\n var XSTEP = 46, YSTEP = 44, PADX = 90, PADY = 26, R = 7;\n var width = PADX + dag.nodes.length * XSTEP + 30;\n var height = PADY + dag.lanes.length * YSTEP + 16;\n var svgns = 'http://www.w3.org/2000/svg';\n var svg = document.createElementNS(svgns, 'svg');\n svg.setAttribute('width', String(width));\n svg.setAttribute('height', String(height));\n\n var defs = document.createElementNS(svgns, 'defs');\n defs.innerHTML = '<marker id=\"arrow\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"6\" markerHeight=\"6\" orient=\"auto-start-reverse\"><path d=\"M 0 0 L 10 5 L 0 10 z\" fill=\"#3a4356\"/></marker>';\n svg.appendChild(defs);\n\n var colors = { insert: '#48bb78', update: '#4299e1', delete: '#f56565' };\n var pos = {};\n dag.nodes.forEach(function (n) {\n pos[n.id] = { x: PADX + n.x * XSTEP, y: PADY + n.lane * YSTEP + YSTEP / 2 };\n });\n\n dag.lanes.forEach(function (lane, i) {\n var y = PADY + i * YSTEP + YSTEP / 2;\n var line = document.createElementNS(svgns, 'line');\n line.setAttribute('x1', '10'); line.setAttribute('x2', String(width - 10));\n line.setAttribute('y1', String(y)); line.setAttribute('y2', String(y));\n line.setAttribute('class', 'dag-lane-line');\n svg.appendChild(line);\n var label = document.createElementNS(svgns, 'text');\n label.setAttribute('x', '10'); label.setAttribute('y', String(y - 8));\n label.setAttribute('class', 'dag-lane-label');\n label.textContent = lane.shortNodeId;\n svg.appendChild(label);\n });\n\n dag.edges.forEach(function (e) {\n var a = pos[e.from], b = pos[e.to];\n if (!a || !b) return;\n var path = document.createElementNS(svgns, 'path');\n var midX = (a.x + b.x) / 2;\n path.setAttribute('d', 'M ' + a.x + ' ' + a.y + ' C ' + midX + ' ' + a.y + ', ' + midX + ' ' + b.y + ', ' + (b.x - R - 2) + ' ' + b.y);\n path.setAttribute('class', 'dag-edge');\n svg.appendChild(path);\n });\n\n var tip = qs('#dagtip');\n dag.nodes.forEach(function (n) {\n var g = document.createElementNS(svgns, 'g');\n g.setAttribute('class', 'dag-node');\n var c = document.createElementNS(svgns, 'circle');\n var p = pos[n.id];\n c.setAttribute('cx', String(p.x)); c.setAttribute('cy', String(p.y)); c.setAttribute('r', String(R));\n c.setAttribute('fill', '#161a22');\n c.setAttribute('stroke', colors[n.type] || '#8b93a7');\n g.appendChild(c);\n g.addEventListener('mousemove', function (ev) {\n tip.style.display = 'block';\n tip.style.left = (ev.clientX + 14) + 'px';\n tip.style.top = (ev.clientY + 14) + 'px';\n tip.innerHTML = '<b>' + n.type + '</b> by ' + n.shortNodeId + ' · seq ' + n.sequenceNumber +\n '<br/>record ' + shortId(n.recordId) +\n (n.dataPreview ? '<br/><span class=\"mono\">' + escapeHtml(n.dataPreview) + '</span>' : '');\n });\n g.addEventListener('mouseleave', function () { tip.style.display = 'none'; });\n g.addEventListener('click', function () { openRecord(n.recordId); });\n svg.appendChild(g);\n });\n\n if (maxWidth) container.style.maxWidth = maxWidth + 'px';\n container.appendChild(svg);\n container.scrollLeft = width;\n }\n function escapeHtml(s) {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n }\n\n // ── Time travel tab ────────────────────────────────────────────────────────\n function renderTimeTravel(main) {\n if (!state.collection) { main.appendChild(el('div', { class: 'empty', text: 'No collections.' })); return; }\n toolbar(main, state.collection + ' — time travel');\n api('/api/collections/' + state.collection + '/replay').then(function (full) {\n var total = full.totalCount;\n if (!total) { main.appendChild(el('div', { class: 'empty', text: 'No operations to replay.' })); return; }\n if (state.ttPosition === null || state.ttPosition > total) state.ttPosition = total;\n\n var posLabel = el('span', { class: 'mono', text: '' });\n var slider = el('input', { type: 'range', min: '1', max: String(total), value: String(state.ttPosition) });\n var playBtn = el('button', { text: '▶ replay' });\n var cutBox = el('div', { class: 'tt-cut mono' });\n var stateBox = el('div', {});\n\n function show(position) {\n state.ttPosition = position;\n posLabel.textContent = position + ' / ' + total + ' ops';\n api('/api/collections/' + state.collection + '/replay?upTo=' + encodeURIComponent(opIdAt(position))).then(function (cut) {\n var o = cut.cutOperation;\n cutBox.innerHTML = o\n ? 'cut at <b>' + o.type + '</b> by ' + shortNode(o.nodeId) + ' · ' + (o.timestamp ? fmtDateTime(o.timestamp.wallTime) : '') +\n (o.data ? ' · ' + escapeHtml(JSON.stringify(o.data).slice(0, 90)) : '')\n : '';\n renderReplayState(stateBox, cut);\n });\n }\n // The full replay result orders ops by HLC; fetch the ordered id list once.\n var orderedIds = [];\n api('/api/collections/' + state.collection + '/dag?limit=20000').then(function (dag) {\n orderedIds = dag.nodes.map(function (n) { return n.id; });\n show(Math.min(state.ttPosition, orderedIds.length));\n });\n function opIdAt(position) { return orderedIds[position - 1]; }\n\n slider.oninput = function () { show(Number(slider.value)); };\n playBtn.onclick = function () {\n if (state.ttPlaying) { clearInterval(state.ttPlaying); state.ttPlaying = null; playBtn.textContent = '▶ replay'; return; }\n var pos = 1;\n playBtn.textContent = '⏸ pause';\n state.ttPlaying = setInterval(function () {\n if (pos > orderedIds.length) { clearInterval(state.ttPlaying); state.ttPlaying = null; playBtn.textContent = '▶ replay'; return; }\n slider.value = String(pos);\n show(pos);\n pos++;\n }, 350);\n };\n\n main.appendChild(el('div', { class: 'tt-controls' }, [playBtn, slider, posLabel]));\n main.appendChild(cutBox);\n main.appendChild(stateBox);\n }).catch(showError(main));\n }\n\n function renderReplayState(box, cut) {\n box.textContent = '';\n if (!cut.records.length) { box.appendChild(el('div', { class: 'empty', text: 'No records at this point.' })); return; }\n var fieldSet = {};\n cut.records.forEach(function (r) { Object.keys(r.fields).forEach(function (f) { fieldSet[f] = true; }); });\n var fields = Object.keys(fieldSet);\n var thead = el('tr', {}, [el('th', { text: 'id' })].concat(fields.map(function (f) { return el('th', { text: f }); })));\n var tbody = el('tbody', {}, cut.records.map(function (r) {\n return el('tr', { class: r.deleted ? 'tombstone' : '' },\n [el('td', { class: 'mono', text: shortId(r.id) })].concat(fields.map(function (f) {\n return el('td', { text: r.fields[f] === undefined ? '' : fmtVal(r.fields[f]).slice(0, 40) });\n })));\n }));\n box.appendChild(el('table', { class: 'grid' }, [el('thead', {}, [thead]), tbody]));\n }\n\n // ── Merges tab ─────────────────────────────────────────────────────────────\n function renderMerges(main) {\n toolbar(main, 'Merge audit trail');\n api('/api/audit?limit=200').then(function (data) {\n if (!data.traces.length) { main.appendChild(el('div', { class: 'empty', text: 'No merge audit traces recorded.' })); return; }\n var thead = el('tr', {}, ['when', 'event', 'collection', 'record', 'field', 'strategy', 'tier'].map(function (h) { return el('th', { text: h }); }));\n var tbody = el('tbody', {}, data.traces.map(function (t) {\n return el('tr', {}, [\n el('td', { class: 'mono', text: fmtDateTime(t.recordedAt) }),\n el('td', { text: t.eventType }),\n el('td', { text: t.collection }),\n el('td', { class: 'mono', text: shortId(t.recordId) }),\n el('td', { text: t.field }),\n el('td', { text: t.strategy }),\n el('td', { text: String(t.tier) })\n ]);\n }));\n main.appendChild(el('table', { class: 'grid' }, [el('thead', {}, [thead]), tbody]));\n }).catch(showError(main));\n }\n\n // ── Sync tab ───────────────────────────────────────────────────────────────\n function renderSync(main) {\n toolbar(main, 'Sync state' + (state.device ? ' — ' + state.device : ''));\n var o = state.overview;\n main.appendChild(el('div', { class: 'panel' }, [\n el('h3', { text: 'Version vector — what this store has seen from each node' }),\n el('table', { class: 'grid' }, [\n el('thead', {}, [el('tr', {}, [el('th', { text: 'node' }), el('th', { text: 'max sequence' })])]),\n el('tbody', {}, o.versionVector.map(function (v) {\n return el('tr', {}, [el('td', { class: 'mono', text: v.nodeId }), el('td', { class: 'mono', text: String(v.sequenceNumber) })]);\n }))\n ])\n ]));\n main.appendChild(el('div', { class: 'panel' }, [\n el('h3', { text: 'Outbound queue' }),\n el('div', { text: o.pendingSyncOps + ' operation(s) waiting to sync' })\n ]));\n main.appendChild(el('div', { class: 'panel' }, [\n el('h3', { text: 'Store meta' }),\n el('table', { class: 'grid' }, [\n el('tbody', {}, o.meta.map(function (m) {\n return el('tr', {}, [el('td', { class: 'mono', text: m.key }), el('td', { class: 'mono', text: m.value })]);\n }))\n ])\n ]));\n if (state.mode === 'spectator') {\n var feedBox = el('div', { class: 'lab-feed', style: 'width:100%;max-height:340px' }, [\n el('h3', { text: 'Live events from the server' }),\n el('div', { class: 'feed', id: 'feed' })\n ]);\n main.appendChild(feedBox);\n state.feed.slice(-200).forEach(appendFeedLine);\n }\n }\n\n // ── Lab tab ────────────────────────────────────────────────────────────────\n function renderLab(full) {\n var main = qs('#main');\n qs('#sidebar').style.display = 'none';\n Promise.all([fetch('/api/lab/state').then(function (r) { return r.json(); }),\n fetch('/api/lab/convergence').then(function (r) { return r.json(); })])\n .then(function (results) {\n state.labState = results[0];\n state.devices = results[0].devices.map(function (d) { return d.name; });\n var convergence = results[1];\n main.textContent = '';\n qs('#dbpath').textContent = 'sync laboratory · ' + results[0].serverOperations + ' ops on server';\n\n var conv = el('div', { class: 'convergence ' + (convergence.converged ? 'ok' : 'bad') }, [\n el('div', { text: convergence.converged\n ? '✓ ALL ' + convergence.deviceCount + ' DEVICES CONVERGED'\n : '✗ DEVICES DIVERGED (' + convergence.differences.length + ' difference(s)) — sync to converge' })\n ]);\n if (!convergence.converged) {\n conv.appendChild(el('div', { class: 'diffs', text: convergence.differences.slice(0, 4).join(' · ') }));\n }\n var addBtn = el('button', { class: 'primary', text: '+ add device', onclick: function () {\n post('/api/lab/devices', {}).then(function () { render(true); }).catch(alertError);\n } });\n var syncAllBtn = el('button', { text: 'sync all', onclick: function () {\n var chain = Promise.resolve();\n state.devices.forEach(function (d) { chain = chain.then(function () { return post('/api/lab/devices/' + d + '/sync', {}); }); });\n chain.then(function () { return post('/api/lab/devices/' + state.devices[0] + '/sync', {}); })\n .then(function () { render(true); }).catch(alertError);\n } });\n main.appendChild(el('div', { class: 'lab-top' }, [conv, addBtn, syncAllBtn]));\n\n var devicesBox = el('div', { class: 'lab-devices' });\n results[0].devices.forEach(function (d) { devicesBox.appendChild(deviceCard(d, results[0].collections)); });\n\n var feedBox = el('div', { class: 'lab-feed' }, [\n el('h3', { text: 'Live events' }),\n el('div', { class: 'feed', id: 'feed' })\n ]);\n main.appendChild(el('div', { class: 'lab-grid' }, [devicesBox, feedBox]));\n state.feed.slice(-200).forEach(appendFeedLine);\n })\n .catch(showError(qs('#main')));\n }\n\n function deviceCard(d, collections) {\n var collection = collections[0];\n var card = el('div', { class: 'device-card' + (d.connected ? '' : ' offline') });\n card.appendChild(el('div', { class: 'device-head' }, [\n el('span', { class: 'name ' + deviceColor(d.name), text: d.name }),\n el('span', { class: 'node mono', text: shortNode(d.nodeId) }),\n el('span', { class: 'badge ' + (d.connected ? 'ok' : 'bad'), text: d.connected ? 'online' : 'offline' }),\n d.pendingOperations ? el('span', { class: 'badge neutral', text: d.pendingOperations + ' queued' }) : null,\n el('span', { class: 'spacer' }),\n el('button', { text: d.connected ? 'disconnect' : 'connect', onclick: function () {\n post('/api/lab/devices/' + d.name + '/' + (d.connected ? 'disconnect' : 'connect'), {})\n .then(function () { render(true); }).catch(alertError);\n } }),\n el('button', { text: 'sync', onclick: function () {\n post('/api/lab/devices/' + d.name + '/sync', {}).then(function () { render(true); }).catch(alertError);\n } })\n ]));\n\n var body = el('div', { class: 'device-body' });\n card.appendChild(body);\n\n // Chaos controls\n body.appendChild(el('h5', { text: 'Network chaos (applies on next connect)' }));\n var chaosDefs = [['dropRate', 'drop'], ['duplicateRate', 'duplicate'], ['reorderRate', 'reorder']];\n chaosDefs.forEach(function (cd) {\n var key = cd[0];\n var valueLabel = el('span', { class: 'mono', text: String(d.chaos[key]) });\n var range = el('input', { type: 'range', min: '0', max: '0.5', step: '0.05', value: String(d.chaos[key]) });\n range.oninput = function () { valueLabel.textContent = range.value; };\n range.onchange = function () {\n var body2 = {}; body2[key] = Number(range.value);\n post('/api/lab/devices/' + d.name + '/chaos', body2).catch(alertError);\n };\n body.appendChild(el('div', { class: 'chaos-row' }, [el('span', { text: cd[1] }), range, valueLabel]));\n });\n\n // Records with inline editing\n body.appendChild(el('h5', { text: 'records (' + collection.name + ') — edits happen ON this device' }));\n var recBox = el('div', {});\n body.appendChild(recBox);\n api('/api/collections/' + collection.name + '/records?limit=20&device=' + encodeURIComponent(d.name)).then(function (data) {\n data.records.forEach(function (r) {\n var titleInput = el('input', { type: 'text', value: String(r.fields.title || '') });\n titleInput.onchange = function () {\n post('/api/lab/devices/' + d.name + '/update', { collection: collection.name, id: r.id, data: { title: titleInput.value } }).catch(alertError);\n };\n var doneCb = el('input', { type: 'checkbox', title: 'done' });\n doneCb.checked = !!r.fields.done;\n doneCb.onchange = function () {\n post('/api/lab/devices/' + d.name + '/update', { collection: collection.name, id: r.id, data: { done: doneCb.checked } }).catch(alertError);\n };\n var incBtn = el('button', { text: '+1', title: 'atomic increment — composes across devices', onclick: function () {\n post('/api/lab/devices/' + d.name + '/update', { collection: collection.name, id: r.id, data: {}, increments: { points: 1 } })\n .then(function () { debounceRefresh(); }).catch(alertError);\n } });\n var delBtn = el('button', { class: 'danger', text: '✕', title: 'delete', onclick: function () {\n post('/api/lab/devices/' + d.name + '/delete', { collection: collection.name, id: r.id })\n .then(function () { debounceRefresh(); }).catch(alertError);\n } });\n recBox.appendChild(el('div', { class: 'rec-line' }, [\n doneCb, titleInput,\n el('span', { class: 'pts mono', text: String(r.fields.points === undefined ? '' : r.fields.points) }),\n incBtn, delBtn,\n el('button', { text: '⌕', title: 'inspect', onclick: function () { state.device = d.name; state.collection = collection.name; openRecord(r.id); } })\n ]));\n });\n if (!data.records.length) recBox.appendChild(el('div', { class: 'empty', text: 'no records yet' }));\n });\n\n // Insert form\n var newTitle = el('input', { type: 'text', placeholder: 'new task title…' });\n var insertBtn = el('button', { class: 'primary', text: 'insert', onclick: function () {\n if (!newTitle.value.trim()) return;\n post('/api/lab/devices/' + d.name + '/insert', { collection: collection.name, data: { title: newTitle.value.trim() } })\n .then(function () { newTitle.value = ''; debounceRefresh(); }).catch(alertError);\n } });\n newTitle.addEventListener('keydown', function (e) { if (e.key === 'Enter') insertBtn.click(); });\n body.appendChild(el('div', { class: 'insert-form' }, [newTitle, insertBtn]));\n return card;\n }\n\n function appendFeedLine(event) {\n var feed = qs('#feed');\n if (!feed) return;\n var cls = 'feed-line';\n if (event.type === 'operation:created') cls += ' evt-created';\n if (event.type === 'operation:applied') cls += ' evt-applied';\n if (event.type === 'merge:conflict') cls += ' evt-conflict';\n if (event.type === 'sync:apply-failed') cls += ' evt-failed';\n feed.appendChild(el('div', { class: cls }, [\n el('span', { class: 'mono', text: fmtTime(event.at) }),\n el('span', { class: 'dev ' + deviceColor(event.device), text: event.device }),\n el('span', { class: 'what', text: event.type.replace('operation:', '').replace('sync:', '') + ' · ' + event.summary })\n ]));\n feed.scrollTop = feed.scrollHeight;\n }\n\n // ── Misc ───────────────────────────────────────────────────────────────────\n function showError(main) {\n return function (e) { main.appendChild(el('div', { class: 'error', text: e.message })); };\n }\n function alertError(e) { console.error(e); qs('#dbpath').textContent = 'error: ' + e.message; }\n\n qs('#refresh').onclick = function () { render(true); };\n document.addEventListener('keydown', function (e) { if (e.key === 'Escape') closeDrawer(); });\n})();\n`\n","/** Kora Studio stylesheet (served at /style.css). */\nexport const STUDIO_CSS = `\n:root {\n --bg: #0e1015; --panel: #161a22; --panel-2: #1c212c; --panel-3: #232936;\n --border: #262c3a; --text: #e6e9f0; --muted: #8b93a7;\n --accent: #4fd1c5; --accent-2: #9f7aea;\n --insert: #48bb78; --update: #4299e1; --delete: #f56565; --warn: #ed8936;\n --ok-bg: rgba(72,187,120,.12); --bad-bg: rgba(245,101,101,.12);\n}\n* { box-sizing: border-box; margin: 0; padding: 0; }\nhtml, body { height: 100%; }\nbody {\n background: var(--bg); color: var(--text); overflow: hidden;\n font: 14px/1.5 ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif;\n}\n.mono { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 12px; }\nbutton {\n background: var(--panel-2); color: var(--text); border: 1px solid var(--border);\n border-radius: 6px; padding: 5px 12px; cursor: pointer; font-size: 13px;\n}\nbutton:hover { border-color: var(--accent); }\nbutton.primary { background: rgba(79,209,197,.12); border-color: var(--accent); color: var(--accent); }\nbutton.danger { color: var(--delete); }\nbutton:disabled { opacity: .4; cursor: default; }\ninput, select {\n background: var(--bg); color: var(--text); border: 1px solid var(--border);\n border-radius: 6px; padding: 4px 8px; font-size: 13px;\n}\ninput:focus, select:focus { outline: none; border-color: var(--accent); }\ninput[type=\"checkbox\"] { width: auto; }\ninput[type=\"range\"] { padding: 0; }\n\nheader {\n display: flex; align-items: center; gap: 14px; padding: 10px 16px;\n background: var(--panel); border-bottom: 1px solid var(--border); height: 48px;\n}\nheader .logo { font-weight: 700; letter-spacing: .3px; white-space: nowrap; }\nheader .logo span { color: var(--accent); }\nheader .modebadge {\n font-size: 10px; text-transform: uppercase; letter-spacing: 1px; padding: 2px 8px;\n border-radius: 10px; background: rgba(159,122,234,.15); color: var(--accent-2);\n}\nheader .dbpath { color: var(--muted); font-size: 12px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex: 1; }\nheader .live { display: flex; align-items: center; gap: 6px; color: var(--muted); font-size: 12px; }\nheader .live .dot { width: 8px; height: 8px; border-radius: 50%; background: var(--muted); }\nheader .live.on .dot { background: var(--insert); box-shadow: 0 0 8px rgba(72,187,120,.8); }\n\n.tabs { display: flex; gap: 2px; padding: 0 16px; background: var(--panel); border-bottom: 1px solid var(--border); }\n.tabs .tab {\n padding: 8px 16px; cursor: pointer; color: var(--muted); font-size: 13px;\n border-bottom: 2px solid transparent; user-select: none;\n}\n.tabs .tab:hover { color: var(--text); }\n.tabs .tab.active { color: var(--accent); border-bottom-color: var(--accent); }\n.tabs .spacer { flex: 1; }\n.tabs .devicepick { display: flex; align-items: center; gap: 6px; padding: 6px 0; color: var(--muted); font-size: 12px; }\n\n.layout { display: flex; height: calc(100vh - 85px); }\nnav.sidebar {\n width: 220px; background: var(--panel); border-right: 1px solid var(--border);\n padding: 12px 0; overflow-y: auto; flex-shrink: 0;\n}\nnav.sidebar h3 { font-size: 11px; text-transform: uppercase; letter-spacing: .8px; color: var(--muted); padding: 8px 16px 4px; }\nnav.sidebar .item {\n display: flex; justify-content: space-between; align-items: center;\n padding: 6px 16px; cursor: pointer; border-left: 2px solid transparent; font-size: 13px;\n}\nnav.sidebar .item:hover { background: var(--panel-2); }\nnav.sidebar .item.active { border-left-color: var(--accent); background: var(--panel-2); }\nnav.sidebar .item .count { color: var(--muted); font-size: 11px; }\nmain { flex: 1; overflow: auto; padding: 16px 20px; }\n\n.toolbar { display: flex; align-items: center; gap: 10px; margin-bottom: 12px; flex-wrap: wrap; }\n.toolbar h2 { font-size: 16px; margin-right: auto; }\n.toolbar label { color: var(--muted); font-size: 12px; display: flex; align-items: center; gap: 5px; cursor: pointer; }\n\ntable.grid { width: 100%; border-collapse: collapse; background: var(--panel); border: 1px solid var(--border); border-radius: 8px; overflow: hidden; }\ntable.grid th, table.grid td { text-align: left; padding: 7px 10px; border-bottom: 1px solid var(--border); vertical-align: top; }\ntable.grid th { background: var(--panel-2); color: var(--muted); font-size: 11px; text-transform: uppercase; letter-spacing: .5px; position: sticky; top: 0; z-index: 1; }\ntable.grid tbody tr.clickable { cursor: pointer; }\ntable.grid tbody tr.clickable:hover { background: var(--panel-2); }\ntr.tombstone td { color: var(--muted); text-decoration: line-through; }\n\n.badge { display: inline-block; padding: 1px 8px; border-radius: 10px; font-size: 11px; font-weight: 600; }\n.badge.insert { background: rgba(72,187,120,.15); color: var(--insert); }\n.badge.update { background: rgba(66,153,225,.15); color: var(--update); }\n.badge.delete { background: rgba(245,101,101,.15); color: var(--delete); }\n.badge.neutral { background: var(--panel-3); color: var(--muted); }\n.badge.ok { background: var(--ok-bg); color: var(--insert); }\n.badge.bad { background: var(--bad-bg); color: var(--delete); }\n\n.chip {\n display: inline-flex; gap: 6px; align-items: center; background: var(--panel-2);\n border: 1px solid var(--border); border-radius: 6px; padding: 2px 8px; font-size: 11px; color: var(--muted);\n}\n.chip b { color: var(--accent-2); font-weight: 600; }\n\n.pager { display: flex; gap: 8px; align-items: center; margin-top: 10px; color: var(--muted); font-size: 12px; }\n.empty { color: var(--muted); padding: 40px; text-align: center; }\n.error { color: var(--delete); padding: 20px; }\n\n.drawer {\n position: fixed; top: 85px; right: 0; bottom: 0; width: 560px; max-width: 92vw;\n background: var(--panel); border-left: 1px solid var(--border); overflow-y: auto;\n padding: 16px; box-shadow: -12px 0 30px rgba(0,0,0,.45); display: none; z-index: 20;\n}\n.drawer.open { display: block; }\n.drawer h3 { font-size: 14px; margin-bottom: 10px; display: flex; justify-content: space-between; align-items: center; }\n.drawer h4 { font-size: 12px; color: var(--muted); text-transform: uppercase; letter-spacing: .6px; margin: 16px 0 8px; }\n.drawer .close { cursor: pointer; color: var(--muted); padding: 4px 8px; }\n.fieldrow { padding: 8px 10px; background: var(--panel-2); border: 1px solid var(--border); border-radius: 8px; margin-bottom: 6px; }\n.fieldrow .fname { color: var(--accent); font-size: 12px; }\n.fieldrow .fval { word-break: break-word; margin: 2px 0 4px; }\n.fieldrow .preview { color: var(--muted); font-style: italic; }\n\n.op { border-left: 2px solid var(--border); margin-left: 6px; padding: 6px 0 6px 14px; position: relative; }\n.op::before { content: \"\"; position: absolute; left: -5px; top: 13px; width: 8px; height: 8px; border-radius: 50%; background: var(--muted); }\n.op.insert::before { background: var(--insert); } .op.update::before { background: var(--update); } .op.delete::before { background: var(--delete); }\n.op .meta { color: var(--muted); font-size: 11px; }\n.op pre { background: var(--bg); border: 1px solid var(--border); border-radius: 6px; padding: 6px 8px; margin-top: 4px; overflow-x: auto; }\n\n.panel { background: var(--panel); border: 1px solid var(--border); border-radius: 8px; padding: 14px; margin-bottom: 14px; }\n.panel h3 { font-size: 13px; margin-bottom: 8px; color: var(--accent); }\n\n/* DAG */\n.dagwrap { background: var(--panel); border: 1px solid var(--border); border-radius: 8px; overflow-x: auto; margin-bottom: 14px; }\n.dagwrap svg { display: block; }\n.dag-node { cursor: pointer; }\n.dag-node circle { stroke-width: 2; }\n.dag-node text { fill: var(--muted); font-size: 10px; font-family: ui-monospace, Menlo, monospace; }\n.dag-edge { stroke: #3a4356; stroke-width: 1.4; fill: none; marker-end: url(#arrow); }\n.dag-lane-label { fill: var(--accent-2); font-size: 11px; font-family: ui-monospace, Menlo, monospace; }\n.dag-lane-line { stroke: #1d2330; stroke-width: 1; }\n.dag-tip {\n position: fixed; background: var(--panel-3); border: 1px solid var(--border); border-radius: 6px;\n padding: 6px 10px; font-size: 12px; pointer-events: none; z-index: 50; max-width: 380px; display: none;\n}\n\n/* Time travel */\n.tt-controls { display: flex; align-items: center; gap: 12px; margin-bottom: 14px; }\n.tt-controls input[type=\"range\"] { flex: 1; }\n.tt-cut { background: var(--panel-2); border: 1px solid var(--border); border-radius: 8px; padding: 10px 12px; margin-bottom: 14px; font-size: 12px; }\n\n/* Lab */\n.lab-top { display: flex; align-items: center; gap: 12px; margin-bottom: 14px; flex-wrap: wrap; }\n.convergence { padding: 8px 14px; border-radius: 8px; font-weight: 600; font-size: 13px; }\n.convergence.ok { background: var(--ok-bg); color: var(--insert); border: 1px solid rgba(72,187,120,.4); }\n.convergence.bad { background: var(--bad-bg); color: var(--delete); border: 1px solid rgba(245,101,101,.4); }\n.convergence .diffs { font-weight: 400; font-size: 11px; margin-top: 4px; color: var(--muted); }\n.lab-grid { display: flex; gap: 14px; align-items: flex-start; }\n.lab-devices { flex: 1; display: grid; grid-template-columns: repeat(auto-fill, minmax(390px, 1fr)); gap: 14px; }\n.device-card { background: var(--panel); border: 1px solid var(--border); border-radius: 10px; overflow: hidden; }\n.device-card.offline { border-color: rgba(245,101,101,.35); }\n.device-head { display: flex; align-items: center; gap: 8px; padding: 10px 12px; background: var(--panel-2); }\n.device-head .name { font-weight: 700; }\n.device-head .node { color: var(--muted); font-size: 11px; }\n.device-head .spacer { flex: 1; }\n.device-body { padding: 10px 12px; }\n.device-body h5 { font-size: 11px; color: var(--muted); text-transform: uppercase; letter-spacing: .6px; margin: 10px 0 6px; }\n.chaos-row { display: grid; grid-template-columns: 78px 1fr 44px; gap: 6px; align-items: center; font-size: 11px; color: var(--muted); margin-bottom: 3px; }\n.rec-line { display: flex; align-items: center; gap: 6px; padding: 5px 6px; border-bottom: 1px solid var(--border); font-size: 12px; flex-wrap: wrap; }\n.rec-line:hover { background: var(--panel-2); }\n.rec-line .title { flex: 1; min-width: 120px; }\n.rec-line input[type=\"text\"] { font-size: 12px; padding: 2px 6px; width: 130px; }\n.rec-line .pts { color: var(--accent); min-width: 30px; text-align: right; }\n.insert-form { display: flex; gap: 6px; margin-top: 8px; flex-wrap: wrap; }\n.insert-form input { flex: 1; min-width: 120px; }\n.lab-feed { width: 360px; flex-shrink: 0; background: var(--panel); border: 1px solid var(--border); border-radius: 10px; display: flex; flex-direction: column; max-height: calc(100vh - 200px); }\n.lab-feed h3 { font-size: 12px; color: var(--muted); text-transform: uppercase; letter-spacing: .6px; padding: 10px 12px; border-bottom: 1px solid var(--border); }\n.lab-feed .feed { overflow-y: auto; padding: 6px 0; flex: 1; }\n.feed-line { display: flex; gap: 8px; padding: 3px 12px; font-size: 11px; align-items: baseline; }\n.feed-line .dev { min-width: 66px; font-weight: 600; }\n.feed-line .what { color: var(--muted); }\n.feed-line.evt-created .what, .feed-line.evt-applied .what { color: var(--text); }\n.feed-line.evt-conflict .what { color: var(--warn); }\n.feed-line.evt-failed .what { color: var(--delete); font-weight: 700; }\n.dev-c0 { color: #4fd1c5; } .dev-c1 { color: #9f7aea; } .dev-c2 { color: #f6ad55; }\n.dev-c3 { color: #63b3ed; } .dev-c4 { color: #f687b3; } .dev-c5 { color: #68d391; }\n`\n","import type { IncomingMessage, Server, ServerResponse } from 'node:http'\nimport { createServer } from 'node:http'\nimport { StudioDbReader } from './db-reader'\nimport type { LabManager } from './lab-manager'\nimport { buildCausalDag, replayToOperation } from './studio-replay'\nimport { STUDIO_HTML } from './studio-ui'\nimport { STUDIO_APP_JS } from './studio-ui-app'\nimport { STUDIO_CSS } from './studio-ui-css'\n\n/**\n * Kora Studio HTTP server.\n *\n * Two modes share one inspection surface:\n * - FILE mode: read-only against a user database. Strictly GET.\n * - LAB mode: an in-process multi-device sync laboratory. Lab routes accept\n * POST, but only ever touch the Lab's throwaway databases — a user database\n * opened by Studio is never writable, in any mode.\n *\n * Live updates flow over Server-Sent Events: file mode polls SQLite's\n * data_version (cheap, cross-connection), lab mode pushes real device events.\n */\nexport interface StudioServerOptions {\n\tport: number\n\thost?: string\n\t/** File mode: path of the database to inspect. */\n\tdbPath?: string\n\t/** Lab mode: the running lab. */\n\tlab?: LabManager\n\t/** Spectator mode: live read-only replica of a production sync server. */\n\tspectator?: import('./spectator-manager').SpectatorManager\n}\n\nexport interface StudioServer {\n\tserver: Server\n\tport: number\n\turl: string\n\tclose(): Promise<void>\n}\n\ninterface StudioContext {\n\tmode: 'file' | 'lab' | 'spectator'\n\tlab: LabManager | null\n\tspectator: import('./spectator-manager').SpectatorManager | null\n\tmainReader: StudioDbReader | null\n\t/** Lazily-opened read-only readers for lab device DBs. */\n\tdeviceReaders: Map<string, StudioDbReader>\n}\n\nconst SSE_POLL_MS = 700\n\nexport async function startStudioServer(options: StudioServerOptions): Promise<StudioServer> {\n\tconst host = options.host ?? '127.0.0.1'\n\t// The spectator's replica is inspected exactly like a file-mode database.\n\tconst dbPath = options.spectator ? options.spectator.dbPath : options.dbPath\n\tconst context: StudioContext = {\n\t\tmode: options.spectator ? 'spectator' : options.lab ? 'lab' : 'file',\n\t\tlab: options.lab ?? null,\n\t\tspectator: options.spectator ?? null,\n\t\tmainReader: dbPath ? await StudioDbReader.open(dbPath) : null,\n\t\tdeviceReaders: new Map(),\n\t}\n\n\tconst sseClients = new Set<ServerResponse>()\n\tconst broadcast = (event: string, data: unknown): void => {\n\t\tconst payload = `event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`\n\t\tfor (const client of sseClients) {\n\t\t\tclient.write(payload)\n\t\t}\n\t}\n\n\t// Spectator mode: forward live client events (op applied, sync, merges).\n\tlet unsubscribeSpectator: (() => void) | null = null\n\tif (context.spectator) {\n\t\tunsubscribeSpectator = context.spectator.onEvent((event) => {\n\t\t\tbroadcast('spectator', event)\n\t\t\tbroadcast('change', { at: event.at })\n\t\t})\n\t}\n\n\t// File mode: poll the DB's data_version and broadcast change ticks.\n\tlet pollTimer: ReturnType<typeof setInterval> | null = null\n\tif (context.mode === 'file' && context.mainReader) {\n\t\tlet lastFingerprint = context.mainReader.fingerprint()\n\t\tpollTimer = setInterval(() => {\n\t\t\ttry {\n\t\t\t\tconst current = context.mainReader?.fingerprint()\n\t\t\t\tif (current !== undefined && current !== lastFingerprint) {\n\t\t\t\t\tlastFingerprint = current\n\t\t\t\t\tbroadcast('change', { at: Date.now() })\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// DB temporarily busy — next tick will retry.\n\t\t\t}\n\t\t}, SSE_POLL_MS)\n\t}\n\n\t// Lab mode: forward live device events.\n\tlet unsubscribeLab: (() => void) | null = null\n\tif (context.lab) {\n\t\tunsubscribeLab = context.lab.onEvent((event) => {\n\t\t\tbroadcast('lab', event)\n\t\t\tbroadcast('change', { at: event.at })\n\t\t})\n\t}\n\n\tconst server = createServer((req, res) => {\n\t\thandleRequest(context, sseClients, req, res).catch((error: unknown) => {\n\t\t\tconst message = error instanceof Error ? error.message : 'Internal error'\n\t\t\tif (!res.headersSent) {\n\t\t\t\tsendJson(res, 500, { error: message })\n\t\t\t} else {\n\t\t\t\tres.end()\n\t\t\t}\n\t\t})\n\t})\n\n\tawait new Promise<void>((resolve, reject) => {\n\t\tserver.once('error', reject)\n\t\tserver.listen(options.port, host, () => {\n\t\t\tserver.removeListener('error', reject)\n\t\t\tresolve()\n\t\t})\n\t})\n\n\tconst address = server.address()\n\tconst port = typeof address === 'object' && address !== null ? address.port : options.port\n\n\treturn {\n\t\tserver,\n\t\tport,\n\t\turl: `http://${host}:${port}`,\n\t\tclose: async () => {\n\t\t\tif (pollTimer) {\n\t\t\t\tclearInterval(pollTimer)\n\t\t\t}\n\t\t\tunsubscribeSpectator?.()\n\t\t\tunsubscribeLab?.()\n\t\t\tfor (const client of sseClients) {\n\t\t\t\tclient.end()\n\t\t\t}\n\t\t\tsseClients.clear()\n\t\t\tcontext.mainReader?.close()\n\t\t\tfor (const [, reader] of context.deviceReaders) {\n\t\t\t\treader.close()\n\t\t\t}\n\t\t\tcontext.deviceReaders.clear()\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tserver.close((error) => (error ? reject(error) : resolve()))\n\t\t\t})\n\t\t},\n\t}\n}\n\nasync function resolveReader(context: StudioContext, url: URL): Promise<StudioDbReader> {\n\tconst device = url.searchParams.get('device')\n\tif (device && context.lab) {\n\t\tconst cached = context.deviceReaders.get(device)\n\t\tif (cached) {\n\t\t\treturn cached\n\t\t}\n\t\tconst state = context.lab.deviceState(device)\n\t\tconst reader = await StudioDbReader.open(state.dbPath)\n\t\tcontext.deviceReaders.set(device, reader)\n\t\treturn reader\n\t}\n\tif (context.mainReader) {\n\t\treturn context.mainReader\n\t}\n\t// Lab mode with no device specified: default to the first device.\n\tif (context.lab) {\n\t\tconst first = context.lab.listDevices()[0]\n\t\tif (first) {\n\t\t\treturn resolveReader(context, new URL(`${url.origin}${url.pathname}?device=${first.name}`))\n\t\t}\n\t}\n\tthrow new Error('No database available')\n}\n\nasync function handleRequest(\n\tcontext: StudioContext,\n\tsseClients: Set<ServerResponse>,\n\treq: IncomingMessage,\n\tres: ServerResponse,\n): Promise<void> {\n\tconst url = new URL(req.url ?? '/', 'http://studio.local')\n\tconst path = url.pathname\n\tconst method = req.method ?? 'GET'\n\n\t// ── Static assets ──\n\tif (method === 'GET' && (path === '/' || path === '/index.html')) {\n\t\tres.writeHead(200, { 'content-type': 'text/html; charset=utf-8' })\n\t\tres.end(STUDIO_HTML)\n\t\treturn\n\t}\n\tif (method === 'GET' && path === '/app.js') {\n\t\tres.writeHead(200, { 'content-type': 'text/javascript; charset=utf-8' })\n\t\tres.end(STUDIO_APP_JS)\n\t\treturn\n\t}\n\tif (method === 'GET' && path === '/style.css') {\n\t\tres.writeHead(200, { 'content-type': 'text/css; charset=utf-8' })\n\t\tres.end(STUDIO_CSS)\n\t\treturn\n\t}\n\n\t// ── Live updates (SSE) ──\n\tif (method === 'GET' && path === '/api/events') {\n\t\tres.writeHead(200, {\n\t\t\t'content-type': 'text/event-stream',\n\t\t\t'cache-control': 'no-store',\n\t\t\tconnection: 'keep-alive',\n\t\t})\n\t\tres.write(`event: hello\\ndata: ${JSON.stringify({ mode: context.mode })}\\n\\n`)\n\t\tif (context.lab) {\n\t\t\tfor (const event of context.lab.recentEvents().slice(-100)) {\n\t\t\t\tres.write(`event: lab\\ndata: ${JSON.stringify(event)}\\n\\n`)\n\t\t\t}\n\t\t}\n\t\tif (context.spectator) {\n\t\t\tfor (const event of context.spectator.recentEvents().slice(-100)) {\n\t\t\t\tres.write(`event: spectator\\ndata: ${JSON.stringify(event)}\\n\\n`)\n\t\t\t}\n\t\t}\n\t\tsseClients.add(res)\n\t\treq.on('close', () => {\n\t\t\tsseClients.delete(res)\n\t\t})\n\t\treturn\n\t}\n\n\t// ── Lab routes (POST allowed; lab DBs are throwaway) ──\n\tif (path.startsWith('/api/lab')) {\n\t\tif (!context.lab) {\n\t\t\tsendJson(res, 404, {\n\t\t\t\terror: 'Studio is not running in lab mode. Start with: kora studio --lab',\n\t\t\t})\n\t\t\treturn\n\t\t}\n\t\tawait handleLabRoute(context, context.lab, req, res, url)\n\t\treturn\n\t}\n\n\t// ── Everything else is strictly read-only ──\n\tif (method !== 'GET') {\n\t\tsendJson(res, 405, { error: 'Studio data routes are read-only: GET only.' })\n\t\treturn\n\t}\n\n\tif (path === '/api/mode') {\n\t\tsendJson(res, 200, {\n\t\t\tmode: context.mode,\n\t\t\tdevices: context.lab?.listDevices().map((d) => d.name) ?? [],\n\t\t\t...(context.spectator ? { spectator: context.spectator.status() } : {}),\n\t\t})\n\t\treturn\n\t}\n\n\tif (path === '/api/spectator/status') {\n\t\tif (!context.spectator) {\n\t\t\tsendJson(res, 404, { error: 'Not in spectator mode' })\n\t\t\treturn\n\t\t}\n\t\tsendJson(res, 200, context.spectator.status())\n\t\treturn\n\t}\n\n\tif (path === '/api/overview') {\n\t\tconst reader = await resolveReader(context, url)\n\t\tsendJson(res, 200, reader.overview())\n\t\treturn\n\t}\n\n\tif (path === '/api/audit') {\n\t\tconst reader = await resolveReader(context, url)\n\t\tsendJson(res, 200, { traces: reader.auditTraces(intParam(url, 'limit') ?? 100) })\n\t\treturn\n\t}\n\n\tconst collectionMatch = path.match(\n\t\t/^\\/api\\/collections\\/([a-zA-Z0-9_]+)\\/(records|ops|replay|dag)(?:\\/([^/]+))?(?:\\/(ops))?$/,\n\t)\n\tif (collectionMatch) {\n\t\tconst [, collection, kind, recordId, sub] = collectionMatch\n\t\tif (!collection || !kind) {\n\t\t\tsendJson(res, 400, { error: 'Bad request' })\n\t\t\treturn\n\t\t}\n\t\tconst reader = await resolveReader(context, url)\n\t\tif (!reader.listCollections().includes(collection)) {\n\t\t\tsendJson(res, 404, { error: `Unknown collection \"${collection}\"` })\n\t\t\treturn\n\t\t}\n\n\t\tif (kind === 'replay') {\n\t\t\tconst ops = reader.allOperations(collection)\n\t\t\tconst upTo = url.searchParams.get('upTo')\n\t\t\tsendJson(res, 200, replayToOperation(ops, upTo))\n\t\t\treturn\n\t\t}\n\n\t\tif (kind === 'dag') {\n\t\t\tconst record = url.searchParams.get('record')\n\t\t\tconst limit = intParam(url, 'limit') ?? 200\n\t\t\tlet ops = reader.allOperations(collection)\n\t\t\tif (record) {\n\t\t\t\tops = ops.filter((o) => o.recordId === record)\n\t\t\t} else {\n\t\t\t\tops = ops.slice(-limit)\n\t\t\t}\n\t\t\tsendJson(res, 200, buildCausalDag(ops))\n\t\t\treturn\n\t\t}\n\n\t\tif (kind === 'ops') {\n\t\t\tsendJson(\n\t\t\t\tres,\n\t\t\t\t200,\n\t\t\t\treader.operations(collection, {\n\t\t\t\t\tlimit: intParam(url, 'limit'),\n\t\t\t\t\toffset: intParam(url, 'offset'),\n\t\t\t\t}),\n\t\t\t)\n\t\t\treturn\n\t\t}\n\n\t\tif (recordId && sub === 'ops') {\n\t\t\tsendJson(res, 200, { operations: reader.recordOperations(collection, recordId) })\n\t\t\treturn\n\t\t}\n\n\t\tif (recordId) {\n\t\t\tconst record = reader.record(collection, recordId)\n\t\t\tif (!record) {\n\t\t\t\tsendJson(res, 404, { error: `Record \"${recordId}\" not found` })\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst richtextPreviews = await decodeRichtextFields(\n\t\t\t\treader,\n\t\t\t\tcollection,\n\t\t\t\trecordId,\n\t\t\t\trecord.fields,\n\t\t\t)\n\t\t\tsendJson(res, 200, {\n\t\t\t\trecord,\n\t\t\t\trichtextPreviews,\n\t\t\t\toperations: reader.recordOperations(collection, recordId),\n\t\t\t})\n\t\t\treturn\n\t\t}\n\n\t\tsendJson(\n\t\t\tres,\n\t\t\t200,\n\t\t\treader.records(collection, {\n\t\t\t\tlimit: intParam(url, 'limit'),\n\t\t\t\toffset: intParam(url, 'offset'),\n\t\t\t\tincludeDeleted: url.searchParams.get('includeDeleted') === 'true',\n\t\t\t\tsearch: url.searchParams.get('search') ?? undefined,\n\t\t\t}),\n\t\t)\n\t\treturn\n\t}\n\n\tsendJson(res, 404, { error: `No route for ${path}` })\n}\n\n// ── Lab routes ───────────────────────────────────────────────────────────────\n\nasync function handleLabRoute(\n\tcontext: StudioContext,\n\tlab: LabManager,\n\treq: IncomingMessage,\n\tres: ServerResponse,\n\turl: URL,\n): Promise<void> {\n\tconst path = url.pathname\n\tconst method = req.method ?? 'GET'\n\n\tif (method === 'GET' && path === '/api/lab/state') {\n\t\tconst schema = lab.getSchema()\n\t\tsendJson(res, 200, {\n\t\t\tdevices: lab.listDevices(),\n\t\t\tserverOperations: lab.serverOperationCount(),\n\t\t\tcollections: Object.entries(schema.collections).map(([name, def]) => ({\n\t\t\t\tname,\n\t\t\t\tfields: Object.entries(def.fields).map(([fieldName, descriptor]) => ({\n\t\t\t\t\tname: fieldName,\n\t\t\t\t\tkind: descriptor.kind,\n\t\t\t\t\toptional: !descriptor.required,\n\t\t\t\t\tenumValues: descriptor.enumValues ?? null,\n\t\t\t\t\tdefaultValue: descriptor.defaultValue ?? null,\n\t\t\t\t})),\n\t\t\t})),\n\t\t})\n\t\treturn\n\t}\n\n\tif (method === 'GET' && path === '/api/lab/convergence') {\n\t\tsendJson(res, 200, await lab.convergence())\n\t\treturn\n\t}\n\n\tif (method !== 'POST') {\n\t\tsendJson(res, 405, { error: 'POST required' })\n\t\treturn\n\t}\n\n\tconst body = await readJsonBody(req)\n\n\tif (path === '/api/lab/devices') {\n\t\tconst state = await lab.addDevice(typeof body.name === 'string' ? body.name : undefined)\n\t\tsendJson(res, 200, state)\n\t\treturn\n\t}\n\n\tconst deviceMatch = path.match(\n\t\t/^\\/api\\/lab\\/devices\\/([a-zA-Z0-9_-]+)\\/(connect|disconnect|sync|chaos|insert|update|delete)$/,\n\t)\n\tif (!deviceMatch) {\n\t\tsendJson(res, 404, { error: `No lab route for ${path}` })\n\t\treturn\n\t}\n\tconst [, device, action] = deviceMatch\n\tif (!device || !action) {\n\t\tsendJson(res, 400, { error: 'Bad request' })\n\t\treturn\n\t}\n\n\tswitch (action) {\n\t\tcase 'connect':\n\t\t\tawait lab.connect(device)\n\t\t\tbreak\n\t\tcase 'disconnect': {\n\t\t\tawait lab.disconnect(device)\n\t\t\t// The device's DB file keeps changing while its reader is cached; drop\n\t\t\t// nothing — readers see committed WAL state per query. But a RESET of\n\t\t\t// the lab would invalidate paths; that's handled at close.\n\t\t\tbreak\n\t\t}\n\t\tcase 'sync':\n\t\t\tawait lab.sync(device)\n\t\t\tbreak\n\t\tcase 'chaos':\n\t\t\tsendJson(\n\t\t\t\tres,\n\t\t\t\t200,\n\t\t\t\tlab.setChaos(device, body as Partial<import('./lab-manager').LabChaosConfig>),\n\t\t\t)\n\t\t\treturn\n\t\tcase 'insert': {\n\t\t\tconst record = await lab.insert(\n\t\t\t\tdevice,\n\t\t\t\tString(body.collection ?? ''),\n\t\t\t\t(body.data as Record<string, unknown>) ?? {},\n\t\t\t)\n\t\t\tsendJson(res, 200, { record })\n\t\t\treturn\n\t\t}\n\t\tcase 'update': {\n\t\t\tconst record = await lab.update(\n\t\t\t\tdevice,\n\t\t\t\tString(body.collection ?? ''),\n\t\t\t\tString(body.id ?? ''),\n\t\t\t\t(body.data as Record<string, unknown>) ?? {},\n\t\t\t\t(body.increments as Record<string, number>) ?? undefined,\n\t\t\t)\n\t\t\tsendJson(res, 200, { record })\n\t\t\treturn\n\t\t}\n\t\tcase 'delete':\n\t\t\tawait lab.delete(device, String(body.collection ?? ''), String(body.id ?? ''))\n\t\t\tbreak\n\t}\n\tsendJson(res, 200, { ok: true, device: lab.deviceState(device) })\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nasync function decodeRichtextFields(\n\treader: StudioDbReader,\n\tcollection: string,\n\trecordId: string,\n\tfields: Record<string, unknown>,\n): Promise<Record<string, string>> {\n\tconst previews: Record<string, string> = {}\n\tconst binaryFields = Object.entries(fields).filter(\n\t\t([, value]) => typeof value === 'string' && value.startsWith('<binary '),\n\t)\n\tif (binaryFields.length === 0) {\n\t\treturn previews\n\t}\n\tlet toPlainText: ((state: Uint8Array) => string) | null = null\n\ttry {\n\t\tconst storePkg = await import('@korajs/store')\n\t\ttoPlainText =\n\t\t\t(storePkg as { richtextToPlainText?: (s: Uint8Array) => string }).richtextToPlainText ?? null\n\t} catch {\n\t\treturn previews\n\t}\n\tif (!toPlainText) {\n\t\treturn previews\n\t}\n\tfor (const [field] of binaryFields) {\n\t\ttry {\n\t\t\tconst raw = reader.rawFieldValue(collection, recordId, field)\n\t\t\tif (raw instanceof Uint8Array || Buffer.isBuffer(raw)) {\n\t\t\t\tpreviews[field] = toPlainText(new Uint8Array(raw as Uint8Array))\n\t\t\t}\n\t\t} catch {\n\t\t\t// Not decodable as Yjs state — leave the byte summary.\n\t\t}\n\t}\n\treturn previews\n}\n\nasync function readJsonBody(req: IncomingMessage): Promise<Record<string, unknown>> {\n\tconst chunks: Buffer[] = []\n\tlet size = 0\n\tfor await (const chunk of req) {\n\t\tsize += (chunk as Buffer).length\n\t\tif (size > 256 * 1024) {\n\t\t\tthrow new Error('Request body too large')\n\t\t}\n\t\tchunks.push(chunk as Buffer)\n\t}\n\tif (chunks.length === 0) {\n\t\treturn {}\n\t}\n\ttry {\n\t\treturn JSON.parse(Buffer.concat(chunks).toString('utf8')) as Record<string, unknown>\n\t} catch {\n\t\tthrow new Error('Invalid JSON body')\n\t}\n}\n\nfunction intParam(url: URL, name: string): number | undefined {\n\tconst raw = url.searchParams.get(name)\n\tif (raw === null) {\n\t\treturn undefined\n\t}\n\tconst parsed = Number.parseInt(raw, 10)\n\treturn Number.isNaN(parsed) ? undefined : parsed\n}\n\nfunction sendJson(res: ServerResponse, status: number, body: unknown): void {\n\tres.writeHead(status, {\n\t\t'content-type': 'application/json; charset=utf-8',\n\t\t'cache-control': 'no-store',\n\t})\n\tres.end(JSON.stringify(body))\n}\n","import { mkdtempSync, rmSync } from 'node:fs'\nimport { tmpdir } from 'node:os'\nimport { join } from 'node:path'\nimport type { SchemaDefinition } from '@korajs/core'\n\n/**\n * Kora Studio SPECTATOR: live, read-only inspection of a production sync\n * server.\n *\n * The spectator is a REAL Kora client — its own store, merge pipeline, and\n * sync engine — connected to the target server over the real WebSocket\n * protocol. It materializes its own replica into a throwaway database, which\n * every Studio view (records, per-field writers, op log, DAG, time travel,\n * merge audit) then reads. Nothing is simulated: what Studio shows is exactly\n * what any device syncing against that server computes.\n *\n * Read-only by construction: the spectator exposes NO mutation API, so it can\n * never push an operation to the server. It only receives, applies, and\n * observes. The server sees an ordinary client whose version vector starts\n * empty (so it receives the full history — which is what makes production\n * time travel possible) and which never sends operations.\n */\n\nexport interface SpectatorStatus {\n\turl: string\n\tconnected: boolean\n\toperationsReceived: number\n\tlastEventAt: number | null\n\tdbPath: string\n}\n\nexport interface SpectatorEvent {\n\tseq: number\n\tat: number\n\ttype: string\n\tsummary: string\n}\n\nexport interface SpectatorOptions {\n\turl: string\n\tschema: SchemaDefinition\n\t/** Bearer token forwarded through the sync auth handshake. */\n\ttoken?: string\n\t/** Client schema version override. Defaults to schema.version. */\n\tschemaVersion?: number\n}\n\n// NOTE: 'operation:applied' is in the event spec but not yet emitted by the\n// store — received-op counting uses 'sync:received' batches instead.\nconst FORWARDED_EVENTS = [\n\t'merge:started',\n\t'merge:conflict',\n\t'merge:completed',\n\t'sync:connected',\n\t'sync:disconnected',\n\t'sync:received',\n\t'sync:apply-failed',\n] as const\n\nconst MAX_EVENT_BUFFER = 500\n\n/** Structural types for the lazily-imported runtime packages. */\ninterface SpectatorRuntime {\n\tstore: {\n\t\topen(): Promise<void>\n\t\tclose(): Promise<void>\n\t\tsetLocalMutationHandler(handler: unknown): void\n\t}\n\tengine: { start(): Promise<void>; stop(): Promise<void> }\n\tunsubscribers: Array<() => void>\n}\n\nexport class SpectatorManager {\n\tprivate runtime: SpectatorRuntime | null = null\n\tprivate tmpDir: string | null = null\n\tprivate connected = false\n\tprivate operationsReceived = 0\n\tprivate lastEventAt: number | null = null\n\tprivate eventSeq = 0\n\tprivate readonly eventBuffer: SpectatorEvent[] = []\n\tprivate readonly eventListeners = new Set<(event: SpectatorEvent) => void>()\n\treadonly dbPath: string\n\n\tconstructor(private readonly options: SpectatorOptions) {\n\t\tthis.tmpDir = mkdtempSync(join(tmpdir(), 'kora-studio-spectator-'))\n\t\tthis.dbPath = join(this.tmpDir, 'spectator-replica.db')\n\t}\n\n\tasync start(): Promise<void> {\n\t\tlet mods: {\n\t\t\tStore: typeof import('@korajs/store').Store\n\t\t\tBetterSqlite3Adapter: typeof import('@korajs/store/better-sqlite3').BetterSqlite3Adapter\n\t\t\tMergeEngine: typeof import('@korajs/merge').MergeEngine\n\t\t\tSyncEngine: typeof import('@korajs/sync').SyncEngine\n\t\t\tWebSocketTransport: typeof import('@korajs/sync').WebSocketTransport\n\t\t\ttesting: typeof import('korajs/testing')\n\t\t\tSimpleEventEmitter: typeof import('@korajs/core/internal').SimpleEventEmitter\n\t\t}\n\t\ttry {\n\t\t\tmods = {\n\t\t\t\tStore: (await import('@korajs/store')).Store,\n\t\t\t\tBetterSqlite3Adapter: (await import('@korajs/store/better-sqlite3')).BetterSqlite3Adapter,\n\t\t\t\tMergeEngine: (await import('@korajs/merge')).MergeEngine,\n\t\t\t\tSyncEngine: (await import('@korajs/sync')).SyncEngine,\n\t\t\t\tWebSocketTransport: (await import('@korajs/sync')).WebSocketTransport,\n\t\t\t\ttesting: await import('korajs/testing'),\n\t\t\t\tSimpleEventEmitter: (await import('@korajs/core/internal')).SimpleEventEmitter,\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthrow new Error(\n\t\t\t\t`Spectator mode needs the Kora runtime packages installed (pnpm add -D korajs @korajs/store @korajs/merge @korajs/sync better-sqlite3). Underlying error: ${\n\t\t\t\t\terror instanceof Error ? error.message : String(error)\n\t\t\t\t}`,\n\t\t\t)\n\t\t}\n\n\t\tconst emitter = new mods.SimpleEventEmitter()\n\t\tconst adapter = new mods.BetterSqlite3Adapter(this.dbPath)\n\t\tconst store = new mods.Store({ schema: this.options.schema, adapter, emitter })\n\t\tawait store.open()\n\n\t\tconst mergeEngine = new mods.MergeEngine()\n\t\tconst pipeline = new mods.testing.ApplyPipeline({ store, mergeEngine, emitter })\n\t\tstore.setLocalMutationHandler(pipeline)\n\n\t\t// Production parity: merge decisions persist to the audit trail.\n\t\tconst unsubscribeAudit = mods.testing.wireAuditPersistence(store, emitter)\n\n\t\tconst syncStore = new mods.testing.MergeAwareSyncStore(store, mergeEngine, emitter)\n\t\tconst engine = new mods.SyncEngine({\n\t\t\ttransport: new mods.WebSocketTransport(),\n\t\t\tstore: syncStore,\n\t\t\tqueueStorage: new mods.testing.StoreQueueStorage(adapter),\n\t\t\tsyncState: new mods.testing.StoreSyncStatePersistence(store),\n\t\t\tconfig: {\n\t\t\t\turl: this.options.url,\n\t\t\t\tschemaVersion: this.options.schemaVersion ?? this.options.schema.version,\n\t\t\t\t...(this.options.token\n\t\t\t\t\t? { auth: async () => ({ token: this.options.token as string }) }\n\t\t\t\t\t: {}),\n\t\t\t},\n\t\t\temitter,\n\t\t})\n\n\t\tconst unsubscribers = FORWARDED_EVENTS.map((type) =>\n\t\t\temitter.on(type, (event: Record<string, unknown>) => {\n\t\t\t\tthis.lastEventAt = Date.now()\n\t\t\t\tif (type === 'sync:connected') {\n\t\t\t\t\tthis.connected = true\n\t\t\t\t}\n\t\t\t\tif (type === 'sync:disconnected') {\n\t\t\t\t\tthis.connected = false\n\t\t\t\t}\n\t\t\t\tif (type === 'sync:received' && Array.isArray(event.operations)) {\n\t\t\t\t\tthis.operationsReceived += event.operations.length\n\t\t\t\t}\n\t\t\t\tthis.pushEvent(type, event)\n\t\t\t}),\n\t\t)\n\t\tunsubscribers.push(unsubscribeAudit)\n\n\t\tthis.runtime = { store, engine, unsubscribers }\n\t\tawait engine.start()\n\t}\n\n\tstatus(): SpectatorStatus {\n\t\treturn {\n\t\t\turl: this.options.url,\n\t\t\tconnected: this.connected,\n\t\t\toperationsReceived: this.operationsReceived,\n\t\t\tlastEventAt: this.lastEventAt,\n\t\t\tdbPath: this.dbPath,\n\t\t}\n\t}\n\n\trecentEvents(): SpectatorEvent[] {\n\t\treturn [...this.eventBuffer]\n\t}\n\n\tonEvent(listener: (event: SpectatorEvent) => void): () => void {\n\t\tthis.eventListeners.add(listener)\n\t\treturn () => this.eventListeners.delete(listener)\n\t}\n\n\tasync close(): Promise<void> {\n\t\tif (this.runtime) {\n\t\t\tfor (const unsub of this.runtime.unsubscribers) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tawait this.runtime.engine.stop().catch(() => {})\n\t\t\tawait this.runtime.store.close().catch(() => {})\n\t\t\tthis.runtime = null\n\t\t}\n\t\tif (this.tmpDir) {\n\t\t\trmSync(this.tmpDir, { recursive: true, force: true })\n\t\t\tthis.tmpDir = null\n\t\t}\n\t}\n\n\tprivate pushEvent(type: string, payload: Record<string, unknown>): void {\n\t\tconst summary =\n\t\t\ttype === 'sync:received' && Array.isArray(payload.operations)\n\t\t\t\t? `received ${payload.operations.length} op(s)`\n\t\t\t\t: type.replace('sync:', '').replace('merge:', 'merge ')\n\t\tconst event: SpectatorEvent = {\n\t\t\tseq: ++this.eventSeq,\n\t\t\tat: Date.now(),\n\t\t\ttype,\n\t\t\tsummary,\n\t\t}\n\t\tthis.eventBuffer.push(event)\n\t\tif (this.eventBuffer.length > MAX_EVENT_BUFFER) {\n\t\t\tthis.eventBuffer.shift()\n\t\t}\n\t\tfor (const listener of this.eventListeners) {\n\t\t\tlistener(event)\n\t\t}\n\t}\n}\n","import { mkdtempSync, rmSync } from 'node:fs'\nimport { tmpdir } from 'node:os'\nimport { join } from 'node:path'\nimport type { Operation, SchemaDefinition } from '@korajs/core'\nimport { op as atomicOp, defineSchema, t } from '@korajs/core'\n\n/**\n * Default Lab schema: covers every merge tier so the Lab can demonstrate the\n * whole system — scalar LWW (title/assignee/priority/done), add-wins arrays\n * (tags), and atomic increment composition (points).\n */\nexport function defaultLabSchema(): SchemaDefinition {\n\treturn defineSchema({\n\t\tversion: 1,\n\t\tcollections: {\n\t\t\ttasks: {\n\t\t\t\tfields: {\n\t\t\t\t\ttitle: t.string(),\n\t\t\t\t\tassignee: t.string().optional(),\n\t\t\t\t\tpriority: t.enum(['low', 'medium', 'high']).default('medium'),\n\t\t\t\t\tdone: t.boolean().default(false),\n\t\t\t\t\ttags: t.array(t.string()).default([]),\n\t\t\t\t\tpoints: t.number().default(0),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t})\n}\n\n/**\n * Kora Studio Lab: an interactive, in-process multi-device sync laboratory.\n *\n * Every device is a REAL Kora client (its own SQLite store, sync engine, merge\n * pipeline) talking to a REAL sync server over in-memory transports, optionally\n * wrapped in a chaos transport. Nothing is simulated at the data layer, so what\n * the Lab shows is evidence, not illustration: conflicts, convergence, chaos\n * recovery, and atomic-op composition all run the exact code that ships.\n *\n * The Lab only ever touches throwaway databases in a temp directory — it can\n * never write to a user's real data.\n */\n\n/** Per-device chaos settings; applied on the device's NEXT connect. */\nexport interface LabChaosConfig {\n\tdropRate: number\n\tduplicateRate: number\n\treorderRate: number\n\tmaxLatency: number\n}\n\nexport interface LabDeviceState {\n\tname: string\n\tnodeId: string\n\tconnected: boolean\n\tchaos: LabChaosConfig\n\t/** Path of this device's SQLite DB — Studio's readers attach here. */\n\tdbPath: string\n\tpendingOperations: number\n}\n\nexport interface LabEvent {\n\tseq: number\n\tat: number\n\tdevice: string\n\ttype: string\n\tsummary: string\n}\n\nexport interface LabConvergenceReport {\n\tconverged: boolean\n\tdeviceCount: number\n\tdifferences: string[]\n}\n\n/** Structural interfaces for the lazily-imported @korajs/test harness. */\ninterface HarnessDevice {\n\treadonly name: string\n\treadonly emitter: {\n\t\ton(type: string, listener: (event: Record<string, unknown>) => void): () => void\n\t}\n\topen(): Promise<void>\n\tsync(): Promise<void>\n\tdisconnect(): Promise<void>\n\tclose(): Promise<void>\n\tcollection(name: string): {\n\t\tinsert(data: Record<string, unknown>): Promise<Record<string, unknown>>\n\t\tupdate(id: string, data: Record<string, unknown>): Promise<Record<string, unknown>>\n\t\tdelete(id: string): Promise<void>\n\t}\n\tgetNodeId(): string\n\tgetSyncEngine(): { getStatus(): { pendingOperations: number } } | null\n\tisConnected(): boolean\n}\n\ninterface Harness {\n\tTestServer: new (\n\t\tschema: SchemaDefinition,\n\t) => {\n\t\thandleConnection(transport: unknown): string\n\t\tgetAllOperations(): Operation[]\n\t\tgetConnectionCount(): number\n\t\tclose(): Promise<void>\n\t}\n\tTestDevice: new (options: {\n\t\tname: string\n\t\tschema: SchemaDefinition\n\t\tserver: unknown\n\t\tcreateTransportPair: () => { client: unknown; serverTransport: unknown }\n\t\ttmpDir: string\n\t}) => HarnessDevice\n\tcheckConvergence(\n\t\tdevices: unknown[],\n\t\tschema: SchemaDefinition,\n\t): Promise<{\n\t\tconverged: boolean\n\t\tdifferences: Array<{ collection: string; description?: string }>\n\t}>\n\tChaosTransport: new (inner: unknown, config: Record<string, unknown>) => unknown\n\t/** Returns { client, server } — note the property name is `server`. */\n\tcreateServerTransportPair: () => { client: unknown; server: unknown }\n}\n\nconst DEFAULT_CHAOS: LabChaosConfig = {\n\tdropRate: 0,\n\tduplicateRate: 0,\n\treorderRate: 0,\n\tmaxLatency: 0,\n}\n\n/** Event types forwarded into the Lab's live feed. */\nconst FORWARDED_EVENTS = [\n\t'operation:created',\n\t'operation:applied',\n\t'merge:started',\n\t'merge:conflict',\n\t'merge:completed',\n\t'sync:connected',\n\t'sync:disconnected',\n\t'sync:sent',\n\t'sync:received',\n\t'sync:apply-failed',\n] as const\n\nconst MAX_EVENT_BUFFER = 500\n\nexport class LabManager {\n\tprivate readonly devices = new Map<\n\t\tstring,\n\t\t{ device: HarnessDevice; chaos: LabChaosConfig; unsubscribes: Array<() => void> }\n\t>()\n\tprivate server: InstanceType<Harness['TestServer']> | null = null\n\tprivate harness: Harness | null = null\n\tprivate tmpDir: string | null = null\n\tprivate eventSeq = 0\n\tprivate readonly eventBuffer: LabEvent[] = []\n\tprivate readonly eventListeners = new Set<(event: LabEvent) => void>()\n\tprivate deviceCounter = 0\n\n\tconstructor(private readonly schema: SchemaDefinition) {}\n\n\t/** Load the harness lazily so file-mode Studio never needs @korajs/test. */\n\tprivate async loadHarness(): Promise<Harness> {\n\t\tif (this.harness) {\n\t\t\treturn this.harness\n\t\t}\n\t\ttry {\n\t\t\tconst testPkg = (await import('@korajs/test')) as unknown as Record<string, unknown>\n\t\t\tconst serverInternal = (await import('@korajs/server/internal')) as unknown as Record<\n\t\t\t\tstring,\n\t\t\t\tunknown\n\t\t\t>\n\t\t\tthis.harness = {\n\t\t\t\tTestServer: testPkg.TestServer as Harness['TestServer'],\n\t\t\t\tTestDevice: testPkg.TestDevice as Harness['TestDevice'],\n\t\t\t\tcheckConvergence: testPkg.checkConvergence as Harness['checkConvergence'],\n\t\t\t\tChaosTransport: testPkg.ChaosTransport as Harness['ChaosTransport'],\n\t\t\t\tcreateServerTransportPair:\n\t\t\t\t\tserverInternal.createServerTransportPair as Harness['createServerTransportPair'],\n\t\t\t}\n\t\t\treturn this.harness\n\t\t} catch (error) {\n\t\t\tthrow new Error(\n\t\t\t\t`Kora Studio Lab needs \"@korajs/test\" and \"@korajs/server\" installed (pnpm add -D @korajs/test @korajs/server). Underlying error: ${\n\t\t\t\t\terror instanceof Error ? error.message : String(error)\n\t\t\t\t}`,\n\t\t\t)\n\t\t}\n\t}\n\n\tasync start(initialDevices = 2): Promise<void> {\n\t\tconst harness = await this.loadHarness()\n\t\tthis.tmpDir = mkdtempSync(join(tmpdir(), 'kora-studio-lab-'))\n\t\tthis.server = new harness.TestServer(this.schema)\n\t\tfor (let i = 0; i < initialDevices; i++) {\n\t\t\tawait this.addDevice()\n\t\t}\n\t}\n\n\tasync addDevice(name?: string): Promise<LabDeviceState> {\n\t\tconst harness = await this.loadHarness()\n\t\tif (!this.server || !this.tmpDir) {\n\t\t\tthrow new Error('Lab is not started')\n\t\t}\n\t\tconst deviceName = name?.trim() || `device-${String.fromCharCode(65 + this.deviceCounter)}`\n\t\tthis.deviceCounter++\n\t\tif (this.devices.has(deviceName)) {\n\t\t\tthrow new Error(`Device \"${deviceName}\" already exists`)\n\t\t}\n\n\t\tconst chaos: LabChaosConfig = { ...DEFAULT_CHAOS }\n\t\tconst entry = { chaos }\n\t\tconst device = new harness.TestDevice({\n\t\t\tname: deviceName,\n\t\t\tschema: this.schema,\n\t\t\tserver: this.server,\n\t\t\t// Read the CURRENT chaos settings each time a connection is made, so\n\t\t\t// toggling chaos + reconnecting applies it without rebuilding the device.\n\t\t\tcreateTransportPair: () => {\n\t\t\t\tconst pair = harness.createServerTransportPair()\n\t\t\t\tconst hasChaos =\n\t\t\t\t\tentry.chaos.dropRate > 0 ||\n\t\t\t\t\tentry.chaos.duplicateRate > 0 ||\n\t\t\t\t\tentry.chaos.reorderRate > 0 ||\n\t\t\t\t\tentry.chaos.maxLatency > 0\n\t\t\t\treturn {\n\t\t\t\t\tclient: hasChaos\n\t\t\t\t\t\t? new harness.ChaosTransport(pair.client, { ...entry.chaos })\n\t\t\t\t\t\t: pair.client,\n\t\t\t\t\tserverTransport: pair.server,\n\t\t\t\t}\n\t\t\t},\n\t\t\ttmpDir: this.tmpDir,\n\t\t})\n\t\tawait device.open()\n\n\t\tconst unsubscribes = FORWARDED_EVENTS.map((type) =>\n\t\t\tdevice.emitter.on(type, (event) => this.pushEvent(deviceName, type, event)),\n\t\t)\n\n\t\tthis.devices.set(deviceName, { device, chaos, unsubscribes })\n\t\tthis.pushEvent(deviceName, 'lab:device-added', {})\n\t\treturn this.deviceState(deviceName)\n\t}\n\n\tlistDevices(): LabDeviceState[] {\n\t\treturn [...this.devices.keys()].map((name) => this.deviceState(name))\n\t}\n\n\tdeviceState(name: string): LabDeviceState {\n\t\tconst entry = this.mustGet(name)\n\t\treturn {\n\t\t\tname,\n\t\t\tnodeId: entry.device.getNodeId(),\n\t\t\tconnected: entry.device.isConnected(),\n\t\t\tchaos: { ...entry.chaos },\n\t\t\tdbPath: join(this.tmpDir ?? '', `test-device-${name}.db`),\n\t\t\tpendingOperations: entry.device.getSyncEngine()?.getStatus().pendingOperations ?? 0,\n\t\t}\n\t}\n\n\tasync connect(name: string): Promise<void> {\n\t\tawait this.mustGet(name).device.sync()\n\t\tthis.pushEvent(name, 'lab:connected', {})\n\t}\n\n\tasync disconnect(name: string): Promise<void> {\n\t\tawait this.mustGet(name).device.disconnect()\n\t\tthis.pushEvent(name, 'lab:disconnected', {})\n\t}\n\n\tasync sync(name: string): Promise<void> {\n\t\tawait this.mustGet(name).device.sync()\n\t}\n\n\tsetChaos(name: string, chaos: Partial<LabChaosConfig>): LabChaosConfig {\n\t\tconst entry = this.mustGet(name)\n\t\tentry.chaos.dropRate = clamp01(chaos.dropRate ?? entry.chaos.dropRate)\n\t\tentry.chaos.duplicateRate = clamp01(chaos.duplicateRate ?? entry.chaos.duplicateRate)\n\t\tentry.chaos.reorderRate = clamp01(chaos.reorderRate ?? entry.chaos.reorderRate)\n\t\tentry.chaos.maxLatency = Math.max(0, chaos.maxLatency ?? entry.chaos.maxLatency)\n\t\tthis.pushEvent(name, 'lab:chaos-changed', { ...entry.chaos })\n\t\treturn { ...entry.chaos }\n\t}\n\n\tasync insert(\n\t\tname: string,\n\t\tcollection: string,\n\t\tdata: Record<string, unknown>,\n\t): Promise<Record<string, unknown>> {\n\t\treturn this.mustGet(name).device.collection(collection).insert(data)\n\t}\n\n\tasync update(\n\t\tname: string,\n\t\tcollection: string,\n\t\trecordId: string,\n\t\tdata: Record<string, unknown>,\n\t\tincrements?: Record<string, number>,\n\t): Promise<Record<string, unknown>> {\n\t\t// Intent-preserving atomic increments: concurrent increments on two\n\t\t// devices COMPOSE to the sum instead of last-write-wins — the Lab's most\n\t\t// striking demonstration.\n\t\tconst payload: Record<string, unknown> = { ...data }\n\t\tfor (const [field, delta] of Object.entries(increments ?? {})) {\n\t\t\tpayload[field] = atomicOp.increment(delta)\n\t\t}\n\t\treturn this.mustGet(name).device.collection(collection).update(recordId, payload)\n\t}\n\n\tasync delete(name: string, collection: string, recordId: string): Promise<void> {\n\t\tawait this.mustGet(name).device.collection(collection).delete(recordId)\n\t}\n\n\tasync convergence(): Promise<LabConvergenceReport> {\n\t\tconst harness = await this.loadHarness()\n\t\tconst devices = [...this.devices.values()].map((e) => e.device)\n\t\tif (devices.length < 2) {\n\t\t\treturn { converged: true, deviceCount: devices.length, differences: [] }\n\t\t}\n\t\tconst result = await harness.checkConvergence(devices, this.schema)\n\t\treturn {\n\t\t\tconverged: result.converged,\n\t\t\tdeviceCount: devices.length,\n\t\t\tdifferences: result.differences.map(\n\t\t\t\t(d) => d.description ?? `collection \"${d.collection}\" differs`,\n\t\t\t),\n\t\t}\n\t}\n\n\tserverOperationCount(): number {\n\t\treturn this.server?.getAllOperations().length ?? 0\n\t}\n\n\tgetSchema(): SchemaDefinition {\n\t\treturn this.schema\n\t}\n\n\t/** Recent events (for initial page load), oldest first. */\n\trecentEvents(): LabEvent[] {\n\t\treturn [...this.eventBuffer]\n\t}\n\n\tonEvent(listener: (event: LabEvent) => void): () => void {\n\t\tthis.eventListeners.add(listener)\n\t\treturn () => this.eventListeners.delete(listener)\n\t}\n\n\tasync close(): Promise<void> {\n\t\tfor (const [, entry] of this.devices) {\n\t\t\tfor (const unsub of entry.unsubscribes) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tawait entry.device.close().catch(() => {})\n\t\t}\n\t\tthis.devices.clear()\n\t\tawait this.server?.close().catch(() => {})\n\t\tthis.server = null\n\t\tif (this.tmpDir) {\n\t\t\trmSync(this.tmpDir, { recursive: true, force: true })\n\t\t\tthis.tmpDir = null\n\t\t}\n\t}\n\n\tprivate mustGet(name: string): { device: HarnessDevice; chaos: LabChaosConfig } {\n\t\tconst entry = this.devices.get(name)\n\t\tif (!entry) {\n\t\t\tthrow new Error(`Unknown device \"${name}\"`)\n\t\t}\n\t\treturn entry\n\t}\n\n\tprivate pushEvent(device: string, type: string, payload: Record<string, unknown>): void {\n\t\tconst event: LabEvent = {\n\t\t\tseq: ++this.eventSeq,\n\t\t\tat: Date.now(),\n\t\t\tdevice,\n\t\t\ttype,\n\t\t\tsummary: summarizeEvent(type, payload),\n\t\t}\n\t\tthis.eventBuffer.push(event)\n\t\tif (this.eventBuffer.length > MAX_EVENT_BUFFER) {\n\t\t\tthis.eventBuffer.shift()\n\t\t}\n\t\tfor (const listener of this.eventListeners) {\n\t\t\tlistener(event)\n\t\t}\n\t}\n}\n\nfunction clamp01(n: number): number {\n\treturn Math.min(1, Math.max(0, n))\n}\n\nfunction summarizeEvent(type: string, payload: Record<string, unknown>): string {\n\tconst op = payload.operation as\n\t\t| { type?: string; collection?: string; recordId?: string; data?: Record<string, unknown> }\n\t\t| undefined\n\tswitch (type) {\n\t\tcase 'operation:created':\n\t\t\treturn op\n\t\t\t\t? `${op.type} ${op.collection}/${String(op.recordId).slice(0, 8)}… ${op.data ? JSON.stringify(op.data).slice(0, 60) : ''}`\n\t\t\t\t: 'operation created'\n\t\tcase 'operation:applied':\n\t\t\treturn op\n\t\t\t\t? `applied ${op.type} ${op.collection}/${String(op.recordId).slice(0, 8)}…`\n\t\t\t\t: 'applied'\n\t\tcase 'merge:conflict':\n\t\t\treturn 'merge conflict resolved'\n\t\tcase 'merge:started':\n\t\t\treturn 'merge started'\n\t\tcase 'merge:completed':\n\t\t\treturn 'merge completed'\n\t\tcase 'sync:sent': {\n\t\t\tconst count = Array.isArray(payload.operations) ? payload.operations.length : 0\n\t\t\treturn `sent ${count} op(s)`\n\t\t}\n\t\tcase 'sync:received': {\n\t\t\tconst count = Array.isArray(payload.operations) ? payload.operations.length : 0\n\t\t\treturn `received ${count} op(s)`\n\t\t}\n\t\tcase 'sync:connected':\n\t\t\treturn 'connected to server'\n\t\tcase 'sync:disconnected':\n\t\t\treturn 'disconnected'\n\t\tcase 'sync:apply-failed':\n\t\t\treturn 'APPLY FAILED'\n\t\tcase 'lab:chaos-changed':\n\t\t\treturn `chaos → drop ${payload.dropRate} dup ${payload.duplicateRate} reorder ${payload.reorderRate} latency ${payload.maxLatency}ms`\n\t\tdefault:\n\t\t\treturn type.replace('lab:', '')\n\t}\n}\n","import { defineCommand, runMain } from 'citty'\nimport { backupCommand } from './commands/backup/backup-command'\nimport { compactCommand } from './commands/compact/compact-command'\nimport { createCommand } from './commands/create/create-command'\nimport { deployCommand } from './commands/deploy/deploy-command'\nimport { devCommand } from './commands/dev/dev-command'\nimport { doctorCommand } from './commands/doctor/doctor-command'\nimport { generateCommand } from './commands/generate/generate-command'\nimport { logsCommand } from './commands/logs/logs-command'\nimport { migrateCommand } from './commands/migrate/migrate-command'\nimport { statusCommand } from './commands/status/status-command'\nimport { studioCommand } from './commands/studio/studio-command'\n\nconst main = defineCommand({\n\tmeta: {\n\t\tname: 'kora',\n\t\tdescription: 'Kora.js — Offline-first application framework',\n\t},\n\tsubCommands: {\n\t\tbackup: backupCommand,\n\t\tcompact: compactCommand,\n\t\tcreate: createCommand,\n\t\tdev: devCommand,\n\t\tdoctor: doctorCommand,\n\t\tdeploy: deployCommand,\n\t\tgenerate: generateCommand,\n\t\tlogs: logsCommand,\n\t\tmigrate: migrateCommand,\n\t\tstatus: statusCommand,\n\t\tstudio: studioCommand,\n\t},\n})\n\nrunMain(main)\n","import { readFile, writeFile } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport { defineCommand } from 'citty'\nimport { createLogger } from '../../utils/logger'\n\nconst DEFAULT_SYNC_PORT = 3001\n\n/**\n * The `backup` command — creates and restores Kora sync server backups.\n */\nexport const backupCommand = defineCommand({\n\tmeta: {\n\t\tname: 'backup',\n\t\tdescription: 'Backup and restore Kora sync server data',\n\t},\n\tsubCommands: {\n\t\tcreate: defineCommand({\n\t\t\tmeta: {\n\t\t\t\tname: 'create',\n\t\t\t\tdescription: 'Create a backup of the sync server',\n\t\t\t},\n\t\t\targs: {\n\t\t\t\turl: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Sync server URL (default: http://localhost:3001)',\n\t\t\t\t\tdefault: `http://localhost:${DEFAULT_SYNC_PORT}`,\n\t\t\t\t},\n\t\t\t\tout: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Output file path (default: kora-backup-<timestamp>.kora)',\n\t\t\t\t},\n\t\t\t\ttoken: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Backup token (defaults to KORA_BACKUP_TOKEN or KORA_ADMIN_TOKEN)',\n\t\t\t\t},\n\t\t\t},\n\t\t\tasync run({ args }) {\n\t\t\t\tconst logger = createLogger()\n\t\t\t\tconst url =\n\t\t\t\t\ttypeof args.url === 'string' ? args.url : `http://localhost:${DEFAULT_SYNC_PORT}`\n\t\t\t\tconst outFile = typeof args.out === 'string' ? args.out : `kora-backup-${Date.now()}.kora`\n\t\t\t\tconst token =\n\t\t\t\t\ttypeof args.token === 'string'\n\t\t\t\t\t\t? args.token\n\t\t\t\t\t\t: (process.env.KORA_BACKUP_TOKEN ?? process.env.KORA_ADMIN_TOKEN)\n\n\t\t\t\tlogger.banner()\n\t\t\t\tlogger.info(`Exporting backup from ${url}...`)\n\n\t\t\t\ttry {\n\t\t\t\t\tconst backupUrl = `${url.replace(/\\/$/, '')}/__kora/backup/export`\n\t\t\t\t\tconst response = await fetch(backupUrl, {\n\t\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\t\theaders: token ? { Authorization: `Bearer ${token}` } : undefined,\n\t\t\t\t\t})\n\n\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\tconst error = await response.json().catch(() => ({ message: response.statusText }))\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Backup failed: ${(error as { message: string }).message ?? response.statusText}`,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\n\t\t\t\t\tconst buffer = await response.arrayBuffer()\n\t\t\t\t\tawait writeFile(outFile, new Uint8Array(buffer))\n\n\t\t\t\t\tconst size = (buffer.byteLength / 1024).toFixed(1)\n\t\t\t\t\tlogger.success(`Backup saved to ${outFile} (${size} KB)`)\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger.error('Backup failed')\n\t\t\t\t\tif (error instanceof Error) logger.error(error.message)\n\t\t\t\t\tlogger.blank()\n\t\t\t\t\tlogger.step('Make sure the Kora sync server is running.')\n\t\t\t\t\tprocess.exit(1)\n\t\t\t\t}\n\t\t\t},\n\t\t}),\n\n\t\trestore: defineCommand({\n\t\t\tmeta: {\n\t\t\t\tname: 'restore',\n\t\t\t\tdescription: 'Restore a backup to the sync server',\n\t\t\t},\n\t\t\targs: {\n\t\t\t\tfile: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Backup file path',\n\t\t\t\t\trequired: true,\n\t\t\t\t},\n\t\t\t\turl: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Sync server URL (default: http://localhost:3001)',\n\t\t\t\t\tdefault: `http://localhost:${DEFAULT_SYNC_PORT}`,\n\t\t\t\t},\n\t\t\t\tmerge: {\n\t\t\t\t\ttype: 'boolean',\n\t\t\t\t\tdescription: 'Merge with existing data instead of replacing',\n\t\t\t\t\tdefault: false,\n\t\t\t\t},\n\t\t\t\ttoken: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Backup token (defaults to KORA_BACKUP_TOKEN or KORA_ADMIN_TOKEN)',\n\t\t\t\t},\n\t\t\t},\n\t\t\tasync run({ args }) {\n\t\t\t\tconst logger = createLogger()\n\t\t\t\tconst filePath = typeof args.file === 'string' ? args.file : ''\n\t\t\t\tconst url =\n\t\t\t\t\ttypeof args.url === 'string' ? args.url : `http://localhost:${DEFAULT_SYNC_PORT}`\n\t\t\t\tconst merge = args.merge === true\n\t\t\t\tconst token =\n\t\t\t\t\ttypeof args.token === 'string'\n\t\t\t\t\t\t? args.token\n\t\t\t\t\t\t: (process.env.KORA_BACKUP_TOKEN ?? process.env.KORA_ADMIN_TOKEN)\n\n\t\t\t\tlogger.banner()\n\t\t\t\tlogger.info(`Restoring backup from ${filePath} to ${url}...`)\n\n\t\t\t\ttry {\n\t\t\t\t\tconst data = await readFile(filePath)\n\t\t\t\t\tconst restoreUrl = `${url.replace(/\\/$/, '')}/__kora/backup/import?merge=${merge}`\n\n\t\t\t\t\tconst response = await fetch(restoreUrl, {\n\t\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\t\theaders: token ? { Authorization: `Bearer ${token}` } : undefined,\n\t\t\t\t\t\tbody: data,\n\t\t\t\t\t})\n\n\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\tconst error = await response.json().catch(() => ({ message: response.statusText }))\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Restore failed: ${(error as { message: string }).message ?? response.statusText}`,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\n\t\t\t\t\tconst result = (await response.json()) as {\n\t\t\t\t\t\toperationsRestored: number\n\t\t\t\t\t\tsuccess: boolean\n\t\t\t\t\t\tduration?: number\n\t\t\t\t\t}\n\n\t\t\t\t\tif (result.success) {\n\t\t\t\t\t\tlogger.success(\n\t\t\t\t\t\t\t`Restored ${result.operationsRestored} operations${result.duration ? ` in ${result.duration}ms` : ''}`,\n\t\t\t\t\t\t)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger.error('Restore completed with errors')\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger.error('Restore failed')\n\t\t\t\t\tif (error instanceof Error) logger.error(error.message)\n\t\t\t\t\tprocess.exit(1)\n\t\t\t\t}\n\t\t\t},\n\t\t}),\n\n\t\tinfo: defineCommand({\n\t\t\tmeta: {\n\t\t\t\tname: 'info',\n\t\t\t\tdescription: 'Show backup file information',\n\t\t\t},\n\t\t\targs: {\n\t\t\t\tfile: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Backup file path',\n\t\t\t\t\trequired: true,\n\t\t\t\t},\n\t\t\t},\n\t\t\tasync run({ args }) {\n\t\t\t\tconst logger = createLogger()\n\t\t\t\tconst filePath = typeof args.file === 'string' ? args.file : ''\n\n\t\t\t\ttry {\n\t\t\t\t\tconst data = await readFile(filePath)\n\t\t\t\t\tconst { readBackupManifest } = await import('@korajs/store')\n\n\t\t\t\t\tconst manifest = readBackupManifest(\n\t\t\t\t\t\tnew Uint8Array(data.buffer, data.byteOffset, data.byteLength),\n\t\t\t\t\t)\n\n\t\t\t\t\tlogger.banner()\n\t\t\t\t\tlogger.info(`Backup: ${filePath}`)\n\t\t\t\t\tlogger.blank()\n\t\t\t\t\tlogger.step(`Created: ${new Date(manifest.createdAt).toISOString()}`)\n\t\t\t\t\tlogger.step(`Node ID: ${manifest.nodeId}`)\n\t\t\t\t\tlogger.step(`Schema: v${manifest.schemaVersion}`)\n\t\t\t\t\tlogger.step(`Operations: ${manifest.operationCount.toLocaleString()}`)\n\t\t\t\t\tlogger.step(`Collections: ${manifest.collections.join(', ') || '(none)'}`)\n\t\t\t\t\tlogger.step(`Checksum: ${manifest.checksum.slice(0, 16)}...`)\n\t\t\t\t\tlogger.blank()\n\t\t\t\t\tlogger.step(`Format version: ${manifest.version}`)\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger.error('Failed to read backup file')\n\t\t\t\t\tif (error instanceof Error) logger.error(error.message)\n\t\t\t\t\tprocess.exit(1)\n\t\t\t\t}\n\t\t\t},\n\t\t}),\n\t},\n})\n","/** ANSI escape codes for terminal colors */\nconst RESET = '\\x1b[0m'\nconst BOLD = '\\x1b[1m'\nconst DIM = '\\x1b[2m'\nconst GREEN = '\\x1b[32m'\nconst YELLOW = '\\x1b[33m'\nconst RED = '\\x1b[31m'\nconst CYAN = '\\x1b[36m'\n\nexport interface LoggerOptions {\n\t/** Disable ANSI colors */\n\tnoColor?: boolean\n}\n\nexport interface Logger {\n\tinfo(message: string): void\n\tsuccess(message: string): void\n\twarn(message: string): void\n\terror(message: string): void\n\tstep(message: string): void\n\tblank(): void\n\tbanner(): void\n}\n\n/**\n * Creates a logger with optional ANSI color support.\n * Respects the NO_COLOR environment variable and TTY detection.\n */\nexport function createLogger(options?: LoggerOptions): Logger {\n\tconst colorDisabled =\n\t\toptions?.noColor === true || process.env.NO_COLOR !== undefined || !process.stdout.isTTY\n\n\tfunction color(code: string, text: string): string {\n\t\treturn colorDisabled ? text : `${code}${text}${RESET}`\n\t}\n\n\treturn {\n\t\tinfo(message: string): void {\n\t\t\tconsole.log(color(CYAN, message))\n\t\t},\n\t\tsuccess(message: string): void {\n\t\t\tconsole.log(color(GREEN, ` ✓ ${message}`))\n\t\t},\n\t\twarn(message: string): void {\n\t\t\tconsole.warn(color(YELLOW, ` ⚠ ${message}`))\n\t\t},\n\t\terror(message: string): void {\n\t\t\tconsole.error(color(RED, ` ✗ ${message}`))\n\t\t},\n\t\tstep(message: string): void {\n\t\t\tconsole.log(color(DIM, ` ${message}`))\n\t\t},\n\t\tblank(): void {\n\t\t\tconsole.log()\n\t\t},\n\t\tbanner(): void {\n\t\t\tconsole.log()\n\t\t\tconsole.log(\n\t\t\t\tcolor(BOLD + CYAN, ' Kora.js') + color(DIM, ' — Offline-first application framework'),\n\t\t\t)\n\t\t\tconsole.log()\n\t\t},\n\t}\n}\n","import { resolve } from 'node:path'\nimport { defineCommand } from 'citty'\nimport { InvalidProjectError } from '../../errors'\nimport { findProjectRoot } from '../../utils/fs-helpers'\nimport { createLogger } from '../../utils/logger'\nimport { loadKoraConfig } from '../dev/kora-config'\nimport { loadSchemaDefinition } from '../migrate/schema-loader'\n\n/**\n * Compact the local client operation log (materialized rows are the baseline).\n */\nexport const compactCommand = defineCommand({\n\tmeta: {\n\t\tname: 'compact',\n\t\tdescription: 'Compact the local Kora operation log after server ack',\n\t},\n\targs: {\n\t\tdb: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Path to the local SQLite database (required)',\n\t\t},\n\t\tschema: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Path to schema file',\n\t\t},\n\t\tstrategy: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Compaction strategy: after-ack | after-days | never',\n\t\t\tdefault: 'after-ack',\n\t\t},\n\t\tdays: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Age threshold when strategy is after-days',\n\t\t\tdefault: '30',\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tconst logger = createLogger()\n\t\tconst projectRoot = await findProjectRoot()\n\t\tif (!projectRoot) {\n\t\t\tthrow new InvalidProjectError(process.cwd())\n\t\t}\n\n\t\tconst dbPath = typeof args.db === 'string' ? resolve(projectRoot, args.db) : undefined\n\t\tif (!dbPath) {\n\t\t\tthrow new Error('Missing --db <path> to the local SQLite database file.')\n\t\t}\n\n\t\tconst config = await loadKoraConfig(projectRoot)\n\t\tconst schemaPath =\n\t\t\ttypeof args.schema === 'string'\n\t\t\t\t? resolve(projectRoot, args.schema)\n\t\t\t\t: typeof config?.schema === 'string'\n\t\t\t\t\t? resolve(projectRoot, config.schema)\n\t\t\t\t\t: undefined\n\t\tif (!schemaPath) {\n\t\t\tthrow new Error('Could not resolve schema path. Pass --schema <path>.')\n\t\t}\n\n\t\tconst schema = await loadSchemaDefinition(schemaPath, projectRoot)\n\t\tconst { BetterSqlite3Adapter } = await import('@korajs/store/better-sqlite3')\n\t\tconst { Store } = await import('@korajs/store')\n\n\t\tconst strategyName = typeof args.strategy === 'string' ? args.strategy : 'after-ack'\n\t\tconst days = Number.parseInt(typeof args.days === 'string' ? args.days : '30', 10)\n\n\t\tconst store = new Store({\n\t\t\tschema,\n\t\t\tadapter: new BetterSqlite3Adapter(dbPath),\n\t\t})\n\t\tawait store.open()\n\n\t\tlet result: { deletedCount: number; watermark: Map<string, number> }\n\t\tif (strategyName === 'never') {\n\t\t\tresult = await store.compact({ mode: 'never' })\n\t\t} else if (strategyName === 'after-days') {\n\t\t\tresult = await store.compact({ mode: 'after-days', days })\n\t\t} else if (strategyName === 'after-ack') {\n\t\t\tresult = await store.compact({ mode: 'after-ack' })\n\t\t} else {\n\t\t\tawait store.close()\n\t\t\tthrow new Error(`Unknown strategy \"${strategyName}\". Use after-ack, after-days, or never.`)\n\t\t}\n\n\t\tawait store.close()\n\n\t\tlogger.banner()\n\t\tlogger.success(`Compacted ${result.deletedCount} operation log entries.`)\n\t\tfor (const [nodeId, seq] of result.watermark) {\n\t\t\tlogger.step(` ${nodeId}: seq <= ${seq}`)\n\t\t}\n\t},\n})\n","import { KoraError } from '@korajs/core'\n\n/**\n * Base error class for all CLI errors.\n */\nexport class CliError extends KoraError {\n\tconstructor(message: string, context?: Record<string, unknown>) {\n\t\tsuper(message, 'CLI_ERROR', context)\n\t\tthis.name = 'CliError'\n\t}\n}\n\n/**\n * Thrown when the target project directory already exists.\n */\nexport class ProjectExistsError extends KoraError {\n\tconstructor(public readonly directory: string) {\n\t\tsuper(\n\t\t\t`Directory \"${directory}\" already exists. Choose a different name or remove the existing directory.`,\n\t\t\t'PROJECT_EXISTS',\n\t\t\t{ directory },\n\t\t)\n\t\tthis.name = 'ProjectExistsError'\n\t}\n}\n\n/**\n * Thrown when a schema file cannot be found in the project.\n */\nexport class SchemaNotFoundError extends KoraError {\n\tconstructor(public readonly searchedPaths: string[]) {\n\t\tsuper(\n\t\t\t`Could not find a schema file. Searched: ${searchedPaths.join(', ')}. Create a schema file using defineSchema() from @korajs/core.`,\n\t\t\t'SCHEMA_NOT_FOUND',\n\t\t\t{ searchedPaths },\n\t\t)\n\t\tthis.name = 'SchemaNotFoundError'\n\t}\n}\n\n/**\n * Thrown when a command is run outside a valid Kora project.\n */\nexport class InvalidProjectError extends KoraError {\n\tconstructor(public readonly directory: string) {\n\t\tsuper(\n\t\t\t`\"${directory}\" is not a valid Kora project. No package.json with a kora dependency found. Run this command from inside a Kora project.`,\n\t\t\t'INVALID_PROJECT',\n\t\t\t{ directory },\n\t\t)\n\t\tthis.name = 'InvalidProjectError'\n\t}\n}\n\n/**\n * Thrown when a required local dev server binary cannot be found.\n */\nexport class DevServerError extends KoraError {\n\tconstructor(\n\t\tpublic readonly binary: string,\n\t\tpublic readonly searchPath: string,\n\t) {\n\t\tsuper(\n\t\t\t`Could not find required binary \"${binary}\" at ${searchPath}. Install project dependencies and try again.`,\n\t\t\t'DEV_SERVER_ERROR',\n\t\t\t{ binary, searchPath },\n\t\t)\n\t\tthis.name = 'DevServerError'\n\t}\n}\n","import { spawn } from 'node:child_process'\nimport { access } from 'node:fs/promises'\nimport { extname, join } from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport { hasTsxInstalled } from '../../utils/fs-helpers'\n\nexport interface KoraConfigFile {\n\tschema?: string\n\tdev?: {\n\t\tport?: number\n\t\tsync?:\n\t\t\t| boolean\n\t\t\t| {\n\t\t\t\t\tenabled?: boolean\n\t\t\t\t\tport?: number\n\t\t\t\t\tstore?:\n\t\t\t\t\t\t| 'memory'\n\t\t\t\t\t\t| 'sqlite'\n\t\t\t\t\t\t| 'postgres'\n\t\t\t\t\t\t| {\n\t\t\t\t\t\t\t\ttype: 'memory'\n\t\t\t\t\t\t }\n\t\t\t\t\t\t| {\n\t\t\t\t\t\t\t\ttype: 'sqlite'\n\t\t\t\t\t\t\t\tfilename?: string\n\t\t\t\t\t\t }\n\t\t\t\t\t\t| {\n\t\t\t\t\t\t\t\ttype: 'postgres'\n\t\t\t\t\t\t\t\tconnectionString: string\n\t\t\t\t\t\t }\n\t\t\t }\n\t\twatch?:\n\t\t\t| boolean\n\t\t\t| {\n\t\t\t\t\tenabled?: boolean\n\t\t\t\t\tdebounceMs?: number\n\t\t\t }\n\t}\n}\n\nconst CONFIG_CANDIDATES = [\n\t'kora.config.ts',\n\t'kora.config.mts',\n\t'kora.config.cts',\n\t'kora.config.js',\n\t'kora.config.mjs',\n\t'kora.config.cjs',\n]\n\n/**\n * Loads `kora.config.*` from the project root if present.\n */\nexport async function loadKoraConfig(projectRoot: string): Promise<KoraConfigFile | null> {\n\tconst configPath = await findKoraConfigFile(projectRoot)\n\tif (!configPath) return null\n\n\tconst ext = extname(configPath)\n\tif (ext === '.ts' || ext === '.mts' || ext === '.cts') {\n\t\tconst loaded = await loadTypeScriptConfig(configPath, projectRoot)\n\t\treturn toConfigObject(loaded)\n\t}\n\n\tconst loaded = await import(pathToFileURL(configPath).href)\n\treturn toConfigObject(loaded)\n}\n\nasync function findKoraConfigFile(projectRoot: string): Promise<string | null> {\n\tfor (const file of CONFIG_CANDIDATES) {\n\t\tconst candidate = join(projectRoot, file)\n\t\ttry {\n\t\t\tawait access(candidate)\n\t\t\treturn candidate\n\t\t} catch {\n\t\t\t// continue\n\t\t}\n\t}\n\n\treturn null\n}\n\nasync function loadTypeScriptConfig(configPath: string, projectRoot: string): Promise<unknown> {\n\tif (!(await hasTsxInstalled(projectRoot))) {\n\t\tthrow new Error(\n\t\t\t`Found TypeScript config at ${configPath}, but \"tsx\" is not installed in this project. Install tsx or use kora.config.js.`,\n\t\t)\n\t}\n\n\t// Use process.execPath (node) + --import tsx to avoid .cmd shim issues on Windows.\n\t// Use dynamic import() with .then() since --eval may run as CJS (no top-level await).\n\tconst script =\n\t\t'const configPath = process.argv[process.argv.length - 1];' +\n\t\t\"import('node:url').then(u => import(u.pathToFileURL(configPath).href))\" +\n\t\t'.then(mod => { const v = mod.default ?? mod; process.stdout.write(JSON.stringify(v)) })' +\n\t\t'.catch(e => { process.stderr.write(String(e)); process.exit(1) })'\n\n\tconst output = await runCommand(\n\t\tprocess.execPath,\n\t\t['--import', 'tsx', '--eval', script, configPath],\n\t\tprojectRoot,\n\t)\n\n\ttry {\n\t\treturn JSON.parse(output)\n\t} catch {\n\t\tthrow new Error(`Failed to parse ${configPath} output as JSON.`)\n\t}\n}\n\nasync function runCommand(command: string, args: string[], cwd: string): Promise<string> {\n\treturn await new Promise<string>((resolve, reject) => {\n\t\tconst child = spawn(command, args, {\n\t\t\tcwd,\n\t\t\tstdio: ['ignore', 'pipe', 'pipe'],\n\t\t\tenv: process.env,\n\t\t})\n\n\t\tlet stdout = ''\n\t\tlet stderr = ''\n\n\t\tchild.stdout?.on('data', (chunk: Buffer) => {\n\t\t\tstdout += chunk.toString('utf-8')\n\t\t})\n\n\t\tchild.stderr?.on('data', (chunk: Buffer) => {\n\t\t\tstderr += chunk.toString('utf-8')\n\t\t})\n\n\t\tchild.on('error', (error) => {\n\t\t\treject(error)\n\t\t})\n\n\t\tchild.on('exit', (code) => {\n\t\t\tif (code === 0) {\n\t\t\t\tresolve(stdout.trim())\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\treject(new Error(`Failed to load kora config (exit ${code ?? 'unknown'}): ${stderr.trim()}`))\n\t\t})\n\t})\n}\n\nfunction toConfigObject(mod: unknown): KoraConfigFile {\n\tif (typeof mod !== 'object' || mod === null) {\n\t\tthrow new Error('kora config must export an object.')\n\t}\n\n\tconst value = (mod as Record<string, unknown>).default ?? mod\n\tif (typeof value !== 'object' || value === null || Array.isArray(value)) {\n\t\tthrow new Error('kora config must export an object.')\n\t}\n\n\treturn value as KoraConfigFile\n}\n","import { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { dirname, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { defineCommand } from 'citty'\nimport { ProjectExistsError } from '../../errors'\nimport { PreferenceStore } from '../../prompts/preferences'\nimport { PromptCancelledError, createPromptClient } from '../../prompts/prompt-client'\nimport { PACKAGE_MANAGERS, TEMPLATES } from '../../types'\nimport type { PackageManager, TemplateName } from '../../types'\nimport { directoryExists } from '../../utils/fs-helpers'\nimport { createLogger } from '../../utils/logger'\nimport {\n\tdetectPackageManager,\n\tgetInstallCommand,\n\tgetRunDevCommand,\n} from '../../utils/package-manager'\nimport {\n\tapplyEditorWorkspacePreset,\n\tdetectEditorFromEnvironment,\n\tdetectGitContext,\n\tdetectMonorepoContext,\n\tresolveMonorepoTargetDirectory,\n} from './environment-detection'\nimport { isSupportedWebFramework } from './options'\nimport {\n\ttype CreateFlags,\n\tresolveCreatePreferencesFlow,\n\tsaveResolvedPreferences,\n\tshouldSavePreferences,\n} from './preferences-flow'\nimport { validateProjectName } from './project-name'\nimport { applySyncProviderPreset } from './sync-provider-preset'\nimport { scaffoldTemplate } from './template-engine'\n\n/**\n * The `create` command — scaffolds a new Kora project.\n * Used as `kora create <name>` or `create-kora-app <name>`.\n */\nexport const createCommand = defineCommand({\n\tmeta: {\n\t\tname: 'create',\n\t\tdescription: 'Create a new Kora application',\n\t},\n\targs: {\n\t\tname: {\n\t\t\ttype: 'positional',\n\t\t\tdescription: 'Project directory name',\n\t\t\trequired: false,\n\t\t},\n\t\tplatform: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Target platform (web, desktop-tauri)',\n\t\t},\n\t\ttemplate: {\n\t\t\ttype: 'string',\n\t\t\tdescription:\n\t\t\t\t'Project template (react-tailwind-sync, react-sync, vue-sync, svelte-sync, tauri-react, ...)',\n\t\t},\n\t\tpm: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Package manager (pnpm, npm, yarn, bun)',\n\t\t},\n\t\tframework: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'UI framework (react, vue, svelte, solid)',\n\t\t},\n\t\tdb: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Database backend for sync templates (sqlite, postgres)',\n\t\t},\n\t\t'db-provider': {\n\t\t\ttype: 'string',\n\t\t\tdescription:\n\t\t\t\t'Database provider for postgres (local, supabase, neon, railway, vercel-postgres, custom)',\n\t\t},\n\t\tauth: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Authentication mode (none, email-password, oauth)',\n\t\t},\n\t\t'skip-install': {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Skip installing dependencies',\n\t\t\tdefault: false,\n\t\t},\n\t\tyes: {\n\t\t\ttype: 'boolean',\n\t\t\talias: 'y',\n\t\t\tdescription: 'Accept all defaults (react-tailwind-sync + detected package manager)',\n\t\t\tdefault: false,\n\t\t},\n\t\ttailwind: {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Use Tailwind CSS (use --no-tailwind to skip)',\n\t\t},\n\t\tsync: {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Include sync server (use --no-sync to skip)',\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tconst logger = createLogger()\n\t\tconst prompts = createPromptClient()\n\t\tconst preferenceStore = new PreferenceStore()\n\t\tlogger.banner()\n\t\ttry {\n\t\t\tconst useDefaults = args.yes === true\n\t\t\tif (!useDefaults) {\n\t\t\t\tprompts.intro('Kora.js — Offline-first application framework')\n\t\t\t}\n\n\t\t\t// Resolve project name\n\t\t\tconst projectName =\n\t\t\t\targs.name ||\n\t\t\t\t(useDefaults ? 'my-kora-app' : await prompts.text('Project name', 'my-kora-app'))\n\t\t\tif (!projectName) {\n\t\t\t\tlogger.error('Project name is required')\n\t\t\t\tprocess.exitCode = 1\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst nameValidation = validateProjectName(projectName)\n\t\t\tif (!nameValidation.valid) {\n\t\t\t\tlogger.error('Invalid project name.')\n\t\t\t\tfor (const issue of nameValidation.issues) {\n\t\t\t\t\tlogger.step(`- ${issue}`)\n\t\t\t\t}\n\t\t\t\tif (!useDefaults) {\n\t\t\t\t\tprompts.outro('Project creation aborted.')\n\t\t\t\t}\n\t\t\t\tprocess.exitCode = 1\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst preferenceFlags: CreateFlags = {\n\t\t\t\tplatform: typeof args.platform === 'string' ? args.platform : undefined,\n\t\t\t\tframework: typeof args.framework === 'string' ? args.framework : undefined,\n\t\t\t\tauth: typeof args.auth === 'string' ? args.auth : undefined,\n\t\t\t\tdb: typeof args.db === 'string' ? args.db : undefined,\n\t\t\t\tdbProvider: typeof args['db-provider'] === 'string' ? args['db-provider'] : undefined,\n\t\t\t\ttailwind: args.tailwind,\n\t\t\t\tsync: args.sync,\n\t\t\t\tuseDefaults,\n\t\t\t}\n\n\t\t\tconst selection = await resolveCreatePreferencesFlow({\n\t\t\t\tflags: preferenceFlags,\n\t\t\t\tprompts,\n\t\t\t\tstore: preferenceStore,\n\t\t\t})\n\t\t\tif (!isSupportedWebFramework(selection.framework)) {\n\t\t\t\tlogger.error(\n\t\t\t\t\t`Framework \"${selection.framework}\" is not available yet. Use react, vue, or svelte.`,\n\t\t\t\t)\n\t\t\t\tif (!useDefaults) {\n\t\t\t\t\tprompts.outro('Project creation aborted.')\n\t\t\t\t}\n\t\t\t\tprocess.exitCode = 1\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (selection.auth !== 'none') {\n\t\t\t\tlogger.error(`Auth mode \"${selection.auth}\" is not available yet. Use \"none\".`)\n\t\t\t\tif (!useDefaults) {\n\t\t\t\t\tprompts.outro('Project creation aborted.')\n\t\t\t\t}\n\t\t\t\tprocess.exitCode = 1\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Resolve template (explicit --template still overrides all selections).\n\t\t\tconst template: TemplateName =\n\t\t\t\targs.template && isValidTemplate(args.template) ? args.template : selection.template\n\n\t\t\t// Resolve package manager\n\t\t\tlet pm: PackageManager\n\t\t\tif (args.pm && isValidPackageManager(args.pm)) {\n\t\t\t\tpm = args.pm\n\t\t\t} else if (useDefaults) {\n\t\t\t\tpm = detectPackageManager()\n\t\t\t} else if (selection.usedStoredPreferences) {\n\t\t\t\tpm = preferenceStore.getCreatePreferences()?.packageManager ?? detectPackageManager()\n\t\t\t} else {\n\t\t\t\tconst detected = detectPackageManager()\n\t\t\t\tpm = await prompts.select(\n\t\t\t\t\t'Package manager:',\n\t\t\t\t\tPACKAGE_MANAGERS.map((p) => ({\n\t\t\t\t\t\tlabel: p === detected ? `${p} (detected)` : p,\n\t\t\t\t\t\tvalue: p,\n\t\t\t\t\t})),\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tconst editorDetection = detectEditorFromEnvironment()\n\t\t\tconst gitContext = await detectGitContext(process.cwd())\n\t\t\tconst monorepoContext = await detectMonorepoContext(process.cwd())\n\n\t\t\tlet targetDir = resolve(process.cwd(), projectName)\n\t\t\tif (!useDefaults && monorepoContext.isMonorepo && monorepoContext.root !== null) {\n\t\t\t\tconst useWorkspaceTarget = await prompts.confirm(\n\t\t\t\t\t`Detected ${formatMonorepoKind(monorepoContext.kind)} at ${monorepoContext.root}. Create app under packages/${projectName}?`,\n\t\t\t\t\ttrue,\n\t\t\t\t)\n\t\t\t\tif (useWorkspaceTarget) {\n\t\t\t\t\ttargetDir = resolveMonorepoTargetDirectory(monorepoContext.root, projectName)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Validate target directory\n\t\t\tif (await directoryExists(targetDir)) {\n\t\t\t\tthrow new ProjectExistsError(projectName)\n\t\t\t}\n\n\t\t\t// Resolve kora version from this package's own package.json\n\t\t\tconst koraVersion = resolveKoraVersion()\n\n\t\t\t// Scaffold\n\t\t\tlogger.step(`Creating ${projectName} with ${template} template...`)\n\t\t\tawait scaffoldTemplate(template, targetDir, {\n\t\t\t\tprojectName,\n\t\t\t\tpackageManager: pm,\n\t\t\t\tkoraVersion,\n\t\t\t\tdbProvider: selection.dbProvider,\n\t\t\t})\n\t\t\tawait applySyncProviderPreset({\n\t\t\t\ttargetDir,\n\t\t\t\ttemplate,\n\t\t\t\tdb: selection.db,\n\t\t\t\tdbProvider: selection.dbProvider,\n\t\t\t})\n\t\t\tif (!useDefaults && editorDetection.editor !== 'unknown') {\n\t\t\t\tconst shouldApplyEditorPreset = await prompts.confirm(\n\t\t\t\t\t`Detected ${formatEditor(editorDetection.editor)}. Add workspace recommendations for ${formatEditor(editorDetection.editor)}?`,\n\t\t\t\t\ttrue,\n\t\t\t\t)\n\t\t\t\tif (shouldApplyEditorPreset) {\n\t\t\t\t\tconst appliedPreset = await applyEditorWorkspacePreset({\n\t\t\t\t\t\ttargetDir,\n\t\t\t\t\t\teditor: editorDetection.editor,\n\t\t\t\t\t})\n\t\t\t\t\tif (appliedPreset.applied) {\n\t\t\t\t\t\tlogger.step(\n\t\t\t\t\t\t\t`Added editor recommendations at ${relativeToTarget(targetDir, appliedPreset.filePath)}`,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (selection.db === 'postgres' && isSyncTemplate(template)) {\n\t\t\t\tlogger.info(\n\t\t\t\t\t`Applied PostgreSQL sync preset (${formatDbProviderForLog(selection.dbProvider)}). Update DATABASE_URL in .env.example before running the sync server.`,\n\t\t\t\t)\n\t\t\t}\n\t\t\tif (gitContext.hasRepository) {\n\t\t\t\tlogger.step(\n\t\t\t\t\t`Detected existing git repository at ${gitContext.repositoryRoot}. Skipping git initialization.`,\n\t\t\t\t)\n\t\t\t}\n\t\t\tlogger.success('Project scaffolded')\n\n\t\t\tif (shouldSavePreferences(preferenceFlags)) {\n\t\t\t\tsaveResolvedPreferences(preferenceStore, {\n\t\t\t\t\tplatform: selection.platform,\n\t\t\t\t\tframework: selection.framework,\n\t\t\t\t\tauth: selection.auth,\n\t\t\t\t\tdb: selection.db,\n\t\t\t\t\tdbProvider: selection.dbProvider,\n\t\t\t\t\ttailwind: selection.tailwind,\n\t\t\t\t\tsync: selection.sync,\n\t\t\t\t\tpackageManager: pm,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// Install dependencies\n\t\t\tif (!args['skip-install']) {\n\t\t\t\tlogger.step('Installing dependencies...')\n\t\t\t\ttry {\n\t\t\t\t\texecSync(getInstallCommand(pm), { cwd: targetDir, stdio: 'inherit' })\n\t\t\t\t\tlogger.success('Dependencies installed')\n\t\t\t\t} catch {\n\t\t\t\t\tlogger.warn('Failed to install dependencies. Run install manually.')\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Print next steps\n\t\t\tlogger.blank()\n\t\t\tlogger.info('Done! Next steps:')\n\t\t\tlogger.blank()\n\t\t\tlogger.step(` cd ${targetDir}`)\n\t\t\tlogger.step(` ${getRunDevCommand(pm)}`)\n\t\t\tlogger.blank()\n\t\t\tif (!useDefaults) {\n\t\t\t\tprompts.outro('Project ready. Happy building with Kora!')\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (error instanceof PromptCancelledError) {\n\t\t\t\tprocess.exitCode = 1\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (error instanceof Error && error.message.startsWith('Invalid --')) {\n\t\t\t\tlogger.error(error.message)\n\t\t\t\tif (!args.yes) {\n\t\t\t\t\tprompts.outro('Project creation aborted.')\n\t\t\t\t}\n\t\t\t\tprocess.exitCode = 1\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\t},\n})\n\nfunction isValidTemplate(value: string): value is TemplateName {\n\treturn (TEMPLATES as readonly string[]).includes(value)\n}\n\nfunction isValidPackageManager(value: string): value is PackageManager {\n\treturn (PACKAGE_MANAGERS as readonly string[]).includes(value)\n}\n\nfunction isSyncTemplate(template: TemplateName): boolean {\n\treturn (\n\t\ttemplate === 'react-sync' ||\n\t\ttemplate === 'react-tailwind-sync' ||\n\t\ttemplate === 'vue-sync' ||\n\t\ttemplate === 'vue-tailwind-sync' ||\n\t\ttemplate === 'svelte-sync' ||\n\t\ttemplate === 'svelte-tailwind-sync' ||\n\t\ttemplate === 'tauri-react'\n\t)\n}\n\nfunction formatDbProviderForLog(dbProvider: string): string {\n\tswitch (dbProvider) {\n\t\tcase 'supabase':\n\t\t\treturn 'Supabase'\n\t\tcase 'neon':\n\t\t\treturn 'Neon'\n\t\tcase 'railway':\n\t\t\treturn 'Railway'\n\t\tcase 'vercel-postgres':\n\t\t\treturn 'Vercel Postgres'\n\t\tcase 'custom':\n\t\t\treturn 'Custom'\n\t\tcase 'local':\n\t\t\treturn 'Local Postgres'\n\t\tcase 'none':\n\t\t\treturn 'PostgreSQL'\n\t\tdefault:\n\t\t\treturn dbProvider\n\t}\n}\n\nfunction formatEditor(editor: string): string {\n\tswitch (editor) {\n\t\tcase 'vscode':\n\t\t\treturn 'VS Code'\n\t\tcase 'cursor':\n\t\t\treturn 'Cursor'\n\t\tcase 'windsurf':\n\t\t\treturn 'Windsurf'\n\t\tcase 'zed':\n\t\t\treturn 'Zed'\n\t\tdefault:\n\t\t\treturn editor\n\t}\n}\n\nfunction formatMonorepoKind(kind: string): string {\n\tswitch (kind) {\n\t\tcase 'pnpm-workspace':\n\t\t\treturn 'pnpm workspace'\n\t\tcase 'npm-workspaces':\n\t\t\treturn 'npm workspace'\n\t\tcase 'turborepo':\n\t\t\treturn 'Turborepo'\n\t\tdefault:\n\t\t\treturn 'monorepo'\n\t}\n}\n\nfunction relativeToTarget(targetDir: string, filePath: string | null): string {\n\tif (filePath === null) return '.'\n\tconst normalizedTarget = targetDir.endsWith('/') ? targetDir : `${targetDir}/`\n\tif (filePath.startsWith(normalizedTarget)) {\n\t\treturn filePath.slice(normalizedTarget.length)\n\t}\n\tif (filePath === targetDir) {\n\t\treturn '.'\n\t}\n\treturn filePath\n}\n\n/**\n * Reads the version from @korajs/cli's own package.json and derives a\n * compatible version range for all @korajs packages.\n *\n * The CLI may be a patch ahead of other packages (e.g. CLI-only fixes),\n * so we use the major.minor range (^major.minor.0) which matches all\n * packages in the same release series.\n */\nfunction resolveKoraVersion(): string {\n\ttry {\n\t\tlet dir = dirname(fileURLToPath(import.meta.url))\n\t\tfor (let i = 0; i < 5; i++) {\n\t\t\tconst pkgPath = resolve(dir, 'package.json')\n\t\t\tif (existsSync(pkgPath)) {\n\t\t\t\tconst pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) as { name?: string; version: string }\n\t\t\t\tif (pkg.name === '@korajs/cli') {\n\t\t\t\t\tif (pkg.version === '0.0.0') return 'latest'\n\t\t\t\t\t// Use ^major.minor.0 so all packages in the series match\n\t\t\t\t\tconst parts = pkg.version.split('.')\n\t\t\t\t\treturn `^${parts[0]}.${parts[1]}.0`\n\t\t\t\t}\n\t\t\t}\n\t\t\tdir = dirname(dir)\n\t\t}\n\t\treturn 'latest'\n\t} catch {\n\t\treturn 'latest'\n\t}\n}\n","import Conf from 'conf'\nimport type {\n\tAuthOption,\n\tDatabaseOption,\n\tDatabaseProviderOption,\n\tFrameworkOption,\n\tPlatformOption,\n} from '../commands/create/options'\nimport type { PackageManager } from '../types'\n\nexport interface CreatePreferences {\n\tplatform: PlatformOption\n\tframework: FrameworkOption\n\ttailwind: boolean\n\tsync: boolean\n\tdb: DatabaseOption\n\tdbProvider: DatabaseProviderOption\n\tauth: AuthOption\n\tpackageManager: PackageManager\n}\n\nconst DEFAULT_PREFERENCES: CreatePreferences = {\n\tplatform: 'web',\n\tframework: 'react',\n\ttailwind: true,\n\tsync: true,\n\tdb: 'sqlite',\n\tdbProvider: 'none',\n\tauth: 'none',\n\tpackageManager: 'pnpm',\n}\n\nconst PREFERENCES_KEY = 'create.defaults'\n\n/**\n * Preference store for scaffold-time defaults in `create-kora-app`.\n */\nexport class PreferenceStore {\n\tprivate readonly store: Conf<{ [PREFERENCES_KEY]?: CreatePreferences }>\n\n\tpublic constructor() {\n\t\tthis.store = new Conf<{ [PREFERENCES_KEY]?: CreatePreferences }>({\n\t\t\tprojectName: 'korajs-cli',\n\t\t})\n\t}\n\n\tpublic getCreatePreferences(): CreatePreferences | null {\n\t\treturn this.store.get(PREFERENCES_KEY) ?? null\n\t}\n\n\tpublic saveCreatePreferences(preferences: CreatePreferences): void {\n\t\tthis.store.set(PREFERENCES_KEY, preferences)\n\t}\n\n\tpublic clearCreatePreferences(): void {\n\t\tthis.store.delete(PREFERENCES_KEY)\n\t}\n}\n\n/**\n * Gets preferences from storage or returns defaults when not available.\n */\nexport function getCreatePreferencesOrDefault(store: PreferenceStore): CreatePreferences {\n\treturn store.getCreatePreferences() ?? DEFAULT_PREFERENCES\n}\n\nexport function getDefaultCreatePreferences(): CreatePreferences {\n\treturn { ...DEFAULT_PREFERENCES }\n}\n","import {\n\tcancel as clackCancel,\n\tconfirm as clackConfirm,\n\tintro as clackIntro,\n\tisCancel as clackIsCancel,\n\toutro as clackOutro,\n\tselect as clackSelect,\n\ttext as clackText,\n} from '@clack/prompts'\nimport { promptConfirm, promptSelect, promptText } from '../utils/prompt'\n\nexport interface SelectOption<T extends string> {\n\tlabel: string\n\tvalue: T\n\thint?: string\n\tdisabled?: boolean\n}\n\ntype ClackSelectOption<T extends string> = {\n\tvalue: T\n\tlabel?: string\n\thint?: string\n\tdisabled?: boolean\n}\n\nexport interface PromptClient {\n\ttext(message: string, defaultValue?: string): Promise<string>\n\tselect<T extends string>(message: string, options: readonly SelectOption<T>[]): Promise<T>\n\tconfirm(message: string, defaultValue?: boolean): Promise<boolean>\n\tintro(message: string): void\n\toutro(message: string): void\n}\n\nexport class PromptCancelledError extends Error {\n\tpublic constructor(message = 'Prompt cancelled by user') {\n\t\tsuper(message)\n\t\tthis.name = 'PromptCancelledError'\n\t}\n}\n\n/**\n * Prompt client backed by the current readline helpers.\n *\n * Phase 12 will introduce a richer prompt backend. This adapter keeps command\n * logic decoupled from the prompt implementation so we can migrate without\n * reshaping command behavior.\n */\nexport class ReadlinePromptClient implements PromptClient {\n\tpublic async text(message: string, defaultValue?: string): Promise<string> {\n\t\treturn promptText(message, defaultValue)\n\t}\n\n\tpublic async select<T extends string>(\n\t\tmessage: string,\n\t\toptions: readonly SelectOption<T>[],\n\t): Promise<T> {\n\t\treturn promptSelect(\n\t\t\tmessage,\n\t\t\toptions\n\t\t\t\t.filter((option) => option.disabled !== true)\n\t\t\t\t.map((option) => ({ label: option.label, value: option.value })),\n\t\t)\n\t}\n\n\tpublic async confirm(message: string, defaultValue = false): Promise<boolean> {\n\t\treturn promptConfirm(message, defaultValue)\n\t}\n\n\tpublic intro(message: string): void {\n\t\t// The readline backend does not provide intro/outro framing.\n\t\t// Keep no-op semantics for compatibility.\n\t\tvoid message\n\t}\n\n\tpublic outro(message: string): void {\n\t\t// The readline backend does not provide intro/outro framing.\n\t\t// Keep no-op semantics for compatibility.\n\t\tvoid message\n\t}\n}\n\n/**\n * Returns the default prompt client for interactive CLI flows.\n */\nexport function createPromptClient(): PromptClient {\n\tconst canUseInteractiveClack =\n\t\ttypeof process !== 'undefined' && process.stdin.isTTY && process.stdout.isTTY\n\tif (canUseInteractiveClack) {\n\t\treturn new ClackPromptClient()\n\t}\n\treturn new ReadlinePromptClient()\n}\n\n/**\n * Prompt client backed by @clack/prompts for richer interactive UX.\n * Falls back to readline in non-interactive contexts.\n */\nexport class ClackPromptClient implements PromptClient {\n\tpublic async text(message: string, defaultValue?: string): Promise<string> {\n\t\tconst result = await clackText({\n\t\t\tmessage,\n\t\t\tplaceholder: defaultValue,\n\t\t\tdefaultValue,\n\t\t})\n\t\tif (clackIsCancel(result)) {\n\t\t\tclackCancel('Operation cancelled.')\n\t\t\tthrow new PromptCancelledError()\n\t\t}\n\t\tconst value = result.trim()\n\t\tif (value.length > 0) return value\n\t\treturn defaultValue ?? ''\n\t}\n\n\tpublic async select<T extends string>(\n\t\tmessage: string,\n\t\toptions: readonly SelectOption<T>[],\n\t): Promise<T> {\n\t\tconst mappedOptions: ClackSelectOption<T>[] = options.map((option) => ({\n\t\t\tlabel: option.label,\n\t\t\tvalue: option.value,\n\t\t\thint: option.hint,\n\t\t\tdisabled: option.disabled,\n\t\t}))\n\t\tconst result = await clackSelect({\n\t\t\tmessage,\n\t\t\toptions: mappedOptions as unknown as Parameters<typeof clackSelect>[0]['options'],\n\t\t})\n\t\tif (clackIsCancel(result)) {\n\t\t\tclackCancel('Operation cancelled.')\n\t\t\tthrow new PromptCancelledError()\n\t\t}\n\t\treturn result as T\n\t}\n\n\tpublic async confirm(message: string, defaultValue = false): Promise<boolean> {\n\t\tconst result = await clackConfirm({\n\t\t\tmessage,\n\t\t\tinitialValue: defaultValue,\n\t\t})\n\t\tif (clackIsCancel(result)) {\n\t\t\tclackCancel('Operation cancelled.')\n\t\t\tthrow new PromptCancelledError()\n\t\t}\n\t\treturn result\n\t}\n\n\tpublic intro(message: string): void {\n\t\tclackIntro(message)\n\t}\n\n\tpublic outro(message: string): void {\n\t\tclackOutro(message)\n\t}\n}\n","import { type Interface as ReadlineInterface, createInterface } from 'node:readline'\n\nexport interface PromptOptions {\n\t/** Input stream (defaults to process.stdin) */\n\tinput?: NodeJS.ReadableStream\n\t/** Output stream (defaults to process.stdout) */\n\toutput?: NodeJS.WritableStream\n}\n\n/**\n * Prompts the user for text input.\n *\n * @param message - The prompt message to display\n * @param defaultValue - Optional default value shown in brackets\n * @param options - Optional input/output streams for testing\n */\nexport function promptText(\n\tmessage: string,\n\tdefaultValue?: string,\n\toptions?: PromptOptions,\n): Promise<string> {\n\treturn new Promise((resolve) => {\n\t\tconst rl = createReadline(options)\n\t\tconst suffix = defaultValue !== undefined ? ` (${defaultValue})` : ''\n\t\trl.question(` ? ${message}${suffix}: `, (answer) => {\n\t\t\trl.close()\n\t\t\tconst trimmed = answer.trim()\n\t\t\tresolve(trimmed || defaultValue || '')\n\t\t})\n\t})\n}\n\n/**\n * Prompts the user to select from a numbered list of options.\n *\n * @param message - The prompt message to display\n * @param choices - Array of { label, value } options\n * @param options - Optional input/output streams for testing\n */\nexport function promptSelect<T extends string>(\n\tmessage: string,\n\tchoices: readonly { label: string; value: T }[],\n\toptions?: PromptOptions,\n): Promise<T> {\n\treturn new Promise((resolve) => {\n\t\tconst rl = createReadline(options)\n\t\tconst out = options?.output ?? process.stdout\n\n\t\tout.write(` ? ${message}\\n`)\n\t\tfor (let i = 0; i < choices.length; i++) {\n\t\t\tconst choice = choices[i]\n\t\t\tif (choice) {\n\t\t\t\tout.write(` ${i + 1}) ${choice.label}\\n`)\n\t\t\t}\n\t\t}\n\n\t\tconst ask = (): void => {\n\t\t\trl.question(' > ', (answer) => {\n\t\t\t\tconst index = Number.parseInt(answer.trim(), 10) - 1\n\t\t\t\tconst selected = choices[index]\n\t\t\t\tif (selected) {\n\t\t\t\t\trl.close()\n\t\t\t\t\tresolve(selected.value)\n\t\t\t\t} else {\n\t\t\t\t\tout.write(` Please enter a number between 1 and ${choices.length}\\n`)\n\t\t\t\t\task()\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\task()\n\t})\n}\n\n/**\n * Prompts the user with a yes/no confirmation.\n *\n * @param message - The prompt message to display\n * @param defaultValue - Default when input is empty (true => yes)\n * @param options - Optional input/output streams for testing\n */\nexport function promptConfirm(\n\tmessage: string,\n\tdefaultValue = false,\n\toptions?: PromptOptions,\n): Promise<boolean> {\n\treturn new Promise((resolve) => {\n\t\tconst rl = createReadline(options)\n\t\tconst suffix = defaultValue ? 'Y/n' : 'y/N'\n\n\t\tconst ask = (): void => {\n\t\t\trl.question(` ? ${message} (${suffix}): `, (answer) => {\n\t\t\t\tconst normalized = answer.trim().toLowerCase()\n\t\t\t\tif (normalized.length === 0) {\n\t\t\t\t\trl.close()\n\t\t\t\t\tresolve(defaultValue)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif (normalized === 'y' || normalized === 'yes') {\n\t\t\t\t\trl.close()\n\t\t\t\t\tresolve(true)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif (normalized === 'n' || normalized === 'no') {\n\t\t\t\t\trl.close()\n\t\t\t\t\tresolve(false)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t;(options?.output ?? process.stdout).write(' Please answer with y or n\\n')\n\t\t\t\task()\n\t\t\t})\n\t\t}\n\n\t\task()\n\t})\n}\n\nfunction createReadline(options?: PromptOptions): ReadlineInterface {\n\treturn createInterface({\n\t\tinput: options?.input ?? process.stdin,\n\t\toutput: options?.output ?? process.stdout,\n\t})\n}\n","/** Supported package managers */\nexport const PACKAGE_MANAGERS = ['pnpm', 'npm', 'yarn', 'bun'] as const\nexport type PackageManager = (typeof PACKAGE_MANAGERS)[number]\n\n/** Available project templates */\nexport const TEMPLATES = [\n\t'react-tailwind-sync',\n\t'react-tailwind',\n\t'react-sync',\n\t'react-basic',\n\t'vue-sync',\n\t'vue-basic',\n\t'vue-tailwind-sync',\n\t'vue-tailwind',\n\t'svelte-sync',\n\t'svelte-basic',\n\t'svelte-tailwind-sync',\n\t'svelte-tailwind',\n\t'tauri-react',\n] as const\nexport type TemplateName = (typeof TEMPLATES)[number]\n\n/** Metadata for a project template */\nexport interface TemplateInfo {\n\tname: TemplateName\n\tlabel: string\n\tdescription: string\n}\n\n/** Available templates with their descriptions */\nexport const TEMPLATE_INFO: readonly TemplateInfo[] = [\n\t{\n\t\tname: 'react-tailwind-sync',\n\t\tlabel: 'React + Tailwind (with sync)',\n\t\tdescription: 'Polished dark-themed app with Tailwind CSS and sync server (Recommended)',\n\t},\n\t{\n\t\tname: 'react-tailwind',\n\t\tlabel: 'React + Tailwind (local-only)',\n\t\tdescription: 'Polished dark-themed app with Tailwind CSS — no sync server',\n\t},\n\t{\n\t\tname: 'react-sync',\n\t\tlabel: 'React + CSS (with sync)',\n\t\tdescription: 'Clean CSS app with sync server included',\n\t},\n\t{\n\t\tname: 'react-basic',\n\t\tlabel: 'React + CSS (local-only)',\n\t\tdescription: 'Clean CSS app — no sync server',\n\t},\n\t{\n\t\tname: 'vue-sync',\n\t\tlabel: 'Vue 3 + CSS (with sync)',\n\t\tdescription: 'Vue composables with sync server included',\n\t},\n\t{\n\t\tname: 'vue-basic',\n\t\tlabel: 'Vue 3 + CSS (local-only)',\n\t\tdescription: 'Vue composables — no sync server',\n\t},\n\t{\n\t\tname: 'vue-tailwind-sync',\n\t\tlabel: 'Vue 3 + Tailwind (with sync)',\n\t\tdescription: 'Polished Vue app with Tailwind CSS and sync server',\n\t},\n\t{\n\t\tname: 'vue-tailwind',\n\t\tlabel: 'Vue 3 + Tailwind (local-only)',\n\t\tdescription: 'Polished Vue app with Tailwind CSS — no sync server',\n\t},\n\t{\n\t\tname: 'svelte-sync',\n\t\tlabel: 'Svelte 5 + CSS (with sync)',\n\t\tdescription: 'Svelte stores with sync server included',\n\t},\n\t{\n\t\tname: 'svelte-basic',\n\t\tlabel: 'Svelte 5 + CSS (local-only)',\n\t\tdescription: 'Svelte stores — no sync server',\n\t},\n\t{\n\t\tname: 'svelte-tailwind-sync',\n\t\tlabel: 'Svelte 5 + Tailwind (with sync)',\n\t\tdescription: 'Polished Svelte app with Tailwind CSS and sync server',\n\t},\n\t{\n\t\tname: 'svelte-tailwind',\n\t\tlabel: 'Svelte 5 + Tailwind (local-only)',\n\t\tdescription: 'Polished Svelte app with Tailwind CSS — no sync server',\n\t},\n\t{\n\t\tname: 'tauri-react',\n\t\tlabel: 'Tauri Desktop (native SQLite)',\n\t\tdescription: 'Desktop app with native SQLite — no WASM, includes sync server',\n\t},\n] as const\n\n/** Variables available for template substitution */\nexport interface TemplateContext {\n\tprojectName: string\n\tpackageManager: PackageManager\n\tkoraVersion: string\n\tdbProvider?: string\n}\n","import { execSync } from 'node:child_process'\nimport type { PackageManager } from '../types'\n\n/**\n * Detects the package manager used to invoke the current process\n * by reading the npm_config_user_agent environment variable.\n * Falls back to 'npm' if detection fails.\n */\nexport function detectPackageManager(): PackageManager {\n\tconst userAgent = process.env.npm_config_user_agent\n\tif (!userAgent) return 'npm'\n\n\tif (userAgent.startsWith('pnpm/')) return 'pnpm'\n\tif (userAgent.startsWith('yarn/')) return 'yarn'\n\tif (userAgent.startsWith('bun/')) return 'bun'\n\treturn 'npm'\n}\n\n/** Returns the install command for the given package manager */\nexport function getInstallCommand(pm: PackageManager): string {\n\treturn pm === 'yarn' ? 'yarn' : `${pm} install`\n}\n\n/** Returns the dev server run command for the given package manager */\nexport function getRunDevCommand(pm: PackageManager): string {\n\tif (pm === 'npm') return 'npm run dev'\n\treturn `${pm} dev`\n}\n\n/** Checks if a package manager is available on PATH */\nexport function isPackageManagerAvailable(pm: PackageManager): boolean {\n\ttry {\n\t\texecSync(`${pm} --version`, { stdio: 'ignore' })\n\t\treturn true\n\t} catch {\n\t\treturn false\n\t}\n}\n","import { access, mkdir, readFile, stat, writeFile } from 'node:fs/promises'\nimport { dirname, join, resolve } from 'node:path'\n\nexport type SupportedEditor = 'vscode' | 'cursor' | 'windsurf' | 'zed' | 'unknown'\n\nexport interface EditorDetectionResult {\n\teditor: SupportedEditor\n\tsource: 'env' | 'none'\n}\n\nexport interface GitContextResult {\n\thasRepository: boolean\n\trepositoryRoot: string | null\n}\n\nexport interface MonorepoContextResult {\n\tisMonorepo: boolean\n\troot: string | null\n\tkind: 'pnpm-workspace' | 'npm-workspaces' | 'turborepo' | 'none'\n}\n\nexport interface EditorWorkspacePresetResult {\n\tapplied: boolean\n\tfilePath: string | null\n}\n\n/**\n * Detects which editor is most likely being used by inspecting environment\n * variables commonly set by integrated terminals.\n */\nexport function detectEditorFromEnvironment(\n\tenv: Record<string, string | undefined> = process.env,\n): EditorDetectionResult {\n\tconst termProgram = String(env.TERM_PROGRAM ?? '').toLowerCase()\n\tconst editorValue = `${String(env.EDITOR ?? '')} ${String(env.VISUAL ?? '')}`.toLowerCase()\n\n\tif (\n\t\ttermProgram.includes('cursor') ||\n\t\tenv.CURSOR_TRACE_ID !== undefined ||\n\t\tenv.CURSOR_SESSION_ID !== undefined ||\n\t\teditorValue.includes('cursor')\n\t) {\n\t\treturn { editor: 'cursor', source: 'env' }\n\t}\n\tif (\n\t\ttermProgram.includes('windsurf') ||\n\t\tenv.WINDSURF_SESSION_ID !== undefined ||\n\t\teditorValue.includes('windsurf')\n\t) {\n\t\treturn { editor: 'windsurf', source: 'env' }\n\t}\n\tif (\n\t\ttermProgram.includes('vscode') ||\n\t\tenv.VSCODE_GIT_IPC_HANDLE !== undefined ||\n\t\tenv.VSCODE_IPC_HOOK !== undefined ||\n\t\tenv.VSCODE_PID !== undefined ||\n\t\teditorValue.includes('code')\n\t) {\n\t\treturn { editor: 'vscode', source: 'env' }\n\t}\n\tif (termProgram.includes('zed') || env.ZED_TERM !== undefined || editorValue.includes('zed')) {\n\t\treturn { editor: 'zed', source: 'env' }\n\t}\n\treturn { editor: 'unknown', source: 'none' }\n}\n\n/**\n * Finds the nearest ancestor directory that contains a `.git` entry.\n */\nexport async function detectGitContext(startDir: string): Promise<GitContextResult> {\n\tconst root = await findNearestAncestorWithEntry(startDir, '.git')\n\treturn {\n\t\thasRepository: root !== null,\n\t\trepositoryRoot: root,\n\t}\n}\n\n/**\n * Detects whether the given path is inside a monorepo workspace.\n * Detection currently supports pnpm workspaces, npm workspaces, and Turborepo.\n */\nexport async function detectMonorepoContext(startDir: string): Promise<MonorepoContextResult> {\n\tlet current = resolve(startDir)\n\tfor (;;) {\n\t\tif (await fileExists(join(current, 'pnpm-workspace.yaml'))) {\n\t\t\treturn { isMonorepo: true, root: current, kind: 'pnpm-workspace' }\n\t\t}\n\n\t\tif (await fileExists(join(current, 'turbo.json'))) {\n\t\t\treturn { isMonorepo: true, root: current, kind: 'turborepo' }\n\t\t}\n\n\t\tconst packageJsonPath = join(current, 'package.json')\n\t\tif (await fileExists(packageJsonPath)) {\n\t\t\ttry {\n\t\t\t\tconst packageJsonRaw = await readFile(packageJsonPath, 'utf-8')\n\t\t\t\tconst parsed = JSON.parse(packageJsonRaw) as { workspaces?: unknown }\n\t\t\t\tif (Array.isArray(parsed.workspaces) || isNpmWorkspaceObject(parsed.workspaces)) {\n\t\t\t\t\treturn { isMonorepo: true, root: current, kind: 'npm-workspaces' }\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Ignore malformed package.json and keep walking upward.\n\t\t\t}\n\t\t}\n\n\t\tconst parent = dirname(current)\n\t\tif (parent === current) {\n\t\t\treturn { isMonorepo: false, root: null, kind: 'none' }\n\t\t}\n\t\tcurrent = parent\n\t}\n}\n\n/**\n * Applies editor-specific workspace configuration. For VS Code-compatible\n * editors this creates or updates `.vscode/extensions.json` recommendations.\n */\nexport async function applyEditorWorkspacePreset(params: {\n\ttargetDir: string\n\teditor: SupportedEditor\n}): Promise<EditorWorkspacePresetResult> {\n\tconst { targetDir, editor } = params\n\tif (editor !== 'vscode' && editor !== 'cursor' && editor !== 'windsurf') {\n\t\treturn { applied: false, filePath: null }\n\t}\n\n\tconst vscodeDir = join(targetDir, '.vscode')\n\tconst extensionsPath = join(vscodeDir, 'extensions.json')\n\tawait mkdir(vscodeDir, { recursive: true })\n\n\tconst recommendations = ['korajs.kora-devtools']\n\tconst existing = await readJsonObject(extensionsPath)\n\tconst existingRecommendations = Array.isArray(existing?.recommendations)\n\t\t? existing.recommendations.filter((item): item is string => typeof item === 'string')\n\t\t: []\n\tconst mergedRecommendations = dedupeStrings([...existingRecommendations, ...recommendations])\n\n\tconst next = {\n\t\trecommendations: mergedRecommendations,\n\t}\n\tawait writeFile(extensionsPath, `${JSON.stringify(next, null, 2)}\\n`, 'utf-8')\n\treturn { applied: true, filePath: extensionsPath }\n}\n\n/**\n * Returns a workspace-aware target directory under the detected monorepo root.\n * This keeps generated apps in conventional package folders.\n */\nexport function resolveMonorepoTargetDirectory(monorepoRoot: string, projectName: string): string {\n\treturn join(monorepoRoot, 'packages', projectName)\n}\n\nfunction dedupeStrings(values: readonly string[]): string[] {\n\treturn Array.from(new Set(values))\n}\n\nasync function readJsonObject(path: string): Promise<Record<string, unknown> | null> {\n\ttry {\n\t\tconst content = await readFile(path, 'utf-8')\n\t\tconst parsed: unknown = JSON.parse(content)\n\t\tif (typeof parsed === 'object' && parsed !== null) {\n\t\t\treturn parsed as Record<string, unknown>\n\t\t}\n\t\treturn null\n\t} catch {\n\t\treturn null\n\t}\n}\n\nfunction isNpmWorkspaceObject(value: unknown): value is { packages: unknown } {\n\tif (typeof value !== 'object' || value === null) return false\n\tconst record = value as Record<string, unknown>\n\treturn Array.isArray(record.packages)\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n\ttry {\n\t\tawait access(path)\n\t\treturn true\n\t} catch {\n\t\treturn false\n\t}\n}\n\nasync function findNearestAncestorWithEntry(\n\tstartDir: string,\n\tentryName: string,\n): Promise<string | null> {\n\tlet current = resolve(startDir)\n\tfor (;;) {\n\t\tconst candidate = join(current, entryName)\n\t\ttry {\n\t\t\tawait stat(candidate)\n\t\t\treturn current\n\t\t} catch {\n\t\t\t// keep walking upward\n\t\t}\n\t\tconst parent = dirname(current)\n\t\tif (parent === current) {\n\t\t\treturn null\n\t\t}\n\t\tcurrent = parent\n\t}\n}\n","import type { TemplateName } from '../../types'\n\nexport type PlatformOption = 'web' | 'desktop-tauri'\nexport type FrameworkOption = 'react' | 'vue' | 'svelte' | 'solid'\nexport type AuthOption = 'none' | 'email-password' | 'oauth'\nexport type DatabaseOption = 'none' | 'sqlite' | 'postgres'\nexport type DatabaseProviderOption =\n\t| 'none'\n\t| 'local'\n\t| 'supabase'\n\t| 'neon'\n\t| 'railway'\n\t| 'vercel-postgres'\n\t| 'custom'\n\nexport interface TemplateSelectionInput {\n\tplatform: PlatformOption\n\tframework: FrameworkOption\n\ttailwind: boolean\n\tsync: boolean\n\tdb: DatabaseOption\n}\n\n/**\n * Converts high-level scaffold selections into a concrete template name.\n */\nexport function determineTemplateFromSelections(input: TemplateSelectionInput): TemplateName {\n\tif (input.platform === 'desktop-tauri') return 'tauri-react'\n\n\tconst shouldSync = input.sync && input.db !== 'none'\n\n\tif (input.framework === 'vue') {\n\t\tif (input.tailwind && shouldSync) return 'vue-tailwind-sync'\n\t\tif (input.tailwind && !shouldSync) return 'vue-tailwind'\n\t\treturn shouldSync ? 'vue-sync' : 'vue-basic'\n\t}\n\n\tif (input.framework === 'svelte') {\n\t\tif (input.tailwind && shouldSync) return 'svelte-tailwind-sync'\n\t\tif (input.tailwind && !shouldSync) return 'svelte-tailwind'\n\t\treturn shouldSync ? 'svelte-sync' : 'svelte-basic'\n\t}\n\n\tif (input.framework === 'solid') {\n\t\tthrow new Error('Solid templates are not available yet. Use react, vue, or svelte.')\n\t}\n\n\tif (input.tailwind && shouldSync) return 'react-tailwind-sync'\n\tif (input.tailwind && !shouldSync) return 'react-tailwind'\n\tif (!input.tailwind && shouldSync) return 'react-sync'\n\treturn 'react-basic'\n}\n\nexport function isPlatformValue(value: string): value is PlatformOption {\n\treturn value === 'web' || value === 'desktop-tauri'\n}\n\nexport function isFrameworkValue(value: string): value is FrameworkOption {\n\treturn value === 'react' || value === 'vue' || value === 'svelte' || value === 'solid'\n}\n\nexport function isAuthValue(value: string): value is AuthOption {\n\treturn value === 'none' || value === 'email-password' || value === 'oauth'\n}\n\nexport function isDatabaseValue(value: string): value is DatabaseOption {\n\treturn value === 'none' || value === 'sqlite' || value === 'postgres'\n}\n\nexport function isDatabaseProviderValue(value: string): value is DatabaseProviderOption {\n\treturn (\n\t\tvalue === 'none' ||\n\t\tvalue === 'local' ||\n\t\tvalue === 'supabase' ||\n\t\tvalue === 'neon' ||\n\t\tvalue === 'railway' ||\n\t\tvalue === 'vercel-postgres' ||\n\t\tvalue === 'custom'\n\t)\n}\n\nexport function isSupportedWebFramework(framework: FrameworkOption): boolean {\n\treturn framework === 'react' || framework === 'vue' || framework === 'svelte'\n}\n","import {\n\ttype CreatePreferences,\n\ttype PreferenceStore,\n\tgetCreatePreferencesOrDefault,\n\tgetDefaultCreatePreferences,\n} from '../../prompts/preferences'\nimport type { PromptClient } from '../../prompts/prompt-client'\nimport {\n\ttype AuthOption,\n\ttype DatabaseOption,\n\ttype DatabaseProviderOption,\n\ttype FrameworkOption,\n\ttype PlatformOption,\n\tdetermineTemplateFromSelections,\n\tisAuthValue,\n\tisDatabaseProviderValue,\n\tisDatabaseValue,\n\tisFrameworkValue,\n\tisPlatformValue,\n} from './options'\n\nexport interface CreateFlags {\n\tplatform?: string\n\tframework?: string\n\tauth?: string\n\tdb?: string\n\tdbProvider?: string\n\ttailwind?: boolean\n\tsync?: boolean\n\tuseDefaults: boolean\n}\n\nexport interface PreferenceResolutionResult {\n\tplatform: PlatformOption\n\tframework: FrameworkOption\n\tauth: AuthOption\n\tdb: DatabaseOption\n\tdbProvider: DatabaseProviderOption\n\ttailwind: boolean\n\tsync: boolean\n\ttemplate: ReturnType<typeof determineTemplateFromSelections>\n\tusedStoredPreferences: boolean\n}\n\n/**\n * Resolves scaffold options with precedence:\n * CLI flags > --yes defaults > stored preferences > interactive prompts.\n */\nexport async function resolveCreatePreferencesFlow(params: {\n\tflags: CreateFlags\n\tprompts: PromptClient\n\tstore: PreferenceStore\n}): Promise<PreferenceResolutionResult> {\n\tconst { flags, prompts, store } = params\n\tconst stored = store.getCreatePreferences()\n\tconst base = getCreatePreferencesOrDefault(store)\n\tconst hasExplicitFlags = hasExplicitPreferenceFlags(flags)\n\tconst canOfferStored =\n\t\t!flags.useDefaults && !hasExplicitFlags && stored !== null && promptSupportsRichOptions()\n\n\tlet effective: CreatePreferences = { ...base }\n\tlet usedStoredPreferences = false\n\n\tif (flags.useDefaults) {\n\t\teffective = getDefaultCreatePreferences()\n\t} else if (canOfferStored && stored !== null) {\n\t\tconst reuseStored = await prompts.select('Welcome back! Choose setup mode:', [\n\t\t\t{ label: formatStoredPreferenceLabel(stored), value: 'reuse' },\n\t\t\t{ label: 'Customize', value: 'customize' },\n\t\t])\n\t\tif (reuseStored === 'reuse') {\n\t\t\teffective = { ...stored }\n\t\t\tusedStoredPreferences = true\n\t\t}\n\t}\n\n\tif (flags.platform !== undefined) {\n\t\tif (!isPlatformValue(flags.platform)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid --platform value \"${flags.platform}\". Expected one of: web, desktop-tauri.`,\n\t\t\t)\n\t\t}\n\t\teffective.platform = flags.platform\n\t} else if (!flags.useDefaults && !usedStoredPreferences) {\n\t\teffective.platform = await prompts.select('Platform:', [\n\t\t\t{ label: 'Web (browser)', value: 'web' },\n\t\t\t{ label: 'Desktop (Tauri — native SQLite)', value: 'desktop-tauri' },\n\t\t])\n\t}\n\n\tconst isTauri = effective.platform === 'desktop-tauri'\n\n\tif (isTauri) {\n\t\t// Tauri currently uses React and native SQLite on the client.\n\t\t// The sync server remains configurable so the same desktop scaffold can\n\t\t// run local-only, LAN sync, or cloud sync without switching templates.\n\t\teffective.framework = 'react'\n\t\teffective.tailwind = false\n\t\teffective.auth = 'none'\n\n\t\tif (flags.sync !== undefined) {\n\t\t\teffective.sync = flags.sync\n\t\t} else if (!flags.useDefaults && !usedStoredPreferences) {\n\t\t\teffective.sync = await prompts.confirm('Enable multi-device sync?', true)\n\t\t}\n\n\t\tif (flags.db !== undefined) {\n\t\t\tif (!isDatabaseValue(flags.db)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Invalid --db value \"${flags.db}\". Expected one of: none, sqlite, postgres.`,\n\t\t\t\t)\n\t\t\t}\n\t\t\teffective.db = flags.db\n\t\t} else if (!effective.sync) {\n\t\t\teffective.db = 'none'\n\t\t} else if (!flags.useDefaults && !usedStoredPreferences) {\n\t\t\teffective.db = await prompts.select('Sync server database:', [\n\t\t\t\t{ label: 'SQLite (zero-config; local, LAN, small teams)', value: 'sqlite' },\n\t\t\t\t{ label: 'PostgreSQL (production-scale)', value: 'postgres' },\n\t\t\t])\n\t\t}\n\n\t\tif (effective.db === 'none') {\n\t\t\teffective.sync = false\n\t\t}\n\n\t\tif (effective.db !== 'postgres') {\n\t\t\teffective.dbProvider = 'none'\n\t\t} else if (flags.dbProvider !== undefined) {\n\t\t\tif (!isDatabaseProviderValue(flags.dbProvider)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Invalid --db-provider value \"${flags.dbProvider}\". Expected one of: none, local, supabase, neon, railway, vercel-postgres, custom.`,\n\t\t\t\t)\n\t\t\t}\n\t\t\teffective.dbProvider = flags.dbProvider\n\t\t} else if (!flags.useDefaults && !usedStoredPreferences) {\n\t\t\teffective.dbProvider = await prompts.select('Database provider:', [\n\t\t\t\t{ label: 'Local Postgres', value: 'local' },\n\t\t\t\t{ label: 'Supabase', value: 'supabase' },\n\t\t\t\t{ label: 'Neon', value: 'neon' },\n\t\t\t\t{ label: 'Railway', value: 'railway' },\n\t\t\t\t{ label: 'Vercel Postgres', value: 'vercel-postgres' },\n\t\t\t\t{ label: 'Custom connection string', value: 'custom' },\n\t\t\t])\n\t\t}\n\t} else {\n\t\tif (flags.framework !== undefined) {\n\t\t\tif (!isFrameworkValue(flags.framework)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Invalid --framework value \"${flags.framework}\". Expected one of: react, vue, svelte, solid.`,\n\t\t\t\t)\n\t\t\t}\n\t\t\teffective.framework = flags.framework\n\t\t} else if (!flags.useDefaults && !usedStoredPreferences) {\n\t\t\teffective.framework = await prompts.select('UI framework:', [\n\t\t\t\t{ label: 'React', value: 'react' },\n\t\t\t\t{ label: 'Vue 3', value: 'vue' },\n\t\t\t\t{ label: 'Svelte 5', value: 'svelte' },\n\t\t\t\t{ label: 'Solid (coming soon)', value: 'solid', disabled: true },\n\t\t\t])\n\t\t}\n\n\t\tif (flags.auth !== undefined) {\n\t\t\tif (!isAuthValue(flags.auth)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Invalid --auth value \"${flags.auth}\". Expected one of: none, email-password, oauth.`,\n\t\t\t\t)\n\t\t\t}\n\t\t\teffective.auth = flags.auth\n\t\t} else if (!flags.useDefaults && !usedStoredPreferences) {\n\t\t\teffective.auth = await prompts.select('Authentication:', [\n\t\t\t\t{ label: 'None', value: 'none' },\n\t\t\t\t{ label: 'Email + Password (coming soon)', value: 'email-password', disabled: true },\n\t\t\t\t{ label: 'OAuth (coming soon)', value: 'oauth', disabled: true },\n\t\t\t])\n\t\t}\n\n\t\tif (flags.tailwind !== undefined) {\n\t\t\teffective.tailwind = flags.tailwind\n\t\t} else if (!flags.useDefaults && !usedStoredPreferences) {\n\t\t\teffective.tailwind = await prompts.confirm('Use Tailwind CSS?', true)\n\t\t}\n\n\t\tif (flags.sync !== undefined) {\n\t\t\teffective.sync = flags.sync\n\t\t} else if (!flags.useDefaults && !usedStoredPreferences) {\n\t\t\teffective.sync = await prompts.confirm('Enable multi-device sync?', true)\n\t\t}\n\n\t\tif (flags.db !== undefined) {\n\t\t\tif (!isDatabaseValue(flags.db)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Invalid --db value \"${flags.db}\". Expected one of: none, sqlite, postgres.`,\n\t\t\t\t)\n\t\t\t}\n\t\t\teffective.db = flags.db\n\t\t} else if (!effective.sync) {\n\t\t\teffective.db = 'none'\n\t\t} else if (!flags.useDefaults && !usedStoredPreferences) {\n\t\t\teffective.db = await prompts.select('Server-side database:', [\n\t\t\t\t{ label: 'SQLite (zero-config)', value: 'sqlite' },\n\t\t\t\t{ label: 'PostgreSQL (production-scale)', value: 'postgres' },\n\t\t\t])\n\t\t}\n\n\t\tif (effective.db !== 'postgres') {\n\t\t\teffective.dbProvider = 'none'\n\t\t} else if (flags.dbProvider !== undefined) {\n\t\t\tif (!isDatabaseProviderValue(flags.dbProvider)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Invalid --db-provider value \"${flags.dbProvider}\". Expected one of: none, local, supabase, neon, railway, vercel-postgres, custom.`,\n\t\t\t\t)\n\t\t\t}\n\t\t\teffective.dbProvider = flags.dbProvider\n\t\t} else if (!flags.useDefaults && !usedStoredPreferences) {\n\t\t\teffective.dbProvider = await prompts.select('Database provider:', [\n\t\t\t\t{ label: 'Local Postgres', value: 'local' },\n\t\t\t\t{ label: 'Supabase', value: 'supabase' },\n\t\t\t\t{ label: 'Neon', value: 'neon' },\n\t\t\t\t{ label: 'Railway', value: 'railway' },\n\t\t\t\t{ label: 'Vercel Postgres', value: 'vercel-postgres' },\n\t\t\t\t{ label: 'Custom connection string', value: 'custom' },\n\t\t\t])\n\t\t}\n\t}\n\n\tconst template = determineTemplateFromSelections({\n\t\tplatform: effective.platform,\n\t\tframework: effective.framework,\n\t\ttailwind: effective.tailwind,\n\t\tsync: effective.sync,\n\t\tdb: effective.db,\n\t})\n\n\treturn {\n\t\tplatform: effective.platform,\n\t\tframework: effective.framework,\n\t\tauth: effective.auth,\n\t\tdb: effective.db,\n\t\tdbProvider: effective.dbProvider,\n\t\ttailwind: effective.tailwind,\n\t\tsync: effective.sync,\n\t\ttemplate,\n\t\tusedStoredPreferences,\n\t}\n}\n\nexport function shouldSavePreferences(flags: CreateFlags): boolean {\n\treturn !flags.useDefaults\n}\n\nexport function saveResolvedPreferences(\n\tstore: PreferenceStore,\n\tresolution: Omit<PreferenceResolutionResult, 'template' | 'usedStoredPreferences'> & {\n\t\tpackageManager: CreatePreferences['packageManager']\n\t},\n): void {\n\tstore.saveCreatePreferences({\n\t\tplatform: resolution.platform,\n\t\tframework: resolution.framework,\n\t\ttailwind: resolution.tailwind,\n\t\tsync: resolution.sync,\n\t\tdb: resolution.db,\n\t\tdbProvider: resolution.dbProvider,\n\t\tauth: resolution.auth,\n\t\tpackageManager: resolution.packageManager,\n\t})\n}\n\nfunction hasExplicitPreferenceFlags(flags: CreateFlags): boolean {\n\treturn (\n\t\tflags.platform !== undefined ||\n\t\tflags.framework !== undefined ||\n\t\tflags.auth !== undefined ||\n\t\tflags.db !== undefined ||\n\t\tflags.dbProvider !== undefined ||\n\t\tflags.tailwind !== undefined ||\n\t\tflags.sync !== undefined\n\t)\n}\n\nfunction promptSupportsRichOptions(): boolean {\n\treturn typeof process !== 'undefined' && process.stdin.isTTY && process.stdout.isTTY\n}\n\nfunction formatStoredPreferenceLabel(preferences: CreatePreferences): string {\n\tif (preferences.platform === 'desktop-tauri') {\n\t\treturn `Use previous settings (tauri-desktop + ${preferences.packageManager})`\n\t}\n\tconst syncLabel = preferences.sync ? `sync/${preferences.db}` : 'local-only'\n\tconst styleLabel = preferences.tailwind ? 'tailwind' : 'css'\n\treturn `Use previous settings (${preferences.framework} + ${styleLabel} + ${syncLabel} + ${preferences.packageManager})`\n}\n","import validateNpmPackageName from 'validate-npm-package-name'\n\nexport interface ProjectNameValidationResult {\n\tvalid: boolean\n\tissues: readonly string[]\n}\n\n/**\n * Validates a project name for scaffolded package creation.\n *\n * The create command uses this validation before writing files so users get a\n * clear, early error if the name cannot be used as an npm package name.\n */\nexport function validateProjectName(name: string): ProjectNameValidationResult {\n\tconst trimmedName = name.trim()\n\tif (trimmedName.length === 0) {\n\t\treturn {\n\t\t\tvalid: false,\n\t\t\tissues: ['Project name cannot be empty.'],\n\t\t}\n\t}\n\n\tconst validation = validateNpmPackageName(trimmedName)\n\tconst issues = [...(validation.errors ?? []), ...(validation.warnings ?? [])]\n\tif (!validation.validForNewPackages && issues.length === 0) {\n\t\treturn {\n\t\t\tvalid: false,\n\t\t\tissues: ['Project name is not a valid npm package name.'],\n\t\t}\n\t}\n\n\treturn {\n\t\tvalid: validation.validForNewPackages,\n\t\tissues,\n\t}\n}\n","import { readFile, writeFile } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport type { TemplateName } from '../../types'\nimport type { DatabaseOption, DatabaseProviderOption } from './options'\n\ninterface SyncProviderPresetOptions {\n\ttargetDir: string\n\ttemplate: TemplateName\n\tdb: DatabaseOption\n\tdbProvider: DatabaseProviderOption\n}\n\n/**\n * Applies provider-specific sync scaffolding adjustments after template copy.\n *\n * The sync server template is environment-driven: SQLite is used when\n * DATABASE_URL is absent, and PostgreSQL is used when DATABASE_URL is present.\n * Provider presets only add provider-specific guidance.\n */\nexport async function applySyncProviderPreset(options: SyncProviderPresetOptions): Promise<void> {\n\tif (!isSyncTemplate(options.template)) {\n\t\treturn\n\t}\n\tif (options.db !== 'postgres') {\n\t\treturn\n\t}\n\n\tconst providerName = getProviderDisplayName(options.dbProvider)\n\tconst providerConnectionString = getProviderConnectionStringExample(options.dbProvider)\n\tconst envPath = join(options.targetDir, '.env.example')\n\tconst readmePath = join(options.targetDir, 'README.md')\n\n\tconst existingReadme = await readFile(readmePath, 'utf-8')\n\tconst existingEnv = await readFile(envPath, 'utf-8')\n\tconst trimmedReadme = existingReadme.trimEnd()\n\tconst trimmedEnv = existingEnv.trimEnd()\n\tconst envSuffix = [\n\t\t'',\n\t\t`# PostgreSQL provider preset: ${providerName}`,\n\t\t`# Example: ${providerConnectionString}`,\n\t].join('\\n')\n\tconst readmeSuffix = [\n\t\t'',\n\t\t'## PostgreSQL Provider Preset',\n\t\t'',\n\t\t`Selected DB provider: ${options.dbProvider}`,\n\t\t'',\n\t\t'This scaffold keeps one sync server entrypoint. When `DATABASE_URL` is set, `server.ts` uses PostgreSQL. When it is empty, the same server uses SQLite at `KORA_SERVER_DB`.',\n\t\t'',\n\t\t'The generated server uses `createPostgresServerStore` automatically when `DATABASE_URL` is present.',\n\t\t'',\n\t].join('\\n')\n\tconst readmeTemplate = `${trimmedReadme}${readmeSuffix}`\n\n\tawait writeFile(envPath, `${trimmedEnv}${envSuffix}\\n`, 'utf-8')\n\tawait writeFile(readmePath, readmeTemplate, 'utf-8')\n}\n\nfunction isSyncTemplate(template: TemplateName): boolean {\n\treturn (\n\t\ttemplate === 'react-sync' ||\n\t\ttemplate === 'react-tailwind-sync' ||\n\t\ttemplate === 'vue-sync' ||\n\t\ttemplate === 'vue-tailwind-sync' ||\n\t\ttemplate === 'svelte-sync' ||\n\t\ttemplate === 'svelte-tailwind-sync' ||\n\t\ttemplate === 'tauri-react'\n\t)\n}\n\nfunction getProviderDisplayName(provider: DatabaseProviderOption): string {\n\tswitch (provider) {\n\t\tcase 'supabase':\n\t\t\treturn 'Supabase'\n\t\tcase 'neon':\n\t\t\treturn 'Neon'\n\t\tcase 'railway':\n\t\t\treturn 'Railway'\n\t\tcase 'vercel-postgres':\n\t\t\treturn 'Vercel Postgres'\n\t\tcase 'custom':\n\t\t\treturn 'Custom'\n\t\tcase 'local':\n\t\t\treturn 'Local Postgres'\n\t\tcase 'none':\n\t\t\treturn 'PostgreSQL'\n\t}\n}\n\nfunction getProviderConnectionStringExample(provider: DatabaseProviderOption): string {\n\tswitch (provider) {\n\t\tcase 'supabase':\n\t\t\treturn 'postgresql://postgres:<password>@db.<project-ref>.supabase.co:5432/postgres?sslmode=require'\n\t\tcase 'neon':\n\t\t\treturn 'postgresql://<user>:<password>@<branch>.<project>.neon.tech/neondb?sslmode=require'\n\t\tcase 'railway':\n\t\t\treturn 'postgresql://postgres:<password>@<host>.railway.app:<port>/railway?sslmode=require'\n\t\tcase 'vercel-postgres':\n\t\t\treturn 'postgresql://<user>:<password>@<host>.pooler.vercel-storage.com:5432/verceldb?sslmode=require'\n\t\tcase 'custom':\n\t\t\treturn 'postgresql://<user>:<password>@<host>:5432/<database>'\n\t\tcase 'local':\n\t\t\treturn 'postgresql://postgres:postgres@localhost:5432/kora'\n\t\tcase 'none':\n\t\t\treturn 'postgresql://postgres:postgres@localhost:5432/kora'\n\t}\n}\n","import { existsSync } from 'node:fs'\nimport { copyFile, mkdir, readFile, readdir, stat, writeFile } from 'node:fs/promises'\nimport { dirname, join, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport type { TemplateContext, TemplateName } from '../types'\n\nexport type TemplateLayerCategory = 'base' | 'ui' | 'style' | 'sync' | 'db' | 'auth'\n\nexport interface TemplateLayer {\n\tcategory: TemplateLayerCategory\n\tname: string\n\tsourceTemplate: TemplateName | null\n}\n\nexport interface TemplateLayerPlan {\n\tlayers: readonly TemplateLayer[]\n\tcompatibilityTarget: TemplateName\n}\n\n/**\n * Replaces {{variable}} placeholders in a template string with context values.\n *\n * @param template - The template string containing {{variable}} placeholders\n * @param context - Key-value pairs to substitute\n * @returns The template with all placeholders replaced\n */\nexport function substituteVariables(template: string, context: Record<string, string>): string {\n\treturn template.replace(/\\{\\{(\\w+)\\}\\}/g, (_match, key: string) => {\n\t\tconst value = context[key]\n\t\treturn value !== undefined ? value : `{{${key}}}`\n\t})\n}\n\n/**\n * Resolves the absolute path to a bundled template directory.\n *\n * After tsup bundling, import.meta.url points to dist/<file>.js (1 level from root).\n * In source, it's src/templates/composer.ts (2 levels from root).\n * We walk up from the current file to find the package root containing templates/.\n *\n * @param templateName - Name of the template (for example, 'react-basic')\n * @returns Absolute path to the template directory\n */\nexport function getTemplatePath(templateName: TemplateName): string {\n\tlet dir = dirname(fileURLToPath(import.meta.url))\n\tfor (let i = 0; i < 7; i++) {\n\t\tconst candidate = resolve(dir, 'templates', templateName)\n\t\tif (existsSync(candidate)) {\n\t\t\treturn candidate\n\t\t}\n\t\tdir = dirname(dir)\n\t}\n\t// Fallback: assume bundled output and step to package root.\n\tconst currentDir = dirname(fileURLToPath(import.meta.url))\n\treturn resolve(currentDir, '..', '..', '..', 'templates', templateName)\n}\n\n/**\n * Returns a v1 compatibility layer plan that composes to one of the existing\n * four concrete templates. This establishes the layer architecture while\n * preserving byte-for-byte output compatibility for current templates.\n */\nexport function createCompatibilityLayerPlan(templateName: TemplateName): TemplateLayerPlan {\n\tconst baseLayer: TemplateLayer = { category: 'base', name: 'base', sourceTemplate: 'react-basic' }\n\tconst uiLayer: TemplateLayer = { category: 'ui', name: 'react', sourceTemplate: null }\n\tconst authLayer: TemplateLayer = { category: 'auth', name: 'none', sourceTemplate: null }\n\n\tswitch (templateName) {\n\t\tcase 'react-basic':\n\t\t\treturn {\n\t\t\t\tcompatibilityTarget: templateName,\n\t\t\t\tlayers: [\n\t\t\t\t\tbaseLayer,\n\t\t\t\t\tuiLayer,\n\t\t\t\t\t{ category: 'style', name: 'plain', sourceTemplate: null },\n\t\t\t\t\t{ category: 'sync', name: 'disabled', sourceTemplate: null },\n\t\t\t\t\t{ category: 'db', name: 'none', sourceTemplate: null },\n\t\t\t\t\tauthLayer,\n\t\t\t\t],\n\t\t\t}\n\t\tcase 'react-tailwind':\n\t\t\treturn {\n\t\t\t\tcompatibilityTarget: templateName,\n\t\t\t\tlayers: [\n\t\t\t\t\tbaseLayer,\n\t\t\t\t\tuiLayer,\n\t\t\t\t\t{ category: 'style', name: 'tailwind', sourceTemplate: 'react-tailwind' },\n\t\t\t\t\t{ category: 'sync', name: 'disabled', sourceTemplate: null },\n\t\t\t\t\t{ category: 'db', name: 'none', sourceTemplate: null },\n\t\t\t\t\tauthLayer,\n\t\t\t\t],\n\t\t\t}\n\t\tcase 'react-sync':\n\t\t\treturn {\n\t\t\t\tcompatibilityTarget: templateName,\n\t\t\t\tlayers: [\n\t\t\t\t\tbaseLayer,\n\t\t\t\t\tuiLayer,\n\t\t\t\t\t{ category: 'style', name: 'plain', sourceTemplate: null },\n\t\t\t\t\t{ category: 'sync', name: 'enabled', sourceTemplate: 'react-sync' },\n\t\t\t\t\t{ category: 'db', name: 'sqlite', sourceTemplate: null },\n\t\t\t\t\tauthLayer,\n\t\t\t\t],\n\t\t\t}\n\t\tcase 'react-tailwind-sync':\n\t\t\treturn {\n\t\t\t\tcompatibilityTarget: templateName,\n\t\t\t\tlayers: [\n\t\t\t\t\tbaseLayer,\n\t\t\t\t\tuiLayer,\n\t\t\t\t\t{ category: 'style', name: 'tailwind', sourceTemplate: 'react-tailwind' },\n\t\t\t\t\t{ category: 'sync', name: 'enabled', sourceTemplate: 'react-tailwind-sync' },\n\t\t\t\t\t{ category: 'db', name: 'sqlite', sourceTemplate: null },\n\t\t\t\t\tauthLayer,\n\t\t\t\t],\n\t\t\t}\n\t\tcase 'tauri-react':\n\t\t\treturn {\n\t\t\t\tcompatibilityTarget: templateName,\n\t\t\t\tlayers: [\n\t\t\t\t\t{ category: 'base', name: 'tauri', sourceTemplate: 'tauri-react' },\n\t\t\t\t\tuiLayer,\n\t\t\t\t\t{ category: 'style', name: 'plain', sourceTemplate: null },\n\t\t\t\t\t{ category: 'sync', name: 'enabled', sourceTemplate: null },\n\t\t\t\t\t{ category: 'db', name: 'tauri-sqlite', sourceTemplate: null },\n\t\t\t\t\tauthLayer,\n\t\t\t\t],\n\t\t\t}\n\t\tcase 'vue-sync':\n\t\t\treturn {\n\t\t\t\tcompatibilityTarget: templateName,\n\t\t\t\tlayers: [{ category: 'base', name: 'vue-sync', sourceTemplate: 'vue-sync' }],\n\t\t\t}\n\t\tcase 'vue-basic':\n\t\t\treturn {\n\t\t\t\tcompatibilityTarget: templateName,\n\t\t\t\tlayers: [{ category: 'base', name: 'vue-basic', sourceTemplate: 'vue-basic' }],\n\t\t\t}\n\t\tcase 'svelte-sync':\n\t\t\treturn {\n\t\t\t\tcompatibilityTarget: templateName,\n\t\t\t\tlayers: [{ category: 'base', name: 'svelte-sync', sourceTemplate: 'svelte-sync' }],\n\t\t\t}\n\t\tcase 'svelte-basic':\n\t\t\treturn {\n\t\t\t\tcompatibilityTarget: templateName,\n\t\t\t\tlayers: [{ category: 'base', name: 'svelte-basic', sourceTemplate: 'svelte-basic' }],\n\t\t\t}\n\t\tcase 'vue-tailwind-sync':\n\t\t\treturn {\n\t\t\t\tcompatibilityTarget: templateName,\n\t\t\t\tlayers: [\n\t\t\t\t\t{ category: 'base', name: 'vue-tailwind-sync', sourceTemplate: 'vue-tailwind-sync' },\n\t\t\t\t],\n\t\t\t}\n\t\tcase 'vue-tailwind':\n\t\t\treturn {\n\t\t\t\tcompatibilityTarget: templateName,\n\t\t\t\tlayers: [{ category: 'base', name: 'vue-tailwind', sourceTemplate: 'vue-tailwind' }],\n\t\t\t}\n\t\tcase 'svelte-tailwind-sync':\n\t\t\treturn {\n\t\t\t\tcompatibilityTarget: templateName,\n\t\t\t\tlayers: [\n\t\t\t\t\t{\n\t\t\t\t\t\tcategory: 'base',\n\t\t\t\t\t\tname: 'svelte-tailwind-sync',\n\t\t\t\t\t\tsourceTemplate: 'svelte-tailwind-sync',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t}\n\t\tcase 'svelte-tailwind':\n\t\t\treturn {\n\t\t\t\tcompatibilityTarget: templateName,\n\t\t\t\tlayers: [{ category: 'base', name: 'svelte-tailwind', sourceTemplate: 'svelte-tailwind' }],\n\t\t\t}\n\t}\n}\n\n/**\n * Composes a project by applying template layers in order. Later layers\n * overwrite earlier files, which allows progressive specialization.\n *\n * @param plan - Layer plan describing the composition\n * @param targetDir - Destination directory (must not exist yet)\n * @param context - Variables for template substitution\n */\nexport async function composeTemplateLayers(\n\tplan: TemplateLayerPlan,\n\ttargetDir: string,\n\tcontext: TemplateContext,\n): Promise<void> {\n\tconst vars: Record<string, string> = {\n\t\tprojectName: context.projectName,\n\t\tpackageManager: context.packageManager,\n\t\tkoraVersion: context.koraVersion,\n\t\tdbProvider: context.dbProvider ?? 'none',\n\t}\n\n\tfor (const layer of plan.layers) {\n\t\tif (layer.sourceTemplate === null) {\n\t\t\tcontinue\n\t\t}\n\t\tconst sourceDir = getTemplatePath(layer.sourceTemplate)\n\t\tawait copyDirectory(sourceDir, targetDir, vars)\n\t}\n}\n\nasync function copyDirectory(\n\tsrc: string,\n\tdest: string,\n\tvars: Record<string, string>,\n): Promise<void> {\n\tawait mkdir(dest, { recursive: true })\n\tconst entries = await readdir(src)\n\n\tfor (const entry of entries) {\n\t\tconst srcPath = join(src, entry)\n\t\tconst srcStat = await stat(srcPath)\n\n\t\tif (srcStat.isDirectory()) {\n\t\t\tawait copyDirectory(srcPath, join(dest, entry), vars)\n\t\t\tcontinue\n\t\t}\n\t\tif (entry.endsWith('.hbs')) {\n\t\t\tconst content = await readFile(srcPath, 'utf-8')\n\t\t\tconst outputName = entry.slice(0, -4)\n\t\t\tawait writeFile(join(dest, outputName), substituteVariables(content, vars), 'utf-8')\n\t\t\tcontinue\n\t\t}\n\t\tawait copyFile(srcPath, join(dest, entry))\n\t}\n}\n","import { composeTemplateLayers, createCompatibilityLayerPlan } from '../../templates/composer'\nimport type { TemplateContext, TemplateName } from '../../types'\n\n/**\n * Replaces {{variable}} placeholders in a template string with context values.\n *\n * @param template - The template string containing {{variable}} placeholders\n * @param context - Key-value pairs to substitute\n * @returns The template with all placeholders replaced\n */\nexport { substituteVariables, getTemplatePath } from '../../templates/composer'\n\n/**\n * Scaffolds a project from a bundled template.\n * Copies all files from the template directory to the target, applying\n * variable substitution to .hbs files and stripping the .hbs extension.\n *\n * @param templateName - Which template to use\n * @param targetDir - Destination directory (must not exist yet)\n * @param context - Variables for template substitution\n */\nexport async function scaffoldTemplate(\n\ttemplateName: TemplateName,\n\ttargetDir: string,\n\tcontext: TemplateContext,\n): Promise<void> {\n\tconst plan = createCompatibilityLayerPlan(templateName)\n\tawait composeTemplateLayers(plan, targetDir, context)\n}\n","import { existsSync } from 'node:fs'\nimport { basename, join } from 'node:path'\nimport { defineCommand } from 'citty'\nimport { InvalidProjectError } from '../../errors'\nimport { createPromptClient } from '../../prompts/prompt-client'\nimport { findProjectRoot } from '../../utils/fs-helpers'\nimport { createLogger } from '../../utils/logger'\nimport {\n\ttype ContextAwareDeployAdapter,\n\tDEPLOY_PLATFORMS,\n\ttype DeployAdapter,\n\ttype DeployPlatform,\n\ttype ProjectConfig,\n\tisDeployPlatform,\n} from './adapters/adapter'\nimport { createDeployAdapter } from './adapters/factory'\nimport {\n\twriteDockerIgnoreArtifact,\n\twriteDockerfileArtifact,\n} from './artifacts/dockerfile-generator'\nimport {\n\treadDeployState,\n\tresetDeployState,\n\tresolveDeployDirectory,\n\tupdateDeployState,\n\twriteDeployState,\n} from './state/deploy-state'\n\n/**\n * The `deploy` command for Phase 13.\n *\n * This command orchestrates:\n * - deploy state resolution and persistence\n * - artifact generation\n * - adapter-driven provision/build/deploy flows\n */\nexport const deployCommand = defineCommand({\n\tmeta: {\n\t\tname: 'deploy',\n\t\tdescription: 'Deploy a Kora project to your selected platform',\n\t},\n\targs: {\n\t\tplatform: {\n\t\t\ttype: 'string',\n\t\t\tdescription: `Deployment platform (${DEPLOY_PLATFORMS.join(', ')})`,\n\t\t},\n\t\tapp: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Application name used by the target platform',\n\t\t},\n\t\tregion: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Preferred deployment region (for example: iad, lhr, syd)',\n\t\t},\n\t\tprod: {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Deploy to production environment',\n\t\t\tdefault: false,\n\t\t},\n\t\tconfirm: {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Non-interactive mode (fail fast on missing required data)',\n\t\t\tdefault: false,\n\t\t},\n\t\treset: {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Delete .kora/deploy state and generated artifacts',\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tsubCommands: {\n\t\tstatus: defineCommand({\n\t\t\tmeta: {\n\t\t\t\tname: 'status',\n\t\t\t\tdescription: 'Show current deployment status',\n\t\t\t},\n\t\t\tasync run() {\n\t\t\t\tconst logger = createLogger()\n\t\t\t\tconst projectRoot = await requireProjectRoot()\n\t\t\t\tconst state = await readDeployState(projectRoot)\n\t\t\t\tif (!state) {\n\t\t\t\t\tlogger.warn('No deployment state found. Run `kora deploy` first.')\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tlogger.banner()\n\t\t\t\tlogger.info(`Platform: ${state.platform}`)\n\t\t\t\tlogger.step(`App: ${state.appName}`)\n\t\t\t\tlogger.step(`Region: ${state.region ?? 'n/a'}`)\n\t\t\t\tlogger.step(`Last deployment: ${state.lastDeploymentId ?? 'n/a'}`)\n\n\t\t\t\tconst adapter = createDeployAdapter(state.platform)\n\t\t\t\tconfigureAdapterContext(adapter, {\n\t\t\t\t\tprojectRoot,\n\t\t\t\t\tappName: state.appName,\n\t\t\t\t\tregion: state.region,\n\t\t\t\t})\n\t\t\t\tconst adapterStatus = await adapter.status()\n\t\t\t\tlogger.step(`Status: ${adapterStatus.state}`)\n\t\t\t\tlogger.step(`Message: ${adapterStatus.message}`)\n\t\t\t\tlogger.step(`Live URL: ${adapterStatus.liveUrl ?? state.liveUrl ?? 'n/a'}`)\n\t\t\t\tlogger.step(`Sync URL: ${state.syncUrl ?? 'n/a'}`)\n\t\t\t},\n\t\t}),\n\t\trollback: defineCommand({\n\t\t\tmeta: {\n\t\t\t\tname: 'rollback',\n\t\t\t\tdescription: 'Rollback the current deployment',\n\t\t\t},\n\t\t\targs: {\n\t\t\t\tid: {\n\t\t\t\t\ttype: 'positional',\n\t\t\t\t\tdescription: 'Optional deployment identifier',\n\t\t\t\t\trequired: false,\n\t\t\t\t},\n\t\t\t},\n\t\t\tasync run({ args }) {\n\t\t\t\tconst logger = createLogger()\n\t\t\t\tconst projectRoot = await requireProjectRoot()\n\t\t\t\tconst state = await readDeployState(projectRoot)\n\t\t\t\tif (!state) {\n\t\t\t\t\tlogger.warn('No deployment state found. Run `kora deploy` first.')\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tconst adapter = createDeployAdapter(state.platform)\n\t\t\t\tconfigureAdapterContext(adapter, {\n\t\t\t\t\tprojectRoot,\n\t\t\t\t\tappName: state.appName,\n\t\t\t\t\tregion: state.region,\n\t\t\t\t})\n\t\t\t\tconst deploymentId =\n\t\t\t\t\ttypeof args.id === 'string' && args.id.length > 0\n\t\t\t\t\t\t? args.id\n\t\t\t\t\t\t: (state.lastDeploymentId ?? 'latest')\n\t\t\t\tawait adapter.rollback(deploymentId)\n\t\t\t\tlogger.success(`Rolled back ${state.platform} deployment to ${deploymentId}.`)\n\t\t\t},\n\t\t}),\n\t\tlogs: defineCommand({\n\t\t\tmeta: {\n\t\t\t\tname: 'logs',\n\t\t\t\tdescription: 'Read deployment logs',\n\t\t\t},\n\t\t\tasync run() {\n\t\t\t\tconst logger = createLogger()\n\t\t\t\tconst projectRoot = await requireProjectRoot()\n\t\t\t\tconst state = await readDeployState(projectRoot)\n\t\t\t\tif (!state) {\n\t\t\t\t\tlogger.warn('No deployment state found. Run `kora deploy` first.')\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tconst adapter = createDeployAdapter(state.platform)\n\t\t\t\tconfigureAdapterContext(adapter, {\n\t\t\t\t\tprojectRoot,\n\t\t\t\t\tappName: state.appName,\n\t\t\t\t\tregion: state.region,\n\t\t\t\t})\n\t\t\t\tconst logLines = adapter.logs({ tail: 200 })\n\t\t\t\tlet hasLines = false\n\t\t\t\tfor await (const line of logLines) {\n\t\t\t\t\thasLines = true\n\t\t\t\t\tlogger.step(`[${line.level}] ${line.message}`)\n\t\t\t\t}\n\t\t\t\tif (!hasLines) {\n\t\t\t\t\tlogger.warn(`No logs returned from ${state.platform}.`)\n\t\t\t\t}\n\t\t\t},\n\t\t}),\n\t},\n\tasync run({ args, rawArgs }) {\n\t\t// Citty calls run() even after subcommand execution.\n\t\t// Guard against double-execution when a subcommand was invoked.\n\t\tconst subCommandNames = ['status', 'rollback', 'logs']\n\t\tif (rawArgs.some((arg) => subCommandNames.includes(arg))) {\n\t\t\treturn\n\t\t}\n\n\t\tconst logger = createLogger()\n\t\tconst prompts = createPromptClient()\n\t\tconst projectRoot = await requireProjectRoot()\n\n\t\tif (args.reset === true) {\n\t\t\tawait resetDeployState(projectRoot)\n\t\t\tlogger.success('Reset .kora/deploy state.')\n\t\t\treturn\n\t\t}\n\n\t\tconst existingState = await readDeployState(projectRoot)\n\t\tconst confirmMode = args.confirm === true\n\t\tconst platform = await resolvePlatform({\n\t\t\tpromptClient: prompts,\n\t\t\tplatformArg: args.platform,\n\t\t\tstoredPlatform: existingState?.platform,\n\t\t\tconfirm: confirmMode,\n\t\t})\n\t\tconst appName = resolveAppName(args.app, existingState?.appName, projectRoot, confirmMode)\n\t\tconst region = resolveRegion(args.region, existingState?.region, confirmMode)\n\t\tconst deployDirectory = resolveDeployDirectory(projectRoot)\n\t\tconst environment = args.prod === true ? 'production' : 'preview'\n\t\tconst deployTarget = detectDeployTarget(projectRoot)\n\t\tconst config: ProjectConfig = {\n\t\t\tprojectRoot,\n\t\t\tappName,\n\t\t\tregion,\n\t\t\tenvironment,\n\t\t\tconfirm: confirmMode,\n\t\t\tdeployTarget,\n\t\t}\n\t\tconst adapter = createDeployAdapter(platform)\n\t\tconfigureAdapterContext(adapter, {\n\t\t\tprojectRoot,\n\t\t\tappName,\n\t\t\tregion,\n\t\t})\n\n\t\tlogger.banner()\n\t\tlogger.info(\n\t\t\t`Deploying to ${platform} (${appName}${region ? `, ${region}` : ''}, ${environment})`,\n\t\t)\n\t\tif (deployTarget === 'sync-server') {\n\t\t\tlogger.step('Detected Tauri project. Deploying the sync server only.')\n\t\t}\n\t\tif (confirmMode) {\n\t\t\tlogger.step('Running in --confirm mode (non-interactive, fail-fast).')\n\t\t}\n\n\t\tawait writeDockerfileArtifact(deployDirectory, {\n\t\t\tclientDirectory: deployTarget === 'sync-server' ? null : undefined,\n\t\t\tnativeDependencies: {\n\t\t\t\t'better-sqlite3': '^11.0.0',\n\t\t\t\t'drizzle-orm': '^0.45.2',\n\t\t\t\tpostgres: '^3.4.0',\n\t\t\t},\n\t\t})\n\t\tawait writeDockerIgnoreArtifact(deployDirectory)\n\t\tconst detected = await adapter.detect()\n\t\tif (!detected) {\n\t\t\tawait adapter.install()\n\t\t}\n\t\tawait adapter.authenticate()\n\t\tconst provisionResult = await adapter.provision(config)\n\t\tconst artifacts = await adapter.build(config)\n\t\tconst deployResult = await adapter.deploy(artifacts)\n\n\t\tif (existingState) {\n\t\t\tawait updateDeployState(projectRoot, {\n\t\t\t\tplatform,\n\t\t\t\tappName,\n\t\t\t\tregion,\n\t\t\t\tprojectRoot,\n\t\t\t\tliveUrl: deployResult.liveUrl,\n\t\t\t\tsyncUrl: deployResult.syncUrl,\n\t\t\t\tdatabaseId: provisionResult.databaseId,\n\t\t\t\tlastDeploymentId: deployResult.deploymentId,\n\t\t\t})\n\t\t} else {\n\t\t\tawait writeDeployState(projectRoot, {\n\t\t\t\tplatform,\n\t\t\t\tappName,\n\t\t\t\tregion,\n\t\t\t\tprojectRoot,\n\t\t\t\tliveUrl: deployResult.liveUrl,\n\t\t\t\tsyncUrl: deployResult.syncUrl,\n\t\t\t\tdatabaseId: provisionResult.databaseId,\n\t\t\t\tlastDeploymentId: deployResult.deploymentId,\n\t\t\t})\n\t\t}\n\n\t\tlogger.success(`Deployment completed: ${deployResult.liveUrl}`)\n\t\tif (deployResult.syncUrl) {\n\t\t\tlogger.step(`Sync endpoint: ${deployResult.syncUrl}`)\n\t\t}\n\t},\n})\n\ninterface ResolvePlatformOptions {\n\tpromptClient: ReturnType<typeof createPromptClient>\n\tplatformArg: unknown\n\tstoredPlatform: DeployPlatform | undefined\n\tconfirm: boolean\n}\n\nasync function resolvePlatform(options: ResolvePlatformOptions): Promise<DeployPlatform> {\n\tif (typeof options.platformArg === 'string') {\n\t\tif (!isDeployPlatform(options.platformArg)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid --platform value \"${options.platformArg}\". Valid options: ${DEPLOY_PLATFORMS.join(', ')}`,\n\t\t\t)\n\t\t}\n\t\treturn options.platformArg\n\t}\n\n\tif (options.storedPlatform) {\n\t\treturn options.storedPlatform\n\t}\n\n\tif (options.confirm || !isInteractiveTerminal()) {\n\t\tthrow new Error(\n\t\t\t'Missing deploy platform in --confirm mode. Provide --platform or run an interactive deploy first.',\n\t\t)\n\t}\n\n\treturn await options.promptClient.select('Where do you want to deploy?', [\n\t\t{\n\t\t\tlabel: 'Fly.io (recommended for sync apps)',\n\t\t\tvalue: 'fly',\n\t\t},\n\t\t{\n\t\t\tlabel: 'Railway',\n\t\t\tvalue: 'railway',\n\t\t},\n\t\t{\n\t\t\tlabel: 'AWS ECS Fargate (production multi-instance)',\n\t\t\tvalue: 'aws-ecs',\n\t\t},\n\t\t{\n\t\t\tlabel: 'AWS Lightsail Containers (simple, cost-effective)',\n\t\t\tvalue: 'aws-lightsail',\n\t\t},\n\t\t{\n\t\t\tlabel: 'Render',\n\t\t\tvalue: 'render',\n\t\t},\n\t\t{\n\t\t\tlabel: 'Docker (self-hosted)',\n\t\t\tvalue: 'docker',\n\t\t},\n\t\t{\n\t\t\tlabel: 'Kora Cloud (coming soon)',\n\t\t\tvalue: 'kora-cloud',\n\t\t},\n\t])\n}\n\nfunction resolveAppName(\n\targValue: unknown,\n\tstoredValue: string | undefined,\n\tprojectRoot: string,\n\tconfirm: boolean,\n): string {\n\tif (typeof argValue === 'string' && argValue.length > 0) {\n\t\treturn sanitizeAppName(argValue)\n\t}\n\n\tif (storedValue && storedValue.length > 0) {\n\t\treturn storedValue\n\t}\n\n\tif (confirm) {\n\t\tthrow new Error(\n\t\t\t'Missing app name in --confirm mode. Provide --app or run an interactive deploy first.',\n\t\t)\n\t}\n\n\treturn sanitizeAppName(basename(projectRoot))\n}\n\nfunction resolveRegion(\n\targValue: unknown,\n\tstoredValue: string | null | undefined,\n\tconfirm: boolean,\n): string | null {\n\tif (typeof argValue === 'string' && argValue.length > 0) return argValue\n\tif (storedValue !== undefined) return storedValue\n\tif (confirm) {\n\t\tthrow new Error(\n\t\t\t'Missing region in --confirm mode. Provide --region or run an interactive deploy first.',\n\t\t)\n\t}\n\treturn 'iad'\n}\n\nfunction sanitizeAppName(value: string): string {\n\tconst normalized = value\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9-]+/g, '-')\n\t\t.replace(/-{2,}/g, '-')\n\t\t.replace(/^-|-$/g, '')\n\n\tif (normalized.length === 0) {\n\t\treturn 'kora-app'\n\t}\n\treturn normalized\n}\n\nasync function requireProjectRoot(): Promise<string> {\n\tconst projectRoot = await findProjectRoot()\n\tif (!projectRoot) {\n\t\tthrow new InvalidProjectError(process.cwd())\n\t}\n\treturn projectRoot\n}\n\nfunction isInteractiveTerminal(): boolean {\n\treturn process.stdin.isTTY === true && process.stdout.isTTY === true\n}\n\nfunction configureAdapterContext(\n\tadapter: DeployAdapter,\n\tcontext: { projectRoot: string; appName: string; region: string | null },\n): void {\n\tif (hasContextSetter(adapter)) {\n\t\tadapter.setContext(context)\n\t}\n}\n\nfunction detectDeployTarget(projectRoot: string): ProjectConfig['deployTarget'] {\n\treturn existsSync(join(projectRoot, 'src-tauri')) ? 'sync-server' : 'full-stack'\n}\n\nfunction hasContextSetter(adapter: DeployAdapter): adapter is ContextAwareDeployAdapter {\n\treturn typeof (adapter as ContextAwareDeployAdapter).setContext === 'function'\n}\n","export const DEPLOY_PLATFORMS = [\n\t'fly',\n\t'railway',\n\t'aws-ecs',\n\t'aws-lightsail',\n\t'render',\n\t'docker',\n\t'kora-cloud',\n] as const\n\nexport type DeployPlatform = (typeof DEPLOY_PLATFORMS)[number]\n\nexport interface ProjectConfig {\n\tprojectRoot: string\n\tappName: string\n\tregion: string | null\n\tenvironment: 'preview' | 'production'\n\tconfirm: boolean\n\tdeployTarget?: 'full-stack' | 'sync-server'\n}\n\nexport interface ProvisionResult {\n\tapplicationId: string\n\tdatabaseId: string | null\n\tsecretsSet: string[]\n}\n\nexport interface BuildArtifacts {\n\tclientDirectory: string | null\n\tserverBundlePath: string | null\n\tdeployDirectory: string\n}\n\nexport interface DeployResult {\n\tdeploymentId: string\n\tliveUrl: string\n\tsyncUrl: string | null\n}\n\nexport interface LogOptions {\n\tsince?: string\n\ttail?: number\n}\n\nexport interface LogLine {\n\ttimestamp: string\n\tlevel: 'debug' | 'info' | 'warn' | 'error'\n\tmessage: string\n}\n\nexport interface DeploymentStatus {\n\tstate: 'pending' | 'healthy' | 'failed' | 'unknown'\n\tmessage: string\n\tliveUrl?: string\n}\n\n/**\n * Contract implemented by each deployment platform integration.\n */\nexport interface DeployAdapter {\n\tname: DeployPlatform\n\tdetect(): Promise<boolean>\n\tinstall(): Promise<void>\n\tauthenticate(): Promise<void>\n\tprovision(config: ProjectConfig): Promise<ProvisionResult>\n\tbuild(config: ProjectConfig): Promise<BuildArtifacts>\n\tdeploy(artifacts: BuildArtifacts): Promise<DeployResult>\n\trollback(deploymentId: string): Promise<void>\n\tlogs(options: LogOptions): AsyncIterable<LogLine>\n\tstatus(): Promise<DeploymentStatus>\n}\n\n/**\n * Optional adapter extension for commands that require runtime context\n * (project root, app name, region) outside an initial provisioning run.\n */\nexport interface ContextAwareDeployAdapter extends DeployAdapter {\n\tsetContext(context: {\n\t\tprojectRoot: string\n\t\tappName: string\n\t\tregion: string | null\n\t}): void\n}\n\n/**\n * Checks whether the provided value is a known deploy platform.\n */\nexport function isDeployPlatform(value: string): value is DeployPlatform {\n\treturn (DEPLOY_PLATFORMS as readonly string[]).includes(value)\n}\n","import { spawn } from 'node:child_process'\nimport { join } from 'node:path'\nimport { createLogger } from '../../../utils/logger'\nimport { buildClient } from '../builder/client-builder'\nimport { bundleServer } from '../builder/server-bundler'\nimport type {\n\tBuildArtifacts,\n\tContextAwareDeployAdapter,\n\tDeployResult,\n\tDeploymentStatus,\n\tLogLine,\n\tLogOptions,\n\tProjectConfig,\n\tProvisionResult,\n} from './adapter'\n\n/**\n * Execution abstraction for AWS CLI interactions.\n */\nexport interface AwsCommandRunner {\n\trun(command: string, args: string[], cwd: string): Promise<AwsCommandResult>\n}\n\nexport interface AwsCommandResult {\n\texitCode: number\n\tstdout: string\n\tstderr: string\n}\n\nexport interface AwsEcsAdapterOptions {\n\trunner?: AwsCommandRunner\n\tcontext?: AwsEcsAdapterContext\n}\n\nexport interface AwsEcsAdapterContext {\n\tprojectRoot: string\n\tappName: string\n\tregion: string | null\n}\n\n/**\n * AWS ECS Fargate deploy adapter.\n *\n * Uses the AWS CLI to:\n * 1. Create an ECR repository for the Docker image\n * 2. Build and push the image to ECR\n * 3. Create/update an ECS Fargate service with an ALB\n *\n * Requires: `aws` CLI installed and configured with valid credentials.\n * Optionally uses `DATABASE_URL` env var for PostgreSQL (no EFS needed).\n *\n * Recommended for production multi-instance deployments.\n */\nexport class AwsEcsAdapter implements ContextAwareDeployAdapter {\n\tpublic readonly name = 'aws-ecs' as const\n\n\tprivate readonly logger = createLogger()\n\tprivate readonly runner: AwsCommandRunner\n\tprivate currentContext: AwsEcsAdapterContext | null\n\n\tpublic constructor(options: AwsEcsAdapterOptions = {}) {\n\t\tthis.runner = options.runner ?? new NodeAwsCommandRunner()\n\t\tthis.currentContext = options.context ?? null\n\t}\n\n\tpublic setContext(context: AwsEcsAdapterContext): void {\n\t\tthis.currentContext = context\n\t}\n\n\tpublic async detect(): Promise<boolean> {\n\t\tconst result = await this.runner.run('aws', ['--version'], process.cwd())\n\t\treturn result.exitCode === 0\n\t}\n\n\tpublic async install(): Promise<void> {\n\t\tconst available = await this.detect()\n\t\tif (!available) {\n\t\t\tthrow new Error(\n\t\t\t\t'AWS CLI is required but not installed. Install from https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html',\n\t\t\t)\n\t\t}\n\t}\n\n\tpublic async authenticate(): Promise<void> {\n\t\tconst cwd = this.currentContext?.projectRoot ?? process.cwd()\n\t\tconst result = await this.runner.run('aws', ['sts', 'get-caller-identity'], cwd)\n\t\tif (result.exitCode !== 0) {\n\t\t\tthrow new Error(\n\t\t\t\t'AWS CLI is not authenticated. Run `aws configure` or set AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY environment variables.',\n\t\t\t)\n\t\t}\n\t}\n\n\tpublic async provision(config: ProjectConfig): Promise<ProvisionResult> {\n\t\tthis.currentContext = {\n\t\t\tprojectRoot: config.projectRoot,\n\t\t\tappName: config.appName,\n\t\t\tregion: config.region ?? 'us-east-1',\n\t\t}\n\n\t\tconst region = config.region ?? 'us-east-1'\n\t\tconst repoName = `kora/${config.appName}`\n\n\t\t// Create ECR repository (idempotent)\n\t\tconst createRepo = await this.runner.run(\n\t\t\t'aws',\n\t\t\t[\n\t\t\t\t'ecr',\n\t\t\t\t'create-repository',\n\t\t\t\t'--repository-name',\n\t\t\t\trepoName,\n\t\t\t\t'--region',\n\t\t\t\tregion,\n\t\t\t\t'--image-scanning-configuration',\n\t\t\t\t'scanOnPush=true',\n\t\t\t],\n\t\t\tconfig.projectRoot,\n\t\t)\n\n\t\tif (\n\t\t\tcreateRepo.exitCode !== 0 &&\n\t\t\t!createRepo.stderr.includes('RepositoryAlreadyExistsException')\n\t\t) {\n\t\t\tthrow new Error(`Failed to create ECR repository: ${createRepo.stderr}`)\n\t\t}\n\n\t\t// Get AWS account ID for ECR URI\n\t\tconst identity = await this.runner.run(\n\t\t\t'aws',\n\t\t\t['sts', 'get-caller-identity', '--query', 'Account', '--output', 'text'],\n\t\t\tconfig.projectRoot,\n\t\t)\n\t\tconst accountId = identity.stdout.trim()\n\n\t\t// Create ECS cluster (idempotent)\n\t\tawait this.runner.run(\n\t\t\t'aws',\n\t\t\t['ecs', 'create-cluster', '--cluster-name', config.appName, '--region', region],\n\t\t\tconfig.projectRoot,\n\t\t)\n\n\t\t// Create CloudWatch log group\n\t\tawait this.runner.run(\n\t\t\t'aws',\n\t\t\t[\n\t\t\t\t'logs',\n\t\t\t\t'create-log-group',\n\t\t\t\t'--log-group-name',\n\t\t\t\t`/ecs/${config.appName}`,\n\t\t\t\t'--region',\n\t\t\t\tregion,\n\t\t\t],\n\t\t\tconfig.projectRoot,\n\t\t)\n\n\t\treturn {\n\t\t\tapplicationId: `${accountId}.dkr.ecr.${region}.amazonaws.com/${repoName}`,\n\t\t\tdatabaseId: null,\n\t\t\tsecretsSet: ['PORT'],\n\t\t}\n\t}\n\n\tpublic async build(config: ProjectConfig): Promise<BuildArtifacts> {\n\t\tthis.currentContext = {\n\t\t\tprojectRoot: config.projectRoot,\n\t\t\tappName: config.appName,\n\t\t\tregion: config.region,\n\t\t}\n\n\t\tconst deployDirectory = join(config.projectRoot, '.kora', 'deploy')\n\n\t\tawait bundleServer({\n\t\t\tprojectRoot: config.projectRoot,\n\t\t\tdeployDirectory,\n\t\t})\n\n\t\tconst client =\n\t\t\tconfig.deployTarget === 'sync-server'\n\t\t\t\t? null\n\t\t\t\t: await buildClient({\n\t\t\t\t\t\tprojectRoot: config.projectRoot,\n\t\t\t\t\t\toutDir: join(deployDirectory, 'dist'),\n\t\t\t\t\t\tmode: 'production',\n\t\t\t\t\t})\n\n\t\treturn {\n\t\t\tclientDirectory: client?.outDir ?? null,\n\t\t\tserverBundlePath: join(deployDirectory, 'server-bundled.js'),\n\t\t\tdeployDirectory,\n\t\t}\n\t}\n\n\tpublic async deploy(artifacts: BuildArtifacts): Promise<DeployResult> {\n\t\tconst context = this.requireContext()\n\t\tconst region = context.region ?? 'us-east-1'\n\t\tconst repoName = `kora/${context.appName}`\n\n\t\t// Get ECR login token\n\t\tconst loginPassword = await this.runner.run(\n\t\t\t'aws',\n\t\t\t['ecr', 'get-login-password', '--region', region],\n\t\t\tcontext.projectRoot,\n\t\t)\n\n\t\tif (loginPassword.exitCode !== 0) {\n\t\t\tthrow new Error(`ECR login failed: ${loginPassword.stderr}`)\n\t\t}\n\n\t\t// Get account ID\n\t\tconst identity = await this.runner.run(\n\t\t\t'aws',\n\t\t\t['sts', 'get-caller-identity', '--query', 'Account', '--output', 'text'],\n\t\t\tcontext.projectRoot,\n\t\t)\n\t\tconst accountId = identity.stdout.trim()\n\t\tconst ecrUri = `${accountId}.dkr.ecr.${region}.amazonaws.com`\n\t\tconst imageUri = `${ecrUri}/${repoName}:latest`\n\n\t\t// Docker login to ECR\n\t\tconst dockerLogin = await this.runner.run(\n\t\t\t'docker',\n\t\t\t['login', '--username', 'AWS', '--password-stdin', ecrUri],\n\t\t\tartifacts.deployDirectory,\n\t\t)\n\t\t// Note: password is piped via stdin in real usage; for the adapter we use the password result\n\n\t\t// Build Docker image\n\t\tthis.logger.step('Building Docker image...')\n\t\tconst dockerBuild = await this.runner.run(\n\t\t\t'docker',\n\t\t\t['build', '--platform', 'linux/amd64', '-t', imageUri, '.'],\n\t\t\tartifacts.deployDirectory,\n\t\t)\n\n\t\tif (dockerBuild.exitCode !== 0) {\n\t\t\tthrow new Error(`Docker build failed: ${dockerBuild.stderr}`)\n\t\t}\n\n\t\t// Push to ECR\n\t\tthis.logger.step('Pushing image to ECR...')\n\t\tconst dockerPush = await this.runner.run(\n\t\t\t'docker',\n\t\t\t['push', imageUri],\n\t\t\tartifacts.deployDirectory,\n\t\t)\n\n\t\tif (dockerPush.exitCode !== 0) {\n\t\t\tthrow new Error(`Docker push failed: ${dockerPush.stderr}`)\n\t\t}\n\n\t\t// Register task definition\n\t\tconst taskDef = JSON.stringify({\n\t\t\tfamily: context.appName,\n\t\t\tnetworkMode: 'awsvpc',\n\t\t\trequiresCompatibilities: ['FARGATE'],\n\t\t\tcpu: '256',\n\t\t\tmemory: '512',\n\t\t\texecutionRoleArn: `arn:aws:iam::${accountId}:role/ecsTaskExecutionRole`,\n\t\t\tcontainerDefinitions: [\n\t\t\t\t{\n\t\t\t\t\tname: context.appName,\n\t\t\t\t\timage: imageUri,\n\t\t\t\t\tessential: true,\n\t\t\t\t\tportMappings: [{ containerPort: 3001, protocol: 'tcp' }],\n\t\t\t\t\tlogConfiguration: {\n\t\t\t\t\t\tlogDriver: 'awslogs',\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\t'awslogs-group': `/ecs/${context.appName}`,\n\t\t\t\t\t\t\t'awslogs-region': region,\n\t\t\t\t\t\t\t'awslogs-stream-prefix': 'ecs',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\thealthCheck: {\n\t\t\t\t\t\tcommand: ['CMD-SHELL', 'curl -f http://localhost:3001/health || exit 1'],\n\t\t\t\t\t\tinterval: 30,\n\t\t\t\t\t\ttimeout: 5,\n\t\t\t\t\t\tretries: 3,\n\t\t\t\t\t\tstartPeriod: 60,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t})\n\n\t\tconst registerTask = await this.runner.run(\n\t\t\t'aws',\n\t\t\t['ecs', 'register-task-definition', '--cli-input-json', taskDef, '--region', region],\n\t\t\tcontext.projectRoot,\n\t\t)\n\n\t\tif (registerTask.exitCode !== 0) {\n\t\t\tthrow new Error(`Task definition registration failed: ${registerTask.stderr}`)\n\t\t}\n\n\t\t// Update or create ECS service\n\t\tconst updateService = await this.runner.run(\n\t\t\t'aws',\n\t\t\t[\n\t\t\t\t'ecs',\n\t\t\t\t'update-service',\n\t\t\t\t'--cluster',\n\t\t\t\tcontext.appName,\n\t\t\t\t'--service',\n\t\t\t\tcontext.appName,\n\t\t\t\t'--task-definition',\n\t\t\t\tcontext.appName,\n\t\t\t\t'--force-new-deployment',\n\t\t\t\t'--region',\n\t\t\t\tregion,\n\t\t\t],\n\t\t\tcontext.projectRoot,\n\t\t)\n\n\t\tconst deploymentId = new Date().toISOString()\n\n\t\tif (updateService.exitCode !== 0) {\n\t\t\tthis.logger.step('Service not found, creating new service...')\n\t\t\t// Service doesn't exist — developer needs to create it with proper VPC/subnet/ALB config.\n\t\t\t// We can't auto-create the full networking stack, so provide guidance.\n\t\t\tthis.logger.step(\n\t\t\t\t`Task definition registered. Create the ECS service with:\\n aws ecs create-service \\\\\\n --cluster ${context.appName} \\\\\\n --service-name ${context.appName} \\\\\\n --task-definition ${context.appName} \\\\\\n --desired-count 1 \\\\\\n --launch-type FARGATE \\\\\\n --network-configuration \"awsvpcConfiguration={subnets=[<subnet-id>],securityGroups=[<sg-id>],assignPublicIp=ENABLED}\" \\\\\\n --region ${region}`,\n\t\t\t)\n\t\t}\n\n\t\treturn {\n\t\t\tdeploymentId,\n\t\t\tliveUrl: `https://${context.appName}.${region}.amazonaws.com`,\n\t\t\tsyncUrl: `wss://${context.appName}.${region}.amazonaws.com/kora-sync`,\n\t\t}\n\t}\n\n\tpublic async rollback(deploymentId: string): Promise<void> {\n\t\tconst context = this.requireContext()\n\t\tconst region = context.region ?? 'us-east-1'\n\n\t\t// List task definition revisions and deploy the previous one\n\t\tconst result = await this.runner.run(\n\t\t\t'aws',\n\t\t\t[\n\t\t\t\t'ecs',\n\t\t\t\t'update-service',\n\t\t\t\t'--cluster',\n\t\t\t\tcontext.appName,\n\t\t\t\t'--service',\n\t\t\t\tcontext.appName,\n\t\t\t\t'--task-definition',\n\t\t\t\t`${context.appName}:${deploymentId}`,\n\t\t\t\t'--force-new-deployment',\n\t\t\t\t'--region',\n\t\t\t\tregion,\n\t\t\t],\n\t\t\tcontext.projectRoot,\n\t\t)\n\n\t\tif (result.exitCode !== 0) {\n\t\t\tthrow new Error(`ECS rollback failed: ${result.stderr}`)\n\t\t}\n\t}\n\n\tpublic async *logs(options: LogOptions): AsyncIterable<LogLine> {\n\t\tconst context = this.requireContext()\n\t\tconst region = context.region ?? 'us-east-1'\n\n\t\tconst args = [\n\t\t\t'logs',\n\t\t\t'get-log-events',\n\t\t\t'--log-group-name',\n\t\t\t`/ecs/${context.appName}`,\n\t\t\t'--log-stream-name',\n\t\t\t'ecs/latest',\n\t\t\t'--region',\n\t\t\tregion,\n\t\t]\n\n\t\tif (options.tail) {\n\t\t\targs.push('--limit', String(options.tail))\n\t\t}\n\n\t\tconst result = await this.runner.run('aws', args, context.projectRoot)\n\t\tif (result.exitCode !== 0) {\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(result.stdout) as {\n\t\t\t\tevents?: Array<{ timestamp: number; message: string }>\n\t\t\t}\n\t\t\tfor (const event of parsed.events ?? []) {\n\t\t\t\tyield {\n\t\t\t\t\ttimestamp: new Date(event.timestamp).toISOString(),\n\t\t\t\t\tlevel: inferLogLevel(event.message),\n\t\t\t\t\tmessage: event.message,\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Non-JSON output, yield raw lines\n\t\t\tfor (const line of result.stdout.split('\\n').filter(Boolean)) {\n\t\t\t\tyield { timestamp: new Date().toISOString(), level: 'info', message: line }\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic async status(): Promise<DeploymentStatus> {\n\t\tconst context = this.requireContext()\n\t\tconst region = context.region ?? 'us-east-1'\n\n\t\tconst result = await this.runner.run(\n\t\t\t'aws',\n\t\t\t[\n\t\t\t\t'ecs',\n\t\t\t\t'describe-services',\n\t\t\t\t'--cluster',\n\t\t\t\tcontext.appName,\n\t\t\t\t'--services',\n\t\t\t\tcontext.appName,\n\t\t\t\t'--region',\n\t\t\t\tregion,\n\t\t\t],\n\t\t\tcontext.projectRoot,\n\t\t)\n\n\t\tif (result.exitCode !== 0) {\n\t\t\treturn { state: 'failed', message: result.stderr }\n\t\t}\n\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(result.stdout) as {\n\t\t\t\tservices?: Array<{ status: string; runningCount: number; desiredCount: number }>\n\t\t\t}\n\t\t\tconst service = parsed.services?.[0]\n\t\t\tif (!service) {\n\t\t\t\treturn { state: 'unknown', message: 'Service not found' }\n\t\t\t}\n\n\t\t\tif (service.status === 'ACTIVE' && service.runningCount > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tstate: 'healthy',\n\t\t\t\t\tmessage: `Running ${service.runningCount}/${service.desiredCount} tasks`,\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tstate: service.runningCount === 0 ? 'pending' : 'healthy',\n\t\t\t\tmessage: `Status: ${service.status}, running: ${service.runningCount}/${service.desiredCount}`,\n\t\t\t}\n\t\t} catch {\n\t\t\treturn { state: 'unknown', message: 'Could not parse service status' }\n\t\t}\n\t}\n\n\tprivate requireContext(): AwsEcsAdapterContext {\n\t\tif (!this.currentContext) {\n\t\t\tthrow new Error('AWS ECS adapter context is not initialized. Run provision() first.')\n\t\t}\n\t\treturn this.currentContext\n\t}\n}\n\n/**\n * Default subprocess-backed runner for AWS CLI commands.\n */\nexport class NodeAwsCommandRunner implements AwsCommandRunner {\n\tpublic async run(command: string, args: string[], cwd: string): Promise<AwsCommandResult> {\n\t\treturn new Promise<AwsCommandResult>((resolve) => {\n\t\t\tconst child = spawn(command, args, {\n\t\t\t\tcwd,\n\t\t\t\tenv: process.env,\n\t\t\t\tstdio: ['ignore', 'pipe', 'pipe'],\n\t\t\t})\n\n\t\t\tlet stdout = ''\n\t\t\tlet stderr = ''\n\t\t\tchild.stdout?.on('data', (chunk: Buffer) => {\n\t\t\t\tstdout += chunk.toString('utf-8')\n\t\t\t})\n\t\t\tchild.stderr?.on('data', (chunk: Buffer) => {\n\t\t\t\tstderr += chunk.toString('utf-8')\n\t\t\t})\n\t\t\tchild.on('error', (error) => {\n\t\t\t\tresolve({ exitCode: 1, stdout, stderr: `${stderr}\\n${error.message}` })\n\t\t\t})\n\t\t\tchild.on('exit', (code) => {\n\t\t\t\tresolve({ exitCode: code ?? 1, stdout: stdout.trim(), stderr: stderr.trim() })\n\t\t\t})\n\t\t})\n\t}\n}\n\nfunction inferLogLevel(line: string): LogLine['level'] {\n\tconst normalized = line.toLowerCase()\n\tif (normalized.includes('error')) return 'error'\n\tif (normalized.includes('warn')) return 'warn'\n\tif (normalized.includes('debug')) return 'debug'\n\treturn 'info'\n}\n","import { spawn } from 'node:child_process'\nimport { existsSync } from 'node:fs'\nimport { copyFile, readdir } from 'node:fs/promises'\nimport { join, resolve } from 'node:path'\nimport { resolveProjectBinaryEntryPoint } from '../../../utils/fs-helpers'\n\n/**\n * Inputs used to execute a client build through Vite.\n */\nexport interface ClientBuildOptions {\n\tprojectRoot: string\n\toutDir: string\n\tmode?: 'development' | 'production'\n}\n\n/**\n * Result returned after a successful Vite build.\n */\nexport interface ClientBuildResult {\n\toutDir: string\n}\n\n/**\n * Builds the client bundle with the project's local Vite installation.\n *\n * After Vite completes, patches the output to ensure SQLite WASM assets\n * are present. The template's sqliteWasmHotfix Vite plugin writes to the\n * default `dist/` directory, but `kora deploy` redirects output to\n * `.kora/deploy/dist/`. This post-build step fills in any missing assets.\n */\nexport async function buildClient(options: ClientBuildOptions): Promise<ClientBuildResult> {\n\tconst viteEntryPoint = await resolveProjectBinaryEntryPoint(options.projectRoot, 'vite', 'vite')\n\tif (!viteEntryPoint) {\n\t\tthrow new Error(\n\t\t\t`Could not find local Vite binary in ${options.projectRoot}. Install dependencies before deploying.`,\n\t\t)\n\t}\n\n\tconst args = [\n\t\tviteEntryPoint,\n\t\t'build',\n\t\t'--outDir',\n\t\toptions.outDir,\n\t\t'--mode',\n\t\toptions.mode ?? 'production',\n\t]\n\n\tawait runProcess(process.execPath, args, options.projectRoot)\n\tawait patchSqliteWasmAssets(options.projectRoot, options.outDir)\n\treturn { outDir: options.outDir }\n}\n\n/**\n * Ensures the SQLite WASM assets required for OPFS are present in the build output.\n *\n * 1. Copies the content-hashed `sqlite3-XXXX.wasm` to `sqlite3.wasm` (Emscripten's\n * locateFile expects the unhashed name).\n * 2. Copies `sqlite3-opfs-async-proxy.js` from node_modules (dynamically loaded by\n * sqlite3, invisible to Vite's bundler).\n */\nasync function patchSqliteWasmAssets(projectRoot: string, outDir: string): Promise<void> {\n\tconst assetsDir = join(outDir, 'assets')\n\tif (!existsSync(assetsDir)) return\n\n\tconst files = await readdir(assetsDir)\n\n\t// Copy hashed sqlite3 WASM to unhashed name\n\tconst hashedWasm = files.find((f) => /^sqlite3-.+\\.wasm$/.test(f))\n\tif (hashedWasm && !files.includes('sqlite3.wasm')) {\n\t\tawait copyFile(join(assetsDir, hashedWasm), join(assetsDir, 'sqlite3.wasm'))\n\t}\n\n\t// Copy OPFS async proxy worker\n\tif (!files.includes('sqlite3-opfs-async-proxy.js')) {\n\t\tconst proxyFile = resolve(\n\t\t\tprojectRoot,\n\t\t\t'node_modules',\n\t\t\t'@sqlite.org',\n\t\t\t'sqlite-wasm',\n\t\t\t'sqlite-wasm',\n\t\t\t'jswasm',\n\t\t\t'sqlite3-opfs-async-proxy.js',\n\t\t)\n\t\tif (existsSync(proxyFile)) {\n\t\t\tawait copyFile(proxyFile, join(assetsDir, 'sqlite3-opfs-async-proxy.js'))\n\t\t}\n\t}\n}\n\nasync function runProcess(command: string, args: string[], cwd: string): Promise<void> {\n\tawait new Promise<void>((resolve, reject) => {\n\t\tconst child = spawn(command, args, {\n\t\t\tcwd,\n\t\t\tstdio: 'inherit',\n\t\t\tenv: process.env,\n\t\t})\n\n\t\tchild.on('error', (error) => {\n\t\t\treject(error)\n\t\t})\n\n\t\tchild.on('exit', (code) => {\n\t\t\tif (code === 0) {\n\t\t\t\tresolve()\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\treject(new Error(`Client build failed with exit code ${String(code ?? 'unknown')}.`))\n\t\t})\n\t})\n}\n","import { mkdir } from 'node:fs/promises'\nimport { access } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport { build } from 'esbuild'\n\n/**\n * Options used to produce a deployable server bundle artifact.\n */\nexport interface ServerBundleOptions {\n\tprojectRoot: string\n\tdeployDirectory: string\n\tentryFileCandidates?: readonly string[]\n}\n\n/**\n * Result details for the generated server bundle artifact.\n */\nexport interface ServerBundleResult {\n\tentryFilePath: string\n\toutputFilePath: string\n}\n\nconst DEFAULT_ENTRY_CANDIDATES = [\n\t'server.ts',\n\t'server.js',\n\t'src/server.ts',\n\t'src/server.js',\n] as const\n/**\n * Bundles the server entry into a single deployable JavaScript file.\n */\nexport async function bundleServer(options: ServerBundleOptions): Promise<ServerBundleResult> {\n\tconst candidates = options.entryFileCandidates ?? DEFAULT_ENTRY_CANDIDATES\n\tconst entryFilePath = await resolveServerEntry(options.projectRoot, candidates)\n\tif (!entryFilePath) {\n\t\tthrow new Error(\n\t\t\t`Could not find a server entry file in ${options.projectRoot}. Looked for: ${candidates.join(', ')}`,\n\t\t)\n\t}\n\n\tawait mkdir(options.deployDirectory, { recursive: true })\n\tconst outputFilePath = join(options.deployDirectory, 'server-bundled.js')\n\n\tawait build({\n\t\tentryPoints: [entryFilePath],\n\t\toutfile: outputFilePath,\n\t\tbundle: true,\n\t\tplatform: 'node',\n\t\tformat: 'esm',\n\t\ttarget: ['node20'],\n\t\tsourcemap: false,\n\t\tlogLevel: 'silent',\n\t\texternal: ['better-sqlite3'],\n\t\tbanner: {\n\t\t\tjs: \"import { createRequire as __createRequire } from 'module'; const require = __createRequire(import.meta.url);\",\n\t\t},\n\t})\n\n\treturn {\n\t\tentryFilePath,\n\t\toutputFilePath,\n\t}\n}\n\nasync function resolveServerEntry(\n\tprojectRoot: string,\n\tcandidates: readonly string[],\n): Promise<string | null> {\n\tfor (const candidate of candidates) {\n\t\tconst fullPath = join(projectRoot, candidate)\n\t\ttry {\n\t\t\tawait access(fullPath)\n\t\t\treturn fullPath\n\t\t} catch {\n\t\t\t// continue scanning candidates\n\t\t}\n\t}\n\n\treturn null\n}\n","import { spawn } from 'node:child_process'\nimport { join } from 'node:path'\nimport { createLogger } from '../../../utils/logger'\nimport { buildClient } from '../builder/client-builder'\nimport { bundleServer } from '../builder/server-bundler'\nimport type {\n\tBuildArtifacts,\n\tContextAwareDeployAdapter,\n\tDeployResult,\n\tDeploymentStatus,\n\tLogLine,\n\tLogOptions,\n\tProjectConfig,\n\tProvisionResult,\n} from './adapter'\n\n/**\n * Execution abstraction for AWS CLI interactions.\n */\nexport interface AwsLightsailCommandRunner {\n\trun(command: string, args: string[], cwd: string): Promise<AwsLightsailCommandResult>\n}\n\nexport interface AwsLightsailCommandResult {\n\texitCode: number\n\tstdout: string\n\tstderr: string\n}\n\nexport interface AwsLightsailAdapterOptions {\n\trunner?: AwsLightsailCommandRunner\n\tcontext?: AwsLightsailAdapterContext\n}\n\nexport interface AwsLightsailAdapterContext {\n\tprojectRoot: string\n\tappName: string\n\tregion: string | null\n}\n\n/**\n * AWS Lightsail Container Service deploy adapter.\n *\n * Uses the AWS CLI to:\n * 1. Create a Lightsail container service\n * 2. Build and push the Docker image\n * 3. Create a deployment with the container image\n *\n * Requires: `aws` CLI installed and configured with valid credentials,\n * plus the `lightsailctl` plugin for container image pushes.\n *\n * Recommended for simple, cost-effective container deployments.\n */\nexport class AwsLightsailAdapter implements ContextAwareDeployAdapter {\n\tpublic readonly name = 'aws-lightsail' as const\n\n\tprivate readonly logger = createLogger()\n\tprivate readonly runner: AwsLightsailCommandRunner\n\tprivate currentContext: AwsLightsailAdapterContext | null\n\n\tpublic constructor(options: AwsLightsailAdapterOptions = {}) {\n\t\tthis.runner = options.runner ?? new NodeAwsLightsailCommandRunner()\n\t\tthis.currentContext = options.context ?? null\n\t}\n\n\tpublic setContext(context: AwsLightsailAdapterContext): void {\n\t\tthis.currentContext = context\n\t}\n\n\tpublic async detect(): Promise<boolean> {\n\t\tconst result = await this.runner.run('aws', ['--version'], process.cwd())\n\t\treturn result.exitCode === 0\n\t}\n\n\tpublic async install(): Promise<void> {\n\t\tconst available = await this.detect()\n\t\tif (!available) {\n\t\t\tthrow new Error(\n\t\t\t\t'AWS CLI is required but not installed. Install from https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html',\n\t\t\t)\n\t\t}\n\t}\n\n\tpublic async authenticate(): Promise<void> {\n\t\tconst cwd = this.currentContext?.projectRoot ?? process.cwd()\n\t\tconst result = await this.runner.run('aws', ['sts', 'get-caller-identity'], cwd)\n\t\tif (result.exitCode !== 0) {\n\t\t\tthrow new Error(\n\t\t\t\t'AWS CLI is not authenticated. Run `aws configure` or set AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY environment variables.',\n\t\t\t)\n\t\t}\n\t}\n\n\tpublic async provision(config: ProjectConfig): Promise<ProvisionResult> {\n\t\tthis.currentContext = {\n\t\t\tprojectRoot: config.projectRoot,\n\t\t\tappName: config.appName,\n\t\t\tregion: config.region ?? 'us-east-1',\n\t\t}\n\n\t\tconst region = config.region ?? 'us-east-1'\n\t\tconst serviceName = sanitizeLightsailName(config.appName)\n\n\t\t// Create Lightsail container service (idempotent — errors if already exists)\n\t\tconst createService = await this.runner.run(\n\t\t\t'aws',\n\t\t\t[\n\t\t\t\t'lightsail',\n\t\t\t\t'create-container-service',\n\t\t\t\t'--service-name',\n\t\t\t\tserviceName,\n\t\t\t\t'--power',\n\t\t\t\t'nano',\n\t\t\t\t'--scale',\n\t\t\t\t'1',\n\t\t\t\t'--region',\n\t\t\t\tregion,\n\t\t\t],\n\t\t\tconfig.projectRoot,\n\t\t)\n\n\t\tif (createService.exitCode !== 0 && !createService.stderr.includes('already exists')) {\n\t\t\tthrow new Error(`Failed to create Lightsail container service: ${createService.stderr}`)\n\t\t}\n\n\t\treturn {\n\t\t\tapplicationId: serviceName,\n\t\t\tdatabaseId: null,\n\t\t\tsecretsSet: ['PORT'],\n\t\t}\n\t}\n\n\tpublic async build(config: ProjectConfig): Promise<BuildArtifacts> {\n\t\tthis.currentContext = {\n\t\t\tprojectRoot: config.projectRoot,\n\t\t\tappName: config.appName,\n\t\t\tregion: config.region,\n\t\t}\n\n\t\tconst deployDirectory = join(config.projectRoot, '.kora', 'deploy')\n\n\t\tawait bundleServer({\n\t\t\tprojectRoot: config.projectRoot,\n\t\t\tdeployDirectory,\n\t\t})\n\n\t\tconst client =\n\t\t\tconfig.deployTarget === 'sync-server'\n\t\t\t\t? null\n\t\t\t\t: await buildClient({\n\t\t\t\t\t\tprojectRoot: config.projectRoot,\n\t\t\t\t\t\toutDir: join(deployDirectory, 'dist'),\n\t\t\t\t\t\tmode: 'production',\n\t\t\t\t\t})\n\n\t\treturn {\n\t\t\tclientDirectory: client?.outDir ?? null,\n\t\t\tserverBundlePath: join(deployDirectory, 'server-bundled.js'),\n\t\t\tdeployDirectory,\n\t\t}\n\t}\n\n\tpublic async deploy(artifacts: BuildArtifacts): Promise<DeployResult> {\n\t\tconst context = this.requireContext()\n\t\tconst region = context.region ?? 'us-east-1'\n\t\tconst serviceName = sanitizeLightsailName(context.appName)\n\t\tconst imageTag = `${serviceName}:latest`\n\n\t\t// Build Docker image locally\n\t\tthis.logger.step('Building Docker image...')\n\t\tconst dockerBuild = await this.runner.run(\n\t\t\t'docker',\n\t\t\t['build', '--platform', 'linux/amd64', '-t', imageTag, '.'],\n\t\t\tartifacts.deployDirectory,\n\t\t)\n\n\t\tif (dockerBuild.exitCode !== 0) {\n\t\t\tthrow new Error(`Docker build failed: ${dockerBuild.stderr}`)\n\t\t}\n\n\t\t// Push image to Lightsail using lightsailctl plugin\n\t\tthis.logger.step('Pushing image to Lightsail...')\n\t\tconst pushImage = await this.runner.run(\n\t\t\t'aws',\n\t\t\t[\n\t\t\t\t'lightsail',\n\t\t\t\t'push-container-image',\n\t\t\t\t'--service-name',\n\t\t\t\tserviceName,\n\t\t\t\t'--label',\n\t\t\t\t'latest',\n\t\t\t\t'--image',\n\t\t\t\timageTag,\n\t\t\t\t'--region',\n\t\t\t\tregion,\n\t\t\t],\n\t\t\tartifacts.deployDirectory,\n\t\t)\n\n\t\tif (pushImage.exitCode !== 0) {\n\t\t\tthrow new Error(`Lightsail image push failed: ${pushImage.stderr}`)\n\t\t}\n\n\t\t// Parse the image reference from the push output\n\t\tconst lightsailImage = parseLightsailImageRef(pushImage.stdout) ?? `:${serviceName}.latest.1`\n\n\t\t// Create deployment\n\t\tthis.logger.step('Creating Lightsail deployment...')\n\t\tconst environment: Record<string, string> = { PORT: '3001' }\n\t\t// Pass through deployment-relevant env vars\n\t\tfor (const key of PASSTHROUGH_ENV_VARS) {\n\t\t\tconst value = process.env[key]\n\t\t\tif (value) {\n\t\t\t\tenvironment[key] = value\n\t\t\t}\n\t\t}\n\t\tconst containers = JSON.stringify({\n\t\t\t[serviceName]: {\n\t\t\t\timage: lightsailImage,\n\t\t\t\tports: { '3001': 'HTTP' },\n\t\t\t\tenvironment,\n\t\t\t},\n\t\t})\n\t\tconst publicEndpoint = JSON.stringify({\n\t\t\tcontainerName: serviceName,\n\t\t\tcontainerPort: 3001,\n\t\t\thealthCheck: {\n\t\t\t\tpath: '/health',\n\t\t\t\tintervalSeconds: 30,\n\t\t\t\ttimeoutSeconds: 5,\n\t\t\t\thealthyThreshold: 2,\n\t\t\t\tunhealthyThreshold: 3,\n\t\t\t},\n\t\t})\n\n\t\tconst createDeploy = await this.runner.run(\n\t\t\t'aws',\n\t\t\t[\n\t\t\t\t'lightsail',\n\t\t\t\t'create-container-service-deployment',\n\t\t\t\t'--service-name',\n\t\t\t\tserviceName,\n\t\t\t\t'--containers',\n\t\t\t\tcontainers,\n\t\t\t\t'--public-endpoint',\n\t\t\t\tpublicEndpoint,\n\t\t\t\t'--region',\n\t\t\t\tregion,\n\t\t\t],\n\t\t\tcontext.projectRoot,\n\t\t)\n\n\t\tif (createDeploy.exitCode !== 0) {\n\t\t\tthrow new Error(`Lightsail deployment failed: ${createDeploy.stderr}`)\n\t\t}\n\n\t\t// Get the service URL\n\t\tconst serviceInfo = await this.runner.run(\n\t\t\t'aws',\n\t\t\t['lightsail', 'get-container-services', '--service-name', serviceName, '--region', region],\n\t\t\tcontext.projectRoot,\n\t\t)\n\n\t\tconst rawUrl =\n\t\t\tparseLightsailUrl(serviceInfo.stdout) ??\n\t\t\t`https://${serviceName}.${region}.cs.amazonlightsail.com`\n\t\tconst serviceUrl = rawUrl.replace(/\\/+$/, '')\n\t\tconst deploymentId = new Date().toISOString()\n\n\t\treturn {\n\t\t\tdeploymentId,\n\t\t\tliveUrl: serviceUrl,\n\t\t\tsyncUrl: `${serviceUrl.replace('https://', 'wss://')}/kora-sync`,\n\t\t}\n\t}\n\n\tpublic async rollback(_deploymentId: string): Promise<void> {\n\t\tconst context = this.requireContext()\n\t\tconst region = context.region ?? 'us-east-1'\n\t\tconst serviceName = sanitizeLightsailName(context.appName)\n\n\t\t// Lightsail doesn't have a native rollback — get previous deployment version\n\t\t// and redeploy. For now, we list deployments and use the previous container image.\n\t\tconst deployments = await this.runner.run(\n\t\t\t'aws',\n\t\t\t[\n\t\t\t\t'lightsail',\n\t\t\t\t'get-container-service-deployments',\n\t\t\t\t'--service-name',\n\t\t\t\tserviceName,\n\t\t\t\t'--region',\n\t\t\t\tregion,\n\t\t\t],\n\t\t\tcontext.projectRoot,\n\t\t)\n\n\t\tif (deployments.exitCode !== 0) {\n\t\t\tthrow new Error(`Lightsail rollback failed: ${deployments.stderr}`)\n\t\t}\n\n\t\t// Parse previous deployment and re-create it\n\t\tconst previousDeployment = parsePreviousDeployment(deployments.stdout, serviceName)\n\t\tif (!previousDeployment) {\n\t\t\tthrow new Error('No previous deployment found to rollback to.')\n\t\t}\n\n\t\tconst redeploy = await this.runner.run(\n\t\t\t'aws',\n\t\t\t[\n\t\t\t\t'lightsail',\n\t\t\t\t'create-container-service-deployment',\n\t\t\t\t'--service-name',\n\t\t\t\tserviceName,\n\t\t\t\t'--containers',\n\t\t\t\tJSON.stringify(previousDeployment.containers),\n\t\t\t\t'--public-endpoint',\n\t\t\t\tJSON.stringify(previousDeployment.publicEndpoint),\n\t\t\t\t'--region',\n\t\t\t\tregion,\n\t\t\t],\n\t\t\tcontext.projectRoot,\n\t\t)\n\n\t\tif (redeploy.exitCode !== 0) {\n\t\t\tthrow new Error(`Lightsail rollback deployment failed: ${redeploy.stderr}`)\n\t\t}\n\t}\n\n\tpublic async *logs(options: LogOptions): AsyncIterable<LogLine> {\n\t\tconst context = this.requireContext()\n\t\tconst region = context.region ?? 'us-east-1'\n\t\tconst serviceName = sanitizeLightsailName(context.appName)\n\n\t\tconst args = [\n\t\t\t'lightsail',\n\t\t\t'get-container-log',\n\t\t\t'--service-name',\n\t\t\tserviceName,\n\t\t\t'--container-name',\n\t\t\tserviceName,\n\t\t\t'--region',\n\t\t\tregion,\n\t\t]\n\n\t\tif (options.since) {\n\t\t\targs.push('--start-time', options.since)\n\t\t}\n\n\t\tconst result = await this.runner.run('aws', args, context.projectRoot)\n\t\tif (result.exitCode !== 0) {\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(result.stdout) as {\n\t\t\t\tlogEvents?: Array<{ createdAt: string; message: string }>\n\t\t\t}\n\t\t\tconst events = parsed.logEvents ?? []\n\t\t\tconst limited = options.tail ? events.slice(-options.tail) : events\n\t\t\tfor (const event of limited) {\n\t\t\t\tyield {\n\t\t\t\t\ttimestamp: event.createdAt,\n\t\t\t\t\tlevel: inferLogLevel(event.message),\n\t\t\t\t\tmessage: event.message,\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\tfor (const line of result.stdout.split('\\n').filter(Boolean)) {\n\t\t\t\tyield { timestamp: new Date().toISOString(), level: 'info', message: line }\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic async status(): Promise<DeploymentStatus> {\n\t\tconst context = this.requireContext()\n\t\tconst region = context.region ?? 'us-east-1'\n\t\tconst serviceName = sanitizeLightsailName(context.appName)\n\n\t\tconst result = await this.runner.run(\n\t\t\t'aws',\n\t\t\t['lightsail', 'get-container-services', '--service-name', serviceName, '--region', region],\n\t\t\tcontext.projectRoot,\n\t\t)\n\n\t\tif (result.exitCode !== 0) {\n\t\t\treturn { state: 'failed', message: result.stderr }\n\t\t}\n\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(result.stdout) as {\n\t\t\t\tcontainerServices?: Array<{\n\t\t\t\t\tstate: string\n\t\t\t\t\turl: string\n\t\t\t\t\tcurrentDeployment?: { state: string }\n\t\t\t\t}>\n\t\t\t}\n\t\t\tconst service = parsed.containerServices?.[0]\n\t\t\tif (!service) {\n\t\t\t\treturn { state: 'unknown', message: 'Container service not found' }\n\t\t\t}\n\n\t\t\tconst deployState = service.currentDeployment?.state ?? 'UNKNOWN'\n\t\t\tif (service.state === 'RUNNING' && deployState === 'ACTIVE') {\n\t\t\t\treturn {\n\t\t\t\t\tstate: 'healthy',\n\t\t\t\t\tmessage: 'Lightsail container service is running',\n\t\t\t\t\tliveUrl: service.url,\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (service.state === 'DEPLOYING' || deployState === 'ACTIVATING') {\n\t\t\t\treturn {\n\t\t\t\t\tstate: 'pending',\n\t\t\t\t\tmessage: `Service: ${service.state}, Deployment: ${deployState}`,\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tstate: service.state === 'DISABLED' ? 'failed' : 'unknown',\n\t\t\t\tmessage: `Service: ${service.state}, Deployment: ${deployState}`,\n\t\t\t}\n\t\t} catch {\n\t\t\treturn { state: 'unknown', message: 'Could not parse service status' }\n\t\t}\n\t}\n\n\tprivate requireContext(): AwsLightsailAdapterContext {\n\t\tif (!this.currentContext) {\n\t\t\tthrow new Error('AWS Lightsail adapter context is not initialized. Run provision() first.')\n\t\t}\n\t\treturn this.currentContext\n\t}\n}\n\n/**\n * Default subprocess-backed runner for AWS CLI commands.\n */\nexport class NodeAwsLightsailCommandRunner implements AwsLightsailCommandRunner {\n\tpublic async run(\n\t\tcommand: string,\n\t\targs: string[],\n\t\tcwd: string,\n\t): Promise<AwsLightsailCommandResult> {\n\t\treturn new Promise<AwsLightsailCommandResult>((resolve) => {\n\t\t\tconst child = spawn(command, args, {\n\t\t\t\tcwd,\n\t\t\t\tenv: process.env,\n\t\t\t\tstdio: ['ignore', 'pipe', 'pipe'],\n\t\t\t})\n\n\t\t\tlet stdout = ''\n\t\t\tlet stderr = ''\n\t\t\tchild.stdout?.on('data', (chunk: Buffer) => {\n\t\t\t\tstdout += chunk.toString('utf-8')\n\t\t\t})\n\t\t\tchild.stderr?.on('data', (chunk: Buffer) => {\n\t\t\t\tstderr += chunk.toString('utf-8')\n\t\t\t})\n\t\t\tchild.on('error', (error) => {\n\t\t\t\tresolve({ exitCode: 1, stdout, stderr: `${stderr}\\n${error.message}` })\n\t\t\t})\n\t\t\tchild.on('exit', (code) => {\n\t\t\t\tresolve({ exitCode: code ?? 1, stdout: stdout.trim(), stderr: stderr.trim() })\n\t\t\t})\n\t\t})\n\t}\n}\n\n/**\n * Environment variables automatically forwarded from the host to the Lightsail container.\n */\nconst PASSTHROUGH_ENV_VARS = ['DATABASE_URL', 'AUTH_SECRET', 'PUBLIC_URL', 'NODE_ENV'] as const\n\n/**\n * Lightsail service names must be 2-255 chars, lowercase alphanumeric and hyphens only.\n */\nfunction sanitizeLightsailName(name: string): string {\n\treturn (\n\t\tname\n\t\t\t.toLowerCase()\n\t\t\t.replace(/[^a-z0-9-]/g, '-')\n\t\t\t.replace(/-{2,}/g, '-')\n\t\t\t.replace(/^-|-$/g, '')\n\t\t\t.slice(0, 255) || 'kora-app'\n\t)\n}\n\nfunction parseLightsailImageRef(output: string): string | null {\n\t// The push output contains a line like: \"Refer to this image as `:service.label.N` ...\"\n\tconst match = output.match(/Refer to this image as\\s+\"?(:[^\"\\s]+)\"?/i)\n\tif (match?.[1]) {\n\t\treturn match[1]\n\t}\n\t// Fallback: look for the image reference pattern\n\tconst refMatch = output.match(/(:\\S+\\.\\S+\\.\\d+)/)\n\treturn refMatch?.[1] ?? null\n}\n\nfunction parseLightsailUrl(rawJson: string): string | null {\n\ttry {\n\t\tconst parsed = JSON.parse(rawJson) as {\n\t\t\tcontainerServices?: Array<{ url?: string }>\n\t\t}\n\t\tconst url = parsed.containerServices?.[0]?.url\n\t\tif (typeof url === 'string' && url.length > 0) {\n\t\t\treturn url.startsWith('https://') ? url : `https://${url}`\n\t\t}\n\t\treturn null\n\t} catch {\n\t\treturn null\n\t}\n}\n\ninterface DeploymentConfig {\n\tcontainers: Record<string, unknown>\n\tpublicEndpoint: Record<string, unknown>\n}\n\nfunction parsePreviousDeployment(rawJson: string, serviceName: string): DeploymentConfig | null {\n\ttry {\n\t\tconst parsed = JSON.parse(rawJson) as {\n\t\t\tdeployments?: Array<{\n\t\t\t\tstate: string\n\t\t\t\tcontainers: Record<string, unknown>\n\t\t\t\tpublicEndpoint: Record<string, unknown>\n\t\t\t}>\n\t\t}\n\t\tconst deployments = parsed.deployments ?? []\n\t\t// Find the second deployment (index 1) — first is current, second is previous\n\t\tconst previous = deployments.length > 1 ? deployments[1] : null\n\t\tif (!previous) return null\n\n\t\treturn {\n\t\t\tcontainers: previous.containers,\n\t\t\tpublicEndpoint: previous.publicEndpoint,\n\t\t}\n\t} catch {\n\t\treturn null\n\t}\n}\n\nfunction inferLogLevel(line: string): LogLine['level'] {\n\tconst normalized = line.toLowerCase()\n\tif (normalized.includes('error')) return 'error'\n\tif (normalized.includes('warn')) return 'warn'\n\tif (normalized.includes('debug')) return 'debug'\n\treturn 'info'\n}\n","import { spawn } from 'node:child_process'\nimport { join } from 'node:path'\nimport { createLogger } from '../../../utils/logger'\nimport { writeFlyTomlArtifact } from '../artifacts/fly-toml-generator'\nimport { buildClient } from '../builder/client-builder'\nimport { bundleServer } from '../builder/server-bundler'\nimport type {\n\tBuildArtifacts,\n\tContextAwareDeployAdapter,\n\tDeployResult,\n\tDeploymentStatus,\n\tLogLine,\n\tLogOptions,\n\tProjectConfig,\n\tProvisionResult,\n} from './adapter'\n\n/**\n * Execution abstraction for Fly CLI shell interactions.\n * This keeps FlyAdapter deterministic and fully mockable in tests.\n */\nexport interface FlyCommandRunner {\n\trun(command: string, args: string[], cwd: string): Promise<FlyCommandResult>\n}\n\nexport interface FlyCommandResult {\n\texitCode: number\n\tstdout: string\n\tstderr: string\n}\n\nexport interface FlyAdapterOptions {\n\trunner?: FlyCommandRunner\n\tcontext?: FlyAdapterContext\n\tcommandCandidates?: readonly string[]\n}\n\n/**\n * Fly.io deploy adapter implementation for Phase 13.\n */\nexport class FlyAdapter implements ContextAwareDeployAdapter {\n\tpublic readonly name = 'fly' as const\n\n\tprivate readonly logger = createLogger()\n\tprivate readonly runner: FlyCommandRunner\n\tprivate readonly commandCandidates: readonly string[]\n\tprivate flyCommand: string | null = null\n\tprivate currentContext: FlyAdapterContext | null\n\tprivate lastDeploymentId: string | null = null\n\n\tpublic constructor(options: FlyAdapterOptions = {}) {\n\t\tthis.runner = options.runner ?? new NodeFlyCommandRunner()\n\t\tthis.commandCandidates = options.commandCandidates ?? DEFAULT_FLY_COMMAND_CANDIDATES\n\t\tthis.currentContext = options.context ?? null\n\t}\n\n\t/**\n\t * Seeds runtime context for non-provisioning commands.\n\t */\n\tpublic setContext(context: FlyAdapterContext): void {\n\t\tthis.currentContext = context\n\t}\n\n\t/**\n\t * Checks whether a Fly CLI executable can be resolved.\n\t */\n\tpublic async detect(): Promise<boolean> {\n\t\tconst command = await this.tryResolveFlyCommand(process.cwd())\n\t\treturn command !== null\n\t}\n\n\t/**\n\t * Ensures Fly CLI is available before deployment.\n\t */\n\tpublic async install(): Promise<void> {\n\t\tconst available = await this.detect()\n\t\tif (!available) {\n\t\t\tthrow new Error(\n\t\t\t\t'Fly CLI is required but not installed. Install from https://fly.io/docs/hands-on/install-flyctl/.',\n\t\t\t)\n\t\t}\n\t}\n\n\t/**\n\t * Performs Fly authentication check/login.\n\t */\n\tpublic async authenticate(): Promise<void> {\n\t\tconst projectRoot = this.currentContext?.projectRoot ?? process.cwd()\n\t\tconst status = await this.runFlyCommand(['auth', 'whoami', '--json'], projectRoot, false)\n\t\tif (status.exitCode === 0) return\n\n\t\tconst login = await this.runFlyCommand(['auth', 'login'], projectRoot, true)\n\t\tif (login.exitCode !== 0) {\n\t\t\tthrow new Error(`Fly authentication failed: ${normalizeError(login.stderr, login.stdout)}`)\n\t\t}\n\t}\n\n\t/**\n\t * Provisions app and optionally region-bound resources in Fly.\n\t */\n\tpublic async provision(config: ProjectConfig): Promise<ProvisionResult> {\n\t\tthis.currentContext = {\n\t\t\tprojectRoot: config.projectRoot,\n\t\t\tappName: config.appName,\n\t\t\tregion: config.region ?? 'iad',\n\t\t}\n\n\t\tconst appCreateArgs = ['apps', 'create', config.appName]\n\n\t\tconst createApp = await this.runFlyCommand(appCreateArgs, config.projectRoot, false)\n\t\tif (createApp.exitCode !== 0 && !isAlreadyExistsResponse(createApp.stderr, createApp.stdout)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Fly app provisioning failed for \"${config.appName}\": ${normalizeError(createApp.stderr, createApp.stdout)}`,\n\t\t\t)\n\t\t}\n\n\t\tconst secrets: string[] = []\n\t\tconst portSecret = await this.runFlyCommand(\n\t\t\t['secrets', 'set', 'PORT=3000', '--app', config.appName],\n\t\t\tconfig.projectRoot,\n\t\t\tfalse,\n\t\t)\n\t\tif (portSecret.exitCode === 0) {\n\t\t\tsecrets.push('PORT')\n\t\t}\n\n\t\treturn {\n\t\t\tapplicationId: config.appName,\n\t\t\tdatabaseId: null,\n\t\t\tsecretsSet: secrets,\n\t\t}\n\t}\n\n\t/**\n\t * Builds local artifacts consumed by Fly deploy.\n\t */\n\tpublic async build(config: ProjectConfig): Promise<BuildArtifacts> {\n\t\tthis.currentContext = {\n\t\t\tprojectRoot: config.projectRoot,\n\t\t\tappName: config.appName,\n\t\t\tregion: config.region,\n\t\t}\n\t\tconst deployDirectory = join(config.projectRoot, '.kora', 'deploy')\n\t\tawait writeFlyTomlArtifact(deployDirectory, {\n\t\t\tappName: config.appName,\n\t\t\tregion: config.region ?? 'iad',\n\t\t})\n\n\t\tawait bundleServer({\n\t\t\tprojectRoot: config.projectRoot,\n\t\t\tdeployDirectory,\n\t\t})\n\t\tconst client =\n\t\t\tconfig.deployTarget === 'sync-server'\n\t\t\t\t? null\n\t\t\t\t: await buildClient({\n\t\t\t\t\t\tprojectRoot: config.projectRoot,\n\t\t\t\t\t\toutDir: join(deployDirectory, 'dist'),\n\t\t\t\t\t\tmode: 'production',\n\t\t\t\t\t})\n\n\t\treturn {\n\t\t\tclientDirectory: client?.outDir ?? null,\n\t\t\tserverBundlePath: join(deployDirectory, 'server-bundled.js'),\n\t\t\tdeployDirectory,\n\t\t}\n\t}\n\n\t/**\n\t * Deploys generated artifacts to Fly and returns live endpoints.\n\t */\n\tpublic async deploy(artifacts: BuildArtifacts): Promise<DeployResult> {\n\t\tconst context = this.requireContext()\n\t\tconst deploy = await this.runFlyCommand(\n\t\t\t['deploy', '--config', 'fly.toml', '--app', context.appName],\n\t\t\tartifacts.deployDirectory,\n\t\t\ttrue,\n\t\t)\n\t\tif (deploy.exitCode !== 0) {\n\t\t\tthrow new Error(`Fly deployment failed: ${normalizeError(deploy.stderr, deploy.stdout)}`)\n\t\t}\n\n\t\tconst info = await this.runFlyCommand(\n\t\t\t['status', '--app', context.appName, '--json'],\n\t\t\tcontext.projectRoot,\n\t\t\tfalse,\n\t\t)\n\t\tconst hostname = parseFlyHostname(info.stdout) ?? `${context.appName}.fly.dev`\n\t\tconst deploymentId = parseFlyDeploymentId(info.stdout) ?? new Date().toISOString()\n\t\tthis.lastDeploymentId = deploymentId\n\n\t\treturn {\n\t\t\tdeploymentId,\n\t\t\tliveUrl: `https://${hostname}`,\n\t\t\tsyncUrl: `wss://${hostname}/kora-sync`,\n\t\t}\n\t}\n\n\t/**\n\t * Rolls back to a deployment version.\n\t */\n\tpublic async rollback(deploymentId: string): Promise<void> {\n\t\tconst context = this.requireContext()\n\t\tconst rollback = await this.runFlyCommand(\n\t\t\t['releases', 'revert', deploymentId, '--app', context.appName],\n\t\t\tcontext.projectRoot,\n\t\t\ttrue,\n\t\t)\n\t\tif (rollback.exitCode !== 0) {\n\t\t\tthrow new Error(`Fly rollback failed: ${normalizeError(rollback.stderr, rollback.stdout)}`)\n\t\t}\n\t}\n\n\t/**\n\t * Returns deployment logs as an async iterable.\n\t */\n\tpublic async *logs(options: LogOptions): AsyncIterable<LogLine> {\n\t\tconst context = this.requireContext()\n\t\tconst args = ['logs', '--app', context.appName, '--no-tail']\n\t\tif (typeof options.since === 'string' && options.since.length > 0) {\n\t\t\targs.push('--region', options.since)\n\t\t}\n\t\tconst result = await this.runFlyCommand(args, context.projectRoot, false)\n\t\tif (result.exitCode !== 0) {\n\t\t\tthrow new Error(`Fly logs failed: ${normalizeError(result.stderr, result.stdout)}`)\n\t\t}\n\n\t\tconst lines = result.stdout.split(/\\r?\\n/).filter((line) => line.length > 0)\n\t\tfor (const line of lines) {\n\t\t\tyield {\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\tlevel: inferLogLevel(line),\n\t\t\t\tmessage: line,\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Reads current deployment status from Fly.\n\t */\n\tpublic async status(): Promise<DeploymentStatus> {\n\t\tconst context = this.requireContext()\n\t\tconst status = await this.runFlyCommand(\n\t\t\t['status', '--app', context.appName, '--json'],\n\t\t\tcontext.projectRoot,\n\t\t\tfalse,\n\t\t)\n\t\tif (status.exitCode !== 0) {\n\t\t\treturn {\n\t\t\t\tstate: 'failed',\n\t\t\t\tmessage: normalizeError(status.stderr, status.stdout),\n\t\t\t}\n\t\t}\n\n\t\tconst hostname = parseFlyHostname(status.stdout)\n\t\treturn {\n\t\t\tstate: 'healthy',\n\t\t\tmessage: 'Fly deployment is healthy.',\n\t\t\tliveUrl: hostname ? `https://${hostname}` : undefined,\n\t\t}\n\t}\n\n\tprivate async runFlyCommand(\n\t\tflyArgs: string[],\n\t\tcwd: string,\n\t\tinheritOutput: boolean,\n\t): Promise<FlyCommandResult> {\n\t\tconst flyBinary = await this.resolveFlyCommand(cwd)\n\n\t\tif (inheritOutput) {\n\t\t\tthis.logger.step(`fly ${flyArgs.join(' ')}`)\n\t\t}\n\t\treturn await this.runner.run(flyBinary, flyArgs, cwd)\n\t}\n\n\tprivate requireContext(): FlyAdapterContext {\n\t\tif (!this.currentContext) {\n\t\t\tthrow new Error('Fly adapter context is not initialized. Run provision() first.')\n\t\t}\n\t\treturn this.currentContext\n\t}\n\n\tprivate async resolveFlyCommand(cwd: string): Promise<string> {\n\t\tif (this.flyCommand) {\n\t\t\treturn this.flyCommand\n\t\t}\n\n\t\tconst resolved = await this.tryResolveFlyCommand(cwd)\n\t\tif (!resolved) {\n\t\t\tthrow new Error('Could not resolve a usable Fly CLI command (tried flyctl, fly).')\n\t\t}\n\t\tthis.flyCommand = resolved\n\t\treturn resolved\n\t}\n\n\tprivate async tryResolveFlyCommand(cwd: string): Promise<string | null> {\n\t\tfor (const command of this.commandCandidates) {\n\t\t\tconst versionCheck = await this.runner.run(command, ['version'], cwd)\n\t\t\tif (versionCheck.exitCode === 0) {\n\t\t\t\treturn command\n\t\t\t}\n\t\t}\n\n\t\treturn null\n\t}\n}\n\n/**\n * Default subprocess-backed runner for Fly commands.\n */\nexport class NodeFlyCommandRunner implements FlyCommandRunner {\n\tpublic async run(command: string, args: string[], cwd: string): Promise<FlyCommandResult> {\n\t\treturn await new Promise<FlyCommandResult>((resolve) => {\n\t\t\tconst child = spawn(command, args, {\n\t\t\t\tcwd,\n\t\t\t\tenv: process.env,\n\t\t\t\tstdio: ['ignore', 'pipe', 'pipe'],\n\t\t\t})\n\n\t\t\tlet stdout = ''\n\t\t\tlet stderr = ''\n\t\t\tchild.stdout?.on('data', (chunk: Buffer) => {\n\t\t\t\tstdout += chunk.toString('utf-8')\n\t\t\t})\n\t\t\tchild.stderr?.on('data', (chunk: Buffer) => {\n\t\t\t\tstderr += chunk.toString('utf-8')\n\t\t\t})\n\t\t\tchild.on('error', (error) => {\n\t\t\t\tresolve({\n\t\t\t\t\texitCode: 1,\n\t\t\t\t\tstdout,\n\t\t\t\t\tstderr: `${stderr}\\n${error.message}`,\n\t\t\t\t})\n\t\t\t})\n\t\t\tchild.on('exit', (code) => {\n\t\t\t\tresolve({\n\t\t\t\t\texitCode: code ?? 1,\n\t\t\t\t\tstdout: stdout.trim(),\n\t\t\t\t\tstderr: stderr.trim(),\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t}\n}\n\nexport interface FlyAdapterContext {\n\tprojectRoot: string\n\tappName: string\n\tregion: string | null\n}\n\nconst DEFAULT_FLY_COMMAND_CANDIDATES = ['flyctl', 'fly'] as const\n\nfunction parseFlyHostname(rawJson: string): string | null {\n\tconst parsed = parseJsonRecord(rawJson)\n\tif (!parsed) return null\n\n\tconst hostname = parsed.Hostname\n\tif (typeof hostname === 'string' && hostname.length > 0) {\n\t\treturn hostname\n\t}\n\n\tconst hostnames = parsed.Hostnames\n\tif (Array.isArray(hostnames)) {\n\t\tconst first = hostnames.find((item) => typeof item === 'string')\n\t\tif (typeof first === 'string' && first.length > 0) {\n\t\t\treturn first\n\t\t}\n\t}\n\n\treturn null\n}\n\nfunction parseFlyDeploymentId(rawJson: string): string | null {\n\tconst parsed = parseJsonRecord(rawJson)\n\tif (!parsed) return null\n\n\tconst deploymentId = parsed.DeploymentID\n\tif (typeof deploymentId === 'string' && deploymentId.length > 0) {\n\t\treturn deploymentId\n\t}\n\n\tconst latestDeployment = parsed.LatestDeployment\n\tif (typeof latestDeployment === 'object' && latestDeployment !== null) {\n\t\tconst id = (latestDeployment as Record<string, unknown>).ID\n\t\tif (typeof id === 'string' && id.length > 0) {\n\t\t\treturn id\n\t\t}\n\t}\n\n\treturn null\n}\n\nfunction parseJsonRecord(value: string): Record<string, unknown> | null {\n\ttry {\n\t\tconst parsed = JSON.parse(value) as unknown\n\t\tif (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n\t\t\treturn parsed as Record<string, unknown>\n\t\t}\n\t\treturn null\n\t} catch {\n\t\treturn null\n\t}\n}\n\nfunction inferLogLevel(line: string): LogLine['level'] {\n\tconst normalized = line.toLowerCase()\n\tif (normalized.includes('error')) return 'error'\n\tif (normalized.includes('warn')) return 'warn'\n\tif (normalized.includes('debug')) return 'debug'\n\treturn 'info'\n}\n\nfunction normalizeError(stderr: string, stdout: string): string {\n\tif (stderr.length > 0) return stderr\n\tif (stdout.length > 0) return stdout\n\treturn 'unknown fly CLI error'\n}\n\nfunction isAlreadyExistsResponse(stderr: string, stdout: string): boolean {\n\tconst text = `${stderr}\\n${stdout}`.toLowerCase()\n\treturn text.includes('already exists') || text.includes('already been taken')\n}\n","import { mkdir, writeFile } from 'node:fs/promises'\nimport { join } from 'node:path'\n\nconst GENERATED_HEADER = '# Generated by kora deploy — do not edit manually'\n\n/**\n * Configuration options used to render `fly.toml`.\n */\nexport interface FlyTomlOptions {\n\tappName: string\n\tregion: string\n\tinternalPort?: number\n}\n\n/**\n * Generates a minimal Fly.io configuration file for Kora sync apps.\n */\nexport function generateFlyToml(options: FlyTomlOptions): string {\n\tconst internalPort = options.internalPort ?? 3000\n\n\treturn [\n\t\tGENERATED_HEADER,\n\t\t'',\n\t\t`app = \"${options.appName}\"`,\n\t\t`primary_region = \"${options.region}\"`,\n\t\t'',\n\t\t'[build]',\n\t\t` dockerfile = \"Dockerfile\"`,\n\t\t'',\n\t\t'[http_service]',\n\t\t` internal_port = ${String(internalPort)}`,\n\t\t' force_https = true',\n\t\t' auto_stop_machines = \"stop\"',\n\t\t' auto_start_machines = true',\n\t\t' min_machines_running = 0',\n\t\t'',\n\t\t' [[http_service.checks]]',\n\t\t' grace_period = \"10s\"',\n\t\t' interval = \"30s\"',\n\t\t' method = \"GET\"',\n\t\t' timeout = \"5s\"',\n\t\t' path = \"/health\"',\n\t\t'',\n\t].join('\\n')\n}\n\n/**\n * Writes `fly.toml` into `.kora/deploy`.\n */\nexport async function writeFlyTomlArtifact(\n\tdeployDirectory: string,\n\toptions: FlyTomlOptions,\n): Promise<string> {\n\tawait mkdir(deployDirectory, { recursive: true })\n\tconst filePath = join(deployDirectory, 'fly.toml')\n\tawait writeFile(filePath, generateFlyToml(options), 'utf-8')\n\treturn filePath\n}\n","import { spawn } from 'node:child_process'\nimport { join } from 'node:path'\nimport { createLogger } from '../../../utils/logger'\nimport { writeRailwayJsonArtifact } from '../artifacts/railway-json-generator'\nimport { buildClient } from '../builder/client-builder'\nimport { bundleServer } from '../builder/server-bundler'\nimport type {\n\tBuildArtifacts,\n\tContextAwareDeployAdapter,\n\tDeployResult,\n\tDeploymentStatus,\n\tLogLine,\n\tLogOptions,\n\tProjectConfig,\n\tProvisionResult,\n} from './adapter'\n\n/**\n * Execution abstraction for Railway CLI shell interactions.\n */\nexport interface RailwayCommandRunner {\n\trun(command: string, args: string[], cwd: string): Promise<RailwayCommandResult>\n}\n\nexport interface RailwayCommandResult {\n\texitCode: number\n\tstdout: string\n\tstderr: string\n}\n\nexport interface RailwayAdapterOptions {\n\trunner?: RailwayCommandRunner\n\tcontext?: RailwayAdapterContext\n\tcommandCandidates?: readonly string[]\n}\n\n/**\n * Railway deploy adapter implementation for Phase 13.\n */\nexport class RailwayAdapter implements ContextAwareDeployAdapter {\n\tpublic readonly name = 'railway' as const\n\n\tprivate readonly logger = createLogger()\n\tprivate readonly runner: RailwayCommandRunner\n\tprivate readonly commandCandidates: readonly string[]\n\tprivate railwayCommand: string | null = null\n\tprivate currentContext: RailwayAdapterContext | null\n\tprivate lastDeploymentId: string | null = null\n\n\tpublic constructor(options: RailwayAdapterOptions = {}) {\n\t\tthis.runner = options.runner ?? new NodeRailwayCommandRunner()\n\t\tthis.commandCandidates = options.commandCandidates ?? DEFAULT_RAILWAY_COMMAND_CANDIDATES\n\t\tthis.currentContext = options.context ?? null\n\t}\n\n\tpublic setContext(context: RailwayAdapterContext): void {\n\t\tthis.currentContext = context\n\t}\n\n\tpublic async detect(): Promise<boolean> {\n\t\tconst command = await this.tryResolveRailwayCommand(process.cwd())\n\t\treturn command !== null\n\t}\n\n\tpublic async install(): Promise<void> {\n\t\tconst available = await this.detect()\n\t\tif (!available) {\n\t\t\tthrow new Error(\n\t\t\t\t'Railway CLI is required but not installed. Install with `npm i -g @railway/cli` or see https://docs.railway.com/guides/cli.',\n\t\t\t)\n\t\t}\n\t}\n\n\tpublic async authenticate(): Promise<void> {\n\t\tconst projectRoot = this.currentContext?.projectRoot ?? process.cwd()\n\t\tconst whoami = await this.runRailwayCommand(['whoami'], projectRoot, false)\n\t\tif (whoami.exitCode === 0) return\n\n\t\tconst login = await this.runRailwayCommand(['login'], projectRoot, true)\n\t\tif (login.exitCode !== 0) {\n\t\t\tthrow new Error(\n\t\t\t\t`Railway authentication failed: ${normalizeError(login.stderr, login.stdout)}`,\n\t\t\t)\n\t\t}\n\t}\n\n\tpublic async provision(config: ProjectConfig): Promise<ProvisionResult> {\n\t\tthis.currentContext = {\n\t\t\tprojectRoot: config.projectRoot,\n\t\t\tappName: config.appName,\n\t\t\tregion: config.region,\n\t\t}\n\n\t\tconst init = await this.runRailwayCommand(\n\t\t\t['init', '--name', config.appName, '--confirm'],\n\t\t\tconfig.projectRoot,\n\t\t\tfalse,\n\t\t)\n\t\tif (init.exitCode !== 0 && !isAlreadyExistsResponse(init.stderr, init.stdout)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Railway project provisioning failed for \"${config.appName}\": ${normalizeError(init.stderr, init.stdout)}`,\n\t\t\t)\n\t\t}\n\n\t\tconst link = await this.runRailwayCommand(\n\t\t\t['link', '--project', config.appName, '--environment', config.environment, '--yes'],\n\t\t\tconfig.projectRoot,\n\t\t\tfalse,\n\t\t)\n\t\tif (link.exitCode !== 0 && !isAlreadyExistsResponse(link.stderr, link.stdout)) {\n\t\t\tthrow new Error(`Railway link failed: ${normalizeError(link.stderr, link.stdout)}`)\n\t\t}\n\n\t\tconst vars: string[] = []\n\t\tconst setPort = await this.runRailwayCommand(\n\t\t\t['variables', 'set', 'PORT=3000', '--yes'],\n\t\t\tconfig.projectRoot,\n\t\t\tfalse,\n\t\t)\n\t\tif (setPort.exitCode === 0) {\n\t\t\tvars.push('PORT')\n\t\t}\n\n\t\treturn {\n\t\t\tapplicationId: config.appName,\n\t\t\tdatabaseId: null,\n\t\t\tsecretsSet: vars,\n\t\t}\n\t}\n\n\tpublic async build(config: ProjectConfig): Promise<BuildArtifacts> {\n\t\tthis.currentContext = {\n\t\t\tprojectRoot: config.projectRoot,\n\t\t\tappName: config.appName,\n\t\t\tregion: config.region,\n\t\t}\n\t\tconst deployDirectory = join(config.projectRoot, '.kora', 'deploy')\n\t\tawait writeRailwayJsonArtifact(deployDirectory, {\n\t\t\tappName: config.appName,\n\t\t\tenvironment: config.environment,\n\t\t})\n\n\t\tawait bundleServer({\n\t\t\tprojectRoot: config.projectRoot,\n\t\t\tdeployDirectory,\n\t\t})\n\t\tconst client =\n\t\t\tconfig.deployTarget === 'sync-server'\n\t\t\t\t? null\n\t\t\t\t: await buildClient({\n\t\t\t\t\t\tprojectRoot: config.projectRoot,\n\t\t\t\t\t\toutDir: join(deployDirectory, 'dist'),\n\t\t\t\t\t\tmode: 'production',\n\t\t\t\t\t})\n\n\t\treturn {\n\t\t\tclientDirectory: client?.outDir ?? null,\n\t\t\tserverBundlePath: join(deployDirectory, 'server-bundled.js'),\n\t\t\tdeployDirectory,\n\t\t}\n\t}\n\n\tpublic async deploy(artifacts: BuildArtifacts): Promise<DeployResult> {\n\t\tconst context = this.requireContext()\n\t\tconst up = await this.runRailwayCommand(['up', '--yes'], artifacts.deployDirectory, true)\n\t\tif (up.exitCode !== 0) {\n\t\t\tthrow new Error(`Railway deployment failed: ${normalizeError(up.stderr, up.stdout)}`)\n\t\t}\n\n\t\tconst status = await this.runRailwayCommand(['status', '--json'], context.projectRoot, false)\n\t\tconst deploymentId = parseRailwayDeploymentId(status.stdout) ?? new Date().toISOString()\n\t\tconst liveUrl = parseRailwayUrl(status.stdout) ?? `https://${context.appName}.up.railway.app`\n\t\tthis.lastDeploymentId = deploymentId\n\n\t\treturn {\n\t\t\tdeploymentId,\n\t\t\tliveUrl,\n\t\t\tsyncUrl: toSyncUrl(liveUrl),\n\t\t}\n\t}\n\n\tpublic async rollback(deploymentId: string): Promise<void> {\n\t\tconst context = this.requireContext()\n\t\tconst rollback = await this.runRailwayCommand(\n\t\t\t['redeploy', '--deployment', deploymentId, '--yes'],\n\t\t\tcontext.projectRoot,\n\t\t\ttrue,\n\t\t)\n\t\tif (rollback.exitCode !== 0) {\n\t\t\tthrow new Error(\n\t\t\t\t`Railway rollback failed: ${normalizeError(rollback.stderr, rollback.stdout)}`,\n\t\t\t)\n\t\t}\n\t}\n\n\tpublic async *logs(options: LogOptions): AsyncIterable<LogLine> {\n\t\tconst context = this.requireContext()\n\t\tconst args = ['logs']\n\t\tif (typeof options.tail === 'number' && options.tail > 0) {\n\t\t\targs.push('--lines', String(options.tail))\n\t\t}\n\n\t\tconst result = await this.runRailwayCommand(args, context.projectRoot, false)\n\t\tif (result.exitCode !== 0) {\n\t\t\tthrow new Error(`Railway logs failed: ${normalizeError(result.stderr, result.stdout)}`)\n\t\t}\n\n\t\tconst lines = result.stdout.split(/\\r?\\n/).filter((line) => line.length > 0)\n\t\tfor (const line of lines) {\n\t\t\tyield {\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\tlevel: inferLogLevel(line),\n\t\t\t\tmessage: line,\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic async status(): Promise<DeploymentStatus> {\n\t\tconst context = this.requireContext()\n\t\tconst status = await this.runRailwayCommand(['status', '--json'], context.projectRoot, false)\n\t\tif (status.exitCode !== 0) {\n\t\t\treturn {\n\t\t\t\tstate: 'failed',\n\t\t\t\tmessage: normalizeError(status.stderr, status.stdout),\n\t\t\t}\n\t\t}\n\n\t\tconst liveUrl = parseRailwayUrl(status.stdout)\n\t\treturn {\n\t\t\tstate: 'healthy',\n\t\t\tmessage: 'Railway deployment is healthy.',\n\t\t\tliveUrl: liveUrl ?? undefined,\n\t\t}\n\t}\n\n\tprivate async runRailwayCommand(\n\t\trailwayArgs: string[],\n\t\tcwd: string,\n\t\tinheritOutput: boolean,\n\t): Promise<RailwayCommandResult> {\n\t\tconst command = await this.resolveRailwayCommand(cwd)\n\t\tif (inheritOutput) {\n\t\t\tthis.logger.step(`railway ${railwayArgs.join(' ')}`)\n\t\t}\n\t\treturn await this.runner.run(command, railwayArgs, cwd)\n\t}\n\n\tprivate requireContext(): RailwayAdapterContext {\n\t\tif (!this.currentContext) {\n\t\t\tthrow new Error('Railway adapter context is not initialized. Run provision() first.')\n\t\t}\n\t\treturn this.currentContext\n\t}\n\n\tprivate async resolveRailwayCommand(cwd: string): Promise<string> {\n\t\tif (this.railwayCommand) {\n\t\t\treturn this.railwayCommand\n\t\t}\n\t\tconst resolved = await this.tryResolveRailwayCommand(cwd)\n\t\tif (!resolved) {\n\t\t\tthrow new Error('Could not resolve a usable Railway CLI command (tried railway).')\n\t\t}\n\t\tthis.railwayCommand = resolved\n\t\treturn resolved\n\t}\n\n\tprivate async tryResolveRailwayCommand(cwd: string): Promise<string | null> {\n\t\tfor (const command of this.commandCandidates) {\n\t\t\tconst version = await this.runner.run(command, ['--version'], cwd)\n\t\t\tif (version.exitCode === 0) {\n\t\t\t\treturn command\n\t\t\t}\n\t\t}\n\t\treturn null\n\t}\n}\n\n/**\n * Default subprocess-backed runner for Railway commands.\n */\nexport class NodeRailwayCommandRunner implements RailwayCommandRunner {\n\tpublic async run(command: string, args: string[], cwd: string): Promise<RailwayCommandResult> {\n\t\treturn await new Promise<RailwayCommandResult>((resolve) => {\n\t\t\tconst child = spawn(command, args, {\n\t\t\t\tcwd,\n\t\t\t\tenv: process.env,\n\t\t\t\tstdio: ['ignore', 'pipe', 'pipe'],\n\t\t\t})\n\n\t\t\tlet stdout = ''\n\t\t\tlet stderr = ''\n\t\t\tchild.stdout?.on('data', (chunk: Buffer) => {\n\t\t\t\tstdout += chunk.toString('utf-8')\n\t\t\t})\n\t\t\tchild.stderr?.on('data', (chunk: Buffer) => {\n\t\t\t\tstderr += chunk.toString('utf-8')\n\t\t\t})\n\t\t\tchild.on('error', (error) => {\n\t\t\t\tresolve({\n\t\t\t\t\texitCode: 1,\n\t\t\t\t\tstdout,\n\t\t\t\t\tstderr: `${stderr}\\n${error.message}`,\n\t\t\t\t})\n\t\t\t})\n\t\t\tchild.on('exit', (code) => {\n\t\t\t\tresolve({\n\t\t\t\t\texitCode: code ?? 1,\n\t\t\t\t\tstdout: stdout.trim(),\n\t\t\t\t\tstderr: stderr.trim(),\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t}\n}\n\nexport interface RailwayAdapterContext {\n\tprojectRoot: string\n\tappName: string\n\tregion: string | null\n}\n\nconst DEFAULT_RAILWAY_COMMAND_CANDIDATES = ['railway'] as const\n\nfunction parseRailwayUrl(rawJson: string): string | null {\n\tconst record = parseJsonRecord(rawJson)\n\tif (!record) return null\n\n\tconst url = record.url\n\tif (typeof url === 'string' && url.length > 0) {\n\t\treturn ensureHttpsUrl(url)\n\t}\n\n\tconst service = record.service\n\tif (typeof service === 'object' && service !== null) {\n\t\tconst domain = (service as Record<string, unknown>).domain\n\t\tif (typeof domain === 'string' && domain.length > 0) {\n\t\t\treturn ensureHttpsUrl(domain)\n\t\t}\n\t}\n\n\treturn null\n}\n\nfunction parseRailwayDeploymentId(rawJson: string): string | null {\n\tconst record = parseJsonRecord(rawJson)\n\tif (!record) return null\n\n\tconst deploymentId = record.deploymentId\n\tif (typeof deploymentId === 'string' && deploymentId.length > 0) {\n\t\treturn deploymentId\n\t}\n\n\tconst deployment = record.deployment\n\tif (typeof deployment === 'object' && deployment !== null) {\n\t\tconst id = (deployment as Record<string, unknown>).id\n\t\tif (typeof id === 'string' && id.length > 0) {\n\t\t\treturn id\n\t\t}\n\t}\n\n\treturn null\n}\n\nfunction parseJsonRecord(value: string): Record<string, unknown> | null {\n\ttry {\n\t\tconst parsed = JSON.parse(value) as unknown\n\t\tif (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n\t\t\treturn parsed as Record<string, unknown>\n\t\t}\n\t\treturn null\n\t} catch {\n\t\treturn null\n\t}\n}\n\nfunction toSyncUrl(liveUrl: string): string | null {\n\ttry {\n\t\tconst url = new URL(liveUrl)\n\t\turl.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:'\n\t\turl.pathname = '/kora-sync'\n\t\treturn url.toString().replace(/\\/$/, '')\n\t} catch {\n\t\treturn null\n\t}\n}\n\nfunction ensureHttpsUrl(value: string): string {\n\tif (value.startsWith('http://') || value.startsWith('https://')) {\n\t\treturn value\n\t}\n\treturn `https://${value}`\n}\n\nfunction inferLogLevel(line: string): LogLine['level'] {\n\tconst normalized = line.toLowerCase()\n\tif (normalized.includes('error')) return 'error'\n\tif (normalized.includes('warn')) return 'warn'\n\tif (normalized.includes('debug')) return 'debug'\n\treturn 'info'\n}\n\nfunction normalizeError(stderr: string, stdout: string): string {\n\tif (stderr.length > 0) return stderr\n\tif (stdout.length > 0) return stdout\n\treturn 'unknown railway CLI error'\n}\n\nfunction isAlreadyExistsResponse(stderr: string, stdout: string): boolean {\n\tconst text = `${stderr}\\n${stdout}`.toLowerCase()\n\treturn text.includes('already exists')\n}\n","import { mkdir, writeFile } from 'node:fs/promises'\nimport { join } from 'node:path'\n\nconst GENERATED_HEADER = 'Generated by kora deploy - do not edit manually.'\n\n/**\n * Configuration used to render `railway.json`.\n */\nexport interface RailwayJsonOptions {\n\tappName: string\n\tregion?: string\n\tenvironment?: string\n\tstartCommand?: string\n\thealthcheckPath?: string\n}\n\ninterface RailwayJsonFile {\n\t$schema: string\n\tbuild: {\n\t\tbuilder: string\n\t\tdockerfilePath: string\n\t}\n\tdeploy: {\n\t\tstartCommand: string\n\t\thealthcheckPath: string\n\t\trestartPolicyType: 'on_failure'\n\t\trestartPolicyMaxRetries: number\n\t}\n\tmetadata: {\n\t\tgeneratedBy: string\n\t\tappName: string\n\t\tregion: string | undefined\n\t}\n}\n\n/**\n * Generates Railway deployment configuration in JSON format.\n */\nexport function generateRailwayJson(options: RailwayJsonOptions): string {\n\tconst file: RailwayJsonFile = {\n\t\t$schema: 'https://railway.app/railway.schema.json',\n\t\tbuild: {\n\t\t\tbuilder: 'DOCKERFILE',\n\t\t\tdockerfilePath: 'Dockerfile',\n\t\t},\n\t\tdeploy: {\n\t\t\tstartCommand: options.startCommand ?? 'node ./server-bundled.js',\n\t\t\thealthcheckPath: options.healthcheckPath ?? '/health',\n\t\t\trestartPolicyType: 'on_failure',\n\t\t\trestartPolicyMaxRetries: 3,\n\t\t},\n\t\tmetadata: {\n\t\t\tgeneratedBy: GENERATED_HEADER,\n\t\t\tappName: options.appName,\n\t\t\tregion: options.region,\n\t\t},\n\t}\n\n\treturn `${JSON.stringify(file, null, 2)}\\n`\n}\n\n/**\n * Writes `railway.json` into `.kora/deploy`.\n */\nexport async function writeRailwayJsonArtifact(\n\tdeployDirectory: string,\n\toptions: RailwayJsonOptions,\n): Promise<string> {\n\tawait mkdir(deployDirectory, { recursive: true })\n\tconst filePath = join(deployDirectory, 'railway.json')\n\tawait writeFile(filePath, generateRailwayJson(options), 'utf-8')\n\treturn filePath\n}\n","import type {\n\tBuildArtifacts,\n\tContextAwareDeployAdapter,\n\tDeployPlatform,\n\tDeployResult,\n\tDeploymentStatus,\n\tLogLine,\n\tLogOptions,\n\tProjectConfig,\n\tProvisionResult,\n} from './adapter'\n\n/**\n * Lightweight scaffold adapter used for platforms not yet implemented.\n * It provides explicit, deterministic errors while preserving the shared\n * adapter contract and command wiring across all platforms.\n */\nexport class StubDeployAdapter implements ContextAwareDeployAdapter {\n\tpublic readonly name: DeployPlatform\n\tprivate readonly contextLabel: string\n\n\tpublic constructor(platform: DeployPlatform) {\n\t\tthis.name = platform\n\t\tthis.contextLabel = `Deploy adapter \"${platform}\" is not implemented yet.`\n\t}\n\n\tpublic setContext(_context: {\n\t\tprojectRoot: string\n\t\tappName: string\n\t\tregion: string | null\n\t}): void {\n\t\t// Context is intentionally ignored for stub implementations.\n\t}\n\n\tpublic async detect(): Promise<boolean> {\n\t\treturn false\n\t}\n\n\tpublic async install(): Promise<void> {\n\t\tthrow this.notImplementedError()\n\t}\n\n\tpublic async authenticate(): Promise<void> {\n\t\tthrow this.notImplementedError()\n\t}\n\n\tpublic async provision(_config: ProjectConfig): Promise<ProvisionResult> {\n\t\tthrow this.notImplementedError()\n\t}\n\n\tpublic async build(_config: ProjectConfig): Promise<BuildArtifacts> {\n\t\tthrow this.notImplementedError()\n\t}\n\n\tpublic async deploy(_artifacts: BuildArtifacts): Promise<DeployResult> {\n\t\tthrow this.notImplementedError()\n\t}\n\n\tpublic async rollback(_deploymentId: string): Promise<void> {\n\t\tthrow this.notImplementedError()\n\t}\n\n\tpublic logs(_options: LogOptions): AsyncIterable<LogLine> {\n\t\tthrow this.notImplementedError()\n\t}\n\n\tpublic async status(): Promise<DeploymentStatus> {\n\t\treturn {\n\t\t\tstate: 'unknown',\n\t\t\tmessage: this.notImplementedMessage(),\n\t\t}\n\t}\n\n\tprivate notImplementedError(): Error {\n\t\treturn new Error(this.notImplementedMessage())\n\t}\n\n\tprivate notImplementedMessage(): string {\n\t\treturn `${this.contextLabel} Start with --platform fly for now.`\n\t}\n}\n","import type { DeployAdapter, DeployPlatform } from './adapter'\nimport { AwsEcsAdapter } from './aws-ecs-adapter'\nimport { AwsLightsailAdapter } from './aws-lightsail-adapter'\nimport { FlyAdapter } from './fly-adapter'\nimport { RailwayAdapter } from './railway-adapter'\nimport { StubDeployAdapter } from './stub-adapter'\n\n/**\n * Creates a deploy adapter instance for the selected platform.\n */\nexport function createDeployAdapter(platform: DeployPlatform): DeployAdapter {\n\tswitch (platform) {\n\t\tcase 'fly':\n\t\t\treturn new FlyAdapter()\n\t\tcase 'railway':\n\t\t\treturn new RailwayAdapter()\n\t\tcase 'aws-ecs':\n\t\t\treturn new AwsEcsAdapter()\n\t\tcase 'aws-lightsail':\n\t\t\treturn new AwsLightsailAdapter()\n\t\tcase 'render':\n\t\tcase 'docker':\n\t\tcase 'kora-cloud':\n\t\t\treturn new StubDeployAdapter(platform)\n\t\tdefault: {\n\t\t\tconst exhaustiveCheck: never = platform\n\t\t\treturn exhaustiveCheck\n\t\t}\n\t}\n}\n","import { mkdir, writeFile } from 'node:fs/promises'\nimport { join } from 'node:path'\n\nconst GENERATED_HEADER = '# Generated by kora deploy — do not edit manually'\n\n/**\n * Configuration for generating a production Dockerfile.\n */\nexport interface DockerfileOptions {\n\tnodeVersion?: string\n\tport?: number\n\tclientDirectory?: string | null\n\tserverBundleFile?: string\n\t/** Native modules that must be installed at runtime (externalized from bundle). */\n\tnativeDependencies?: Record<string, string>\n}\n\n/**\n * Generates a multi-stage Dockerfile for Kora deployments.\n *\n * The generated image expects artifacts produced under `.kora/deploy`:\n * - `dist/` for client assets\n * - `server-bundled.js` for server runtime entry\n * - `package.json` (if native dependencies are needed)\n */\nexport function generateDockerfile(options: DockerfileOptions = {}): string {\n\tconst nodeVersion = options.nodeVersion ?? '20-alpine'\n\tconst port = options.port ?? 3000\n\tconst clientDirectory = options.clientDirectory === undefined ? 'dist' : options.clientDirectory\n\tconst serverBundleFile = options.serverBundleFile ?? 'server-bundled.js'\n\tconst hasNativeDeps =\n\t\toptions.nativeDependencies && Object.keys(options.nativeDependencies).length > 0\n\n\tconst lines: string[] = [\n\t\tGENERATED_HEADER,\n\t\t'',\n\t\t`FROM node:${nodeVersion} AS runtime`,\n\t\t'WORKDIR /app',\n\t\t'ENV NODE_ENV=production',\n\t\t`ENV PORT=${String(port)}`,\n\t\t'',\n\t]\n\n\tif (hasNativeDeps) {\n\t\t// Alpine needs build tools for native modules like better-sqlite3\n\t\tlines.push('# Install build tools for native modules')\n\t\tlines.push('RUN apk add --no-cache python3 make g++')\n\t\tlines.push('')\n\t\tlines.push('COPY package.json ./package.json')\n\t\tlines.push('RUN npm install --omit=dev')\n\t\tlines.push('')\n\t}\n\n\tif (clientDirectory !== null) {\n\t\tlines.push(`COPY ${clientDirectory} ./dist`)\n\t}\n\tlines.push(`COPY ${serverBundleFile} ./server-bundled.js`)\n\tlines.push('')\n\tlines.push(`EXPOSE ${String(port)}`)\n\tlines.push('CMD [\"node\", \"./server-bundled.js\"]')\n\tlines.push('')\n\n\treturn lines.join('\\n')\n}\n\n/**\n * Generates a minimal package.json for native dependencies in the deploy container.\n */\nexport function generateDeployPackageJson(nativeDependencies: Record<string, string>): string {\n\tconst pkg = {\n\t\tname: 'kora-deploy',\n\t\tversion: '1.0.0',\n\t\tprivate: true,\n\t\ttype: 'module',\n\t\tdependencies: nativeDependencies,\n\t}\n\treturn `${JSON.stringify(pkg, null, 2)}\\n`\n}\n\n/**\n * Generates a `.dockerignore` tuned for Kora deploy output.\n */\nexport function generateDockerIgnore(): string {\n\treturn [\n\t\tGENERATED_HEADER,\n\t\t'',\n\t\t'node_modules',\n\t\t'npm-debug.log*',\n\t\t'pnpm-debug.log*',\n\t\t'yarn-error.log*',\n\t\t'.env',\n\t\t'.env.*',\n\t\t'.git',\n\t\t'.gitignore',\n\t\t'coverage',\n\t\t'.turbo',\n\t\t'*.test.ts',\n\t\t'*.spec.ts',\n\t\t'',\n\t].join('\\n')\n}\n\n/**\n * Writes the generated Dockerfile (and package.json if needed) to `.kora/deploy/`.\n */\nexport async function writeDockerfileArtifact(\n\tdeployDirectory: string,\n\toptions: DockerfileOptions = {},\n): Promise<string> {\n\tawait mkdir(deployDirectory, { recursive: true })\n\tconst dockerfilePath = join(deployDirectory, 'Dockerfile')\n\tawait writeFile(dockerfilePath, generateDockerfile(options), 'utf-8')\n\n\tif (options.nativeDependencies && Object.keys(options.nativeDependencies).length > 0) {\n\t\tconst pkgJsonPath = join(deployDirectory, 'package.json')\n\t\tawait writeFile(pkgJsonPath, generateDeployPackageJson(options.nativeDependencies), 'utf-8')\n\t}\n\n\treturn dockerfilePath\n}\n\n/**\n * Writes the generated `.dockerignore` to `.kora/deploy/.dockerignore`.\n */\nexport async function writeDockerIgnoreArtifact(deployDirectory: string): Promise<string> {\n\tawait mkdir(deployDirectory, { recursive: true })\n\tconst dockerIgnorePath = join(deployDirectory, '.dockerignore')\n\tawait writeFile(dockerIgnorePath, generateDockerIgnore(), 'utf-8')\n\treturn dockerIgnorePath\n}\n","import { mkdir, readFile, rm, writeFile } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport type { DeployPlatform } from '../adapters/adapter'\nimport { isDeployPlatform } from '../adapters/adapter'\n\nconst KORA_DEPLOY_DIRECTORY = join('.kora', 'deploy')\nconst DEPLOY_STATE_FILENAME = 'deploy.json'\n\n/**\n * Durable deployment settings stored for subsequent `kora deploy` runs.\n */\nexport interface DeployState {\n\tplatform: DeployPlatform\n\tappName: string\n\tregion: string | null\n\tprojectRoot: string\n\tliveUrl: string | null\n\tsyncUrl: string | null\n\tdatabaseId: string | null\n\tlastDeploymentId: string | null\n\tcreatedAt: string\n\tupdatedAt: string\n}\n\n/**\n * Input required to create a new deployment state record.\n */\nexport interface DeployStateCreateInput {\n\tplatform: DeployPlatform\n\tappName: string\n\tregion: string | null\n\tprojectRoot: string\n\tliveUrl?: string | null\n\tsyncUrl?: string | null\n\tdatabaseId?: string | null\n\tlastDeploymentId?: string | null\n}\n\n/**\n * Partial update fields for an existing deployment state record.\n */\nexport interface DeployStatePatch {\n\tplatform?: DeployPlatform\n\tappName?: string\n\tregion?: string | null\n\tprojectRoot?: string\n\tliveUrl?: string | null\n\tsyncUrl?: string | null\n\tdatabaseId?: string | null\n\tlastDeploymentId?: string | null\n}\n\n/**\n * Returns the absolute path to `.kora/deploy`.\n */\nexport function resolveDeployDirectory(projectRoot: string): string {\n\treturn join(projectRoot, KORA_DEPLOY_DIRECTORY)\n}\n\n/**\n * Returns the absolute path to `.kora/deploy/deploy.json`.\n */\nexport function resolveDeployStatePath(projectRoot: string): string {\n\treturn join(resolveDeployDirectory(projectRoot), DEPLOY_STATE_FILENAME)\n}\n\n/**\n * Loads deployment state from `.kora/deploy/deploy.json`.\n * Returns null when the file does not exist.\n */\nexport async function readDeployState(projectRoot: string): Promise<DeployState | null> {\n\tconst statePath = resolveDeployStatePath(projectRoot)\n\n\ttry {\n\t\tconst source = await readFile(statePath, 'utf-8')\n\t\tconst parsed = JSON.parse(source) as unknown\n\t\treturn parseDeployState(parsed)\n\t} catch (error) {\n\t\tconst code = (error as NodeJS.ErrnoException).code\n\t\tif (code === 'ENOENT') return null\n\t\tthrow error\n\t}\n}\n\n/**\n * Writes a brand-new deployment state record, replacing any existing file.\n */\nexport async function writeDeployState(\n\tprojectRoot: string,\n\tinput: DeployStateCreateInput,\n\tnow = new Date(),\n): Promise<DeployState> {\n\tconst timestamp = now.toISOString()\n\tconst state: DeployState = {\n\t\tplatform: input.platform,\n\t\tappName: input.appName,\n\t\tregion: input.region,\n\t\tprojectRoot: input.projectRoot,\n\t\tliveUrl: input.liveUrl ?? null,\n\t\tsyncUrl: input.syncUrl ?? null,\n\t\tdatabaseId: input.databaseId ?? null,\n\t\tlastDeploymentId: input.lastDeploymentId ?? null,\n\t\tcreatedAt: timestamp,\n\t\tupdatedAt: timestamp,\n\t}\n\n\tawait persistDeployState(projectRoot, state)\n\treturn state\n}\n\n/**\n * Applies a partial update to deployment state.\n * Throws when state does not exist.\n */\nexport async function updateDeployState(\n\tprojectRoot: string,\n\tpatch: DeployStatePatch,\n\tnow = new Date(),\n): Promise<DeployState> {\n\tconst existing = await readDeployState(projectRoot)\n\tif (!existing) {\n\t\tthrow new Error('Cannot update deploy state because deploy.json does not exist yet.')\n\t}\n\n\tconst nextState: DeployState = {\n\t\tplatform: patch.platform ?? existing.platform,\n\t\tappName: patch.appName ?? existing.appName,\n\t\tregion: patch.region === undefined ? existing.region : patch.region,\n\t\tprojectRoot: patch.projectRoot ?? existing.projectRoot,\n\t\tliveUrl: patch.liveUrl === undefined ? existing.liveUrl : patch.liveUrl,\n\t\tsyncUrl: patch.syncUrl === undefined ? existing.syncUrl : patch.syncUrl,\n\t\tdatabaseId: patch.databaseId === undefined ? existing.databaseId : patch.databaseId,\n\t\tlastDeploymentId:\n\t\t\tpatch.lastDeploymentId === undefined ? existing.lastDeploymentId : patch.lastDeploymentId,\n\t\tcreatedAt: existing.createdAt,\n\t\tupdatedAt: now.toISOString(),\n\t}\n\n\tawait persistDeployState(projectRoot, nextState)\n\treturn nextState\n}\n\n/**\n * Removes the entire `.kora/deploy` directory tree.\n */\nexport async function resetDeployState(projectRoot: string): Promise<void> {\n\tawait rm(resolveDeployDirectory(projectRoot), { recursive: true, force: true })\n}\n\nasync function persistDeployState(projectRoot: string, state: DeployState): Promise<void> {\n\tconst deployDir = resolveDeployDirectory(projectRoot)\n\tconst statePath = resolveDeployStatePath(projectRoot)\n\tawait mkdir(deployDir, { recursive: true })\n\tawait writeFile(statePath, `${JSON.stringify(state, null, 2)}\\n`, 'utf-8')\n}\n\nfunction parseDeployState(value: unknown): DeployState {\n\tif (typeof value !== 'object' || value === null || Array.isArray(value)) {\n\t\tthrow new Error('Invalid deploy state: expected an object.')\n\t}\n\n\tconst record = value as Record<string, unknown>\n\n\tconst platform = readPlatform(record.platform)\n\tconst appName = readString(record.appName, 'appName')\n\tconst region = readOptionalString(record.region, 'region')\n\tconst projectRoot = readString(record.projectRoot, 'projectRoot')\n\tconst liveUrl = readOptionalString(record.liveUrl, 'liveUrl')\n\tconst syncUrl = readOptionalString(record.syncUrl, 'syncUrl')\n\tconst databaseId = readOptionalString(record.databaseId, 'databaseId')\n\tconst lastDeploymentId = readOptionalString(record.lastDeploymentId, 'lastDeploymentId')\n\tconst createdAt = readString(record.createdAt, 'createdAt')\n\tconst updatedAt = readString(record.updatedAt, 'updatedAt')\n\n\treturn {\n\t\tplatform,\n\t\tappName,\n\t\tregion,\n\t\tprojectRoot,\n\t\tliveUrl,\n\t\tsyncUrl,\n\t\tdatabaseId,\n\t\tlastDeploymentId,\n\t\tcreatedAt,\n\t\tupdatedAt,\n\t}\n}\n\nfunction readPlatform(value: unknown): DeployPlatform {\n\tif (typeof value !== 'string' || !isDeployPlatform(value)) {\n\t\tthrow new Error('Invalid deploy state: \"platform\" must be a supported platform.')\n\t}\n\treturn value\n}\n\nfunction readString(value: unknown, field: string): string {\n\tif (typeof value !== 'string' || value.length === 0) {\n\t\tthrow new Error(`Invalid deploy state: \"${field}\" must be a non-empty string.`)\n\t}\n\treturn value\n}\n\nfunction readOptionalString(value: unknown, field: string): string | null {\n\tif (value === null) return null\n\tif (typeof value === 'string') return value\n\tthrow new Error(`Invalid deploy state: \"${field}\" must be a string or null.`)\n}\n","import { access } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport { resolve } from 'node:path'\nimport { defineCommand } from 'citty'\nimport { DevServerError, InvalidProjectError } from '../../errors'\nimport {\n\tfindProjectRoot,\n\tfindSchemaFile,\n\thasTsxInstalled,\n\tresolveProjectBinaryEntryPoint,\n} from '../../utils/fs-helpers'\nimport { createLogger } from '../../utils/logger'\nimport { loadKoraConfig } from './kora-config'\nimport type { KoraConfigFile } from './kora-config'\nimport { ProcessManager } from './process-manager'\nimport { SchemaWatcher } from './schema-watcher'\n\ninterface ManagedSyncStoreConfig {\n\ttype: 'memory' | 'sqlite' | 'postgres'\n\tfilename?: string\n\tconnectionString?: string\n}\n\n/**\n * The `dev` command — starts the Kora development environment.\n */\nexport const devCommand = defineCommand({\n\tmeta: {\n\t\tname: 'dev',\n\t\tdescription: 'Start the Kora development environment',\n\t},\n\targs: {\n\t\tport: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Vite dev server port',\n\t\t},\n\t\t'sync-port': {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Kora sync server port',\n\t\t},\n\t\t'no-sync': {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Disable sync server startup',\n\t\t\tdefault: false,\n\t\t},\n\t\t'no-watch': {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Disable schema file watching',\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tconst logger = createLogger()\n\n\t\tconst projectRoot = await findProjectRoot()\n\t\tif (!projectRoot) {\n\t\t\tthrow new InvalidProjectError(process.cwd())\n\t\t}\n\n\t\tconst config = await loadKoraConfig(projectRoot)\n\t\tconst vitePort = typeof args.port === 'string' ? args.port : String(config?.dev?.port ?? 5173)\n\t\tconst syncPortFromConfig =\n\t\t\ttypeof config?.dev?.sync === 'object' && typeof config.dev.sync.port === 'number'\n\t\t\t\t? config.dev.sync.port\n\t\t\t\t: 3001\n\t\tconst syncPort =\n\t\t\ttypeof args['sync-port'] === 'string' ? args['sync-port'] : String(syncPortFromConfig)\n\n\t\tconst configSyncEnabled =\n\t\t\tconfig?.dev?.sync === undefined ||\n\t\t\tconfig.dev.sync === true ||\n\t\t\t(typeof config.dev.sync === 'object' && config.dev.sync.enabled !== false)\n\n\t\tconst configWatchEnabled =\n\t\t\tconfig?.dev?.watch === undefined ||\n\t\t\tconfig.dev.watch === true ||\n\t\t\t(typeof config.dev.watch === 'object' && config.dev.watch.enabled !== false)\n\n\t\tconst watchDebounceMs =\n\t\t\ttypeof config?.dev?.watch === 'object' && typeof config.dev.watch.debounceMs === 'number'\n\t\t\t\t? config.dev.watch.debounceMs\n\t\t\t\t: 300\n\n\t\tconst viteEntryPoint = await resolveProjectBinaryEntryPoint(projectRoot, 'vite', 'vite')\n\t\tif (!viteEntryPoint) {\n\t\t\tthrow new DevServerError('vite', join(projectRoot, 'node_modules', '.bin', 'vite'))\n\t\t}\n\n\t\tconst syncServerFile = await findSyncServerFile(projectRoot)\n\t\tlet managedSyncStore = normalizeManagedSyncStore(config, projectRoot)\n\t\tconst postgresEnvRequested = isPostgresEnvRequested(config)\n\t\tconst syncAllowed = args['no-sync'] !== true && configSyncEnabled\n\t\tlet shouldStartSync = syncAllowed && (syncServerFile !== null || managedSyncStore !== null)\n\n\t\tlet hasTsx = false\n\t\tif (shouldStartSync && syncServerFile !== null) {\n\t\t\thasTsx = await hasTsxInstalled(projectRoot)\n\t\t\tif (!hasTsx) {\n\t\t\t\tlogger.warn('Sync server detected, but \"tsx\" is not installed. Skipping sync.')\n\t\t\t}\n\t\t}\n\n\t\tif (shouldStartSync && syncServerFile === null && managedSyncStore) {\n\t\t\tconst hasServerPackage = await fileExists(\n\t\t\t\tjoin(projectRoot, 'node_modules', '@korajs', 'server', 'package.json'),\n\t\t\t)\n\t\t\tif (!hasServerPackage) {\n\t\t\t\tlogger.warn(\n\t\t\t\t\t'Managed sync is configured, but @korajs/server is not installed. Install it or add server.ts.',\n\t\t\t\t)\n\t\t\t\tmanagedSyncStore = null\n\t\t\t\tshouldStartSync = syncAllowed && (syncServerFile !== null || managedSyncStore !== null)\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\tsyncAllowed &&\n\t\t\tsyncServerFile === null &&\n\t\t\tmanagedSyncStore === null &&\n\t\t\tpostgresEnvRequested\n\t\t) {\n\t\t\tlogger.warn(\n\t\t\t\t'Managed postgres sync requested but no connection string found. Set dev.sync.store.connectionString or DATABASE_URL.',\n\t\t\t)\n\t\t}\n\n\t\tlet configuredSchemaPath: string | null = null\n\t\tif (typeof config?.schema === 'string') {\n\t\t\tconst candidate = resolve(projectRoot, config.schema)\n\t\t\tif (await fileExists(candidate)) {\n\t\t\t\tconfiguredSchemaPath = candidate\n\t\t\t} else {\n\t\t\t\tlogger.warn(\n\t\t\t\t\t`Configured schema file not found: ${candidate}. Falling back to auto-detection.`,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\tconst schemaPath = configuredSchemaPath ?? (await findSchemaFile(projectRoot))\n\t\tconst watchEnabled = args['no-watch'] !== true && configWatchEnabled && schemaPath !== null\n\n\t\tconst processManager = new ProcessManager()\n\t\tlet schemaWatcher: SchemaWatcher | null = null\n\t\tlet shuttingDown = false\n\t\tlet resolveFinished: (() => void) | undefined\n\t\tconst finished = new Promise<void>((resolve) => {\n\t\t\tresolveFinished = resolve\n\t\t})\n\n\t\tconst onManagedProcessExit = () => {\n\t\t\tif (!processManager.hasRunning() && !shuttingDown) {\n\t\t\t\tresolveFinished?.()\n\t\t\t}\n\t\t}\n\n\t\tconst shutdown = async () => {\n\t\t\tif (shuttingDown) return\n\t\t\tshuttingDown = true\n\t\t\tschemaWatcher?.stop()\n\t\t\tawait processManager.shutdownAll()\n\t\t\tresolveFinished?.()\n\t\t}\n\n\t\tconst onSigInt = () => {\n\t\t\tvoid shutdown()\n\t\t}\n\t\tconst onSigTerm = () => {\n\t\t\tvoid shutdown()\n\t\t}\n\n\t\tprocess.on('SIGINT', onSigInt)\n\t\tprocess.on('SIGTERM', onSigTerm)\n\n\t\tlogger.banner()\n\t\tlogger.info('Starting development environment:')\n\t\tlogger.blank()\n\t\tlogger.step(` Vite dev server on port ${vitePort}`)\n\t\tif (shouldStartSync && hasTsx && syncServerFile) {\n\t\t\tlogger.step(` Sync server on port ${syncPort}`)\n\t\t} else if (shouldStartSync && syncServerFile === null && managedSyncStore !== null) {\n\t\t\tlogger.step(` Managed sync server on port ${syncPort} (${managedSyncStore.type})`)\n\t\t} else if (syncAllowed && syncServerFile === null) {\n\t\t\tlogger.step(' Sync server configured but no server.ts/server.js or managed store found')\n\t\t} else if (!syncAllowed) {\n\t\t\tlogger.step(' Sync server disabled via --no-sync')\n\t\t}\n\n\t\tif (watchEnabled && schemaPath) {\n\t\t\tlogger.step(` Schema watcher enabled (${schemaPath})`)\n\t\t} else if (args['no-watch'] === true) {\n\t\t\tlogger.step(' Schema watcher disabled via --no-watch')\n\t\t} else {\n\t\t\tlogger.step(' Schema watcher disabled (schema.ts not found)')\n\t\t}\n\t\tlogger.blank()\n\n\t\tlogger.step(' Kora DevTools overlay: Ctrl+Shift+K (Cmd+Shift+K on macOS) when devtools: true')\n\n\t\tprocessManager.spawn({\n\t\t\tlabel: 'vite',\n\t\t\tcommand: process.execPath,\n\t\t\targs: [viteEntryPoint, '--port', String(vitePort)],\n\t\t\tcwd: projectRoot,\n\t\t\tenv: {\n\t\t\t\tKORA_DEV: '1',\n\t\t\t},\n\t\t\tonExit: onManagedProcessExit,\n\t\t})\n\n\t\tif (shouldStartSync && hasTsx && syncServerFile) {\n\t\t\tprocessManager.spawn({\n\t\t\t\tlabel: 'sync',\n\t\t\t\tcommand: process.execPath,\n\t\t\t\targs: ['--import', 'tsx', syncServerFile],\n\t\t\t\tcwd: projectRoot,\n\t\t\t\tenv: {\n\t\t\t\t\tPORT: String(syncPort),\n\t\t\t\t\tKORA_SYNC_PORT: String(syncPort),\n\t\t\t\t},\n\t\t\t\tonExit: onManagedProcessExit,\n\t\t\t})\n\t\t}\n\n\t\tif (shouldStartSync && syncServerFile === null && managedSyncStore !== null) {\n\t\t\tprocessManager.spawn({\n\t\t\t\tlabel: 'sync',\n\t\t\t\tcommand: process.execPath,\n\t\t\t\targs: ['--input-type=module', '--eval', MANAGED_SYNC_BOOTSTRAP_SCRIPT],\n\t\t\t\tcwd: projectRoot,\n\t\t\t\tenv: {\n\t\t\t\t\tKORA_DEV_SYNC_CONFIG: JSON.stringify({\n\t\t\t\t\t\tport: Number(syncPort),\n\t\t\t\t\t\tstore: managedSyncStore,\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\tonExit: onManagedProcessExit,\n\t\t\t})\n\t\t}\n\n\t\tif (watchEnabled && schemaPath) {\n\t\t\tschemaWatcher = new SchemaWatcher({\n\t\t\t\tschemaPath,\n\t\t\t\tprojectRoot,\n\t\t\t\tdebounceMs: watchDebounceMs,\n\t\t\t\tonRegenerate: () => {\n\t\t\t\t\tlogger.success('Regenerated types from schema changes')\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\tlogger.error(`Schema watcher error: ${error.message}`)\n\t\t\t\t},\n\t\t\t})\n\t\t\tschemaWatcher.start()\n\t\t}\n\n\t\tawait finished\n\t\tprocess.off('SIGINT', onSigInt)\n\t\tprocess.off('SIGTERM', onSigTerm)\n\t},\n})\n\nasync function findSyncServerFile(projectRoot: string): Promise<string | null> {\n\tconst candidates = [join(projectRoot, 'server.ts'), join(projectRoot, 'server.js')]\n\n\tfor (const candidate of candidates) {\n\t\ttry {\n\t\t\tawait access(candidate)\n\t\t\treturn candidate\n\t\t} catch {\n\t\t\t// continue\n\t\t}\n\t}\n\n\treturn null\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n\ttry {\n\t\tawait access(path)\n\t\treturn true\n\t} catch {\n\t\treturn false\n\t}\n}\n\nfunction normalizeManagedSyncStore(\n\tconfig: KoraConfigFile | null,\n\tprojectRoot: string,\n): ManagedSyncStoreConfig | null {\n\tconst sync = config?.dev?.sync\n\tif (typeof sync !== 'object' || sync === null) return null\n\n\tconst store = sync.store\n\tif (store === undefined) return { type: 'memory' }\n\n\tif (store === 'memory') return { type: 'memory' }\n\tif (store === 'sqlite') return { type: 'sqlite', filename: join(projectRoot, 'kora-sync.db') }\n\tif (store === 'postgres') {\n\t\tconst connectionString = process.env.DATABASE_URL\n\t\tif (!connectionString) return null\n\t\treturn { type: 'postgres', connectionString }\n\t}\n\n\tif (typeof store === 'object' && store !== null) {\n\t\tif (store.type === 'memory') return { type: 'memory' }\n\t\tif (store.type === 'sqlite') {\n\t\t\tconst filename =\n\t\t\t\ttypeof store.filename === 'string' && store.filename.length > 0\n\t\t\t\t\t? resolve(projectRoot, store.filename)\n\t\t\t\t\t: join(projectRoot, 'kora-sync.db')\n\t\t\treturn { type: 'sqlite', filename }\n\t\t}\n\t\tif (store.type === 'postgres' && typeof store.connectionString === 'string') {\n\t\t\treturn { type: 'postgres', connectionString: store.connectionString }\n\t\t}\n\t}\n\n\treturn null\n}\n\nfunction isPostgresEnvRequested(config: KoraConfigFile | null): boolean {\n\tconst sync = config?.dev?.sync\n\tif (typeof sync !== 'object' || sync === null) return false\n\tif (sync.store === 'postgres') return true\n\tif (typeof sync.store === 'object' && sync.store !== null && sync.store.type === 'postgres')\n\t\treturn true\n\treturn false\n}\n\nconst MANAGED_SYNC_BOOTSTRAP_SCRIPT = `\nconst config = JSON.parse(process.env.KORA_DEV_SYNC_CONFIG ?? '{}');\nconst {\n createKoraServer,\n MemoryServerStore,\n createSqliteServerStore,\n createPostgresServerStore,\n} = await import('@korajs/server');\nconst storeConfig = config.store ?? { type: 'memory' };\nlet store;\nif (storeConfig.type === 'memory') {\n store = new MemoryServerStore();\n} else if (storeConfig.type === 'sqlite') {\n const filename = typeof storeConfig.filename === 'string' && storeConfig.filename.length > 0\n ? storeConfig.filename\n : './kora-sync.db';\n store = createSqliteServerStore({ filename });\n} else if (storeConfig.type === 'postgres') {\n if (typeof storeConfig.connectionString !== 'string' || storeConfig.connectionString.length === 0) {\n throw new Error('Managed postgres sync requires a connectionString');\n }\n store = await createPostgresServerStore({\n connectionString: storeConfig.connectionString,\n });\n} else {\n throw new Error('Unsupported managed sync store type: ' + String(storeConfig.type));\n}\nconst server = createKoraServer({ store, port: Number(config.port ?? 3001) });\nconst shutdown = async () => {\n try {\n await server.stop();\n } catch {\n }\n process.exit(0);\n};\nprocess.on('SIGINT', () => {\n void shutdown();\n});\nprocess.on('SIGTERM', () => {\n void shutdown();\n});\nawait server.start();\nprocess.stdout.write('Managed sync server running on ws://localhost:' + String(config.port ?? 3001) + '\\\\n');\nawait new Promise(() => {});\n`\n","import { spawn as spawnChild } from 'node:child_process'\nimport type { ChildProcess, SpawnOptions } from 'node:child_process'\n\nexport interface ManagedProcessConfig {\n\tlabel: string\n\tcommand: string\n\targs: string[]\n\tcwd: string\n\tenv?: Record<string, string>\n\tonExit?: (code: number | null, signal: NodeJS.Signals | null) => void\n}\n\ninterface RunningProcess {\n\tchild: ChildProcess\n\texitPromise: Promise<void>\n\tstdoutBuffer: string\n\tstderrBuffer: string\n}\n\n/**\n * Manages long-running child processes for the dev command.\n */\nexport class ProcessManager {\n\tprivate readonly processes = new Map<string, RunningProcess>()\n\n\tspawn(config: ManagedProcessConfig): void {\n\t\tconst options: SpawnOptions = {\n\t\t\tcwd: config.cwd,\n\t\t\tenv: { ...process.env, ...config.env },\n\t\t\tstdio: ['ignore', 'pipe', 'pipe'],\n\t\t}\n\n\t\tconst child = spawnChild(config.command, config.args, options)\n\t\tlet resolveExit: (() => void) | undefined\n\n\t\tconst runningProcess: RunningProcess = {\n\t\t\tchild,\n\t\t\texitPromise: new Promise<void>((resolve) => {\n\t\t\t\tresolveExit = resolve\n\t\t\t}),\n\t\t\tstdoutBuffer: '',\n\t\t\tstderrBuffer: '',\n\t\t}\n\n\t\tthis.processes.set(config.label, runningProcess)\n\n\t\tchild.stdout?.on('data', (chunk: Buffer) => {\n\t\t\trunningProcess.stdoutBuffer = this.writeChunk(\n\t\t\t\tconfig.label,\n\t\t\t\trunningProcess.stdoutBuffer,\n\t\t\t\tchunk,\n\t\t\t\tfalse,\n\t\t\t)\n\t\t})\n\n\t\tchild.stderr?.on('data', (chunk: Buffer) => {\n\t\t\trunningProcess.stderrBuffer = this.writeChunk(\n\t\t\t\tconfig.label,\n\t\t\t\trunningProcess.stderrBuffer,\n\t\t\t\tchunk,\n\t\t\t\ttrue,\n\t\t\t)\n\t\t})\n\n\t\tchild.on('exit', (code, signal) => {\n\t\t\tthis.flushBuffer(config.label, runningProcess.stdoutBuffer, false)\n\t\t\tthis.flushBuffer(config.label, runningProcess.stderrBuffer, true)\n\t\t\tthis.processes.delete(config.label)\n\t\t\tconfig.onExit?.(code, signal)\n\t\t\tresolveExit?.()\n\t\t})\n\t}\n\n\thasRunning(): boolean {\n\t\treturn this.processes.size > 0\n\t}\n\n\tasync shutdownAll(): Promise<void> {\n\t\tconst running = Array.from(this.processes.values())\n\t\tif (running.length === 0) return\n\n\t\tfor (const processEntry of running) {\n\t\t\tprocessEntry.child.kill('SIGTERM')\n\t\t}\n\n\t\tawait Promise.race([Promise.all(running.map((entry) => entry.exitPromise)), delay(5000)])\n\n\t\tconst remaining = Array.from(this.processes.values())\n\t\tif (remaining.length === 0) return\n\n\t\tfor (const processEntry of remaining) {\n\t\t\tprocessEntry.child.kill('SIGKILL')\n\t\t}\n\n\t\tawait Promise.all(remaining.map((entry) => entry.exitPromise))\n\t}\n\n\tprivate writeChunk(label: string, buffer: string, chunk: Buffer, isError: boolean): string {\n\t\tconst combined = `${buffer}${chunk.toString('utf-8')}`\n\t\tconst lines = combined.split(/\\r?\\n/)\n\t\tconst remaining = lines.pop() ?? ''\n\n\t\tfor (const line of lines) {\n\t\t\tthis.writeLine(label, line, isError)\n\t\t}\n\n\t\treturn remaining\n\t}\n\n\tprivate flushBuffer(label: string, buffer: string, isError: boolean): void {\n\t\tif (!buffer) return\n\t\tthis.writeLine(label, buffer, isError)\n\t}\n\n\tprivate writeLine(label: string, line: string, isError: boolean): void {\n\t\tconst stream = isError ? process.stderr : process.stdout\n\t\tstream.write(`[${label}] ${line}\\n`)\n\t}\n}\n\nfunction delay(ms: number): Promise<void> {\n\treturn new Promise((resolve) => {\n\t\tsetTimeout(resolve, ms)\n\t})\n}\n","import { spawn } from 'node:child_process'\nimport { watch } from 'node:fs'\nimport type { FSWatcher } from 'node:fs'\nimport { join } from 'node:path'\nimport { hasTsxInstalled } from '../../utils/fs-helpers'\n\nexport interface SchemaWatcherConfig {\n\tschemaPath: string\n\tprojectRoot: string\n\tdebounceMs?: number\n\tonRegenerate?: () => void\n\tonError?: (error: Error) => void\n}\n\n/**\n * Watches a schema file and regenerates types when it changes.\n */\nexport class SchemaWatcher {\n\tprivate readonly debounceMs: number\n\tprivate watcher: FSWatcher | null = null\n\tprivate debounceTimer: NodeJS.Timeout | null = null\n\n\tconstructor(private readonly config: SchemaWatcherConfig) {\n\t\tthis.debounceMs = config.debounceMs ?? 300\n\t}\n\n\tstart(): void {\n\t\tif (this.watcher) return\n\n\t\tthis.watcher = watch(this.config.schemaPath, () => {\n\t\t\tthis.scheduleRegeneration()\n\t\t})\n\n\t\tthis.watcher.on('error', (error) => {\n\t\t\tthis.config.onError?.(toError(error))\n\t\t})\n\t}\n\n\tstop(): void {\n\t\tif (this.debounceTimer) {\n\t\t\tclearTimeout(this.debounceTimer)\n\t\t\tthis.debounceTimer = null\n\t\t}\n\n\t\tthis.watcher?.close()\n\t\tthis.watcher = null\n\t}\n\n\tasync regenerate(): Promise<void> {\n\t\t// Use process.execPath (node) + --import tsx to run kora generate,\n\t\t// avoiding .cmd shim issues on Windows with paths containing spaces.\n\t\tconst koraBinJs = join(\n\t\t\tthis.config.projectRoot,\n\t\t\t'node_modules',\n\t\t\t'@korajs',\n\t\t\t'cli',\n\t\t\t'dist',\n\t\t\t'bin.js',\n\t\t)\n\t\tconst hasTsx = await hasTsxInstalled(this.config.projectRoot)\n\n\t\tconst command = process.execPath\n\t\tconst args = hasTsx\n\t\t\t? ['--import', 'tsx', koraBinJs, 'generate', 'types', '--schema', this.config.schemaPath]\n\t\t\t: [koraBinJs, 'generate', 'types', '--schema', this.config.schemaPath]\n\n\t\tawait spawnCommand(command, args, this.config.projectRoot)\n\t\tthis.config.onRegenerate?.()\n\t}\n\n\tprivate scheduleRegeneration(): void {\n\t\tif (this.debounceTimer) {\n\t\t\tclearTimeout(this.debounceTimer)\n\t\t}\n\n\t\tthis.debounceTimer = setTimeout(() => {\n\t\t\tthis.debounceTimer = null\n\t\t\tvoid this.regenerate().catch((error) => {\n\t\t\t\tthis.config.onError?.(toError(error))\n\t\t\t})\n\t\t}, this.debounceMs)\n\t}\n}\n\nasync function spawnCommand(command: string, args: string[], cwd: string): Promise<void> {\n\tawait new Promise<void>((resolve, reject) => {\n\t\tconst child = spawn(command, args, {\n\t\t\tcwd,\n\t\t\tstdio: ['ignore', 'pipe', 'pipe'],\n\t\t\tenv: process.env,\n\t\t})\n\n\t\tchild.stdout?.on('data', (chunk: Buffer) => {\n\t\t\twritePrefixedLines(chunk, false)\n\t\t})\n\n\t\tchild.stderr?.on('data', (chunk: Buffer) => {\n\t\t\twritePrefixedLines(chunk, true)\n\t\t})\n\n\t\tchild.on('error', (error) => {\n\t\t\treject(error)\n\t\t})\n\n\t\tchild.on('exit', (code) => {\n\t\t\tif (code === 0) {\n\t\t\t\tresolve()\n\t\t\t\treturn\n\t\t\t}\n\t\t\treject(new Error(`Type generation exited with code ${code ?? 'unknown'}.`))\n\t\t})\n\t})\n}\n\nfunction writePrefixedLines(chunk: Buffer, isError: boolean): void {\n\tconst text = chunk.toString('utf-8')\n\tconst lines = text.split(/\\r?\\n/).filter((line) => line.length > 0)\n\tconst stream = isError ? process.stderr : process.stdout\n\n\tfor (const line of lines) {\n\t\tstream.write(`[kora] ${line}\\n`)\n\t}\n}\n\nfunction toError(error: unknown): Error {\n\tif (error instanceof Error) return error\n\treturn new Error(String(error))\n}\n","import { defineCommand } from 'citty'\nimport { InvalidProjectError } from '../../errors'\nimport { findProjectRoot } from '../../utils/fs-helpers'\nimport { createLogger } from '../../utils/logger'\nimport { doctorHasFailures, runDoctorChecks } from './doctor-checks'\n\n/**\n * Diagnose common Kora project setup issues (schema, worker, sync, versions).\n */\nexport const doctorCommand = defineCommand({\n\tmeta: {\n\t\tname: 'doctor',\n\t\tdescription: 'Check Kora project setup (schema, worker, sync server, versions)',\n\t},\n\targs: {\n\t\turl: {\n\t\t\ttype: 'string',\n\t\t\tdescription:\n\t\t\t\t'Sync server HTTP base URL for status probe (default: from .env or localhost:3001)',\n\t\t},\n\t\t'skip-network': {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Skip sync server and schema version network checks',\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tconst logger = createLogger()\n\t\tconst projectRoot = await findProjectRoot()\n\t\tif (!projectRoot) {\n\t\t\tthrow new InvalidProjectError(process.cwd())\n\t\t}\n\n\t\tconst syncHttpUrl = typeof args.url === 'string' ? args.url : undefined\n\t\tconst skipNetwork = args['skip-network'] === true\n\n\t\tlogger.banner()\n\t\tlogger.info(`Checking project at ${projectRoot}`)\n\t\tlogger.blank()\n\n\t\tconst results = await runDoctorChecks({\n\t\t\tprojectRoot,\n\t\t\tsyncHttpUrl,\n\t\t\tskipNetwork,\n\t\t})\n\n\t\tfor (const check of results) {\n\t\t\tconst prefix =\n\t\t\t\tcheck.status === 'pass'\n\t\t\t\t\t? 'success'\n\t\t\t\t\t: check.status === 'warn'\n\t\t\t\t\t\t? 'warn'\n\t\t\t\t\t\t: check.status === 'fail'\n\t\t\t\t\t\t\t? 'error'\n\t\t\t\t\t\t\t: 'step'\n\t\t\tlogger[prefix](`${check.title}: ${check.message}`)\n\t\t\tif (check.fix && check.status !== 'pass' && check.status !== 'skip') {\n\t\t\t\tlogger.step(` Fix: ${check.fix}`)\n\t\t\t}\n\t\t}\n\n\t\tlogger.blank()\n\t\tif (doctorHasFailures(results)) {\n\t\t\tlogger.error('Doctor found blocking issues.')\n\t\t\tprocess.exitCode = 1\n\t\t\treturn\n\t\t}\n\n\t\tconst warnings = results.filter((r) => r.status === 'warn').length\n\t\tif (warnings > 0) {\n\t\t\tlogger.warn(`Doctor finished with ${warnings} warning(s).`)\n\t\t} else {\n\t\t\tlogger.success('All checks passed.')\n\t\t}\n\t},\n})\n","import { access, readFile } from 'node:fs/promises'\nimport { join, resolve } from 'node:path'\nimport type { SchemaDefinition } from '@korajs/core'\nimport { findSchemaFile } from '../../utils/fs-helpers'\nimport { loadKoraConfig } from '../dev/kora-config'\nimport { loadSchemaDefinition } from '../migrate/schema-loader'\n\nexport type DoctorCheckStatus = 'pass' | 'warn' | 'fail' | 'skip'\n\nexport interface DoctorCheckResult {\n\tid: string\n\ttitle: string\n\tstatus: DoctorCheckStatus\n\tmessage: string\n\tfix?: string\n}\n\nexport interface DoctorRunOptions {\n\tprojectRoot: string\n\t/** HTTP base URL for sync status probe (e.g. http://localhost:3001) */\n\tsyncHttpUrl?: string\n\t/** Skip network checks */\n\tskipNetwork?: boolean\n}\n\nconst STATUS_ENDPOINT = '/__kora/status'\n\n/**\n * Run all static and optional network diagnostics for a Kora project.\n */\nexport async function runDoctorChecks(options: DoctorRunOptions): Promise<DoctorCheckResult[]> {\n\tconst { projectRoot } = options\n\tconst results: DoctorCheckResult[] = []\n\n\tresults.push({\n\t\tid: 'project-root',\n\t\ttitle: 'Project root',\n\t\tstatus: 'pass',\n\t\tmessage: projectRoot,\n\t})\n\n\tconst config = await loadKoraConfig(projectRoot)\n\tif (!config) {\n\t\tresults.push({\n\t\t\tid: 'kora-config',\n\t\t\ttitle: 'kora.config',\n\t\t\tstatus: 'warn',\n\t\t\tmessage: 'No kora.config.* file found.',\n\t\t\tfix: 'Add kora.config.ts with schema path and dev settings (see create-kora-app templates).',\n\t\t})\n\t} else {\n\t\tresults.push({\n\t\t\tid: 'kora-config',\n\t\t\ttitle: 'kora.config',\n\t\t\tstatus: 'pass',\n\t\t\tmessage: 'Configuration file loaded.',\n\t\t})\n\t}\n\n\tconst schemaPath = await resolveSchemaPath(projectRoot, config?.schema)\n\tif (!schemaPath) {\n\t\tresults.push({\n\t\t\tid: 'schema',\n\t\t\ttitle: 'Schema',\n\t\t\tstatus: 'fail',\n\t\t\tmessage: 'Could not find schema.ts in src/ or project root.',\n\t\t\tfix: 'Add src/schema.ts or set schema in kora.config.ts.',\n\t\t})\n\t} else {\n\t\ttry {\n\t\t\tconst schema = await loadSchemaDefinition(schemaPath, projectRoot)\n\t\t\tresults.push({\n\t\t\t\tid: 'schema',\n\t\t\t\ttitle: 'Schema',\n\t\t\t\tstatus: 'pass',\n\t\t\t\tmessage: `Loaded schema v${schema.version} (${Object.keys(schema.collections).length} collection(s)).`,\n\t\t\t})\n\n\t\t\tconst workerCheck = await checkWorkerFile(projectRoot)\n\t\t\tresults.push(workerCheck)\n\n\t\t\tconst depsCheck = await checkDependencies(projectRoot)\n\t\t\tresults.push(depsCheck)\n\n\t\t\tresults.push(opfsBrowserNote())\n\n\t\t\tif (!options.skipNetwork) {\n\t\t\t\tconst syncUrl = options.syncHttpUrl ?? (await resolveSyncHttpUrl(projectRoot, config))\n\t\t\t\tconst syncChecks = await checkSyncServer(syncUrl, schema)\n\t\t\t\tresults.push(...syncChecks)\n\t\t\t} else {\n\t\t\t\tresults.push({\n\t\t\t\t\tid: 'sync-server',\n\t\t\t\t\ttitle: 'Sync server',\n\t\t\t\t\tstatus: 'skip',\n\t\t\t\t\tmessage: 'Network checks skipped.',\n\t\t\t\t})\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error)\n\t\t\tresults.push({\n\t\t\t\tid: 'schema',\n\t\t\t\ttitle: 'Schema',\n\t\t\t\tstatus: 'fail',\n\t\t\t\tmessage: `Failed to load schema: ${message}`,\n\t\t\t\tfix: 'Ensure the schema exports defineSchema() as default and TypeScript can be evaluated (install tsx).',\n\t\t\t})\n\t\t}\n\t}\n\n\treturn results\n}\n\nasync function resolveSchemaPath(\n\tprojectRoot: string,\n\tconfigSchema?: string,\n): Promise<string | null> {\n\tif (typeof configSchema === 'string') {\n\t\tconst resolved = resolve(projectRoot, configSchema)\n\t\ttry {\n\t\t\tawait access(resolved)\n\t\t\treturn resolved\n\t\t} catch {\n\t\t\t// fall through to search\n\t\t}\n\t}\n\treturn findSchemaFile(projectRoot)\n}\n\nasync function checkWorkerFile(projectRoot: string): Promise<DoctorCheckResult> {\n\tconst candidates = [\n\t\tjoin(projectRoot, 'src', 'kora-worker.ts'),\n\t\tjoin(projectRoot, 'src', 'kora-worker.js'),\n\t]\n\n\tfor (const path of candidates) {\n\t\ttry {\n\t\t\tawait access(path)\n\t\t\treturn {\n\t\t\t\tid: 'worker',\n\t\t\t\ttitle: 'SQLite WASM worker',\n\t\t\t\tstatus: 'pass',\n\t\t\t\tmessage: `Found ${path.replace(projectRoot, '.')}.`,\n\t\t\t}\n\t\t} catch {\n\t\t\t// try next\n\t\t}\n\t}\n\n\treturn {\n\t\tid: 'worker',\n\t\ttitle: 'SQLite WASM worker',\n\t\tstatus: 'warn',\n\t\tmessage: 'No src/kora-worker.ts found.',\n\t\tfix: 'Add kora-worker.ts and pass store.workerUrl from Vite (?worker&url) in createApp().',\n\t}\n}\n\nasync function checkDependencies(projectRoot: string): Promise<DoctorCheckResult> {\n\ttry {\n\t\tconst raw = await readFile(join(projectRoot, 'package.json'), 'utf-8')\n\t\tconst pkg = JSON.parse(raw) as {\n\t\t\tdependencies?: Record<string, string>\n\t\t\tdevDependencies?: Record<string, string>\n\t\t}\n\t\tconst deps = { ...pkg.dependencies, ...pkg.devDependencies }\n\t\tconst hasKora = Boolean(deps.korajs || deps.kora)\n\t\tconst hasStore = Boolean(deps['@korajs/store'])\n\t\tif (hasKora || hasStore) {\n\t\t\treturn {\n\t\t\t\tid: 'dependencies',\n\t\t\t\ttitle: 'Dependencies',\n\t\t\t\tstatus: 'pass',\n\t\t\t\tmessage: hasKora\n\t\t\t\t\t? 'korajs is listed in package.json.'\n\t\t\t\t\t: '@korajs/store is listed in package.json.',\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tid: 'dependencies',\n\t\t\ttitle: 'Dependencies',\n\t\t\tstatus: 'fail',\n\t\t\tmessage: 'No korajs or @korajs/store dependency found.',\n\t\t\tfix: 'Run pnpm add korajs @korajs/react (or your package manager equivalent).',\n\t\t}\n\t} catch {\n\t\treturn {\n\t\t\tid: 'dependencies',\n\t\t\ttitle: 'Dependencies',\n\t\t\tstatus: 'fail',\n\t\t\tmessage: 'Could not read package.json.',\n\t\t\tfix: 'Run this command from a Kora app directory with a valid package.json.',\n\t\t}\n\t}\n}\n\nfunction opfsBrowserNote(): DoctorCheckResult {\n\treturn {\n\t\tid: 'opfs',\n\t\ttitle: 'OPFS persistence',\n\t\tstatus: 'skip',\n\t\tmessage:\n\t\t\t'OPFS availability is checked in the browser at runtime. Open the app and confirm no IndexedDB fallback warning in the console.',\n\t\tfix: 'Use a Chromium-based browser with storage access; avoid private mode if persistence fails.',\n\t}\n}\n\nasync function resolveSyncHttpUrl(\n\tprojectRoot: string,\n\tconfig: Awaited<ReturnType<typeof loadKoraConfig>>,\n): Promise<string> {\n\tconst envUrl = await readEnvSyncUrl(projectRoot)\n\tif (envUrl) {\n\t\treturn toSyncStatusHttpBase(envUrl)\n\t}\n\n\tconst syncPort =\n\t\ttypeof config?.dev?.sync === 'object' && typeof config.dev.sync.port === 'number'\n\t\t\t? config.dev.sync.port\n\t\t\t: 3001\n\n\treturn `http://localhost:${syncPort}`\n}\n\nasync function readEnvSyncUrl(projectRoot: string): Promise<string | null> {\n\tfor (const file of ['.env', '.env.local']) {\n\t\tconst path = join(projectRoot, file)\n\t\ttry {\n\t\t\tconst content = await readFile(path, 'utf-8')\n\t\t\tfor (const line of content.split('\\n')) {\n\t\t\t\tconst trimmed = line.trim()\n\t\t\t\tif (!trimmed || trimmed.startsWith('#')) continue\n\t\t\t\tconst match = trimmed.match(/^VITE_SYNC_URL=(.+)$/)\n\t\t\t\tif (match?.[1]) {\n\t\t\t\t\treturn match[1].trim().replace(/^[\"']|[\"']$/g, '')\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// continue\n\t\t}\n\t}\n\treturn null\n}\n\n/** Converts a WebSocket sync URL to an HTTP base for {@link STATUS_ENDPOINT}. */\nexport function toSyncStatusHttpBase(url: string): string {\n\ttry {\n\t\tconst parsed = new URL(url)\n\t\tif (parsed.protocol === 'ws:') {\n\t\t\tparsed.protocol = 'http:'\n\t\t} else if (parsed.protocol === 'wss:') {\n\t\t\tparsed.protocol = 'https:'\n\t\t}\n\t\tparsed.pathname = ''\n\t\tparsed.search = ''\n\t\tparsed.hash = ''\n\t\treturn parsed.toString().replace(/\\/$/, '')\n\t} catch {\n\t\treturn 'http://localhost:3001'\n\t}\n}\n\ninterface ServerStatusResponse {\n\tschemaVersion: number\n\trunning: boolean\n\tversion: string\n}\n\nasync function checkSyncServer(\n\thttpBase: string,\n\tschema: SchemaDefinition,\n): Promise<DoctorCheckResult[]> {\n\tconst statusUrl = `${httpBase.replace(/\\/$/, '')}${STATUS_ENDPOINT}`\n\n\ttry {\n\t\tconst response = await fetch(statusUrl, {\n\t\t\tsignal: AbortSignal.timeout(5000),\n\t\t})\n\t\tif (!response.ok) {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tid: 'sync-server',\n\t\t\t\t\ttitle: 'Sync server',\n\t\t\t\t\tstatus: 'fail',\n\t\t\t\t\tmessage: `GET ${statusUrl} returned ${response.status}.`,\n\t\t\t\t\tfix: 'Start the sync server with `kora dev` or `pnpm run dev` in a sync template.',\n\t\t\t\t},\n\t\t\t]\n\t\t}\n\n\t\tconst body = (await response.json()) as ServerStatusResponse\n\t\tconst results: DoctorCheckResult[] = [\n\t\t\t{\n\t\t\t\tid: 'sync-server',\n\t\t\t\ttitle: 'Sync server',\n\t\t\t\tstatus: 'pass',\n\t\t\t\tmessage: `Reachable at ${statusUrl} (server v${body.version ?? 'unknown'}).`,\n\t\t\t},\n\t\t]\n\n\t\tif (typeof body.schemaVersion === 'number' && body.schemaVersion !== schema.version) {\n\t\t\tresults.push({\n\t\t\t\tid: 'schema-version',\n\t\t\t\ttitle: 'Schema version',\n\t\t\t\tstatus: 'warn',\n\t\t\t\tmessage: `Client schema v${schema.version} differs from server schema v${body.schemaVersion}.`,\n\t\t\t\tfix: 'Run migrations on the server and client, or align schema.version before syncing.',\n\t\t\t})\n\t\t} else {\n\t\t\tresults.push({\n\t\t\t\tid: 'schema-version',\n\t\t\t\ttitle: 'Schema version',\n\t\t\t\tstatus: 'pass',\n\t\t\t\tmessage: `Client and server both use schema v${schema.version}.`,\n\t\t\t})\n\t\t}\n\n\t\treturn results\n\t} catch (error) {\n\t\tconst detail = error instanceof Error ? error.message : String(error)\n\t\treturn [\n\t\t\t{\n\t\t\t\tid: 'sync-server',\n\t\t\t\ttitle: 'Sync server',\n\t\t\t\tstatus: 'warn',\n\t\t\t\tmessage: `Could not reach ${statusUrl}: ${detail}`,\n\t\t\t\tfix: 'Start the sync server, or pass --skip-network for local-only checks.',\n\t\t\t},\n\t\t]\n\t}\n}\n\n/**\n * True when any check failed (doctor should exit non-zero).\n */\nexport function doctorHasFailures(results: DoctorCheckResult[]): boolean {\n\treturn results.some((r) => r.status === 'fail')\n}\n","import { mkdir, writeFile } from 'node:fs/promises'\nimport { dirname, resolve } from 'node:path'\nimport type { SchemaDefinition } from '@korajs/core'\nimport { defineCommand } from 'citty'\nimport { InvalidProjectError, SchemaNotFoundError } from '../../errors'\nimport { findProjectRoot, findSchemaFile } from '../../utils/fs-helpers'\nimport { createLogger } from '../../utils/logger'\nimport { loadSchemaDefinition } from '../migrate/schema-loader'\nimport { generateCollectionHooks } from './hook-generator'\nimport { generateTypes } from './type-generator'\n\n/**\n * The `generate` command with `types` subcommand.\n * Reads a schema file and generates TypeScript interfaces.\n */\nexport const generateCommand = defineCommand({\n\tmeta: {\n\t\tname: 'generate',\n\t\tdescription: 'Generate code from your Kora schema',\n\t},\n\tsubCommands: {\n\t\ttypes: defineCommand({\n\t\t\tmeta: {\n\t\t\t\tname: 'types',\n\t\t\t\tdescription: 'Generate TypeScript types from your schema',\n\t\t\t},\n\t\t\targs: {\n\t\t\t\tschema: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Path to schema file',\n\t\t\t\t},\n\t\t\t\toutput: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Output file path',\n\t\t\t\t\tdefault: 'kora/generated/types.ts',\n\t\t\t\t},\n\t\t\t},\n\t\t\tasync run({ args }) {\n\t\t\t\tconst logger = createLogger()\n\n\t\t\t\t// Find project root\n\t\t\t\tconst projectRoot = await findProjectRoot()\n\t\t\t\tif (!projectRoot) {\n\t\t\t\t\tthrow new InvalidProjectError(process.cwd())\n\t\t\t\t}\n\n\t\t\t\t// Find schema file\n\t\t\t\tlet schemaPath: string\n\t\t\t\tif (args.schema && typeof args.schema === 'string') {\n\t\t\t\t\tschemaPath = resolve(args.schema)\n\t\t\t\t} else {\n\t\t\t\t\tconst found = await findSchemaFile(projectRoot)\n\t\t\t\t\tif (!found) {\n\t\t\t\t\t\tthrow new SchemaNotFoundError([\n\t\t\t\t\t\t\t'src/schema.ts',\n\t\t\t\t\t\t\t'schema.ts',\n\t\t\t\t\t\t\t'src/schema.js',\n\t\t\t\t\t\t\t'schema.js',\n\t\t\t\t\t\t])\n\t\t\t\t\t}\n\t\t\t\t\tschemaPath = found\n\t\t\t\t}\n\n\t\t\t\tlogger.step(`Reading schema from ${schemaPath}...`)\n\n\t\t\t\t// Dynamic import the schema file\n\t\t\t\tconst schemaModule: unknown = await import(schemaPath)\n\t\t\t\tconst schema = extractSchema(schemaModule)\n\n\t\t\t\tif (!schema) {\n\t\t\t\t\tlogger.error('Schema file must export a SchemaDefinition as the default export.')\n\t\t\t\t\tprocess.exitCode = 1\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// Generate types\n\t\t\t\tconst output = generateTypes(schema)\n\t\t\t\tconst outputFile = typeof args.output === 'string' ? args.output : 'kora/generated/types.ts'\n\t\t\t\tconst outputPath = resolve(projectRoot, outputFile)\n\n\t\t\t\tawait mkdir(dirname(outputPath), { recursive: true })\n\t\t\t\tawait writeFile(outputPath, output, 'utf-8')\n\n\t\t\t\tlogger.success(`Generated types at ${outputPath}`)\n\t\t\t},\n\t\t}),\n\t\thooks: defineCommand({\n\t\t\tmeta: {\n\t\t\t\tname: 'hooks',\n\t\t\t\tdescription: 'Generate per-collection React hook stubs',\n\t\t\t},\n\t\t\targs: {\n\t\t\t\tschema: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Path to schema file',\n\t\t\t\t},\n\t\t\t\toutput: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Output directory for hooks',\n\t\t\t\t\tdefault: 'kora/generated/hooks',\n\t\t\t\t},\n\t\t\t\ttypes: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Relative import path to generated types from hook files',\n\t\t\t\t\tdefault: '../types',\n\t\t\t\t},\n\t\t\t},\n\t\t\tasync run({ args }) {\n\t\t\t\tconst logger = createLogger()\n\t\t\t\tconst projectRoot = await findProjectRoot()\n\t\t\t\tif (!projectRoot) {\n\t\t\t\t\tthrow new InvalidProjectError(process.cwd())\n\t\t\t\t}\n\n\t\t\t\tlet schemaPath: string\n\t\t\t\tif (args.schema && typeof args.schema === 'string') {\n\t\t\t\t\tschemaPath = resolve(projectRoot, args.schema)\n\t\t\t\t} else {\n\t\t\t\t\tconst found = await findSchemaFile(projectRoot)\n\t\t\t\t\tif (!found) {\n\t\t\t\t\t\tthrow new SchemaNotFoundError([\n\t\t\t\t\t\t\t'src/schema.ts',\n\t\t\t\t\t\t\t'schema.ts',\n\t\t\t\t\t\t\t'src/schema.js',\n\t\t\t\t\t\t\t'schema.js',\n\t\t\t\t\t\t])\n\t\t\t\t\t}\n\t\t\t\t\tschemaPath = found\n\t\t\t\t}\n\n\t\t\t\tconst schema = await loadSchemaDefinition(schemaPath, projectRoot)\n\t\t\t\tconst outputDir =\n\t\t\t\t\ttypeof args.output === 'string'\n\t\t\t\t\t\t? resolve(projectRoot, args.output)\n\t\t\t\t\t\t: resolve(projectRoot, 'kora/generated/hooks')\n\n\t\t\t\tconst files = generateCollectionHooks(schema)\n\t\t\t\tfor (const [name, content] of files) {\n\t\t\t\t\tconst adjusted =\n\t\t\t\t\t\ttypeof args.types === 'string' && args.types !== '../types'\n\t\t\t\t\t\t\t? content.replace(\"from '../types'\", `from '${args.types}'`)\n\t\t\t\t\t\t\t: content\n\t\t\t\t\tconst filePath = resolve(outputDir, name)\n\t\t\t\t\tawait mkdir(dirname(filePath), { recursive: true })\n\t\t\t\t\tawait writeFile(filePath, adjusted, 'utf-8')\n\t\t\t\t}\n\n\t\t\t\tlogger.success(`Generated ${String(files.size)} hook file(s) at ${outputDir}`)\n\t\t\t\tlogger.step('Run `kora generate types` first if ../types is missing.')\n\t\t\t},\n\t\t}),\n\t},\n})\n\nfunction extractSchema(mod: unknown): SchemaDefinition | null {\n\tif (typeof mod !== 'object' || mod === null) return null\n\tconst record = mod as Record<string, unknown>\n\n\t// Check for default export\n\tconst candidate = record.default ?? record\n\tif (isSchemaDefinition(candidate)) return candidate\n\n\treturn null\n}\n\nfunction isSchemaDefinition(value: unknown): value is SchemaDefinition {\n\tif (typeof value !== 'object' || value === null) return false\n\tconst obj = value as Record<string, unknown>\n\treturn (\n\t\ttypeof obj.version === 'number' &&\n\t\ttypeof obj.collections === 'object' &&\n\t\tobj.collections !== null\n\t)\n}\n","import type { SchemaDefinition } from '@korajs/core'\n\n/**\n * Generates per-collection React hook stubs from a schema.\n *\n * @param schema - Validated schema definition\n * @returns Map of file basename to file contents\n */\nexport function generateCollectionHooks(schema: SchemaDefinition): Map<string, string> {\n\tconst files = new Map<string, string>()\n\n\tfor (const collectionName of Object.keys(schema.collections)) {\n\t\tconst pascal = toPascalCase(collectionName)\n\t\tconst hookName = `use${pascal}`\n\n\t\tconst content = [\n\t\t\t'// Auto-generated by `kora generate hooks` — safe to edit',\n\t\t\t`// Schema v${String(schema.version)}`,\n\t\t\t'',\n\t\t\t\"import { useCollection, useMutation, useQuery } from '@korajs/react'\",\n\t\t\t`import type { ${pascal}InsertInput, ${pascal}Record, ${pascal}UpdateInput } from '../types'`,\n\t\t\t'',\n\t\t\t'/**',\n\t\t\t` * Collection hook for \\`${collectionName}\\`.`,\n\t\t\t' * Add useQuery(...) calls with your QueryBuilder factories.',\n\t\t\t' */',\n\t\t\t`export function ${hookName}() {`,\n\t\t\t`\\tconst ${collectionName} = useCollection('${collectionName}')`,\n\t\t\t'',\n\t\t\t`\\tconst insert = useMutation((data: ${pascal}InsertInput) => ${collectionName}.insert(data))`,\n\t\t\t`\\tconst update = useMutation((id: string, data: ${pascal}UpdateInput) =>`,\n\t\t\t`\\t\\t${collectionName}.update(id, data),`,\n\t\t\t'\\t)',\n\t\t\t`\\tconst remove = useMutation((id: string) => ${collectionName}.delete(id))`,\n\t\t\t'',\n\t\t\t'\\treturn {',\n\t\t\t`\\t\\t${collectionName},`,\n\t\t\t'\\t\\tinsert,',\n\t\t\t'\\t\\tupdate,',\n\t\t\t'\\t\\tremove,',\n\t\t\t'\\t}',\n\t\t\t'}',\n\t\t\t'',\n\t\t].join('\\n')\n\n\t\tfiles.set(`${collectionName}.ts`, content)\n\t}\n\n\tconst indexLines = [\n\t\t'// Auto-generated by `kora generate hooks`',\n\t\t'',\n\t\t...Object.keys(schema.collections).map((name) => {\n\t\t\tconst pascal = toPascalCase(name)\n\t\t\treturn `export { use${pascal} } from './${name}'`\n\t\t}),\n\t\t'',\n\t]\n\n\tfiles.set('index.ts', indexLines.join('\\n'))\n\treturn files\n}\n\nfunction toPascalCase(value: string): string {\n\treturn value\n\t\t.split(/[-_]/)\n\t\t.filter((part) => part.length > 0)\n\t\t.map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n\t\t.join('')\n}\n","import type { FieldDescriptor, FieldKind, SchemaDefinition } from '@korajs/core'\n\n/**\n * Generates TypeScript interfaces from a SchemaDefinition.\n * For each collection, produces three interfaces:\n * - {Name}Record: full record type (all fields + id)\n * - {Name}InsertInput: insert input (omit auto fields, optional for fields with defaults)\n * - {Name}UpdateInput: update input (all non-auto fields optional)\n *\n * @param schema - A validated SchemaDefinition from defineSchema()\n * @returns A complete TypeScript file as a string\n */\nexport function generateTypes(schema: SchemaDefinition): string {\n\tconst lines: string[] = [\n\t\t'// Auto-generated by @korajs/cli — do not edit manually',\n\t\t`// Generated from schema version ${String(schema.version)}`,\n\t\t'',\n\t]\n\n\tconst collectionNames = Object.keys(schema.collections)\n\tif (collectionNames.length === 0) {\n\t\treturn lines.join('\\n')\n\t}\n\n\tfor (const [name, collection] of Object.entries(schema.collections)) {\n\t\tconst pascal = toPascalCase(name)\n\t\tconst fields = collection.fields\n\n\t\t// Record type: all fields + id\n\t\tlines.push(`export interface ${pascal}Record {`)\n\t\tlines.push('\\treadonly id: string')\n\t\tfor (const [fieldName, descriptor] of Object.entries(fields)) {\n\t\t\tconst tsType = fieldKindToTypeScript(descriptor)\n\t\t\tconst optional = !descriptor.required && !descriptor.auto ? '?' : ''\n\t\t\tlines.push(`\\treadonly ${fieldName}${optional}: ${tsType}`)\n\t\t}\n\t\tlines.push('}')\n\t\tlines.push('')\n\n\t\t// Insert input: omit auto fields, optional for fields with defaults\n\t\tlines.push(`export interface ${pascal}InsertInput {`)\n\t\tfor (const [fieldName, descriptor] of Object.entries(fields)) {\n\t\t\tif (descriptor.auto) continue\n\t\t\tconst tsType = fieldKindToTypeScript(descriptor)\n\t\t\tconst optional = !descriptor.required || descriptor.defaultValue !== undefined ? '?' : ''\n\t\t\tlines.push(`\\t${fieldName}${optional}: ${tsType}`)\n\t\t}\n\t\tlines.push('}')\n\t\tlines.push('')\n\n\t\t// Update input: all non-auto fields optional\n\t\tlines.push(`export interface ${pascal}UpdateInput {`)\n\t\tfor (const [fieldName, descriptor] of Object.entries(fields)) {\n\t\t\tif (descriptor.auto) continue\n\t\t\tconst tsType = fieldKindToTypeScript(descriptor)\n\t\t\tlines.push(`\\t${fieldName}?: ${tsType}`)\n\t\t}\n\t\tlines.push('}')\n\t\tlines.push('')\n\t}\n\n\treturn lines.join('\\n')\n}\n\n/** Maps a FieldDescriptor to its TypeScript type string */\nfunction fieldKindToTypeScript(descriptor: FieldDescriptor): string {\n\tswitch (descriptor.kind) {\n\t\tcase 'string':\n\t\t\treturn 'string'\n\t\tcase 'number':\n\t\t\treturn 'number'\n\t\tcase 'boolean':\n\t\t\treturn 'boolean'\n\t\tcase 'timestamp':\n\t\t\treturn 'number'\n\t\tcase 'richtext':\n\t\t\treturn 'string'\n\t\tcase 'enum': {\n\t\t\tif (descriptor.enumValues && descriptor.enumValues.length > 0) {\n\t\t\t\treturn descriptor.enumValues.map((v) => `'${v}'`).join(' | ')\n\t\t\t}\n\t\t\treturn 'string'\n\t\t}\n\t\tcase 'array': {\n\t\t\tconst itemType = itemKindToTypeScript(descriptor.itemKind)\n\t\t\treturn `Array<${itemType}>`\n\t\t}\n\t\tdefault:\n\t\t\treturn 'unknown'\n\t}\n}\n\n/** Maps an item FieldKind to its TypeScript type string */\nfunction itemKindToTypeScript(kind: FieldKind | null): string {\n\tswitch (kind) {\n\t\tcase 'string':\n\t\t\treturn 'string'\n\t\tcase 'number':\n\t\t\treturn 'number'\n\t\tcase 'boolean':\n\t\t\treturn 'boolean'\n\t\tcase 'timestamp':\n\t\t\treturn 'number'\n\t\tcase 'richtext':\n\t\t\treturn 'string'\n\t\tcase 'enum':\n\t\t\treturn 'string'\n\t\tcase 'array':\n\t\t\treturn 'unknown[]'\n\t\tdefault:\n\t\t\treturn 'unknown'\n\t}\n}\n\n/** Converts a snake_case or kebab-case name to PascalCase */\nfunction toPascalCase(name: string): string {\n\treturn name\n\t\t.split(/[_-]/)\n\t\t.map((part) => {\n\t\t\tif (part.length === 0) return ''\n\t\t\tconst first = part[0]\n\t\t\treturn first ? first.toUpperCase() + part.slice(1) : ''\n\t\t})\n\t\t.join('')\n}\n","import { defineCommand } from 'citty'\nimport { createLogger } from '../../utils/logger'\n\nconst DEFAULT_SYNC_PORT = 3001\nconst EVENTS_ENDPOINT = '/__kora/events'\n\n/**\n * The `logs` command — streams real-time events from a Kora sync server.\n */\nexport const logsCommand = defineCommand({\n\tmeta: {\n\t\tname: 'logs',\n\t\tdescription: 'Stream real-time events from a Kora sync server',\n\t},\n\targs: {\n\t\turl: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Sync server URL (default: http://localhost:3001)',\n\t\t\tdefault: `http://localhost:${DEFAULT_SYNC_PORT}`,\n\t\t},\n\t\tfollow: {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Follow log output (like tail -f)',\n\t\t\tdefault: true,\n\t\t\talias: 'f',\n\t\t},\n\t\tlevel: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Filter by log level (info, warn, error)',\n\t\t},\n\t\ttoken: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Admin token (defaults to KORA_ADMIN_TOKEN)',\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tconst logger = createLogger()\n\t\tconst url = typeof args.url === 'string' ? args.url : `http://localhost:${DEFAULT_SYNC_PORT}`\n\t\tconst follow = args.follow !== false\n\t\tconst levelFilter = typeof args.level === 'string' ? args.level : null\n\t\tconst token =\n\t\t\ttypeof args.token === 'string' ? args.token : (process.env.KORA_ADMIN_TOKEN ?? undefined)\n\t\tconst eventsUrl = `${url.replace(/\\/$/, '')}${EVENTS_ENDPOINT}`\n\n\t\tlogger.banner()\n\t\tlogger.info(`Connecting to ${eventsUrl}...`)\n\t\tlogger.blank()\n\n\t\ttry {\n\t\t\tconst response = await fetch(eventsUrl, {\n\t\t\t\theaders: token ? { Authorization: `Bearer ${token}` } : undefined,\n\t\t\t})\n\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Failed to connect to ${eventsUrl}: ${response.status} ${response.statusText}`,\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tconst reader = response.body?.getReader()\n\t\t\tif (!reader) {\n\t\t\t\tthrow new Error('Response body is not readable')\n\t\t\t}\n\n\t\t\tconst decoder = new TextDecoder()\n\t\t\tlet buffer = ''\n\n\t\t\tconst processLine = (line: string) => {\n\t\t\t\t// SSE format: \"event: <type>\\ndata: <json>\\n\\n\"\n\t\t\t\tif (line.startsWith('event: ')) {\n\t\t\t\t\treturn // We handle the data line\n\t\t\t\t}\n\t\t\t\tif (line.startsWith('data: ')) {\n\t\t\t\t\tconst data = line.slice(6)\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst parsed = JSON.parse(data) as Record<string, unknown>\n\t\t\t\t\t\tconst level = String(parsed.level ?? 'info')\n\n\t\t\t\t\t\tif (levelFilter && level !== levelFilter) return\n\n\t\t\t\t\t\tconst timestamp = parsed.timestamp\n\t\t\t\t\t\t\t? new Date(parsed.timestamp as number).toISOString()\n\t\t\t\t\t\t\t: ''\n\t\t\t\t\t\tconst event = String(parsed.event ?? 'unknown')\n\t\t\t\t\t\tconst nodeId = parsed.nodeId ? ` [${parsed.nodeId}]` : ''\n\t\t\t\t\t\tconst session = parsed.sessionId ? ` <${parsed.sessionId}>` : ''\n\t\t\t\t\t\tconst count = parsed.count ? ` (${parsed.count})` : ''\n\t\t\t\t\t\tconst error = parsed.error ? ` — ${parsed.error}` : ''\n\n\t\t\t\t\t\tconst prefix = level === 'error' ? '✗' : level === 'warn' ? '⚠' : '●'\n\t\t\t\t\t\tconst color =\n\t\t\t\t\t\t\tlevel === 'error' ? '\\x1b[31m' : level === 'warn' ? '\\x1b[33m' : '\\x1b[36m'\n\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t`${color}${prefix}${'\\x1b[0m'} ${timestamp.slice(11, 23)} ${event}${nodeId}${session}${count}${error}`,\n\t\t\t\t\t\t)\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Ignore parse errors on malformed data\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst read = async () => {\n\t\t\t\twhile (true) {\n\t\t\t\t\tconst { done, value } = await reader.read()\n\t\t\t\t\tif (done) break\n\n\t\t\t\t\tbuffer += decoder.decode(value, { stream: true })\n\t\t\t\t\tconst lines = buffer.split('\\n')\n\t\t\t\t\tbuffer = lines.pop() ?? ''\n\n\t\t\t\t\tfor (const line of lines) {\n\t\t\t\t\t\tprocessLine(line.trim())\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!follow) break\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait read()\n\t\t} catch (error) {\n\t\t\tlogger.error(`Failed to connect to ${eventsUrl}`)\n\t\t\tif (error instanceof Error) {\n\t\t\t\tlogger.error(error.message)\n\t\t\t}\n\t\t\tlogger.blank()\n\t\t\tlogger.step('Make sure the Kora sync server is running.')\n\t\t\tlogger.step('Start it with: kora dev')\n\t\t\tprocess.exit(1)\n\t\t}\n\t},\n})\n","import { mkdir, readFile, readdir, writeFile } from 'node:fs/promises'\nimport { dirname, join, resolve } from 'node:path'\nimport type { SchemaDefinition } from '@korajs/core'\nimport { defineCommand } from 'citty'\nimport { InvalidProjectError, SchemaNotFoundError } from '../../errors'\nimport { findProjectRoot, findSchemaFile } from '../../utils/fs-helpers'\nimport { createLogger } from '../../utils/logger'\nimport { promptConfirm } from '../../utils/prompt'\nimport { loadKoraConfig } from '../dev/kora-config'\nimport { generateMigration } from './migration-generator'\nimport { runMigration } from './migration-runner'\nimport { generateOperationTransformModule } from './operation-transform-generator'\nimport { diffSchemas } from './schema-differ'\nimport { loadSchemaDefinition } from './schema-loader'\n\nconst SNAPSHOT_PATH = 'kora/schema.snapshot.json'\nconst MIGRATIONS_DIR = 'kora/migrations'\n\ninterface MigrationManifest {\n\tid: string\n\tfromVersion: number\n\ttoVersion: number\n\tup: string[]\n\tdown: string[]\n\tsummary: string[]\n\tcontainsBreakingChanges: boolean\n}\n\n/**\n * The `migrate` command — detects schema changes and generates migration artifacts.\n */\nexport const migrateCommand = defineCommand({\n\tmeta: {\n\t\tname: 'migrate',\n\t\tdescription: 'Detect schema changes and generate/apply migrations',\n\t},\n\targs: {\n\t\tapply: {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Apply migration to configured database backends',\n\t\t\tdefault: false,\n\t\t},\n\t\tschema: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Path to schema file',\n\t\t},\n\t\tdb: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'SQLite database path for --apply (overrides config)',\n\t\t},\n\t\t'output-dir': {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Migration output directory',\n\t\t\tdefault: MIGRATIONS_DIR,\n\t\t},\n\t\t'dry-run': {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Preview migration changes without writing files',\n\t\t\tdefault: false,\n\t\t},\n\t\tforce: {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Skip breaking-change confirmation prompts',\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tconst logger = createLogger()\n\n\t\tconst projectRoot = await findProjectRoot()\n\t\tif (!projectRoot) {\n\t\t\tthrow new InvalidProjectError(process.cwd())\n\t\t}\n\n\t\tconst config = await loadKoraConfig(projectRoot)\n\t\tconst resolvedSchemaPath =\n\t\t\ttypeof args.schema === 'string'\n\t\t\t\t? resolve(projectRoot, args.schema)\n\t\t\t\t: typeof config?.schema === 'string'\n\t\t\t\t\t? resolve(projectRoot, config.schema)\n\t\t\t\t\t: await findSchemaFile(projectRoot)\n\n\t\tif (!resolvedSchemaPath) {\n\t\t\tthrow new SchemaNotFoundError(['src/schema.ts', 'schema.ts', 'src/schema.js', 'schema.js'])\n\t\t}\n\n\t\tconst currentSchema = await loadSchemaDefinition(resolvedSchemaPath, projectRoot)\n\n\t\tconst snapshotFile = join(projectRoot, SNAPSHOT_PATH)\n\t\tconst previousSchema = await readSchemaSnapshot(snapshotFile)\n\n\t\tif (!previousSchema) {\n\t\t\tif (args['dry-run'] === true) {\n\t\t\t\tlogger.info('No schema snapshot found. Dry run: baseline snapshot would be created.')\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tawait writeSchemaSnapshot(snapshotFile, currentSchema)\n\t\t\tlogger.success(`Initialized schema snapshot at ${snapshotFile}`)\n\t\t\tlogger.step('Run `kora migrate` again after schema changes to generate migrations.')\n\t\t\treturn\n\t\t}\n\n\t\tconst diff = diffSchemas(previousSchema, currentSchema)\n\t\tconst outputDir =\n\t\t\ttypeof args['output-dir'] === 'string'\n\t\t\t\t? resolve(projectRoot, args['output-dir'])\n\t\t\t\t: resolve(projectRoot, MIGRATIONS_DIR)\n\n\t\tif (!diff.hasChanges) {\n\t\t\tlogger.success('No schema changes detected.')\n\t\t\tif (args.apply === true) {\n\t\t\t\tconst sqlitePath = resolveSqliteApplyPath(args.db, projectRoot, config)\n\t\t\t\tconst postgresConnectionString = resolvePostgresConnectionString(config)\n\t\t\t\tconst pending = await listMigrationManifests(outputDir)\n\n\t\t\t\tif (pending.length === 0) {\n\t\t\t\t\tlogger.step('No migration files found to apply.')\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tfor (const manifest of pending) {\n\t\t\t\t\tconst report = await runMigration({\n\t\t\t\t\t\tupStatements: manifest.up,\n\t\t\t\t\t\tmigrationId: manifest.id,\n\t\t\t\t\t\tfromVersion: manifest.fromVersion,\n\t\t\t\t\t\ttoVersion: manifest.toVersion,\n\t\t\t\t\t\tsqlitePath,\n\t\t\t\t\t\tpostgresConnectionString,\n\t\t\t\t\t\tprojectRoot,\n\t\t\t\t\t})\n\n\t\t\t\t\tfor (const backend of report.backends) {\n\t\t\t\t\t\tlogger.step(\n\t\t\t\t\t\t\t` ${manifest.id} -> ${backend.backend}: applied=${backend.statementsApplied}, skipped=${backend.skipped}`,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tconst generated = generateMigration(previousSchema, currentSchema, diff)\n\n\t\tlogger.banner()\n\t\tlogger.info(`Detected schema change: v${diff.fromVersion} → v${diff.toVersion}`)\n\t\tlogger.blank()\n\t\tlogger.info('Changes:')\n\t\tfor (const line of generated.summary) {\n\t\t\tlogger.step(` ${line}`)\n\t\t}\n\n\t\tif (diff.hasBreakingChanges && args['dry-run'] !== true) {\n\t\t\tlogger.blank()\n\t\t\tlogger.warn('Breaking schema changes detected.')\n\t\t\tconst shouldContinue = await confirmBreakingChanges(args.force === true)\n\t\t\tif (!shouldContinue) {\n\t\t\t\tlogger.warn('Migration generation aborted.')\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tif (args['dry-run'] === true) {\n\t\t\tlogger.blank()\n\t\t\tlogger.warn('Dry run enabled: no files written, no migrations applied.')\n\t\t\treturn\n\t\t}\n\n\t\tawait mkdir(outputDir, { recursive: true })\n\n\t\tconst migrationPath = await writeMigrationFile(\n\t\t\toutputDir,\n\t\t\tdiff.fromVersion,\n\t\t\tdiff.toVersion,\n\t\t\tgenerated,\n\t\t)\n\t\tawait writeSchemaSnapshot(snapshotFile, currentSchema)\n\n\t\tlogger.blank()\n\t\tlogger.success(`Generated migration: ${migrationPath}`)\n\n\t\tif (args.apply === true) {\n\t\t\tconst sqlitePath = resolveSqliteApplyPath(args.db, projectRoot, config)\n\t\t\tconst postgresConnectionString = resolvePostgresConnectionString(config)\n\t\t\tconst pending = await listMigrationManifests(outputDir)\n\n\t\t\tfor (const manifest of pending) {\n\t\t\t\tconst report = await runMigration({\n\t\t\t\t\tupStatements: manifest.up,\n\t\t\t\t\tmigrationId: manifest.id,\n\t\t\t\t\tfromVersion: manifest.fromVersion,\n\t\t\t\t\ttoVersion: manifest.toVersion,\n\t\t\t\t\tsqlitePath,\n\t\t\t\t\tpostgresConnectionString,\n\t\t\t\t\tprojectRoot,\n\t\t\t\t})\n\n\t\t\t\tfor (const backend of report.backends) {\n\t\t\t\t\tlogger.step(\n\t\t\t\t\t\t` ${manifest.id} -> ${backend.backend}: applied=${backend.statementsApplied}, skipped=${backend.skipped}, history=${backend.historyRecorded}`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlogger.success('Applied pending migrations successfully.')\n\t\t}\n\t},\n})\n\nasync function readSchemaSnapshot(path: string): Promise<SchemaDefinition | null> {\n\ttry {\n\t\tconst content = await readFile(path, 'utf-8')\n\t\treturn JSON.parse(content) as SchemaDefinition\n\t} catch {\n\t\treturn null\n\t}\n}\n\nasync function confirmBreakingChanges(force: boolean): Promise<boolean> {\n\tif (force) {\n\t\treturn true\n\t}\n\n\tif (!isInteractiveTerminal()) {\n\t\tthrow new Error(\n\t\t\t'Breaking schema changes require confirmation. Re-run with --force to continue or --dry-run to preview.',\n\t\t)\n\t}\n\n\treturn await promptConfirm('Continue and generate a breaking migration?', false)\n}\n\nfunction isInteractiveTerminal(): boolean {\n\treturn process.stdin.isTTY === true && process.stdout.isTTY === true\n}\n\nasync function writeSchemaSnapshot(path: string, schema: SchemaDefinition): Promise<void> {\n\tawait mkdir(dirname(path), { recursive: true })\n\tawait writeFile(path, `${JSON.stringify(schema, null, 2)}\\n`, 'utf-8')\n}\n\nasync function writeMigrationFile(\n\toutputDir: string,\n\tfromVersion: number,\n\ttoVersion: number,\n\tgenerated: ReturnType<typeof generateMigration>,\n): Promise<string> {\n\tconst existing = await readdir(outputDir).catch(() => [])\n\tconst sequence = existing.filter((file) => /^\\d{3}-/.test(file)).length + 1\n\tconst filename = `${String(sequence).padStart(3, '0')}-v${fromVersion}-to-v${toVersion}.ts`\n\tconst path = join(outputDir, filename)\n\tconst migrationId = filename.replace(/\\.ts$/, '')\n\n\tconst fileContent = [\n\t\t`export const up = ${JSON.stringify(generated.up, null, 2)} as const`,\n\t\t'',\n\t\t`export const down = ${JSON.stringify(generated.down, null, 2)} as const`,\n\t\t'',\n\t\t`export const summary = ${JSON.stringify(generated.summary, null, 2)} as const`,\n\t\t'',\n\t\t`export const containsBreakingChanges = ${generated.containsBreakingChanges}`,\n\t\t'',\n\t].join('\\n')\n\n\tawait writeFile(path, fileContent, 'utf-8')\n\n\tconst transformsPath = join(outputDir, `${migrationId}.transforms.ts`)\n\tawait writeFile(transformsPath, generateOperationTransformModule(fromVersion, toVersion), 'utf-8')\n\tawait writeMigrationManifest(join(outputDir, `${migrationId}.json`), {\n\t\tid: migrationId,\n\t\tfromVersion,\n\t\ttoVersion,\n\t\tup: generated.up,\n\t\tdown: generated.down,\n\t\tsummary: generated.summary,\n\t\tcontainsBreakingChanges: generated.containsBreakingChanges,\n\t})\n\treturn path\n}\n\nasync function writeMigrationManifest(path: string, manifest: MigrationManifest): Promise<void> {\n\tawait writeFile(path, `${JSON.stringify(manifest, null, 2)}\\n`, 'utf-8')\n}\n\nasync function listMigrationManifests(outputDir: string): Promise<MigrationManifest[]> {\n\tconst files = await readdir(outputDir).catch(() => [])\n\tconst migrationFiles = files\n\t\t.filter((file) => /^\\d{3}-.*\\.ts$/.test(file))\n\t\t.sort((left, right) => left.localeCompare(right))\n\n\tconst manifests: MigrationManifest[] = []\n\tfor (const file of migrationFiles) {\n\t\tconst id = file.replace(/\\.ts$/, '')\n\t\tconst manifestPath = join(outputDir, `${id}.json`)\n\t\tconst jsonManifest = await readMigrationManifest(manifestPath)\n\n\t\tif (jsonManifest) {\n\t\t\tmanifests.push({ ...jsonManifest, id })\n\t\t\tcontinue\n\t\t}\n\n\t\tconst migrationPath = join(outputDir, file)\n\t\tconst sourceManifest = await readMigrationManifestFromSource(migrationPath, id)\n\t\tmanifests.push(sourceManifest)\n\t}\n\n\treturn manifests\n}\n\nasync function readMigrationManifest(path: string): Promise<MigrationManifest | null> {\n\ttry {\n\t\tconst content = await readFile(path, 'utf-8')\n\t\treturn JSON.parse(content) as MigrationManifest\n\t} catch (error) {\n\t\tconst code = (error as NodeJS.ErrnoException).code\n\t\tif (code === 'ENOENT') {\n\t\t\treturn null\n\t\t}\n\t\tthrow error\n\t}\n}\n\nasync function readMigrationManifestFromSource(\n\tpath: string,\n\tid: string,\n): Promise<MigrationManifest> {\n\tconst content = await readFile(path, 'utf-8')\n\tconst versions = parseVersionsFromMigrationId(id)\n\n\treturn {\n\t\tid,\n\t\tfromVersion: versions.fromVersion,\n\t\ttoVersion: versions.toVersion,\n\t\tup: parseStringArrayExport(content, 'up'),\n\t\tdown: parseStringArrayExport(content, 'down'),\n\t\tsummary: parseStringArrayExport(content, 'summary'),\n\t\tcontainsBreakingChanges: parseBooleanExport(content, 'containsBreakingChanges'),\n\t}\n}\n\nfunction parseVersionsFromMigrationId(id: string): { fromVersion: number; toVersion: number } {\n\tconst match = id.match(/-v(\\d+)-to-v(\\d+)$/)\n\tif (!match) {\n\t\tthrow new Error(`Migration id \"${id}\" does not include a vX-to-vY version suffix.`)\n\t}\n\n\tconst fromVersionText = match[1]\n\tconst toVersionText = match[2]\n\tif (fromVersionText === undefined || toVersionText === undefined) {\n\t\tthrow new Error(`Migration id \"${id}\" does not include a vX-to-vY version suffix.`)\n\t}\n\n\treturn {\n\t\tfromVersion: Number.parseInt(fromVersionText, 10),\n\t\ttoVersion: Number.parseInt(toVersionText, 10),\n\t}\n}\n\nfunction parseStringArrayExport(source: string, exportName: 'up' | 'down' | 'summary'): string[] {\n\tconst expression = parseExportExpression(source, exportName)\n\tconst parsed = JSON.parse(expression) as unknown\n\tif (!Array.isArray(parsed) || parsed.some((item) => typeof item !== 'string')) {\n\t\tthrow new Error(`Migration export \"${exportName}\" must be a string array.`)\n\t}\n\n\treturn parsed\n}\n\nfunction parseBooleanExport(source: string, exportName: 'containsBreakingChanges'): boolean {\n\tconst expression = parseLiteralExport(source, exportName)\n\tif (expression === 'true') return true\n\tif (expression === 'false') return false\n\tthrow new Error(`Migration export \"${exportName}\" must be a boolean literal.`)\n}\n\nfunction parseExportExpression(source: string, exportName: string): string {\n\tconst escapedName = exportName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\tconst regex = new RegExp(`export const ${escapedName} = ([\\\\s\\\\S]*?) as const`)\n\tconst match = source.match(regex)\n\tif (!match || !match[1]) {\n\t\tthrow new Error(`Failed to read migration export \"${exportName}\".`)\n\t}\n\n\treturn match[1].trim()\n}\n\nfunction parseLiteralExport(source: string, exportName: string): string {\n\tconst escapedName = exportName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\tconst regex = new RegExp(`export const ${escapedName} = ([^\\n\\r]+)`)\n\tconst match = source.match(regex)\n\tif (!match || !match[1]) {\n\t\tthrow new Error(`Failed to read migration export \"${exportName}\".`)\n\t}\n\n\treturn match[1].trim()\n}\n\nfunction resolveSqliteApplyPath(\n\tdbArg: unknown,\n\tprojectRoot: string,\n\tconfig: Awaited<ReturnType<typeof loadKoraConfig>>,\n): string | undefined {\n\tif (typeof dbArg === 'string') {\n\t\treturn resolve(projectRoot, dbArg)\n\t}\n\n\tconst sync = config?.dev?.sync\n\tif (typeof sync === 'object' && sync !== null) {\n\t\tif (sync.store === 'sqlite') {\n\t\t\treturn join(projectRoot, 'kora-sync.db')\n\t\t}\n\t\tif (typeof sync.store === 'object' && sync.store !== null && sync.store.type === 'sqlite') {\n\t\t\tif (typeof sync.store.filename === 'string' && sync.store.filename.length > 0) {\n\t\t\t\treturn resolve(projectRoot, sync.store.filename)\n\t\t\t}\n\t\t\treturn join(projectRoot, 'kora-sync.db')\n\t\t}\n\t}\n\n\treturn undefined\n}\n\nfunction resolvePostgresConnectionString(\n\tconfig: Awaited<ReturnType<typeof loadKoraConfig>>,\n): string | undefined {\n\tconst sync = config?.dev?.sync\n\tif (typeof sync !== 'object' || sync === null) return undefined\n\n\tif (sync.store === 'postgres') {\n\t\treturn process.env.DATABASE_URL\n\t}\n\n\tif (typeof sync.store === 'object' && sync.store !== null && sync.store.type === 'postgres') {\n\t\treturn sync.store.connectionString\n\t}\n\n\treturn undefined\n}\n","import { generateSQL } from '@korajs/core'\nimport type { CollectionDefinition, FieldDescriptor, SchemaDefinition } from '@korajs/core'\nimport type { SchemaDiff } from './schema-differ'\nimport { getChangedCollections } from './schema-differ'\n\nexport interface GeneratedMigration {\n\tup: string[]\n\tdown: string[]\n\tsummary: string[]\n\tcontainsBreakingChanges: boolean\n}\n\n/**\n * Generates SQL up/down migration statements from a schema diff.\n */\nexport function generateMigration(\n\tprevious: SchemaDefinition,\n\tcurrent: SchemaDefinition,\n\tdiff: SchemaDiff,\n): GeneratedMigration {\n\tconst up: string[] = []\n\tconst down: string[] = []\n\n\tfor (const change of diff.changes) {\n\t\tif (change.type === 'collection-added') {\n\t\t\tconst collectionDef = current.collections[change.collection]\n\t\t\tif (!collectionDef) continue\n\t\t\tup.push(...generateSQL(change.collection, collectionDef))\n\t\t\tdown.push(...dropCollectionStatements(change.collection))\n\t\t}\n\n\t\tif (change.type === 'collection-removed') {\n\t\t\tconst collectionDef = previous.collections[change.collection]\n\t\t\tup.push(...dropCollectionStatements(change.collection))\n\t\t\tif (collectionDef) {\n\t\t\t\tdown.push(...generateSQL(change.collection, collectionDef))\n\t\t\t}\n\t\t}\n\t}\n\n\tconst changedCollections = getChangedCollections(diff).filter(\n\t\t(collection) =>\n\t\t\tcollection in previous.collections &&\n\t\t\tcollection in current.collections &&\n\t\t\tdiff.changes.some(\n\t\t\t\t(change) =>\n\t\t\t\t\tchange.collection === collection &&\n\t\t\t\t\t(change.type === 'field-added' ||\n\t\t\t\t\t\tchange.type === 'field-removed' ||\n\t\t\t\t\t\tchange.type === 'field-changed' ||\n\t\t\t\t\t\tchange.type === 'index-added' ||\n\t\t\t\t\t\tchange.type === 'index-removed'),\n\t\t\t),\n\t)\n\n\tfor (const collection of changedCollections) {\n\t\tconst previousDef = previous.collections[collection]\n\t\tconst currentDef = current.collections[collection]\n\t\tif (!previousDef || !currentDef) continue\n\n\t\tvalidateRebuildSafety(collection, previousDef, currentDef)\n\n\t\tup.push(...generateRebuildStatements(collection, previousDef, currentDef))\n\t\tdown.push(...generateRebuildStatements(collection, currentDef, previousDef))\n\t}\n\n\tdown.reverse()\n\n\treturn {\n\t\tup,\n\t\tdown,\n\t\tsummary: diff.changes.map(formatChange),\n\t\tcontainsBreakingChanges: diff.hasBreakingChanges,\n\t}\n}\n\nfunction generateRebuildStatements(\n\tcollection: string,\n\tfrom: CollectionDefinition,\n\tto: CollectionDefinition,\n): string[] {\n\tconst table = quoteIdentifier(collection)\n\tconst tempTable = quoteIdentifier(`_kora_mig_${collection}_new`)\n\n\tconst targetColumns = [\n\t\t'id TEXT PRIMARY KEY NOT NULL',\n\t\t...Object.entries(to.fields).map(([field, descriptor]) => columnDefinition(field, descriptor)),\n\t\t'_created_at INTEGER NOT NULL',\n\t\t'_updated_at INTEGER NOT NULL',\n\t\t'_deleted INTEGER NOT NULL DEFAULT 0',\n\t]\n\n\tconst statements: string[] = []\n\tstatements.push(`CREATE TABLE ${tempTable} (\\n ${targetColumns.join(',\\n ')}\\n)`)\n\n\tconst toFields = Object.keys(to.fields)\n\tconst columns = ['id', ...toFields, '_created_at', '_updated_at', '_deleted']\n\tconst selectExpressions = columns.map((column) =>\n\t\tprojectionForColumn(column, from.fields, to.fields[column] ?? null),\n\t)\n\n\tstatements.push(\n\t\t`INSERT INTO ${tempTable} (${columns.map(quoteIdentifier).join(', ')}) SELECT ${selectExpressions.join(', ')} FROM ${table}`,\n\t)\n\tstatements.push(`DROP TABLE ${table}`)\n\tstatements.push(`ALTER TABLE ${tempTable} RENAME TO ${table}`)\n\n\tfor (const indexField of to.indexes) {\n\t\tstatements.push(\n\t\t\t`CREATE INDEX IF NOT EXISTS idx_${collection}_${indexField} ON ${table} (${quoteIdentifier(indexField)})`,\n\t\t)\n\t}\n\n\treturn statements\n}\n\nfunction validateRebuildSafety(\n\tcollection: string,\n\tfrom: CollectionDefinition,\n\tto: CollectionDefinition,\n): void {\n\tfor (const [fieldName, descriptor] of Object.entries(to.fields)) {\n\t\tif (fieldName in from.fields) continue\n\t\tif (descriptor.required && descriptor.defaultValue === undefined && !descriptor.auto) {\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot auto-migrate collection \"${collection}\": added required field \"${fieldName}\" has no default value.`,\n\t\t\t)\n\t\t}\n\t}\n\n\tfor (const [fieldName, targetDescriptor] of Object.entries(to.fields)) {\n\t\tconst sourceDescriptor = from.fields[fieldName]\n\t\tif (!sourceDescriptor) continue\n\t\tif (canTransformField(sourceDescriptor, targetDescriptor)) continue\n\n\t\tif (\n\t\t\ttargetDescriptor.required &&\n\t\t\ttargetDescriptor.defaultValue === undefined &&\n\t\t\t!targetDescriptor.auto\n\t\t) {\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot auto-migrate collection \"${collection}\": changed required field \"${fieldName}\" from ${sourceDescriptor.kind} to ${targetDescriptor.kind} without a safe transform/default.`,\n\t\t\t)\n\t\t}\n\t}\n}\n\nfunction projectionForColumn(\n\tcolumn: string,\n\tfromFields: Record<string, FieldDescriptor>,\n\ttargetDescriptor: FieldDescriptor | null,\n): string {\n\tif (\n\t\tcolumn === 'id' ||\n\t\tcolumn === '_created_at' ||\n\t\tcolumn === '_updated_at' ||\n\t\tcolumn === '_deleted'\n\t) {\n\t\treturn quoteIdentifier(column)\n\t}\n\n\tconst sourceDescriptor = fromFields[column]\n\tif (sourceDescriptor && targetDescriptor) {\n\t\treturn projectionForFieldTransform(column, sourceDescriptor, targetDescriptor)\n\t}\n\n\tif (sourceDescriptor) {\n\t\treturn quoteIdentifier(column)\n\t}\n\n\tif (!targetDescriptor) {\n\t\treturn 'NULL'\n\t}\n\n\tif (targetDescriptor.auto && targetDescriptor.kind === 'timestamp') {\n\t\treturn \"CAST(strftime('%s','now') AS INTEGER) * 1000\"\n\t}\n\n\tif (targetDescriptor.defaultValue !== undefined) {\n\t\treturn sqlLiteral(targetDescriptor.defaultValue)\n\t}\n\n\treturn 'NULL'\n}\n\nfunction projectionForFieldTransform(\n\tcolumn: string,\n\tsource: FieldDescriptor,\n\ttarget: FieldDescriptor,\n): string {\n\tconst sourceColumn = quoteIdentifier(column)\n\tif (source.kind === target.kind && source.itemKind === target.itemKind) {\n\t\tif (target.kind === 'enum' && target.enumValues && target.enumValues.length > 0) {\n\t\t\tconst allowed = target.enumValues.map((value) => sqlLiteral(value)).join(', ')\n\t\t\tconst fallback =\n\t\t\t\ttarget.defaultValue !== undefined ? sqlLiteral(target.defaultValue) : sourceColumn\n\t\t\treturn `CASE WHEN ${sourceColumn} IN (${allowed}) THEN ${sourceColumn} ELSE ${fallback} END`\n\t\t}\n\t\treturn sourceColumn\n\t}\n\n\tif (target.kind === 'string') {\n\t\treturn `CAST(${sourceColumn} AS TEXT)`\n\t}\n\n\tif (target.kind === 'number' || target.kind === 'timestamp') {\n\t\tif (\n\t\t\tsource.kind === 'string' ||\n\t\t\tsource.kind === 'enum' ||\n\t\t\tsource.kind === 'number' ||\n\t\t\tsource.kind === 'timestamp' ||\n\t\t\tsource.kind === 'boolean'\n\t\t) {\n\t\t\tconst castType = target.kind === 'number' ? 'REAL' : 'INTEGER'\n\t\t\treturn `CASE WHEN ${sourceColumn} IS NULL THEN NULL ELSE CAST(${sourceColumn} AS ${castType}) END`\n\t\t}\n\t}\n\n\tif (target.kind === 'boolean') {\n\t\tif (source.kind === 'number' || source.kind === 'timestamp' || source.kind === 'boolean') {\n\t\t\treturn `CASE WHEN ${sourceColumn} IS NULL THEN NULL WHEN CAST(${sourceColumn} AS REAL) = 0 THEN 0 ELSE 1 END`\n\t\t}\n\n\t\tif (source.kind === 'string' || source.kind === 'enum') {\n\t\t\treturn `CASE WHEN ${sourceColumn} IS NULL THEN NULL WHEN LOWER(TRIM(CAST(${sourceColumn} AS TEXT))) IN ('1','true','t','yes','y','on') THEN 1 WHEN LOWER(TRIM(CAST(${sourceColumn} AS TEXT))) IN ('0','false','f','no','n','off') THEN 0 ELSE ${projectionFallback(target)} END`\n\t\t}\n\t}\n\n\tif (target.kind === 'enum' && target.enumValues && target.enumValues.length > 0) {\n\t\tif (source.kind === 'string' || source.kind === 'enum') {\n\t\t\tconst allowed = target.enumValues.map((value) => sqlLiteral(value)).join(', ')\n\t\t\treturn `CASE WHEN ${sourceColumn} IN (${allowed}) THEN ${sourceColumn} ELSE ${projectionFallback(target)} END`\n\t\t}\n\t}\n\n\tif (target.kind === 'array' && source.kind === 'array' && source.itemKind === target.itemKind) {\n\t\treturn sourceColumn\n\t}\n\n\tif (target.auto && target.kind === 'timestamp') {\n\t\treturn \"CAST(strftime('%s','now') AS INTEGER) * 1000\"\n\t}\n\n\treturn projectionFallback(target)\n}\n\nfunction canTransformField(source: FieldDescriptor, target: FieldDescriptor): boolean {\n\tif (source.kind === target.kind && source.itemKind === target.itemKind) {\n\t\treturn true\n\t}\n\n\tif (target.kind === 'string') {\n\t\treturn true\n\t}\n\n\tif (target.kind === 'number' || target.kind === 'timestamp') {\n\t\treturn (\n\t\t\tsource.kind === 'string' ||\n\t\t\tsource.kind === 'enum' ||\n\t\t\tsource.kind === 'number' ||\n\t\t\tsource.kind === 'timestamp' ||\n\t\t\tsource.kind === 'boolean'\n\t\t)\n\t}\n\n\tif (target.kind === 'boolean') {\n\t\treturn (\n\t\t\tsource.kind === 'number' ||\n\t\t\tsource.kind === 'timestamp' ||\n\t\t\tsource.kind === 'boolean' ||\n\t\t\tsource.kind === 'string' ||\n\t\t\tsource.kind === 'enum'\n\t\t)\n\t}\n\n\tif (target.kind === 'enum') {\n\t\treturn source.kind === 'string' || source.kind === 'enum'\n\t}\n\n\tif (target.kind === 'array') {\n\t\treturn source.kind === 'array' && source.itemKind === target.itemKind\n\t}\n\n\tif (target.kind === 'richtext') {\n\t\treturn source.kind === 'richtext'\n\t}\n\n\treturn false\n}\n\nfunction projectionFallback(target: FieldDescriptor): string {\n\tif (target.auto && target.kind === 'timestamp') {\n\t\treturn \"CAST(strftime('%s','now') AS INTEGER) * 1000\"\n\t}\n\n\tif (target.defaultValue !== undefined) {\n\t\treturn sqlLiteral(target.defaultValue)\n\t}\n\n\treturn 'NULL'\n}\n\nfunction dropCollectionStatements(collection: string): string[] {\n\tconst table = quoteIdentifier(collection)\n\tconst opsTable = quoteIdentifier(`_kora_ops_${collection}`)\n\treturn [`DROP TABLE IF EXISTS ${table}`, `DROP TABLE IF EXISTS ${opsTable}`]\n}\n\nfunction columnDefinition(fieldName: string, descriptor: FieldDescriptor): string {\n\tconst sqlType = mapFieldType(descriptor)\n\tconst parts = [quoteIdentifier(fieldName), sqlType]\n\n\tif (descriptor.required && descriptor.defaultValue === undefined && !descriptor.auto) {\n\t\tparts.push('NOT NULL')\n\t}\n\n\tif (descriptor.defaultValue !== undefined) {\n\t\tparts.push(`DEFAULT ${sqlLiteral(descriptor.defaultValue)}`)\n\t}\n\n\tif (descriptor.kind === 'enum' && descriptor.enumValues) {\n\t\tconst values = descriptor.enumValues.map((value) => sqlLiteral(value)).join(', ')\n\t\tparts.push(`CHECK (${quoteIdentifier(fieldName)} IN (${values}))`)\n\t}\n\n\treturn parts.join(' ')\n}\n\nfunction mapFieldType(descriptor: FieldDescriptor): string {\n\tswitch (descriptor.kind) {\n\t\tcase 'string':\n\t\t\treturn 'TEXT'\n\t\tcase 'number':\n\t\t\treturn 'REAL'\n\t\tcase 'boolean':\n\t\t\treturn 'INTEGER'\n\t\tcase 'enum':\n\t\t\treturn 'TEXT'\n\t\tcase 'timestamp':\n\t\t\treturn 'INTEGER'\n\t\tcase 'array':\n\t\t\treturn 'TEXT'\n\t\tcase 'richtext':\n\t\t\treturn 'BLOB'\n\t}\n}\n\nfunction sqlLiteral(value: unknown): string {\n\tif (value === null) return 'NULL'\n\tif (typeof value === 'number') return String(value)\n\tif (typeof value === 'boolean') return value ? '1' : '0'\n\tif (typeof value === 'string') return `'${value.replaceAll(\"'\", \"''\")}'`\n\treturn `'${JSON.stringify(value).replaceAll(\"'\", \"''\")}'`\n}\n\nfunction quoteIdentifier(identifier: string): string {\n\tif (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(identifier)) {\n\t\tthrow new Error(`Invalid SQL identifier: ${identifier}`)\n\t}\n\treturn identifier\n}\n\nfunction formatChange(change: SchemaDiff['changes'][number]): string {\n\tswitch (change.type) {\n\t\tcase 'collection-added':\n\t\t\treturn `+ collection ${change.collection}`\n\t\tcase 'collection-removed':\n\t\t\treturn `- collection ${change.collection}`\n\t\tcase 'field-added':\n\t\t\treturn `+ ${change.collection}.${change.field}`\n\t\tcase 'field-removed':\n\t\t\treturn `- ${change.collection}.${change.field}`\n\t\tcase 'field-changed':\n\t\t\treturn `~ ${change.collection}.${change.field}`\n\t\tcase 'index-added':\n\t\t\treturn `+ index ${change.collection}.${change.index}`\n\t\tcase 'index-removed':\n\t\t\treturn `- index ${change.collection}.${change.index}`\n\t}\n}\n","import type { FieldDescriptor, SchemaDefinition } from '@korajs/core'\n\nexport type SchemaChange =\n\t| { type: 'collection-added'; collection: string }\n\t| { type: 'collection-removed'; collection: string }\n\t| { type: 'field-added'; collection: string; field: string; descriptor: FieldDescriptor }\n\t| { type: 'field-removed'; collection: string; field: string; descriptor: FieldDescriptor }\n\t| {\n\t\t\ttype: 'field-changed'\n\t\t\tcollection: string\n\t\t\tfield: string\n\t\t\tbefore: FieldDescriptor\n\t\t\tafter: FieldDescriptor\n\t }\n\t| { type: 'index-added'; collection: string; index: string }\n\t| { type: 'index-removed'; collection: string; index: string }\n\nexport interface SchemaDiff {\n\tfromVersion: number\n\ttoVersion: number\n\tchanges: SchemaChange[]\n\thasChanges: boolean\n\thasBreakingChanges: boolean\n}\n\n/**\n * Computes a structural schema diff.\n */\nexport function diffSchemas(previous: SchemaDefinition, current: SchemaDefinition): SchemaDiff {\n\tconst changes: SchemaChange[] = []\n\n\tconst previousCollections = new Set(Object.keys(previous.collections))\n\tconst currentCollections = new Set(Object.keys(current.collections))\n\n\tfor (const collection of currentCollections) {\n\t\tif (!previousCollections.has(collection)) {\n\t\t\tchanges.push({ type: 'collection-added', collection })\n\t\t}\n\t}\n\n\tfor (const collection of previousCollections) {\n\t\tif (!currentCollections.has(collection)) {\n\t\t\tchanges.push({ type: 'collection-removed', collection })\n\t\t}\n\t}\n\n\tfor (const collection of currentCollections) {\n\t\tif (!previousCollections.has(collection)) continue\n\n\t\tconst previousDef = previous.collections[collection]\n\t\tconst currentDef = current.collections[collection]\n\t\tif (!previousDef || !currentDef) continue\n\n\t\tconst previousFields = previousDef.fields\n\t\tconst currentFields = currentDef.fields\n\n\t\tfor (const [fieldName, currentField] of Object.entries(currentFields)) {\n\t\t\tconst previousField = previousFields[fieldName]\n\t\t\tif (!previousField) {\n\t\t\t\tchanges.push({\n\t\t\t\t\ttype: 'field-added',\n\t\t\t\t\tcollection,\n\t\t\t\t\tfield: fieldName,\n\t\t\t\t\tdescriptor: currentField,\n\t\t\t\t})\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (!fieldDescriptorsEqual(previousField, currentField)) {\n\t\t\t\tchanges.push({\n\t\t\t\t\ttype: 'field-changed',\n\t\t\t\t\tcollection,\n\t\t\t\t\tfield: fieldName,\n\t\t\t\t\tbefore: previousField,\n\t\t\t\t\tafter: currentField,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tfor (const [fieldName, previousField] of Object.entries(previousFields)) {\n\t\t\tif (!(fieldName in currentFields)) {\n\t\t\t\tchanges.push({\n\t\t\t\t\ttype: 'field-removed',\n\t\t\t\t\tcollection,\n\t\t\t\t\tfield: fieldName,\n\t\t\t\t\tdescriptor: previousField,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tconst previousIndexes = new Set(previousDef.indexes)\n\t\tconst currentIndexes = new Set(currentDef.indexes)\n\n\t\tfor (const index of currentIndexes) {\n\t\t\tif (!previousIndexes.has(index)) {\n\t\t\t\tchanges.push({ type: 'index-added', collection, index })\n\t\t\t}\n\t\t}\n\n\t\tfor (const index of previousIndexes) {\n\t\t\tif (!currentIndexes.has(index)) {\n\t\t\t\tchanges.push({ type: 'index-removed', collection, index })\n\t\t\t}\n\t\t}\n\t}\n\n\tchanges.sort(compareChanges)\n\n\treturn {\n\t\tfromVersion: previous.version,\n\t\ttoVersion: current.version,\n\t\tchanges,\n\t\thasChanges: changes.length > 0,\n\t\thasBreakingChanges: changes.some(isBreakingChange),\n\t}\n}\n\nexport function getChangedCollections(diff: SchemaDiff): string[] {\n\tconst collections = new Set<string>()\n\tfor (const change of diff.changes) {\n\t\tcollections.add(change.collection)\n\t}\n\treturn [...collections].sort()\n}\n\nfunction isBreakingChange(change: SchemaChange): boolean {\n\tif (change.type === 'collection-removed' || change.type === 'field-removed') return true\n\tif (change.type === 'field-changed') {\n\t\tif (change.before.kind !== change.after.kind) return true\n\t\tif (change.before.itemKind !== change.after.itemKind) return true\n\t\tif (serializeEnum(change.before.enumValues) !== serializeEnum(change.after.enumValues))\n\t\t\treturn true\n\t\tif (change.before.required !== change.after.required && change.after.required) return true\n\t\treturn false\n\t}\n\tif (change.type === 'field-added') {\n\t\tconst descriptor = change.descriptor\n\t\treturn descriptor.required && descriptor.defaultValue === undefined && !descriptor.auto\n\t}\n\treturn false\n}\n\nfunction fieldDescriptorsEqual(left: FieldDescriptor, right: FieldDescriptor): boolean {\n\treturn (\n\t\tleft.kind === right.kind &&\n\t\tleft.required === right.required &&\n\t\tleft.defaultValue === right.defaultValue &&\n\t\tleft.auto === right.auto &&\n\t\tleft.itemKind === right.itemKind &&\n\t\tserializeEnum(left.enumValues) === serializeEnum(right.enumValues)\n\t)\n}\n\nfunction serializeEnum(values: readonly string[] | null): string {\n\tif (!values) return ''\n\treturn values.join('|')\n}\n\nfunction compareChanges(left: SchemaChange, right: SchemaChange): number {\n\tif (left.collection < right.collection) return -1\n\tif (left.collection > right.collection) return 1\n\n\tif (left.type < right.type) return -1\n\tif (left.type > right.type) return 1\n\n\tconst leftKey = 'field' in left ? left.field : 'index' in left ? left.index : ''\n\tconst rightKey = 'field' in right ? right.field : 'index' in right ? right.index : ''\n\n\tif (leftKey < rightKey) return -1\n\tif (leftKey > rightKey) return 1\n\treturn 0\n}\n","export interface RunMigrationOptions {\n\tupStatements: string[]\n\tmigrationId?: string\n\tfromVersion?: number\n\ttoVersion?: number\n\tsqlitePath?: string\n\tpostgresConnectionString?: string\n\tprojectRoot?: string\n\tsqliteDriver?: {\n\t\topen(path: string): {\n\t\t\texec(sql: string): void\n\t\t\tisMigrationApplied?(id: string): boolean\n\t\t\tclose?(): void\n\t\t}\n\t}\n\tpostgresClientFactory?: (connectionString: string) => {\n\t\tunsafe(query: string): Promise<unknown>\n\t\tend?(): Promise<void>\n\t}\n}\n\nexport interface BackendApplyReport {\n\tbackend: 'sqlite' | 'postgres'\n\tstatementsApplied: number\n\thistoryRecorded: boolean\n\tskipped: boolean\n}\n\nexport interface RunMigrationReport {\n\tbackends: BackendApplyReport[]\n}\n\nexport class MigrationApplyError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly backend: 'sqlite' | 'postgres',\n\t\tpublic readonly report: RunMigrationReport,\n\t) {\n\t\tsuper(message)\n\t\tthis.name = 'MigrationApplyError'\n\t}\n}\n\n/**\n * Applies migration statements to configured backends.\n */\nexport async function runMigration(options: RunMigrationOptions): Promise<RunMigrationReport> {\n\tconst report: RunMigrationReport = { backends: [] }\n\tconst migrationId = options.migrationId ?? `migration-${Date.now()}`\n\tconst fromVersion = options.fromVersion ?? 0\n\tconst toVersion = options.toVersion ?? 0\n\n\tif (options.sqlitePath) {\n\t\ttry {\n\t\t\tconst sqliteReport = await runSqliteMigration(\n\t\t\t\toptions.sqlitePath,\n\t\t\t\toptions.upStatements,\n\t\t\t\tmigrationId,\n\t\t\t\tfromVersion,\n\t\t\t\ttoVersion,\n\t\t\t\toptions.projectRoot,\n\t\t\t\toptions.sqliteDriver,\n\t\t\t)\n\t\t\treport.backends.push(sqliteReport)\n\t\t} catch (error) {\n\t\t\tthrow new MigrationApplyError((error as Error).message, 'sqlite', report)\n\t\t}\n\t}\n\n\tif (options.postgresConnectionString) {\n\t\ttry {\n\t\t\tconst postgresReport = await runPostgresMigration(\n\t\t\t\toptions.postgresConnectionString,\n\t\t\t\toptions.upStatements,\n\t\t\t\tmigrationId,\n\t\t\t\tfromVersion,\n\t\t\t\ttoVersion,\n\t\t\t\toptions.postgresClientFactory,\n\t\t\t)\n\t\t\treport.backends.push(postgresReport)\n\t\t} catch (error) {\n\t\t\tthrow new MigrationApplyError((error as Error).message, 'postgres', report)\n\t\t}\n\t}\n\n\treturn report\n}\n\nasync function runSqliteMigration(\n\tpath: string,\n\tstatements: string[],\n\tmigrationId: string,\n\tfromVersion: number,\n\ttoVersion: number,\n\tprojectRoot?: string,\n\tdriverOverride?: RunMigrationOptions['sqliteDriver'],\n): Promise<BackendApplyReport> {\n\tconst driver = driverOverride ?? (await loadSqliteDriver(projectRoot))\n\tconst db = driver.open(path)\n\tlet statementsApplied = 0\n\n\ttry {\n\t\tdb.exec('BEGIN')\n\t\tdb.exec(\n\t\t\t'CREATE TABLE IF NOT EXISTS _kora_migrations (id TEXT PRIMARY KEY NOT NULL, from_version INTEGER NOT NULL, to_version INTEGER NOT NULL, applied_at INTEGER NOT NULL)',\n\t\t)\n\t\tconst alreadyApplied =\n\t\t\ttypeof db.isMigrationApplied === 'function' ? db.isMigrationApplied(migrationId) : false\n\t\tif (alreadyApplied) {\n\t\t\tdb.exec('COMMIT')\n\t\t\treturn {\n\t\t\t\tbackend: 'sqlite',\n\t\t\t\tstatementsApplied: 0,\n\t\t\t\thistoryRecorded: true,\n\t\t\t\tskipped: true,\n\t\t\t}\n\t\t}\n\t\tfor (const statement of statements) {\n\t\t\tdb.exec(statement)\n\t\t\tstatementsApplied++\n\t\t}\n\t\tdb.exec(\n\t\t\t`INSERT OR REPLACE INTO _kora_migrations (id, from_version, to_version, applied_at) VALUES (${sqlLiteral(migrationId)}, ${fromVersion}, ${toVersion}, ${Date.now()})`,\n\t\t)\n\t\tdb.exec('COMMIT')\n\n\t\treturn {\n\t\t\tbackend: 'sqlite',\n\t\t\tstatementsApplied,\n\t\t\thistoryRecorded: true,\n\t\t\tskipped: false,\n\t\t}\n\t} catch (error) {\n\t\ttry {\n\t\t\tdb.exec('ROLLBACK')\n\t\t} catch {\n\t\t\t// best effort\n\t\t}\n\t\tthrow error\n\t} finally {\n\t\tif (typeof db.close === 'function') {\n\t\t\tdb.close()\n\t\t}\n\t}\n}\n\nasync function loadSqliteDriver(projectRoot?: string): Promise<{\n\topen(path: string): {\n\t\texec(sql: string): void\n\t\tisMigrationApplied(id: string): boolean\n\t\tclose(): void\n\t}\n}> {\n\ttry {\n\t\tconst { createRequire } = await import('node:module')\n\t\tconst requireFrom = createRequire(projectRoot ? `${projectRoot}/package.json` : import.meta.url)\n\t\tconst Database = requireFrom('better-sqlite3') as new (\n\t\t\tpath: string,\n\t\t) => {\n\t\t\texec(sql: string): void\n\t\t\tprepare(sql: string): {\n\t\t\t\tget(...params: unknown[]): { count?: number } | undefined\n\t\t\t}\n\t\t\tclose(): void\n\t\t}\n\n\t\treturn {\n\t\t\topen(path: string) {\n\t\t\t\tconst db = new Database(path)\n\t\t\t\treturn {\n\t\t\t\t\texec(sql: string) {\n\t\t\t\t\t\tdb.exec(sql)\n\t\t\t\t\t},\n\t\t\t\t\tisMigrationApplied(id: string) {\n\t\t\t\t\t\tconst row = db\n\t\t\t\t\t\t\t.prepare('SELECT COUNT(*) AS count FROM _kora_migrations WHERE id = ?')\n\t\t\t\t\t\t\t.get(id)\n\t\t\t\t\t\treturn (row?.count ?? 0) > 0\n\t\t\t\t\t},\n\t\t\t\t\tclose() {\n\t\t\t\t\t\tdb.close()\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\t} catch {\n\t\tthrow new Error(\n\t\t\t'SQLite migration apply requires the \"better-sqlite3\" package in the target project dependencies.',\n\t\t)\n\t}\n}\n\nasync function runPostgresMigration(\n\tconnectionString: string,\n\tstatements: string[],\n\tmigrationId: string,\n\tfromVersion: number,\n\ttoVersion: number,\n\tclientFactoryOverride?: RunMigrationOptions['postgresClientFactory'],\n): Promise<BackendApplyReport> {\n\tconst sql =\n\t\ttypeof clientFactoryOverride === 'function'\n\t\t\t? clientFactoryOverride(connectionString)\n\t\t\t: (await loadPostgresModule()).default(connectionString)\n\tlet statementsApplied = 0\n\n\ttry {\n\t\tawait sql.unsafe('BEGIN')\n\t\tawait sql.unsafe(\n\t\t\t'CREATE TABLE IF NOT EXISTS _kora_migrations (id TEXT PRIMARY KEY, from_version INTEGER NOT NULL, to_version INTEGER NOT NULL, applied_at BIGINT NOT NULL)',\n\t\t)\n\t\tconst existing = (await sql.unsafe(\n\t\t\t`SELECT COUNT(*)::int AS count FROM _kora_migrations WHERE id = ${sqlLiteral(migrationId)}`,\n\t\t)) as Array<{ count: number }>\n\t\tif ((existing[0]?.count ?? 0) > 0) {\n\t\t\tawait sql.unsafe('COMMIT')\n\t\t\treturn {\n\t\t\t\tbackend: 'postgres',\n\t\t\t\tstatementsApplied: 0,\n\t\t\t\thistoryRecorded: true,\n\t\t\t\tskipped: true,\n\t\t\t}\n\t\t}\n\t\tfor (const statement of statements) {\n\t\t\tawait sql.unsafe(statement)\n\t\t\tstatementsApplied++\n\t\t}\n\t\tawait sql.unsafe(\n\t\t\t`INSERT INTO _kora_migrations (id, from_version, to_version, applied_at) VALUES (${sqlLiteral(migrationId)}, ${fromVersion}, ${toVersion}, ${Date.now()}) ON CONFLICT (id) DO UPDATE SET from_version = EXCLUDED.from_version, to_version = EXCLUDED.to_version, applied_at = EXCLUDED.applied_at`,\n\t\t)\n\t\tawait sql.unsafe('COMMIT')\n\n\t\treturn {\n\t\t\tbackend: 'postgres',\n\t\t\tstatementsApplied,\n\t\t\thistoryRecorded: true,\n\t\t\tskipped: false,\n\t\t}\n\t} catch (error) {\n\t\ttry {\n\t\t\tawait sql.unsafe('ROLLBACK')\n\t\t} catch {\n\t\t\t// best effort\n\t\t}\n\t\tthrow error\n\t} finally {\n\t\tif (typeof sql.end === 'function') {\n\t\t\tawait sql.end()\n\t\t}\n\t}\n}\n\nfunction sqlLiteral(value: string): string {\n\treturn `'${value.replaceAll(\"'\", \"''\")}'`\n}\n\nasync function loadPostgresModule(): Promise<{\n\tdefault: (connectionString: string) => {\n\t\tunsafe: (query: string) => Promise<unknown>\n\t\tend?: () => Promise<void>\n\t}\n}> {\n\ttry {\n\t\tconst dynamicImport = new Function('specifier', 'return import(specifier)') as (\n\t\t\tspecifier: string,\n\t\t) => Promise<unknown>\n\t\tconst mod = await dynamicImport('postgres')\n\t\tif (typeof mod === 'object' && mod !== null && 'default' in mod) {\n\t\t\treturn mod as {\n\t\t\t\tdefault: (connectionString: string) => {\n\t\t\t\t\tunsafe: (query: string) => Promise<unknown>\n\t\t\t\t\tend?: () => Promise<void>\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthrow new Error('Invalid postgres module')\n\t} catch {\n\t\tthrow new Error(\n\t\t\t'PostgreSQL migration apply requires the \"postgres\" package in the target project dependencies.',\n\t\t)\n\t}\n}\n","/**\n * Generates a stub operation-transform module for sync-time op log migration.\n */\nexport function generateOperationTransformModule(fromVersion: number, toVersion: number): string {\n\treturn [\n\t\t\"import type { Operation, OperationTransform } from '@korajs/core'\",\n\t\t'',\n\t\t'/**',\n\t\t` * Operation transforms for schema v${fromVersion} → v${toVersion}.`,\n\t\t' * Implement `transform` to rewrite or drop legacy operations during sync.',\n\t\t' * @see https://korajs.dev/docs/migrations',\n\t\t' */',\n\t\t'export const operationTransforms: OperationTransform[] = [',\n\t\t' {',\n\t\t` fromVersion: ${fromVersion},`,\n\t\t` toVersion: ${toVersion},`,\n\t\t' transform(operation: Operation): Operation | null {',\n\t\t' // Return null to drop unmigratable operations.',\n\t\t' return operation',\n\t\t' },',\n\t\t' },',\n\t\t']',\n\t\t'',\n\t].join('\\n')\n}\n","import { defineCommand } from 'citty'\nimport { createLogger } from '../../utils/logger'\n\nconst DEFAULT_SYNC_PORT = 3001\nconst STATUS_ENDPOINT = '/__kora/status'\n\ninterface ServerStatusResponse {\n\trunning: boolean\n\tconnectedClients: number\n\tport: number | null\n\ttotalOperations: number\n\tuptime: number\n\tversion: string\n\tschemaVersion: number\n\tconnectedNodeIds: string[]\n\tpeakConnections: number\n\tconnectionsTotal: number\n\toperationsReceived: number\n\toperationsSent: number\n\terrorCount: number\n}\n\n/**\n * Fetch server status from a Kora sync server.\n */\nasync function fetchServerStatus(url: string, token?: string): Promise<ServerStatusResponse> {\n\tconst statusUrl = `${url.replace(/\\/$/, '')}${STATUS_ENDPOINT}`\n\tconst response = await fetch(statusUrl, {\n\t\theaders: token ? { Authorization: `Bearer ${token}` } : undefined,\n\t})\n\tif (!response.ok) {\n\t\tthrow new Error(\n\t\t\t`Failed to fetch status from ${statusUrl}: ${response.status} ${response.statusText}`,\n\t\t)\n\t}\n\n\treturn (await response.json()) as ServerStatusResponse\n}\n\nfunction formatUptime(ms: number): string {\n\tconst seconds = Math.floor(ms / 1000)\n\tconst minutes = Math.floor(seconds / 60)\n\tconst hours = Math.floor(minutes / 60)\n\tconst days = Math.floor(hours / 24)\n\tconst parts: string[] = []\n\tif (days > 0) parts.push(`${days}d`)\n\tif (hours % 24 > 0) parts.push(`${hours % 24}h`)\n\tif (minutes % 60 > 0) parts.push(`${minutes % 60}m`)\n\tparts.push(`${seconds % 60}s`)\n\treturn parts.join(' ')\n}\n\n/**\n * The `status` command — shows the current status of a Kora sync server.\n */\nexport const statusCommand = defineCommand({\n\tmeta: {\n\t\tname: 'status',\n\t\tdescription: 'Show Kora sync server status',\n\t},\n\targs: {\n\t\turl: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Sync server URL (default: http://localhost:3001)',\n\t\t\tdefault: `http://localhost:${DEFAULT_SYNC_PORT}`,\n\t\t},\n\t\twatch: {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Live-updating status (like htop)',\n\t\t\tdefault: false,\n\t\t\talias: 'w',\n\t\t},\n\t\ttoken: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Admin token (defaults to KORA_ADMIN_TOKEN)',\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tconst logger = createLogger()\n\t\tconst url = typeof args.url === 'string' ? args.url : `http://localhost:${DEFAULT_SYNC_PORT}`\n\t\tconst watch = args.watch === true\n\t\tconst token =\n\t\t\ttypeof args.token === 'string' ? args.token : (process.env.KORA_ADMIN_TOKEN ?? undefined)\n\n\t\ttry {\n\t\t\tif (watch) {\n\t\t\t\t// Live-updating mode\n\t\t\t\tconsole.clear()\n\t\t\t\tlogger.banner()\n\t\t\t\tlogger.info(`Connecting to ${url}...`)\n\n\t\t\t\tconst interval = setInterval(async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst status = await fetchServerStatus(url, token)\n\t\t\t\t\t\tprintStatus(status, url, logger)\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Clear the previous status output\n\t\t\t\t\t\t// On next iteration, we'll try again\n\t\t\t\t\t}\n\t\t\t\t}, 2000)\n\n\t\t\t\t// Initial fetch\n\t\t\t\ttry {\n\t\t\t\t\tconst status = await fetchServerStatus(url, token)\n\t\t\t\t\tprintStatus(status, url, logger)\n\t\t\t\t} catch {\n\t\t\t\t\t// Will retry on interval\n\t\t\t\t}\n\n\t\t\t\t// Keep running until Ctrl+C\n\t\t\t\tawait new Promise(() => {\n\t\t\t\t\tprocess.on('SIGINT', () => {\n\t\t\t\t\t\tclearInterval(interval)\n\t\t\t\t\t\tprocess.exit(0)\n\t\t\t\t\t})\n\t\t\t\t\tprocess.on('SIGTERM', () => {\n\t\t\t\t\t\tclearInterval(interval)\n\t\t\t\t\t\tprocess.exit(0)\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tconst status = await fetchServerStatus(url, token)\n\t\t\t\tprintStatus(status, url, logger)\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tlogger.error(`Failed to connect to ${url}`)\n\t\t\tif (error instanceof Error) {\n\t\t\t\tlogger.error(error.message)\n\t\t\t}\n\t\t\tlogger.blank()\n\t\t\tlogger.step('Make sure the Kora sync server is running.')\n\t\t\tlogger.step('Start it with: kora dev')\n\t\t\tprocess.exit(1)\n\t\t}\n\t},\n})\n\nfunction printStatus(\n\tstatus: ServerStatusResponse,\n\turl: string,\n\tlogger: ReturnType<typeof createLogger>,\n): void {\n\tconsole.clear()\n\tlogger.banner()\n\tlogger.info(`Kora Sync Server — ${url}`)\n\tlogger.blank()\n\n\tif (!status.running) {\n\t\tlogger.error('Server is not running')\n\t\treturn\n\t}\n\n\t// Server info\n\tlogger.step(`Status: Running (uptime: ${formatUptime(status.uptime)}) — v${status.version}`)\n\tlogger.step(`Schema: v${status.schemaVersion}`)\n\tlogger.blank()\n\n\t// Connections\n\tlogger.step(`Connections: ${status.connectedClients} connected`)\n\tlogger.step(` Peak: ${status.peakConnections}`)\n\tlogger.step(` Total: ${status.connectionsTotal}`)\n\n\tif (status.connectedNodeIds.length > 0) {\n\t\tlogger.step(' Active nodes:')\n\t\tfor (const nodeId of status.connectedNodeIds) {\n\t\t\tlogger.step(` • ${nodeId}`)\n\t\t}\n\t}\n\tlogger.blank()\n\n\t// Operations\n\tlogger.step('Operations:')\n\tlogger.step(` Received: ${status.operationsReceived.toLocaleString()}`)\n\tlogger.step(` Sent: ${status.operationsSent.toLocaleString()}`)\n\tlogger.step(` Total: ${status.totalOperations.toLocaleString()}`)\n\tlogger.blank()\n\n\t// Errors\n\tif (status.errorCount > 0) {\n\t\tlogger.warn(`Errors: ${status.errorCount}`)\n\t} else {\n\t\tlogger.step('Errors: 0')\n\t}\n}\n","import { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { defineCommand } from 'citty'\nimport { createLogger } from '../../utils/logger'\n\n/**\n * `kora studio` — the visual window into Kora's data plane.\n *\n * FILE mode (`--db path`): read-only inspection of any Kora database —\n * records with per-field last writers, operation history, causal DAG, time\n * travel, merge audit, sync state.\n *\n * LAB mode (`--lab`): an interactive multi-device sync laboratory running\n * REAL stores, sync engines, and a real server in-process. Create devices,\n * edit data on each, disconnect them, inject chaos (drops, duplicates,\n * reordering, latency), and watch conflicts resolve and devices converge —\n * live, with evidence.\n */\nexport const studioCommand = defineCommand({\n\tmeta: {\n\t\tname: 'studio',\n\t\tdescription: 'Kora Studio: visualize records, operations, and sync — or run the sync lab',\n\t},\n\targs: {\n\t\tdb: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Path to a Kora SQLite database file (file mode, read-only)',\n\t\t},\n\t\tlab: {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Start the interactive multi-device sync laboratory',\n\t\t},\n\t\tconnect: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Spectator mode: WebSocket URL of a live Kora sync server (read-only replica)',\n\t\t},\n\t\ttoken: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Spectator mode: bearer token for the sync auth handshake',\n\t\t},\n\t\tdevices: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Lab mode: number of initial devices (default 2)',\n\t\t},\n\t\tschema: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Lab mode: path to a schema file (defaults to a built-in demo schema)',\n\t\t},\n\t\tport: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Port for the Studio UI (default 4321, 0 for a random free port)',\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tconst logger = createLogger()\n\n\t\tconst port = args.port !== undefined ? Number.parseInt(args.port, 10) : 4321\n\t\tif (Number.isNaN(port) || port < 0 || port > 65535) {\n\t\t\tthrow new Error(`Invalid port \"${args.port}\"`)\n\t\t}\n\n\t\tconst { startStudioServer } = await import('./studio-server')\n\n\t\tif (typeof args.connect === 'string') {\n\t\t\t// SPECTATOR: live read-only replica of a production sync server.\n\t\t\tif (typeof args.schema !== 'string') {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Spectator mode needs your schema to materialize records: kora studio --connect wss://… --schema ./kora/schema.ts',\n\t\t\t\t)\n\t\t\t}\n\t\t\tconst { loadSchemaDefinition } = await import('../migrate/schema-loader')\n\t\t\tconst schema = await loadSchemaDefinition(resolve(process.cwd(), args.schema), process.cwd())\n\n\t\t\tconst { SpectatorManager } = await import('./spectator-manager')\n\t\t\tconst spectator = new SpectatorManager({\n\t\t\t\turl: args.connect,\n\t\t\t\tschema,\n\t\t\t\t...(typeof args.token === 'string' ? { token: args.token } : {}),\n\t\t\t})\n\t\t\tawait spectator.start()\n\t\t\tconst server = await startStudioServer({ port, spectator })\n\n\t\t\tlogger.banner()\n\t\t\tlogger.success(`Kora Studio SPECTATOR running at ${server.url}`)\n\t\t\tlogger.step(`Watching ${args.connect} (read-only replica — nothing is ever pushed)`)\n\t\t\tlogger.step('Press Ctrl+C to stop.')\n\n\t\t\tconst shutdown = async (): Promise<void> => {\n\t\t\t\tawait server.close()\n\t\t\t\tawait spectator.close()\n\t\t\t\tprocess.exit(0)\n\t\t\t}\n\t\t\tprocess.on('SIGINT', () => void shutdown())\n\t\t\tprocess.on('SIGTERM', () => void shutdown())\n\t\t\treturn\n\t\t}\n\n\t\tif (args.lab) {\n\t\t\tconst { LabManager, defaultLabSchema } = await import('./lab-manager')\n\n\t\t\tlet schema = defaultLabSchema()\n\t\t\tif (typeof args.schema === 'string') {\n\t\t\t\tconst { loadSchemaDefinition } = await import('../migrate/schema-loader')\n\t\t\t\tschema = await loadSchemaDefinition(resolve(process.cwd(), args.schema), process.cwd())\n\t\t\t}\n\n\t\t\tconst initialDevices =\n\t\t\t\targs.devices !== undefined ? Math.max(1, Number.parseInt(args.devices, 10) || 2) : 2\n\n\t\t\tconst lab = new LabManager(schema)\n\t\t\tawait lab.start(initialDevices)\n\t\t\tconst server = await startStudioServer({ port, lab })\n\n\t\t\tlogger.banner()\n\t\t\tlogger.success(`Kora Studio LAB running at ${server.url}`)\n\t\t\tlogger.step(`${initialDevices} device(s) started against an in-process sync server.`)\n\t\t\tlogger.step('Everything in the lab is throwaway — experiment freely.')\n\t\t\tlogger.step('Press Ctrl+C to stop.')\n\n\t\t\tconst shutdown = async (): Promise<void> => {\n\t\t\t\tawait server.close()\n\t\t\t\tawait lab.close()\n\t\t\t\tprocess.exit(0)\n\t\t\t}\n\t\t\tprocess.on('SIGINT', () => void shutdown())\n\t\t\tprocess.on('SIGTERM', () => void shutdown())\n\t\t\treturn\n\t\t}\n\n\t\tif (typeof args.db !== 'string') {\n\t\t\tthrow new Error(\n\t\t\t\t'Pass --db <path> to inspect a database, --lab for the sync laboratory, or --connect <wss url> for live spectator mode.',\n\t\t\t)\n\t\t}\n\t\tconst dbPath = resolve(process.cwd(), args.db)\n\t\tif (!existsSync(dbPath)) {\n\t\t\tthrow new Error(`Database file not found: ${dbPath}`)\n\t\t}\n\n\t\tconst server = await startStudioServer({ port, dbPath })\n\n\t\tlogger.banner()\n\t\tlogger.success(`Kora Studio running at ${server.url}`)\n\t\tlogger.step(`Database: ${dbPath} (read-only)`)\n\t\tlogger.step('Press Ctrl+C to stop.')\n\n\t\tconst shutdown = async (): Promise<void> => {\n\t\t\tawait server.close()\n\t\t\tprocess.exit(0)\n\t\t}\n\t\tprocess.on('SIGINT', () => void shutdown())\n\t\tprocess.on('SIGTERM', () => void shutdown())\n\t},\n})\n"],"mappings":"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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACD7B,IACa;AADb;AAAA;AAAA;AACO,IAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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","names":["import_promises","import_node_path","runCommand","resolve","import_node_child_process","import_node_path","import_node_url","t","resolve","import_node_fs","import_node_path","import_node_fs","import_node_os","import_node_path","import_core","FORWARDED_EVENTS","MAX_EVENT_BUFFER","atomicOp","import_citty","import_node_path","import_citty","import_promises","import_node_path","loaded","resolve","import_node_child_process","import_node_fs","import_node_path","import_node_url","import_citty","Conf","resolve","clackText","clackIsCancel","clackCancel","clackSelect","clackConfirm","clackIntro","clackOutro","import_node_child_process","import_promises","import_node_path","validateNpmPackageName","import_promises","import_node_path","import_promises","import_node_path","import_node_url","import_meta","isSyncTemplate","import_node_fs","import_node_path","import_citty","import_node_child_process","import_node_path","import_node_child_process","import_node_fs","import_promises","import_node_path","resolve","import_promises","import_node_path","resolve","import_node_child_process","import_node_path","inferLogLevel","resolve","import_node_child_process","import_node_path","import_promises","import_node_path","inferLogLevel","resolve","import_node_child_process","import_node_path","import_promises","import_node_path","GENERATED_HEADER","normalizeError","isAlreadyExistsResponse","inferLogLevel","resolve","parseJsonRecord","import_promises","import_node_path","GENERATED_HEADER","import_promises","import_node_path","import_promises","import_node_path","import_citty","import_node_child_process","spawnChild","resolve","import_node_child_process","import_node_fs","import_node_path","resolve","fileExists","resolve","import_citty","import_promises","import_node_path","import_promises","import_node_path","import_citty","toPascalCase","extractSchema","isSchemaDefinition","import_citty","DEFAULT_SYNC_PORT","import_promises","import_node_path","import_citty","import_core","import_meta","sqlLiteral","isInteractiveTerminal","import_citty","DEFAULT_SYNC_PORT","STATUS_ENDPOINT","watch","import_node_fs","import_node_path","import_citty","startStudioServer","loadSchemaDefinition","SpectatorManager","server","shutdown","LabManager","defaultLabSchema"]}
|