@caliber-ai/cli 0.5.2 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.js +26 -0
- package/dist/bin.js.map +1 -1
- package/package.json +1 -1
package/dist/bin.js
CHANGED
|
@@ -1384,6 +1384,19 @@ async function initCommand(options) {
|
|
|
1384
1384
|
\u255A\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D
|
|
1385
1385
|
`));
|
|
1386
1386
|
console.log(chalk2.dim(" Configure your coding agent environment\n"));
|
|
1387
|
+
console.log(chalk2.bold(" What is Caliber?\n"));
|
|
1388
|
+
console.log(chalk2.dim(" Caliber analyzes your project and generates optimized configurations"));
|
|
1389
|
+
console.log(chalk2.dim(" for AI coding agents (Claude Code, Cursor). It creates CLAUDE.md,"));
|
|
1390
|
+
console.log(chalk2.dim(" .cursorrules, skills, permissions, and MCP servers tailored to your"));
|
|
1391
|
+
console.log(chalk2.dim(" codebase \u2014 so your AI agent understands your project from day one.\n"));
|
|
1392
|
+
console.log(chalk2.bold(" How it works:\n"));
|
|
1393
|
+
console.log(chalk2.dim(" 1. Scan Analyze your code, dependencies, and file structure"));
|
|
1394
|
+
console.log(chalk2.dim(" 2. Match Check if a teammate already configured this project"));
|
|
1395
|
+
console.log(chalk2.dim(" 3. Generate AI creates config files tailored to your project"));
|
|
1396
|
+
console.log(chalk2.dim(" 4. Review You accept, refine, or decline the generated setup"));
|
|
1397
|
+
console.log(chalk2.dim(" 5. Apply Config files are written to your project"));
|
|
1398
|
+
console.log(chalk2.dim(" 6. Sync Setup is saved so teammates get the same config\n"));
|
|
1399
|
+
console.log(chalk2.hex("#6366f1").bold(" Step 1/6 \u2014 Authenticate\n"));
|
|
1387
1400
|
let auth2 = getStoredAuth();
|
|
1388
1401
|
if (!auth2) {
|
|
1389
1402
|
console.log(chalk2.yellow("Not logged in. Starting authentication...\n"));
|
|
@@ -1396,6 +1409,8 @@ async function initCommand(options) {
|
|
|
1396
1409
|
}
|
|
1397
1410
|
console.log(chalk2.dim(`Authenticated as ${auth2.email}
|
|
1398
1411
|
`));
|
|
1412
|
+
console.log(chalk2.hex("#6366f1").bold(" Step 2/6 \u2014 Scan project\n"));
|
|
1413
|
+
console.log(chalk2.dim(" Detecting languages, frameworks, file structure, and existing configs.\n"));
|
|
1399
1414
|
const spinner = ora2("Analyzing project...").start();
|
|
1400
1415
|
const fingerprint = collectFingerprint(process.cwd());
|
|
1401
1416
|
const hash = computeFingerprintHash(fingerprint);
|
|
@@ -1415,6 +1430,8 @@ async function initCommand(options) {
|
|
|
1415
1430
|
console.log(chalk2.dim(` Frameworks: ${fingerprint.frameworks.join(", ") || "none detected"}`));
|
|
1416
1431
|
console.log(chalk2.dim(` Files: ${fingerprint.fileTree.length} found
|
|
1417
1432
|
`));
|
|
1433
|
+
console.log(chalk2.hex("#6366f1").bold(" Step 3/6 \u2014 Match project\n"));
|
|
1434
|
+
console.log(chalk2.dim(" Checking if a teammate already set up Caliber for this repo.\n"));
|
|
1418
1435
|
const matchSpinner = ora2("Checking for existing setup...").start();
|
|
1419
1436
|
let existingSetup = null;
|
|
1420
1437
|
let existingProjectId = null;
|
|
@@ -1447,6 +1464,9 @@ async function initCommand(options) {
|
|
|
1447
1464
|
if (isEmpty) {
|
|
1448
1465
|
fingerprint.description = await promptInput("What will you build in this project?");
|
|
1449
1466
|
}
|
|
1467
|
+
console.log(chalk2.hex("#6366f1").bold(" Step 4/6 \u2014 Generate config\n"));
|
|
1468
|
+
console.log(chalk2.dim(" AI is building CLAUDE.md, permissions, skills, and rules based on"));
|
|
1469
|
+
console.log(chalk2.dim(" your project's stack and conventions.\n"));
|
|
1450
1470
|
let generatedSetup = null;
|
|
1451
1471
|
let setupExplanation;
|
|
1452
1472
|
let rawOutput;
|
|
@@ -1496,6 +1516,9 @@ async function initCommand(options) {
|
|
|
1496
1516
|
}
|
|
1497
1517
|
genSpinner.succeed("Setup generated");
|
|
1498
1518
|
printSetupSummary(generatedSetup);
|
|
1519
|
+
console.log(chalk2.hex("#6366f1").bold(" Step 5/6 \u2014 Review\n"));
|
|
1520
|
+
console.log(chalk2.dim(" Review the proposed files below. You can accept, refine via chat,"));
|
|
1521
|
+
console.log(chalk2.dim(" or see an explanation of why each item was recommended.\n"));
|
|
1499
1522
|
let explained = false;
|
|
1500
1523
|
let action = await promptAction(explained);
|
|
1501
1524
|
while (action === "explain") {
|
|
@@ -1520,6 +1543,9 @@ async function initCommand(options) {
|
|
|
1520
1543
|
return;
|
|
1521
1544
|
}
|
|
1522
1545
|
}
|
|
1546
|
+
console.log(chalk2.hex("#6366f1").bold(" Step 6/6 \u2014 Apply & sync\n"));
|
|
1547
|
+
console.log(chalk2.dim(" Writing config files to your project and syncing to Caliber so"));
|
|
1548
|
+
console.log(chalk2.dim(" teammates get the same setup when they run `caliber init`.\n"));
|
|
1523
1549
|
if (options.dryRun) {
|
|
1524
1550
|
console.log(chalk2.yellow("\n[Dry run] Would write the following files:"));
|
|
1525
1551
|
console.log(JSON.stringify(generatedSetup, null, 2));
|
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","../src/lib/sentry.ts","../src/cli.ts","../src/commands/init.ts","../src/auth/token-store.ts","../src/commands/login.ts","../src/auth/pkce.ts","../src/auth/callback-server.ts","../src/telemetry.ts","../src/fingerprint/index.ts","../src/fingerprint/git.ts","../src/fingerprint/package-json.ts","../src/fingerprint/file-tree.ts","../src/fingerprint/languages.ts","../src/fingerprint/existing-config.ts","../src/fingerprint/code-analysis.ts","../src/api/client.ts","../src/writers/index.ts","../src/writers/claude/index.ts","../src/writers/cursor/index.ts","../src/writers/backup.ts","../src/writers/manifest.ts","../src/lib/hooks.ts","../src/lib/state.ts","../src/utils/spinner-messages.ts","../src/commands/undo.ts","../src/commands/status.ts","../src/scanner/index.ts","../src/commands/update.ts","../src/commands/logout.ts","../src/commands/recommend.ts","../src/commands/health.ts","../src/commands/sync.ts","../src/commands/diff.ts","../src/commands/refresh.ts","../src/lib/git-diff.ts","../src/writers/refresh.ts","../src/commands/hooks.ts","../src/utils/version-check.ts","../src/bin.ts"],"sourcesContent":["import path from 'path';\nimport os from 'os';\n\nexport const API_URL = process.env.CALIBER_API_URL || 'https://caliber-backend.up.railway.app';\nexport const FRONTEND_URL = process.env.CALIBER_FRONTEND_URL || 'https://caliber-app.up.railway.app';\nexport const CLI_CALLBACK_PORT = 19284;\nexport const AUTH_DIR = path.join(os.homedir(), '.caliber');\nexport const AUTH_FILE = path.join(AUTH_DIR, 'auth.json');\nexport const CALIBER_DIR = '.caliber';\nexport const MANIFEST_FILE = path.join(CALIBER_DIR, 'manifest.json');\nexport const BACKUPS_DIR = path.join(CALIBER_DIR, 'backups');\n","import * as Sentry from '@sentry/node';\nimport os from 'os';\nimport fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nconst dsn = process.env.CALIBER_SENTRY_DSN || 'https://e988132485fced78d7d60202f97942b3@o4510975175622656.ingest.us.sentry.io/4510975226347520';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(\n fs.readFileSync(path.resolve(__dirname, '..', 'package.json'), 'utf-8')\n);\n\nif (dsn) {\n Sentry.init({\n dsn,\n release: `caliber-cli@${pkg.version}`,\n environment: process.env.NODE_ENV || 'production',\n tracesSampleRate: 0,\n beforeSend(event) {\n event.tags = { ...event.tags, source: 'cli', os: os.platform() };\n return event;\n },\n });\n}\n\nexport { Sentry };\n","import { Command } from 'commander';\nimport fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { initCommand } from './commands/init.js';\nimport { undoCommand } from './commands/undo.js';\nimport { statusCommand } from './commands/status.js';\nimport { updateCommand } from './commands/update.js';\nimport { loginCommand } from './commands/login.js';\nimport { logoutCommand } from './commands/logout.js';\nimport { recommendCommand } from './commands/recommend.js';\nimport { healthCommand } from './commands/health.js';\nimport { syncCommand } from './commands/sync.js';\nimport { diffCommand } from './commands/diff.js';\nimport { refreshCommand } from './commands/refresh.js';\nimport { hooksInstallCommand, hooksRemoveCommand, hooksStatusCommand } from './commands/hooks.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(\n fs.readFileSync(path.resolve(__dirname, '..', 'package.json'), 'utf-8')\n);\n\nconst program = new Command();\n\nprogram\n .name('caliber')\n .description('Configure your coding agent environment')\n .version(pkg.version);\n\nprogram\n .command('init')\n .description('Initialize coding agent setup for this project')\n .option('--agent <type>', 'Target agent: claude, cursor, or both')\n .option('--dry-run', 'Preview changes without writing files')\n .option('--force', 'Overwrite existing setup without prompting')\n .action(initCommand);\n\nprogram\n .command('undo')\n .description('Revert all config changes made by Caliber')\n .action(undoCommand);\n\nprogram\n .command('status')\n .description('Show current Caliber setup status')\n .option('--json', 'Output as JSON')\n .action(statusCommand);\n\nprogram\n .command('update')\n .description('Re-analyze project and update setup')\n .option('--dry-run', 'Preview changes without writing files')\n .action(updateCommand);\n\nprogram\n .command('login')\n .description('Authenticate with Caliber')\n .action(loginCommand);\n\nprogram\n .command('logout')\n .description('Clear stored credentials')\n .action(logoutCommand);\n\nprogram\n .command('recommend')\n .description('Discover and manage skill recommendations')\n .option('--generate', 'Generate new recommendations')\n .option('--status <status>', 'Filter by status: pending, accepted, dismissed')\n .action(recommendCommand);\n\nprogram\n .command('health')\n .description('Analyze context health and quality')\n .option('--fix', 'Generate and execute a fix plan')\n .option('--json', 'Output as JSON')\n .action(healthCommand);\n\nprogram\n .command('sync')\n .description('Sync local config with server state')\n .option('--platform <platform>', 'Target platform: claude, cursor, or both')\n .option('--dry-run', 'Preview changes without writing files')\n .action(syncCommand);\n\nprogram\n .command('diff')\n .description('Compare local config with server state')\n .option('--platform <platform>', 'Target platform: claude, cursor, or both')\n .action(diffCommand);\n\nprogram\n .command('refresh')\n .description('Update docs based on recent code changes')\n .option('--quiet', 'Suppress output (for use in hooks)')\n .option('--dry-run', 'Preview changes without writing files')\n .action(refreshCommand);\n\nconst hooks = program\n .command('hooks')\n .description('Manage Claude Code session hooks');\n\nhooks\n .command('install')\n .description('Install auto-refresh SessionEnd hook')\n .action(hooksInstallCommand);\n\nhooks\n .command('remove')\n .description('Remove auto-refresh SessionEnd hook')\n .action(hooksRemoveCommand);\n\nhooks\n .command('status')\n .description('Check if auto-refresh hook is installed')\n .action(hooksStatusCommand);\n\nexport { program };\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport readline from 'readline';\nimport fs from 'fs';\nimport { getStoredAuth } from '../auth/token-store.js';\nimport { loginCommand } from './login.js';\nimport { collectFingerprint, computeFingerprintHash } from '../fingerprint/index.js';\nimport { apiRequest, apiStream } from '../api/client.js';\nimport { writeSetup } from '../writers/index.js';\nimport { trackEvent } from '../telemetry.js';\nimport { installHook } from '../lib/hooks.js';\nimport { writeState, getCurrentHeadSha } from '../lib/state.js';\nimport { SpinnerMessages, GENERATION_MESSAGES, REFINE_MESSAGES } from '../utils/spinner-messages.js';\n\ntype TargetAgent = 'claude' | 'cursor' | 'both';\n\ninterface InitOptions {\n agent?: TargetAgent;\n dryRun?: boolean;\n force?: boolean;\n}\n\nexport async function initCommand(options: InitOptions) {\n // Banner\n console.log(chalk.bold.hex('#6366f1')(`\n ██████╗ █████╗ ██╗ ██╗██████╗ ███████╗██████╗\n ██╔════╝██╔══██╗██║ ██║██╔══██╗██╔════╝██╔══██╗\n ██║ ███████║██║ ██║██████╔╝█████╗ ██████╔╝\n ██║ ██╔══██║██║ ██║██╔══██╗██╔══╝ ██╔══██╗\n ╚██████╗██║ ██║███████╗██║██████╔╝███████╗██║ ██║\n ╚═════╝╚═╝ ╚═╝╚══════╝╚═╝╚═════╝ ╚══════╝╚═╝ ╚═╝\n `));\n console.log(chalk.dim(' Configure your coding agent environment\\n'));\n\n // Step 1: Auth check\n let auth = getStoredAuth();\n if (!auth) {\n console.log(chalk.yellow('Not logged in. Starting authentication...\\n'));\n await loginCommand();\n auth = getStoredAuth();\n if (!auth) {\n console.log(chalk.red('Authentication required. Exiting.'));\n throw new Error('__exit__');\n }\n }\n console.log(chalk.dim(`Authenticated as ${auth.email}\\n`));\n\n // Step 2: Collect fingerprint\n const spinner = ora('Analyzing project...').start();\n const fingerprint = collectFingerprint(process.cwd());\n const hash = computeFingerprintHash(fingerprint);\n spinner.succeed('Project analyzed');\n\n trackEvent('scan_completed', {\n languages: fingerprint.languages,\n frameworks: fingerprint.frameworks,\n has_existing_config: !!(fingerprint.existingConfigs.claudeMd || fingerprint.existingConfigs.cursorrules),\n has_claude_md: !!fingerprint.existingConfigs.claudeMd,\n has_claude_settings: !!fingerprint.existingConfigs.claudeSettings,\n has_cursorrules: !!fingerprint.existingConfigs.cursorrules,\n cursor_rules_count: fingerprint.existingConfigs.cursorRules?.length ?? 0,\n skills_count: fingerprint.existingConfigs.claudeSkills?.length ?? 0,\n file_count: fingerprint.fileTree.length,\n });\n\n console.log(chalk.dim(` Languages: ${fingerprint.languages.join(', ') || 'none detected'}`));\n console.log(chalk.dim(` Frameworks: ${fingerprint.frameworks.join(', ') || 'none detected'}`));\n console.log(chalk.dim(` Files: ${fingerprint.fileTree.length} found\\n`));\n\n // Step 3: Check for existing project\n const matchSpinner = ora('Checking for existing setup...').start();\n let existingSetup = null;\n let existingProjectId: string | null = null;\n try {\n const match = await apiRequest<{ project: { id: string } | null; setup: unknown }>('/api/projects/match', {\n method: 'POST',\n body: { fingerprintHash: hash },\n });\n if (match.project) {\n existingProjectId = match.project.id;\n }\n if (match.setup) {\n existingSetup = match.setup;\n trackEvent('existing_config_detected', {\n has_claude_md: !!fingerprint.existingConfigs.claudeMd,\n has_cursorrules: !!fingerprint.existingConfigs.cursorrules,\n has_cursor_rules: (fingerprint.existingConfigs.cursorRules?.length ?? 0) > 0,\n has_skills: (fingerprint.existingConfigs.claudeSkills?.length ?? 0) > 0,\n });\n matchSpinner.succeed('Found existing setup');\n } else {\n matchSpinner.info('No existing setup found');\n }\n } catch {\n matchSpinner.info('No existing setup found');\n }\n\n // Step 4: Determine target agent\n const targetAgent = options.agent || await promptAgent();\n trackEvent('target_agent_selected', { target_agent: targetAgent });\n\n // Step 5: Get project description if empty directory\n const isEmpty = fingerprint.fileTree.length < 3;\n if (isEmpty) {\n fingerprint.description = await promptInput('What will you build in this project?');\n }\n\n // Step 6: Generate setup via AI\n let generatedSetup: Record<string, unknown> | null = null;\n let setupExplanation: string | undefined;\n let rawOutput: string | undefined;\n\n trackEvent('generation_started', { target_agent: targetAgent });\n\n const genSpinner = ora('Generating setup...').start();\n const genMessages = new SpinnerMessages(genSpinner, GENERATION_MESSAGES);\n genMessages.start();\n\n try {\n await apiStream(\n '/api/setups/generate',\n {\n fingerprint,\n targetAgent,\n prompt: fingerprint.description,\n },\n () => {},\n (payload) => {\n generatedSetup = payload.setup as Record<string, unknown>;\n setupExplanation = payload.explanation;\n rawOutput = payload.raw;\n },\n (error) => {\n genMessages.stop();\n trackEvent('error_occurred', { error_type: 'generation_failed', error_message: error, command: 'init' });\n genSpinner.fail(`Generation error: ${error}`);\n },\n (status) => { genMessages.handleServerStatus(status); }\n );\n } catch (err) {\n genMessages.stop();\n const msg = err instanceof Error ? err.message : 'Unknown error';\n trackEvent('error_occurred', { error_type: 'generation_request_failed', error_message: msg, command: 'init' });\n genSpinner.fail(`Generation failed: ${msg}`);\n throw new Error('__exit__');\n }\n\n genMessages.stop();\n\n if (!generatedSetup) {\n genSpinner.fail('Failed to generate setup.');\n if (rawOutput) {\n console.log(chalk.dim('\\nRaw LLM output (JSON parse failed):'));\n console.log(chalk.dim(rawOutput.slice(0, 500)));\n }\n throw new Error('__exit__');\n }\n\n genSpinner.succeed('Setup generated');\n printSetupSummary(generatedSetup);\n\n // Step 7: Accept / Refine / Explain / Decline\n let explained = false;\n let action = await promptAction(explained);\n\n while (action === 'explain') {\n if (setupExplanation) {\n printExplanation(setupExplanation);\n } else {\n console.log(chalk.dim('\\nNo explanation available for this setup.\\n'));\n }\n explained = true;\n action = await promptAction(explained);\n }\n\n if (action === 'decline') {\n trackEvent('setup_declined');\n console.log(chalk.dim('Setup declined. No files were modified.'));\n return;\n }\n\n if (action === 'refine') {\n generatedSetup = await refineLoop(generatedSetup, targetAgent);\n if (!generatedSetup) {\n trackEvent('refinement_cancelled');\n console.log(chalk.dim('Refinement cancelled. No files were modified.'));\n return;\n }\n }\n\n // Step 8: Write files\n if (options.dryRun) {\n console.log(chalk.yellow('\\n[Dry run] Would write the following files:'));\n console.log(JSON.stringify(generatedSetup, null, 2));\n return;\n }\n\n const writeSpinner = ora('Writing config files...').start();\n try {\n const result = writeSetup(generatedSetup as Parameters<typeof writeSetup>[0]);\n writeSpinner.succeed('Config files written');\n\n trackEvent('setup_applied', { files_written: result.written.length, target_agent: targetAgent });\n\n console.log(chalk.bold('\\nFiles created/updated:'));\n for (const file of result.written) {\n console.log(` ${chalk.green('✓')} ${file}`);\n }\n if (result.backupDir) {\n console.log(chalk.dim(`\\n Backups saved to ${result.backupDir}`));\n }\n } catch (err) {\n writeSpinner.fail('Failed to write files');\n console.error(chalk.red(err instanceof Error ? err.message : 'Unknown error'));\n throw new Error('__exit__');\n }\n\n // Step 8.5: Offer to install auto-refresh hook\n const hookAnswer = await promptInput(chalk.cyan('Enable auto-refresh on Claude Code session end? (Y/n):'));\n if (!hookAnswer || hookAnswer.toLowerCase() !== 'n') {\n const hookResult = installHook();\n if (hookResult.installed) {\n console.log(` ${chalk.green('✓')} Auto-refresh hook installed`);\n const sha = getCurrentHeadSha();\n if (sha) {\n writeState({ lastRefreshSha: sha, lastRefreshTimestamp: new Date().toISOString() });\n }\n } else if (hookResult.alreadyInstalled) {\n console.log(chalk.dim(' Auto-refresh hook already installed'));\n }\n } else {\n console.log(chalk.dim(' Skipped. Run `caliber hooks install` later to enable.'));\n }\n\n // Step 9: Save to server\n try {\n let projectId = existingProjectId;\n\n if (!projectId) {\n const project = await apiRequest<{ id: string }>('/api/projects', {\n method: 'POST',\n body: {\n fingerprintHash: hash,\n name: fingerprint.packageName || 'untitled',\n gitRemoteUrl: fingerprint.gitRemoteUrl,\n description: fingerprint.description,\n },\n });\n projectId = project.id;\n }\n\n await apiRequest(`/api/setups/project/${projectId}`, {\n method: 'POST',\n body: {\n targetAgent,\n config: generatedSetup,\n isMaster: true,\n },\n });\n } catch (err) {\n console.log(chalk.yellow(`\\n Warning: Could not save project to server.`));\n console.log(chalk.dim(` ${err instanceof Error ? err.message : String(err)}`));\n console.log(chalk.dim(` Your local setup is unaffected.\\n`));\n }\n\n console.log(chalk.bold.green('\\nSetup complete! Your coding agent is now configured.'));\n console.log(chalk.dim('Run `caliber undo` to revert changes.\\n'));\n}\n\nasync function refineLoop(\n currentSetup: Record<string, unknown>,\n _targetAgent: string\n): Promise<Record<string, unknown> | null> {\n const history: Array<{ role: 'user' | 'assistant'; content: string }> = [];\n let refinementRound = 0;\n\n while (true) {\n const message = await promptInput('\\nWhat would you like to change?');\n if (!message || message.toLowerCase() === 'done' || message.toLowerCase() === 'accept') {\n return currentSetup;\n }\n if (message.toLowerCase() === 'cancel') {\n return null;\n }\n\n refinementRound++;\n trackEvent('refinement_message_sent', { refinement_round: refinementRound });\n\n let refined: Record<string, unknown> | null = null;\n const refineSpinner = ora('Refining setup...').start();\n const refineMessages = new SpinnerMessages(refineSpinner, REFINE_MESSAGES);\n refineMessages.start();\n\n await apiStream(\n '/api/setups/refine',\n { currentSetup, message, conversationHistory: history },\n () => {},\n (payload) => { refined = payload.setup as Record<string, unknown>; },\n (error) => { refineMessages.stop(); refineSpinner.fail(`Refinement error: ${error}`); },\n (status) => { refineMessages.handleServerStatus(status); }\n );\n\n refineMessages.stop();\n\n if (refined) {\n currentSetup = refined;\n history.push({ role: 'user', content: message });\n history.push({ role: 'assistant', content: JSON.stringify(refined) });\n refineSpinner.succeed('Setup updated');\n printSetupSummary(refined);\n console.log(chalk.dim('Type \"done\" to accept, or describe more changes.'));\n }\n }\n}\n\nfunction promptInput(question: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(chalk.cyan(`${question} `), (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nfunction promptAgent(): Promise<TargetAgent> {\n return new Promise((resolve) => {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n console.log(chalk.bold('Which coding agent are you using?'));\n console.log(' 1. Claude Code');\n console.log(' 2. Cursor');\n console.log(' 3. Both');\n rl.question(chalk.cyan('\\nChoose (1-3): '), (answer) => {\n rl.close();\n const map: Record<string, TargetAgent> = { '1': 'claude', '2': 'cursor', '3': 'both' };\n resolve(map[answer.trim()] || 'claude');\n });\n });\n}\n\nfunction promptAction(explained: boolean): Promise<'accept' | 'refine' | 'explain' | 'decline'> {\n return new Promise((resolve) => {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n console.log(chalk.bold('What would you like to do?'));\n if (explained) {\n console.log(' 1. Accept and apply');\n console.log(' 2. Refine via chat');\n console.log(' 3. Decline');\n rl.question(chalk.cyan('\\nChoose (1-3): '), (answer) => {\n rl.close();\n const map: Record<string, 'accept' | 'refine' | 'decline'> = {\n '1': 'accept', '2': 'refine', '3': 'decline',\n };\n resolve(map[answer.trim()] || 'accept');\n });\n } else {\n console.log(' 1. Accept and apply');\n console.log(' 2. Refine via chat');\n console.log(' 3. Explain recommendations');\n console.log(' 4. Decline');\n rl.question(chalk.cyan('\\nChoose (1-4): '), (answer) => {\n rl.close();\n const map: Record<string, 'accept' | 'refine' | 'explain' | 'decline'> = {\n '1': 'accept', '2': 'refine', '3': 'explain', '4': 'decline',\n };\n resolve(map[answer.trim()] || 'accept');\n });\n }\n });\n}\n\nfunction fileEntry(filePath: string, desc: string | undefined): string {\n const icon = fs.existsSync(filePath) ? chalk.yellow('~') : chalk.green('+');\n const description = desc ? chalk.dim(`— ${desc}`) : '';\n return ` ${icon} ${filePath} ${description}`;\n}\n\nfunction printSetupSummary(setup: Record<string, unknown>) {\n const claude = setup.claude as Record<string, unknown> | undefined;\n const cursor = setup.cursor as Record<string, unknown> | undefined;\n const descriptions = (setup.fileDescriptions || {}) as Record<string, string>;\n\n console.log('');\n\n if (claude) {\n if (claude.claudeMd) {\n console.log(fileEntry('CLAUDE.md', descriptions['CLAUDE.md']));\n }\n if (claude.settings) {\n console.log(fileEntry('.claude/settings.json', descriptions['.claude/settings.json']));\n }\n if (claude.settingsLocal) {\n console.log(fileEntry('.claude/settings.local.json', descriptions['.claude/settings.local.json']));\n }\n\n const skills = claude.skills as Array<{ name: string; content: string }> | undefined;\n if (Array.isArray(skills) && skills.length > 0) {\n for (const skill of skills) {\n const skillPath = `.claude/skills/${skill.name.replace(/[^a-z0-9-]/gi, '-').toLowerCase()}.md`;\n console.log(fileEntry(skillPath, descriptions[skillPath] || skill.name));\n }\n }\n\n const mcpServers = claude.mcpServers as Record<string, unknown> | undefined;\n if (mcpServers && Object.keys(mcpServers).length > 0) {\n console.log(fileEntry('.mcp.json', descriptions['.mcp.json'] || Object.keys(mcpServers).join(', ')));\n }\n }\n\n if (cursor) {\n if (cursor.cursorrules) {\n console.log(fileEntry('.cursorrules', descriptions['.cursorrules']));\n }\n\n const rules = cursor.rules as Array<{ filename: string }> | undefined;\n if (Array.isArray(rules) && rules.length > 0) {\n for (const rule of rules) {\n const rulePath = `.cursor/rules/${rule.filename}`;\n console.log(fileEntry(rulePath, descriptions[rulePath]));\n }\n }\n\n const mcpServers = cursor.mcpServers as Record<string, unknown> | undefined;\n if (mcpServers && Object.keys(mcpServers).length > 0) {\n console.log(fileEntry('.cursor/mcp.json', descriptions['.cursor/mcp.json'] || Object.keys(mcpServers).join(', ')));\n }\n }\n\n console.log('');\n console.log(` ${chalk.green('+')} ${chalk.dim('new')} ${chalk.yellow('~')} ${chalk.dim('modified')}`);\n console.log('');\n}\n\nfunction printExplanation(explanation: string) {\n console.log(chalk.bold('\\n Why this setup?\\n'));\n\n const lines = explanation.split('\\n');\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n const headerMatch = trimmed.match(/^\\[(.+)\\]$/);\n if (headerMatch) {\n console.log(` ${chalk.bold.hex('#6366f1')(headerMatch[1])}`);\n continue;\n }\n\n const itemMatch = trimmed.match(/^-\\s+\\*\\*(.+?)\\*\\*[:\\s]*(.*)$/);\n if (itemMatch) {\n const name = itemMatch[1];\n const desc = itemMatch[2].replace(/^\\s*[-—:]\\s*/, '');\n console.log(` ${chalk.dim('▸')} ${chalk.white(name)} ${chalk.dim(desc)}`);\n continue;\n }\n\n const plainMatch = trimmed.match(/^-\\s+(.*)$/);\n if (plainMatch) {\n console.log(` ${chalk.dim('▸')} ${chalk.dim(plainMatch[1])}`);\n continue;\n }\n\n console.log(` ${chalk.dim(trimmed)}`);\n }\n\n console.log('');\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { AUTH_DIR, AUTH_FILE } from '../constants.js';\n\ninterface StoredAuth {\n accessToken: string;\n refreshToken: string;\n expiresAt: number;\n userId: string;\n email: string;\n}\n\nexport function getStoredAuth(): StoredAuth | null {\n try {\n if (!fs.existsSync(AUTH_FILE)) return null;\n const data = JSON.parse(fs.readFileSync(AUTH_FILE, 'utf-8'));\n return data as StoredAuth;\n } catch {\n return null;\n }\n}\n\nexport function storeAuth(auth: {\n accessToken: string;\n refreshToken: string;\n expiresIn: number;\n user: { id: string; email: string };\n}) {\n if (!fs.existsSync(AUTH_DIR)) {\n fs.mkdirSync(AUTH_DIR, { recursive: true });\n }\n\n const data: StoredAuth = {\n accessToken: auth.accessToken,\n refreshToken: auth.refreshToken,\n expiresAt: Date.now() + auth.expiresIn * 1000,\n userId: auth.user.id,\n email: auth.user.email,\n };\n\n fs.writeFileSync(AUTH_FILE, JSON.stringify(data, null, 2), { mode: 0o600 });\n}\n\nexport function clearAuth() {\n try {\n if (fs.existsSync(AUTH_FILE)) fs.unlinkSync(AUTH_FILE);\n } catch {\n // ignore\n }\n}\n\nexport function isTokenExpired(): boolean {\n const auth = getStoredAuth();\n if (!auth) return true;\n return Date.now() >= auth.expiresAt - 60_000; // 1 min buffer\n}\n","import open from 'open';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport { generatePKCE } from '../auth/pkce.js';\nimport { startCallbackServer } from '../auth/callback-server.js';\nimport { storeAuth, getStoredAuth } from '../auth/token-store.js';\nimport { FRONTEND_URL, CLI_CALLBACK_PORT } from '../constants.js';\nimport { identifyUser, trackEvent } from '../telemetry.js';\n\nexport async function loginCommand() {\n const existing = getStoredAuth();\n if (existing) {\n console.log(chalk.dim(`Already logged in as ${existing.email}`));\n console.log(chalk.dim('Run `caliber logout` first to switch accounts.'));\n return;\n }\n\n const { state } = generatePKCE();\n const redirectUri = `http://127.0.0.1:${CLI_CALLBACK_PORT}/callback`;\n\n const authUrl = `${FRONTEND_URL}/auth/cli?redirect_uri=${encodeURIComponent(redirectUri)}&state=${state}`;\n\n console.log(chalk.bold('\\nOpening browser for authentication...\\n'));\n console.log(chalk.dim(`If the browser doesn't open, visit:\\n${authUrl}\\n`));\n\n const serverPromise = startCallbackServer(state);\n\n await open(authUrl);\n\n const spinner = ora('Waiting for authentication...').start();\n\n try {\n const result = await serverPromise;\n\n storeAuth({\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n expiresIn: result.expiresIn,\n user: result.user,\n });\n\n identifyUser(result.user.id, result.user.email);\n trackEvent('signin', { method: 'cli_pkce' });\n\n spinner.succeed(chalk.green(`Logged in as ${result.user.email}`));\n } catch (err) {\n trackEvent('error_occurred', { error_type: 'auth_failed', error_message: err instanceof Error ? err.message : 'Unknown error', command: 'login' });\n spinner.fail(chalk.red(`Authentication failed: ${err instanceof Error ? err.message : 'Unknown error'}`));\n throw new Error('__exit__');\n }\n}\n","import crypto from 'crypto';\n\nexport function generatePKCE() {\n const verifier = crypto.randomBytes(32).toString('base64url');\n const challenge = crypto\n .createHash('sha256')\n .update(verifier)\n .digest('base64url');\n const state = crypto.randomBytes(16).toString('hex');\n\n return { verifier, challenge, state };\n}\n","import http from 'http';\nimport { URL } from 'url';\nimport { CLI_CALLBACK_PORT } from '../constants.js';\n\nexport interface CallbackResult {\n accessToken: string;\n refreshToken: string;\n expiresIn: number;\n user: {\n id: string;\n email: string;\n };\n}\n\nexport function startCallbackServer(expectedState: string): Promise<CallbackResult> {\n return new Promise((resolve, reject) => {\n const server = http.createServer((req, res) => {\n if (!req.url?.startsWith('/callback')) {\n res.writeHead(404);\n res.end();\n return;\n }\n\n const url = new URL(req.url, `http://127.0.0.1:${CLI_CALLBACK_PORT}`);\n const error = url.searchParams.get('error');\n\n if (error) {\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end('<html><body><h2>Authentication failed</h2><p>You can close this tab.</p></body></html>');\n server.close();\n reject(new Error(`Auth failed: ${error}`));\n return;\n }\n\n const state = url.searchParams.get('state');\n const accessToken = url.searchParams.get('access_token');\n const refreshToken = url.searchParams.get('refresh_token');\n const expiresIn = url.searchParams.get('expires_in');\n const userId = url.searchParams.get('user_id');\n const email = url.searchParams.get('email');\n\n if (!accessToken || !refreshToken || !userId || state !== expectedState) {\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end('<html><body><h2>Invalid callback</h2></body></html>');\n server.close();\n reject(new Error('Invalid callback: missing token data or state mismatch'));\n return;\n }\n\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(`<html><body style=\"font-family: system-ui; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #09090b; color: #fafafa;\">\n <div style=\"text-align: center;\">\n <h2 style=\"color: #6366f1;\">Authentication successful!</h2>\n <p>You can close this tab and return to your terminal.</p>\n </div>\n </body></html>`);\n\n server.close();\n resolve({\n accessToken,\n refreshToken,\n expiresIn: parseInt(expiresIn || '3600', 10),\n user: { id: userId, email: email || '' },\n });\n });\n\n server.listen(CLI_CALLBACK_PORT, '127.0.0.1', () => {\n // Server ready\n });\n\n server.on('error', (err) => {\n reject(new Error(`Failed to start callback server: ${err.message}`));\n });\n\n setTimeout(() => {\n server.close();\n reject(new Error('Authentication timed out'));\n }, 5 * 60 * 1000);\n });\n}\n","import { PostHog } from 'posthog-node';\nimport fs from 'fs';\nimport path from 'path';\nimport os from 'os';\nimport { randomUUID } from 'crypto';\nimport { fileURLToPath } from 'url';\nimport { AUTH_DIR } from './constants.js';\nimport { getStoredAuth } from './auth/token-store.js';\n\nconst POSTHOG_API_KEY = process.env.CALIBER_POSTHOG_KEY || 'phc_XXrV0pSX4s2QVxVoOaeuyXDvtlRwPAjovt1ttMGVMPp';\nconst DEVICE_ID_FILE = path.join(AUTH_DIR, 'device-id');\n\nlet client: PostHog | null = null;\n\nfunction getClient(): PostHog {\n if (!client) {\n client = new PostHog(POSTHOG_API_KEY, { flushAt: 1, flushInterval: 0 });\n }\n return client;\n}\n\nexport function getDeviceId(): string {\n try {\n if (fs.existsSync(DEVICE_ID_FILE)) {\n return fs.readFileSync(DEVICE_ID_FILE, 'utf-8').trim();\n }\n } catch {}\n\n const id = randomUUID();\n try {\n if (!fs.existsSync(AUTH_DIR)) {\n fs.mkdirSync(AUTH_DIR, { recursive: true });\n }\n fs.writeFileSync(DEVICE_ID_FILE, id, { mode: 0o600 });\n } catch {}\n return id;\n}\n\nexport function isFirstRun(): boolean {\n return !fs.existsSync(DEVICE_ID_FILE);\n}\n\nexport function getDistinctId(): string {\n const auth = getStoredAuth();\n return auth?.userId || getDeviceId();\n}\n\nconst __dirname_telemetry = path.dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(\n fs.readFileSync(path.resolve(__dirname_telemetry, '..', 'package.json'), 'utf-8')\n);\n\nfunction baseProperties() {\n return {\n source: 'cli',\n cli_version: pkg.version,\n os: os.platform(),\n };\n}\n\nexport function trackEvent(event: string, properties: Record<string, unknown> = {}) {\n try {\n getClient().capture({\n distinctId: getDistinctId(),\n event,\n properties: { ...baseProperties(), ...properties },\n });\n } catch {}\n}\n\nexport function identifyUser(userId: string, email: string) {\n try {\n const ph = getClient();\n const deviceId = getDeviceId();\n\n ph.identify({ distinctId: userId, properties: { email, source: 'cli' } });\n\n if (deviceId !== userId) {\n ph.alias({ distinctId: userId, alias: deviceId });\n }\n } catch {}\n}\n\nexport async function shutdownTelemetry() {\n try {\n await Promise.race([\n client?.shutdown(),\n new Promise((resolve) => setTimeout(resolve, 2000)),\n ]);\n } catch {}\n}\n","import crypto from 'crypto';\nimport { getGitRemoteUrl } from './git.js';\nimport { analyzePackageJson } from './package-json.js';\nimport { getFileTree } from './file-tree.js';\nimport { detectLanguages } from './languages.js';\nimport { readExistingConfigs } from './existing-config.js';\nimport { analyzeCode, CodeAnalysis } from './code-analysis.js';\n\nexport type { CodeAnalysis };\n\nexport interface Fingerprint {\n gitRemoteUrl?: string;\n packageName?: string;\n languages: string[];\n frameworks: string[];\n fileTree: string[];\n existingConfigs: ReturnType<typeof readExistingConfigs>;\n codeAnalysis?: CodeAnalysis;\n description?: string;\n}\n\nexport function collectFingerprint(dir: string): Fingerprint {\n const gitRemoteUrl = getGitRemoteUrl();\n const pkgInfo = analyzePackageJson(dir);\n const fileTree = getFileTree(dir);\n const fileLangs = detectLanguages(fileTree);\n const existingConfigs = readExistingConfigs(dir);\n const codeAnalysis = analyzeCode(dir);\n\n const languages = [...new Set([...pkgInfo.languages, ...fileLangs])];\n\n return {\n gitRemoteUrl,\n packageName: pkgInfo.name,\n languages,\n frameworks: pkgInfo.frameworks,\n fileTree,\n existingConfigs,\n codeAnalysis,\n };\n}\n\nexport function computeFingerprintHash(fingerprint: Fingerprint): string {\n const key = [\n fingerprint.gitRemoteUrl || '',\n fingerprint.packageName || '',\n ].join('::');\n\n return crypto.createHash('sha256').update(key).digest('hex');\n}\n","import { execSync } from 'child_process';\nimport { existsSync } from 'fs';\nimport { resolve, dirname } from 'path';\n\nfunction isInsideGitRepo(): boolean {\n let dir = process.cwd();\n while (true) {\n if (existsSync(resolve(dir, '.git'))) return true;\n const parent = dirname(dir);\n if (parent === dir) return false;\n dir = parent;\n }\n}\n\nexport function getGitRemoteUrl(): string | undefined {\n if (!isInsideGitRepo()) return undefined;\n try {\n return execSync('git remote get-url origin', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n } catch {\n return undefined;\n }\n}\n\nexport function isGitRepo(): boolean {\n return isInsideGitRepo();\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { globSync } from 'glob';\n\ninterface PackageInfo {\n name?: string;\n frameworks: string[];\n languages: string[];\n}\n\nconst NODE_FRAMEWORK_DEPS: Record<string, string> = {\n react: 'React',\n next: 'Next.js',\n vue: 'Vue',\n nuxt: 'Nuxt',\n svelte: 'Svelte',\n '@sveltejs/kit': 'SvelteKit',\n angular: 'Angular',\n '@angular/core': 'Angular',\n express: 'Express',\n fastify: 'Fastify',\n hono: 'Hono',\n nestjs: 'NestJS',\n '@nestjs/core': 'NestJS',\n tailwindcss: 'Tailwind CSS',\n prisma: 'Prisma',\n drizzle: 'Drizzle',\n 'drizzle-orm': 'Drizzle',\n '@supabase/supabase-js': 'Supabase',\n mongoose: 'MongoDB',\n typeorm: 'TypeORM',\n sequelize: 'Sequelize',\n 'better-auth': 'Better Auth',\n};\n\nconst PYTHON_FRAMEWORK_DEPS: Record<string, string> = {\n fastapi: 'FastAPI',\n django: 'Django',\n flask: 'Flask',\n sqlalchemy: 'SQLAlchemy',\n pydantic: 'Pydantic',\n celery: 'Celery',\n pytest: 'pytest',\n uvicorn: 'Uvicorn',\n starlette: 'Starlette',\n httpx: 'HTTPX',\n alembic: 'Alembic',\n tortoise: 'Tortoise ORM',\n 'google-cloud-pubsub': 'Google Pub/Sub',\n stripe: 'Stripe',\n redis: 'Redis',\n};\n\nconst WORKSPACE_GLOBS = [\n 'apps/*/package.json',\n 'packages/*/package.json',\n 'services/*/package.json',\n 'libs/*/package.json',\n];\n\nfunction detectNodeFrameworks(pkgPath: string): string[] {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n const frameworks: string[] = [];\n for (const [dep, framework] of Object.entries(NODE_FRAMEWORK_DEPS)) {\n if (allDeps[dep]) frameworks.push(framework);\n }\n return frameworks;\n } catch {\n return [];\n }\n}\n\nfunction detectPythonFrameworks(dir: string): string[] {\n const frameworks: string[] = [];\n const candidates = [\n path.join(dir, 'pyproject.toml'),\n path.join(dir, 'requirements.txt'),\n ...globSync('apps/*/pyproject.toml', { cwd: dir, absolute: true }),\n ...globSync('apps/*/requirements.txt', { cwd: dir, absolute: true }),\n ...globSync('services/*/pyproject.toml', { cwd: dir, absolute: true }),\n ];\n\n for (const filePath of candidates) {\n if (!fs.existsSync(filePath)) continue;\n try {\n const content = fs.readFileSync(filePath, 'utf-8').toLowerCase();\n for (const [dep, framework] of Object.entries(PYTHON_FRAMEWORK_DEPS)) {\n if (content.includes(dep)) frameworks.push(framework);\n }\n } catch {}\n }\n\n return frameworks;\n}\n\nexport function analyzePackageJson(dir: string): PackageInfo {\n const rootPkgPath = path.join(dir, 'package.json');\n let name: string | undefined;\n const allFrameworks: string[] = [];\n const languages: string[] = [];\n\n if (fs.existsSync(rootPkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(rootPkgPath, 'utf-8'));\n name = pkg.name;\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n allFrameworks.push(...detectNodeFrameworks(rootPkgPath));\n\n if (allDeps.typescript || allDeps['@types/node']) {\n languages.push('TypeScript');\n }\n languages.push('JavaScript');\n } catch {}\n }\n\n for (const glob of WORKSPACE_GLOBS) {\n const matches = globSync(glob, { cwd: dir, absolute: true });\n for (const pkgPath of matches) {\n allFrameworks.push(...detectNodeFrameworks(pkgPath));\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n if (deps.typescript || deps['@types/node']) {\n languages.push('TypeScript');\n }\n } catch {}\n }\n }\n\n allFrameworks.push(...detectPythonFrameworks(dir));\n\n return {\n name,\n frameworks: [...new Set(allFrameworks)],\n languages: [...new Set(languages)],\n };\n}\n","import fs from 'fs';\nimport path from 'path';\n\nconst IGNORE_DIRS = new Set([\n 'node_modules', '.git', '.next', 'dist', 'build', '.cache',\n '.turbo', 'coverage', '.caliber', '__pycache__', '.venv',\n 'vendor', 'target',\n]);\n\nexport function getFileTree(dir: string, maxDepth = 3): string[] {\n const files: string[] = [];\n scan(dir, '', 0, maxDepth, files);\n return files;\n}\n\nfunction scan(base: string, rel: string, depth: number, maxDepth: number, result: string[]) {\n if (depth > maxDepth) return;\n\n const fullPath = path.join(base, rel);\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(fullPath, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (entry.name.startsWith('.') && depth === 0 && entry.isDirectory()) continue;\n if (IGNORE_DIRS.has(entry.name)) continue;\n\n const relPath = rel ? `${rel}/${entry.name}` : entry.name;\n\n if (entry.isDirectory()) {\n result.push(`${relPath}/`);\n scan(base, relPath, depth + 1, maxDepth, result);\n } else {\n result.push(relPath);\n }\n }\n}\n","import path from 'path';\n\nconst EXT_TO_LANG: Record<string, string> = {\n '.ts': 'TypeScript',\n '.tsx': 'TypeScript',\n '.js': 'JavaScript',\n '.jsx': 'JavaScript',\n '.py': 'Python',\n '.go': 'Go',\n '.rs': 'Rust',\n '.rb': 'Ruby',\n '.java': 'Java',\n '.kt': 'Kotlin',\n '.swift': 'Swift',\n '.cs': 'C#',\n '.cpp': 'C++',\n '.c': 'C',\n '.php': 'PHP',\n '.dart': 'Dart',\n '.ex': 'Elixir',\n '.exs': 'Elixir',\n '.scala': 'Scala',\n '.zig': 'Zig',\n};\n\nexport function detectLanguages(fileTree: string[]): string[] {\n const langs = new Set<string>();\n\n for (const file of fileTree) {\n const ext = path.extname(file).toLowerCase();\n if (EXT_TO_LANG[ext]) {\n langs.add(EXT_TO_LANG[ext]);\n }\n }\n\n return [...langs];\n}\n","import fs from 'fs';\nimport path from 'path';\n\nexport function readExistingConfigs(dir: string) {\n const configs: {\n claudeMd?: string;\n readmeMd?: string;\n claudeSettings?: Record<string, unknown>;\n claudeSkills?: Array<{ filename: string; content: string }>;\n cursorrules?: string;\n cursorRules?: Array<{ filename: string; content: string }>;\n } = {};\n\n // README.md\n const readmeMdPath = path.join(dir, 'README.md');\n if (fs.existsSync(readmeMdPath)) {\n configs.readmeMd = fs.readFileSync(readmeMdPath, 'utf-8');\n }\n\n // CLAUDE.md\n const claudeMdPath = path.join(dir, 'CLAUDE.md');\n if (fs.existsSync(claudeMdPath)) {\n configs.claudeMd = fs.readFileSync(claudeMdPath, 'utf-8');\n }\n\n // .claude/settings.json\n const claudeSettingsPath = path.join(dir, '.claude', 'settings.json');\n if (fs.existsSync(claudeSettingsPath)) {\n try {\n configs.claudeSettings = JSON.parse(fs.readFileSync(claudeSettingsPath, 'utf-8'));\n } catch {\n // ignore\n }\n }\n\n // .claude/skills/*.md\n const skillsDir = path.join(dir, '.claude', 'skills');\n if (fs.existsSync(skillsDir)) {\n try {\n const files = fs.readdirSync(skillsDir).filter(f => f.endsWith('.md'));\n configs.claudeSkills = files.map(f => ({\n filename: f,\n content: fs.readFileSync(path.join(skillsDir, f), 'utf-8'),\n }));\n } catch {\n // ignore\n }\n }\n\n // .cursorrules\n const cursorrulesPath = path.join(dir, '.cursorrules');\n if (fs.existsSync(cursorrulesPath)) {\n configs.cursorrules = fs.readFileSync(cursorrulesPath, 'utf-8');\n }\n\n // .cursor/rules/*.mdc\n const cursorRulesDir = path.join(dir, '.cursor', 'rules');\n if (fs.existsSync(cursorRulesDir)) {\n try {\n const files = fs.readdirSync(cursorRulesDir).filter(f => f.endsWith('.mdc'));\n configs.cursorRules = files.map(f => ({\n filename: f,\n content: fs.readFileSync(path.join(cursorRulesDir, f), 'utf-8'),\n }));\n } catch {\n // ignore\n }\n }\n\n return configs;\n}\n","import fs from 'fs';\nimport path from 'path';\n\nconst IGNORE_DIRS = new Set([\n 'node_modules', '.git', '.next', 'dist', 'build', '.cache',\n '.turbo', 'coverage', '.caliber', '__pycache__', '.venv',\n 'vendor', 'target',\n]);\n\nconst SOURCE_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx', '.py']);\n\nconst CONFIG_FILE_NAMES = new Set([\n 'Dockerfile', 'docker-compose.yml', 'docker-compose.yaml',\n 'Makefile', 'tsconfig.json', 'pyproject.toml', 'turbo.json',\n 'next.config.js', 'next.config.mjs', 'next.config.ts',\n 'vite.config.ts', 'vite.config.js', 'vite.config.mjs',\n 'drizzle.config.ts', 'drizzle.config.js',\n 'jest.config.ts', 'jest.config.js', 'jest.config.mjs',\n 'vitest.config.ts', 'vitest.config.js', 'vitest.config.mts',\n 'alembic.ini', 'setup.cfg', 'tox.ini',\n]);\n\nconst CONFIG_GLOBS_DIRS: Array<{ dir: string; pattern: RegExp }> = [\n { dir: '.github/workflows', pattern: /\\.ya?ml$/ },\n];\n\nconst TOTAL_BUDGET = 50_000;\nconst CONFIG_BUDGET = Math.floor(TOTAL_BUDGET * 0.3);\nconst SOURCE_BUDGET = Math.floor(TOTAL_BUDGET * 0.7);\n\nexport interface FileSummary {\n path: string;\n language: 'ts' | 'js' | 'py';\n imports: string[];\n exports: string[];\n functions: string[];\n classes: string[];\n types: string[];\n routes: string[];\n}\n\nexport interface ConfigFileContent {\n path: string;\n content: string;\n}\n\nexport interface CodeAnalysis {\n fileSummaries: FileSummary[];\n configFiles: ConfigFileContent[];\n truncated: boolean;\n}\n\nexport function analyzeCode(dir: string): CodeAnalysis {\n const sourceFiles: string[] = [];\n const configFiles: ConfigFileContent[] = [];\n\n walkDir(dir, '', 0, 10, sourceFiles, configFiles, dir);\n\n sortByPriority(sourceFiles);\n\n let configChars = 0;\n const trimmedConfigs: ConfigFileContent[] = [];\n for (const cfg of configFiles) {\n const size = cfg.path.length + cfg.content.length;\n if (configChars + size > CONFIG_BUDGET) break;\n trimmedConfigs.push(cfg);\n configChars += size;\n }\n\n let sourceChars = 0;\n let truncated = false;\n const fileSummaries: FileSummary[] = [];\n\n for (const relPath of sourceFiles) {\n const fullPath = path.join(dir, relPath);\n let content: string;\n try {\n content = fs.readFileSync(fullPath, 'utf-8');\n } catch {\n continue;\n }\n\n const lineCount = content.split('\\n').length;\n if (lineCount > 500) continue;\n\n const ext = path.extname(relPath);\n const language = resolveLanguage(ext);\n if (!language) continue;\n\n const summary = language === 'py'\n ? extractPython(relPath, content)\n : extractTypeScriptJavaScript(relPath, content, language);\n\n const summarySize = estimateSummarySize(summary);\n if (sourceChars + summarySize > SOURCE_BUDGET) {\n truncated = true;\n break;\n }\n\n fileSummaries.push(summary);\n sourceChars += summarySize;\n }\n\n return { fileSummaries, configFiles: trimmedConfigs, truncated };\n}\n\nfunction walkDir(\n base: string,\n rel: string,\n depth: number,\n maxDepth: number,\n sourceFiles: string[],\n configFiles: ConfigFileContent[],\n rootDir: string\n) {\n if (depth > maxDepth) return;\n const fullPath = path.join(base, rel);\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(fullPath, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (IGNORE_DIRS.has(entry.name)) continue;\n if (entry.name.startsWith('.') && depth === 0 && entry.isDirectory()) continue;\n\n const relPath = rel ? `${rel}/${entry.name}` : entry.name;\n\n if (entry.isDirectory()) {\n const matchedGlobDir = CONFIG_GLOBS_DIRS.find(\n (g) => relPath === g.dir || relPath.endsWith(`/${g.dir}`)\n );\n if (matchedGlobDir) {\n collectConfigsFromDir(base, relPath, matchedGlobDir.pattern, configFiles);\n }\n walkDir(base, relPath, depth + 1, maxDepth, sourceFiles, configFiles, rootDir);\n } else {\n if (CONFIG_FILE_NAMES.has(entry.name)) {\n try {\n const content = fs.readFileSync(path.join(base, relPath), 'utf-8');\n configFiles.push({ path: relPath, content });\n } catch {}\n }\n\n const ext = path.extname(entry.name);\n if (SOURCE_EXTENSIONS.has(ext) && !entry.name.endsWith('.d.ts')) {\n sourceFiles.push(relPath);\n }\n }\n }\n}\n\nfunction collectConfigsFromDir(\n base: string,\n relDir: string,\n pattern: RegExp,\n configFiles: ConfigFileContent[]\n) {\n const fullDir = path.join(base, relDir);\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(fullDir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n if (entry.isFile() && pattern.test(entry.name)) {\n const relPath = `${relDir}/${entry.name}`;\n try {\n const content = fs.readFileSync(path.join(base, relPath), 'utf-8');\n configFiles.push({ path: relPath, content });\n } catch {}\n }\n }\n}\n\nfunction sortByPriority(files: string[]) {\n const entryPointNames = new Set(['index.ts', 'index.js', 'main.py', 'app.ts', 'app.js', 'server.ts', 'server.js']);\n const routePattern = /(route|api|controller)/i;\n const schemaPattern = /(types|schema|models)/i;\n const servicePattern = /(service|lib|utils)/i;\n const testPattern = /(test|spec|__tests__)/i;\n\n function priority(filePath: string): number {\n const base = path.basename(filePath);\n if (entryPointNames.has(base)) return 0;\n if (routePattern.test(filePath)) return 1;\n if (schemaPattern.test(filePath)) return 2;\n if (servicePattern.test(filePath)) return 3;\n if (testPattern.test(filePath)) return 5;\n return 4;\n }\n\n files.sort((a, b) => priority(a) - priority(b));\n}\n\nfunction resolveLanguage(ext: string): 'ts' | 'js' | 'py' | null {\n if (ext === '.ts' || ext === '.tsx') return 'ts';\n if (ext === '.js' || ext === '.jsx') return 'js';\n if (ext === '.py') return 'py';\n return null;\n}\n\nfunction extractTypeScriptJavaScript(\n filePath: string,\n content: string,\n language: 'ts' | 'js'\n): FileSummary {\n const lines = content.split('\\n');\n const imports: string[] = [];\n const exports: string[] = [];\n const functions: string[] = [];\n const classes: string[] = [];\n const types: string[] = [];\n const routes: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n if (/^import\\s+/.test(trimmed)) {\n imports.push(trimmed);\n continue;\n }\n\n const exportMatch = trimmed.match(\n /^export\\s+(?:default\\s+)?(?:async\\s+)?(function|const|class|interface|type|enum)\\s+(\\w+)/\n );\n if (exportMatch) {\n exports.push(`${exportMatch[1]} ${exportMatch[2]}`);\n if (exportMatch[1] === 'class') classes.push(exportMatch[2]);\n if (exportMatch[1] === 'interface' || exportMatch[1] === 'type') types.push(exportMatch[2]);\n if (exportMatch[1] === 'function') functions.push(exportMatch[2]);\n continue;\n }\n\n const fnMatch = trimmed.match(/^(?:async\\s+)?function\\s+(\\w+)/);\n if (fnMatch && !trimmed.startsWith('export')) {\n functions.push(fnMatch[1]);\n continue;\n }\n\n const arrowMatch = trimmed.match(/^(?:export\\s+)?const\\s+(\\w+)\\s*=\\s*(?:async\\s*)?\\(/);\n if (arrowMatch && !exports.some((e) => e.endsWith(arrowMatch[1]))) {\n functions.push(arrowMatch[1]);\n }\n\n const classMatch = trimmed.match(/^class\\s+(\\w+)/);\n if (classMatch && !trimmed.startsWith('export')) {\n classes.push(classMatch[1]);\n continue;\n }\n\n const ifaceMatch = trimmed.match(/^(?:interface|type)\\s+(\\w+)/);\n if (ifaceMatch && !trimmed.startsWith('export')) {\n types.push(ifaceMatch[1]);\n continue;\n }\n\n const routeMatch = trimmed.match(\n /(?:router|app|server)\\.(get|post|put|patch|delete|all|use)\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/\n );\n if (routeMatch) {\n routes.push(`${routeMatch[1].toUpperCase()} ${routeMatch[2]}`);\n }\n }\n\n return { path: filePath, language, imports, exports, functions, classes, types, routes };\n}\n\nfunction extractPython(filePath: string, content: string): FileSummary {\n const lines = content.split('\\n');\n const imports: string[] = [];\n const functions: string[] = [];\n const classes: string[] = [];\n const routes: string[] = [];\n\n let prevLine = '';\n for (const line of lines) {\n const trimmed = line.trim();\n\n if (/^import\\s+/.test(trimmed) || /^from\\s+/.test(trimmed)) {\n imports.push(trimmed);\n continue;\n }\n\n const defMatch = trimmed.match(/^def\\s+(\\w+)\\s*\\(([^)]*)\\)/);\n if (defMatch) {\n functions.push(`${defMatch[1]}(${defMatch[2]})`);\n }\n\n const classMatch = trimmed.match(/^class\\s+(\\w+)/);\n if (classMatch) {\n classes.push(classMatch[1]);\n }\n\n const decoratorRoute = prevLine.match(\n /@(?:app|router)\\.(get|post|put|patch|delete|options|head)\\s*\\(\\s*['\"]([^'\"]+)['\"]/\n );\n if (decoratorRoute && defMatch) {\n routes.push(`${decoratorRoute[1].toUpperCase()} ${decoratorRoute[2]}`);\n }\n\n const includeRouter = trimmed.match(\n /include_router\\s*\\([^,]+,\\s*prefix\\s*=\\s*['\"]([^'\"]+)['\"]/\n );\n if (includeRouter) {\n routes.push(`ROUTER ${includeRouter[1]}`);\n }\n\n prevLine = trimmed;\n }\n\n return {\n path: filePath,\n language: 'py',\n imports,\n exports: [],\n functions,\n classes,\n types: [],\n routes,\n };\n}\n\nfunction estimateSummarySize(summary: FileSummary): number {\n return (\n summary.path.length +\n summary.imports.reduce((s, i) => s + i.length, 0) +\n summary.exports.reduce((s, e) => s + e.length, 0) +\n summary.functions.reduce((s, f) => s + f.length, 0) +\n summary.classes.reduce((s, c) => s + c.length, 0) +\n summary.types.reduce((s, t) => s + t.length, 0) +\n summary.routes.reduce((s, r) => s + r.length, 0)\n );\n}\n","import { getStoredAuth, storeAuth, isTokenExpired } from '../auth/token-store.js';\nimport { API_URL } from '../constants.js';\n\nasync function forceRefreshToken(): Promise<string | null> {\n const auth = getStoredAuth();\n if (!auth) return null;\n\n try {\n const resp = await fetch(`${API_URL}/api/auth/refresh`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ refreshToken: auth.refreshToken }),\n });\n\n if (!resp.ok) return null;\n\n const { data } = await resp.json();\n storeAuth({\n accessToken: data.accessToken,\n refreshToken: data.refreshToken,\n expiresIn: data.expiresIn,\n user: { id: auth.userId, email: auth.email },\n });\n\n return data.accessToken;\n } catch {\n return null;\n }\n}\n\nasync function getValidToken(): Promise<string> {\n const auth = getStoredAuth();\n if (!auth) {\n throw new Error('Not authenticated. Run `caliber login` first.');\n }\n\n if (!isTokenExpired()) return auth.accessToken;\n\n const refreshed = await forceRefreshToken();\n if (!refreshed) {\n throw new Error('Session expired. Run `caliber login` to re-authenticate.');\n }\n return refreshed;\n}\n\nexport async function apiRequest<T = unknown>(\n path: string,\n options: {\n method?: string;\n body?: unknown;\n } = {}\n): Promise<T> {\n let token = await getValidToken();\n\n let resp = await fetch(`${API_URL}${path}`, {\n method: options.method || 'GET',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: options.body ? JSON.stringify(options.body) : undefined,\n });\n\n if (resp.status === 401) {\n const refreshed = await forceRefreshToken();\n if (!refreshed) {\n throw new Error('Session expired. Run `caliber login` to re-authenticate.');\n }\n token = refreshed;\n resp = await fetch(`${API_URL}${path}`, {\n method: options.method || 'GET',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: options.body ? JSON.stringify(options.body) : undefined,\n });\n }\n\n if (!resp.ok) {\n const error = await resp.json().catch(() => ({ error: resp.statusText }));\n throw new Error(error.error || `API error: ${resp.status}`);\n }\n\n const json = await resp.json();\n return json.data as T;\n}\n\nexport interface StreamCompletePayload {\n setup: unknown;\n explanation?: string;\n raw?: string;\n}\n\nexport async function apiStream(\n path: string,\n body: unknown,\n onChunk: (text: string) => void,\n onComplete: (payload: StreamCompletePayload) => void,\n onError: (error: string) => void,\n onStatus?: (message: string) => void\n): Promise<void> {\n let token = await getValidToken();\n\n let resp = await fetch(`${API_URL}${path}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify(body),\n });\n\n if (resp.status === 401) {\n const refreshed = await forceRefreshToken();\n if (!refreshed) {\n throw new Error('Session expired. Run `caliber login` to re-authenticate.');\n }\n token = refreshed;\n resp = await fetch(`${API_URL}${path}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify(body),\n });\n }\n\n if (!resp.ok || !resp.body) {\n throw new Error(`API error: ${resp.status}`);\n }\n\n const reader = resp.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue;\n const data = line.slice(6);\n if (data === '[DONE]') return;\n\n try {\n const parsed = JSON.parse(data);\n if (parsed.type === 'chunk') onChunk(parsed.content);\n else if (parsed.type === 'status' && onStatus) onStatus(parsed.message);\n else if (parsed.type === 'complete') onComplete({ setup: parsed.setup, explanation: parsed.explanation, raw: parsed.raw });\n else if (parsed.type === 'error') onError(parsed.message);\n } catch {\n // Skip unparseable lines\n }\n }\n }\n}\n","import fs from 'fs';\nimport { writeClaudeConfig } from './claude/index.js';\nimport { writeCursorConfig } from './cursor/index.js';\nimport { createBackup, restoreBackup } from './backup.js';\nimport {\n readManifest,\n writeManifest,\n fileChecksum,\n type Manifest,\n type ManifestEntry,\n} from './manifest.js';\n\ninterface AgentSetup {\n targetAgent: 'claude' | 'cursor' | 'both';\n claude?: Parameters<typeof writeClaudeConfig>[0];\n cursor?: Parameters<typeof writeCursorConfig>[0];\n}\n\nexport function writeSetup(setup: AgentSetup): { written: string[]; backupDir?: string } {\n // Collect all files that will be written\n const filesToWrite = getFilesToWrite(setup);\n\n // Backup existing files\n const existingFiles = filesToWrite.filter(f => fs.existsSync(f));\n const backupDir = existingFiles.length > 0 ? createBackup(existingFiles) : undefined;\n\n const written: string[] = [];\n\n // Write Claude configs\n if ((setup.targetAgent === 'claude' || setup.targetAgent === 'both') && setup.claude) {\n written.push(...writeClaudeConfig(setup.claude));\n }\n\n // Write Cursor configs\n if ((setup.targetAgent === 'cursor' || setup.targetAgent === 'both') && setup.cursor) {\n written.push(...writeCursorConfig(setup.cursor));\n }\n\n // Ensure .caliber/ is in .gitignore\n ensureGitignore();\n\n // Write manifest\n const entries: ManifestEntry[] = written.map(file => ({\n path: file,\n action: existingFiles.includes(file) ? 'modified' as const : 'created' as const,\n checksum: fileChecksum(file),\n timestamp: new Date().toISOString(),\n }));\n\n writeManifest({ version: 1, backupDir, entries });\n\n return { written, backupDir };\n}\n\nexport function undoSetup(): { restored: string[]; removed: string[] } {\n const manifest = readManifest();\n if (!manifest) {\n throw new Error('No manifest found. Nothing to undo.');\n }\n\n const restored: string[] = [];\n const removed: string[] = [];\n\n for (const entry of manifest.entries) {\n if (entry.action === 'created') {\n // Remove files we created\n if (fs.existsSync(entry.path)) {\n fs.unlinkSync(entry.path);\n removed.push(entry.path);\n }\n } else if (entry.action === 'modified' && manifest.backupDir) {\n // Restore from backup\n if (restoreBackup(manifest.backupDir, entry.path)) {\n restored.push(entry.path);\n }\n }\n }\n\n // Clean up manifest\n const { MANIFEST_FILE } = require('../constants.js');\n if (fs.existsSync(MANIFEST_FILE)) {\n fs.unlinkSync(MANIFEST_FILE);\n }\n\n return { restored, removed };\n}\n\nfunction getFilesToWrite(setup: AgentSetup): string[] {\n const files: string[] = [];\n\n if ((setup.targetAgent === 'claude' || setup.targetAgent === 'both') && setup.claude) {\n files.push('CLAUDE.md', '.claude/settings.json', '.claude/settings.local.json');\n if (setup.claude.mcpServers) files.push('.mcp.json');\n if (setup.claude.skills) {\n for (const s of setup.claude.skills) {\n files.push(`.claude/skills/${s.name.replace(/[^a-z0-9-]/gi, '-').toLowerCase()}.md`);\n }\n }\n }\n\n if ((setup.targetAgent === 'cursor' || setup.targetAgent === 'both') && setup.cursor) {\n if (setup.cursor.cursorrules) files.push('.cursorrules');\n if (setup.cursor.rules) {\n for (const r of setup.cursor.rules) files.push(`.cursor/rules/${r.filename}`);\n }\n if (setup.cursor.mcpServers) files.push('.cursor/mcp.json');\n }\n\n return files;\n}\n\nfunction ensureGitignore() {\n const gitignorePath = '.gitignore';\n if (fs.existsSync(gitignorePath)) {\n const content = fs.readFileSync(gitignorePath, 'utf-8');\n if (!content.includes('.caliber/')) {\n fs.appendFileSync(gitignorePath, '\\n# Caliber local state\\n.caliber/\\n');\n }\n } else {\n fs.writeFileSync(gitignorePath, '# Caliber local state\\n.caliber/\\n');\n }\n}\n","import fs from 'fs';\nimport path from 'path';\n\ninterface ClaudeConfig {\n claudeMd: string;\n settings: {\n permissions: { allow: string[] };\n hooks?: Record<string, Array<{ command: string; description?: string }>>;\n };\n settingsLocal: {\n permissions: { allow: string[] };\n };\n skills?: Array<{ name: string; content: string }>;\n mcpServers?: Record<string, { command: string; args?: string[]; env?: Record<string, string> }>;\n}\n\nexport function writeClaudeConfig(config: ClaudeConfig): string[] {\n const written: string[] = [];\n\n // CLAUDE.md\n fs.writeFileSync('CLAUDE.md', config.claudeMd);\n written.push('CLAUDE.md');\n\n // .claude/settings.json\n const claudeDir = '.claude';\n if (!fs.existsSync(claudeDir)) fs.mkdirSync(claudeDir, { recursive: true });\n\n fs.writeFileSync(\n path.join(claudeDir, 'settings.json'),\n JSON.stringify(config.settings, null, 2)\n );\n written.push(path.join(claudeDir, 'settings.json'));\n\n // .claude/settings.local.json\n fs.writeFileSync(\n path.join(claudeDir, 'settings.local.json'),\n JSON.stringify(config.settingsLocal, null, 2)\n );\n written.push(path.join(claudeDir, 'settings.local.json'));\n\n // Skills\n if (config.skills?.length) {\n const skillsDir = path.join(claudeDir, 'skills');\n if (!fs.existsSync(skillsDir)) fs.mkdirSync(skillsDir, { recursive: true });\n\n for (const skill of config.skills) {\n const filename = `${skill.name.replace(/[^a-z0-9-]/gi, '-').toLowerCase()}.md`;\n const skillPath = path.join(skillsDir, filename);\n fs.writeFileSync(skillPath, skill.content);\n written.push(skillPath);\n }\n }\n\n // MCP servers (.mcp.json)\n if (config.mcpServers && Object.keys(config.mcpServers).length > 0) {\n const mcpConfig = { mcpServers: config.mcpServers };\n fs.writeFileSync('.mcp.json', JSON.stringify(mcpConfig, null, 2));\n written.push('.mcp.json');\n }\n\n return written;\n}\n","import fs from 'fs';\nimport path from 'path';\n\ninterface CursorConfig {\n cursorrules?: string;\n rules?: Array<{ filename: string; content: string }>;\n mcpServers?: Record<string, { command: string; args?: string[]; env?: Record<string, string> }>;\n}\n\nexport function writeCursorConfig(config: CursorConfig): string[] {\n const written: string[] = [];\n\n // .cursorrules\n if (config.cursorrules) {\n fs.writeFileSync('.cursorrules', config.cursorrules);\n written.push('.cursorrules');\n }\n\n // .cursor/rules/*.mdc\n if (config.rules?.length) {\n const rulesDir = path.join('.cursor', 'rules');\n if (!fs.existsSync(rulesDir)) fs.mkdirSync(rulesDir, { recursive: true });\n\n for (const rule of config.rules) {\n const rulePath = path.join(rulesDir, rule.filename);\n fs.writeFileSync(rulePath, rule.content);\n written.push(rulePath);\n }\n }\n\n // .cursor/mcp.json\n if (config.mcpServers && Object.keys(config.mcpServers).length > 0) {\n const cursorDir = '.cursor';\n if (!fs.existsSync(cursorDir)) fs.mkdirSync(cursorDir, { recursive: true });\n\n const mcpConfig = { mcpServers: config.mcpServers };\n fs.writeFileSync(\n path.join(cursorDir, 'mcp.json'),\n JSON.stringify(mcpConfig, null, 2)\n );\n written.push(path.join(cursorDir, 'mcp.json'));\n }\n\n return written;\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { BACKUPS_DIR } from '../constants.js';\n\nexport function createBackup(files: string[]): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const backupDir = path.join(BACKUPS_DIR, timestamp);\n\n for (const file of files) {\n if (!fs.existsSync(file)) continue;\n\n const dest = path.join(backupDir, file);\n const destDir = path.dirname(dest);\n if (!fs.existsSync(destDir)) {\n fs.mkdirSync(destDir, { recursive: true });\n }\n fs.copyFileSync(file, dest);\n }\n\n return backupDir;\n}\n\nexport function restoreBackup(backupDir: string, file: string): boolean {\n const backupFile = path.join(backupDir, file);\n if (!fs.existsSync(backupFile)) return false;\n\n const destDir = path.dirname(file);\n if (!fs.existsSync(destDir)) {\n fs.mkdirSync(destDir, { recursive: true });\n }\n fs.copyFileSync(backupFile, file);\n return true;\n}\n","import fs from 'fs';\nimport crypto from 'crypto';\nimport { CALIBER_DIR, MANIFEST_FILE } from '../constants.js';\n\nexport interface ManifestEntry {\n path: string;\n action: 'created' | 'modified';\n checksum: string;\n timestamp: string;\n}\n\nexport interface Manifest {\n version: 1;\n backupDir?: string;\n entries: ManifestEntry[];\n}\n\nexport function readManifest(): Manifest | null {\n try {\n if (!fs.existsSync(MANIFEST_FILE)) return null;\n return JSON.parse(fs.readFileSync(MANIFEST_FILE, 'utf-8'));\n } catch {\n return null;\n }\n}\n\nexport function writeManifest(manifest: Manifest) {\n if (!fs.existsSync(CALIBER_DIR)) {\n fs.mkdirSync(CALIBER_DIR, { recursive: true });\n }\n fs.writeFileSync(MANIFEST_FILE, JSON.stringify(manifest, null, 2));\n}\n\nexport function fileChecksum(filePath: string): string {\n const content = fs.readFileSync(filePath);\n return crypto.createHash('sha256').update(content).digest('hex');\n}\n","import fs from 'fs';\nimport path from 'path';\n\nconst SETTINGS_PATH = path.join('.claude', 'settings.json');\nconst HOOK_COMMAND = 'caliber refresh --quiet';\n\ninterface HookEntry {\n type: string;\n command: string;\n}\n\ninterface HookMatcher {\n matcher: string;\n hooks: HookEntry[];\n}\n\ninterface ClaudeSettings {\n hooks?: {\n SessionEnd?: HookMatcher[];\n [key: string]: unknown;\n };\n [key: string]: unknown;\n}\n\nfunction readSettings(): ClaudeSettings {\n if (!fs.existsSync(SETTINGS_PATH)) return {};\n try {\n return JSON.parse(fs.readFileSync(SETTINGS_PATH, 'utf-8'));\n } catch {\n return {};\n }\n}\n\nfunction writeSettings(settings: ClaudeSettings): void {\n const dir = path.dirname(SETTINGS_PATH);\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(SETTINGS_PATH, JSON.stringify(settings, null, 2));\n}\n\nfunction findHookIndex(sessionEnd: HookMatcher[]): number {\n return sessionEnd.findIndex(entry =>\n entry.hooks?.some(h => h.command === HOOK_COMMAND)\n );\n}\n\nexport function isHookInstalled(): boolean {\n const settings = readSettings();\n const sessionEnd = settings.hooks?.SessionEnd;\n if (!Array.isArray(sessionEnd)) return false;\n return findHookIndex(sessionEnd) !== -1;\n}\n\nexport function installHook(): { installed: boolean; alreadyInstalled: boolean } {\n const settings = readSettings();\n\n if (!settings.hooks) settings.hooks = {};\n if (!Array.isArray(settings.hooks.SessionEnd)) settings.hooks.SessionEnd = [];\n\n if (findHookIndex(settings.hooks.SessionEnd) !== -1) {\n return { installed: false, alreadyInstalled: true };\n }\n\n settings.hooks.SessionEnd.push({\n matcher: '',\n hooks: [{ type: 'command', command: HOOK_COMMAND }],\n });\n\n writeSettings(settings);\n return { installed: true, alreadyInstalled: false };\n}\n\nexport function removeHook(): { removed: boolean; notFound: boolean } {\n const settings = readSettings();\n const sessionEnd = settings.hooks?.SessionEnd;\n\n if (!Array.isArray(sessionEnd)) {\n return { removed: false, notFound: true };\n }\n\n const idx = findHookIndex(sessionEnd);\n if (idx === -1) {\n return { removed: false, notFound: true };\n }\n\n sessionEnd.splice(idx, 1);\n if (sessionEnd.length === 0) {\n delete settings.hooks!.SessionEnd;\n }\n if (settings.hooks && Object.keys(settings.hooks).length === 0) {\n delete settings.hooks;\n }\n\n writeSettings(settings);\n return { removed: true, notFound: false };\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { execSync } from 'child_process';\nimport { CALIBER_DIR } from '../constants.js';\n\nconst STATE_FILE = path.join(CALIBER_DIR, '.caliber-state.json');\n\ninterface CaliberState {\n lastRefreshSha: string;\n lastRefreshTimestamp: string;\n}\n\nexport function readState(): CaliberState | null {\n try {\n if (!fs.existsSync(STATE_FILE)) return null;\n return JSON.parse(fs.readFileSync(STATE_FILE, 'utf-8'));\n } catch {\n return null;\n }\n}\n\nexport function writeState(state: CaliberState): void {\n if (!fs.existsSync(CALIBER_DIR)) {\n fs.mkdirSync(CALIBER_DIR, { recursive: true });\n }\n fs.writeFileSync(STATE_FILE, JSON.stringify(state, null, 2));\n}\n\nexport function getCurrentHeadSha(): string | null {\n try {\n return execSync('git rev-parse HEAD', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n } catch {\n return null;\n }\n}\n","import type { Ora } from 'ora';\n\nexport const GENERATION_MESSAGES = [\n 'Analyzing your project structure and dependencies...',\n 'Mapping out build commands and test workflows...',\n 'Reviewing coding patterns and conventions...',\n 'Crafting permission rules for safe tool usage...',\n 'Designing skills tailored to your codebase...',\n 'Evaluating MCP server integrations...',\n 'Optimizing settings for your development workflow...',\n 'Building coding guidelines from your project style...',\n 'Setting up pre-commit hooks and quality gates...',\n 'Assembling your complete agent configuration...',\n];\n\nexport const REFINE_MESSAGES = [\n 'Applying your feedback to the configuration...',\n 'Adjusting coding guidelines...',\n 'Rebalancing permissions and tool settings...',\n 'Refining skills and workflows...',\n 'Updating rules to match your preferences...',\n 'Finalizing the revised setup...',\n];\n\nexport class SpinnerMessages {\n private spinner: Ora;\n private messages: string[];\n private index = 0;\n private timer: ReturnType<typeof setInterval> | null = null;\n\n constructor(spinner: Ora, messages: string[]) {\n this.spinner = spinner;\n this.messages = messages;\n }\n\n start(): void {\n this.index = 0;\n this.spinner.text = this.messages[0];\n this.timer = setInterval(() => {\n this.index = (this.index + 1) % this.messages.length;\n this.spinner.text = this.messages[this.index];\n }, 3000);\n }\n\n handleServerStatus(status: string): void {\n this.spinner.text = status;\n // Reset the timer so the server status displays for a full interval\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = setInterval(() => {\n this.index = (this.index + 1) % this.messages.length;\n this.spinner.text = this.messages[this.index];\n }, 3000);\n }\n }\n\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n }\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { undoSetup } from '../writers/index.js';\nimport { trackEvent } from '../telemetry.js';\n\nexport function undoCommand() {\n const spinner = ora('Reverting setup...').start();\n\n try {\n const { restored, removed } = undoSetup();\n\n if (restored.length === 0 && removed.length === 0) {\n spinner.info('Nothing to undo.');\n return;\n }\n\n spinner.succeed('Setup reverted successfully.\\n');\n trackEvent('setup_undone', { restored: restored.length, removed: removed.length });\n\n if (restored.length > 0) {\n console.log(chalk.cyan(' Restored from backup:'));\n for (const file of restored) {\n console.log(` ${chalk.green('↩')} ${file}`);\n }\n }\n\n if (removed.length > 0) {\n console.log(chalk.cyan(' Removed:'));\n for (const file of removed) {\n console.log(` ${chalk.red('✗')} ${file}`);\n }\n }\n\n console.log('');\n } catch (err) {\n spinner.fail(chalk.red(err instanceof Error ? err.message : 'Undo failed'));\n throw new Error('__exit__');\n }\n}\n","import chalk from 'chalk';\nimport fs from 'fs';\nimport { readManifest } from '../writers/manifest.js';\nimport { getStoredAuth } from '../auth/token-store.js';\nimport { collectFingerprint, computeFingerprintHash } from '../fingerprint/index.js';\nimport { apiRequest } from '../api/client.js';\nimport { scanLocalState, compareState, type ServerItem } from '../scanner/index.js';\n\nexport async function statusCommand(options: { json?: boolean }) {\n const auth = getStoredAuth();\n const manifest = readManifest();\n\n if (options.json) {\n console.log(JSON.stringify({\n authenticated: !!auth,\n email: auth?.email,\n manifest: manifest,\n }, null, 2));\n return;\n }\n\n console.log(chalk.bold('\\nCaliber Status\\n'));\n\n if (auth) {\n console.log(` Auth: ${chalk.green('Logged in')} as ${auth.email}`);\n } else {\n console.log(` Auth: ${chalk.yellow('Not logged in')}`);\n }\n\n if (!manifest) {\n console.log(` Setup: ${chalk.dim('No setup applied')}`);\n console.log(chalk.dim('\\n Run `caliber init` to get started.\\n'));\n return;\n }\n\n console.log(` Files managed: ${chalk.cyan(manifest.entries.length.toString())}`);\n for (const entry of manifest.entries) {\n const exists = fs.existsSync(entry.path);\n const icon = exists ? chalk.green('✓') : chalk.red('✗');\n console.log(` ${icon} ${entry.path} (${entry.action})`);\n }\n\n if (auth) {\n try {\n const fingerprint = collectFingerprint(process.cwd());\n const hash = computeFingerprintHash(fingerprint);\n const match = await apiRequest<{ project: { id: string } | null }>(\n '/api/projects/match',\n { method: 'POST', body: { fingerprintHash: hash } }\n );\n\n if (match?.project) {\n const serverItems = await apiRequest<ServerItem[]>(\n `/api/sync/project/${match.project.id}/items`\n );\n\n if (serverItems?.length) {\n const localItems = scanLocalState(process.cwd());\n const diff = compareState(serverItems, localItems);\n\n console.log(chalk.bold('\\n Sync'));\n console.log(` ${chalk.green('✓')} Installed: ${diff.installed.length}`);\n if (diff.missing.length) console.log(` ${chalk.red('✗')} Missing: ${diff.missing.length}`);\n if (diff.outdated.length) console.log(` ${chalk.yellow('~')} Outdated: ${diff.outdated.length}`);\n }\n }\n } catch {\n // sync info is non-critical\n }\n }\n\n console.log('');\n}\n","import fs from 'fs';\nimport path from 'path';\nimport crypto from 'crypto';\nimport os from 'os';\n\nexport interface LocalItem {\n type: 'mcp' | 'rule' | 'skill' | 'config';\n platform: 'claude' | 'cursor';\n name: string;\n contentHash: string;\n path: string;\n}\n\nexport interface PlatformDetection {\n claude: boolean;\n cursor: boolean;\n}\n\nexport function detectPlatforms(): PlatformDetection {\n const home = os.homedir();\n return {\n claude: fs.existsSync(path.join(home, '.claude')),\n cursor: fs.existsSync(getCursorConfigDir()),\n };\n}\n\nexport function scanLocalState(dir: string): LocalItem[] {\n const items: LocalItem[] = [];\n\n // Claude: CLAUDE.md\n const claudeMdPath = path.join(dir, 'CLAUDE.md');\n if (fs.existsSync(claudeMdPath)) {\n items.push({\n type: 'rule',\n platform: 'claude',\n name: 'CLAUDE.md',\n contentHash: hashFile(claudeMdPath),\n path: claudeMdPath,\n });\n }\n\n // Claude: .claude/settings.json\n const settingsPath = path.join(dir, '.claude', 'settings.json');\n if (fs.existsSync(settingsPath)) {\n items.push({\n type: 'config',\n platform: 'claude',\n name: 'settings.json',\n contentHash: hashFile(settingsPath),\n path: settingsPath,\n });\n }\n\n // Claude: .claude/skills/*.md\n const skillsDir = path.join(dir, '.claude', 'skills');\n if (fs.existsSync(skillsDir)) {\n for (const file of fs.readdirSync(skillsDir).filter(f => f.endsWith('.md'))) {\n const filePath = path.join(skillsDir, file);\n items.push({\n type: 'skill',\n platform: 'claude',\n name: file,\n contentHash: hashFile(filePath),\n path: filePath,\n });\n }\n }\n\n // Claude: .mcp.json mcpServers\n const mcpJsonPath = path.join(dir, '.mcp.json');\n if (fs.existsSync(mcpJsonPath)) {\n try {\n const mcpJson = JSON.parse(fs.readFileSync(mcpJsonPath, 'utf-8'));\n if (mcpJson.mcpServers) {\n for (const name of Object.keys(mcpJson.mcpServers)) {\n items.push({\n type: 'mcp',\n platform: 'claude',\n name,\n contentHash: hashContent(JSON.stringify(mcpJson.mcpServers[name])),\n path: mcpJsonPath,\n });\n }\n }\n } catch { /* ignore */ }\n }\n\n // Cursor: .cursorrules\n const cursorrulesPath = path.join(dir, '.cursorrules');\n if (fs.existsSync(cursorrulesPath)) {\n items.push({\n type: 'rule',\n platform: 'cursor',\n name: '.cursorrules',\n contentHash: hashFile(cursorrulesPath),\n path: cursorrulesPath,\n });\n }\n\n // Cursor: .cursor/rules/*.mdc\n const cursorRulesDir = path.join(dir, '.cursor', 'rules');\n if (fs.existsSync(cursorRulesDir)) {\n for (const file of fs.readdirSync(cursorRulesDir).filter(f => f.endsWith('.mdc'))) {\n const filePath = path.join(cursorRulesDir, file);\n items.push({\n type: 'rule',\n platform: 'cursor',\n name: file,\n contentHash: hashFile(filePath),\n path: filePath,\n });\n }\n }\n\n // Cursor: .cursor/mcp.json mcpServers\n const cursorMcpPath = path.join(dir, '.cursor', 'mcp.json');\n if (fs.existsSync(cursorMcpPath)) {\n try {\n const mcpJson = JSON.parse(fs.readFileSync(cursorMcpPath, 'utf-8'));\n if (mcpJson.mcpServers) {\n for (const name of Object.keys(mcpJson.mcpServers)) {\n items.push({\n type: 'mcp',\n platform: 'cursor',\n name,\n contentHash: hashContent(JSON.stringify(mcpJson.mcpServers[name])),\n path: cursorMcpPath,\n });\n }\n }\n } catch { /* ignore */ }\n }\n\n return items;\n}\n\nexport interface ServerItem {\n id: string;\n type: string;\n platform: string;\n name: string;\n content_hash: string;\n content: Record<string, unknown>;\n}\n\nexport function compareState(\n serverItems: ServerItem[],\n localItems: LocalItem[]\n) {\n const installed: Array<{ server: ServerItem; local: LocalItem }> = [];\n const missing: ServerItem[] = [];\n const outdated: Array<{ server: ServerItem; local: LocalItem }> = [];\n const extra: LocalItem[] = [];\n\n const localMap = new Map<string, LocalItem>();\n for (const item of localItems) {\n localMap.set(`${item.type}:${item.platform}:${item.name}`, item);\n }\n\n for (const server of serverItems) {\n const key = `${server.type}:${server.platform}:${server.name}`;\n const local = localMap.get(key);\n localMap.delete(key);\n\n if (!local) {\n missing.push(server);\n } else if (local.contentHash !== server.content_hash) {\n outdated.push({ server, local });\n } else {\n installed.push({ server, local });\n }\n }\n\n for (const local of localMap.values()) {\n extra.push(local);\n }\n\n return { installed, missing, outdated, extra };\n}\n\nfunction hashFile(filePath: string): string {\n const content = fs.readFileSync(filePath);\n return crypto.createHash('sha256').update(content).digest('hex');\n}\n\nfunction hashContent(content: string): string {\n return crypto.createHash('sha256').update(JSON.stringify({ text: content })).digest('hex');\n}\n\nfunction getCursorConfigDir(): string {\n const home = os.homedir();\n if (process.platform === 'darwin') {\n return path.join(home, 'Library', 'Application Support', 'Cursor');\n }\n if (process.platform === 'win32') {\n return path.join(home, 'AppData', 'Roaming', 'Cursor');\n }\n return path.join(home, '.config', 'Cursor');\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { getStoredAuth } from '../auth/token-store.js';\nimport { collectFingerprint, computeFingerprintHash } from '../fingerprint/index.js';\nimport { apiStream } from '../api/client.js';\nimport { writeSetup } from '../writers/index.js';\nimport { readManifest } from '../writers/manifest.js';\nimport readline from 'readline';\nimport { trackEvent } from '../telemetry.js';\nimport { SpinnerMessages, GENERATION_MESSAGES } from '../utils/spinner-messages.js';\n\nexport async function updateCommand(options: { dryRun?: boolean }) {\n const auth = getStoredAuth();\n if (!auth) {\n console.log(chalk.red('Not logged in. Run `caliber login` first.'));\n throw new Error('__exit__');\n }\n\n const manifest = readManifest();\n if (!manifest) {\n console.log(chalk.yellow('No existing setup found. Run `caliber init` first.'));\n throw new Error('__exit__');\n }\n\n const spinner = ora('Re-analyzing project...').start();\n const fingerprint = collectFingerprint(process.cwd());\n spinner.succeed('Project re-analyzed');\n\n trackEvent('scan_completed', {\n languages: fingerprint.languages,\n frameworks: fingerprint.frameworks,\n has_existing_config: !!(fingerprint.existingConfigs.claudeMd || fingerprint.existingConfigs.cursorrules),\n has_claude_md: !!fingerprint.existingConfigs.claudeMd,\n has_claude_settings: !!fingerprint.existingConfigs.claudeSettings,\n has_cursorrules: !!fingerprint.existingConfigs.cursorrules,\n cursor_rules_count: fingerprint.existingConfigs.cursorRules?.length ?? 0,\n skills_count: fingerprint.existingConfigs.claudeSkills?.length ?? 0,\n file_count: fingerprint.fileTree.length,\n });\n\n let generatedSetup: Record<string, unknown> | null = null;\n\n trackEvent('generation_started', { target_agent: 'both' });\n\n const genSpinner = ora('Regenerating setup...').start();\n const genMessages = new SpinnerMessages(genSpinner, GENERATION_MESSAGES);\n genMessages.start();\n\n try {\n await apiStream(\n '/api/setups/generate',\n {\n fingerprint,\n targetAgent: 'both',\n },\n () => {},\n (payload) => { generatedSetup = payload.setup as Record<string, unknown>; },\n (error) => {\n genMessages.stop();\n trackEvent('error_occurred', { error_type: 'generation_failed', error_message: error, command: 'update' });\n genSpinner.fail(`Generation error: ${error}`);\n },\n (status) => { genMessages.handleServerStatus(status); }\n );\n } catch (err) {\n genMessages.stop();\n const msg = err instanceof Error ? err.message : 'Unknown error';\n trackEvent('error_occurred', { error_type: 'generation_request_failed', error_message: msg, command: 'update' });\n genSpinner.fail(`Regeneration failed: ${msg}`);\n throw new Error('__exit__');\n }\n\n genMessages.stop();\n\n if (!generatedSetup) {\n genSpinner.fail('Failed to regenerate setup.');\n throw new Error('__exit__');\n }\n\n genSpinner.succeed('Setup regenerated');\n\n if (options.dryRun) {\n console.log(chalk.yellow('\\n[Dry run] Would write:'));\n console.log(JSON.stringify(generatedSetup, null, 2));\n return;\n }\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const answer = await new Promise<string>((resolve) => {\n rl.question(chalk.cyan('\\n\\nApply updated setup? (y/n): '), resolve);\n });\n rl.close();\n\n if (answer.trim().toLowerCase() !== 'y') {\n trackEvent('update_declined');\n console.log(chalk.dim('Update cancelled.'));\n return;\n }\n\n const writeSpinner = ora('Updating config files...').start();\n const result = writeSetup(generatedSetup as Parameters<typeof writeSetup>[0]);\n writeSpinner.succeed('Config files updated');\n\n trackEvent('setup_updated', { files_written: result.written.length });\n\n for (const file of result.written) {\n console.log(` ${chalk.green('✓')} ${file}`);\n }\n console.log('');\n}\n\n","import chalk from 'chalk';\nimport { clearAuth, getStoredAuth } from '../auth/token-store.js';\nimport { trackEvent } from '../telemetry.js';\n\nexport function logoutCommand() {\n const auth = getStoredAuth();\n if (!auth) {\n console.log(chalk.dim('Not currently logged in.'));\n return;\n }\n\n clearAuth();\n trackEvent('logout');\n console.log(chalk.green('Logged out successfully.'));\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { apiRequest } from '../api/client.js';\nimport { getStoredAuth } from '../auth/token-store.js';\nimport { collectFingerprint, computeFingerprintHash } from '../fingerprint/index.js';\n\ninterface Recommendation {\n id: string;\n skill_name: string;\n skill_slug: string;\n score: number;\n reason: string;\n detected_technology: string;\n status: string;\n}\n\nexport async function recommendCommand(options: {\n generate?: boolean;\n status?: string;\n}) {\n const auth = getStoredAuth();\n if (!auth) {\n console.log(chalk.red('Not authenticated. Run `caliber login` first.'));\n throw new Error('__exit__');\n }\n\n const fingerprint = collectFingerprint(process.cwd());\n const hash = computeFingerprintHash(fingerprint);\n\n const match = await apiRequest<{ project: { id: string } | null }>(\n '/api/projects/match',\n { method: 'POST', body: { fingerprintHash: hash } }\n );\n\n if (!match?.project) {\n console.log(chalk.yellow('No project found. Run `caliber init` first.'));\n throw new Error('__exit__');\n }\n\n const projectId = match.project.id;\n\n if (options.generate) {\n const spinner = ora('Detecting technologies and searching for skills...').start();\n try {\n const recs = await apiRequest<Recommendation[]>(\n `/api/recommendations/project/${projectId}/generate`,\n { method: 'POST' }\n );\n spinner.succeed(`Found ${recs?.length || 0} recommendations`);\n\n if (recs?.length) {\n console.log('');\n printRecommendations(recs);\n }\n } catch (err) {\n spinner.fail('Failed to generate recommendations');\n throw err;\n }\n return;\n }\n\n const statusFilter = options.status || 'pending';\n const recs = await apiRequest<Recommendation[]>(\n `/api/recommendations/project/${projectId}?status=${statusFilter}`\n );\n\n if (!recs?.length) {\n console.log(chalk.dim(`\\nNo ${statusFilter} recommendations. Run \\`caliber recommend --generate\\` to discover skills.\\n`));\n return;\n }\n\n printRecommendations(recs);\n}\n\nfunction printRecommendations(recs: Recommendation[]) {\n console.log(chalk.bold('\\n Skill Recommendations\\n'));\n console.log(\n ` ${chalk.dim('Name'.padEnd(30))} ${chalk.dim('Score'.padEnd(8))} ${chalk.dim('Technology'.padEnd(15))} ${chalk.dim('Status')}`\n );\n console.log(chalk.dim(' ' + '─'.repeat(70)));\n\n for (const rec of recs) {\n const scoreColor = rec.score >= 90 ? chalk.green : rec.score >= 70 ? chalk.blue : chalk.yellow;\n console.log(\n ` ${rec.skill_name.padEnd(30)} ${scoreColor(`${rec.score}%`.padEnd(8))} ${rec.detected_technology.padEnd(15)} ${rec.status}`\n );\n if (rec.reason) {\n console.log(` ${chalk.dim(rec.reason)}`);\n }\n }\n console.log('');\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { apiRequest } from '../api/client.js';\nimport { getStoredAuth } from '../auth/token-store.js';\nimport { collectFingerprint, computeFingerprintHash } from '../fingerprint/index.js';\n\ninterface HealthReport {\n id: string;\n score: number;\n grade: string;\n category_breakdown: Record<string, { count: number; tokens: number }>;\n recommendations: Array<{\n priority: string;\n action: string;\n description: string;\n }>;\n fix_plan?: {\n actions: Array<{ type: string; items: string[] }>;\n estimatedScoreImprovement: number;\n };\n}\n\ninterface FixResult {\n scoreBefore: number;\n scoreAfter: number;\n improvement: number;\n itemsRemoved: number;\n itemsConsolidated: number;\n itemsAdded: number;\n}\n\nexport async function healthCommand(options: { fix?: boolean; json?: boolean }) {\n const auth = getStoredAuth();\n if (!auth) {\n console.log(chalk.red('Not authenticated. Run `caliber login` first.'));\n throw new Error('__exit__');\n }\n\n const fingerprint = collectFingerprint(process.cwd());\n const hash = computeFingerprintHash(fingerprint);\n\n const match = await apiRequest<{ project: { id: string } | null }>(\n '/api/projects/match',\n { method: 'POST', body: { fingerprintHash: hash } }\n );\n\n if (!match?.project) {\n console.log(chalk.yellow('No project found. Run `caliber init` first.'));\n throw new Error('__exit__');\n }\n\n const projectId = match.project.id;\n\n const spinner = ora('Analyzing context health...').start();\n let report: HealthReport;\n try {\n report = await apiRequest<HealthReport>(\n `/api/context/project/${projectId}/analyze`,\n { method: 'POST' }\n );\n spinner.succeed('Analysis complete');\n } catch (err) {\n spinner.fail('Analysis failed');\n throw err;\n }\n\n if (options.json) {\n console.log(JSON.stringify(report, null, 2));\n return;\n }\n\n printReport(report);\n\n if (options.fix) {\n console.log(chalk.bold('\\nGenerating fix plan...'));\n const plan = await apiRequest<HealthReport['fix_plan']>(\n `/api/context/reports/${report.id}/fix-plan`,\n { method: 'POST', body: { projectId } }\n );\n\n if (!plan?.actions.length) {\n console.log(chalk.dim('No fixes needed.'));\n return;\n }\n\n console.log(chalk.bold('\\nProposed actions:'));\n for (const action of plan.actions) {\n const icon = action.type === 'remove' ? chalk.red('- ') : action.type === 'add' ? chalk.green('+ ') : chalk.yellow('~ ');\n console.log(` ${icon}${action.type}: ${action.items.join(', ')}`);\n }\n console.log(chalk.dim(`\\nEstimated improvement: +${plan.estimatedScoreImprovement} points`));\n\n const fixSpinner = ora('Executing fix plan...').start();\n try {\n const result = await apiRequest<FixResult>(\n `/api/context/reports/${report.id}/fix-execute`,\n { method: 'POST', body: { projectId } }\n );\n fixSpinner.succeed('Fix applied');\n\n console.log('');\n console.log(` Score: ${result.scoreBefore} → ${chalk.green(String(result.scoreAfter))} (${chalk.green(`+${result.improvement}`)})`);\n if (result.itemsRemoved) console.log(` Removed: ${result.itemsRemoved} items`);\n if (result.itemsConsolidated) console.log(` Consolidated: ${result.itemsConsolidated} items`);\n if (result.itemsAdded) console.log(` Added: ${result.itemsAdded} items`);\n console.log('');\n } catch (err) {\n fixSpinner.fail('Fix execution failed');\n throw err;\n }\n }\n}\n\nfunction printReport(report: HealthReport) {\n const gradeColors: Record<string, typeof chalk.green> = {\n A: chalk.green,\n B: chalk.blue,\n C: chalk.yellow,\n D: chalk.hex('#FFA500'),\n F: chalk.red,\n };\n const gradeColor = gradeColors[report.grade] || chalk.white;\n\n console.log(chalk.bold('\\n Context Health Report\\n'));\n console.log(` Grade: ${gradeColor(report.grade)} Score: ${gradeColor(String(report.score))}/100\\n`);\n\n if (Object.keys(report.category_breakdown).length) {\n console.log(chalk.dim(' Category Breakdown:'));\n const categories = Object.entries(report.category_breakdown);\n const maxCount = Math.max(...categories.map(([, v]) => v.count));\n\n for (const [name, data] of categories) {\n const barLen = maxCount > 0 ? Math.round((data.count / maxCount) * 20) : 0;\n const bar = '█'.repeat(barLen) + '░'.repeat(20 - barLen);\n console.log(` ${name.padEnd(12)} ${bar} ${data.count} items (${data.tokens} tokens)`);\n }\n console.log('');\n }\n\n if (report.recommendations.length) {\n console.log(chalk.dim(' Recommendations:'));\n for (const rec of report.recommendations) {\n const icon = rec.priority === 'high' ? chalk.red('!') : rec.priority === 'medium' ? chalk.yellow('~') : chalk.dim('-');\n console.log(` ${icon} ${rec.description}`);\n }\n console.log('');\n }\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { apiRequest } from '../api/client.js';\nimport { getStoredAuth } from '../auth/token-store.js';\nimport { collectFingerprint, computeFingerprintHash } from '../fingerprint/index.js';\nimport { scanLocalState, compareState, type ServerItem } from '../scanner/index.js';\nimport { writeSetup } from '../writers/index.js';\n\nexport async function syncCommand(options: {\n platform?: string;\n dryRun?: boolean;\n}) {\n const auth = getStoredAuth();\n if (!auth) {\n console.log(chalk.red('Not authenticated. Run `caliber login` first.'));\n throw new Error('__exit__');\n }\n\n const fingerprint = collectFingerprint(process.cwd());\n const hash = computeFingerprintHash(fingerprint);\n\n const match = await apiRequest<{ project: { id: string } | null }>(\n '/api/projects/match',\n { method: 'POST', body: { fingerprintHash: hash } }\n );\n\n if (!match?.project) {\n console.log(chalk.yellow('No project found. Run `caliber init` first.'));\n throw new Error('__exit__');\n }\n\n const projectId = match.project.id;\n\n const spinner = ora('Scanning local state...').start();\n const localItems = scanLocalState(process.cwd());\n spinner.text = 'Fetching server items...';\n\n const serverItems = await apiRequest<ServerItem[]>(\n `/api/sync/project/${projectId}/items`\n );\n spinner.succeed(`Found ${localItems.length} local items, ${serverItems?.length || 0} server items`);\n\n if (!serverItems?.length) {\n console.log(chalk.dim('\\nNo items configured on server. Run `caliber init` to set up your project.\\n'));\n return;\n }\n\n const platformFilter = options.platform;\n const filteredServer = platformFilter\n ? serverItems.filter(i => i.platform === platformFilter || i.platform === 'both')\n : serverItems;\n const filteredLocal = platformFilter\n ? localItems.filter(i => i.platform === platformFilter)\n : localItems;\n\n const diff = compareState(filteredServer, filteredLocal);\n\n printDiff(diff);\n\n if (diff.missing.length === 0 && diff.outdated.length === 0) {\n console.log(chalk.green('\\nAll items synced.\\n'));\n await reportToServer(projectId, filteredServer, diff);\n return;\n }\n\n if (options.dryRun) {\n console.log(chalk.dim('\\nDry run — no changes made.\\n'));\n return;\n }\n\n const installSpinner = ora('Installing missing and outdated items...').start();\n try {\n const setup = buildSetupFromItems([...diff.missing, ...diff.outdated.map(o => o.server)]);\n if (setup) {\n writeSetup(setup);\n }\n installSpinner.succeed('Items synced successfully');\n } catch (err) {\n installSpinner.fail('Sync failed');\n throw err;\n }\n\n await reportToServer(projectId, filteredServer, diff);\n}\n\nasync function reportToServer(\n projectId: string,\n serverItems: ServerItem[],\n diff: ReturnType<typeof compareState>\n) {\n const items = [\n ...diff.installed.map(i => ({\n itemId: i.server.id,\n state: 'installed' as const,\n localHash: i.local.contentHash,\n })),\n ...diff.missing.map(i => ({\n itemId: i.id,\n state: 'missing' as const,\n })),\n ...diff.outdated.map(i => ({\n itemId: i.server.id,\n state: 'outdated' as const,\n localHash: i.local.contentHash,\n })),\n ...diff.extra.map(i => ({\n itemId: i.name,\n state: 'extra' as const,\n localHash: i.contentHash,\n })),\n ];\n\n const platforms = new Set(serverItems.map(i => i.platform));\n for (const platform of platforms) {\n try {\n await apiRequest(`/api/sync/project/${projectId}/report`, {\n method: 'POST',\n body: {\n platform,\n items: items.filter(i => {\n const match = serverItems.find(s => s.id === i.itemId);\n return match?.platform === platform;\n }),\n },\n });\n } catch {\n // non-critical\n }\n }\n}\n\nfunction printDiff(diff: ReturnType<typeof compareState>) {\n console.log(chalk.bold('\\n Sync Status\\n'));\n\n if (diff.installed.length) {\n console.log(` ${chalk.green('✓')} Installed: ${diff.installed.length}`);\n }\n if (diff.missing.length) {\n console.log(` ${chalk.red('✗')} Missing: ${diff.missing.length}`);\n for (const item of diff.missing) {\n console.log(` ${chalk.red('-')} ${item.name} (${item.type}/${item.platform})`);\n }\n }\n if (diff.outdated.length) {\n console.log(` ${chalk.yellow('~')} Outdated: ${diff.outdated.length}`);\n for (const item of diff.outdated) {\n console.log(` ${chalk.yellow('~')} ${item.server.name} (${item.server.type}/${item.server.platform})`);\n }\n }\n if (diff.extra.length) {\n console.log(` ${chalk.dim('+')} Extra (local only): ${diff.extra.length}`);\n for (const item of diff.extra) {\n console.log(` ${chalk.dim('+')} ${item.name} (${item.type}/${item.platform})`);\n }\n }\n console.log('');\n}\n\nfunction buildSetupFromItems(items: ServerItem[]): Parameters<typeof writeSetup>[0] | null {\n if (!items.length) return null;\n\n const claude: Record<string, unknown> = {};\n const cursor: Record<string, unknown> = {};\n let hasAny = false;\n\n for (const item of items) {\n const content = item.content as Record<string, unknown>;\n\n if (item.platform === 'claude' || item.platform === 'both') {\n if (item.type === 'rule' && item.name === 'CLAUDE.md') {\n claude.claudeMd = content.text;\n hasAny = true;\n } else if (item.type === 'config' && item.name === 'settings.json') {\n claude.settings = content;\n hasAny = true;\n } else if (item.type === 'skill') {\n if (!claude.skills) claude.skills = [];\n (claude.skills as Array<{ name: string; content: string }>).push({\n name: item.name,\n content: (content.text as string) || '',\n });\n hasAny = true;\n } else if (item.type === 'mcp') {\n if (!claude.mcpServers) claude.mcpServers = {};\n (claude.mcpServers as Record<string, unknown>)[item.name] = content;\n hasAny = true;\n }\n }\n\n if (item.platform === 'cursor' || item.platform === 'both') {\n if (item.type === 'rule' && item.name === '.cursorrules') {\n cursor.cursorrules = content.text;\n hasAny = true;\n } else if (item.type === 'rule') {\n if (!cursor.rules) cursor.rules = [];\n (cursor.rules as Array<{ filename: string; content: string }>).push({\n filename: item.name,\n content: (content.text as string) || '',\n });\n hasAny = true;\n } else if (item.type === 'mcp') {\n if (!cursor.mcpServers) cursor.mcpServers = {};\n (cursor.mcpServers as Record<string, unknown>)[item.name] = content;\n hasAny = true;\n }\n }\n }\n\n if (!hasAny) return null;\n\n const hasClaude = Object.keys(claude).length > 0;\n const hasCursor = Object.keys(cursor).length > 0;\n\n return {\n targetAgent: hasClaude && hasCursor ? 'both' : hasClaude ? 'claude' : 'cursor',\n ...(hasClaude ? { claude: claude as never } : {}),\n ...(hasCursor ? { cursor: cursor as never } : {}),\n };\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { apiRequest } from '../api/client.js';\nimport { getStoredAuth } from '../auth/token-store.js';\nimport { collectFingerprint, computeFingerprintHash } from '../fingerprint/index.js';\nimport { scanLocalState, compareState, type ServerItem } from '../scanner/index.js';\n\nexport async function diffCommand(options: { platform?: string }) {\n const auth = getStoredAuth();\n if (!auth) {\n console.log(chalk.red('Not authenticated. Run `caliber login` first.'));\n throw new Error('__exit__');\n }\n\n const fingerprint = collectFingerprint(process.cwd());\n const hash = computeFingerprintHash(fingerprint);\n\n const match = await apiRequest<{ project: { id: string } | null }>(\n '/api/projects/match',\n { method: 'POST', body: { fingerprintHash: hash } }\n );\n\n if (!match?.project) {\n console.log(chalk.yellow('No project found. Run `caliber init` first.'));\n throw new Error('__exit__');\n }\n\n const projectId = match.project.id;\n\n const spinner = ora('Comparing local and server state...').start();\n const localItems = scanLocalState(process.cwd());\n const serverItems = await apiRequest<ServerItem[]>(\n `/api/sync/project/${projectId}/items`\n );\n spinner.stop();\n\n if (!serverItems?.length) {\n console.log(chalk.dim('\\nNo items configured on server.\\n'));\n return;\n }\n\n const platformFilter = options.platform;\n const filteredServer = platformFilter\n ? serverItems.filter(i => i.platform === platformFilter || i.platform === 'both')\n : serverItems;\n const filteredLocal = platformFilter\n ? localItems.filter(i => i.platform === platformFilter)\n : localItems;\n\n const diff = compareState(filteredServer, filteredLocal);\n\n console.log(chalk.bold('\\n Config Diff\\n'));\n\n if (diff.installed.length) {\n console.log(` ${chalk.green('✓')} In sync: ${diff.installed.length}`);\n }\n if (diff.missing.length) {\n console.log(` ${chalk.red('✗')} Missing locally: ${diff.missing.length}`);\n for (const item of diff.missing) {\n console.log(` ${chalk.red('-')} ${item.name} (${item.type}/${item.platform})`);\n }\n }\n if (diff.outdated.length) {\n console.log(` ${chalk.yellow('~')} Outdated: ${diff.outdated.length}`);\n for (const item of diff.outdated) {\n console.log(` ${chalk.yellow('~')} ${item.server.name} (${item.server.type}/${item.server.platform})`);\n }\n }\n if (diff.extra.length) {\n console.log(` ${chalk.dim('+')} Local only: ${diff.extra.length}`);\n for (const item of diff.extra) {\n console.log(` ${chalk.dim('+')} ${item.name} (${item.type}/${item.platform})`);\n }\n }\n\n if (diff.missing.length === 0 && diff.outdated.length === 0) {\n console.log(chalk.green('\\n Everything is in sync.\\n'));\n } else {\n console.log(chalk.dim('\\n Run `caliber sync` to apply changes.\\n'));\n }\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { getStoredAuth } from '../auth/token-store.js';\nimport { apiRequest } from '../api/client.js';\nimport { isGitRepo } from '../fingerprint/git.js';\nimport { readExistingConfigs } from '../fingerprint/existing-config.js';\nimport { collectDiff } from '../lib/git-diff.js';\nimport { readState, writeState, getCurrentHeadSha } from '../lib/state.js';\nimport { writeRefreshDocs } from '../writers/refresh.js';\nimport { collectFingerprint } from '../fingerprint/index.js';\nimport { trackEvent } from '../telemetry.js';\n\ninterface RefreshOptions {\n quiet?: boolean;\n dryRun?: boolean;\n}\n\ninterface RefreshResponse {\n updatedDocs: {\n claudeMd?: string | null;\n readmeMd?: string | null;\n cursorrules?: string | null;\n cursorRules?: Array<{ filename: string; content: string }> | null;\n claudeSkills?: Array<{ filename: string; content: string }> | null;\n };\n changesSummary: string;\n docsUpdated: string[];\n}\n\nfunction log(quiet: boolean, ...args: unknown[]) {\n if (!quiet) console.log(...args);\n}\n\nexport async function refreshCommand(options: RefreshOptions) {\n const quiet = !!options.quiet;\n\n try {\n const auth = getStoredAuth();\n if (!auth) {\n if (quiet) return;\n console.log(chalk.red('Not authenticated. Run `caliber login` first.'));\n throw new Error('__exit__');\n }\n\n if (!isGitRepo()) {\n if (quiet) return;\n console.log(chalk.red('Not inside a git repository.'));\n throw new Error('__exit__');\n }\n\n const state = readState();\n const lastSha = state?.lastRefreshSha ?? null;\n\n const diff = collectDiff(lastSha);\n const currentSha = getCurrentHeadSha();\n\n if (!diff.hasChanges) {\n if (currentSha) {\n writeState({ lastRefreshSha: currentSha, lastRefreshTimestamp: new Date().toISOString() });\n }\n log(quiet, chalk.dim('No changes since last refresh.'));\n return;\n }\n\n const spinner = quiet ? null : ora('Analyzing changes...').start();\n\n const existingDocs = readExistingConfigs(process.cwd());\n\n const fingerprint = collectFingerprint(process.cwd());\n const projectContext = {\n languages: fingerprint.languages,\n frameworks: fingerprint.frameworks,\n packageName: fingerprint.packageName,\n };\n\n const response = await apiRequest<RefreshResponse>('/api/setups/refresh', {\n method: 'POST',\n body: {\n diff: {\n committed: diff.committedDiff,\n staged: diff.stagedDiff,\n unstaged: diff.unstagedDiff,\n changedFiles: diff.changedFiles,\n summary: diff.summary,\n },\n existingDocs,\n projectContext,\n },\n });\n\n if (!response.docsUpdated || response.docsUpdated.length === 0) {\n spinner?.succeed('No doc updates needed');\n if (currentSha) {\n writeState({ lastRefreshSha: currentSha, lastRefreshTimestamp: new Date().toISOString() });\n }\n return;\n }\n\n if (options.dryRun) {\n spinner?.info('Dry run — would update:');\n for (const doc of response.docsUpdated) {\n console.log(` ${chalk.yellow('~')} ${doc}`);\n }\n if (response.changesSummary) {\n console.log(chalk.dim(`\\n ${response.changesSummary}`));\n }\n return;\n }\n\n const written = writeRefreshDocs(response.updatedDocs);\n spinner?.succeed(`Updated ${written.length} doc${written.length === 1 ? '' : 's'}`);\n\n for (const file of written) {\n log(quiet, ` ${chalk.green('✓')} ${file}`);\n }\n\n if (response.changesSummary) {\n log(quiet, chalk.dim(`\\n ${response.changesSummary}`));\n }\n\n if (currentSha) {\n writeState({ lastRefreshSha: currentSha, lastRefreshTimestamp: new Date().toISOString() });\n }\n\n trackEvent('refresh_completed', {\n docs_updated: written.length,\n changed_files: diff.changedFiles.length,\n });\n } catch (err) {\n if (err instanceof Error && err.message === '__exit__') throw err;\n if (quiet) return;\n const msg = err instanceof Error ? err.message : 'Unknown error';\n console.log(chalk.red(`Refresh failed: ${msg}`));\n throw new Error('__exit__');\n }\n}\n","import { execSync } from 'child_process';\n\nconst MAX_DIFF_BYTES = 100_000;\n\nconst DOC_PATTERNS = [\n 'CLAUDE.md',\n 'README.md',\n '.cursorrules',\n '.cursor/rules/',\n '.claude/skills/',\n];\n\nfunction excludeArgs(): string[] {\n return DOC_PATTERNS.flatMap(p => ['--', `:!${p}`]);\n}\n\nfunction safeExec(cmd: string): string {\n try {\n return execSync(cmd, {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n maxBuffer: 10 * 1024 * 1024,\n }).trim();\n } catch {\n return '';\n }\n}\n\nexport interface DiffResult {\n hasChanges: boolean;\n committedDiff: string;\n stagedDiff: string;\n unstagedDiff: string;\n changedFiles: string[];\n summary: string;\n}\n\nexport function collectDiff(lastSha: string | null): DiffResult {\n let committedDiff = '';\n let stagedDiff = '';\n let unstagedDiff = '';\n let changedFiles: string[] = [];\n\n if (lastSha) {\n committedDiff = safeExec(`git diff ${lastSha}..HEAD ${excludeArgs().join(' ')}`);\n const committedFiles = safeExec(`git diff --name-only ${lastSha}..HEAD`);\n if (committedFiles) {\n changedFiles.push(...committedFiles.split('\\n').filter(Boolean));\n }\n } else {\n committedDiff = safeExec('git log --oneline -20');\n }\n\n stagedDiff = safeExec(`git diff --cached ${excludeArgs().join(' ')}`);\n unstagedDiff = safeExec(`git diff ${excludeArgs().join(' ')}`);\n\n const stagedFiles = safeExec('git diff --cached --name-only');\n if (stagedFiles) {\n changedFiles.push(...stagedFiles.split('\\n').filter(Boolean));\n }\n const unstagedFiles = safeExec('git diff --name-only');\n if (unstagedFiles) {\n changedFiles.push(...unstagedFiles.split('\\n').filter(Boolean));\n }\n\n const untrackedFiles = safeExec('git ls-files --others --exclude-standard');\n if (untrackedFiles) {\n changedFiles.push(...untrackedFiles.split('\\n').filter(Boolean));\n }\n\n changedFiles = [...new Set(changedFiles)].filter(\n f => !DOC_PATTERNS.some(p => f === p || f.startsWith(p))\n );\n\n const totalSize = committedDiff.length + stagedDiff.length + unstagedDiff.length;\n if (totalSize > MAX_DIFF_BYTES) {\n const ratio = MAX_DIFF_BYTES / totalSize;\n committedDiff = committedDiff.slice(0, Math.floor(committedDiff.length * ratio));\n stagedDiff = stagedDiff.slice(0, Math.floor(stagedDiff.length * ratio));\n unstagedDiff = unstagedDiff.slice(0, Math.floor(unstagedDiff.length * ratio));\n }\n\n const hasChanges = !!(committedDiff || stagedDiff || unstagedDiff || changedFiles.length);\n\n const parts: string[] = [];\n if (changedFiles.length) parts.push(`${changedFiles.length} files changed`);\n if (committedDiff) parts.push('committed changes');\n if (stagedDiff) parts.push('staged changes');\n if (unstagedDiff) parts.push('unstaged changes');\n const summary = parts.join(', ') || 'no changes';\n\n return { hasChanges, committedDiff, stagedDiff, unstagedDiff, changedFiles, summary };\n}\n","import fs from 'fs';\nimport path from 'path';\n\ninterface RefreshDocs {\n claudeMd?: string | null;\n readmeMd?: string | null;\n cursorrules?: string | null;\n cursorRules?: Array<{ filename: string; content: string }> | null;\n claudeSkills?: Array<{ filename: string; content: string }> | null;\n}\n\nexport function writeRefreshDocs(docs: RefreshDocs): string[] {\n const written: string[] = [];\n\n if (docs.claudeMd) {\n fs.writeFileSync('CLAUDE.md', docs.claudeMd);\n written.push('CLAUDE.md');\n }\n\n if (docs.readmeMd) {\n fs.writeFileSync('README.md', docs.readmeMd);\n written.push('README.md');\n }\n\n if (docs.cursorrules) {\n fs.writeFileSync('.cursorrules', docs.cursorrules);\n written.push('.cursorrules');\n }\n\n if (docs.cursorRules) {\n const rulesDir = path.join('.cursor', 'rules');\n if (!fs.existsSync(rulesDir)) fs.mkdirSync(rulesDir, { recursive: true });\n for (const rule of docs.cursorRules) {\n const filePath = path.join(rulesDir, rule.filename);\n fs.writeFileSync(filePath, rule.content);\n written.push(filePath);\n }\n }\n\n if (docs.claudeSkills) {\n const skillsDir = path.join('.claude', 'skills');\n if (!fs.existsSync(skillsDir)) fs.mkdirSync(skillsDir, { recursive: true });\n for (const skill of docs.claudeSkills) {\n const filePath = path.join(skillsDir, skill.filename);\n fs.writeFileSync(filePath, skill.content);\n written.push(filePath);\n }\n }\n\n return written;\n}\n","import chalk from 'chalk';\nimport { isHookInstalled, installHook, removeHook } from '../lib/hooks.js';\n\nexport async function hooksInstallCommand() {\n const result = installHook();\n if (result.alreadyInstalled) {\n console.log(chalk.dim('Hook already installed.'));\n return;\n }\n console.log(chalk.green('✓') + ' SessionEnd hook installed in .claude/settings.json');\n console.log(chalk.dim(' Docs will auto-refresh when Claude Code sessions end.'));\n}\n\nexport async function hooksRemoveCommand() {\n const result = removeHook();\n if (result.notFound) {\n console.log(chalk.dim('Hook not found.'));\n return;\n }\n console.log(chalk.green('✓') + ' SessionEnd hook removed from .claude/settings.json');\n}\n\nexport async function hooksStatusCommand() {\n const installed = isHookInstalled();\n if (installed) {\n console.log(chalk.green('✓') + ' Auto-refresh hook is ' + chalk.green('installed'));\n } else {\n console.log(chalk.dim('✗') + ' Auto-refresh hook is ' + chalk.yellow('not installed'));\n console.log(chalk.dim(' Run `caliber hooks install` to enable auto-refresh on session end.'));\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport readline from 'readline';\nimport { execSync } from 'child_process';\nimport chalk from 'chalk';\nimport ora from 'ora';\n\nconst __dirname_vc = path.dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(\n fs.readFileSync(path.resolve(__dirname_vc, '..', 'package.json'), 'utf-8')\n);\n\nfunction promptYesNo(question: string): Promise<boolean> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(chalk.cyan(`${question} `), (answer) => {\n rl.close();\n const normalized = answer.trim().toLowerCase();\n resolve(normalized === '' || normalized === 'y' || normalized === 'yes');\n });\n });\n}\n\nexport async function checkForUpdates(): Promise<void> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 2000);\n\n const res = await fetch('https://registry.npmjs.org/@caliber-ai/cli/latest', {\n signal: controller.signal,\n });\n clearTimeout(timeout);\n\n if (!res.ok) return;\n\n const data = (await res.json()) as { version?: string };\n const latest = data.version;\n if (!latest) return;\n\n const current = pkg.version as string;\n if (current === latest) return;\n\n const isInteractive = process.stdin.isTTY === true;\n\n if (!isInteractive) {\n console.log(\n chalk.yellow(\n `\\nUpdate available: ${current} -> ${latest}\\nRun ${chalk.bold('npm install -g @caliber-ai/cli')} to upgrade.\\n`\n )\n );\n return;\n }\n\n console.log(\n chalk.yellow(`\\nUpdate available: ${current} -> ${latest}`)\n );\n\n const shouldUpdate = await promptYesNo('Would you like to update now? (Y/n)');\n if (!shouldUpdate) {\n console.log();\n return;\n }\n\n const spinner = ora('Updating @caliber-ai/cli...').start();\n try {\n execSync('npm install -g @caliber-ai/cli --force', { stdio: 'pipe' });\n spinner.succeed(chalk.green(`Updated to ${latest}`));\n\n // Re-exec the original command with the new version\n const args = process.argv.slice(2);\n console.log(chalk.dim(`\\nRestarting: caliber ${args.join(' ')}\\n`));\n execSync(`caliber ${args.map((a) => JSON.stringify(a)).join(' ')}`, {\n stdio: 'inherit',\n });\n process.exit(0);\n } catch {\n spinner.fail('Update failed');\n console.log(\n chalk.yellow(\n `Run ${chalk.bold('npm install -g @caliber-ai/cli')} manually to upgrade.\\n`\n )\n );\n }\n } catch {\n // Silently ignore — offline, timeout, registry down, etc.\n }\n}\n","import { Sentry } from './lib/sentry.js';\nimport { program } from './cli.js';\nimport { getStoredAuth } from './auth/token-store.js';\nimport { isFirstRun, getDeviceId, trackEvent, identifyUser, shutdownTelemetry } from './telemetry.js';\nimport { checkForUpdates } from './utils/version-check.js';\n\nconst firstRun = isFirstRun();\ngetDeviceId();\nif (firstRun) {\n trackEvent('cli_installed');\n}\n\nconst auth = getStoredAuth();\nif (auth) {\n identifyUser(auth.userId, auth.email);\n Sentry.setUser({ id: auth.userId, email: auth.email });\n}\n\nawait checkForUpdates();\n\nasync function gracefulExit(code: number) {\n await Promise.all([\n shutdownTelemetry(),\n Sentry.flush(2000),\n ]);\n process.exit(code);\n}\n\nprocess.on('SIGINT', () => gracefulExit(130));\nprocess.on('SIGTERM', () => gracefulExit(143));\n\nprogram.parseAsync()\n .catch((err) => {\n const msg = err instanceof Error ? err.message : 'Unexpected error';\n if (msg !== '__exit__') {\n console.error(msg);\n Sentry.captureException(err, { tags: { command: process.argv[2] || 'unknown' } });\n }\n trackEvent('error_occurred', { error_type: 'cli_crash', error_message: msg, command: process.argv[2] || 'unknown' });\n process.exitCode = 1;\n })\n .finally(() => gracefulExit(Number(process.exitCode ?? 0)));\n"],"mappings":"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","names":["path","os","fs","path","fileURLToPath","chalk","ora","fs","fs","auth","resolve","fs","path","os","fileURLToPath","path","fs","auth","fileURLToPath","pkg","os","resolve","crypto","fs","path","pkg","fs","path","path","fs","path","fs","path","IGNORE_DIRS","crypto","auth","path","fs","fs","path","fs","path","fs","path","fs","crypto","fs","MANIFEST_FILE","fs","path","fs","path","execSync","chalk","auth","ora","resolve","fs","chalk","ora","ora","chalk","chalk","fs","fs","path","crypto","path","fs","crypto","auth","chalk","fs","chalk","ora","readline","auth","chalk","ora","readline","resolve","chalk","auth","chalk","chalk","ora","auth","chalk","ora","recs","chalk","ora","auth","chalk","ora","chalk","ora","auth","chalk","ora","chalk","ora","auth","chalk","ora","chalk","ora","execSync","fs","path","auth","chalk","ora","chalk","chalk","__dirname","path","fileURLToPath","pkg","fs","fs","path","fileURLToPath","readline","execSync","chalk","ora","pkg","resolve"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/lib/sentry.ts","../src/cli.ts","../src/commands/init.ts","../src/auth/token-store.ts","../src/commands/login.ts","../src/auth/pkce.ts","../src/auth/callback-server.ts","../src/telemetry.ts","../src/fingerprint/index.ts","../src/fingerprint/git.ts","../src/fingerprint/package-json.ts","../src/fingerprint/file-tree.ts","../src/fingerprint/languages.ts","../src/fingerprint/existing-config.ts","../src/fingerprint/code-analysis.ts","../src/api/client.ts","../src/writers/index.ts","../src/writers/claude/index.ts","../src/writers/cursor/index.ts","../src/writers/backup.ts","../src/writers/manifest.ts","../src/lib/hooks.ts","../src/lib/state.ts","../src/utils/spinner-messages.ts","../src/commands/undo.ts","../src/commands/status.ts","../src/scanner/index.ts","../src/commands/update.ts","../src/commands/logout.ts","../src/commands/recommend.ts","../src/commands/health.ts","../src/commands/sync.ts","../src/commands/diff.ts","../src/commands/refresh.ts","../src/lib/git-diff.ts","../src/writers/refresh.ts","../src/commands/hooks.ts","../src/utils/version-check.ts","../src/bin.ts"],"sourcesContent":["import path from 'path';\nimport os from 'os';\n\nexport const API_URL = process.env.CALIBER_API_URL || 'https://caliber-backend.up.railway.app';\nexport const FRONTEND_URL = process.env.CALIBER_FRONTEND_URL || 'https://caliber-app.up.railway.app';\nexport const CLI_CALLBACK_PORT = 19284;\nexport const AUTH_DIR = path.join(os.homedir(), '.caliber');\nexport const AUTH_FILE = path.join(AUTH_DIR, 'auth.json');\nexport const CALIBER_DIR = '.caliber';\nexport const MANIFEST_FILE = path.join(CALIBER_DIR, 'manifest.json');\nexport const BACKUPS_DIR = path.join(CALIBER_DIR, 'backups');\n","import * as Sentry from '@sentry/node';\nimport os from 'os';\nimport fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nconst dsn = process.env.CALIBER_SENTRY_DSN || 'https://e988132485fced78d7d60202f97942b3@o4510975175622656.ingest.us.sentry.io/4510975226347520';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(\n fs.readFileSync(path.resolve(__dirname, '..', 'package.json'), 'utf-8')\n);\n\nif (dsn) {\n Sentry.init({\n dsn,\n release: `caliber-cli@${pkg.version}`,\n environment: process.env.NODE_ENV || 'production',\n tracesSampleRate: 0,\n beforeSend(event) {\n event.tags = { ...event.tags, source: 'cli', os: os.platform() };\n return event;\n },\n });\n}\n\nexport { Sentry };\n","import { Command } from 'commander';\nimport fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { initCommand } from './commands/init.js';\nimport { undoCommand } from './commands/undo.js';\nimport { statusCommand } from './commands/status.js';\nimport { updateCommand } from './commands/update.js';\nimport { loginCommand } from './commands/login.js';\nimport { logoutCommand } from './commands/logout.js';\nimport { recommendCommand } from './commands/recommend.js';\nimport { healthCommand } from './commands/health.js';\nimport { syncCommand } from './commands/sync.js';\nimport { diffCommand } from './commands/diff.js';\nimport { refreshCommand } from './commands/refresh.js';\nimport { hooksInstallCommand, hooksRemoveCommand, hooksStatusCommand } from './commands/hooks.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(\n fs.readFileSync(path.resolve(__dirname, '..', 'package.json'), 'utf-8')\n);\n\nconst program = new Command();\n\nprogram\n .name('caliber')\n .description('Configure your coding agent environment')\n .version(pkg.version);\n\nprogram\n .command('init')\n .description('Initialize coding agent setup for this project')\n .option('--agent <type>', 'Target agent: claude, cursor, or both')\n .option('--dry-run', 'Preview changes without writing files')\n .option('--force', 'Overwrite existing setup without prompting')\n .action(initCommand);\n\nprogram\n .command('undo')\n .description('Revert all config changes made by Caliber')\n .action(undoCommand);\n\nprogram\n .command('status')\n .description('Show current Caliber setup status')\n .option('--json', 'Output as JSON')\n .action(statusCommand);\n\nprogram\n .command('update')\n .description('Re-analyze project and update setup')\n .option('--dry-run', 'Preview changes without writing files')\n .action(updateCommand);\n\nprogram\n .command('login')\n .description('Authenticate with Caliber')\n .action(loginCommand);\n\nprogram\n .command('logout')\n .description('Clear stored credentials')\n .action(logoutCommand);\n\nprogram\n .command('recommend')\n .description('Discover and manage skill recommendations')\n .option('--generate', 'Generate new recommendations')\n .option('--status <status>', 'Filter by status: pending, accepted, dismissed')\n .action(recommendCommand);\n\nprogram\n .command('health')\n .description('Analyze context health and quality')\n .option('--fix', 'Generate and execute a fix plan')\n .option('--json', 'Output as JSON')\n .action(healthCommand);\n\nprogram\n .command('sync')\n .description('Sync local config with server state')\n .option('--platform <platform>', 'Target platform: claude, cursor, or both')\n .option('--dry-run', 'Preview changes without writing files')\n .action(syncCommand);\n\nprogram\n .command('diff')\n .description('Compare local config with server state')\n .option('--platform <platform>', 'Target platform: claude, cursor, or both')\n .action(diffCommand);\n\nprogram\n .command('refresh')\n .description('Update docs based on recent code changes')\n .option('--quiet', 'Suppress output (for use in hooks)')\n .option('--dry-run', 'Preview changes without writing files')\n .action(refreshCommand);\n\nconst hooks = program\n .command('hooks')\n .description('Manage Claude Code session hooks');\n\nhooks\n .command('install')\n .description('Install auto-refresh SessionEnd hook')\n .action(hooksInstallCommand);\n\nhooks\n .command('remove')\n .description('Remove auto-refresh SessionEnd hook')\n .action(hooksRemoveCommand);\n\nhooks\n .command('status')\n .description('Check if auto-refresh hook is installed')\n .action(hooksStatusCommand);\n\nexport { program };\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport readline from 'readline';\nimport fs from 'fs';\nimport { getStoredAuth } from '../auth/token-store.js';\nimport { loginCommand } from './login.js';\nimport { collectFingerprint, computeFingerprintHash } from '../fingerprint/index.js';\nimport { apiRequest, apiStream } from '../api/client.js';\nimport { writeSetup } from '../writers/index.js';\nimport { trackEvent } from '../telemetry.js';\nimport { installHook } from '../lib/hooks.js';\nimport { writeState, getCurrentHeadSha } from '../lib/state.js';\nimport { SpinnerMessages, GENERATION_MESSAGES, REFINE_MESSAGES } from '../utils/spinner-messages.js';\n\ntype TargetAgent = 'claude' | 'cursor' | 'both';\n\ninterface InitOptions {\n agent?: TargetAgent;\n dryRun?: boolean;\n force?: boolean;\n}\n\nexport async function initCommand(options: InitOptions) {\n // Banner\n console.log(chalk.bold.hex('#6366f1')(`\n ██████╗ █████╗ ██╗ ██╗██████╗ ███████╗██████╗\n ██╔════╝██╔══██╗██║ ██║██╔══██╗██╔════╝██╔══██╗\n ██║ ███████║██║ ██║██████╔╝█████╗ ██████╔╝\n ██║ ██╔══██║██║ ██║██╔══██╗██╔══╝ ██╔══██╗\n ╚██████╗██║ ██║███████╗██║██████╔╝███████╗██║ ██║\n ╚═════╝╚═╝ ╚═╝╚══════╝╚═╝╚═════╝ ╚══════╝╚═╝ ╚═╝\n `));\n console.log(chalk.dim(' Configure your coding agent environment\\n'));\n\n console.log(chalk.bold(' What is Caliber?\\n'));\n console.log(chalk.dim(' Caliber analyzes your project and generates optimized configurations'));\n console.log(chalk.dim(' for AI coding agents (Claude Code, Cursor). It creates CLAUDE.md,'));\n console.log(chalk.dim(' .cursorrules, skills, permissions, and MCP servers tailored to your'));\n console.log(chalk.dim(' codebase — so your AI agent understands your project from day one.\\n'));\n\n console.log(chalk.bold(' How it works:\\n'));\n console.log(chalk.dim(' 1. Scan Analyze your code, dependencies, and file structure'));\n console.log(chalk.dim(' 2. Match Check if a teammate already configured this project'));\n console.log(chalk.dim(' 3. Generate AI creates config files tailored to your project'));\n console.log(chalk.dim(' 4. Review You accept, refine, or decline the generated setup'));\n console.log(chalk.dim(' 5. Apply Config files are written to your project'));\n console.log(chalk.dim(' 6. Sync Setup is saved so teammates get the same config\\n'));\n\n // Step 1: Auth check\n console.log(chalk.hex('#6366f1').bold(' Step 1/6 — Authenticate\\n'));\n let auth = getStoredAuth();\n if (!auth) {\n console.log(chalk.yellow('Not logged in. Starting authentication...\\n'));\n await loginCommand();\n auth = getStoredAuth();\n if (!auth) {\n console.log(chalk.red('Authentication required. Exiting.'));\n throw new Error('__exit__');\n }\n }\n console.log(chalk.dim(`Authenticated as ${auth.email}\\n`));\n\n // Step 2: Collect fingerprint\n console.log(chalk.hex('#6366f1').bold(' Step 2/6 — Scan project\\n'));\n console.log(chalk.dim(' Detecting languages, frameworks, file structure, and existing configs.\\n'));\n const spinner = ora('Analyzing project...').start();\n const fingerprint = collectFingerprint(process.cwd());\n const hash = computeFingerprintHash(fingerprint);\n spinner.succeed('Project analyzed');\n\n trackEvent('scan_completed', {\n languages: fingerprint.languages,\n frameworks: fingerprint.frameworks,\n has_existing_config: !!(fingerprint.existingConfigs.claudeMd || fingerprint.existingConfigs.cursorrules),\n has_claude_md: !!fingerprint.existingConfigs.claudeMd,\n has_claude_settings: !!fingerprint.existingConfigs.claudeSettings,\n has_cursorrules: !!fingerprint.existingConfigs.cursorrules,\n cursor_rules_count: fingerprint.existingConfigs.cursorRules?.length ?? 0,\n skills_count: fingerprint.existingConfigs.claudeSkills?.length ?? 0,\n file_count: fingerprint.fileTree.length,\n });\n\n console.log(chalk.dim(` Languages: ${fingerprint.languages.join(', ') || 'none detected'}`));\n console.log(chalk.dim(` Frameworks: ${fingerprint.frameworks.join(', ') || 'none detected'}`));\n console.log(chalk.dim(` Files: ${fingerprint.fileTree.length} found\\n`));\n\n // Step 3: Check for existing project\n console.log(chalk.hex('#6366f1').bold(' Step 3/6 — Match project\\n'));\n console.log(chalk.dim(' Checking if a teammate already set up Caliber for this repo.\\n'));\n const matchSpinner = ora('Checking for existing setup...').start();\n let existingSetup = null;\n let existingProjectId: string | null = null;\n try {\n const match = await apiRequest<{ project: { id: string } | null; setup: unknown }>('/api/projects/match', {\n method: 'POST',\n body: { fingerprintHash: hash },\n });\n if (match.project) {\n existingProjectId = match.project.id;\n }\n if (match.setup) {\n existingSetup = match.setup;\n trackEvent('existing_config_detected', {\n has_claude_md: !!fingerprint.existingConfigs.claudeMd,\n has_cursorrules: !!fingerprint.existingConfigs.cursorrules,\n has_cursor_rules: (fingerprint.existingConfigs.cursorRules?.length ?? 0) > 0,\n has_skills: (fingerprint.existingConfigs.claudeSkills?.length ?? 0) > 0,\n });\n matchSpinner.succeed('Found existing setup');\n } else {\n matchSpinner.info('No existing setup found');\n }\n } catch {\n matchSpinner.info('No existing setup found');\n }\n\n // Step 4: Determine target agent\n const targetAgent = options.agent || await promptAgent();\n trackEvent('target_agent_selected', { target_agent: targetAgent });\n\n // Step 5: Get project description if empty directory\n const isEmpty = fingerprint.fileTree.length < 3;\n if (isEmpty) {\n fingerprint.description = await promptInput('What will you build in this project?');\n }\n\n // Step 6: Generate setup via AI\n console.log(chalk.hex('#6366f1').bold(' Step 4/6 — Generate config\\n'));\n console.log(chalk.dim(' AI is building CLAUDE.md, permissions, skills, and rules based on'));\n console.log(chalk.dim(' your project\\'s stack and conventions.\\n'));\n let generatedSetup: Record<string, unknown> | null = null;\n let setupExplanation: string | undefined;\n let rawOutput: string | undefined;\n\n trackEvent('generation_started', { target_agent: targetAgent });\n\n const genSpinner = ora('Generating setup...').start();\n const genMessages = new SpinnerMessages(genSpinner, GENERATION_MESSAGES);\n genMessages.start();\n\n try {\n await apiStream(\n '/api/setups/generate',\n {\n fingerprint,\n targetAgent,\n prompt: fingerprint.description,\n },\n () => {},\n (payload) => {\n generatedSetup = payload.setup as Record<string, unknown>;\n setupExplanation = payload.explanation;\n rawOutput = payload.raw;\n },\n (error) => {\n genMessages.stop();\n trackEvent('error_occurred', { error_type: 'generation_failed', error_message: error, command: 'init' });\n genSpinner.fail(`Generation error: ${error}`);\n },\n (status) => { genMessages.handleServerStatus(status); }\n );\n } catch (err) {\n genMessages.stop();\n const msg = err instanceof Error ? err.message : 'Unknown error';\n trackEvent('error_occurred', { error_type: 'generation_request_failed', error_message: msg, command: 'init' });\n genSpinner.fail(`Generation failed: ${msg}`);\n throw new Error('__exit__');\n }\n\n genMessages.stop();\n\n if (!generatedSetup) {\n genSpinner.fail('Failed to generate setup.');\n if (rawOutput) {\n console.log(chalk.dim('\\nRaw LLM output (JSON parse failed):'));\n console.log(chalk.dim(rawOutput.slice(0, 500)));\n }\n throw new Error('__exit__');\n }\n\n genSpinner.succeed('Setup generated');\n printSetupSummary(generatedSetup);\n\n // Step 7: Accept / Refine / Explain / Decline\n console.log(chalk.hex('#6366f1').bold(' Step 5/6 — Review\\n'));\n console.log(chalk.dim(' Review the proposed files below. You can accept, refine via chat,'));\n console.log(chalk.dim(' or see an explanation of why each item was recommended.\\n'));\n let explained = false;\n let action = await promptAction(explained);\n\n while (action === 'explain') {\n if (setupExplanation) {\n printExplanation(setupExplanation);\n } else {\n console.log(chalk.dim('\\nNo explanation available for this setup.\\n'));\n }\n explained = true;\n action = await promptAction(explained);\n }\n\n if (action === 'decline') {\n trackEvent('setup_declined');\n console.log(chalk.dim('Setup declined. No files were modified.'));\n return;\n }\n\n if (action === 'refine') {\n generatedSetup = await refineLoop(generatedSetup, targetAgent);\n if (!generatedSetup) {\n trackEvent('refinement_cancelled');\n console.log(chalk.dim('Refinement cancelled. No files were modified.'));\n return;\n }\n }\n\n // Step 8: Write files\n console.log(chalk.hex('#6366f1').bold(' Step 6/6 — Apply & sync\\n'));\n console.log(chalk.dim(' Writing config files to your project and syncing to Caliber so'));\n console.log(chalk.dim(' teammates get the same setup when they run `caliber init`.\\n'));\n if (options.dryRun) {\n console.log(chalk.yellow('\\n[Dry run] Would write the following files:'));\n console.log(JSON.stringify(generatedSetup, null, 2));\n return;\n }\n\n const writeSpinner = ora('Writing config files...').start();\n try {\n const result = writeSetup(generatedSetup as Parameters<typeof writeSetup>[0]);\n writeSpinner.succeed('Config files written');\n\n trackEvent('setup_applied', { files_written: result.written.length, target_agent: targetAgent });\n\n console.log(chalk.bold('\\nFiles created/updated:'));\n for (const file of result.written) {\n console.log(` ${chalk.green('✓')} ${file}`);\n }\n if (result.backupDir) {\n console.log(chalk.dim(`\\n Backups saved to ${result.backupDir}`));\n }\n } catch (err) {\n writeSpinner.fail('Failed to write files');\n console.error(chalk.red(err instanceof Error ? err.message : 'Unknown error'));\n throw new Error('__exit__');\n }\n\n // Step 8.5: Offer to install auto-refresh hook\n const hookAnswer = await promptInput(chalk.cyan('Enable auto-refresh on Claude Code session end? (Y/n):'));\n if (!hookAnswer || hookAnswer.toLowerCase() !== 'n') {\n const hookResult = installHook();\n if (hookResult.installed) {\n console.log(` ${chalk.green('✓')} Auto-refresh hook installed`);\n const sha = getCurrentHeadSha();\n if (sha) {\n writeState({ lastRefreshSha: sha, lastRefreshTimestamp: new Date().toISOString() });\n }\n } else if (hookResult.alreadyInstalled) {\n console.log(chalk.dim(' Auto-refresh hook already installed'));\n }\n } else {\n console.log(chalk.dim(' Skipped. Run `caliber hooks install` later to enable.'));\n }\n\n // Step 9: Save to server\n try {\n let projectId = existingProjectId;\n\n if (!projectId) {\n const project = await apiRequest<{ id: string }>('/api/projects', {\n method: 'POST',\n body: {\n fingerprintHash: hash,\n name: fingerprint.packageName || 'untitled',\n gitRemoteUrl: fingerprint.gitRemoteUrl,\n description: fingerprint.description,\n },\n });\n projectId = project.id;\n }\n\n await apiRequest(`/api/setups/project/${projectId}`, {\n method: 'POST',\n body: {\n targetAgent,\n config: generatedSetup,\n isMaster: true,\n },\n });\n } catch (err) {\n console.log(chalk.yellow(`\\n Warning: Could not save project to server.`));\n console.log(chalk.dim(` ${err instanceof Error ? err.message : String(err)}`));\n console.log(chalk.dim(` Your local setup is unaffected.\\n`));\n }\n\n console.log(chalk.bold.green('\\nSetup complete! Your coding agent is now configured.'));\n console.log(chalk.dim('Run `caliber undo` to revert changes.\\n'));\n}\n\nasync function refineLoop(\n currentSetup: Record<string, unknown>,\n _targetAgent: string\n): Promise<Record<string, unknown> | null> {\n const history: Array<{ role: 'user' | 'assistant'; content: string }> = [];\n let refinementRound = 0;\n\n while (true) {\n const message = await promptInput('\\nWhat would you like to change?');\n if (!message || message.toLowerCase() === 'done' || message.toLowerCase() === 'accept') {\n return currentSetup;\n }\n if (message.toLowerCase() === 'cancel') {\n return null;\n }\n\n refinementRound++;\n trackEvent('refinement_message_sent', { refinement_round: refinementRound });\n\n let refined: Record<string, unknown> | null = null;\n const refineSpinner = ora('Refining setup...').start();\n const refineMessages = new SpinnerMessages(refineSpinner, REFINE_MESSAGES);\n refineMessages.start();\n\n await apiStream(\n '/api/setups/refine',\n { currentSetup, message, conversationHistory: history },\n () => {},\n (payload) => { refined = payload.setup as Record<string, unknown>; },\n (error) => { refineMessages.stop(); refineSpinner.fail(`Refinement error: ${error}`); },\n (status) => { refineMessages.handleServerStatus(status); }\n );\n\n refineMessages.stop();\n\n if (refined) {\n currentSetup = refined;\n history.push({ role: 'user', content: message });\n history.push({ role: 'assistant', content: JSON.stringify(refined) });\n refineSpinner.succeed('Setup updated');\n printSetupSummary(refined);\n console.log(chalk.dim('Type \"done\" to accept, or describe more changes.'));\n }\n }\n}\n\nfunction promptInput(question: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(chalk.cyan(`${question} `), (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nfunction promptAgent(): Promise<TargetAgent> {\n return new Promise((resolve) => {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n console.log(chalk.bold('Which coding agent are you using?'));\n console.log(' 1. Claude Code');\n console.log(' 2. Cursor');\n console.log(' 3. Both');\n rl.question(chalk.cyan('\\nChoose (1-3): '), (answer) => {\n rl.close();\n const map: Record<string, TargetAgent> = { '1': 'claude', '2': 'cursor', '3': 'both' };\n resolve(map[answer.trim()] || 'claude');\n });\n });\n}\n\nfunction promptAction(explained: boolean): Promise<'accept' | 'refine' | 'explain' | 'decline'> {\n return new Promise((resolve) => {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n console.log(chalk.bold('What would you like to do?'));\n if (explained) {\n console.log(' 1. Accept and apply');\n console.log(' 2. Refine via chat');\n console.log(' 3. Decline');\n rl.question(chalk.cyan('\\nChoose (1-3): '), (answer) => {\n rl.close();\n const map: Record<string, 'accept' | 'refine' | 'decline'> = {\n '1': 'accept', '2': 'refine', '3': 'decline',\n };\n resolve(map[answer.trim()] || 'accept');\n });\n } else {\n console.log(' 1. Accept and apply');\n console.log(' 2. Refine via chat');\n console.log(' 3. Explain recommendations');\n console.log(' 4. Decline');\n rl.question(chalk.cyan('\\nChoose (1-4): '), (answer) => {\n rl.close();\n const map: Record<string, 'accept' | 'refine' | 'explain' | 'decline'> = {\n '1': 'accept', '2': 'refine', '3': 'explain', '4': 'decline',\n };\n resolve(map[answer.trim()] || 'accept');\n });\n }\n });\n}\n\nfunction fileEntry(filePath: string, desc: string | undefined): string {\n const icon = fs.existsSync(filePath) ? chalk.yellow('~') : chalk.green('+');\n const description = desc ? chalk.dim(`— ${desc}`) : '';\n return ` ${icon} ${filePath} ${description}`;\n}\n\nfunction printSetupSummary(setup: Record<string, unknown>) {\n const claude = setup.claude as Record<string, unknown> | undefined;\n const cursor = setup.cursor as Record<string, unknown> | undefined;\n const descriptions = (setup.fileDescriptions || {}) as Record<string, string>;\n\n console.log('');\n\n if (claude) {\n if (claude.claudeMd) {\n console.log(fileEntry('CLAUDE.md', descriptions['CLAUDE.md']));\n }\n if (claude.settings) {\n console.log(fileEntry('.claude/settings.json', descriptions['.claude/settings.json']));\n }\n if (claude.settingsLocal) {\n console.log(fileEntry('.claude/settings.local.json', descriptions['.claude/settings.local.json']));\n }\n\n const skills = claude.skills as Array<{ name: string; content: string }> | undefined;\n if (Array.isArray(skills) && skills.length > 0) {\n for (const skill of skills) {\n const skillPath = `.claude/skills/${skill.name.replace(/[^a-z0-9-]/gi, '-').toLowerCase()}.md`;\n console.log(fileEntry(skillPath, descriptions[skillPath] || skill.name));\n }\n }\n\n const mcpServers = claude.mcpServers as Record<string, unknown> | undefined;\n if (mcpServers && Object.keys(mcpServers).length > 0) {\n console.log(fileEntry('.mcp.json', descriptions['.mcp.json'] || Object.keys(mcpServers).join(', ')));\n }\n }\n\n if (cursor) {\n if (cursor.cursorrules) {\n console.log(fileEntry('.cursorrules', descriptions['.cursorrules']));\n }\n\n const rules = cursor.rules as Array<{ filename: string }> | undefined;\n if (Array.isArray(rules) && rules.length > 0) {\n for (const rule of rules) {\n const rulePath = `.cursor/rules/${rule.filename}`;\n console.log(fileEntry(rulePath, descriptions[rulePath]));\n }\n }\n\n const mcpServers = cursor.mcpServers as Record<string, unknown> | undefined;\n if (mcpServers && Object.keys(mcpServers).length > 0) {\n console.log(fileEntry('.cursor/mcp.json', descriptions['.cursor/mcp.json'] || Object.keys(mcpServers).join(', ')));\n }\n }\n\n console.log('');\n console.log(` ${chalk.green('+')} ${chalk.dim('new')} ${chalk.yellow('~')} ${chalk.dim('modified')}`);\n console.log('');\n}\n\nfunction printExplanation(explanation: string) {\n console.log(chalk.bold('\\n Why this setup?\\n'));\n\n const lines = explanation.split('\\n');\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n const headerMatch = trimmed.match(/^\\[(.+)\\]$/);\n if (headerMatch) {\n console.log(` ${chalk.bold.hex('#6366f1')(headerMatch[1])}`);\n continue;\n }\n\n const itemMatch = trimmed.match(/^-\\s+\\*\\*(.+?)\\*\\*[:\\s]*(.*)$/);\n if (itemMatch) {\n const name = itemMatch[1];\n const desc = itemMatch[2].replace(/^\\s*[-—:]\\s*/, '');\n console.log(` ${chalk.dim('▸')} ${chalk.white(name)} ${chalk.dim(desc)}`);\n continue;\n }\n\n const plainMatch = trimmed.match(/^-\\s+(.*)$/);\n if (plainMatch) {\n console.log(` ${chalk.dim('▸')} ${chalk.dim(plainMatch[1])}`);\n continue;\n }\n\n console.log(` ${chalk.dim(trimmed)}`);\n }\n\n console.log('');\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { AUTH_DIR, AUTH_FILE } from '../constants.js';\n\ninterface StoredAuth {\n accessToken: string;\n refreshToken: string;\n expiresAt: number;\n userId: string;\n email: string;\n}\n\nexport function getStoredAuth(): StoredAuth | null {\n try {\n if (!fs.existsSync(AUTH_FILE)) return null;\n const data = JSON.parse(fs.readFileSync(AUTH_FILE, 'utf-8'));\n return data as StoredAuth;\n } catch {\n return null;\n }\n}\n\nexport function storeAuth(auth: {\n accessToken: string;\n refreshToken: string;\n expiresIn: number;\n user: { id: string; email: string };\n}) {\n if (!fs.existsSync(AUTH_DIR)) {\n fs.mkdirSync(AUTH_DIR, { recursive: true });\n }\n\n const data: StoredAuth = {\n accessToken: auth.accessToken,\n refreshToken: auth.refreshToken,\n expiresAt: Date.now() + auth.expiresIn * 1000,\n userId: auth.user.id,\n email: auth.user.email,\n };\n\n fs.writeFileSync(AUTH_FILE, JSON.stringify(data, null, 2), { mode: 0o600 });\n}\n\nexport function clearAuth() {\n try {\n if (fs.existsSync(AUTH_FILE)) fs.unlinkSync(AUTH_FILE);\n } catch {\n // ignore\n }\n}\n\nexport function isTokenExpired(): boolean {\n const auth = getStoredAuth();\n if (!auth) return true;\n return Date.now() >= auth.expiresAt - 60_000; // 1 min buffer\n}\n","import open from 'open';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport { generatePKCE } from '../auth/pkce.js';\nimport { startCallbackServer } from '../auth/callback-server.js';\nimport { storeAuth, getStoredAuth } from '../auth/token-store.js';\nimport { FRONTEND_URL, CLI_CALLBACK_PORT } from '../constants.js';\nimport { identifyUser, trackEvent } from '../telemetry.js';\n\nexport async function loginCommand() {\n const existing = getStoredAuth();\n if (existing) {\n console.log(chalk.dim(`Already logged in as ${existing.email}`));\n console.log(chalk.dim('Run `caliber logout` first to switch accounts.'));\n return;\n }\n\n const { state } = generatePKCE();\n const redirectUri = `http://127.0.0.1:${CLI_CALLBACK_PORT}/callback`;\n\n const authUrl = `${FRONTEND_URL}/auth/cli?redirect_uri=${encodeURIComponent(redirectUri)}&state=${state}`;\n\n console.log(chalk.bold('\\nOpening browser for authentication...\\n'));\n console.log(chalk.dim(`If the browser doesn't open, visit:\\n${authUrl}\\n`));\n\n const serverPromise = startCallbackServer(state);\n\n await open(authUrl);\n\n const spinner = ora('Waiting for authentication...').start();\n\n try {\n const result = await serverPromise;\n\n storeAuth({\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n expiresIn: result.expiresIn,\n user: result.user,\n });\n\n identifyUser(result.user.id, result.user.email);\n trackEvent('signin', { method: 'cli_pkce' });\n\n spinner.succeed(chalk.green(`Logged in as ${result.user.email}`));\n } catch (err) {\n trackEvent('error_occurred', { error_type: 'auth_failed', error_message: err instanceof Error ? err.message : 'Unknown error', command: 'login' });\n spinner.fail(chalk.red(`Authentication failed: ${err instanceof Error ? err.message : 'Unknown error'}`));\n throw new Error('__exit__');\n }\n}\n","import crypto from 'crypto';\n\nexport function generatePKCE() {\n const verifier = crypto.randomBytes(32).toString('base64url');\n const challenge = crypto\n .createHash('sha256')\n .update(verifier)\n .digest('base64url');\n const state = crypto.randomBytes(16).toString('hex');\n\n return { verifier, challenge, state };\n}\n","import http from 'http';\nimport { URL } from 'url';\nimport { CLI_CALLBACK_PORT } from '../constants.js';\n\nexport interface CallbackResult {\n accessToken: string;\n refreshToken: string;\n expiresIn: number;\n user: {\n id: string;\n email: string;\n };\n}\n\nexport function startCallbackServer(expectedState: string): Promise<CallbackResult> {\n return new Promise((resolve, reject) => {\n const server = http.createServer((req, res) => {\n if (!req.url?.startsWith('/callback')) {\n res.writeHead(404);\n res.end();\n return;\n }\n\n const url = new URL(req.url, `http://127.0.0.1:${CLI_CALLBACK_PORT}`);\n const error = url.searchParams.get('error');\n\n if (error) {\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end('<html><body><h2>Authentication failed</h2><p>You can close this tab.</p></body></html>');\n server.close();\n reject(new Error(`Auth failed: ${error}`));\n return;\n }\n\n const state = url.searchParams.get('state');\n const accessToken = url.searchParams.get('access_token');\n const refreshToken = url.searchParams.get('refresh_token');\n const expiresIn = url.searchParams.get('expires_in');\n const userId = url.searchParams.get('user_id');\n const email = url.searchParams.get('email');\n\n if (!accessToken || !refreshToken || !userId || state !== expectedState) {\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end('<html><body><h2>Invalid callback</h2></body></html>');\n server.close();\n reject(new Error('Invalid callback: missing token data or state mismatch'));\n return;\n }\n\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(`<html><body style=\"font-family: system-ui; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #09090b; color: #fafafa;\">\n <div style=\"text-align: center;\">\n <h2 style=\"color: #6366f1;\">Authentication successful!</h2>\n <p>You can close this tab and return to your terminal.</p>\n </div>\n </body></html>`);\n\n server.close();\n resolve({\n accessToken,\n refreshToken,\n expiresIn: parseInt(expiresIn || '3600', 10),\n user: { id: userId, email: email || '' },\n });\n });\n\n server.listen(CLI_CALLBACK_PORT, '127.0.0.1', () => {\n // Server ready\n });\n\n server.on('error', (err) => {\n reject(new Error(`Failed to start callback server: ${err.message}`));\n });\n\n setTimeout(() => {\n server.close();\n reject(new Error('Authentication timed out'));\n }, 5 * 60 * 1000);\n });\n}\n","import { PostHog } from 'posthog-node';\nimport fs from 'fs';\nimport path from 'path';\nimport os from 'os';\nimport { randomUUID } from 'crypto';\nimport { fileURLToPath } from 'url';\nimport { AUTH_DIR } from './constants.js';\nimport { getStoredAuth } from './auth/token-store.js';\n\nconst POSTHOG_API_KEY = process.env.CALIBER_POSTHOG_KEY || 'phc_XXrV0pSX4s2QVxVoOaeuyXDvtlRwPAjovt1ttMGVMPp';\nconst DEVICE_ID_FILE = path.join(AUTH_DIR, 'device-id');\n\nlet client: PostHog | null = null;\n\nfunction getClient(): PostHog {\n if (!client) {\n client = new PostHog(POSTHOG_API_KEY, { flushAt: 1, flushInterval: 0 });\n }\n return client;\n}\n\nexport function getDeviceId(): string {\n try {\n if (fs.existsSync(DEVICE_ID_FILE)) {\n return fs.readFileSync(DEVICE_ID_FILE, 'utf-8').trim();\n }\n } catch {}\n\n const id = randomUUID();\n try {\n if (!fs.existsSync(AUTH_DIR)) {\n fs.mkdirSync(AUTH_DIR, { recursive: true });\n }\n fs.writeFileSync(DEVICE_ID_FILE, id, { mode: 0o600 });\n } catch {}\n return id;\n}\n\nexport function isFirstRun(): boolean {\n return !fs.existsSync(DEVICE_ID_FILE);\n}\n\nexport function getDistinctId(): string {\n const auth = getStoredAuth();\n return auth?.userId || getDeviceId();\n}\n\nconst __dirname_telemetry = path.dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(\n fs.readFileSync(path.resolve(__dirname_telemetry, '..', 'package.json'), 'utf-8')\n);\n\nfunction baseProperties() {\n return {\n source: 'cli',\n cli_version: pkg.version,\n os: os.platform(),\n };\n}\n\nexport function trackEvent(event: string, properties: Record<string, unknown> = {}) {\n try {\n getClient().capture({\n distinctId: getDistinctId(),\n event,\n properties: { ...baseProperties(), ...properties },\n });\n } catch {}\n}\n\nexport function identifyUser(userId: string, email: string) {\n try {\n const ph = getClient();\n const deviceId = getDeviceId();\n\n ph.identify({ distinctId: userId, properties: { email, source: 'cli' } });\n\n if (deviceId !== userId) {\n ph.alias({ distinctId: userId, alias: deviceId });\n }\n } catch {}\n}\n\nexport async function shutdownTelemetry() {\n try {\n await Promise.race([\n client?.shutdown(),\n new Promise((resolve) => setTimeout(resolve, 2000)),\n ]);\n } catch {}\n}\n","import crypto from 'crypto';\nimport { getGitRemoteUrl } from './git.js';\nimport { analyzePackageJson } from './package-json.js';\nimport { getFileTree } from './file-tree.js';\nimport { detectLanguages } from './languages.js';\nimport { readExistingConfigs } from './existing-config.js';\nimport { analyzeCode, CodeAnalysis } from './code-analysis.js';\n\nexport type { CodeAnalysis };\n\nexport interface Fingerprint {\n gitRemoteUrl?: string;\n packageName?: string;\n languages: string[];\n frameworks: string[];\n fileTree: string[];\n existingConfigs: ReturnType<typeof readExistingConfigs>;\n codeAnalysis?: CodeAnalysis;\n description?: string;\n}\n\nexport function collectFingerprint(dir: string): Fingerprint {\n const gitRemoteUrl = getGitRemoteUrl();\n const pkgInfo = analyzePackageJson(dir);\n const fileTree = getFileTree(dir);\n const fileLangs = detectLanguages(fileTree);\n const existingConfigs = readExistingConfigs(dir);\n const codeAnalysis = analyzeCode(dir);\n\n const languages = [...new Set([...pkgInfo.languages, ...fileLangs])];\n\n return {\n gitRemoteUrl,\n packageName: pkgInfo.name,\n languages,\n frameworks: pkgInfo.frameworks,\n fileTree,\n existingConfigs,\n codeAnalysis,\n };\n}\n\nexport function computeFingerprintHash(fingerprint: Fingerprint): string {\n const key = [\n fingerprint.gitRemoteUrl || '',\n fingerprint.packageName || '',\n ].join('::');\n\n return crypto.createHash('sha256').update(key).digest('hex');\n}\n","import { execSync } from 'child_process';\nimport { existsSync } from 'fs';\nimport { resolve, dirname } from 'path';\n\nfunction isInsideGitRepo(): boolean {\n let dir = process.cwd();\n while (true) {\n if (existsSync(resolve(dir, '.git'))) return true;\n const parent = dirname(dir);\n if (parent === dir) return false;\n dir = parent;\n }\n}\n\nexport function getGitRemoteUrl(): string | undefined {\n if (!isInsideGitRepo()) return undefined;\n try {\n return execSync('git remote get-url origin', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n } catch {\n return undefined;\n }\n}\n\nexport function isGitRepo(): boolean {\n return isInsideGitRepo();\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { globSync } from 'glob';\n\ninterface PackageInfo {\n name?: string;\n frameworks: string[];\n languages: string[];\n}\n\nconst NODE_FRAMEWORK_DEPS: Record<string, string> = {\n react: 'React',\n next: 'Next.js',\n vue: 'Vue',\n nuxt: 'Nuxt',\n svelte: 'Svelte',\n '@sveltejs/kit': 'SvelteKit',\n angular: 'Angular',\n '@angular/core': 'Angular',\n express: 'Express',\n fastify: 'Fastify',\n hono: 'Hono',\n nestjs: 'NestJS',\n '@nestjs/core': 'NestJS',\n tailwindcss: 'Tailwind CSS',\n prisma: 'Prisma',\n drizzle: 'Drizzle',\n 'drizzle-orm': 'Drizzle',\n '@supabase/supabase-js': 'Supabase',\n mongoose: 'MongoDB',\n typeorm: 'TypeORM',\n sequelize: 'Sequelize',\n 'better-auth': 'Better Auth',\n};\n\nconst PYTHON_FRAMEWORK_DEPS: Record<string, string> = {\n fastapi: 'FastAPI',\n django: 'Django',\n flask: 'Flask',\n sqlalchemy: 'SQLAlchemy',\n pydantic: 'Pydantic',\n celery: 'Celery',\n pytest: 'pytest',\n uvicorn: 'Uvicorn',\n starlette: 'Starlette',\n httpx: 'HTTPX',\n alembic: 'Alembic',\n tortoise: 'Tortoise ORM',\n 'google-cloud-pubsub': 'Google Pub/Sub',\n stripe: 'Stripe',\n redis: 'Redis',\n};\n\nconst WORKSPACE_GLOBS = [\n 'apps/*/package.json',\n 'packages/*/package.json',\n 'services/*/package.json',\n 'libs/*/package.json',\n];\n\nfunction detectNodeFrameworks(pkgPath: string): string[] {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n const frameworks: string[] = [];\n for (const [dep, framework] of Object.entries(NODE_FRAMEWORK_DEPS)) {\n if (allDeps[dep]) frameworks.push(framework);\n }\n return frameworks;\n } catch {\n return [];\n }\n}\n\nfunction detectPythonFrameworks(dir: string): string[] {\n const frameworks: string[] = [];\n const candidates = [\n path.join(dir, 'pyproject.toml'),\n path.join(dir, 'requirements.txt'),\n ...globSync('apps/*/pyproject.toml', { cwd: dir, absolute: true }),\n ...globSync('apps/*/requirements.txt', { cwd: dir, absolute: true }),\n ...globSync('services/*/pyproject.toml', { cwd: dir, absolute: true }),\n ];\n\n for (const filePath of candidates) {\n if (!fs.existsSync(filePath)) continue;\n try {\n const content = fs.readFileSync(filePath, 'utf-8').toLowerCase();\n for (const [dep, framework] of Object.entries(PYTHON_FRAMEWORK_DEPS)) {\n if (content.includes(dep)) frameworks.push(framework);\n }\n } catch {}\n }\n\n return frameworks;\n}\n\nexport function analyzePackageJson(dir: string): PackageInfo {\n const rootPkgPath = path.join(dir, 'package.json');\n let name: string | undefined;\n const allFrameworks: string[] = [];\n const languages: string[] = [];\n\n if (fs.existsSync(rootPkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(rootPkgPath, 'utf-8'));\n name = pkg.name;\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n allFrameworks.push(...detectNodeFrameworks(rootPkgPath));\n\n if (allDeps.typescript || allDeps['@types/node']) {\n languages.push('TypeScript');\n }\n languages.push('JavaScript');\n } catch {}\n }\n\n for (const glob of WORKSPACE_GLOBS) {\n const matches = globSync(glob, { cwd: dir, absolute: true });\n for (const pkgPath of matches) {\n allFrameworks.push(...detectNodeFrameworks(pkgPath));\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n if (deps.typescript || deps['@types/node']) {\n languages.push('TypeScript');\n }\n } catch {}\n }\n }\n\n allFrameworks.push(...detectPythonFrameworks(dir));\n\n return {\n name,\n frameworks: [...new Set(allFrameworks)],\n languages: [...new Set(languages)],\n };\n}\n","import fs from 'fs';\nimport path from 'path';\n\nconst IGNORE_DIRS = new Set([\n 'node_modules', '.git', '.next', 'dist', 'build', '.cache',\n '.turbo', 'coverage', '.caliber', '__pycache__', '.venv',\n 'vendor', 'target',\n]);\n\nexport function getFileTree(dir: string, maxDepth = 3): string[] {\n const files: string[] = [];\n scan(dir, '', 0, maxDepth, files);\n return files;\n}\n\nfunction scan(base: string, rel: string, depth: number, maxDepth: number, result: string[]) {\n if (depth > maxDepth) return;\n\n const fullPath = path.join(base, rel);\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(fullPath, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (entry.name.startsWith('.') && depth === 0 && entry.isDirectory()) continue;\n if (IGNORE_DIRS.has(entry.name)) continue;\n\n const relPath = rel ? `${rel}/${entry.name}` : entry.name;\n\n if (entry.isDirectory()) {\n result.push(`${relPath}/`);\n scan(base, relPath, depth + 1, maxDepth, result);\n } else {\n result.push(relPath);\n }\n }\n}\n","import path from 'path';\n\nconst EXT_TO_LANG: Record<string, string> = {\n '.ts': 'TypeScript',\n '.tsx': 'TypeScript',\n '.js': 'JavaScript',\n '.jsx': 'JavaScript',\n '.py': 'Python',\n '.go': 'Go',\n '.rs': 'Rust',\n '.rb': 'Ruby',\n '.java': 'Java',\n '.kt': 'Kotlin',\n '.swift': 'Swift',\n '.cs': 'C#',\n '.cpp': 'C++',\n '.c': 'C',\n '.php': 'PHP',\n '.dart': 'Dart',\n '.ex': 'Elixir',\n '.exs': 'Elixir',\n '.scala': 'Scala',\n '.zig': 'Zig',\n};\n\nexport function detectLanguages(fileTree: string[]): string[] {\n const langs = new Set<string>();\n\n for (const file of fileTree) {\n const ext = path.extname(file).toLowerCase();\n if (EXT_TO_LANG[ext]) {\n langs.add(EXT_TO_LANG[ext]);\n }\n }\n\n return [...langs];\n}\n","import fs from 'fs';\nimport path from 'path';\n\nexport function readExistingConfigs(dir: string) {\n const configs: {\n claudeMd?: string;\n readmeMd?: string;\n claudeSettings?: Record<string, unknown>;\n claudeSkills?: Array<{ filename: string; content: string }>;\n cursorrules?: string;\n cursorRules?: Array<{ filename: string; content: string }>;\n } = {};\n\n // README.md\n const readmeMdPath = path.join(dir, 'README.md');\n if (fs.existsSync(readmeMdPath)) {\n configs.readmeMd = fs.readFileSync(readmeMdPath, 'utf-8');\n }\n\n // CLAUDE.md\n const claudeMdPath = path.join(dir, 'CLAUDE.md');\n if (fs.existsSync(claudeMdPath)) {\n configs.claudeMd = fs.readFileSync(claudeMdPath, 'utf-8');\n }\n\n // .claude/settings.json\n const claudeSettingsPath = path.join(dir, '.claude', 'settings.json');\n if (fs.existsSync(claudeSettingsPath)) {\n try {\n configs.claudeSettings = JSON.parse(fs.readFileSync(claudeSettingsPath, 'utf-8'));\n } catch {\n // ignore\n }\n }\n\n // .claude/skills/*.md\n const skillsDir = path.join(dir, '.claude', 'skills');\n if (fs.existsSync(skillsDir)) {\n try {\n const files = fs.readdirSync(skillsDir).filter(f => f.endsWith('.md'));\n configs.claudeSkills = files.map(f => ({\n filename: f,\n content: fs.readFileSync(path.join(skillsDir, f), 'utf-8'),\n }));\n } catch {\n // ignore\n }\n }\n\n // .cursorrules\n const cursorrulesPath = path.join(dir, '.cursorrules');\n if (fs.existsSync(cursorrulesPath)) {\n configs.cursorrules = fs.readFileSync(cursorrulesPath, 'utf-8');\n }\n\n // .cursor/rules/*.mdc\n const cursorRulesDir = path.join(dir, '.cursor', 'rules');\n if (fs.existsSync(cursorRulesDir)) {\n try {\n const files = fs.readdirSync(cursorRulesDir).filter(f => f.endsWith('.mdc'));\n configs.cursorRules = files.map(f => ({\n filename: f,\n content: fs.readFileSync(path.join(cursorRulesDir, f), 'utf-8'),\n }));\n } catch {\n // ignore\n }\n }\n\n return configs;\n}\n","import fs from 'fs';\nimport path from 'path';\n\nconst IGNORE_DIRS = new Set([\n 'node_modules', '.git', '.next', 'dist', 'build', '.cache',\n '.turbo', 'coverage', '.caliber', '__pycache__', '.venv',\n 'vendor', 'target',\n]);\n\nconst SOURCE_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx', '.py']);\n\nconst CONFIG_FILE_NAMES = new Set([\n 'Dockerfile', 'docker-compose.yml', 'docker-compose.yaml',\n 'Makefile', 'tsconfig.json', 'pyproject.toml', 'turbo.json',\n 'next.config.js', 'next.config.mjs', 'next.config.ts',\n 'vite.config.ts', 'vite.config.js', 'vite.config.mjs',\n 'drizzle.config.ts', 'drizzle.config.js',\n 'jest.config.ts', 'jest.config.js', 'jest.config.mjs',\n 'vitest.config.ts', 'vitest.config.js', 'vitest.config.mts',\n 'alembic.ini', 'setup.cfg', 'tox.ini',\n]);\n\nconst CONFIG_GLOBS_DIRS: Array<{ dir: string; pattern: RegExp }> = [\n { dir: '.github/workflows', pattern: /\\.ya?ml$/ },\n];\n\nconst TOTAL_BUDGET = 50_000;\nconst CONFIG_BUDGET = Math.floor(TOTAL_BUDGET * 0.3);\nconst SOURCE_BUDGET = Math.floor(TOTAL_BUDGET * 0.7);\n\nexport interface FileSummary {\n path: string;\n language: 'ts' | 'js' | 'py';\n imports: string[];\n exports: string[];\n functions: string[];\n classes: string[];\n types: string[];\n routes: string[];\n}\n\nexport interface ConfigFileContent {\n path: string;\n content: string;\n}\n\nexport interface CodeAnalysis {\n fileSummaries: FileSummary[];\n configFiles: ConfigFileContent[];\n truncated: boolean;\n}\n\nexport function analyzeCode(dir: string): CodeAnalysis {\n const sourceFiles: string[] = [];\n const configFiles: ConfigFileContent[] = [];\n\n walkDir(dir, '', 0, 10, sourceFiles, configFiles, dir);\n\n sortByPriority(sourceFiles);\n\n let configChars = 0;\n const trimmedConfigs: ConfigFileContent[] = [];\n for (const cfg of configFiles) {\n const size = cfg.path.length + cfg.content.length;\n if (configChars + size > CONFIG_BUDGET) break;\n trimmedConfigs.push(cfg);\n configChars += size;\n }\n\n let sourceChars = 0;\n let truncated = false;\n const fileSummaries: FileSummary[] = [];\n\n for (const relPath of sourceFiles) {\n const fullPath = path.join(dir, relPath);\n let content: string;\n try {\n content = fs.readFileSync(fullPath, 'utf-8');\n } catch {\n continue;\n }\n\n const lineCount = content.split('\\n').length;\n if (lineCount > 500) continue;\n\n const ext = path.extname(relPath);\n const language = resolveLanguage(ext);\n if (!language) continue;\n\n const summary = language === 'py'\n ? extractPython(relPath, content)\n : extractTypeScriptJavaScript(relPath, content, language);\n\n const summarySize = estimateSummarySize(summary);\n if (sourceChars + summarySize > SOURCE_BUDGET) {\n truncated = true;\n break;\n }\n\n fileSummaries.push(summary);\n sourceChars += summarySize;\n }\n\n return { fileSummaries, configFiles: trimmedConfigs, truncated };\n}\n\nfunction walkDir(\n base: string,\n rel: string,\n depth: number,\n maxDepth: number,\n sourceFiles: string[],\n configFiles: ConfigFileContent[],\n rootDir: string\n) {\n if (depth > maxDepth) return;\n const fullPath = path.join(base, rel);\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(fullPath, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (IGNORE_DIRS.has(entry.name)) continue;\n if (entry.name.startsWith('.') && depth === 0 && entry.isDirectory()) continue;\n\n const relPath = rel ? `${rel}/${entry.name}` : entry.name;\n\n if (entry.isDirectory()) {\n const matchedGlobDir = CONFIG_GLOBS_DIRS.find(\n (g) => relPath === g.dir || relPath.endsWith(`/${g.dir}`)\n );\n if (matchedGlobDir) {\n collectConfigsFromDir(base, relPath, matchedGlobDir.pattern, configFiles);\n }\n walkDir(base, relPath, depth + 1, maxDepth, sourceFiles, configFiles, rootDir);\n } else {\n if (CONFIG_FILE_NAMES.has(entry.name)) {\n try {\n const content = fs.readFileSync(path.join(base, relPath), 'utf-8');\n configFiles.push({ path: relPath, content });\n } catch {}\n }\n\n const ext = path.extname(entry.name);\n if (SOURCE_EXTENSIONS.has(ext) && !entry.name.endsWith('.d.ts')) {\n sourceFiles.push(relPath);\n }\n }\n }\n}\n\nfunction collectConfigsFromDir(\n base: string,\n relDir: string,\n pattern: RegExp,\n configFiles: ConfigFileContent[]\n) {\n const fullDir = path.join(base, relDir);\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(fullDir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n if (entry.isFile() && pattern.test(entry.name)) {\n const relPath = `${relDir}/${entry.name}`;\n try {\n const content = fs.readFileSync(path.join(base, relPath), 'utf-8');\n configFiles.push({ path: relPath, content });\n } catch {}\n }\n }\n}\n\nfunction sortByPriority(files: string[]) {\n const entryPointNames = new Set(['index.ts', 'index.js', 'main.py', 'app.ts', 'app.js', 'server.ts', 'server.js']);\n const routePattern = /(route|api|controller)/i;\n const schemaPattern = /(types|schema|models)/i;\n const servicePattern = /(service|lib|utils)/i;\n const testPattern = /(test|spec|__tests__)/i;\n\n function priority(filePath: string): number {\n const base = path.basename(filePath);\n if (entryPointNames.has(base)) return 0;\n if (routePattern.test(filePath)) return 1;\n if (schemaPattern.test(filePath)) return 2;\n if (servicePattern.test(filePath)) return 3;\n if (testPattern.test(filePath)) return 5;\n return 4;\n }\n\n files.sort((a, b) => priority(a) - priority(b));\n}\n\nfunction resolveLanguage(ext: string): 'ts' | 'js' | 'py' | null {\n if (ext === '.ts' || ext === '.tsx') return 'ts';\n if (ext === '.js' || ext === '.jsx') return 'js';\n if (ext === '.py') return 'py';\n return null;\n}\n\nfunction extractTypeScriptJavaScript(\n filePath: string,\n content: string,\n language: 'ts' | 'js'\n): FileSummary {\n const lines = content.split('\\n');\n const imports: string[] = [];\n const exports: string[] = [];\n const functions: string[] = [];\n const classes: string[] = [];\n const types: string[] = [];\n const routes: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n if (/^import\\s+/.test(trimmed)) {\n imports.push(trimmed);\n continue;\n }\n\n const exportMatch = trimmed.match(\n /^export\\s+(?:default\\s+)?(?:async\\s+)?(function|const|class|interface|type|enum)\\s+(\\w+)/\n );\n if (exportMatch) {\n exports.push(`${exportMatch[1]} ${exportMatch[2]}`);\n if (exportMatch[1] === 'class') classes.push(exportMatch[2]);\n if (exportMatch[1] === 'interface' || exportMatch[1] === 'type') types.push(exportMatch[2]);\n if (exportMatch[1] === 'function') functions.push(exportMatch[2]);\n continue;\n }\n\n const fnMatch = trimmed.match(/^(?:async\\s+)?function\\s+(\\w+)/);\n if (fnMatch && !trimmed.startsWith('export')) {\n functions.push(fnMatch[1]);\n continue;\n }\n\n const arrowMatch = trimmed.match(/^(?:export\\s+)?const\\s+(\\w+)\\s*=\\s*(?:async\\s*)?\\(/);\n if (arrowMatch && !exports.some((e) => e.endsWith(arrowMatch[1]))) {\n functions.push(arrowMatch[1]);\n }\n\n const classMatch = trimmed.match(/^class\\s+(\\w+)/);\n if (classMatch && !trimmed.startsWith('export')) {\n classes.push(classMatch[1]);\n continue;\n }\n\n const ifaceMatch = trimmed.match(/^(?:interface|type)\\s+(\\w+)/);\n if (ifaceMatch && !trimmed.startsWith('export')) {\n types.push(ifaceMatch[1]);\n continue;\n }\n\n const routeMatch = trimmed.match(\n /(?:router|app|server)\\.(get|post|put|patch|delete|all|use)\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/\n );\n if (routeMatch) {\n routes.push(`${routeMatch[1].toUpperCase()} ${routeMatch[2]}`);\n }\n }\n\n return { path: filePath, language, imports, exports, functions, classes, types, routes };\n}\n\nfunction extractPython(filePath: string, content: string): FileSummary {\n const lines = content.split('\\n');\n const imports: string[] = [];\n const functions: string[] = [];\n const classes: string[] = [];\n const routes: string[] = [];\n\n let prevLine = '';\n for (const line of lines) {\n const trimmed = line.trim();\n\n if (/^import\\s+/.test(trimmed) || /^from\\s+/.test(trimmed)) {\n imports.push(trimmed);\n continue;\n }\n\n const defMatch = trimmed.match(/^def\\s+(\\w+)\\s*\\(([^)]*)\\)/);\n if (defMatch) {\n functions.push(`${defMatch[1]}(${defMatch[2]})`);\n }\n\n const classMatch = trimmed.match(/^class\\s+(\\w+)/);\n if (classMatch) {\n classes.push(classMatch[1]);\n }\n\n const decoratorRoute = prevLine.match(\n /@(?:app|router)\\.(get|post|put|patch|delete|options|head)\\s*\\(\\s*['\"]([^'\"]+)['\"]/\n );\n if (decoratorRoute && defMatch) {\n routes.push(`${decoratorRoute[1].toUpperCase()} ${decoratorRoute[2]}`);\n }\n\n const includeRouter = trimmed.match(\n /include_router\\s*\\([^,]+,\\s*prefix\\s*=\\s*['\"]([^'\"]+)['\"]/\n );\n if (includeRouter) {\n routes.push(`ROUTER ${includeRouter[1]}`);\n }\n\n prevLine = trimmed;\n }\n\n return {\n path: filePath,\n language: 'py',\n imports,\n exports: [],\n functions,\n classes,\n types: [],\n routes,\n };\n}\n\nfunction estimateSummarySize(summary: FileSummary): number {\n return (\n summary.path.length +\n summary.imports.reduce((s, i) => s + i.length, 0) +\n summary.exports.reduce((s, e) => s + e.length, 0) +\n summary.functions.reduce((s, f) => s + f.length, 0) +\n summary.classes.reduce((s, c) => s + c.length, 0) +\n summary.types.reduce((s, t) => s + t.length, 0) +\n summary.routes.reduce((s, r) => s + r.length, 0)\n );\n}\n","import { getStoredAuth, storeAuth, isTokenExpired } from '../auth/token-store.js';\nimport { API_URL } from '../constants.js';\n\nasync function forceRefreshToken(): Promise<string | null> {\n const auth = getStoredAuth();\n if (!auth) return null;\n\n try {\n const resp = await fetch(`${API_URL}/api/auth/refresh`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ refreshToken: auth.refreshToken }),\n });\n\n if (!resp.ok) return null;\n\n const { data } = await resp.json();\n storeAuth({\n accessToken: data.accessToken,\n refreshToken: data.refreshToken,\n expiresIn: data.expiresIn,\n user: { id: auth.userId, email: auth.email },\n });\n\n return data.accessToken;\n } catch {\n return null;\n }\n}\n\nasync function getValidToken(): Promise<string> {\n const auth = getStoredAuth();\n if (!auth) {\n throw new Error('Not authenticated. Run `caliber login` first.');\n }\n\n if (!isTokenExpired()) return auth.accessToken;\n\n const refreshed = await forceRefreshToken();\n if (!refreshed) {\n throw new Error('Session expired. Run `caliber login` to re-authenticate.');\n }\n return refreshed;\n}\n\nexport async function apiRequest<T = unknown>(\n path: string,\n options: {\n method?: string;\n body?: unknown;\n } = {}\n): Promise<T> {\n let token = await getValidToken();\n\n let resp = await fetch(`${API_URL}${path}`, {\n method: options.method || 'GET',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: options.body ? JSON.stringify(options.body) : undefined,\n });\n\n if (resp.status === 401) {\n const refreshed = await forceRefreshToken();\n if (!refreshed) {\n throw new Error('Session expired. Run `caliber login` to re-authenticate.');\n }\n token = refreshed;\n resp = await fetch(`${API_URL}${path}`, {\n method: options.method || 'GET',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: options.body ? JSON.stringify(options.body) : undefined,\n });\n }\n\n if (!resp.ok) {\n const error = await resp.json().catch(() => ({ error: resp.statusText }));\n throw new Error(error.error || `API error: ${resp.status}`);\n }\n\n const json = await resp.json();\n return json.data as T;\n}\n\nexport interface StreamCompletePayload {\n setup: unknown;\n explanation?: string;\n raw?: string;\n}\n\nexport async function apiStream(\n path: string,\n body: unknown,\n onChunk: (text: string) => void,\n onComplete: (payload: StreamCompletePayload) => void,\n onError: (error: string) => void,\n onStatus?: (message: string) => void\n): Promise<void> {\n let token = await getValidToken();\n\n let resp = await fetch(`${API_URL}${path}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify(body),\n });\n\n if (resp.status === 401) {\n const refreshed = await forceRefreshToken();\n if (!refreshed) {\n throw new Error('Session expired. Run `caliber login` to re-authenticate.');\n }\n token = refreshed;\n resp = await fetch(`${API_URL}${path}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify(body),\n });\n }\n\n if (!resp.ok || !resp.body) {\n throw new Error(`API error: ${resp.status}`);\n }\n\n const reader = resp.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue;\n const data = line.slice(6);\n if (data === '[DONE]') return;\n\n try {\n const parsed = JSON.parse(data);\n if (parsed.type === 'chunk') onChunk(parsed.content);\n else if (parsed.type === 'status' && onStatus) onStatus(parsed.message);\n else if (parsed.type === 'complete') onComplete({ setup: parsed.setup, explanation: parsed.explanation, raw: parsed.raw });\n else if (parsed.type === 'error') onError(parsed.message);\n } catch {\n // Skip unparseable lines\n }\n }\n }\n}\n","import fs from 'fs';\nimport { writeClaudeConfig } from './claude/index.js';\nimport { writeCursorConfig } from './cursor/index.js';\nimport { createBackup, restoreBackup } from './backup.js';\nimport {\n readManifest,\n writeManifest,\n fileChecksum,\n type Manifest,\n type ManifestEntry,\n} from './manifest.js';\n\ninterface AgentSetup {\n targetAgent: 'claude' | 'cursor' | 'both';\n claude?: Parameters<typeof writeClaudeConfig>[0];\n cursor?: Parameters<typeof writeCursorConfig>[0];\n}\n\nexport function writeSetup(setup: AgentSetup): { written: string[]; backupDir?: string } {\n // Collect all files that will be written\n const filesToWrite = getFilesToWrite(setup);\n\n // Backup existing files\n const existingFiles = filesToWrite.filter(f => fs.existsSync(f));\n const backupDir = existingFiles.length > 0 ? createBackup(existingFiles) : undefined;\n\n const written: string[] = [];\n\n // Write Claude configs\n if ((setup.targetAgent === 'claude' || setup.targetAgent === 'both') && setup.claude) {\n written.push(...writeClaudeConfig(setup.claude));\n }\n\n // Write Cursor configs\n if ((setup.targetAgent === 'cursor' || setup.targetAgent === 'both') && setup.cursor) {\n written.push(...writeCursorConfig(setup.cursor));\n }\n\n // Ensure .caliber/ is in .gitignore\n ensureGitignore();\n\n // Write manifest\n const entries: ManifestEntry[] = written.map(file => ({\n path: file,\n action: existingFiles.includes(file) ? 'modified' as const : 'created' as const,\n checksum: fileChecksum(file),\n timestamp: new Date().toISOString(),\n }));\n\n writeManifest({ version: 1, backupDir, entries });\n\n return { written, backupDir };\n}\n\nexport function undoSetup(): { restored: string[]; removed: string[] } {\n const manifest = readManifest();\n if (!manifest) {\n throw new Error('No manifest found. Nothing to undo.');\n }\n\n const restored: string[] = [];\n const removed: string[] = [];\n\n for (const entry of manifest.entries) {\n if (entry.action === 'created') {\n // Remove files we created\n if (fs.existsSync(entry.path)) {\n fs.unlinkSync(entry.path);\n removed.push(entry.path);\n }\n } else if (entry.action === 'modified' && manifest.backupDir) {\n // Restore from backup\n if (restoreBackup(manifest.backupDir, entry.path)) {\n restored.push(entry.path);\n }\n }\n }\n\n // Clean up manifest\n const { MANIFEST_FILE } = require('../constants.js');\n if (fs.existsSync(MANIFEST_FILE)) {\n fs.unlinkSync(MANIFEST_FILE);\n }\n\n return { restored, removed };\n}\n\nfunction getFilesToWrite(setup: AgentSetup): string[] {\n const files: string[] = [];\n\n if ((setup.targetAgent === 'claude' || setup.targetAgent === 'both') && setup.claude) {\n files.push('CLAUDE.md', '.claude/settings.json', '.claude/settings.local.json');\n if (setup.claude.mcpServers) files.push('.mcp.json');\n if (setup.claude.skills) {\n for (const s of setup.claude.skills) {\n files.push(`.claude/skills/${s.name.replace(/[^a-z0-9-]/gi, '-').toLowerCase()}.md`);\n }\n }\n }\n\n if ((setup.targetAgent === 'cursor' || setup.targetAgent === 'both') && setup.cursor) {\n if (setup.cursor.cursorrules) files.push('.cursorrules');\n if (setup.cursor.rules) {\n for (const r of setup.cursor.rules) files.push(`.cursor/rules/${r.filename}`);\n }\n if (setup.cursor.mcpServers) files.push('.cursor/mcp.json');\n }\n\n return files;\n}\n\nfunction ensureGitignore() {\n const gitignorePath = '.gitignore';\n if (fs.existsSync(gitignorePath)) {\n const content = fs.readFileSync(gitignorePath, 'utf-8');\n if (!content.includes('.caliber/')) {\n fs.appendFileSync(gitignorePath, '\\n# Caliber local state\\n.caliber/\\n');\n }\n } else {\n fs.writeFileSync(gitignorePath, '# Caliber local state\\n.caliber/\\n');\n }\n}\n","import fs from 'fs';\nimport path from 'path';\n\ninterface ClaudeConfig {\n claudeMd: string;\n settings: {\n permissions: { allow: string[] };\n hooks?: Record<string, Array<{ command: string; description?: string }>>;\n };\n settingsLocal: {\n permissions: { allow: string[] };\n };\n skills?: Array<{ name: string; content: string }>;\n mcpServers?: Record<string, { command: string; args?: string[]; env?: Record<string, string> }>;\n}\n\nexport function writeClaudeConfig(config: ClaudeConfig): string[] {\n const written: string[] = [];\n\n // CLAUDE.md\n fs.writeFileSync('CLAUDE.md', config.claudeMd);\n written.push('CLAUDE.md');\n\n // .claude/settings.json\n const claudeDir = '.claude';\n if (!fs.existsSync(claudeDir)) fs.mkdirSync(claudeDir, { recursive: true });\n\n fs.writeFileSync(\n path.join(claudeDir, 'settings.json'),\n JSON.stringify(config.settings, null, 2)\n );\n written.push(path.join(claudeDir, 'settings.json'));\n\n // .claude/settings.local.json\n fs.writeFileSync(\n path.join(claudeDir, 'settings.local.json'),\n JSON.stringify(config.settingsLocal, null, 2)\n );\n written.push(path.join(claudeDir, 'settings.local.json'));\n\n // Skills\n if (config.skills?.length) {\n const skillsDir = path.join(claudeDir, 'skills');\n if (!fs.existsSync(skillsDir)) fs.mkdirSync(skillsDir, { recursive: true });\n\n for (const skill of config.skills) {\n const filename = `${skill.name.replace(/[^a-z0-9-]/gi, '-').toLowerCase()}.md`;\n const skillPath = path.join(skillsDir, filename);\n fs.writeFileSync(skillPath, skill.content);\n written.push(skillPath);\n }\n }\n\n // MCP servers (.mcp.json)\n if (config.mcpServers && Object.keys(config.mcpServers).length > 0) {\n const mcpConfig = { mcpServers: config.mcpServers };\n fs.writeFileSync('.mcp.json', JSON.stringify(mcpConfig, null, 2));\n written.push('.mcp.json');\n }\n\n return written;\n}\n","import fs from 'fs';\nimport path from 'path';\n\ninterface CursorConfig {\n cursorrules?: string;\n rules?: Array<{ filename: string; content: string }>;\n mcpServers?: Record<string, { command: string; args?: string[]; env?: Record<string, string> }>;\n}\n\nexport function writeCursorConfig(config: CursorConfig): string[] {\n const written: string[] = [];\n\n // .cursorrules\n if (config.cursorrules) {\n fs.writeFileSync('.cursorrules', config.cursorrules);\n written.push('.cursorrules');\n }\n\n // .cursor/rules/*.mdc\n if (config.rules?.length) {\n const rulesDir = path.join('.cursor', 'rules');\n if (!fs.existsSync(rulesDir)) fs.mkdirSync(rulesDir, { recursive: true });\n\n for (const rule of config.rules) {\n const rulePath = path.join(rulesDir, rule.filename);\n fs.writeFileSync(rulePath, rule.content);\n written.push(rulePath);\n }\n }\n\n // .cursor/mcp.json\n if (config.mcpServers && Object.keys(config.mcpServers).length > 0) {\n const cursorDir = '.cursor';\n if (!fs.existsSync(cursorDir)) fs.mkdirSync(cursorDir, { recursive: true });\n\n const mcpConfig = { mcpServers: config.mcpServers };\n fs.writeFileSync(\n path.join(cursorDir, 'mcp.json'),\n JSON.stringify(mcpConfig, null, 2)\n );\n written.push(path.join(cursorDir, 'mcp.json'));\n }\n\n return written;\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { BACKUPS_DIR } from '../constants.js';\n\nexport function createBackup(files: string[]): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const backupDir = path.join(BACKUPS_DIR, timestamp);\n\n for (const file of files) {\n if (!fs.existsSync(file)) continue;\n\n const dest = path.join(backupDir, file);\n const destDir = path.dirname(dest);\n if (!fs.existsSync(destDir)) {\n fs.mkdirSync(destDir, { recursive: true });\n }\n fs.copyFileSync(file, dest);\n }\n\n return backupDir;\n}\n\nexport function restoreBackup(backupDir: string, file: string): boolean {\n const backupFile = path.join(backupDir, file);\n if (!fs.existsSync(backupFile)) return false;\n\n const destDir = path.dirname(file);\n if (!fs.existsSync(destDir)) {\n fs.mkdirSync(destDir, { recursive: true });\n }\n fs.copyFileSync(backupFile, file);\n return true;\n}\n","import fs from 'fs';\nimport crypto from 'crypto';\nimport { CALIBER_DIR, MANIFEST_FILE } from '../constants.js';\n\nexport interface ManifestEntry {\n path: string;\n action: 'created' | 'modified';\n checksum: string;\n timestamp: string;\n}\n\nexport interface Manifest {\n version: 1;\n backupDir?: string;\n entries: ManifestEntry[];\n}\n\nexport function readManifest(): Manifest | null {\n try {\n if (!fs.existsSync(MANIFEST_FILE)) return null;\n return JSON.parse(fs.readFileSync(MANIFEST_FILE, 'utf-8'));\n } catch {\n return null;\n }\n}\n\nexport function writeManifest(manifest: Manifest) {\n if (!fs.existsSync(CALIBER_DIR)) {\n fs.mkdirSync(CALIBER_DIR, { recursive: true });\n }\n fs.writeFileSync(MANIFEST_FILE, JSON.stringify(manifest, null, 2));\n}\n\nexport function fileChecksum(filePath: string): string {\n const content = fs.readFileSync(filePath);\n return crypto.createHash('sha256').update(content).digest('hex');\n}\n","import fs from 'fs';\nimport path from 'path';\n\nconst SETTINGS_PATH = path.join('.claude', 'settings.json');\nconst HOOK_COMMAND = 'caliber refresh --quiet';\n\ninterface HookEntry {\n type: string;\n command: string;\n}\n\ninterface HookMatcher {\n matcher: string;\n hooks: HookEntry[];\n}\n\ninterface ClaudeSettings {\n hooks?: {\n SessionEnd?: HookMatcher[];\n [key: string]: unknown;\n };\n [key: string]: unknown;\n}\n\nfunction readSettings(): ClaudeSettings {\n if (!fs.existsSync(SETTINGS_PATH)) return {};\n try {\n return JSON.parse(fs.readFileSync(SETTINGS_PATH, 'utf-8'));\n } catch {\n return {};\n }\n}\n\nfunction writeSettings(settings: ClaudeSettings): void {\n const dir = path.dirname(SETTINGS_PATH);\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(SETTINGS_PATH, JSON.stringify(settings, null, 2));\n}\n\nfunction findHookIndex(sessionEnd: HookMatcher[]): number {\n return sessionEnd.findIndex(entry =>\n entry.hooks?.some(h => h.command === HOOK_COMMAND)\n );\n}\n\nexport function isHookInstalled(): boolean {\n const settings = readSettings();\n const sessionEnd = settings.hooks?.SessionEnd;\n if (!Array.isArray(sessionEnd)) return false;\n return findHookIndex(sessionEnd) !== -1;\n}\n\nexport function installHook(): { installed: boolean; alreadyInstalled: boolean } {\n const settings = readSettings();\n\n if (!settings.hooks) settings.hooks = {};\n if (!Array.isArray(settings.hooks.SessionEnd)) settings.hooks.SessionEnd = [];\n\n if (findHookIndex(settings.hooks.SessionEnd) !== -1) {\n return { installed: false, alreadyInstalled: true };\n }\n\n settings.hooks.SessionEnd.push({\n matcher: '',\n hooks: [{ type: 'command', command: HOOK_COMMAND }],\n });\n\n writeSettings(settings);\n return { installed: true, alreadyInstalled: false };\n}\n\nexport function removeHook(): { removed: boolean; notFound: boolean } {\n const settings = readSettings();\n const sessionEnd = settings.hooks?.SessionEnd;\n\n if (!Array.isArray(sessionEnd)) {\n return { removed: false, notFound: true };\n }\n\n const idx = findHookIndex(sessionEnd);\n if (idx === -1) {\n return { removed: false, notFound: true };\n }\n\n sessionEnd.splice(idx, 1);\n if (sessionEnd.length === 0) {\n delete settings.hooks!.SessionEnd;\n }\n if (settings.hooks && Object.keys(settings.hooks).length === 0) {\n delete settings.hooks;\n }\n\n writeSettings(settings);\n return { removed: true, notFound: false };\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { execSync } from 'child_process';\nimport { CALIBER_DIR } from '../constants.js';\n\nconst STATE_FILE = path.join(CALIBER_DIR, '.caliber-state.json');\n\ninterface CaliberState {\n lastRefreshSha: string;\n lastRefreshTimestamp: string;\n}\n\nexport function readState(): CaliberState | null {\n try {\n if (!fs.existsSync(STATE_FILE)) return null;\n return JSON.parse(fs.readFileSync(STATE_FILE, 'utf-8'));\n } catch {\n return null;\n }\n}\n\nexport function writeState(state: CaliberState): void {\n if (!fs.existsSync(CALIBER_DIR)) {\n fs.mkdirSync(CALIBER_DIR, { recursive: true });\n }\n fs.writeFileSync(STATE_FILE, JSON.stringify(state, null, 2));\n}\n\nexport function getCurrentHeadSha(): string | null {\n try {\n return execSync('git rev-parse HEAD', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n } catch {\n return null;\n }\n}\n","import type { Ora } from 'ora';\n\nexport const GENERATION_MESSAGES = [\n 'Analyzing your project structure and dependencies...',\n 'Mapping out build commands and test workflows...',\n 'Reviewing coding patterns and conventions...',\n 'Crafting permission rules for safe tool usage...',\n 'Designing skills tailored to your codebase...',\n 'Evaluating MCP server integrations...',\n 'Optimizing settings for your development workflow...',\n 'Building coding guidelines from your project style...',\n 'Setting up pre-commit hooks and quality gates...',\n 'Assembling your complete agent configuration...',\n];\n\nexport const REFINE_MESSAGES = [\n 'Applying your feedback to the configuration...',\n 'Adjusting coding guidelines...',\n 'Rebalancing permissions and tool settings...',\n 'Refining skills and workflows...',\n 'Updating rules to match your preferences...',\n 'Finalizing the revised setup...',\n];\n\nexport class SpinnerMessages {\n private spinner: Ora;\n private messages: string[];\n private index = 0;\n private timer: ReturnType<typeof setInterval> | null = null;\n\n constructor(spinner: Ora, messages: string[]) {\n this.spinner = spinner;\n this.messages = messages;\n }\n\n start(): void {\n this.index = 0;\n this.spinner.text = this.messages[0];\n this.timer = setInterval(() => {\n this.index = (this.index + 1) % this.messages.length;\n this.spinner.text = this.messages[this.index];\n }, 3000);\n }\n\n handleServerStatus(status: string): void {\n this.spinner.text = status;\n // Reset the timer so the server status displays for a full interval\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = setInterval(() => {\n this.index = (this.index + 1) % this.messages.length;\n this.spinner.text = this.messages[this.index];\n }, 3000);\n }\n }\n\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n }\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { undoSetup } from '../writers/index.js';\nimport { trackEvent } from '../telemetry.js';\n\nexport function undoCommand() {\n const spinner = ora('Reverting setup...').start();\n\n try {\n const { restored, removed } = undoSetup();\n\n if (restored.length === 0 && removed.length === 0) {\n spinner.info('Nothing to undo.');\n return;\n }\n\n spinner.succeed('Setup reverted successfully.\\n');\n trackEvent('setup_undone', { restored: restored.length, removed: removed.length });\n\n if (restored.length > 0) {\n console.log(chalk.cyan(' Restored from backup:'));\n for (const file of restored) {\n console.log(` ${chalk.green('↩')} ${file}`);\n }\n }\n\n if (removed.length > 0) {\n console.log(chalk.cyan(' Removed:'));\n for (const file of removed) {\n console.log(` ${chalk.red('✗')} ${file}`);\n }\n }\n\n console.log('');\n } catch (err) {\n spinner.fail(chalk.red(err instanceof Error ? err.message : 'Undo failed'));\n throw new Error('__exit__');\n }\n}\n","import chalk from 'chalk';\nimport fs from 'fs';\nimport { readManifest } from '../writers/manifest.js';\nimport { getStoredAuth } from '../auth/token-store.js';\nimport { collectFingerprint, computeFingerprintHash } from '../fingerprint/index.js';\nimport { apiRequest } from '../api/client.js';\nimport { scanLocalState, compareState, type ServerItem } from '../scanner/index.js';\n\nexport async function statusCommand(options: { json?: boolean }) {\n const auth = getStoredAuth();\n const manifest = readManifest();\n\n if (options.json) {\n console.log(JSON.stringify({\n authenticated: !!auth,\n email: auth?.email,\n manifest: manifest,\n }, null, 2));\n return;\n }\n\n console.log(chalk.bold('\\nCaliber Status\\n'));\n\n if (auth) {\n console.log(` Auth: ${chalk.green('Logged in')} as ${auth.email}`);\n } else {\n console.log(` Auth: ${chalk.yellow('Not logged in')}`);\n }\n\n if (!manifest) {\n console.log(` Setup: ${chalk.dim('No setup applied')}`);\n console.log(chalk.dim('\\n Run `caliber init` to get started.\\n'));\n return;\n }\n\n console.log(` Files managed: ${chalk.cyan(manifest.entries.length.toString())}`);\n for (const entry of manifest.entries) {\n const exists = fs.existsSync(entry.path);\n const icon = exists ? chalk.green('✓') : chalk.red('✗');\n console.log(` ${icon} ${entry.path} (${entry.action})`);\n }\n\n if (auth) {\n try {\n const fingerprint = collectFingerprint(process.cwd());\n const hash = computeFingerprintHash(fingerprint);\n const match = await apiRequest<{ project: { id: string } | null }>(\n '/api/projects/match',\n { method: 'POST', body: { fingerprintHash: hash } }\n );\n\n if (match?.project) {\n const serverItems = await apiRequest<ServerItem[]>(\n `/api/sync/project/${match.project.id}/items`\n );\n\n if (serverItems?.length) {\n const localItems = scanLocalState(process.cwd());\n const diff = compareState(serverItems, localItems);\n\n console.log(chalk.bold('\\n Sync'));\n console.log(` ${chalk.green('✓')} Installed: ${diff.installed.length}`);\n if (diff.missing.length) console.log(` ${chalk.red('✗')} Missing: ${diff.missing.length}`);\n if (diff.outdated.length) console.log(` ${chalk.yellow('~')} Outdated: ${diff.outdated.length}`);\n }\n }\n } catch {\n // sync info is non-critical\n }\n }\n\n console.log('');\n}\n","import fs from 'fs';\nimport path from 'path';\nimport crypto from 'crypto';\nimport os from 'os';\n\nexport interface LocalItem {\n type: 'mcp' | 'rule' | 'skill' | 'config';\n platform: 'claude' | 'cursor';\n name: string;\n contentHash: string;\n path: string;\n}\n\nexport interface PlatformDetection {\n claude: boolean;\n cursor: boolean;\n}\n\nexport function detectPlatforms(): PlatformDetection {\n const home = os.homedir();\n return {\n claude: fs.existsSync(path.join(home, '.claude')),\n cursor: fs.existsSync(getCursorConfigDir()),\n };\n}\n\nexport function scanLocalState(dir: string): LocalItem[] {\n const items: LocalItem[] = [];\n\n // Claude: CLAUDE.md\n const claudeMdPath = path.join(dir, 'CLAUDE.md');\n if (fs.existsSync(claudeMdPath)) {\n items.push({\n type: 'rule',\n platform: 'claude',\n name: 'CLAUDE.md',\n contentHash: hashFile(claudeMdPath),\n path: claudeMdPath,\n });\n }\n\n // Claude: .claude/settings.json\n const settingsPath = path.join(dir, '.claude', 'settings.json');\n if (fs.existsSync(settingsPath)) {\n items.push({\n type: 'config',\n platform: 'claude',\n name: 'settings.json',\n contentHash: hashFile(settingsPath),\n path: settingsPath,\n });\n }\n\n // Claude: .claude/skills/*.md\n const skillsDir = path.join(dir, '.claude', 'skills');\n if (fs.existsSync(skillsDir)) {\n for (const file of fs.readdirSync(skillsDir).filter(f => f.endsWith('.md'))) {\n const filePath = path.join(skillsDir, file);\n items.push({\n type: 'skill',\n platform: 'claude',\n name: file,\n contentHash: hashFile(filePath),\n path: filePath,\n });\n }\n }\n\n // Claude: .mcp.json mcpServers\n const mcpJsonPath = path.join(dir, '.mcp.json');\n if (fs.existsSync(mcpJsonPath)) {\n try {\n const mcpJson = JSON.parse(fs.readFileSync(mcpJsonPath, 'utf-8'));\n if (mcpJson.mcpServers) {\n for (const name of Object.keys(mcpJson.mcpServers)) {\n items.push({\n type: 'mcp',\n platform: 'claude',\n name,\n contentHash: hashContent(JSON.stringify(mcpJson.mcpServers[name])),\n path: mcpJsonPath,\n });\n }\n }\n } catch { /* ignore */ }\n }\n\n // Cursor: .cursorrules\n const cursorrulesPath = path.join(dir, '.cursorrules');\n if (fs.existsSync(cursorrulesPath)) {\n items.push({\n type: 'rule',\n platform: 'cursor',\n name: '.cursorrules',\n contentHash: hashFile(cursorrulesPath),\n path: cursorrulesPath,\n });\n }\n\n // Cursor: .cursor/rules/*.mdc\n const cursorRulesDir = path.join(dir, '.cursor', 'rules');\n if (fs.existsSync(cursorRulesDir)) {\n for (const file of fs.readdirSync(cursorRulesDir).filter(f => f.endsWith('.mdc'))) {\n const filePath = path.join(cursorRulesDir, file);\n items.push({\n type: 'rule',\n platform: 'cursor',\n name: file,\n contentHash: hashFile(filePath),\n path: filePath,\n });\n }\n }\n\n // Cursor: .cursor/mcp.json mcpServers\n const cursorMcpPath = path.join(dir, '.cursor', 'mcp.json');\n if (fs.existsSync(cursorMcpPath)) {\n try {\n const mcpJson = JSON.parse(fs.readFileSync(cursorMcpPath, 'utf-8'));\n if (mcpJson.mcpServers) {\n for (const name of Object.keys(mcpJson.mcpServers)) {\n items.push({\n type: 'mcp',\n platform: 'cursor',\n name,\n contentHash: hashContent(JSON.stringify(mcpJson.mcpServers[name])),\n path: cursorMcpPath,\n });\n }\n }\n } catch { /* ignore */ }\n }\n\n return items;\n}\n\nexport interface ServerItem {\n id: string;\n type: string;\n platform: string;\n name: string;\n content_hash: string;\n content: Record<string, unknown>;\n}\n\nexport function compareState(\n serverItems: ServerItem[],\n localItems: LocalItem[]\n) {\n const installed: Array<{ server: ServerItem; local: LocalItem }> = [];\n const missing: ServerItem[] = [];\n const outdated: Array<{ server: ServerItem; local: LocalItem }> = [];\n const extra: LocalItem[] = [];\n\n const localMap = new Map<string, LocalItem>();\n for (const item of localItems) {\n localMap.set(`${item.type}:${item.platform}:${item.name}`, item);\n }\n\n for (const server of serverItems) {\n const key = `${server.type}:${server.platform}:${server.name}`;\n const local = localMap.get(key);\n localMap.delete(key);\n\n if (!local) {\n missing.push(server);\n } else if (local.contentHash !== server.content_hash) {\n outdated.push({ server, local });\n } else {\n installed.push({ server, local });\n }\n }\n\n for (const local of localMap.values()) {\n extra.push(local);\n }\n\n return { installed, missing, outdated, extra };\n}\n\nfunction hashFile(filePath: string): string {\n const content = fs.readFileSync(filePath);\n return crypto.createHash('sha256').update(content).digest('hex');\n}\n\nfunction hashContent(content: string): string {\n return crypto.createHash('sha256').update(JSON.stringify({ text: content })).digest('hex');\n}\n\nfunction getCursorConfigDir(): string {\n const home = os.homedir();\n if (process.platform === 'darwin') {\n return path.join(home, 'Library', 'Application Support', 'Cursor');\n }\n if (process.platform === 'win32') {\n return path.join(home, 'AppData', 'Roaming', 'Cursor');\n }\n return path.join(home, '.config', 'Cursor');\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { getStoredAuth } from '../auth/token-store.js';\nimport { collectFingerprint, computeFingerprintHash } from '../fingerprint/index.js';\nimport { apiStream } from '../api/client.js';\nimport { writeSetup } from '../writers/index.js';\nimport { readManifest } from '../writers/manifest.js';\nimport readline from 'readline';\nimport { trackEvent } from '../telemetry.js';\nimport { SpinnerMessages, GENERATION_MESSAGES } from '../utils/spinner-messages.js';\n\nexport async function updateCommand(options: { dryRun?: boolean }) {\n const auth = getStoredAuth();\n if (!auth) {\n console.log(chalk.red('Not logged in. Run `caliber login` first.'));\n throw new Error('__exit__');\n }\n\n const manifest = readManifest();\n if (!manifest) {\n console.log(chalk.yellow('No existing setup found. Run `caliber init` first.'));\n throw new Error('__exit__');\n }\n\n const spinner = ora('Re-analyzing project...').start();\n const fingerprint = collectFingerprint(process.cwd());\n spinner.succeed('Project re-analyzed');\n\n trackEvent('scan_completed', {\n languages: fingerprint.languages,\n frameworks: fingerprint.frameworks,\n has_existing_config: !!(fingerprint.existingConfigs.claudeMd || fingerprint.existingConfigs.cursorrules),\n has_claude_md: !!fingerprint.existingConfigs.claudeMd,\n has_claude_settings: !!fingerprint.existingConfigs.claudeSettings,\n has_cursorrules: !!fingerprint.existingConfigs.cursorrules,\n cursor_rules_count: fingerprint.existingConfigs.cursorRules?.length ?? 0,\n skills_count: fingerprint.existingConfigs.claudeSkills?.length ?? 0,\n file_count: fingerprint.fileTree.length,\n });\n\n let generatedSetup: Record<string, unknown> | null = null;\n\n trackEvent('generation_started', { target_agent: 'both' });\n\n const genSpinner = ora('Regenerating setup...').start();\n const genMessages = new SpinnerMessages(genSpinner, GENERATION_MESSAGES);\n genMessages.start();\n\n try {\n await apiStream(\n '/api/setups/generate',\n {\n fingerprint,\n targetAgent: 'both',\n },\n () => {},\n (payload) => { generatedSetup = payload.setup as Record<string, unknown>; },\n (error) => {\n genMessages.stop();\n trackEvent('error_occurred', { error_type: 'generation_failed', error_message: error, command: 'update' });\n genSpinner.fail(`Generation error: ${error}`);\n },\n (status) => { genMessages.handleServerStatus(status); }\n );\n } catch (err) {\n genMessages.stop();\n const msg = err instanceof Error ? err.message : 'Unknown error';\n trackEvent('error_occurred', { error_type: 'generation_request_failed', error_message: msg, command: 'update' });\n genSpinner.fail(`Regeneration failed: ${msg}`);\n throw new Error('__exit__');\n }\n\n genMessages.stop();\n\n if (!generatedSetup) {\n genSpinner.fail('Failed to regenerate setup.');\n throw new Error('__exit__');\n }\n\n genSpinner.succeed('Setup regenerated');\n\n if (options.dryRun) {\n console.log(chalk.yellow('\\n[Dry run] Would write:'));\n console.log(JSON.stringify(generatedSetup, null, 2));\n return;\n }\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const answer = await new Promise<string>((resolve) => {\n rl.question(chalk.cyan('\\n\\nApply updated setup? (y/n): '), resolve);\n });\n rl.close();\n\n if (answer.trim().toLowerCase() !== 'y') {\n trackEvent('update_declined');\n console.log(chalk.dim('Update cancelled.'));\n return;\n }\n\n const writeSpinner = ora('Updating config files...').start();\n const result = writeSetup(generatedSetup as Parameters<typeof writeSetup>[0]);\n writeSpinner.succeed('Config files updated');\n\n trackEvent('setup_updated', { files_written: result.written.length });\n\n for (const file of result.written) {\n console.log(` ${chalk.green('✓')} ${file}`);\n }\n console.log('');\n}\n\n","import chalk from 'chalk';\nimport { clearAuth, getStoredAuth } from '../auth/token-store.js';\nimport { trackEvent } from '../telemetry.js';\n\nexport function logoutCommand() {\n const auth = getStoredAuth();\n if (!auth) {\n console.log(chalk.dim('Not currently logged in.'));\n return;\n }\n\n clearAuth();\n trackEvent('logout');\n console.log(chalk.green('Logged out successfully.'));\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { apiRequest } from '../api/client.js';\nimport { getStoredAuth } from '../auth/token-store.js';\nimport { collectFingerprint, computeFingerprintHash } from '../fingerprint/index.js';\n\ninterface Recommendation {\n id: string;\n skill_name: string;\n skill_slug: string;\n score: number;\n reason: string;\n detected_technology: string;\n status: string;\n}\n\nexport async function recommendCommand(options: {\n generate?: boolean;\n status?: string;\n}) {\n const auth = getStoredAuth();\n if (!auth) {\n console.log(chalk.red('Not authenticated. Run `caliber login` first.'));\n throw new Error('__exit__');\n }\n\n const fingerprint = collectFingerprint(process.cwd());\n const hash = computeFingerprintHash(fingerprint);\n\n const match = await apiRequest<{ project: { id: string } | null }>(\n '/api/projects/match',\n { method: 'POST', body: { fingerprintHash: hash } }\n );\n\n if (!match?.project) {\n console.log(chalk.yellow('No project found. Run `caliber init` first.'));\n throw new Error('__exit__');\n }\n\n const projectId = match.project.id;\n\n if (options.generate) {\n const spinner = ora('Detecting technologies and searching for skills...').start();\n try {\n const recs = await apiRequest<Recommendation[]>(\n `/api/recommendations/project/${projectId}/generate`,\n { method: 'POST' }\n );\n spinner.succeed(`Found ${recs?.length || 0} recommendations`);\n\n if (recs?.length) {\n console.log('');\n printRecommendations(recs);\n }\n } catch (err) {\n spinner.fail('Failed to generate recommendations');\n throw err;\n }\n return;\n }\n\n const statusFilter = options.status || 'pending';\n const recs = await apiRequest<Recommendation[]>(\n `/api/recommendations/project/${projectId}?status=${statusFilter}`\n );\n\n if (!recs?.length) {\n console.log(chalk.dim(`\\nNo ${statusFilter} recommendations. Run \\`caliber recommend --generate\\` to discover skills.\\n`));\n return;\n }\n\n printRecommendations(recs);\n}\n\nfunction printRecommendations(recs: Recommendation[]) {\n console.log(chalk.bold('\\n Skill Recommendations\\n'));\n console.log(\n ` ${chalk.dim('Name'.padEnd(30))} ${chalk.dim('Score'.padEnd(8))} ${chalk.dim('Technology'.padEnd(15))} ${chalk.dim('Status')}`\n );\n console.log(chalk.dim(' ' + '─'.repeat(70)));\n\n for (const rec of recs) {\n const scoreColor = rec.score >= 90 ? chalk.green : rec.score >= 70 ? chalk.blue : chalk.yellow;\n console.log(\n ` ${rec.skill_name.padEnd(30)} ${scoreColor(`${rec.score}%`.padEnd(8))} ${rec.detected_technology.padEnd(15)} ${rec.status}`\n );\n if (rec.reason) {\n console.log(` ${chalk.dim(rec.reason)}`);\n }\n }\n console.log('');\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { apiRequest } from '../api/client.js';\nimport { getStoredAuth } from '../auth/token-store.js';\nimport { collectFingerprint, computeFingerprintHash } from '../fingerprint/index.js';\n\ninterface HealthReport {\n id: string;\n score: number;\n grade: string;\n category_breakdown: Record<string, { count: number; tokens: number }>;\n recommendations: Array<{\n priority: string;\n action: string;\n description: string;\n }>;\n fix_plan?: {\n actions: Array<{ type: string; items: string[] }>;\n estimatedScoreImprovement: number;\n };\n}\n\ninterface FixResult {\n scoreBefore: number;\n scoreAfter: number;\n improvement: number;\n itemsRemoved: number;\n itemsConsolidated: number;\n itemsAdded: number;\n}\n\nexport async function healthCommand(options: { fix?: boolean; json?: boolean }) {\n const auth = getStoredAuth();\n if (!auth) {\n console.log(chalk.red('Not authenticated. Run `caliber login` first.'));\n throw new Error('__exit__');\n }\n\n const fingerprint = collectFingerprint(process.cwd());\n const hash = computeFingerprintHash(fingerprint);\n\n const match = await apiRequest<{ project: { id: string } | null }>(\n '/api/projects/match',\n { method: 'POST', body: { fingerprintHash: hash } }\n );\n\n if (!match?.project) {\n console.log(chalk.yellow('No project found. Run `caliber init` first.'));\n throw new Error('__exit__');\n }\n\n const projectId = match.project.id;\n\n const spinner = ora('Analyzing context health...').start();\n let report: HealthReport;\n try {\n report = await apiRequest<HealthReport>(\n `/api/context/project/${projectId}/analyze`,\n { method: 'POST' }\n );\n spinner.succeed('Analysis complete');\n } catch (err) {\n spinner.fail('Analysis failed');\n throw err;\n }\n\n if (options.json) {\n console.log(JSON.stringify(report, null, 2));\n return;\n }\n\n printReport(report);\n\n if (options.fix) {\n console.log(chalk.bold('\\nGenerating fix plan...'));\n const plan = await apiRequest<HealthReport['fix_plan']>(\n `/api/context/reports/${report.id}/fix-plan`,\n { method: 'POST', body: { projectId } }\n );\n\n if (!plan?.actions.length) {\n console.log(chalk.dim('No fixes needed.'));\n return;\n }\n\n console.log(chalk.bold('\\nProposed actions:'));\n for (const action of plan.actions) {\n const icon = action.type === 'remove' ? chalk.red('- ') : action.type === 'add' ? chalk.green('+ ') : chalk.yellow('~ ');\n console.log(` ${icon}${action.type}: ${action.items.join(', ')}`);\n }\n console.log(chalk.dim(`\\nEstimated improvement: +${plan.estimatedScoreImprovement} points`));\n\n const fixSpinner = ora('Executing fix plan...').start();\n try {\n const result = await apiRequest<FixResult>(\n `/api/context/reports/${report.id}/fix-execute`,\n { method: 'POST', body: { projectId } }\n );\n fixSpinner.succeed('Fix applied');\n\n console.log('');\n console.log(` Score: ${result.scoreBefore} → ${chalk.green(String(result.scoreAfter))} (${chalk.green(`+${result.improvement}`)})`);\n if (result.itemsRemoved) console.log(` Removed: ${result.itemsRemoved} items`);\n if (result.itemsConsolidated) console.log(` Consolidated: ${result.itemsConsolidated} items`);\n if (result.itemsAdded) console.log(` Added: ${result.itemsAdded} items`);\n console.log('');\n } catch (err) {\n fixSpinner.fail('Fix execution failed');\n throw err;\n }\n }\n}\n\nfunction printReport(report: HealthReport) {\n const gradeColors: Record<string, typeof chalk.green> = {\n A: chalk.green,\n B: chalk.blue,\n C: chalk.yellow,\n D: chalk.hex('#FFA500'),\n F: chalk.red,\n };\n const gradeColor = gradeColors[report.grade] || chalk.white;\n\n console.log(chalk.bold('\\n Context Health Report\\n'));\n console.log(` Grade: ${gradeColor(report.grade)} Score: ${gradeColor(String(report.score))}/100\\n`);\n\n if (Object.keys(report.category_breakdown).length) {\n console.log(chalk.dim(' Category Breakdown:'));\n const categories = Object.entries(report.category_breakdown);\n const maxCount = Math.max(...categories.map(([, v]) => v.count));\n\n for (const [name, data] of categories) {\n const barLen = maxCount > 0 ? Math.round((data.count / maxCount) * 20) : 0;\n const bar = '█'.repeat(barLen) + '░'.repeat(20 - barLen);\n console.log(` ${name.padEnd(12)} ${bar} ${data.count} items (${data.tokens} tokens)`);\n }\n console.log('');\n }\n\n if (report.recommendations.length) {\n console.log(chalk.dim(' Recommendations:'));\n for (const rec of report.recommendations) {\n const icon = rec.priority === 'high' ? chalk.red('!') : rec.priority === 'medium' ? chalk.yellow('~') : chalk.dim('-');\n console.log(` ${icon} ${rec.description}`);\n }\n console.log('');\n }\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { apiRequest } from '../api/client.js';\nimport { getStoredAuth } from '../auth/token-store.js';\nimport { collectFingerprint, computeFingerprintHash } from '../fingerprint/index.js';\nimport { scanLocalState, compareState, type ServerItem } from '../scanner/index.js';\nimport { writeSetup } from '../writers/index.js';\n\nexport async function syncCommand(options: {\n platform?: string;\n dryRun?: boolean;\n}) {\n const auth = getStoredAuth();\n if (!auth) {\n console.log(chalk.red('Not authenticated. Run `caliber login` first.'));\n throw new Error('__exit__');\n }\n\n const fingerprint = collectFingerprint(process.cwd());\n const hash = computeFingerprintHash(fingerprint);\n\n const match = await apiRequest<{ project: { id: string } | null }>(\n '/api/projects/match',\n { method: 'POST', body: { fingerprintHash: hash } }\n );\n\n if (!match?.project) {\n console.log(chalk.yellow('No project found. Run `caliber init` first.'));\n throw new Error('__exit__');\n }\n\n const projectId = match.project.id;\n\n const spinner = ora('Scanning local state...').start();\n const localItems = scanLocalState(process.cwd());\n spinner.text = 'Fetching server items...';\n\n const serverItems = await apiRequest<ServerItem[]>(\n `/api/sync/project/${projectId}/items`\n );\n spinner.succeed(`Found ${localItems.length} local items, ${serverItems?.length || 0} server items`);\n\n if (!serverItems?.length) {\n console.log(chalk.dim('\\nNo items configured on server. Run `caliber init` to set up your project.\\n'));\n return;\n }\n\n const platformFilter = options.platform;\n const filteredServer = platformFilter\n ? serverItems.filter(i => i.platform === platformFilter || i.platform === 'both')\n : serverItems;\n const filteredLocal = platformFilter\n ? localItems.filter(i => i.platform === platformFilter)\n : localItems;\n\n const diff = compareState(filteredServer, filteredLocal);\n\n printDiff(diff);\n\n if (diff.missing.length === 0 && diff.outdated.length === 0) {\n console.log(chalk.green('\\nAll items synced.\\n'));\n await reportToServer(projectId, filteredServer, diff);\n return;\n }\n\n if (options.dryRun) {\n console.log(chalk.dim('\\nDry run — no changes made.\\n'));\n return;\n }\n\n const installSpinner = ora('Installing missing and outdated items...').start();\n try {\n const setup = buildSetupFromItems([...diff.missing, ...diff.outdated.map(o => o.server)]);\n if (setup) {\n writeSetup(setup);\n }\n installSpinner.succeed('Items synced successfully');\n } catch (err) {\n installSpinner.fail('Sync failed');\n throw err;\n }\n\n await reportToServer(projectId, filteredServer, diff);\n}\n\nasync function reportToServer(\n projectId: string,\n serverItems: ServerItem[],\n diff: ReturnType<typeof compareState>\n) {\n const items = [\n ...diff.installed.map(i => ({\n itemId: i.server.id,\n state: 'installed' as const,\n localHash: i.local.contentHash,\n })),\n ...diff.missing.map(i => ({\n itemId: i.id,\n state: 'missing' as const,\n })),\n ...diff.outdated.map(i => ({\n itemId: i.server.id,\n state: 'outdated' as const,\n localHash: i.local.contentHash,\n })),\n ...diff.extra.map(i => ({\n itemId: i.name,\n state: 'extra' as const,\n localHash: i.contentHash,\n })),\n ];\n\n const platforms = new Set(serverItems.map(i => i.platform));\n for (const platform of platforms) {\n try {\n await apiRequest(`/api/sync/project/${projectId}/report`, {\n method: 'POST',\n body: {\n platform,\n items: items.filter(i => {\n const match = serverItems.find(s => s.id === i.itemId);\n return match?.platform === platform;\n }),\n },\n });\n } catch {\n // non-critical\n }\n }\n}\n\nfunction printDiff(diff: ReturnType<typeof compareState>) {\n console.log(chalk.bold('\\n Sync Status\\n'));\n\n if (diff.installed.length) {\n console.log(` ${chalk.green('✓')} Installed: ${diff.installed.length}`);\n }\n if (diff.missing.length) {\n console.log(` ${chalk.red('✗')} Missing: ${diff.missing.length}`);\n for (const item of diff.missing) {\n console.log(` ${chalk.red('-')} ${item.name} (${item.type}/${item.platform})`);\n }\n }\n if (diff.outdated.length) {\n console.log(` ${chalk.yellow('~')} Outdated: ${diff.outdated.length}`);\n for (const item of diff.outdated) {\n console.log(` ${chalk.yellow('~')} ${item.server.name} (${item.server.type}/${item.server.platform})`);\n }\n }\n if (diff.extra.length) {\n console.log(` ${chalk.dim('+')} Extra (local only): ${diff.extra.length}`);\n for (const item of diff.extra) {\n console.log(` ${chalk.dim('+')} ${item.name} (${item.type}/${item.platform})`);\n }\n }\n console.log('');\n}\n\nfunction buildSetupFromItems(items: ServerItem[]): Parameters<typeof writeSetup>[0] | null {\n if (!items.length) return null;\n\n const claude: Record<string, unknown> = {};\n const cursor: Record<string, unknown> = {};\n let hasAny = false;\n\n for (const item of items) {\n const content = item.content as Record<string, unknown>;\n\n if (item.platform === 'claude' || item.platform === 'both') {\n if (item.type === 'rule' && item.name === 'CLAUDE.md') {\n claude.claudeMd = content.text;\n hasAny = true;\n } else if (item.type === 'config' && item.name === 'settings.json') {\n claude.settings = content;\n hasAny = true;\n } else if (item.type === 'skill') {\n if (!claude.skills) claude.skills = [];\n (claude.skills as Array<{ name: string; content: string }>).push({\n name: item.name,\n content: (content.text as string) || '',\n });\n hasAny = true;\n } else if (item.type === 'mcp') {\n if (!claude.mcpServers) claude.mcpServers = {};\n (claude.mcpServers as Record<string, unknown>)[item.name] = content;\n hasAny = true;\n }\n }\n\n if (item.platform === 'cursor' || item.platform === 'both') {\n if (item.type === 'rule' && item.name === '.cursorrules') {\n cursor.cursorrules = content.text;\n hasAny = true;\n } else if (item.type === 'rule') {\n if (!cursor.rules) cursor.rules = [];\n (cursor.rules as Array<{ filename: string; content: string }>).push({\n filename: item.name,\n content: (content.text as string) || '',\n });\n hasAny = true;\n } else if (item.type === 'mcp') {\n if (!cursor.mcpServers) cursor.mcpServers = {};\n (cursor.mcpServers as Record<string, unknown>)[item.name] = content;\n hasAny = true;\n }\n }\n }\n\n if (!hasAny) return null;\n\n const hasClaude = Object.keys(claude).length > 0;\n const hasCursor = Object.keys(cursor).length > 0;\n\n return {\n targetAgent: hasClaude && hasCursor ? 'both' : hasClaude ? 'claude' : 'cursor',\n ...(hasClaude ? { claude: claude as never } : {}),\n ...(hasCursor ? { cursor: cursor as never } : {}),\n };\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { apiRequest } from '../api/client.js';\nimport { getStoredAuth } from '../auth/token-store.js';\nimport { collectFingerprint, computeFingerprintHash } from '../fingerprint/index.js';\nimport { scanLocalState, compareState, type ServerItem } from '../scanner/index.js';\n\nexport async function diffCommand(options: { platform?: string }) {\n const auth = getStoredAuth();\n if (!auth) {\n console.log(chalk.red('Not authenticated. Run `caliber login` first.'));\n throw new Error('__exit__');\n }\n\n const fingerprint = collectFingerprint(process.cwd());\n const hash = computeFingerprintHash(fingerprint);\n\n const match = await apiRequest<{ project: { id: string } | null }>(\n '/api/projects/match',\n { method: 'POST', body: { fingerprintHash: hash } }\n );\n\n if (!match?.project) {\n console.log(chalk.yellow('No project found. Run `caliber init` first.'));\n throw new Error('__exit__');\n }\n\n const projectId = match.project.id;\n\n const spinner = ora('Comparing local and server state...').start();\n const localItems = scanLocalState(process.cwd());\n const serverItems = await apiRequest<ServerItem[]>(\n `/api/sync/project/${projectId}/items`\n );\n spinner.stop();\n\n if (!serverItems?.length) {\n console.log(chalk.dim('\\nNo items configured on server.\\n'));\n return;\n }\n\n const platformFilter = options.platform;\n const filteredServer = platformFilter\n ? serverItems.filter(i => i.platform === platformFilter || i.platform === 'both')\n : serverItems;\n const filteredLocal = platformFilter\n ? localItems.filter(i => i.platform === platformFilter)\n : localItems;\n\n const diff = compareState(filteredServer, filteredLocal);\n\n console.log(chalk.bold('\\n Config Diff\\n'));\n\n if (diff.installed.length) {\n console.log(` ${chalk.green('✓')} In sync: ${diff.installed.length}`);\n }\n if (diff.missing.length) {\n console.log(` ${chalk.red('✗')} Missing locally: ${diff.missing.length}`);\n for (const item of diff.missing) {\n console.log(` ${chalk.red('-')} ${item.name} (${item.type}/${item.platform})`);\n }\n }\n if (diff.outdated.length) {\n console.log(` ${chalk.yellow('~')} Outdated: ${diff.outdated.length}`);\n for (const item of diff.outdated) {\n console.log(` ${chalk.yellow('~')} ${item.server.name} (${item.server.type}/${item.server.platform})`);\n }\n }\n if (diff.extra.length) {\n console.log(` ${chalk.dim('+')} Local only: ${diff.extra.length}`);\n for (const item of diff.extra) {\n console.log(` ${chalk.dim('+')} ${item.name} (${item.type}/${item.platform})`);\n }\n }\n\n if (diff.missing.length === 0 && diff.outdated.length === 0) {\n console.log(chalk.green('\\n Everything is in sync.\\n'));\n } else {\n console.log(chalk.dim('\\n Run `caliber sync` to apply changes.\\n'));\n }\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { getStoredAuth } from '../auth/token-store.js';\nimport { apiRequest } from '../api/client.js';\nimport { isGitRepo } from '../fingerprint/git.js';\nimport { readExistingConfigs } from '../fingerprint/existing-config.js';\nimport { collectDiff } from '../lib/git-diff.js';\nimport { readState, writeState, getCurrentHeadSha } from '../lib/state.js';\nimport { writeRefreshDocs } from '../writers/refresh.js';\nimport { collectFingerprint } from '../fingerprint/index.js';\nimport { trackEvent } from '../telemetry.js';\n\ninterface RefreshOptions {\n quiet?: boolean;\n dryRun?: boolean;\n}\n\ninterface RefreshResponse {\n updatedDocs: {\n claudeMd?: string | null;\n readmeMd?: string | null;\n cursorrules?: string | null;\n cursorRules?: Array<{ filename: string; content: string }> | null;\n claudeSkills?: Array<{ filename: string; content: string }> | null;\n };\n changesSummary: string;\n docsUpdated: string[];\n}\n\nfunction log(quiet: boolean, ...args: unknown[]) {\n if (!quiet) console.log(...args);\n}\n\nexport async function refreshCommand(options: RefreshOptions) {\n const quiet = !!options.quiet;\n\n try {\n const auth = getStoredAuth();\n if (!auth) {\n if (quiet) return;\n console.log(chalk.red('Not authenticated. Run `caliber login` first.'));\n throw new Error('__exit__');\n }\n\n if (!isGitRepo()) {\n if (quiet) return;\n console.log(chalk.red('Not inside a git repository.'));\n throw new Error('__exit__');\n }\n\n const state = readState();\n const lastSha = state?.lastRefreshSha ?? null;\n\n const diff = collectDiff(lastSha);\n const currentSha = getCurrentHeadSha();\n\n if (!diff.hasChanges) {\n if (currentSha) {\n writeState({ lastRefreshSha: currentSha, lastRefreshTimestamp: new Date().toISOString() });\n }\n log(quiet, chalk.dim('No changes since last refresh.'));\n return;\n }\n\n const spinner = quiet ? null : ora('Analyzing changes...').start();\n\n const existingDocs = readExistingConfigs(process.cwd());\n\n const fingerprint = collectFingerprint(process.cwd());\n const projectContext = {\n languages: fingerprint.languages,\n frameworks: fingerprint.frameworks,\n packageName: fingerprint.packageName,\n };\n\n const response = await apiRequest<RefreshResponse>('/api/setups/refresh', {\n method: 'POST',\n body: {\n diff: {\n committed: diff.committedDiff,\n staged: diff.stagedDiff,\n unstaged: diff.unstagedDiff,\n changedFiles: diff.changedFiles,\n summary: diff.summary,\n },\n existingDocs,\n projectContext,\n },\n });\n\n if (!response.docsUpdated || response.docsUpdated.length === 0) {\n spinner?.succeed('No doc updates needed');\n if (currentSha) {\n writeState({ lastRefreshSha: currentSha, lastRefreshTimestamp: new Date().toISOString() });\n }\n return;\n }\n\n if (options.dryRun) {\n spinner?.info('Dry run — would update:');\n for (const doc of response.docsUpdated) {\n console.log(` ${chalk.yellow('~')} ${doc}`);\n }\n if (response.changesSummary) {\n console.log(chalk.dim(`\\n ${response.changesSummary}`));\n }\n return;\n }\n\n const written = writeRefreshDocs(response.updatedDocs);\n spinner?.succeed(`Updated ${written.length} doc${written.length === 1 ? '' : 's'}`);\n\n for (const file of written) {\n log(quiet, ` ${chalk.green('✓')} ${file}`);\n }\n\n if (response.changesSummary) {\n log(quiet, chalk.dim(`\\n ${response.changesSummary}`));\n }\n\n if (currentSha) {\n writeState({ lastRefreshSha: currentSha, lastRefreshTimestamp: new Date().toISOString() });\n }\n\n trackEvent('refresh_completed', {\n docs_updated: written.length,\n changed_files: diff.changedFiles.length,\n });\n } catch (err) {\n if (err instanceof Error && err.message === '__exit__') throw err;\n if (quiet) return;\n const msg = err instanceof Error ? err.message : 'Unknown error';\n console.log(chalk.red(`Refresh failed: ${msg}`));\n throw new Error('__exit__');\n }\n}\n","import { execSync } from 'child_process';\n\nconst MAX_DIFF_BYTES = 100_000;\n\nconst DOC_PATTERNS = [\n 'CLAUDE.md',\n 'README.md',\n '.cursorrules',\n '.cursor/rules/',\n '.claude/skills/',\n];\n\nfunction excludeArgs(): string[] {\n return DOC_PATTERNS.flatMap(p => ['--', `:!${p}`]);\n}\n\nfunction safeExec(cmd: string): string {\n try {\n return execSync(cmd, {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n maxBuffer: 10 * 1024 * 1024,\n }).trim();\n } catch {\n return '';\n }\n}\n\nexport interface DiffResult {\n hasChanges: boolean;\n committedDiff: string;\n stagedDiff: string;\n unstagedDiff: string;\n changedFiles: string[];\n summary: string;\n}\n\nexport function collectDiff(lastSha: string | null): DiffResult {\n let committedDiff = '';\n let stagedDiff = '';\n let unstagedDiff = '';\n let changedFiles: string[] = [];\n\n if (lastSha) {\n committedDiff = safeExec(`git diff ${lastSha}..HEAD ${excludeArgs().join(' ')}`);\n const committedFiles = safeExec(`git diff --name-only ${lastSha}..HEAD`);\n if (committedFiles) {\n changedFiles.push(...committedFiles.split('\\n').filter(Boolean));\n }\n } else {\n committedDiff = safeExec('git log --oneline -20');\n }\n\n stagedDiff = safeExec(`git diff --cached ${excludeArgs().join(' ')}`);\n unstagedDiff = safeExec(`git diff ${excludeArgs().join(' ')}`);\n\n const stagedFiles = safeExec('git diff --cached --name-only');\n if (stagedFiles) {\n changedFiles.push(...stagedFiles.split('\\n').filter(Boolean));\n }\n const unstagedFiles = safeExec('git diff --name-only');\n if (unstagedFiles) {\n changedFiles.push(...unstagedFiles.split('\\n').filter(Boolean));\n }\n\n const untrackedFiles = safeExec('git ls-files --others --exclude-standard');\n if (untrackedFiles) {\n changedFiles.push(...untrackedFiles.split('\\n').filter(Boolean));\n }\n\n changedFiles = [...new Set(changedFiles)].filter(\n f => !DOC_PATTERNS.some(p => f === p || f.startsWith(p))\n );\n\n const totalSize = committedDiff.length + stagedDiff.length + unstagedDiff.length;\n if (totalSize > MAX_DIFF_BYTES) {\n const ratio = MAX_DIFF_BYTES / totalSize;\n committedDiff = committedDiff.slice(0, Math.floor(committedDiff.length * ratio));\n stagedDiff = stagedDiff.slice(0, Math.floor(stagedDiff.length * ratio));\n unstagedDiff = unstagedDiff.slice(0, Math.floor(unstagedDiff.length * ratio));\n }\n\n const hasChanges = !!(committedDiff || stagedDiff || unstagedDiff || changedFiles.length);\n\n const parts: string[] = [];\n if (changedFiles.length) parts.push(`${changedFiles.length} files changed`);\n if (committedDiff) parts.push('committed changes');\n if (stagedDiff) parts.push('staged changes');\n if (unstagedDiff) parts.push('unstaged changes');\n const summary = parts.join(', ') || 'no changes';\n\n return { hasChanges, committedDiff, stagedDiff, unstagedDiff, changedFiles, summary };\n}\n","import fs from 'fs';\nimport path from 'path';\n\ninterface RefreshDocs {\n claudeMd?: string | null;\n readmeMd?: string | null;\n cursorrules?: string | null;\n cursorRules?: Array<{ filename: string; content: string }> | null;\n claudeSkills?: Array<{ filename: string; content: string }> | null;\n}\n\nexport function writeRefreshDocs(docs: RefreshDocs): string[] {\n const written: string[] = [];\n\n if (docs.claudeMd) {\n fs.writeFileSync('CLAUDE.md', docs.claudeMd);\n written.push('CLAUDE.md');\n }\n\n if (docs.readmeMd) {\n fs.writeFileSync('README.md', docs.readmeMd);\n written.push('README.md');\n }\n\n if (docs.cursorrules) {\n fs.writeFileSync('.cursorrules', docs.cursorrules);\n written.push('.cursorrules');\n }\n\n if (docs.cursorRules) {\n const rulesDir = path.join('.cursor', 'rules');\n if (!fs.existsSync(rulesDir)) fs.mkdirSync(rulesDir, { recursive: true });\n for (const rule of docs.cursorRules) {\n const filePath = path.join(rulesDir, rule.filename);\n fs.writeFileSync(filePath, rule.content);\n written.push(filePath);\n }\n }\n\n if (docs.claudeSkills) {\n const skillsDir = path.join('.claude', 'skills');\n if (!fs.existsSync(skillsDir)) fs.mkdirSync(skillsDir, { recursive: true });\n for (const skill of docs.claudeSkills) {\n const filePath = path.join(skillsDir, skill.filename);\n fs.writeFileSync(filePath, skill.content);\n written.push(filePath);\n }\n }\n\n return written;\n}\n","import chalk from 'chalk';\nimport { isHookInstalled, installHook, removeHook } from '../lib/hooks.js';\n\nexport async function hooksInstallCommand() {\n const result = installHook();\n if (result.alreadyInstalled) {\n console.log(chalk.dim('Hook already installed.'));\n return;\n }\n console.log(chalk.green('✓') + ' SessionEnd hook installed in .claude/settings.json');\n console.log(chalk.dim(' Docs will auto-refresh when Claude Code sessions end.'));\n}\n\nexport async function hooksRemoveCommand() {\n const result = removeHook();\n if (result.notFound) {\n console.log(chalk.dim('Hook not found.'));\n return;\n }\n console.log(chalk.green('✓') + ' SessionEnd hook removed from .claude/settings.json');\n}\n\nexport async function hooksStatusCommand() {\n const installed = isHookInstalled();\n if (installed) {\n console.log(chalk.green('✓') + ' Auto-refresh hook is ' + chalk.green('installed'));\n } else {\n console.log(chalk.dim('✗') + ' Auto-refresh hook is ' + chalk.yellow('not installed'));\n console.log(chalk.dim(' Run `caliber hooks install` to enable auto-refresh on session end.'));\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport readline from 'readline';\nimport { execSync } from 'child_process';\nimport chalk from 'chalk';\nimport ora from 'ora';\n\nconst __dirname_vc = path.dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(\n fs.readFileSync(path.resolve(__dirname_vc, '..', 'package.json'), 'utf-8')\n);\n\nfunction promptYesNo(question: string): Promise<boolean> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(chalk.cyan(`${question} `), (answer) => {\n rl.close();\n const normalized = answer.trim().toLowerCase();\n resolve(normalized === '' || normalized === 'y' || normalized === 'yes');\n });\n });\n}\n\nexport async function checkForUpdates(): Promise<void> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 2000);\n\n const res = await fetch('https://registry.npmjs.org/@caliber-ai/cli/latest', {\n signal: controller.signal,\n });\n clearTimeout(timeout);\n\n if (!res.ok) return;\n\n const data = (await res.json()) as { version?: string };\n const latest = data.version;\n if (!latest) return;\n\n const current = pkg.version as string;\n if (current === latest) return;\n\n const isInteractive = process.stdin.isTTY === true;\n\n if (!isInteractive) {\n console.log(\n chalk.yellow(\n `\\nUpdate available: ${current} -> ${latest}\\nRun ${chalk.bold('npm install -g @caliber-ai/cli')} to upgrade.\\n`\n )\n );\n return;\n }\n\n console.log(\n chalk.yellow(`\\nUpdate available: ${current} -> ${latest}`)\n );\n\n const shouldUpdate = await promptYesNo('Would you like to update now? (Y/n)');\n if (!shouldUpdate) {\n console.log();\n return;\n }\n\n const spinner = ora('Updating @caliber-ai/cli...').start();\n try {\n execSync('npm install -g @caliber-ai/cli --force', { stdio: 'pipe' });\n spinner.succeed(chalk.green(`Updated to ${latest}`));\n\n // Re-exec the original command with the new version\n const args = process.argv.slice(2);\n console.log(chalk.dim(`\\nRestarting: caliber ${args.join(' ')}\\n`));\n execSync(`caliber ${args.map((a) => JSON.stringify(a)).join(' ')}`, {\n stdio: 'inherit',\n });\n process.exit(0);\n } catch {\n spinner.fail('Update failed');\n console.log(\n chalk.yellow(\n `Run ${chalk.bold('npm install -g @caliber-ai/cli')} manually to upgrade.\\n`\n )\n );\n }\n } catch {\n // Silently ignore — offline, timeout, registry down, etc.\n }\n}\n","import { Sentry } from './lib/sentry.js';\nimport { program } from './cli.js';\nimport { getStoredAuth } from './auth/token-store.js';\nimport { isFirstRun, getDeviceId, trackEvent, identifyUser, shutdownTelemetry } from './telemetry.js';\nimport { checkForUpdates } from './utils/version-check.js';\n\nconst firstRun = isFirstRun();\ngetDeviceId();\nif (firstRun) {\n trackEvent('cli_installed');\n}\n\nconst auth = getStoredAuth();\nif (auth) {\n identifyUser(auth.userId, auth.email);\n Sentry.setUser({ id: auth.userId, email: auth.email });\n}\n\nawait checkForUpdates();\n\nasync function gracefulExit(code: number) {\n await Promise.all([\n shutdownTelemetry(),\n Sentry.flush(2000),\n ]);\n process.exit(code);\n}\n\nprocess.on('SIGINT', () => gracefulExit(130));\nprocess.on('SIGTERM', () => gracefulExit(143));\n\nprogram.parseAsync()\n .catch((err) => {\n const msg = err instanceof Error ? err.message : 'Unexpected error';\n if (msg !== '__exit__') {\n console.error(msg);\n Sentry.captureException(err, { tags: { command: process.argv[2] || 'unknown' } });\n }\n trackEvent('error_occurred', { error_type: 'cli_crash', error_message: msg, command: process.argv[2] || 'unknown' });\n process.exitCode = 1;\n })\n .finally(() => gracefulExit(Number(process.exitCode ?? 0)));\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAAOA,WAAU;AACjB,OAAOC,SAAQ;AADf,IAGa,SACA,cACA,mBACA,UACA,WACA,aACA,eACA;AAVb;AAAA;AAAA;AAGO,IAAM,UAAU,QAAQ,IAAI,mBAAmB;AAC/C,IAAM,eAAe,QAAQ,IAAI,wBAAwB;AACzD,IAAM,oBAAoB;AAC1B,IAAM,WAAWD,MAAK,KAAKC,IAAG,QAAQ,GAAG,UAAU;AACnD,IAAM,YAAYD,MAAK,KAAK,UAAU,WAAW;AACjD,IAAM,cAAc;AACpB,IAAM,gBAAgBA,MAAK,KAAK,aAAa,eAAe;AAC5D,IAAM,cAAcA,MAAK,KAAK,aAAa,SAAS;AAAA;AAAA;;;ACV3D,YAAY,YAAY;AACxB,OAAO,QAAQ;AACf,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAE9B,IAAM,MAAM,QAAQ,IAAI,sBAAsB;AAE9C,IAAM,YAAY,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAC7D,IAAM,MAAM,KAAK;AAAA,EACf,GAAG,aAAa,KAAK,QAAQ,WAAW,MAAM,cAAc,GAAG,OAAO;AACxE;AAEA,IAAI,KAAK;AACP,EAAO,YAAK;AAAA,IACV;AAAA,IACA,SAAS,eAAe,IAAI,OAAO;AAAA,IACnC,aAAa,QAAQ,IAAI,YAAY;AAAA,IACrC,kBAAkB;AAAA,IAClB,WAAW,OAAO;AAChB,YAAM,OAAO,EAAE,GAAG,MAAM,MAAM,QAAQ,OAAO,IAAI,GAAG,SAAS,EAAE;AAC/D,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACH;;;ACxBA,SAAS,eAAe;AACxB,OAAOE,UAAQ;AACf,OAAOC,YAAU;AACjB,SAAS,iBAAAC,sBAAqB;;;ACH9B,OAAOC,YAAW;AAClB,OAAOC,UAAS;AAChB,OAAO,cAAc;AACrB,OAAOC,UAAQ;;;ACDf;AAFA,OAAOC,SAAQ;AAYR,SAAS,gBAAmC;AACjD,MAAI;AACF,QAAI,CAACA,IAAG,WAAW,SAAS,EAAG,QAAO;AACtC,UAAM,OAAO,KAAK,MAAMA,IAAG,aAAa,WAAW,OAAO,CAAC;AAC3D,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,UAAUC,OAKvB;AACD,MAAI,CAACD,IAAG,WAAW,QAAQ,GAAG;AAC5B,IAAAA,IAAG,UAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,EAC5C;AAEA,QAAM,OAAmB;AAAA,IACvB,aAAaC,MAAK;AAAA,IAClB,cAAcA,MAAK;AAAA,IACnB,WAAW,KAAK,IAAI,IAAIA,MAAK,YAAY;AAAA,IACzC,QAAQA,MAAK,KAAK;AAAA,IAClB,OAAOA,MAAK,KAAK;AAAA,EACnB;AAEA,EAAAD,IAAG,cAAc,WAAW,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,EAAE,MAAM,IAAM,CAAC;AAC5E;AAEO,SAAS,YAAY;AAC1B,MAAI;AACF,QAAIA,IAAG,WAAW,SAAS,EAAG,CAAAA,IAAG,WAAW,SAAS;AAAA,EACvD,QAAQ;AAAA,EAER;AACF;AAEO,SAAS,iBAA0B;AACxC,QAAMC,QAAO,cAAc;AAC3B,MAAI,CAACA,MAAM,QAAO;AAClB,SAAO,KAAK,IAAI,KAAKA,MAAK,YAAY;AACxC;;;ACvDA,OAAO,UAAU;AACjB,OAAO,SAAS;AAChB,OAAO,WAAW;;;ACFlB,OAAO,YAAY;AAEZ,SAAS,eAAe;AAC7B,QAAM,WAAW,OAAO,YAAY,EAAE,EAAE,SAAS,WAAW;AAC5D,QAAM,YAAY,OACf,WAAW,QAAQ,EACnB,OAAO,QAAQ,EACf,OAAO,WAAW;AACrB,QAAM,QAAQ,OAAO,YAAY,EAAE,EAAE,SAAS,KAAK;AAEnD,SAAO,EAAE,UAAU,WAAW,MAAM;AACtC;;;ACTA;AAFA,OAAO,UAAU;AACjB,SAAS,WAAW;AAab,SAAS,oBAAoB,eAAgD;AAClF,SAAO,IAAI,QAAQ,CAACC,UAAS,WAAW;AACtC,UAAM,SAAS,KAAK,aAAa,CAAC,KAAK,QAAQ;AAC7C,UAAI,CAAC,IAAI,KAAK,WAAW,WAAW,GAAG;AACrC,YAAI,UAAU,GAAG;AACjB,YAAI,IAAI;AACR;AAAA,MACF;AAEA,YAAM,MAAM,IAAI,IAAI,IAAI,KAAK,oBAAoB,iBAAiB,EAAE;AACpE,YAAM,QAAQ,IAAI,aAAa,IAAI,OAAO;AAE1C,UAAI,OAAO;AACT,YAAI,UAAU,KAAK,EAAE,gBAAgB,YAAY,CAAC;AAClD,YAAI,IAAI,wFAAwF;AAChG,eAAO,MAAM;AACb,eAAO,IAAI,MAAM,gBAAgB,KAAK,EAAE,CAAC;AACzC;AAAA,MACF;AAEA,YAAM,QAAQ,IAAI,aAAa,IAAI,OAAO;AAC1C,YAAM,cAAc,IAAI,aAAa,IAAI,cAAc;AACvD,YAAM,eAAe,IAAI,aAAa,IAAI,eAAe;AACzD,YAAM,YAAY,IAAI,aAAa,IAAI,YAAY;AACnD,YAAM,SAAS,IAAI,aAAa,IAAI,SAAS;AAC7C,YAAM,QAAQ,IAAI,aAAa,IAAI,OAAO;AAE1C,UAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,UAAU,UAAU,eAAe;AACvE,YAAI,UAAU,KAAK,EAAE,gBAAgB,YAAY,CAAC;AAClD,YAAI,IAAI,qDAAqD;AAC7D,eAAO,MAAM;AACb,eAAO,IAAI,MAAM,wDAAwD,CAAC;AAC1E;AAAA,MACF;AAEA,UAAI,UAAU,KAAK,EAAE,gBAAgB,YAAY,CAAC;AAClD,UAAI,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,qBAKO;AAEf,aAAO,MAAM;AACb,MAAAA,SAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA,WAAW,SAAS,aAAa,QAAQ,EAAE;AAAA,QAC3C,MAAM,EAAE,IAAI,QAAQ,OAAO,SAAS,GAAG;AAAA,MACzC,CAAC;AAAA,IACH,CAAC;AAED,WAAO,OAAO,mBAAmB,aAAa,MAAM;AAAA,IAEpD,CAAC;AAED,WAAO,GAAG,SAAS,CAAC,QAAQ;AAC1B,aAAO,IAAI,MAAM,oCAAoC,IAAI,OAAO,EAAE,CAAC;AAAA,IACrE,CAAC;AAED,eAAW,MAAM;AACf,aAAO,MAAM;AACb,aAAO,IAAI,MAAM,0BAA0B,CAAC;AAAA,IAC9C,GAAG,IAAI,KAAK,GAAI;AAAA,EAClB,CAAC;AACH;;;AFzEA;;;AGAA;AANA,SAAS,eAAe;AACxB,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAOC,SAAQ;AACf,SAAS,kBAAkB;AAC3B,SAAS,iBAAAC,sBAAqB;AAI9B,IAAM,kBAAkB,QAAQ,IAAI,uBAAuB;AAC3D,IAAM,iBAAiBC,MAAK,KAAK,UAAU,WAAW;AAEtD,IAAI,SAAyB;AAE7B,SAAS,YAAqB;AAC5B,MAAI,CAAC,QAAQ;AACX,aAAS,IAAI,QAAQ,iBAAiB,EAAE,SAAS,GAAG,eAAe,EAAE,CAAC;AAAA,EACxE;AACA,SAAO;AACT;AAEO,SAAS,cAAsB;AACpC,MAAI;AACF,QAAIC,IAAG,WAAW,cAAc,GAAG;AACjC,aAAOA,IAAG,aAAa,gBAAgB,OAAO,EAAE,KAAK;AAAA,IACvD;AAAA,EACF,QAAQ;AAAA,EAAC;AAET,QAAM,KAAK,WAAW;AACtB,MAAI;AACF,QAAI,CAACA,IAAG,WAAW,QAAQ,GAAG;AAC5B,MAAAA,IAAG,UAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,IAC5C;AACA,IAAAA,IAAG,cAAc,gBAAgB,IAAI,EAAE,MAAM,IAAM,CAAC;AAAA,EACtD,QAAQ;AAAA,EAAC;AACT,SAAO;AACT;AAEO,SAAS,aAAsB;AACpC,SAAO,CAACA,IAAG,WAAW,cAAc;AACtC;AAEO,SAAS,gBAAwB;AACtC,QAAMC,QAAO,cAAc;AAC3B,SAAOA,OAAM,UAAU,YAAY;AACrC;AAEA,IAAM,sBAAsBF,MAAK,QAAQG,eAAc,YAAY,GAAG,CAAC;AACvE,IAAMC,OAAM,KAAK;AAAA,EACfH,IAAG,aAAaD,MAAK,QAAQ,qBAAqB,MAAM,cAAc,GAAG,OAAO;AAClF;AAEA,SAAS,iBAAiB;AACxB,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,aAAaI,KAAI;AAAA,IACjB,IAAIC,IAAG,SAAS;AAAA,EAClB;AACF;AAEO,SAAS,WAAW,OAAe,aAAsC,CAAC,GAAG;AAClF,MAAI;AACF,cAAU,EAAE,QAAQ;AAAA,MAClB,YAAY,cAAc;AAAA,MAC1B;AAAA,MACA,YAAY,EAAE,GAAG,eAAe,GAAG,GAAG,WAAW;AAAA,IACnD,CAAC;AAAA,EACH,QAAQ;AAAA,EAAC;AACX;AAEO,SAAS,aAAa,QAAgB,OAAe;AAC1D,MAAI;AACF,UAAM,KAAK,UAAU;AACrB,UAAM,WAAW,YAAY;AAE7B,OAAG,SAAS,EAAE,YAAY,QAAQ,YAAY,EAAE,OAAO,QAAQ,MAAM,EAAE,CAAC;AAExE,QAAI,aAAa,QAAQ;AACvB,SAAG,MAAM,EAAE,YAAY,QAAQ,OAAO,SAAS,CAAC;AAAA,IAClD;AAAA,EACF,QAAQ;AAAA,EAAC;AACX;AAEA,eAAsB,oBAAoB;AACxC,MAAI;AACF,UAAM,QAAQ,KAAK;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,IAAI,QAAQ,CAACC,aAAY,WAAWA,UAAS,GAAI,CAAC;AAAA,IACpD,CAAC;AAAA,EACH,QAAQ;AAAA,EAAC;AACX;;;AHjFA,eAAsB,eAAe;AACnC,QAAM,WAAW,cAAc;AAC/B,MAAI,UAAU;AACZ,YAAQ,IAAI,MAAM,IAAI,wBAAwB,SAAS,KAAK,EAAE,CAAC;AAC/D,YAAQ,IAAI,MAAM,IAAI,gDAAgD,CAAC;AACvE;AAAA,EACF;AAEA,QAAM,EAAE,MAAM,IAAI,aAAa;AAC/B,QAAM,cAAc,oBAAoB,iBAAiB;AAEzD,QAAM,UAAU,GAAG,YAAY,0BAA0B,mBAAmB,WAAW,CAAC,UAAU,KAAK;AAEvG,UAAQ,IAAI,MAAM,KAAK,2CAA2C,CAAC;AACnE,UAAQ,IAAI,MAAM,IAAI;AAAA,EAAwC,OAAO;AAAA,CAAI,CAAC;AAE1E,QAAM,gBAAgB,oBAAoB,KAAK;AAE/C,QAAM,KAAK,OAAO;AAElB,QAAM,UAAU,IAAI,+BAA+B,EAAE,MAAM;AAE3D,MAAI;AACF,UAAM,SAAS,MAAM;AAErB,cAAU;AAAA,MACR,aAAa,OAAO;AAAA,MACpB,cAAc,OAAO;AAAA,MACrB,WAAW,OAAO;AAAA,MAClB,MAAM,OAAO;AAAA,IACf,CAAC;AAED,iBAAa,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK;AAC9C,eAAW,UAAU,EAAE,QAAQ,WAAW,CAAC;AAE3C,YAAQ,QAAQ,MAAM,MAAM,gBAAgB,OAAO,KAAK,KAAK,EAAE,CAAC;AAAA,EAClE,SAAS,KAAK;AACZ,eAAW,kBAAkB,EAAE,YAAY,eAAe,eAAe,eAAe,QAAQ,IAAI,UAAU,iBAAiB,SAAS,QAAQ,CAAC;AACjJ,YAAQ,KAAK,MAAM,IAAI,0BAA0B,eAAe,QAAQ,IAAI,UAAU,eAAe,EAAE,CAAC;AACxG,UAAM,IAAI,MAAM,UAAU;AAAA,EAC5B;AACF;;;AIlDA,OAAOC,aAAY;;;ACAnB,SAAS,gBAAgB;AACzB,SAAS,kBAAkB;AAC3B,SAAS,SAAS,eAAe;AAEjC,SAAS,kBAA2B;AAClC,MAAI,MAAM,QAAQ,IAAI;AACtB,SAAO,MAAM;AACX,QAAI,WAAW,QAAQ,KAAK,MAAM,CAAC,EAAG,QAAO;AAC7C,UAAM,SAAS,QAAQ,GAAG;AAC1B,QAAI,WAAW,IAAK,QAAO;AAC3B,UAAM;AAAA,EACR;AACF;AAEO,SAAS,kBAAsC;AACpD,MAAI,CAAC,gBAAgB,EAAG,QAAO;AAC/B,MAAI;AACF,WAAO,SAAS,6BAA6B,EAAE,UAAU,SAAS,OAAO,CAAC,QAAQ,QAAQ,MAAM,EAAE,CAAC,EAAE,KAAK;AAAA,EAC5G,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,YAAqB;AACnC,SAAO,gBAAgB;AACzB;;;ACzBA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,SAAS,gBAAgB;AAQzB,IAAM,sBAA8C;AAAA,EAClD,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,SAAS;AAAA,EACT,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,eAAe;AAAA,EACf,yBAAyB;AAAA,EACzB,UAAU;AAAA,EACV,SAAS;AAAA,EACT,WAAW;AAAA,EACX,eAAe;AACjB;AAEA,IAAM,wBAAgD;AAAA,EACpD,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,WAAW;AAAA,EACX,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,uBAAuB;AAAA,EACvB,QAAQ;AAAA,EACR,OAAO;AACT;AAEA,IAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,qBAAqB,SAA2B;AACvD,MAAI;AACF,UAAMC,OAAM,KAAK,MAAMF,IAAG,aAAa,SAAS,OAAO,CAAC;AACxD,UAAM,UAAU,EAAE,GAAGE,KAAI,cAAc,GAAGA,KAAI,gBAAgB;AAC9D,UAAM,aAAuB,CAAC;AAC9B,eAAW,CAAC,KAAK,SAAS,KAAK,OAAO,QAAQ,mBAAmB,GAAG;AAClE,UAAI,QAAQ,GAAG,EAAG,YAAW,KAAK,SAAS;AAAA,IAC7C;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,uBAAuB,KAAuB;AACrD,QAAM,aAAuB,CAAC;AAC9B,QAAM,aAAa;AAAA,IACjBD,MAAK,KAAK,KAAK,gBAAgB;AAAA,IAC/BA,MAAK,KAAK,KAAK,kBAAkB;AAAA,IACjC,GAAG,SAAS,yBAAyB,EAAE,KAAK,KAAK,UAAU,KAAK,CAAC;AAAA,IACjE,GAAG,SAAS,2BAA2B,EAAE,KAAK,KAAK,UAAU,KAAK,CAAC;AAAA,IACnE,GAAG,SAAS,6BAA6B,EAAE,KAAK,KAAK,UAAU,KAAK,CAAC;AAAA,EACvE;AAEA,aAAW,YAAY,YAAY;AACjC,QAAI,CAACD,IAAG,WAAW,QAAQ,EAAG;AAC9B,QAAI;AACF,YAAM,UAAUA,IAAG,aAAa,UAAU,OAAO,EAAE,YAAY;AAC/D,iBAAW,CAAC,KAAK,SAAS,KAAK,OAAO,QAAQ,qBAAqB,GAAG;AACpE,YAAI,QAAQ,SAAS,GAAG,EAAG,YAAW,KAAK,SAAS;AAAA,MACtD;AAAA,IACF,QAAQ;AAAA,IAAC;AAAA,EACX;AAEA,SAAO;AACT;AAEO,SAAS,mBAAmB,KAA0B;AAC3D,QAAM,cAAcC,MAAK,KAAK,KAAK,cAAc;AACjD,MAAI;AACJ,QAAM,gBAA0B,CAAC;AACjC,QAAM,YAAsB,CAAC;AAE7B,MAAID,IAAG,WAAW,WAAW,GAAG;AAC9B,QAAI;AACF,YAAME,OAAM,KAAK,MAAMF,IAAG,aAAa,aAAa,OAAO,CAAC;AAC5D,aAAOE,KAAI;AACX,YAAM,UAAU,EAAE,GAAGA,KAAI,cAAc,GAAGA,KAAI,gBAAgB;AAE9D,oBAAc,KAAK,GAAG,qBAAqB,WAAW,CAAC;AAEvD,UAAI,QAAQ,cAAc,QAAQ,aAAa,GAAG;AAChD,kBAAU,KAAK,YAAY;AAAA,MAC7B;AACA,gBAAU,KAAK,YAAY;AAAA,IAC7B,QAAQ;AAAA,IAAC;AAAA,EACX;AAEA,aAAW,QAAQ,iBAAiB;AAClC,UAAM,UAAU,SAAS,MAAM,EAAE,KAAK,KAAK,UAAU,KAAK,CAAC;AAC3D,eAAW,WAAW,SAAS;AAC7B,oBAAc,KAAK,GAAG,qBAAqB,OAAO,CAAC;AACnD,UAAI;AACF,cAAMA,OAAM,KAAK,MAAMF,IAAG,aAAa,SAAS,OAAO,CAAC;AACxD,cAAM,OAAO,EAAE,GAAGE,KAAI,cAAc,GAAGA,KAAI,gBAAgB;AAC3D,YAAI,KAAK,cAAc,KAAK,aAAa,GAAG;AAC1C,oBAAU,KAAK,YAAY;AAAA,QAC7B;AAAA,MACF,QAAQ;AAAA,MAAC;AAAA,IACX;AAAA,EACF;AAEA,gBAAc,KAAK,GAAG,uBAAuB,GAAG,CAAC;AAEjD,SAAO;AAAA,IACL;AAAA,IACA,YAAY,CAAC,GAAG,IAAI,IAAI,aAAa,CAAC;AAAA,IACtC,WAAW,CAAC,GAAG,IAAI,IAAI,SAAS,CAAC;AAAA,EACnC;AACF;;;AC3IA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAEjB,IAAM,cAAc,oBAAI,IAAI;AAAA,EAC1B;AAAA,EAAgB;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAS;AAAA,EAClD;AAAA,EAAU;AAAA,EAAY;AAAA,EAAY;AAAA,EAAe;AAAA,EACjD;AAAA,EAAU;AACZ,CAAC;AAEM,SAAS,YAAY,KAAa,WAAW,GAAa;AAC/D,QAAM,QAAkB,CAAC;AACzB,OAAK,KAAK,IAAI,GAAG,UAAU,KAAK;AAChC,SAAO;AACT;AAEA,SAAS,KAAK,MAAc,KAAa,OAAe,UAAkB,QAAkB;AAC1F,MAAI,QAAQ,SAAU;AAEtB,QAAM,WAAWA,MAAK,KAAK,MAAM,GAAG;AACpC,MAAI;AACJ,MAAI;AACF,cAAUD,IAAG,YAAY,UAAU,EAAE,eAAe,KAAK,CAAC;AAAA,EAC5D,QAAQ;AACN;AAAA,EACF;AAEA,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,KAAK,WAAW,GAAG,KAAK,UAAU,KAAK,MAAM,YAAY,EAAG;AACtE,QAAI,YAAY,IAAI,MAAM,IAAI,EAAG;AAEjC,UAAM,UAAU,MAAM,GAAG,GAAG,IAAI,MAAM,IAAI,KAAK,MAAM;AAErD,QAAI,MAAM,YAAY,GAAG;AACvB,aAAO,KAAK,GAAG,OAAO,GAAG;AACzB,WAAK,MAAM,SAAS,QAAQ,GAAG,UAAU,MAAM;AAAA,IACjD,OAAO;AACL,aAAO,KAAK,OAAO;AAAA,IACrB;AAAA,EACF;AACF;;;ACvCA,OAAOE,WAAU;AAEjB,IAAM,cAAsC;AAAA,EAC1C,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AAAA,EACT,OAAO;AAAA,EACP,UAAU;AAAA,EACV,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,QAAQ;AACV;AAEO,SAAS,gBAAgB,UAA8B;AAC5D,QAAM,QAAQ,oBAAI,IAAY;AAE9B,aAAW,QAAQ,UAAU;AAC3B,UAAM,MAAMA,MAAK,QAAQ,IAAI,EAAE,YAAY;AAC3C,QAAI,YAAY,GAAG,GAAG;AACpB,YAAM,IAAI,YAAY,GAAG,CAAC;AAAA,IAC5B;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,KAAK;AAClB;;;ACpCA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAEV,SAAS,oBAAoB,KAAa;AAC/C,QAAM,UAOF,CAAC;AAGL,QAAM,eAAeA,MAAK,KAAK,KAAK,WAAW;AAC/C,MAAID,IAAG,WAAW,YAAY,GAAG;AAC/B,YAAQ,WAAWA,IAAG,aAAa,cAAc,OAAO;AAAA,EAC1D;AAGA,QAAM,eAAeC,MAAK,KAAK,KAAK,WAAW;AAC/C,MAAID,IAAG,WAAW,YAAY,GAAG;AAC/B,YAAQ,WAAWA,IAAG,aAAa,cAAc,OAAO;AAAA,EAC1D;AAGA,QAAM,qBAAqBC,MAAK,KAAK,KAAK,WAAW,eAAe;AACpE,MAAID,IAAG,WAAW,kBAAkB,GAAG;AACrC,QAAI;AACF,cAAQ,iBAAiB,KAAK,MAAMA,IAAG,aAAa,oBAAoB,OAAO,CAAC;AAAA,IAClF,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,QAAM,YAAYC,MAAK,KAAK,KAAK,WAAW,QAAQ;AACpD,MAAID,IAAG,WAAW,SAAS,GAAG;AAC5B,QAAI;AACF,YAAM,QAAQA,IAAG,YAAY,SAAS,EAAE,OAAO,OAAK,EAAE,SAAS,KAAK,CAAC;AACrE,cAAQ,eAAe,MAAM,IAAI,QAAM;AAAA,QACrC,UAAU;AAAA,QACV,SAASA,IAAG,aAAaC,MAAK,KAAK,WAAW,CAAC,GAAG,OAAO;AAAA,MAC3D,EAAE;AAAA,IACJ,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,QAAM,kBAAkBA,MAAK,KAAK,KAAK,cAAc;AACrD,MAAID,IAAG,WAAW,eAAe,GAAG;AAClC,YAAQ,cAAcA,IAAG,aAAa,iBAAiB,OAAO;AAAA,EAChE;AAGA,QAAM,iBAAiBC,MAAK,KAAK,KAAK,WAAW,OAAO;AACxD,MAAID,IAAG,WAAW,cAAc,GAAG;AACjC,QAAI;AACF,YAAM,QAAQA,IAAG,YAAY,cAAc,EAAE,OAAO,OAAK,EAAE,SAAS,MAAM,CAAC;AAC3E,cAAQ,cAAc,MAAM,IAAI,QAAM;AAAA,QACpC,UAAU;AAAA,QACV,SAASA,IAAG,aAAaC,MAAK,KAAK,gBAAgB,CAAC,GAAG,OAAO;AAAA,MAChE,EAAE;AAAA,IACJ,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AACT;;;ACtEA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAEjB,IAAMC,eAAc,oBAAI,IAAI;AAAA,EAC1B;AAAA,EAAgB;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAS;AAAA,EAClD;AAAA,EAAU;AAAA,EAAY;AAAA,EAAY;AAAA,EAAe;AAAA,EACjD;AAAA,EAAU;AACZ,CAAC;AAED,IAAM,oBAAoB,oBAAI,IAAI,CAAC,OAAO,QAAQ,OAAO,QAAQ,KAAK,CAAC;AAEvE,IAAM,oBAAoB,oBAAI,IAAI;AAAA,EAChC;AAAA,EAAc;AAAA,EAAsB;AAAA,EACpC;AAAA,EAAY;AAAA,EAAiB;AAAA,EAAkB;AAAA,EAC/C;AAAA,EAAkB;AAAA,EAAmB;AAAA,EACrC;AAAA,EAAkB;AAAA,EAAkB;AAAA,EACpC;AAAA,EAAqB;AAAA,EACrB;AAAA,EAAkB;AAAA,EAAkB;AAAA,EACpC;AAAA,EAAoB;AAAA,EAAoB;AAAA,EACxC;AAAA,EAAe;AAAA,EAAa;AAC9B,CAAC;AAED,IAAM,oBAA6D;AAAA,EACjE,EAAE,KAAK,qBAAqB,SAAS,WAAW;AAClD;AAEA,IAAM,eAAe;AACrB,IAAM,gBAAgB,KAAK,MAAM,eAAe,GAAG;AACnD,IAAM,gBAAgB,KAAK,MAAM,eAAe,GAAG;AAwB5C,SAAS,YAAY,KAA2B;AACrD,QAAM,cAAwB,CAAC;AAC/B,QAAM,cAAmC,CAAC;AAE1C,UAAQ,KAAK,IAAI,GAAG,IAAI,aAAa,aAAa,GAAG;AAErD,iBAAe,WAAW;AAE1B,MAAI,cAAc;AAClB,QAAM,iBAAsC,CAAC;AAC7C,aAAW,OAAO,aAAa;AAC7B,UAAM,OAAO,IAAI,KAAK,SAAS,IAAI,QAAQ;AAC3C,QAAI,cAAc,OAAO,cAAe;AACxC,mBAAe,KAAK,GAAG;AACvB,mBAAe;AAAA,EACjB;AAEA,MAAI,cAAc;AAClB,MAAI,YAAY;AAChB,QAAM,gBAA+B,CAAC;AAEtC,aAAW,WAAW,aAAa;AACjC,UAAM,WAAWD,MAAK,KAAK,KAAK,OAAO;AACvC,QAAI;AACJ,QAAI;AACF,gBAAUD,IAAG,aAAa,UAAU,OAAO;AAAA,IAC7C,QAAQ;AACN;AAAA,IACF;AAEA,UAAM,YAAY,QAAQ,MAAM,IAAI,EAAE;AACtC,QAAI,YAAY,IAAK;AAErB,UAAM,MAAMC,MAAK,QAAQ,OAAO;AAChC,UAAM,WAAW,gBAAgB,GAAG;AACpC,QAAI,CAAC,SAAU;AAEf,UAAM,UAAU,aAAa,OACzB,cAAc,SAAS,OAAO,IAC9B,4BAA4B,SAAS,SAAS,QAAQ;AAE1D,UAAM,cAAc,oBAAoB,OAAO;AAC/C,QAAI,cAAc,cAAc,eAAe;AAC7C,kBAAY;AACZ;AAAA,IACF;AAEA,kBAAc,KAAK,OAAO;AAC1B,mBAAe;AAAA,EACjB;AAEA,SAAO,EAAE,eAAe,aAAa,gBAAgB,UAAU;AACjE;AAEA,SAAS,QACP,MACA,KACA,OACA,UACA,aACA,aACA,SACA;AACA,MAAI,QAAQ,SAAU;AACtB,QAAM,WAAWA,MAAK,KAAK,MAAM,GAAG;AACpC,MAAI;AACJ,MAAI;AACF,cAAUD,IAAG,YAAY,UAAU,EAAE,eAAe,KAAK,CAAC;AAAA,EAC5D,QAAQ;AACN;AAAA,EACF;AAEA,aAAW,SAAS,SAAS;AAC3B,QAAIE,aAAY,IAAI,MAAM,IAAI,EAAG;AACjC,QAAI,MAAM,KAAK,WAAW,GAAG,KAAK,UAAU,KAAK,MAAM,YAAY,EAAG;AAEtE,UAAM,UAAU,MAAM,GAAG,GAAG,IAAI,MAAM,IAAI,KAAK,MAAM;AAErD,QAAI,MAAM,YAAY,GAAG;AACvB,YAAM,iBAAiB,kBAAkB;AAAA,QACvC,CAAC,MAAM,YAAY,EAAE,OAAO,QAAQ,SAAS,IAAI,EAAE,GAAG,EAAE;AAAA,MAC1D;AACA,UAAI,gBAAgB;AAClB,8BAAsB,MAAM,SAAS,eAAe,SAAS,WAAW;AAAA,MAC1E;AACA,cAAQ,MAAM,SAAS,QAAQ,GAAG,UAAU,aAAa,aAAa,OAAO;AAAA,IAC/E,OAAO;AACL,UAAI,kBAAkB,IAAI,MAAM,IAAI,GAAG;AACrC,YAAI;AACF,gBAAM,UAAUF,IAAG,aAAaC,MAAK,KAAK,MAAM,OAAO,GAAG,OAAO;AACjE,sBAAY,KAAK,EAAE,MAAM,SAAS,QAAQ,CAAC;AAAA,QAC7C,QAAQ;AAAA,QAAC;AAAA,MACX;AAEA,YAAM,MAAMA,MAAK,QAAQ,MAAM,IAAI;AACnC,UAAI,kBAAkB,IAAI,GAAG,KAAK,CAAC,MAAM,KAAK,SAAS,OAAO,GAAG;AAC/D,oBAAY,KAAK,OAAO;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,sBACP,MACA,QACA,SACA,aACA;AACA,QAAM,UAAUA,MAAK,KAAK,MAAM,MAAM;AACtC,MAAI;AACJ,MAAI;AACF,cAAUD,IAAG,YAAY,SAAS,EAAE,eAAe,KAAK,CAAC;AAAA,EAC3D,QAAQ;AACN;AAAA,EACF;AACA,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,OAAO,KAAK,QAAQ,KAAK,MAAM,IAAI,GAAG;AAC9C,YAAM,UAAU,GAAG,MAAM,IAAI,MAAM,IAAI;AACvC,UAAI;AACF,cAAM,UAAUA,IAAG,aAAaC,MAAK,KAAK,MAAM,OAAO,GAAG,OAAO;AACjE,oBAAY,KAAK,EAAE,MAAM,SAAS,QAAQ,CAAC;AAAA,MAC7C,QAAQ;AAAA,MAAC;AAAA,IACX;AAAA,EACF;AACF;AAEA,SAAS,eAAe,OAAiB;AACvC,QAAM,kBAAkB,oBAAI,IAAI,CAAC,YAAY,YAAY,WAAW,UAAU,UAAU,aAAa,WAAW,CAAC;AACjH,QAAM,eAAe;AACrB,QAAM,gBAAgB;AACtB,QAAM,iBAAiB;AACvB,QAAM,cAAc;AAEpB,WAAS,SAAS,UAA0B;AAC1C,UAAM,OAAOA,MAAK,SAAS,QAAQ;AACnC,QAAI,gBAAgB,IAAI,IAAI,EAAG,QAAO;AACtC,QAAI,aAAa,KAAK,QAAQ,EAAG,QAAO;AACxC,QAAI,cAAc,KAAK,QAAQ,EAAG,QAAO;AACzC,QAAI,eAAe,KAAK,QAAQ,EAAG,QAAO;AAC1C,QAAI,YAAY,KAAK,QAAQ,EAAG,QAAO;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,KAAK,CAAC,GAAG,MAAM,SAAS,CAAC,IAAI,SAAS,CAAC,CAAC;AAChD;AAEA,SAAS,gBAAgB,KAAwC;AAC/D,MAAI,QAAQ,SAAS,QAAQ,OAAQ,QAAO;AAC5C,MAAI,QAAQ,SAAS,QAAQ,OAAQ,QAAO;AAC5C,MAAI,QAAQ,MAAO,QAAO;AAC1B,SAAO;AACT;AAEA,SAAS,4BACP,UACA,SACA,UACa;AACb,QAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,QAAM,UAAoB,CAAC;AAC3B,QAAM,UAAoB,CAAC;AAC3B,QAAM,YAAsB,CAAC;AAC7B,QAAM,UAAoB,CAAC;AAC3B,QAAM,QAAkB,CAAC;AACzB,QAAM,SAAmB,CAAC;AAE1B,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,KAAK,KAAK;AAE1B,QAAI,aAAa,KAAK,OAAO,GAAG;AAC9B,cAAQ,KAAK,OAAO;AACpB;AAAA,IACF;AAEA,UAAM,cAAc,QAAQ;AAAA,MAC1B;AAAA,IACF;AACA,QAAI,aAAa;AACf,cAAQ,KAAK,GAAG,YAAY,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,EAAE;AAClD,UAAI,YAAY,CAAC,MAAM,QAAS,SAAQ,KAAK,YAAY,CAAC,CAAC;AAC3D,UAAI,YAAY,CAAC,MAAM,eAAe,YAAY,CAAC,MAAM,OAAQ,OAAM,KAAK,YAAY,CAAC,CAAC;AAC1F,UAAI,YAAY,CAAC,MAAM,WAAY,WAAU,KAAK,YAAY,CAAC,CAAC;AAChE;AAAA,IACF;AAEA,UAAM,UAAU,QAAQ,MAAM,gCAAgC;AAC9D,QAAI,WAAW,CAAC,QAAQ,WAAW,QAAQ,GAAG;AAC5C,gBAAU,KAAK,QAAQ,CAAC,CAAC;AACzB;AAAA,IACF;AAEA,UAAM,aAAa,QAAQ,MAAM,oDAAoD;AACrF,QAAI,cAAc,CAAC,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,WAAW,CAAC,CAAC,CAAC,GAAG;AACjE,gBAAU,KAAK,WAAW,CAAC,CAAC;AAAA,IAC9B;AAEA,UAAM,aAAa,QAAQ,MAAM,gBAAgB;AACjD,QAAI,cAAc,CAAC,QAAQ,WAAW,QAAQ,GAAG;AAC/C,cAAQ,KAAK,WAAW,CAAC,CAAC;AAC1B;AAAA,IACF;AAEA,UAAM,aAAa,QAAQ,MAAM,6BAA6B;AAC9D,QAAI,cAAc,CAAC,QAAQ,WAAW,QAAQ,GAAG;AAC/C,YAAM,KAAK,WAAW,CAAC,CAAC;AACxB;AAAA,IACF;AAEA,UAAM,aAAa,QAAQ;AAAA,MACzB;AAAA,IACF;AACA,QAAI,YAAY;AACd,aAAO,KAAK,GAAG,WAAW,CAAC,EAAE,YAAY,CAAC,IAAI,WAAW,CAAC,CAAC,EAAE;AAAA,IAC/D;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,UAAU,UAAU,SAAS,SAAS,WAAW,SAAS,OAAO,OAAO;AACzF;AAEA,SAAS,cAAc,UAAkB,SAA8B;AACrE,QAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,QAAM,UAAoB,CAAC;AAC3B,QAAM,YAAsB,CAAC;AAC7B,QAAM,UAAoB,CAAC;AAC3B,QAAM,SAAmB,CAAC;AAE1B,MAAI,WAAW;AACf,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,KAAK,KAAK;AAE1B,QAAI,aAAa,KAAK,OAAO,KAAK,WAAW,KAAK,OAAO,GAAG;AAC1D,cAAQ,KAAK,OAAO;AACpB;AAAA,IACF;AAEA,UAAM,WAAW,QAAQ,MAAM,4BAA4B;AAC3D,QAAI,UAAU;AACZ,gBAAU,KAAK,GAAG,SAAS,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,GAAG;AAAA,IACjD;AAEA,UAAM,aAAa,QAAQ,MAAM,gBAAgB;AACjD,QAAI,YAAY;AACd,cAAQ,KAAK,WAAW,CAAC,CAAC;AAAA,IAC5B;AAEA,UAAM,iBAAiB,SAAS;AAAA,MAC9B;AAAA,IACF;AACA,QAAI,kBAAkB,UAAU;AAC9B,aAAO,KAAK,GAAG,eAAe,CAAC,EAAE,YAAY,CAAC,IAAI,eAAe,CAAC,CAAC,EAAE;AAAA,IACvE;AAEA,UAAM,gBAAgB,QAAQ;AAAA,MAC5B;AAAA,IACF;AACA,QAAI,eAAe;AACjB,aAAO,KAAK,UAAU,cAAc,CAAC,CAAC,EAAE;AAAA,IAC1C;AAEA,eAAW;AAAA,EACb;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV;AAAA,IACA,SAAS,CAAC;AAAA,IACV;AAAA,IACA;AAAA,IACA,OAAO,CAAC;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,SAA8B;AACzD,SACE,QAAQ,KAAK,SACb,QAAQ,QAAQ,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,CAAC,IAChD,QAAQ,QAAQ,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,CAAC,IAChD,QAAQ,UAAU,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,CAAC,IAClD,QAAQ,QAAQ,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,CAAC,IAChD,QAAQ,MAAM,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,CAAC,IAC9C,QAAQ,OAAO,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,CAAC;AAEnD;;;AN3TO,SAAS,mBAAmB,KAA0B;AAC3D,QAAM,eAAe,gBAAgB;AACrC,QAAM,UAAU,mBAAmB,GAAG;AACtC,QAAM,WAAW,YAAY,GAAG;AAChC,QAAM,YAAY,gBAAgB,QAAQ;AAC1C,QAAM,kBAAkB,oBAAoB,GAAG;AAC/C,QAAM,eAAe,YAAY,GAAG;AAEpC,QAAM,YAAY,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,QAAQ,WAAW,GAAG,SAAS,CAAC,CAAC;AAEnE,SAAO;AAAA,IACL;AAAA,IACA,aAAa,QAAQ;AAAA,IACrB;AAAA,IACA,YAAY,QAAQ;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,uBAAuB,aAAkC;AACvE,QAAM,MAAM;AAAA,IACV,YAAY,gBAAgB;AAAA,IAC5B,YAAY,eAAe;AAAA,EAC7B,EAAE,KAAK,IAAI;AAEX,SAAOE,QAAO,WAAW,QAAQ,EAAE,OAAO,GAAG,EAAE,OAAO,KAAK;AAC7D;;;AOhDA;AAEA,eAAe,oBAA4C;AACzD,QAAMC,QAAO,cAAc;AAC3B,MAAI,CAACA,MAAM,QAAO;AAElB,MAAI;AACF,UAAM,OAAO,MAAM,MAAM,GAAG,OAAO,qBAAqB;AAAA,MACtD,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,cAAcA,MAAK,aAAa,CAAC;AAAA,IAC1D,CAAC;AAED,QAAI,CAAC,KAAK,GAAI,QAAO;AAErB,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,KAAK;AACjC,cAAU;AAAA,MACR,aAAa,KAAK;AAAA,MAClB,cAAc,KAAK;AAAA,MACnB,WAAW,KAAK;AAAA,MAChB,MAAM,EAAE,IAAIA,MAAK,QAAQ,OAAOA,MAAK,MAAM;AAAA,IAC7C,CAAC;AAED,WAAO,KAAK;AAAA,EACd,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,gBAAiC;AAC9C,QAAMA,QAAO,cAAc;AAC3B,MAAI,CAACA,OAAM;AACT,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AAEA,MAAI,CAAC,eAAe,EAAG,QAAOA,MAAK;AAEnC,QAAM,YAAY,MAAM,kBAAkB;AAC1C,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,0DAA0D;AAAA,EAC5E;AACA,SAAO;AACT;AAEA,eAAsB,WACpBC,QACA,UAGI,CAAC,GACO;AACZ,MAAI,QAAQ,MAAM,cAAc;AAEhC,MAAI,OAAO,MAAM,MAAM,GAAG,OAAO,GAAGA,MAAI,IAAI;AAAA,IAC1C,QAAQ,QAAQ,UAAU;AAAA,IAC1B,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,eAAe,UAAU,KAAK;AAAA,IAChC;AAAA,IACA,MAAM,QAAQ,OAAO,KAAK,UAAU,QAAQ,IAAI,IAAI;AAAA,EACtD,CAAC;AAED,MAAI,KAAK,WAAW,KAAK;AACvB,UAAM,YAAY,MAAM,kBAAkB;AAC1C,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,0DAA0D;AAAA,IAC5E;AACA,YAAQ;AACR,WAAO,MAAM,MAAM,GAAG,OAAO,GAAGA,MAAI,IAAI;AAAA,MACtC,QAAQ,QAAQ,UAAU;AAAA,MAC1B,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,UAAU,KAAK;AAAA,MAChC;AAAA,MACA,MAAM,QAAQ,OAAO,KAAK,UAAU,QAAQ,IAAI,IAAI;AAAA,IACtD,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,KAAK,IAAI;AACZ,UAAM,QAAQ,MAAM,KAAK,KAAK,EAAE,MAAM,OAAO,EAAE,OAAO,KAAK,WAAW,EAAE;AACxE,UAAM,IAAI,MAAM,MAAM,SAAS,cAAc,KAAK,MAAM,EAAE;AAAA,EAC5D;AAEA,QAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,SAAO,KAAK;AACd;AAQA,eAAsB,UACpBA,QACA,MACA,SACA,YACA,SACA,UACe;AACf,MAAI,QAAQ,MAAM,cAAc;AAEhC,MAAI,OAAO,MAAM,MAAM,GAAG,OAAO,GAAGA,MAAI,IAAI;AAAA,IAC1C,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,eAAe,UAAU,KAAK;AAAA,IAChC;AAAA,IACA,MAAM,KAAK,UAAU,IAAI;AAAA,EAC3B,CAAC;AAED,MAAI,KAAK,WAAW,KAAK;AACvB,UAAM,YAAY,MAAM,kBAAkB;AAC1C,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,0DAA0D;AAAA,IAC5E;AACA,YAAQ;AACR,WAAO,MAAM,MAAM,GAAG,OAAO,GAAGA,MAAI,IAAI;AAAA,MACtC,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,UAAU,KAAK;AAAA,MAChC;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,KAAK,MAAM,CAAC,KAAK,MAAM;AAC1B,UAAM,IAAI,MAAM,cAAc,KAAK,MAAM,EAAE;AAAA,EAC7C;AAEA,QAAM,SAAS,KAAK,KAAK,UAAU;AACnC,QAAM,UAAU,IAAI,YAAY;AAChC,MAAI,SAAS;AAEb,SAAO,MAAM;AACX,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,QAAI,KAAM;AAEV,cAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,UAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,aAAS,MAAM,IAAI,KAAK;AAExB,eAAW,QAAQ,OAAO;AACxB,UAAI,CAAC,KAAK,WAAW,QAAQ,EAAG;AAChC,YAAM,OAAO,KAAK,MAAM,CAAC;AACzB,UAAI,SAAS,SAAU;AAEvB,UAAI;AACF,cAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,YAAI,OAAO,SAAS,QAAS,SAAQ,OAAO,OAAO;AAAA,iBAC1C,OAAO,SAAS,YAAY,SAAU,UAAS,OAAO,OAAO;AAAA,iBAC7D,OAAO,SAAS,WAAY,YAAW,EAAE,OAAO,OAAO,OAAO,aAAa,OAAO,aAAa,KAAK,OAAO,IAAI,CAAC;AAAA,iBAChH,OAAO,SAAS,QAAS,SAAQ,OAAO,OAAO;AAAA,MAC1D,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF;;;ACjKA,OAAOC,UAAQ;;;ACAf,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAeV,SAAS,kBAAkB,QAAgC;AAChE,QAAM,UAAoB,CAAC;AAG3B,EAAAD,IAAG,cAAc,aAAa,OAAO,QAAQ;AAC7C,UAAQ,KAAK,WAAW;AAGxB,QAAM,YAAY;AAClB,MAAI,CAACA,IAAG,WAAW,SAAS,EAAG,CAAAA,IAAG,UAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAE1E,EAAAA,IAAG;AAAA,IACDC,MAAK,KAAK,WAAW,eAAe;AAAA,IACpC,KAAK,UAAU,OAAO,UAAU,MAAM,CAAC;AAAA,EACzC;AACA,UAAQ,KAAKA,MAAK,KAAK,WAAW,eAAe,CAAC;AAGlD,EAAAD,IAAG;AAAA,IACDC,MAAK,KAAK,WAAW,qBAAqB;AAAA,IAC1C,KAAK,UAAU,OAAO,eAAe,MAAM,CAAC;AAAA,EAC9C;AACA,UAAQ,KAAKA,MAAK,KAAK,WAAW,qBAAqB,CAAC;AAGxD,MAAI,OAAO,QAAQ,QAAQ;AACzB,UAAM,YAAYA,MAAK,KAAK,WAAW,QAAQ;AAC/C,QAAI,CAACD,IAAG,WAAW,SAAS,EAAG,CAAAA,IAAG,UAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAE1E,eAAW,SAAS,OAAO,QAAQ;AACjC,YAAM,WAAW,GAAG,MAAM,KAAK,QAAQ,gBAAgB,GAAG,EAAE,YAAY,CAAC;AACzE,YAAM,YAAYC,MAAK,KAAK,WAAW,QAAQ;AAC/C,MAAAD,IAAG,cAAc,WAAW,MAAM,OAAO;AACzC,cAAQ,KAAK,SAAS;AAAA,IACxB;AAAA,EACF;AAGA,MAAI,OAAO,cAAc,OAAO,KAAK,OAAO,UAAU,EAAE,SAAS,GAAG;AAClE,UAAM,YAAY,EAAE,YAAY,OAAO,WAAW;AAClD,IAAAA,IAAG,cAAc,aAAa,KAAK,UAAU,WAAW,MAAM,CAAC,CAAC;AAChE,YAAQ,KAAK,WAAW;AAAA,EAC1B;AAEA,SAAO;AACT;;;AC7DA,OAAOE,SAAQ;AACf,OAAOC,YAAU;AAQV,SAAS,kBAAkB,QAAgC;AAChE,QAAM,UAAoB,CAAC;AAG3B,MAAI,OAAO,aAAa;AACtB,IAAAD,IAAG,cAAc,gBAAgB,OAAO,WAAW;AACnD,YAAQ,KAAK,cAAc;AAAA,EAC7B;AAGA,MAAI,OAAO,OAAO,QAAQ;AACxB,UAAM,WAAWC,OAAK,KAAK,WAAW,OAAO;AAC7C,QAAI,CAACD,IAAG,WAAW,QAAQ,EAAG,CAAAA,IAAG,UAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AAExE,eAAW,QAAQ,OAAO,OAAO;AAC/B,YAAM,WAAWC,OAAK,KAAK,UAAU,KAAK,QAAQ;AAClD,MAAAD,IAAG,cAAc,UAAU,KAAK,OAAO;AACvC,cAAQ,KAAK,QAAQ;AAAA,IACvB;AAAA,EACF;AAGA,MAAI,OAAO,cAAc,OAAO,KAAK,OAAO,UAAU,EAAE,SAAS,GAAG;AAClE,UAAM,YAAY;AAClB,QAAI,CAACA,IAAG,WAAW,SAAS,EAAG,CAAAA,IAAG,UAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAE1E,UAAM,YAAY,EAAE,YAAY,OAAO,WAAW;AAClD,IAAAA,IAAG;AAAA,MACDC,OAAK,KAAK,WAAW,UAAU;AAAA,MAC/B,KAAK,UAAU,WAAW,MAAM,CAAC;AAAA,IACnC;AACA,YAAQ,KAAKA,OAAK,KAAK,WAAW,UAAU,CAAC;AAAA,EAC/C;AAEA,SAAO;AACT;;;AC1CA;AAFA,OAAOC,UAAQ;AACf,OAAOC,YAAU;AAGV,SAAS,aAAa,OAAyB;AACpD,QAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG;AAC/D,QAAM,YAAYA,OAAK,KAAK,aAAa,SAAS;AAElD,aAAW,QAAQ,OAAO;AACxB,QAAI,CAACD,KAAG,WAAW,IAAI,EAAG;AAE1B,UAAM,OAAOC,OAAK,KAAK,WAAW,IAAI;AACtC,UAAM,UAAUA,OAAK,QAAQ,IAAI;AACjC,QAAI,CAACD,KAAG,WAAW,OAAO,GAAG;AAC3B,MAAAA,KAAG,UAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,IAC3C;AACA,IAAAA,KAAG,aAAa,MAAM,IAAI;AAAA,EAC5B;AAEA,SAAO;AACT;AAEO,SAAS,cAAc,WAAmB,MAAuB;AACtE,QAAM,aAAaC,OAAK,KAAK,WAAW,IAAI;AAC5C,MAAI,CAACD,KAAG,WAAW,UAAU,EAAG,QAAO;AAEvC,QAAM,UAAUC,OAAK,QAAQ,IAAI;AACjC,MAAI,CAACD,KAAG,WAAW,OAAO,GAAG;AAC3B,IAAAA,KAAG,UAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,EAC3C;AACA,EAAAA,KAAG,aAAa,YAAY,IAAI;AAChC,SAAO;AACT;;;AC9BA;AAFA,OAAOE,UAAQ;AACf,OAAOC,aAAY;AAgBZ,SAAS,eAAgC;AAC9C,MAAI;AACF,QAAI,CAACD,KAAG,WAAW,aAAa,EAAG,QAAO;AAC1C,WAAO,KAAK,MAAMA,KAAG,aAAa,eAAe,OAAO,CAAC;AAAA,EAC3D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,cAAc,UAAoB;AAChD,MAAI,CAACA,KAAG,WAAW,WAAW,GAAG;AAC/B,IAAAA,KAAG,UAAU,aAAa,EAAE,WAAW,KAAK,CAAC;AAAA,EAC/C;AACA,EAAAA,KAAG,cAAc,eAAe,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AACnE;AAEO,SAAS,aAAa,UAA0B;AACrD,QAAM,UAAUA,KAAG,aAAa,QAAQ;AACxC,SAAOC,QAAO,WAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK;AACjE;;;AJlBO,SAAS,WAAW,OAA8D;AAEvF,QAAM,eAAe,gBAAgB,KAAK;AAG1C,QAAM,gBAAgB,aAAa,OAAO,OAAKC,KAAG,WAAW,CAAC,CAAC;AAC/D,QAAM,YAAY,cAAc,SAAS,IAAI,aAAa,aAAa,IAAI;AAE3E,QAAM,UAAoB,CAAC;AAG3B,OAAK,MAAM,gBAAgB,YAAY,MAAM,gBAAgB,WAAW,MAAM,QAAQ;AACpF,YAAQ,KAAK,GAAG,kBAAkB,MAAM,MAAM,CAAC;AAAA,EACjD;AAGA,OAAK,MAAM,gBAAgB,YAAY,MAAM,gBAAgB,WAAW,MAAM,QAAQ;AACpF,YAAQ,KAAK,GAAG,kBAAkB,MAAM,MAAM,CAAC;AAAA,EACjD;AAGA,kBAAgB;AAGhB,QAAM,UAA2B,QAAQ,IAAI,WAAS;AAAA,IACpD,MAAM;AAAA,IACN,QAAQ,cAAc,SAAS,IAAI,IAAI,aAAsB;AAAA,IAC7D,UAAU,aAAa,IAAI;AAAA,IAC3B,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC,EAAE;AAEF,gBAAc,EAAE,SAAS,GAAG,WAAW,QAAQ,CAAC;AAEhD,SAAO,EAAE,SAAS,UAAU;AAC9B;AAEO,SAAS,YAAuD;AACrE,QAAM,WAAW,aAAa;AAC9B,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,qCAAqC;AAAA,EACvD;AAEA,QAAM,WAAqB,CAAC;AAC5B,QAAM,UAAoB,CAAC;AAE3B,aAAW,SAAS,SAAS,SAAS;AACpC,QAAI,MAAM,WAAW,WAAW;AAE9B,UAAIA,KAAG,WAAW,MAAM,IAAI,GAAG;AAC7B,QAAAA,KAAG,WAAW,MAAM,IAAI;AACxB,gBAAQ,KAAK,MAAM,IAAI;AAAA,MACzB;AAAA,IACF,WAAW,MAAM,WAAW,cAAc,SAAS,WAAW;AAE5D,UAAI,cAAc,SAAS,WAAW,MAAM,IAAI,GAAG;AACjD,iBAAS,KAAK,MAAM,IAAI;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAGA,QAAM,EAAE,eAAAC,eAAc,IAAI;AAC1B,MAAID,KAAG,WAAWC,cAAa,GAAG;AAChC,IAAAD,KAAG,WAAWC,cAAa;AAAA,EAC7B;AAEA,SAAO,EAAE,UAAU,QAAQ;AAC7B;AAEA,SAAS,gBAAgB,OAA6B;AACpD,QAAM,QAAkB,CAAC;AAEzB,OAAK,MAAM,gBAAgB,YAAY,MAAM,gBAAgB,WAAW,MAAM,QAAQ;AACpF,UAAM,KAAK,aAAa,yBAAyB,6BAA6B;AAC9E,QAAI,MAAM,OAAO,WAAY,OAAM,KAAK,WAAW;AACnD,QAAI,MAAM,OAAO,QAAQ;AACvB,iBAAW,KAAK,MAAM,OAAO,QAAQ;AACnC,cAAM,KAAK,kBAAkB,EAAE,KAAK,QAAQ,gBAAgB,GAAG,EAAE,YAAY,CAAC,KAAK;AAAA,MACrF;AAAA,IACF;AAAA,EACF;AAEA,OAAK,MAAM,gBAAgB,YAAY,MAAM,gBAAgB,WAAW,MAAM,QAAQ;AACpF,QAAI,MAAM,OAAO,YAAa,OAAM,KAAK,cAAc;AACvD,QAAI,MAAM,OAAO,OAAO;AACtB,iBAAW,KAAK,MAAM,OAAO,MAAO,OAAM,KAAK,iBAAiB,EAAE,QAAQ,EAAE;AAAA,IAC9E;AACA,QAAI,MAAM,OAAO,WAAY,OAAM,KAAK,kBAAkB;AAAA,EAC5D;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB;AACzB,QAAM,gBAAgB;AACtB,MAAID,KAAG,WAAW,aAAa,GAAG;AAChC,UAAM,UAAUA,KAAG,aAAa,eAAe,OAAO;AACtD,QAAI,CAAC,QAAQ,SAAS,WAAW,GAAG;AAClC,MAAAA,KAAG,eAAe,eAAe,sCAAsC;AAAA,IACzE;AAAA,EACF,OAAO;AACL,IAAAA,KAAG,cAAc,eAAe,oCAAoC;AAAA,EACtE;AACF;;;AKzHA,OAAOE,UAAQ;AACf,OAAOC,YAAU;AAEjB,IAAM,gBAAgBA,OAAK,KAAK,WAAW,eAAe;AAC1D,IAAM,eAAe;AAoBrB,SAAS,eAA+B;AACtC,MAAI,CAACD,KAAG,WAAW,aAAa,EAAG,QAAO,CAAC;AAC3C,MAAI;AACF,WAAO,KAAK,MAAMA,KAAG,aAAa,eAAe,OAAO,CAAC;AAAA,EAC3D,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,cAAc,UAAgC;AACrD,QAAM,MAAMC,OAAK,QAAQ,aAAa;AACtC,MAAI,CAACD,KAAG,WAAW,GAAG,EAAG,CAAAA,KAAG,UAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAC9D,EAAAA,KAAG,cAAc,eAAe,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AACnE;AAEA,SAAS,cAAc,YAAmC;AACxD,SAAO,WAAW;AAAA,IAAU,WAC1B,MAAM,OAAO,KAAK,OAAK,EAAE,YAAY,YAAY;AAAA,EACnD;AACF;AAEO,SAAS,kBAA2B;AACzC,QAAM,WAAW,aAAa;AAC9B,QAAM,aAAa,SAAS,OAAO;AACnC,MAAI,CAAC,MAAM,QAAQ,UAAU,EAAG,QAAO;AACvC,SAAO,cAAc,UAAU,MAAM;AACvC;AAEO,SAAS,cAAiE;AAC/E,QAAM,WAAW,aAAa;AAE9B,MAAI,CAAC,SAAS,MAAO,UAAS,QAAQ,CAAC;AACvC,MAAI,CAAC,MAAM,QAAQ,SAAS,MAAM,UAAU,EAAG,UAAS,MAAM,aAAa,CAAC;AAE5E,MAAI,cAAc,SAAS,MAAM,UAAU,MAAM,IAAI;AACnD,WAAO,EAAE,WAAW,OAAO,kBAAkB,KAAK;AAAA,EACpD;AAEA,WAAS,MAAM,WAAW,KAAK;AAAA,IAC7B,SAAS;AAAA,IACT,OAAO,CAAC,EAAE,MAAM,WAAW,SAAS,aAAa,CAAC;AAAA,EACpD,CAAC;AAED,gBAAc,QAAQ;AACtB,SAAO,EAAE,WAAW,MAAM,kBAAkB,MAAM;AACpD;AAEO,SAAS,aAAsD;AACpE,QAAM,WAAW,aAAa;AAC9B,QAAM,aAAa,SAAS,OAAO;AAEnC,MAAI,CAAC,MAAM,QAAQ,UAAU,GAAG;AAC9B,WAAO,EAAE,SAAS,OAAO,UAAU,KAAK;AAAA,EAC1C;AAEA,QAAM,MAAM,cAAc,UAAU;AACpC,MAAI,QAAQ,IAAI;AACd,WAAO,EAAE,SAAS,OAAO,UAAU,KAAK;AAAA,EAC1C;AAEA,aAAW,OAAO,KAAK,CAAC;AACxB,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO,SAAS,MAAO;AAAA,EACzB;AACA,MAAI,SAAS,SAAS,OAAO,KAAK,SAAS,KAAK,EAAE,WAAW,GAAG;AAC9D,WAAO,SAAS;AAAA,EAClB;AAEA,gBAAc,QAAQ;AACtB,SAAO,EAAE,SAAS,MAAM,UAAU,MAAM;AAC1C;;;AC3FA;AAHA,OAAOE,UAAQ;AACf,OAAOC,YAAU;AACjB,SAAS,YAAAC,iBAAgB;AAGzB,IAAM,aAAaD,OAAK,KAAK,aAAa,qBAAqB;AAOxD,SAAS,YAAiC;AAC/C,MAAI;AACF,QAAI,CAACD,KAAG,WAAW,UAAU,EAAG,QAAO;AACvC,WAAO,KAAK,MAAMA,KAAG,aAAa,YAAY,OAAO,CAAC;AAAA,EACxD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,WAAW,OAA2B;AACpD,MAAI,CAACA,KAAG,WAAW,WAAW,GAAG;AAC/B,IAAAA,KAAG,UAAU,aAAa,EAAE,WAAW,KAAK,CAAC;AAAA,EAC/C;AACA,EAAAA,KAAG,cAAc,YAAY,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAC7D;AAEO,SAAS,oBAAmC;AACjD,MAAI;AACF,WAAOE,UAAS,sBAAsB;AAAA,MACpC,UAAU;AAAA,MACV,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,IAChC,CAAC,EAAE,KAAK;AAAA,EACV,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACnCO,IAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,kBAAkB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,kBAAN,MAAsB;AAAA,EACnB;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,QAA+C;AAAA,EAEvD,YAAY,SAAc,UAAoB;AAC5C,SAAK,UAAU;AACf,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,QAAc;AACZ,SAAK,QAAQ;AACb,SAAK,QAAQ,OAAO,KAAK,SAAS,CAAC;AACnC,SAAK,QAAQ,YAAY,MAAM;AAC7B,WAAK,SAAS,KAAK,QAAQ,KAAK,KAAK,SAAS;AAC9C,WAAK,QAAQ,OAAO,KAAK,SAAS,KAAK,KAAK;AAAA,IAC9C,GAAG,GAAI;AAAA,EACT;AAAA,EAEA,mBAAmB,QAAsB;AACvC,SAAK,QAAQ,OAAO;AAEpB,QAAI,KAAK,OAAO;AACd,oBAAc,KAAK,KAAK;AACxB,WAAK,QAAQ,YAAY,MAAM;AAC7B,aAAK,SAAS,KAAK,QAAQ,KAAK,KAAK,SAAS;AAC9C,aAAK,QAAQ,OAAO,KAAK,SAAS,KAAK,KAAK;AAAA,MAC9C,GAAG,GAAI;AAAA,IACT;AAAA,EACF;AAAA,EAEA,OAAa;AACX,QAAI,KAAK,OAAO;AACd,oBAAc,KAAK,KAAK;AACxB,WAAK,QAAQ;AAAA,IACf;AAAA,EACF;AACF;;;ArBxCA,eAAsB,YAAY,SAAsB;AAEtD,UAAQ,IAAIC,OAAM,KAAK,IAAI,SAAS,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOrC,CAAC;AACF,UAAQ,IAAIA,OAAM,IAAI,6CAA6C,CAAC;AAEpE,UAAQ,IAAIA,OAAM,KAAK,sBAAsB,CAAC;AAC9C,UAAQ,IAAIA,OAAM,IAAI,wEAAwE,CAAC;AAC/F,UAAQ,IAAIA,OAAM,IAAI,qEAAqE,CAAC;AAC5F,UAAQ,IAAIA,OAAM,IAAI,uEAAuE,CAAC;AAC9F,UAAQ,IAAIA,OAAM,IAAI,6EAAwE,CAAC;AAE/F,UAAQ,IAAIA,OAAM,KAAK,mBAAmB,CAAC;AAC3C,UAAQ,IAAIA,OAAM,IAAI,oEAAoE,CAAC;AAC3F,UAAQ,IAAIA,OAAM,IAAI,oEAAoE,CAAC;AAC3F,UAAQ,IAAIA,OAAM,IAAI,iEAAiE,CAAC;AACxF,UAAQ,IAAIA,OAAM,IAAI,mEAAmE,CAAC;AAC1F,UAAQ,IAAIA,OAAM,IAAI,yDAAyD,CAAC;AAChF,UAAQ,IAAIA,OAAM,IAAI,kEAAkE,CAAC;AAGzF,UAAQ,IAAIA,OAAM,IAAI,SAAS,EAAE,KAAK,kCAA6B,CAAC;AACpE,MAAIC,QAAO,cAAc;AACzB,MAAI,CAACA,OAAM;AACT,YAAQ,IAAID,OAAM,OAAO,6CAA6C,CAAC;AACvE,UAAM,aAAa;AACnB,IAAAC,QAAO,cAAc;AACrB,QAAI,CAACA,OAAM;AACT,cAAQ,IAAID,OAAM,IAAI,mCAAmC,CAAC;AAC1D,YAAM,IAAI,MAAM,UAAU;AAAA,IAC5B;AAAA,EACF;AACA,UAAQ,IAAIA,OAAM,IAAI,oBAAoBC,MAAK,KAAK;AAAA,CAAI,CAAC;AAGzD,UAAQ,IAAID,OAAM,IAAI,SAAS,EAAE,KAAK,kCAA6B,CAAC;AACpE,UAAQ,IAAIA,OAAM,IAAI,4EAA4E,CAAC;AACnG,QAAM,UAAUE,KAAI,sBAAsB,EAAE,MAAM;AAClD,QAAM,cAAc,mBAAmB,QAAQ,IAAI,CAAC;AACpD,QAAM,OAAO,uBAAuB,WAAW;AAC/C,UAAQ,QAAQ,kBAAkB;AAElC,aAAW,kBAAkB;AAAA,IAC3B,WAAW,YAAY;AAAA,IACvB,YAAY,YAAY;AAAA,IACxB,qBAAqB,CAAC,EAAE,YAAY,gBAAgB,YAAY,YAAY,gBAAgB;AAAA,IAC5F,eAAe,CAAC,CAAC,YAAY,gBAAgB;AAAA,IAC7C,qBAAqB,CAAC,CAAC,YAAY,gBAAgB;AAAA,IACnD,iBAAiB,CAAC,CAAC,YAAY,gBAAgB;AAAA,IAC/C,oBAAoB,YAAY,gBAAgB,aAAa,UAAU;AAAA,IACvE,cAAc,YAAY,gBAAgB,cAAc,UAAU;AAAA,IAClE,YAAY,YAAY,SAAS;AAAA,EACnC,CAAC;AAED,UAAQ,IAAIF,OAAM,IAAI,gBAAgB,YAAY,UAAU,KAAK,IAAI,KAAK,eAAe,EAAE,CAAC;AAC5F,UAAQ,IAAIA,OAAM,IAAI,iBAAiB,YAAY,WAAW,KAAK,IAAI,KAAK,eAAe,EAAE,CAAC;AAC9F,UAAQ,IAAIA,OAAM,IAAI,YAAY,YAAY,SAAS,MAAM;AAAA,CAAU,CAAC;AAGxE,UAAQ,IAAIA,OAAM,IAAI,SAAS,EAAE,KAAK,mCAA8B,CAAC;AACrE,UAAQ,IAAIA,OAAM,IAAI,kEAAkE,CAAC;AACzF,QAAM,eAAeE,KAAI,gCAAgC,EAAE,MAAM;AACjE,MAAI,gBAAgB;AACpB,MAAI,oBAAmC;AACvC,MAAI;AACF,UAAM,QAAQ,MAAM,WAA+D,uBAAuB;AAAA,MACxG,QAAQ;AAAA,MACR,MAAM,EAAE,iBAAiB,KAAK;AAAA,IAChC,CAAC;AACD,QAAI,MAAM,SAAS;AACjB,0BAAoB,MAAM,QAAQ;AAAA,IACpC;AACA,QAAI,MAAM,OAAO;AACf,sBAAgB,MAAM;AACtB,iBAAW,4BAA4B;AAAA,QACrC,eAAe,CAAC,CAAC,YAAY,gBAAgB;AAAA,QAC7C,iBAAiB,CAAC,CAAC,YAAY,gBAAgB;AAAA,QAC/C,mBAAmB,YAAY,gBAAgB,aAAa,UAAU,KAAK;AAAA,QAC3E,aAAa,YAAY,gBAAgB,cAAc,UAAU,KAAK;AAAA,MACxE,CAAC;AACD,mBAAa,QAAQ,sBAAsB;AAAA,IAC7C,OAAO;AACL,mBAAa,KAAK,yBAAyB;AAAA,IAC7C;AAAA,EACF,QAAQ;AACN,iBAAa,KAAK,yBAAyB;AAAA,EAC7C;AAGA,QAAM,cAAc,QAAQ,SAAS,MAAM,YAAY;AACvD,aAAW,yBAAyB,EAAE,cAAc,YAAY,CAAC;AAGjE,QAAM,UAAU,YAAY,SAAS,SAAS;AAC9C,MAAI,SAAS;AACX,gBAAY,cAAc,MAAM,YAAY,sCAAsC;AAAA,EACpF;AAGA,UAAQ,IAAIF,OAAM,IAAI,SAAS,EAAE,KAAK,qCAAgC,CAAC;AACvE,UAAQ,IAAIA,OAAM,IAAI,qEAAqE,CAAC;AAC5F,UAAQ,IAAIA,OAAM,IAAI,2CAA4C,CAAC;AACnE,MAAI,iBAAiD;AACrD,MAAI;AACJ,MAAI;AAEJ,aAAW,sBAAsB,EAAE,cAAc,YAAY,CAAC;AAE9D,QAAM,aAAaE,KAAI,qBAAqB,EAAE,MAAM;AACpD,QAAM,cAAc,IAAI,gBAAgB,YAAY,mBAAmB;AACvE,cAAY,MAAM;AAElB,MAAI;AACF,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA,QAAQ,YAAY;AAAA,MACtB;AAAA,MACA,MAAM;AAAA,MAAC;AAAA,MACP,CAAC,YAAY;AACX,yBAAiB,QAAQ;AACzB,2BAAmB,QAAQ;AAC3B,oBAAY,QAAQ;AAAA,MACtB;AAAA,MACA,CAAC,UAAU;AACT,oBAAY,KAAK;AACjB,mBAAW,kBAAkB,EAAE,YAAY,qBAAqB,eAAe,OAAO,SAAS,OAAO,CAAC;AACvG,mBAAW,KAAK,qBAAqB,KAAK,EAAE;AAAA,MAC9C;AAAA,MACA,CAAC,WAAW;AAAE,oBAAY,mBAAmB,MAAM;AAAA,MAAG;AAAA,IACxD;AAAA,EACF,SAAS,KAAK;AACZ,gBAAY,KAAK;AACjB,UAAM,MAAM,eAAe,QAAQ,IAAI,UAAU;AACjD,eAAW,kBAAkB,EAAE,YAAY,6BAA6B,eAAe,KAAK,SAAS,OAAO,CAAC;AAC7G,eAAW,KAAK,sBAAsB,GAAG,EAAE;AAC3C,UAAM,IAAI,MAAM,UAAU;AAAA,EAC5B;AAEA,cAAY,KAAK;AAEjB,MAAI,CAAC,gBAAgB;AACnB,eAAW,KAAK,2BAA2B;AAC3C,QAAI,WAAW;AACb,cAAQ,IAAIF,OAAM,IAAI,uCAAuC,CAAC;AAC9D,cAAQ,IAAIA,OAAM,IAAI,UAAU,MAAM,GAAG,GAAG,CAAC,CAAC;AAAA,IAChD;AACA,UAAM,IAAI,MAAM,UAAU;AAAA,EAC5B;AAEA,aAAW,QAAQ,iBAAiB;AACpC,oBAAkB,cAAc;AAGhC,UAAQ,IAAIA,OAAM,IAAI,SAAS,EAAE,KAAK,4BAAuB,CAAC;AAC9D,UAAQ,IAAIA,OAAM,IAAI,qEAAqE,CAAC;AAC5F,UAAQ,IAAIA,OAAM,IAAI,6DAA6D,CAAC;AACpF,MAAI,YAAY;AAChB,MAAI,SAAS,MAAM,aAAa,SAAS;AAEzC,SAAO,WAAW,WAAW;AAC3B,QAAI,kBAAkB;AACpB,uBAAiB,gBAAgB;AAAA,IACnC,OAAO;AACL,cAAQ,IAAIA,OAAM,IAAI,8CAA8C,CAAC;AAAA,IACvE;AACA,gBAAY;AACZ,aAAS,MAAM,aAAa,SAAS;AAAA,EACvC;AAEA,MAAI,WAAW,WAAW;AACxB,eAAW,gBAAgB;AAC3B,YAAQ,IAAIA,OAAM,IAAI,yCAAyC,CAAC;AAChE;AAAA,EACF;AAEA,MAAI,WAAW,UAAU;AACvB,qBAAiB,MAAM,WAAW,gBAAgB,WAAW;AAC7D,QAAI,CAAC,gBAAgB;AACnB,iBAAW,sBAAsB;AACjC,cAAQ,IAAIA,OAAM,IAAI,+CAA+C,CAAC;AACtE;AAAA,IACF;AAAA,EACF;AAGA,UAAQ,IAAIA,OAAM,IAAI,SAAS,EAAE,KAAK,kCAA6B,CAAC;AACpE,UAAQ,IAAIA,OAAM,IAAI,kEAAkE,CAAC;AACzF,UAAQ,IAAIA,OAAM,IAAI,gEAAgE,CAAC;AACvF,MAAI,QAAQ,QAAQ;AAClB,YAAQ,IAAIA,OAAM,OAAO,8CAA8C,CAAC;AACxE,YAAQ,IAAI,KAAK,UAAU,gBAAgB,MAAM,CAAC,CAAC;AACnD;AAAA,EACF;AAEA,QAAM,eAAeE,KAAI,yBAAyB,EAAE,MAAM;AAC1D,MAAI;AACF,UAAM,SAAS,WAAW,cAAkD;AAC5E,iBAAa,QAAQ,sBAAsB;AAE3C,eAAW,iBAAiB,EAAE,eAAe,OAAO,QAAQ,QAAQ,cAAc,YAAY,CAAC;AAE/F,YAAQ,IAAIF,OAAM,KAAK,0BAA0B,CAAC;AAClD,eAAW,QAAQ,OAAO,SAAS;AACjC,cAAQ,IAAI,KAAKA,OAAM,MAAM,QAAG,CAAC,IAAI,IAAI,EAAE;AAAA,IAC7C;AACA,QAAI,OAAO,WAAW;AACpB,cAAQ,IAAIA,OAAM,IAAI;AAAA,qBAAwB,OAAO,SAAS,EAAE,CAAC;AAAA,IACnE;AAAA,EACF,SAAS,KAAK;AACZ,iBAAa,KAAK,uBAAuB;AACzC,YAAQ,MAAMA,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,eAAe,CAAC;AAC7E,UAAM,IAAI,MAAM,UAAU;AAAA,EAC5B;AAGA,QAAM,aAAa,MAAM,YAAYA,OAAM,KAAK,wDAAwD,CAAC;AACzG,MAAI,CAAC,cAAc,WAAW,YAAY,MAAM,KAAK;AACnD,UAAM,aAAa,YAAY;AAC/B,QAAI,WAAW,WAAW;AACxB,cAAQ,IAAI,KAAKA,OAAM,MAAM,QAAG,CAAC,8BAA8B;AAC/D,YAAM,MAAM,kBAAkB;AAC9B,UAAI,KAAK;AACP,mBAAW,EAAE,gBAAgB,KAAK,uBAAsB,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC;AAAA,MACpF;AAAA,IACF,WAAW,WAAW,kBAAkB;AACtC,cAAQ,IAAIA,OAAM,IAAI,uCAAuC,CAAC;AAAA,IAChE;AAAA,EACF,OAAO;AACL,YAAQ,IAAIA,OAAM,IAAI,yDAAyD,CAAC;AAAA,EAClF;AAGA,MAAI;AACF,QAAI,YAAY;AAEhB,QAAI,CAAC,WAAW;AACd,YAAM,UAAU,MAAM,WAA2B,iBAAiB;AAAA,QAChE,QAAQ;AAAA,QACR,MAAM;AAAA,UACJ,iBAAiB;AAAA,UACjB,MAAM,YAAY,eAAe;AAAA,UACjC,cAAc,YAAY;AAAA,UAC1B,aAAa,YAAY;AAAA,QAC3B;AAAA,MACF,CAAC;AACD,kBAAY,QAAQ;AAAA,IACtB;AAEA,UAAM,WAAW,uBAAuB,SAAS,IAAI;AAAA,MACnD,QAAQ;AAAA,MACR,MAAM;AAAA,QACJ;AAAA,QACA,QAAQ;AAAA,QACR,UAAU;AAAA,MACZ;AAAA,IACF,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,YAAQ,IAAIA,OAAM,OAAO;AAAA,6CAAgD,CAAC;AAC1E,YAAQ,IAAIA,OAAM,IAAI,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE,CAAC;AAC9E,YAAQ,IAAIA,OAAM,IAAI;AAAA,CAAqC,CAAC;AAAA,EAC9D;AAEA,UAAQ,IAAIA,OAAM,KAAK,MAAM,wDAAwD,CAAC;AACtF,UAAQ,IAAIA,OAAM,IAAI,yCAAyC,CAAC;AAClE;AAEA,eAAe,WACb,cACA,cACyC;AACzC,QAAM,UAAkE,CAAC;AACzE,MAAI,kBAAkB;AAEtB,SAAO,MAAM;AACX,UAAM,UAAU,MAAM,YAAY,kCAAkC;AACpE,QAAI,CAAC,WAAW,QAAQ,YAAY,MAAM,UAAU,QAAQ,YAAY,MAAM,UAAU;AACtF,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,YAAY,MAAM,UAAU;AACtC,aAAO;AAAA,IACT;AAEA;AACA,eAAW,2BAA2B,EAAE,kBAAkB,gBAAgB,CAAC;AAE3E,QAAI,UAA0C;AAC9C,UAAM,gBAAgBE,KAAI,mBAAmB,EAAE,MAAM;AACrD,UAAM,iBAAiB,IAAI,gBAAgB,eAAe,eAAe;AACzE,mBAAe,MAAM;AAErB,UAAM;AAAA,MACJ;AAAA,MACA,EAAE,cAAc,SAAS,qBAAqB,QAAQ;AAAA,MACtD,MAAM;AAAA,MAAC;AAAA,MACP,CAAC,YAAY;AAAE,kBAAU,QAAQ;AAAA,MAAkC;AAAA,MACnE,CAAC,UAAU;AAAE,uBAAe,KAAK;AAAG,sBAAc,KAAK,qBAAqB,KAAK,EAAE;AAAA,MAAG;AAAA,MACtF,CAAC,WAAW;AAAE,uBAAe,mBAAmB,MAAM;AAAA,MAAG;AAAA,IAC3D;AAEA,mBAAe,KAAK;AAEpB,QAAI,SAAS;AACX,qBAAe;AACf,cAAQ,KAAK,EAAE,MAAM,QAAQ,SAAS,QAAQ,CAAC;AAC/C,cAAQ,KAAK,EAAE,MAAM,aAAa,SAAS,KAAK,UAAU,OAAO,EAAE,CAAC;AACpE,oBAAc,QAAQ,eAAe;AACrC,wBAAkB,OAAO;AACzB,cAAQ,IAAIF,OAAM,IAAI,kDAAkD,CAAC;AAAA,IAC3E;AAAA,EACF;AACF;AAEA,SAAS,YAAY,UAAmC;AACtD,QAAM,KAAK,SAAS,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACpF,SAAO,IAAI,QAAQ,CAACG,aAAY;AAC9B,OAAG,SAASH,OAAM,KAAK,GAAG,QAAQ,GAAG,GAAG,CAAC,WAAW;AAClD,SAAG,MAAM;AACT,MAAAG,SAAQ,OAAO,KAAK,CAAC;AAAA,IACvB,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,cAAoC;AAC3C,SAAO,IAAI,QAAQ,CAACA,aAAY;AAC9B,UAAM,KAAK,SAAS,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACpF,YAAQ,IAAIH,OAAM,KAAK,mCAAmC,CAAC;AAC3D,YAAQ,IAAI,kBAAkB;AAC9B,YAAQ,IAAI,aAAa;AACzB,YAAQ,IAAI,WAAW;AACvB,OAAG,SAASA,OAAM,KAAK,kBAAkB,GAAG,CAAC,WAAW;AACtD,SAAG,MAAM;AACT,YAAM,MAAmC,EAAE,KAAK,UAAU,KAAK,UAAU,KAAK,OAAO;AACrF,MAAAG,SAAQ,IAAI,OAAO,KAAK,CAAC,KAAK,QAAQ;AAAA,IACxC,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,aAAa,WAA0E;AAC9F,SAAO,IAAI,QAAQ,CAACA,aAAY;AAC9B,UAAM,KAAK,SAAS,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACpF,YAAQ,IAAIH,OAAM,KAAK,4BAA4B,CAAC;AACpD,QAAI,WAAW;AACb,cAAQ,IAAI,uBAAuB;AACnC,cAAQ,IAAI,sBAAsB;AAClC,cAAQ,IAAI,cAAc;AAC1B,SAAG,SAASA,OAAM,KAAK,kBAAkB,GAAG,CAAC,WAAW;AACtD,WAAG,MAAM;AACT,cAAM,MAAuD;AAAA,UAC3D,KAAK;AAAA,UAAU,KAAK;AAAA,UAAU,KAAK;AAAA,QACrC;AACA,QAAAG,SAAQ,IAAI,OAAO,KAAK,CAAC,KAAK,QAAQ;AAAA,MACxC,CAAC;AAAA,IACH,OAAO;AACL,cAAQ,IAAI,uBAAuB;AACnC,cAAQ,IAAI,sBAAsB;AAClC,cAAQ,IAAI,8BAA8B;AAC1C,cAAQ,IAAI,cAAc;AAC1B,SAAG,SAASH,OAAM,KAAK,kBAAkB,GAAG,CAAC,WAAW;AACtD,WAAG,MAAM;AACT,cAAM,MAAmE;AAAA,UACvE,KAAK;AAAA,UAAU,KAAK;AAAA,UAAU,KAAK;AAAA,UAAW,KAAK;AAAA,QACrD;AACA,QAAAG,SAAQ,IAAI,OAAO,KAAK,CAAC,KAAK,QAAQ;AAAA,MACxC,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAEA,SAAS,UAAU,UAAkB,MAAkC;AACrE,QAAM,OAAOC,KAAG,WAAW,QAAQ,IAAIJ,OAAM,OAAO,GAAG,IAAIA,OAAM,MAAM,GAAG;AAC1E,QAAM,cAAc,OAAOA,OAAM,IAAI,UAAK,IAAI,EAAE,IAAI;AACpD,SAAO,KAAK,IAAI,IAAI,QAAQ,IAAI,WAAW;AAC7C;AAEA,SAAS,kBAAkB,OAAgC;AACzD,QAAM,SAAS,MAAM;AACrB,QAAM,SAAS,MAAM;AACrB,QAAM,eAAgB,MAAM,oBAAoB,CAAC;AAEjD,UAAQ,IAAI,EAAE;AAEd,MAAI,QAAQ;AACV,QAAI,OAAO,UAAU;AACnB,cAAQ,IAAI,UAAU,aAAa,aAAa,WAAW,CAAC,CAAC;AAAA,IAC/D;AACA,QAAI,OAAO,UAAU;AACnB,cAAQ,IAAI,UAAU,yBAAyB,aAAa,uBAAuB,CAAC,CAAC;AAAA,IACvF;AACA,QAAI,OAAO,eAAe;AACxB,cAAQ,IAAI,UAAU,+BAA+B,aAAa,6BAA6B,CAAC,CAAC;AAAA,IACnG;AAEA,UAAM,SAAS,OAAO;AACtB,QAAI,MAAM,QAAQ,MAAM,KAAK,OAAO,SAAS,GAAG;AAC9C,iBAAW,SAAS,QAAQ;AAC1B,cAAM,YAAY,kBAAkB,MAAM,KAAK,QAAQ,gBAAgB,GAAG,EAAE,YAAY,CAAC;AACzF,gBAAQ,IAAI,UAAU,WAAW,aAAa,SAAS,KAAK,MAAM,IAAI,CAAC;AAAA,MACzE;AAAA,IACF;AAEA,UAAM,aAAa,OAAO;AAC1B,QAAI,cAAc,OAAO,KAAK,UAAU,EAAE,SAAS,GAAG;AACpD,cAAQ,IAAI,UAAU,aAAa,aAAa,WAAW,KAAK,OAAO,KAAK,UAAU,EAAE,KAAK,IAAI,CAAC,CAAC;AAAA,IACrG;AAAA,EACF;AAEA,MAAI,QAAQ;AACV,QAAI,OAAO,aAAa;AACtB,cAAQ,IAAI,UAAU,gBAAgB,aAAa,cAAc,CAAC,CAAC;AAAA,IACrE;AAEA,UAAM,QAAQ,OAAO;AACrB,QAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,SAAS,GAAG;AAC5C,iBAAW,QAAQ,OAAO;AACxB,cAAM,WAAW,iBAAiB,KAAK,QAAQ;AAC/C,gBAAQ,IAAI,UAAU,UAAU,aAAa,QAAQ,CAAC,CAAC;AAAA,MACzD;AAAA,IACF;AAEA,UAAM,aAAa,OAAO;AAC1B,QAAI,cAAc,OAAO,KAAK,UAAU,EAAE,SAAS,GAAG;AACpD,cAAQ,IAAI,UAAU,oBAAoB,aAAa,kBAAkB,KAAK,OAAO,KAAK,UAAU,EAAE,KAAK,IAAI,CAAC,CAAC;AAAA,IACnH;AAAA,EACF;AAEA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,KAAKA,OAAM,MAAM,GAAG,CAAC,IAAIA,OAAM,IAAI,KAAK,CAAC,KAAKA,OAAM,OAAO,GAAG,CAAC,IAAIA,OAAM,IAAI,UAAU,CAAC,EAAE;AACtG,UAAQ,IAAI,EAAE;AAChB;AAEA,SAAS,iBAAiB,aAAqB;AAC7C,UAAQ,IAAIA,OAAM,KAAK,uBAAuB,CAAC;AAE/C,QAAM,QAAQ,YAAY,MAAM,IAAI;AAEpC,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,QAAS;AAEd,UAAM,cAAc,QAAQ,MAAM,YAAY;AAC9C,QAAI,aAAa;AACf,cAAQ,IAAI,KAAKA,OAAM,KAAK,IAAI,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE;AAC5D;AAAA,IACF;AAEA,UAAM,YAAY,QAAQ,MAAM,+BAA+B;AAC/D,QAAI,WAAW;AACb,YAAM,OAAO,UAAU,CAAC;AACxB,YAAM,OAAO,UAAU,CAAC,EAAE,QAAQ,gBAAgB,EAAE;AACpD,cAAQ,IAAI,OAAOA,OAAM,IAAI,QAAG,CAAC,IAAIA,OAAM,MAAM,IAAI,CAAC,KAAKA,OAAM,IAAI,IAAI,CAAC,EAAE;AAC5E;AAAA,IACF;AAEA,UAAM,aAAa,QAAQ,MAAM,YAAY;AAC7C,QAAI,YAAY;AACd,cAAQ,IAAI,OAAOA,OAAM,IAAI,QAAG,CAAC,IAAIA,OAAM,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE;AAC/D;AAAA,IACF;AAEA,YAAQ,IAAI,KAAKA,OAAM,IAAI,OAAO,CAAC,EAAE;AAAA,EACvC;AAEA,UAAQ,IAAI,EAAE;AAChB;;;AsB9eA,OAAOK,YAAW;AAClB,OAAOC,UAAS;AAIT,SAAS,cAAc;AAC5B,QAAM,UAAUC,KAAI,oBAAoB,EAAE,MAAM;AAEhD,MAAI;AACF,UAAM,EAAE,UAAU,QAAQ,IAAI,UAAU;AAExC,QAAI,SAAS,WAAW,KAAK,QAAQ,WAAW,GAAG;AACjD,cAAQ,KAAK,kBAAkB;AAC/B;AAAA,IACF;AAEA,YAAQ,QAAQ,gCAAgC;AAChD,eAAW,gBAAgB,EAAE,UAAU,SAAS,QAAQ,SAAS,QAAQ,OAAO,CAAC;AAEjF,QAAI,SAAS,SAAS,GAAG;AACvB,cAAQ,IAAIC,OAAM,KAAK,yBAAyB,CAAC;AACjD,iBAAW,QAAQ,UAAU;AAC3B,gBAAQ,IAAI,OAAOA,OAAM,MAAM,QAAG,CAAC,IAAI,IAAI,EAAE;AAAA,MAC/C;AAAA,IACF;AAEA,QAAI,QAAQ,SAAS,GAAG;AACtB,cAAQ,IAAIA,OAAM,KAAK,YAAY,CAAC;AACpC,iBAAW,QAAQ,SAAS;AAC1B,gBAAQ,IAAI,OAAOA,OAAM,IAAI,QAAG,CAAC,IAAI,IAAI,EAAE;AAAA,MAC7C;AAAA,IACF;AAEA,YAAQ,IAAI,EAAE;AAAA,EAChB,SAAS,KAAK;AACZ,YAAQ,KAAKA,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,aAAa,CAAC;AAC1E,UAAM,IAAI,MAAM,UAAU;AAAA,EAC5B;AACF;;;ACtCA,OAAOC,YAAW;AAClB,OAAOC,UAAQ;;;ACDf,OAAOC,UAAQ;AACf,OAAOC,YAAU;AACjB,OAAOC,aAAY;AAwBZ,SAAS,eAAe,KAA0B;AACvD,QAAM,QAAqB,CAAC;AAG5B,QAAM,eAAeC,OAAK,KAAK,KAAK,WAAW;AAC/C,MAAIC,KAAG,WAAW,YAAY,GAAG;AAC/B,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,UAAU;AAAA,MACV,MAAM;AAAA,MACN,aAAa,SAAS,YAAY;AAAA,MAClC,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAGA,QAAM,eAAeD,OAAK,KAAK,KAAK,WAAW,eAAe;AAC9D,MAAIC,KAAG,WAAW,YAAY,GAAG;AAC/B,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,UAAU;AAAA,MACV,MAAM;AAAA,MACN,aAAa,SAAS,YAAY;AAAA,MAClC,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAGA,QAAM,YAAYD,OAAK,KAAK,KAAK,WAAW,QAAQ;AACpD,MAAIC,KAAG,WAAW,SAAS,GAAG;AAC5B,eAAW,QAAQA,KAAG,YAAY,SAAS,EAAE,OAAO,OAAK,EAAE,SAAS,KAAK,CAAC,GAAG;AAC3E,YAAM,WAAWD,OAAK,KAAK,WAAW,IAAI;AAC1C,YAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN,UAAU;AAAA,QACV,MAAM;AAAA,QACN,aAAa,SAAS,QAAQ;AAAA,QAC9B,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,cAAcA,OAAK,KAAK,KAAK,WAAW;AAC9C,MAAIC,KAAG,WAAW,WAAW,GAAG;AAC9B,QAAI;AACF,YAAM,UAAU,KAAK,MAAMA,KAAG,aAAa,aAAa,OAAO,CAAC;AAChE,UAAI,QAAQ,YAAY;AACtB,mBAAW,QAAQ,OAAO,KAAK,QAAQ,UAAU,GAAG;AAClD,gBAAM,KAAK;AAAA,YACT,MAAM;AAAA,YACN,UAAU;AAAA,YACV;AAAA,YACA,aAAa,YAAY,KAAK,UAAU,QAAQ,WAAW,IAAI,CAAC,CAAC;AAAA,YACjE,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAAe;AAAA,EACzB;AAGA,QAAM,kBAAkBD,OAAK,KAAK,KAAK,cAAc;AACrD,MAAIC,KAAG,WAAW,eAAe,GAAG;AAClC,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,UAAU;AAAA,MACV,MAAM;AAAA,MACN,aAAa,SAAS,eAAe;AAAA,MACrC,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAGA,QAAM,iBAAiBD,OAAK,KAAK,KAAK,WAAW,OAAO;AACxD,MAAIC,KAAG,WAAW,cAAc,GAAG;AACjC,eAAW,QAAQA,KAAG,YAAY,cAAc,EAAE,OAAO,OAAK,EAAE,SAAS,MAAM,CAAC,GAAG;AACjF,YAAM,WAAWD,OAAK,KAAK,gBAAgB,IAAI;AAC/C,YAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN,UAAU;AAAA,QACV,MAAM;AAAA,QACN,aAAa,SAAS,QAAQ;AAAA,QAC9B,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,gBAAgBA,OAAK,KAAK,KAAK,WAAW,UAAU;AAC1D,MAAIC,KAAG,WAAW,aAAa,GAAG;AAChC,QAAI;AACF,YAAM,UAAU,KAAK,MAAMA,KAAG,aAAa,eAAe,OAAO,CAAC;AAClE,UAAI,QAAQ,YAAY;AACtB,mBAAW,QAAQ,OAAO,KAAK,QAAQ,UAAU,GAAG;AAClD,gBAAM,KAAK;AAAA,YACT,MAAM;AAAA,YACN,UAAU;AAAA,YACV;AAAA,YACA,aAAa,YAAY,KAAK,UAAU,QAAQ,WAAW,IAAI,CAAC,CAAC;AAAA,YACjE,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAAe;AAAA,EACzB;AAEA,SAAO;AACT;AAWO,SAAS,aACd,aACA,YACA;AACA,QAAM,YAA6D,CAAC;AACpE,QAAM,UAAwB,CAAC;AAC/B,QAAM,WAA4D,CAAC;AACnE,QAAM,QAAqB,CAAC;AAE5B,QAAM,WAAW,oBAAI,IAAuB;AAC5C,aAAW,QAAQ,YAAY;AAC7B,aAAS,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,QAAQ,IAAI,KAAK,IAAI,IAAI,IAAI;AAAA,EACjE;AAEA,aAAW,UAAU,aAAa;AAChC,UAAM,MAAM,GAAG,OAAO,IAAI,IAAI,OAAO,QAAQ,IAAI,OAAO,IAAI;AAC5D,UAAM,QAAQ,SAAS,IAAI,GAAG;AAC9B,aAAS,OAAO,GAAG;AAEnB,QAAI,CAAC,OAAO;AACV,cAAQ,KAAK,MAAM;AAAA,IACrB,WAAW,MAAM,gBAAgB,OAAO,cAAc;AACpD,eAAS,KAAK,EAAE,QAAQ,MAAM,CAAC;AAAA,IACjC,OAAO;AACL,gBAAU,KAAK,EAAE,QAAQ,MAAM,CAAC;AAAA,IAClC;AAAA,EACF;AAEA,aAAW,SAAS,SAAS,OAAO,GAAG;AACrC,UAAM,KAAK,KAAK;AAAA,EAClB;AAEA,SAAO,EAAE,WAAW,SAAS,UAAU,MAAM;AAC/C;AAEA,SAAS,SAAS,UAA0B;AAC1C,QAAM,UAAUA,KAAG,aAAa,QAAQ;AACxC,SAAOC,QAAO,WAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK;AACjE;AAEA,SAAS,YAAY,SAAyB;AAC5C,SAAOA,QAAO,WAAW,QAAQ,EAAE,OAAO,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC,CAAC,EAAE,OAAO,KAAK;AAC3F;;;ADnLA,eAAsB,cAAc,SAA6B;AAC/D,QAAMC,QAAO,cAAc;AAC3B,QAAM,WAAW,aAAa;AAE9B,MAAI,QAAQ,MAAM;AAChB,YAAQ,IAAI,KAAK,UAAU;AAAA,MACzB,eAAe,CAAC,CAACA;AAAA,MACjB,OAAOA,OAAM;AAAA,MACb;AAAA,IACF,GAAG,MAAM,CAAC,CAAC;AACX;AAAA,EACF;AAEA,UAAQ,IAAIC,OAAM,KAAK,oBAAoB,CAAC;AAE5C,MAAID,OAAM;AACR,YAAQ,IAAI,WAAWC,OAAM,MAAM,WAAW,CAAC,OAAOD,MAAK,KAAK,EAAE;AAAA,EACpE,OAAO;AACL,YAAQ,IAAI,WAAWC,OAAM,OAAO,eAAe,CAAC,EAAE;AAAA,EACxD;AAEA,MAAI,CAAC,UAAU;AACb,YAAQ,IAAI,YAAYA,OAAM,IAAI,kBAAkB,CAAC,EAAE;AACvD,YAAQ,IAAIA,OAAM,IAAI,0CAA0C,CAAC;AACjE;AAAA,EACF;AAEA,UAAQ,IAAI,oBAAoBA,OAAM,KAAK,SAAS,QAAQ,OAAO,SAAS,CAAC,CAAC,EAAE;AAChF,aAAW,SAAS,SAAS,SAAS;AACpC,UAAM,SAASC,KAAG,WAAW,MAAM,IAAI;AACvC,UAAM,OAAO,SAASD,OAAM,MAAM,QAAG,IAAIA,OAAM,IAAI,QAAG;AACtD,YAAQ,IAAI,OAAO,IAAI,IAAI,MAAM,IAAI,KAAK,MAAM,MAAM,GAAG;AAAA,EAC3D;AAEA,MAAID,OAAM;AACR,QAAI;AACF,YAAM,cAAc,mBAAmB,QAAQ,IAAI,CAAC;AACpD,YAAM,OAAO,uBAAuB,WAAW;AAC/C,YAAM,QAAQ,MAAM;AAAA,QAClB;AAAA,QACA,EAAE,QAAQ,QAAQ,MAAM,EAAE,iBAAiB,KAAK,EAAE;AAAA,MACpD;AAEA,UAAI,OAAO,SAAS;AAClB,cAAM,cAAc,MAAM;AAAA,UACxB,qBAAqB,MAAM,QAAQ,EAAE;AAAA,QACvC;AAEA,YAAI,aAAa,QAAQ;AACvB,gBAAM,aAAa,eAAe,QAAQ,IAAI,CAAC;AAC/C,gBAAM,OAAO,aAAa,aAAa,UAAU;AAEjD,kBAAQ,IAAIC,OAAM,KAAK,UAAU,CAAC;AAClC,kBAAQ,IAAI,OAAOA,OAAM,MAAM,QAAG,CAAC,eAAe,KAAK,UAAU,MAAM,EAAE;AACzE,cAAI,KAAK,QAAQ,OAAQ,SAAQ,IAAI,OAAOA,OAAM,IAAI,QAAG,CAAC,aAAa,KAAK,QAAQ,MAAM,EAAE;AAC5F,cAAI,KAAK,SAAS,OAAQ,SAAQ,IAAI,OAAOA,OAAM,OAAO,GAAG,CAAC,cAAc,KAAK,SAAS,MAAM,EAAE;AAAA,QACpG;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,UAAQ,IAAI,EAAE;AAChB;;;AExEA,OAAOE,YAAW;AAClB,OAAOC,UAAS;AAMhB,OAAOC,eAAc;AAIrB,eAAsB,cAAc,SAA+B;AACjE,QAAMC,QAAO,cAAc;AAC3B,MAAI,CAACA,OAAM;AACT,YAAQ,IAAIC,OAAM,IAAI,2CAA2C,CAAC;AAClE,UAAM,IAAI,MAAM,UAAU;AAAA,EAC5B;AAEA,QAAM,WAAW,aAAa;AAC9B,MAAI,CAAC,UAAU;AACb,YAAQ,IAAIA,OAAM,OAAO,oDAAoD,CAAC;AAC9E,UAAM,IAAI,MAAM,UAAU;AAAA,EAC5B;AAEA,QAAM,UAAUC,KAAI,yBAAyB,EAAE,MAAM;AACrD,QAAM,cAAc,mBAAmB,QAAQ,IAAI,CAAC;AACpD,UAAQ,QAAQ,qBAAqB;AAErC,aAAW,kBAAkB;AAAA,IAC3B,WAAW,YAAY;AAAA,IACvB,YAAY,YAAY;AAAA,IACxB,qBAAqB,CAAC,EAAE,YAAY,gBAAgB,YAAY,YAAY,gBAAgB;AAAA,IAC5F,eAAe,CAAC,CAAC,YAAY,gBAAgB;AAAA,IAC7C,qBAAqB,CAAC,CAAC,YAAY,gBAAgB;AAAA,IACnD,iBAAiB,CAAC,CAAC,YAAY,gBAAgB;AAAA,IAC/C,oBAAoB,YAAY,gBAAgB,aAAa,UAAU;AAAA,IACvE,cAAc,YAAY,gBAAgB,cAAc,UAAU;AAAA,IAClE,YAAY,YAAY,SAAS;AAAA,EACnC,CAAC;AAED,MAAI,iBAAiD;AAErD,aAAW,sBAAsB,EAAE,cAAc,OAAO,CAAC;AAEzD,QAAM,aAAaA,KAAI,uBAAuB,EAAE,MAAM;AACtD,QAAM,cAAc,IAAI,gBAAgB,YAAY,mBAAmB;AACvE,cAAY,MAAM;AAElB,MAAI;AACF,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,QACE;AAAA,QACA,aAAa;AAAA,MACf;AAAA,MACA,MAAM;AAAA,MAAC;AAAA,MACP,CAAC,YAAY;AAAE,yBAAiB,QAAQ;AAAA,MAAkC;AAAA,MAC1E,CAAC,UAAU;AACT,oBAAY,KAAK;AACjB,mBAAW,kBAAkB,EAAE,YAAY,qBAAqB,eAAe,OAAO,SAAS,SAAS,CAAC;AACzG,mBAAW,KAAK,qBAAqB,KAAK,EAAE;AAAA,MAC9C;AAAA,MACA,CAAC,WAAW;AAAE,oBAAY,mBAAmB,MAAM;AAAA,MAAG;AAAA,IACxD;AAAA,EACF,SAAS,KAAK;AACZ,gBAAY,KAAK;AACjB,UAAM,MAAM,eAAe,QAAQ,IAAI,UAAU;AACjD,eAAW,kBAAkB,EAAE,YAAY,6BAA6B,eAAe,KAAK,SAAS,SAAS,CAAC;AAC/G,eAAW,KAAK,wBAAwB,GAAG,EAAE;AAC7C,UAAM,IAAI,MAAM,UAAU;AAAA,EAC5B;AAEA,cAAY,KAAK;AAEjB,MAAI,CAAC,gBAAgB;AACnB,eAAW,KAAK,6BAA6B;AAC7C,UAAM,IAAI,MAAM,UAAU;AAAA,EAC5B;AAEA,aAAW,QAAQ,mBAAmB;AAEtC,MAAI,QAAQ,QAAQ;AAClB,YAAQ,IAAID,OAAM,OAAO,0BAA0B,CAAC;AACpD,YAAQ,IAAI,KAAK,UAAU,gBAAgB,MAAM,CAAC,CAAC;AACnD;AAAA,EACF;AAEA,QAAM,KAAKE,UAAS,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACpF,QAAM,SAAS,MAAM,IAAI,QAAgB,CAACC,aAAY;AACpD,OAAG,SAASH,OAAM,KAAK,kCAAkC,GAAGG,QAAO;AAAA,EACrE,CAAC;AACD,KAAG,MAAM;AAET,MAAI,OAAO,KAAK,EAAE,YAAY,MAAM,KAAK;AACvC,eAAW,iBAAiB;AAC5B,YAAQ,IAAIH,OAAM,IAAI,mBAAmB,CAAC;AAC1C;AAAA,EACF;AAEA,QAAM,eAAeC,KAAI,0BAA0B,EAAE,MAAM;AAC3D,QAAM,SAAS,WAAW,cAAkD;AAC5E,eAAa,QAAQ,sBAAsB;AAE3C,aAAW,iBAAiB,EAAE,eAAe,OAAO,QAAQ,OAAO,CAAC;AAEpE,aAAW,QAAQ,OAAO,SAAS;AACjC,YAAQ,IAAI,KAAKD,OAAM,MAAM,QAAG,CAAC,IAAI,IAAI,EAAE;AAAA,EAC7C;AACA,UAAQ,IAAI,EAAE;AAChB;;;AC7GA,OAAOI,YAAW;AAIX,SAAS,gBAAgB;AAC9B,QAAMC,QAAO,cAAc;AAC3B,MAAI,CAACA,OAAM;AACT,YAAQ,IAAIC,OAAM,IAAI,0BAA0B,CAAC;AACjD;AAAA,EACF;AAEA,YAAU;AACV,aAAW,QAAQ;AACnB,UAAQ,IAAIA,OAAM,MAAM,0BAA0B,CAAC;AACrD;;;ACdA,OAAOC,YAAW;AAClB,OAAOC,UAAS;AAehB,eAAsB,iBAAiB,SAGpC;AACD,QAAMC,QAAO,cAAc;AAC3B,MAAI,CAACA,OAAM;AACT,YAAQ,IAAIC,OAAM,IAAI,+CAA+C,CAAC;AACtE,UAAM,IAAI,MAAM,UAAU;AAAA,EAC5B;AAEA,QAAM,cAAc,mBAAmB,QAAQ,IAAI,CAAC;AACpD,QAAM,OAAO,uBAAuB,WAAW;AAE/C,QAAM,QAAQ,MAAM;AAAA,IAClB;AAAA,IACA,EAAE,QAAQ,QAAQ,MAAM,EAAE,iBAAiB,KAAK,EAAE;AAAA,EACpD;AAEA,MAAI,CAAC,OAAO,SAAS;AACnB,YAAQ,IAAIA,OAAM,OAAO,6CAA6C,CAAC;AACvE,UAAM,IAAI,MAAM,UAAU;AAAA,EAC5B;AAEA,QAAM,YAAY,MAAM,QAAQ;AAEhC,MAAI,QAAQ,UAAU;AACpB,UAAM,UAAUC,KAAI,oDAAoD,EAAE,MAAM;AAChF,QAAI;AACF,YAAMC,QAAO,MAAM;AAAA,QACjB,gCAAgC,SAAS;AAAA,QACzC,EAAE,QAAQ,OAAO;AAAA,MACnB;AACA,cAAQ,QAAQ,SAASA,OAAM,UAAU,CAAC,kBAAkB;AAE5D,UAAIA,OAAM,QAAQ;AAChB,gBAAQ,IAAI,EAAE;AACd,6BAAqBA,KAAI;AAAA,MAC3B;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,KAAK,oCAAoC;AACjD,YAAM;AAAA,IACR;AACA;AAAA,EACF;AAEA,QAAM,eAAe,QAAQ,UAAU;AACvC,QAAM,OAAO,MAAM;AAAA,IACjB,gCAAgC,SAAS,WAAW,YAAY;AAAA,EAClE;AAEA,MAAI,CAAC,MAAM,QAAQ;AACjB,YAAQ,IAAIF,OAAM,IAAI;AAAA,KAAQ,YAAY;AAAA,CAA8E,CAAC;AACzH;AAAA,EACF;AAEA,uBAAqB,IAAI;AAC3B;AAEA,SAAS,qBAAqB,MAAwB;AACpD,UAAQ,IAAIA,OAAM,KAAK,6BAA6B,CAAC;AACrD,UAAQ;AAAA,IACN,KAAKA,OAAM,IAAI,OAAO,OAAO,EAAE,CAAC,CAAC,IAAIA,OAAM,IAAI,QAAQ,OAAO,CAAC,CAAC,CAAC,IAAIA,OAAM,IAAI,aAAa,OAAO,EAAE,CAAC,CAAC,IAAIA,OAAM,IAAI,QAAQ,CAAC;AAAA,EAChI;AACA,UAAQ,IAAIA,OAAM,IAAI,OAAO,SAAI,OAAO,EAAE,CAAC,CAAC;AAE5C,aAAW,OAAO,MAAM;AACtB,UAAM,aAAa,IAAI,SAAS,KAAKA,OAAM,QAAQ,IAAI,SAAS,KAAKA,OAAM,OAAOA,OAAM;AACxF,YAAQ;AAAA,MACN,KAAK,IAAI,WAAW,OAAO,EAAE,CAAC,IAAI,WAAW,GAAG,IAAI,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,oBAAoB,OAAO,EAAE,CAAC,IAAI,IAAI,MAAM;AAAA,IAC7H;AACA,QAAI,IAAI,QAAQ;AACd,cAAQ,IAAI,KAAKA,OAAM,IAAI,IAAI,MAAM,CAAC,EAAE;AAAA,IAC1C;AAAA,EACF;AACA,UAAQ,IAAI,EAAE;AAChB;;;AC3FA,OAAOG,YAAW;AAClB,OAAOC,UAAS;AA8BhB,eAAsB,cAAc,SAA4C;AAC9E,QAAMC,QAAO,cAAc;AAC3B,MAAI,CAACA,OAAM;AACT,YAAQ,IAAIC,OAAM,IAAI,+CAA+C,CAAC;AACtE,UAAM,IAAI,MAAM,UAAU;AAAA,EAC5B;AAEA,QAAM,cAAc,mBAAmB,QAAQ,IAAI,CAAC;AACpD,QAAM,OAAO,uBAAuB,WAAW;AAE/C,QAAM,QAAQ,MAAM;AAAA,IAClB;AAAA,IACA,EAAE,QAAQ,QAAQ,MAAM,EAAE,iBAAiB,KAAK,EAAE;AAAA,EACpD;AAEA,MAAI,CAAC,OAAO,SAAS;AACnB,YAAQ,IAAIA,OAAM,OAAO,6CAA6C,CAAC;AACvE,UAAM,IAAI,MAAM,UAAU;AAAA,EAC5B;AAEA,QAAM,YAAY,MAAM,QAAQ;AAEhC,QAAM,UAAUC,KAAI,6BAA6B,EAAE,MAAM;AACzD,MAAI;AACJ,MAAI;AACF,aAAS,MAAM;AAAA,MACb,wBAAwB,SAAS;AAAA,MACjC,EAAE,QAAQ,OAAO;AAAA,IACnB;AACA,YAAQ,QAAQ,mBAAmB;AAAA,EACrC,SAAS,KAAK;AACZ,YAAQ,KAAK,iBAAiB;AAC9B,UAAM;AAAA,EACR;AAEA,MAAI,QAAQ,MAAM;AAChB,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C;AAAA,EACF;AAEA,cAAY,MAAM;AAElB,MAAI,QAAQ,KAAK;AACf,YAAQ,IAAID,OAAM,KAAK,0BAA0B,CAAC;AAClD,UAAM,OAAO,MAAM;AAAA,MACjB,wBAAwB,OAAO,EAAE;AAAA,MACjC,EAAE,QAAQ,QAAQ,MAAM,EAAE,UAAU,EAAE;AAAA,IACxC;AAEA,QAAI,CAAC,MAAM,QAAQ,QAAQ;AACzB,cAAQ,IAAIA,OAAM,IAAI,kBAAkB,CAAC;AACzC;AAAA,IACF;AAEA,YAAQ,IAAIA,OAAM,KAAK,qBAAqB,CAAC;AAC7C,eAAW,UAAU,KAAK,SAAS;AACjC,YAAM,OAAO,OAAO,SAAS,WAAWA,OAAM,IAAI,IAAI,IAAI,OAAO,SAAS,QAAQA,OAAM,MAAM,IAAI,IAAIA,OAAM,OAAO,IAAI;AACvH,cAAQ,IAAI,KAAK,IAAI,GAAG,OAAO,IAAI,KAAK,OAAO,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,IACnE;AACA,YAAQ,IAAIA,OAAM,IAAI;AAAA,0BAA6B,KAAK,yBAAyB,SAAS,CAAC;AAE3F,UAAM,aAAaC,KAAI,uBAAuB,EAAE,MAAM;AACtD,QAAI;AACF,YAAM,SAAS,MAAM;AAAA,QACnB,wBAAwB,OAAO,EAAE;AAAA,QACjC,EAAE,QAAQ,QAAQ,MAAM,EAAE,UAAU,EAAE;AAAA,MACxC;AACA,iBAAW,QAAQ,aAAa;AAEhC,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,YAAY,OAAO,WAAW,WAAMD,OAAM,MAAM,OAAO,OAAO,UAAU,CAAC,CAAC,KAAKA,OAAM,MAAM,IAAI,OAAO,WAAW,EAAE,CAAC,GAAG;AACnI,UAAI,OAAO,aAAc,SAAQ,IAAI,cAAc,OAAO,YAAY,QAAQ;AAC9E,UAAI,OAAO,kBAAmB,SAAQ,IAAI,mBAAmB,OAAO,iBAAiB,QAAQ;AAC7F,UAAI,OAAO,WAAY,SAAQ,IAAI,YAAY,OAAO,UAAU,QAAQ;AACxE,cAAQ,IAAI,EAAE;AAAA,IAChB,SAAS,KAAK;AACZ,iBAAW,KAAK,sBAAsB;AACtC,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,YAAY,QAAsB;AACzC,QAAM,cAAkD;AAAA,IACtD,GAAGA,OAAM;AAAA,IACT,GAAGA,OAAM;AAAA,IACT,GAAGA,OAAM;AAAA,IACT,GAAGA,OAAM,IAAI,SAAS;AAAA,IACtB,GAAGA,OAAM;AAAA,EACX;AACA,QAAM,aAAa,YAAY,OAAO,KAAK,KAAKA,OAAM;AAEtD,UAAQ,IAAIA,OAAM,KAAK,6BAA6B,CAAC;AACrD,UAAQ,IAAI,YAAY,WAAW,OAAO,KAAK,CAAC,YAAY,WAAW,OAAO,OAAO,KAAK,CAAC,CAAC;AAAA,CAAQ;AAEpG,MAAI,OAAO,KAAK,OAAO,kBAAkB,EAAE,QAAQ;AACjD,YAAQ,IAAIA,OAAM,IAAI,uBAAuB,CAAC;AAC9C,UAAM,aAAa,OAAO,QAAQ,OAAO,kBAAkB;AAC3D,UAAM,WAAW,KAAK,IAAI,GAAG,WAAW,IAAI,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;AAE/D,eAAW,CAAC,MAAM,IAAI,KAAK,YAAY;AACrC,YAAM,SAAS,WAAW,IAAI,KAAK,MAAO,KAAK,QAAQ,WAAY,EAAE,IAAI;AACzE,YAAM,MAAM,SAAI,OAAO,MAAM,IAAI,SAAI,OAAO,KAAK,MAAM;AACvD,cAAQ,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC,IAAI,GAAG,IAAI,KAAK,KAAK,WAAW,KAAK,MAAM,UAAU;AAAA,IACzF;AACA,YAAQ,IAAI,EAAE;AAAA,EAChB;AAEA,MAAI,OAAO,gBAAgB,QAAQ;AACjC,YAAQ,IAAIA,OAAM,IAAI,oBAAoB,CAAC;AAC3C,eAAW,OAAO,OAAO,iBAAiB;AACxC,YAAM,OAAO,IAAI,aAAa,SAASA,OAAM,IAAI,GAAG,IAAI,IAAI,aAAa,WAAWA,OAAM,OAAO,GAAG,IAAIA,OAAM,IAAI,GAAG;AACrH,cAAQ,IAAI,OAAO,IAAI,IAAI,IAAI,WAAW,EAAE;AAAA,IAC9C;AACA,YAAQ,IAAI,EAAE;AAAA,EAChB;AACF;;;ACnJA,OAAOE,YAAW;AAClB,OAAOC,UAAS;AAOhB,eAAsB,YAAY,SAG/B;AACD,QAAMC,QAAO,cAAc;AAC3B,MAAI,CAACA,OAAM;AACT,YAAQ,IAAIC,OAAM,IAAI,+CAA+C,CAAC;AACtE,UAAM,IAAI,MAAM,UAAU;AAAA,EAC5B;AAEA,QAAM,cAAc,mBAAmB,QAAQ,IAAI,CAAC;AACpD,QAAM,OAAO,uBAAuB,WAAW;AAE/C,QAAM,QAAQ,MAAM;AAAA,IAClB;AAAA,IACA,EAAE,QAAQ,QAAQ,MAAM,EAAE,iBAAiB,KAAK,EAAE;AAAA,EACpD;AAEA,MAAI,CAAC,OAAO,SAAS;AACnB,YAAQ,IAAIA,OAAM,OAAO,6CAA6C,CAAC;AACvE,UAAM,IAAI,MAAM,UAAU;AAAA,EAC5B;AAEA,QAAM,YAAY,MAAM,QAAQ;AAEhC,QAAM,UAAUC,KAAI,yBAAyB,EAAE,MAAM;AACrD,QAAM,aAAa,eAAe,QAAQ,IAAI,CAAC;AAC/C,UAAQ,OAAO;AAEf,QAAM,cAAc,MAAM;AAAA,IACxB,qBAAqB,SAAS;AAAA,EAChC;AACA,UAAQ,QAAQ,SAAS,WAAW,MAAM,iBAAiB,aAAa,UAAU,CAAC,eAAe;AAElG,MAAI,CAAC,aAAa,QAAQ;AACxB,YAAQ,IAAID,OAAM,IAAI,+EAA+E,CAAC;AACtG;AAAA,EACF;AAEA,QAAM,iBAAiB,QAAQ;AAC/B,QAAM,iBAAiB,iBACnB,YAAY,OAAO,OAAK,EAAE,aAAa,kBAAkB,EAAE,aAAa,MAAM,IAC9E;AACJ,QAAM,gBAAgB,iBAClB,WAAW,OAAO,OAAK,EAAE,aAAa,cAAc,IACpD;AAEJ,QAAM,OAAO,aAAa,gBAAgB,aAAa;AAEvD,YAAU,IAAI;AAEd,MAAI,KAAK,QAAQ,WAAW,KAAK,KAAK,SAAS,WAAW,GAAG;AAC3D,YAAQ,IAAIA,OAAM,MAAM,uBAAuB,CAAC;AAChD,UAAM,eAAe,WAAW,gBAAgB,IAAI;AACpD;AAAA,EACF;AAEA,MAAI,QAAQ,QAAQ;AAClB,YAAQ,IAAIA,OAAM,IAAI,qCAAgC,CAAC;AACvD;AAAA,EACF;AAEA,QAAM,iBAAiBC,KAAI,0CAA0C,EAAE,MAAM;AAC7E,MAAI;AACF,UAAM,QAAQ,oBAAoB,CAAC,GAAG,KAAK,SAAS,GAAG,KAAK,SAAS,IAAI,OAAK,EAAE,MAAM,CAAC,CAAC;AACxF,QAAI,OAAO;AACT,iBAAW,KAAK;AAAA,IAClB;AACA,mBAAe,QAAQ,2BAA2B;AAAA,EACpD,SAAS,KAAK;AACZ,mBAAe,KAAK,aAAa;AACjC,UAAM;AAAA,EACR;AAEA,QAAM,eAAe,WAAW,gBAAgB,IAAI;AACtD;AAEA,eAAe,eACb,WACA,aACA,MACA;AACA,QAAM,QAAQ;AAAA,IACZ,GAAG,KAAK,UAAU,IAAI,QAAM;AAAA,MAC1B,QAAQ,EAAE,OAAO;AAAA,MACjB,OAAO;AAAA,MACP,WAAW,EAAE,MAAM;AAAA,IACrB,EAAE;AAAA,IACF,GAAG,KAAK,QAAQ,IAAI,QAAM;AAAA,MACxB,QAAQ,EAAE;AAAA,MACV,OAAO;AAAA,IACT,EAAE;AAAA,IACF,GAAG,KAAK,SAAS,IAAI,QAAM;AAAA,MACzB,QAAQ,EAAE,OAAO;AAAA,MACjB,OAAO;AAAA,MACP,WAAW,EAAE,MAAM;AAAA,IACrB,EAAE;AAAA,IACF,GAAG,KAAK,MAAM,IAAI,QAAM;AAAA,MACtB,QAAQ,EAAE;AAAA,MACV,OAAO;AAAA,MACP,WAAW,EAAE;AAAA,IACf,EAAE;AAAA,EACJ;AAEA,QAAM,YAAY,IAAI,IAAI,YAAY,IAAI,OAAK,EAAE,QAAQ,CAAC;AAC1D,aAAW,YAAY,WAAW;AAChC,QAAI;AACF,YAAM,WAAW,qBAAqB,SAAS,WAAW;AAAA,QACxD,QAAQ;AAAA,QACR,MAAM;AAAA,UACJ;AAAA,UACA,OAAO,MAAM,OAAO,OAAK;AACvB,kBAAM,QAAQ,YAAY,KAAK,OAAK,EAAE,OAAO,EAAE,MAAM;AACrD,mBAAO,OAAO,aAAa;AAAA,UAC7B,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH,QAAQ;AAAA,IAER;AAAA,EACF;AACF;AAEA,SAAS,UAAU,MAAuC;AACxD,UAAQ,IAAID,OAAM,KAAK,mBAAmB,CAAC;AAE3C,MAAI,KAAK,UAAU,QAAQ;AACzB,YAAQ,IAAI,KAAKA,OAAM,MAAM,QAAG,CAAC,eAAe,KAAK,UAAU,MAAM,EAAE;AAAA,EACzE;AACA,MAAI,KAAK,QAAQ,QAAQ;AACvB,YAAQ,IAAI,KAAKA,OAAM,IAAI,QAAG,CAAC,aAAa,KAAK,QAAQ,MAAM,EAAE;AACjE,eAAW,QAAQ,KAAK,SAAS;AAC/B,cAAQ,IAAI,OAAOA,OAAM,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,QAAQ,GAAG;AAAA,IAClF;AAAA,EACF;AACA,MAAI,KAAK,SAAS,QAAQ;AACxB,YAAQ,IAAI,KAAKA,OAAM,OAAO,GAAG,CAAC,cAAc,KAAK,SAAS,MAAM,EAAE;AACtE,eAAW,QAAQ,KAAK,UAAU;AAChC,cAAQ,IAAI,OAAOA,OAAM,OAAO,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,QAAQ,GAAG;AAAA,IAC1G;AAAA,EACF;AACA,MAAI,KAAK,MAAM,QAAQ;AACrB,YAAQ,IAAI,KAAKA,OAAM,IAAI,GAAG,CAAC,wBAAwB,KAAK,MAAM,MAAM,EAAE;AAC1E,eAAW,QAAQ,KAAK,OAAO;AAC7B,cAAQ,IAAI,OAAOA,OAAM,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,QAAQ,GAAG;AAAA,IAClF;AAAA,EACF;AACA,UAAQ,IAAI,EAAE;AAChB;AAEA,SAAS,oBAAoB,OAA8D;AACzF,MAAI,CAAC,MAAM,OAAQ,QAAO;AAE1B,QAAM,SAAkC,CAAC;AACzC,QAAM,SAAkC,CAAC;AACzC,MAAI,SAAS;AAEb,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,KAAK;AAErB,QAAI,KAAK,aAAa,YAAY,KAAK,aAAa,QAAQ;AAC1D,UAAI,KAAK,SAAS,UAAU,KAAK,SAAS,aAAa;AACrD,eAAO,WAAW,QAAQ;AAC1B,iBAAS;AAAA,MACX,WAAW,KAAK,SAAS,YAAY,KAAK,SAAS,iBAAiB;AAClE,eAAO,WAAW;AAClB,iBAAS;AAAA,MACX,WAAW,KAAK,SAAS,SAAS;AAChC,YAAI,CAAC,OAAO,OAAQ,QAAO,SAAS,CAAC;AACrC,QAAC,OAAO,OAAoD,KAAK;AAAA,UAC/D,MAAM,KAAK;AAAA,UACX,SAAU,QAAQ,QAAmB;AAAA,QACvC,CAAC;AACD,iBAAS;AAAA,MACX,WAAW,KAAK,SAAS,OAAO;AAC9B,YAAI,CAAC,OAAO,WAAY,QAAO,aAAa,CAAC;AAC7C,QAAC,OAAO,WAAuC,KAAK,IAAI,IAAI;AAC5D,iBAAS;AAAA,MACX;AAAA,IACF;AAEA,QAAI,KAAK,aAAa,YAAY,KAAK,aAAa,QAAQ;AAC1D,UAAI,KAAK,SAAS,UAAU,KAAK,SAAS,gBAAgB;AACxD,eAAO,cAAc,QAAQ;AAC7B,iBAAS;AAAA,MACX,WAAW,KAAK,SAAS,QAAQ;AAC/B,YAAI,CAAC,OAAO,MAAO,QAAO,QAAQ,CAAC;AACnC,QAAC,OAAO,MAAuD,KAAK;AAAA,UAClE,UAAU,KAAK;AAAA,UACf,SAAU,QAAQ,QAAmB;AAAA,QACvC,CAAC;AACD,iBAAS;AAAA,MACX,WAAW,KAAK,SAAS,OAAO;AAC9B,YAAI,CAAC,OAAO,WAAY,QAAO,aAAa,CAAC;AAC7C,QAAC,OAAO,WAAuC,KAAK,IAAI,IAAI;AAC5D,iBAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAM,YAAY,OAAO,KAAK,MAAM,EAAE,SAAS;AAC/C,QAAM,YAAY,OAAO,KAAK,MAAM,EAAE,SAAS;AAE/C,SAAO;AAAA,IACL,aAAa,aAAa,YAAY,SAAS,YAAY,WAAW;AAAA,IACtE,GAAI,YAAY,EAAE,OAAwB,IAAI,CAAC;AAAA,IAC/C,GAAI,YAAY,EAAE,OAAwB,IAAI,CAAC;AAAA,EACjD;AACF;;;AC1NA,OAAOE,aAAW;AAClB,OAAOC,UAAS;AAMhB,eAAsB,YAAY,SAAgC;AAChE,QAAMC,QAAO,cAAc;AAC3B,MAAI,CAACA,OAAM;AACT,YAAQ,IAAIC,QAAM,IAAI,+CAA+C,CAAC;AACtE,UAAM,IAAI,MAAM,UAAU;AAAA,EAC5B;AAEA,QAAM,cAAc,mBAAmB,QAAQ,IAAI,CAAC;AACpD,QAAM,OAAO,uBAAuB,WAAW;AAE/C,QAAM,QAAQ,MAAM;AAAA,IAClB;AAAA,IACA,EAAE,QAAQ,QAAQ,MAAM,EAAE,iBAAiB,KAAK,EAAE;AAAA,EACpD;AAEA,MAAI,CAAC,OAAO,SAAS;AACnB,YAAQ,IAAIA,QAAM,OAAO,6CAA6C,CAAC;AACvE,UAAM,IAAI,MAAM,UAAU;AAAA,EAC5B;AAEA,QAAM,YAAY,MAAM,QAAQ;AAEhC,QAAM,UAAUC,KAAI,qCAAqC,EAAE,MAAM;AACjE,QAAM,aAAa,eAAe,QAAQ,IAAI,CAAC;AAC/C,QAAM,cAAc,MAAM;AAAA,IACxB,qBAAqB,SAAS;AAAA,EAChC;AACA,UAAQ,KAAK;AAEb,MAAI,CAAC,aAAa,QAAQ;AACxB,YAAQ,IAAID,QAAM,IAAI,oCAAoC,CAAC;AAC3D;AAAA,EACF;AAEA,QAAM,iBAAiB,QAAQ;AAC/B,QAAM,iBAAiB,iBACnB,YAAY,OAAO,OAAK,EAAE,aAAa,kBAAkB,EAAE,aAAa,MAAM,IAC9E;AACJ,QAAM,gBAAgB,iBAClB,WAAW,OAAO,OAAK,EAAE,aAAa,cAAc,IACpD;AAEJ,QAAM,OAAO,aAAa,gBAAgB,aAAa;AAEvD,UAAQ,IAAIA,QAAM,KAAK,mBAAmB,CAAC;AAE3C,MAAI,KAAK,UAAU,QAAQ;AACzB,YAAQ,IAAI,KAAKA,QAAM,MAAM,QAAG,CAAC,aAAa,KAAK,UAAU,MAAM,EAAE;AAAA,EACvE;AACA,MAAI,KAAK,QAAQ,QAAQ;AACvB,YAAQ,IAAI,KAAKA,QAAM,IAAI,QAAG,CAAC,qBAAqB,KAAK,QAAQ,MAAM,EAAE;AACzE,eAAW,QAAQ,KAAK,SAAS;AAC/B,cAAQ,IAAI,OAAOA,QAAM,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,QAAQ,GAAG;AAAA,IAClF;AAAA,EACF;AACA,MAAI,KAAK,SAAS,QAAQ;AACxB,YAAQ,IAAI,KAAKA,QAAM,OAAO,GAAG,CAAC,cAAc,KAAK,SAAS,MAAM,EAAE;AACtE,eAAW,QAAQ,KAAK,UAAU;AAChC,cAAQ,IAAI,OAAOA,QAAM,OAAO,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,QAAQ,GAAG;AAAA,IAC1G;AAAA,EACF;AACA,MAAI,KAAK,MAAM,QAAQ;AACrB,YAAQ,IAAI,KAAKA,QAAM,IAAI,GAAG,CAAC,gBAAgB,KAAK,MAAM,MAAM,EAAE;AAClE,eAAW,QAAQ,KAAK,OAAO;AAC7B,cAAQ,IAAI,OAAOA,QAAM,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,QAAQ,GAAG;AAAA,IAClF;AAAA,EACF;AAEA,MAAI,KAAK,QAAQ,WAAW,KAAK,KAAK,SAAS,WAAW,GAAG;AAC3D,YAAQ,IAAIA,QAAM,MAAM,8BAA8B,CAAC;AAAA,EACzD,OAAO;AACL,YAAQ,IAAIA,QAAM,IAAI,4CAA4C,CAAC;AAAA,EACrE;AACF;;;AChFA,OAAOE,aAAW;AAClB,OAAOC,UAAS;;;ACDhB,SAAS,YAAAC,iBAAgB;AAEzB,IAAM,iBAAiB;AAEvB,IAAM,eAAe;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,cAAwB;AAC/B,SAAO,aAAa,QAAQ,OAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;AACnD;AAEA,SAAS,SAAS,KAAqB;AACrC,MAAI;AACF,WAAOA,UAAS,KAAK;AAAA,MACnB,UAAU;AAAA,MACV,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,MAC9B,WAAW,KAAK,OAAO;AAAA,IACzB,CAAC,EAAE,KAAK;AAAA,EACV,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAWO,SAAS,YAAY,SAAoC;AAC9D,MAAI,gBAAgB;AACpB,MAAI,aAAa;AACjB,MAAI,eAAe;AACnB,MAAI,eAAyB,CAAC;AAE9B,MAAI,SAAS;AACX,oBAAgB,SAAS,YAAY,OAAO,UAAU,YAAY,EAAE,KAAK,GAAG,CAAC,EAAE;AAC/E,UAAM,iBAAiB,SAAS,wBAAwB,OAAO,QAAQ;AACvE,QAAI,gBAAgB;AAClB,mBAAa,KAAK,GAAG,eAAe,MAAM,IAAI,EAAE,OAAO,OAAO,CAAC;AAAA,IACjE;AAAA,EACF,OAAO;AACL,oBAAgB,SAAS,uBAAuB;AAAA,EAClD;AAEA,eAAa,SAAS,qBAAqB,YAAY,EAAE,KAAK,GAAG,CAAC,EAAE;AACpE,iBAAe,SAAS,YAAY,YAAY,EAAE,KAAK,GAAG,CAAC,EAAE;AAE7D,QAAM,cAAc,SAAS,+BAA+B;AAC5D,MAAI,aAAa;AACf,iBAAa,KAAK,GAAG,YAAY,MAAM,IAAI,EAAE,OAAO,OAAO,CAAC;AAAA,EAC9D;AACA,QAAM,gBAAgB,SAAS,sBAAsB;AACrD,MAAI,eAAe;AACjB,iBAAa,KAAK,GAAG,cAAc,MAAM,IAAI,EAAE,OAAO,OAAO,CAAC;AAAA,EAChE;AAEA,QAAM,iBAAiB,SAAS,0CAA0C;AAC1E,MAAI,gBAAgB;AAClB,iBAAa,KAAK,GAAG,eAAe,MAAM,IAAI,EAAE,OAAO,OAAO,CAAC;AAAA,EACjE;AAEA,iBAAe,CAAC,GAAG,IAAI,IAAI,YAAY,CAAC,EAAE;AAAA,IACxC,OAAK,CAAC,aAAa,KAAK,OAAK,MAAM,KAAK,EAAE,WAAW,CAAC,CAAC;AAAA,EACzD;AAEA,QAAM,YAAY,cAAc,SAAS,WAAW,SAAS,aAAa;AAC1E,MAAI,YAAY,gBAAgB;AAC9B,UAAM,QAAQ,iBAAiB;AAC/B,oBAAgB,cAAc,MAAM,GAAG,KAAK,MAAM,cAAc,SAAS,KAAK,CAAC;AAC/E,iBAAa,WAAW,MAAM,GAAG,KAAK,MAAM,WAAW,SAAS,KAAK,CAAC;AACtE,mBAAe,aAAa,MAAM,GAAG,KAAK,MAAM,aAAa,SAAS,KAAK,CAAC;AAAA,EAC9E;AAEA,QAAM,aAAa,CAAC,EAAE,iBAAiB,cAAc,gBAAgB,aAAa;AAElF,QAAM,QAAkB,CAAC;AACzB,MAAI,aAAa,OAAQ,OAAM,KAAK,GAAG,aAAa,MAAM,gBAAgB;AAC1E,MAAI,cAAe,OAAM,KAAK,mBAAmB;AACjD,MAAI,WAAY,OAAM,KAAK,gBAAgB;AAC3C,MAAI,aAAc,OAAM,KAAK,kBAAkB;AAC/C,QAAM,UAAU,MAAM,KAAK,IAAI,KAAK;AAEpC,SAAO,EAAE,YAAY,eAAe,YAAY,cAAc,cAAc,QAAQ;AACtF;;;AC5FA,OAAOC,UAAQ;AACf,OAAOC,YAAU;AAUV,SAAS,iBAAiB,MAA6B;AAC5D,QAAM,UAAoB,CAAC;AAE3B,MAAI,KAAK,UAAU;AACjB,IAAAD,KAAG,cAAc,aAAa,KAAK,QAAQ;AAC3C,YAAQ,KAAK,WAAW;AAAA,EAC1B;AAEA,MAAI,KAAK,UAAU;AACjB,IAAAA,KAAG,cAAc,aAAa,KAAK,QAAQ;AAC3C,YAAQ,KAAK,WAAW;AAAA,EAC1B;AAEA,MAAI,KAAK,aAAa;AACpB,IAAAA,KAAG,cAAc,gBAAgB,KAAK,WAAW;AACjD,YAAQ,KAAK,cAAc;AAAA,EAC7B;AAEA,MAAI,KAAK,aAAa;AACpB,UAAM,WAAWC,OAAK,KAAK,WAAW,OAAO;AAC7C,QAAI,CAACD,KAAG,WAAW,QAAQ,EAAG,CAAAA,KAAG,UAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AACxE,eAAW,QAAQ,KAAK,aAAa;AACnC,YAAM,WAAWC,OAAK,KAAK,UAAU,KAAK,QAAQ;AAClD,MAAAD,KAAG,cAAc,UAAU,KAAK,OAAO;AACvC,cAAQ,KAAK,QAAQ;AAAA,IACvB;AAAA,EACF;AAEA,MAAI,KAAK,cAAc;AACrB,UAAM,YAAYC,OAAK,KAAK,WAAW,QAAQ;AAC/C,QAAI,CAACD,KAAG,WAAW,SAAS,EAAG,CAAAA,KAAG,UAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAC1E,eAAW,SAAS,KAAK,cAAc;AACrC,YAAM,WAAWC,OAAK,KAAK,WAAW,MAAM,QAAQ;AACpD,MAAAD,KAAG,cAAc,UAAU,MAAM,OAAO;AACxC,cAAQ,KAAK,QAAQ;AAAA,IACvB;AAAA,EACF;AAEA,SAAO;AACT;;;AFrBA,SAAS,IAAI,UAAmB,MAAiB;AAC/C,MAAI,CAAC,MAAO,SAAQ,IAAI,GAAG,IAAI;AACjC;AAEA,eAAsB,eAAe,SAAyB;AAC5D,QAAM,QAAQ,CAAC,CAAC,QAAQ;AAExB,MAAI;AACF,UAAME,QAAO,cAAc;AAC3B,QAAI,CAACA,OAAM;AACT,UAAI,MAAO;AACX,cAAQ,IAAIC,QAAM,IAAI,+CAA+C,CAAC;AACtE,YAAM,IAAI,MAAM,UAAU;AAAA,IAC5B;AAEA,QAAI,CAAC,UAAU,GAAG;AAChB,UAAI,MAAO;AACX,cAAQ,IAAIA,QAAM,IAAI,8BAA8B,CAAC;AACrD,YAAM,IAAI,MAAM,UAAU;AAAA,IAC5B;AAEA,UAAM,QAAQ,UAAU;AACxB,UAAM,UAAU,OAAO,kBAAkB;AAEzC,UAAM,OAAO,YAAY,OAAO;AAChC,UAAM,aAAa,kBAAkB;AAErC,QAAI,CAAC,KAAK,YAAY;AACpB,UAAI,YAAY;AACd,mBAAW,EAAE,gBAAgB,YAAY,uBAAsB,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC;AAAA,MAC3F;AACA,UAAI,OAAOA,QAAM,IAAI,gCAAgC,CAAC;AACtD;AAAA,IACF;AAEA,UAAM,UAAU,QAAQ,OAAOC,KAAI,sBAAsB,EAAE,MAAM;AAEjE,UAAM,eAAe,oBAAoB,QAAQ,IAAI,CAAC;AAEtD,UAAM,cAAc,mBAAmB,QAAQ,IAAI,CAAC;AACpD,UAAM,iBAAiB;AAAA,MACrB,WAAW,YAAY;AAAA,MACvB,YAAY,YAAY;AAAA,MACxB,aAAa,YAAY;AAAA,IAC3B;AAEA,UAAM,WAAW,MAAM,WAA4B,uBAAuB;AAAA,MACxE,QAAQ;AAAA,MACR,MAAM;AAAA,QACJ,MAAM;AAAA,UACJ,WAAW,KAAK;AAAA,UAChB,QAAQ,KAAK;AAAA,UACb,UAAU,KAAK;AAAA,UACf,cAAc,KAAK;AAAA,UACnB,SAAS,KAAK;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAED,QAAI,CAAC,SAAS,eAAe,SAAS,YAAY,WAAW,GAAG;AAC9D,eAAS,QAAQ,uBAAuB;AACxC,UAAI,YAAY;AACd,mBAAW,EAAE,gBAAgB,YAAY,uBAAsB,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC;AAAA,MAC3F;AACA;AAAA,IACF;AAEA,QAAI,QAAQ,QAAQ;AAClB,eAAS,KAAK,8BAAyB;AACvC,iBAAW,OAAO,SAAS,aAAa;AACtC,gBAAQ,IAAI,KAAKD,QAAM,OAAO,GAAG,CAAC,IAAI,GAAG,EAAE;AAAA,MAC7C;AACA,UAAI,SAAS,gBAAgB;AAC3B,gBAAQ,IAAIA,QAAM,IAAI;AAAA,IAAO,SAAS,cAAc,EAAE,CAAC;AAAA,MACzD;AACA;AAAA,IACF;AAEA,UAAM,UAAU,iBAAiB,SAAS,WAAW;AACrD,aAAS,QAAQ,WAAW,QAAQ,MAAM,OAAO,QAAQ,WAAW,IAAI,KAAK,GAAG,EAAE;AAElF,eAAW,QAAQ,SAAS;AAC1B,UAAI,OAAO,KAAKA,QAAM,MAAM,QAAG,CAAC,IAAI,IAAI,EAAE;AAAA,IAC5C;AAEA,QAAI,SAAS,gBAAgB;AAC3B,UAAI,OAAOA,QAAM,IAAI;AAAA,IAAO,SAAS,cAAc,EAAE,CAAC;AAAA,IACxD;AAEA,QAAI,YAAY;AACd,iBAAW,EAAE,gBAAgB,YAAY,uBAAsB,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC;AAAA,IAC3F;AAEA,eAAW,qBAAqB;AAAA,MAC9B,cAAc,QAAQ;AAAA,MACtB,eAAe,KAAK,aAAa;AAAA,IACnC,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,QAAI,eAAe,SAAS,IAAI,YAAY,WAAY,OAAM;AAC9D,QAAI,MAAO;AACX,UAAM,MAAM,eAAe,QAAQ,IAAI,UAAU;AACjD,YAAQ,IAAIA,QAAM,IAAI,mBAAmB,GAAG,EAAE,CAAC;AAC/C,UAAM,IAAI,MAAM,UAAU;AAAA,EAC5B;AACF;;;AGvIA,OAAOE,aAAW;AAGlB,eAAsB,sBAAsB;AAC1C,QAAM,SAAS,YAAY;AAC3B,MAAI,OAAO,kBAAkB;AAC3B,YAAQ,IAAIC,QAAM,IAAI,yBAAyB,CAAC;AAChD;AAAA,EACF;AACA,UAAQ,IAAIA,QAAM,MAAM,QAAG,IAAI,qDAAqD;AACpF,UAAQ,IAAIA,QAAM,IAAI,yDAAyD,CAAC;AAClF;AAEA,eAAsB,qBAAqB;AACzC,QAAM,SAAS,WAAW;AAC1B,MAAI,OAAO,UAAU;AACnB,YAAQ,IAAIA,QAAM,IAAI,iBAAiB,CAAC;AACxC;AAAA,EACF;AACA,UAAQ,IAAIA,QAAM,MAAM,QAAG,IAAI,qDAAqD;AACtF;AAEA,eAAsB,qBAAqB;AACzC,QAAM,YAAY,gBAAgB;AAClC,MAAI,WAAW;AACb,YAAQ,IAAIA,QAAM,MAAM,QAAG,IAAI,2BAA2BA,QAAM,MAAM,WAAW,CAAC;AAAA,EACpF,OAAO;AACL,YAAQ,IAAIA,QAAM,IAAI,QAAG,IAAI,2BAA2BA,QAAM,OAAO,eAAe,CAAC;AACrF,YAAQ,IAAIA,QAAM,IAAI,sEAAsE,CAAC;AAAA,EAC/F;AACF;;;AnCbA,IAAMC,aAAYC,OAAK,QAAQC,eAAc,YAAY,GAAG,CAAC;AAC7D,IAAMC,OAAM,KAAK;AAAA,EACfC,KAAG,aAAaH,OAAK,QAAQD,YAAW,MAAM,cAAc,GAAG,OAAO;AACxE;AAEA,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,SAAS,EACd,YAAY,yCAAyC,EACrD,QAAQG,KAAI,OAAO;AAEtB,QACG,QAAQ,MAAM,EACd,YAAY,gDAAgD,EAC5D,OAAO,kBAAkB,uCAAuC,EAChE,OAAO,aAAa,uCAAuC,EAC3D,OAAO,WAAW,4CAA4C,EAC9D,OAAO,WAAW;AAErB,QACG,QAAQ,MAAM,EACd,YAAY,2CAA2C,EACvD,OAAO,WAAW;AAErB,QACG,QAAQ,QAAQ,EAChB,YAAY,mCAAmC,EAC/C,OAAO,UAAU,gBAAgB,EACjC,OAAO,aAAa;AAEvB,QACG,QAAQ,QAAQ,EAChB,YAAY,qCAAqC,EACjD,OAAO,aAAa,uCAAuC,EAC3D,OAAO,aAAa;AAEvB,QACG,QAAQ,OAAO,EACf,YAAY,2BAA2B,EACvC,OAAO,YAAY;AAEtB,QACG,QAAQ,QAAQ,EAChB,YAAY,0BAA0B,EACtC,OAAO,aAAa;AAEvB,QACG,QAAQ,WAAW,EACnB,YAAY,2CAA2C,EACvD,OAAO,cAAc,8BAA8B,EACnD,OAAO,qBAAqB,gDAAgD,EAC5E,OAAO,gBAAgB;AAE1B,QACG,QAAQ,QAAQ,EAChB,YAAY,oCAAoC,EAChD,OAAO,SAAS,iCAAiC,EACjD,OAAO,UAAU,gBAAgB,EACjC,OAAO,aAAa;AAEvB,QACG,QAAQ,MAAM,EACd,YAAY,qCAAqC,EACjD,OAAO,yBAAyB,0CAA0C,EAC1E,OAAO,aAAa,uCAAuC,EAC3D,OAAO,WAAW;AAErB,QACG,QAAQ,MAAM,EACd,YAAY,wCAAwC,EACpD,OAAO,yBAAyB,0CAA0C,EAC1E,OAAO,WAAW;AAErB,QACG,QAAQ,SAAS,EACjB,YAAY,0CAA0C,EACtD,OAAO,WAAW,oCAAoC,EACtD,OAAO,aAAa,uCAAuC,EAC3D,OAAO,cAAc;AAExB,IAAM,QAAQ,QACX,QAAQ,OAAO,EACf,YAAY,kCAAkC;AAEjD,MACG,QAAQ,SAAS,EACjB,YAAY,sCAAsC,EAClD,OAAO,mBAAmB;AAE7B,MACG,QAAQ,QAAQ,EAChB,YAAY,qCAAqC,EACjD,OAAO,kBAAkB;AAE5B,MACG,QAAQ,QAAQ,EAChB,YAAY,yCAAyC,EACrD,OAAO,kBAAkB;;;AoCnH5B,OAAOE,UAAQ;AACf,OAAOC,YAAU;AACjB,SAAS,iBAAAC,sBAAqB;AAC9B,OAAOC,eAAc;AACrB,SAAS,YAAAC,iBAAgB;AACzB,OAAOC,aAAW;AAClB,OAAOC,WAAS;AAEhB,IAAM,eAAeL,OAAK,QAAQC,eAAc,YAAY,GAAG,CAAC;AAChE,IAAMK,OAAM,KAAK;AAAA,EACfP,KAAG,aAAaC,OAAK,QAAQ,cAAc,MAAM,cAAc,GAAG,OAAO;AAC3E;AAEA,SAAS,YAAY,UAAoC;AACvD,QAAM,KAAKE,UAAS,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACpF,SAAO,IAAI,QAAQ,CAACK,aAAY;AAC9B,OAAG,SAASH,QAAM,KAAK,GAAG,QAAQ,GAAG,GAAG,CAAC,WAAW;AAClD,SAAG,MAAM;AACT,YAAM,aAAa,OAAO,KAAK,EAAE,YAAY;AAC7C,MAAAG,SAAQ,eAAe,MAAM,eAAe,OAAO,eAAe,KAAK;AAAA,IACzE,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAsB,kBAAiC;AACrD,MAAI;AACF,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,UAAU,WAAW,MAAM,WAAW,MAAM,GAAG,GAAI;AAEzD,UAAM,MAAM,MAAM,MAAM,qDAAqD;AAAA,MAC3E,QAAQ,WAAW;AAAA,IACrB,CAAC;AACD,iBAAa,OAAO;AAEpB,QAAI,CAAC,IAAI,GAAI;AAEb,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,UAAM,SAAS,KAAK;AACpB,QAAI,CAAC,OAAQ;AAEb,UAAM,UAAUD,KAAI;AACpB,QAAI,YAAY,OAAQ;AAExB,UAAM,gBAAgB,QAAQ,MAAM,UAAU;AAE9C,QAAI,CAAC,eAAe;AAClB,cAAQ;AAAA,QACNF,QAAM;AAAA,UACJ;AAAA,oBAAuB,OAAO,OAAO,MAAM;AAAA,MAASA,QAAM,KAAK,gCAAgC,CAAC;AAAA;AAAA,QAClG;AAAA,MACF;AACA;AAAA,IACF;AAEA,YAAQ;AAAA,MACNA,QAAM,OAAO;AAAA,oBAAuB,OAAO,OAAO,MAAM,EAAE;AAAA,IAC5D;AAEA,UAAM,eAAe,MAAM,YAAY,qCAAqC;AAC5E,QAAI,CAAC,cAAc;AACjB,cAAQ,IAAI;AACZ;AAAA,IACF;AAEA,UAAM,UAAUC,MAAI,6BAA6B,EAAE,MAAM;AACzD,QAAI;AACF,MAAAF,UAAS,0CAA0C,EAAE,OAAO,OAAO,CAAC;AACpE,cAAQ,QAAQC,QAAM,MAAM,cAAc,MAAM,EAAE,CAAC;AAGnD,YAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AACjC,cAAQ,IAAIA,QAAM,IAAI;AAAA,sBAAyB,KAAK,KAAK,GAAG,CAAC;AAAA,CAAI,CAAC;AAClE,MAAAD,UAAS,WAAW,KAAK,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,IAAI;AAAA,QAClE,OAAO;AAAA,MACT,CAAC;AACD,cAAQ,KAAK,CAAC;AAAA,IAChB,QAAQ;AACN,cAAQ,KAAK,eAAe;AAC5B,cAAQ;AAAA,QACNC,QAAM;AAAA,UACJ,OAAOA,QAAM,KAAK,gCAAgC,CAAC;AAAA;AAAA,QACrD;AAAA,MACF;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AACF;;;ACjFA,IAAM,WAAW,WAAW;AAC5B,YAAY;AACZ,IAAI,UAAU;AACZ,aAAW,eAAe;AAC5B;AAEA,IAAM,OAAO,cAAc;AAC3B,IAAI,MAAM;AACR,eAAa,KAAK,QAAQ,KAAK,KAAK;AACpC,SAAO,QAAQ,EAAE,IAAI,KAAK,QAAQ,OAAO,KAAK,MAAM,CAAC;AACvD;AAEA,MAAM,gBAAgB;AAEtB,eAAe,aAAa,MAAc;AACxC,QAAM,QAAQ,IAAI;AAAA,IAChB,kBAAkB;AAAA,IAClB,OAAO,MAAM,GAAI;AAAA,EACnB,CAAC;AACD,UAAQ,KAAK,IAAI;AACnB;AAEA,QAAQ,GAAG,UAAU,MAAM,aAAa,GAAG,CAAC;AAC5C,QAAQ,GAAG,WAAW,MAAM,aAAa,GAAG,CAAC;AAE7C,QAAQ,WAAW,EAChB,MAAM,CAAC,QAAQ;AACd,QAAM,MAAM,eAAe,QAAQ,IAAI,UAAU;AACjD,MAAI,QAAQ,YAAY;AACtB,YAAQ,MAAM,GAAG;AACjB,WAAO,iBAAiB,KAAK,EAAE,MAAM,EAAE,SAAS,QAAQ,KAAK,CAAC,KAAK,UAAU,EAAE,CAAC;AAAA,EAClF;AACA,aAAW,kBAAkB,EAAE,YAAY,aAAa,eAAe,KAAK,SAAS,QAAQ,KAAK,CAAC,KAAK,UAAU,CAAC;AACnH,UAAQ,WAAW;AACrB,CAAC,EACA,QAAQ,MAAM,aAAa,OAAO,QAAQ,YAAY,CAAC,CAAC,CAAC;","names":["path","os","fs","path","fileURLToPath","chalk","ora","fs","fs","auth","resolve","fs","path","os","fileURLToPath","path","fs","auth","fileURLToPath","pkg","os","resolve","crypto","fs","path","pkg","fs","path","path","fs","path","fs","path","IGNORE_DIRS","crypto","auth","path","fs","fs","path","fs","path","fs","path","fs","crypto","fs","MANIFEST_FILE","fs","path","fs","path","execSync","chalk","auth","ora","resolve","fs","chalk","ora","ora","chalk","chalk","fs","fs","path","crypto","path","fs","crypto","auth","chalk","fs","chalk","ora","readline","auth","chalk","ora","readline","resolve","chalk","auth","chalk","chalk","ora","auth","chalk","ora","recs","chalk","ora","auth","chalk","ora","chalk","ora","auth","chalk","ora","chalk","ora","auth","chalk","ora","chalk","ora","execSync","fs","path","auth","chalk","ora","chalk","chalk","__dirname","path","fileURLToPath","pkg","fs","fs","path","fileURLToPath","readline","execSync","chalk","ora","pkg","resolve"]}
|