@caliber-ai/cli 0.1.1 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.js +115 -19
- package/dist/bin.js.map +1 -1
- package/package.json +4 -2
package/dist/bin.js
CHANGED
|
@@ -51,6 +51,7 @@ var init_constants = __esm({
|
|
|
51
51
|
|
|
52
52
|
// src/cli.ts
|
|
53
53
|
import { Command } from "commander";
|
|
54
|
+
import fs12 from "fs";
|
|
54
55
|
|
|
55
56
|
// src/commands/init.ts
|
|
56
57
|
import chalk2 from "chalk";
|
|
@@ -114,7 +115,7 @@ init_constants();
|
|
|
114
115
|
import http from "http";
|
|
115
116
|
import { URL as URL2 } from "url";
|
|
116
117
|
function startCallbackServer(expectedState) {
|
|
117
|
-
return new Promise((
|
|
118
|
+
return new Promise((resolve2, reject) => {
|
|
118
119
|
const server = http.createServer((req, res) => {
|
|
119
120
|
if (!req.url?.startsWith("/callback")) {
|
|
120
121
|
res.writeHead(404);
|
|
@@ -151,7 +152,7 @@ function startCallbackServer(expectedState) {
|
|
|
151
152
|
</div>
|
|
152
153
|
</body></html>`);
|
|
153
154
|
server.close();
|
|
154
|
-
|
|
155
|
+
resolve2({
|
|
155
156
|
accessToken,
|
|
156
157
|
refreshToken,
|
|
157
158
|
expiresIn: parseInt(expiresIn || "3600", 10),
|
|
@@ -266,7 +267,7 @@ async function shutdownTelemetry() {
|
|
|
266
267
|
try {
|
|
267
268
|
await Promise.race([
|
|
268
269
|
client?.shutdown(),
|
|
269
|
-
new Promise((
|
|
270
|
+
new Promise((resolve2) => setTimeout(resolve2, 2e3))
|
|
270
271
|
]);
|
|
271
272
|
} catch {
|
|
272
273
|
}
|
|
@@ -312,7 +313,19 @@ import crypto2 from "crypto";
|
|
|
312
313
|
|
|
313
314
|
// src/fingerprint/git.ts
|
|
314
315
|
import { execSync } from "child_process";
|
|
316
|
+
import { existsSync } from "fs";
|
|
317
|
+
import { resolve, dirname } from "path";
|
|
318
|
+
function isInsideGitRepo() {
|
|
319
|
+
let dir = process.cwd();
|
|
320
|
+
while (true) {
|
|
321
|
+
if (existsSync(resolve(dir, ".git"))) return true;
|
|
322
|
+
const parent = dirname(dir);
|
|
323
|
+
if (parent === dir) return false;
|
|
324
|
+
dir = parent;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
315
327
|
function getGitRemoteUrl() {
|
|
328
|
+
if (!isInsideGitRepo()) return void 0;
|
|
316
329
|
try {
|
|
317
330
|
return execSync("git remote get-url origin", { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] }).trim();
|
|
318
331
|
} catch {
|
|
@@ -373,8 +386,8 @@ var WORKSPACE_GLOBS = [
|
|
|
373
386
|
];
|
|
374
387
|
function detectNodeFrameworks(pkgPath) {
|
|
375
388
|
try {
|
|
376
|
-
const
|
|
377
|
-
const allDeps = { ...
|
|
389
|
+
const pkg4 = JSON.parse(fs3.readFileSync(pkgPath, "utf-8"));
|
|
390
|
+
const allDeps = { ...pkg4.dependencies, ...pkg4.devDependencies };
|
|
378
391
|
const frameworks = [];
|
|
379
392
|
for (const [dep, framework] of Object.entries(NODE_FRAMEWORK_DEPS)) {
|
|
380
393
|
if (allDeps[dep]) frameworks.push(framework);
|
|
@@ -412,9 +425,9 @@ function analyzePackageJson(dir) {
|
|
|
412
425
|
const languages = [];
|
|
413
426
|
if (fs3.existsSync(rootPkgPath)) {
|
|
414
427
|
try {
|
|
415
|
-
const
|
|
416
|
-
name =
|
|
417
|
-
const allDeps = { ...
|
|
428
|
+
const pkg4 = JSON.parse(fs3.readFileSync(rootPkgPath, "utf-8"));
|
|
429
|
+
name = pkg4.name;
|
|
430
|
+
const allDeps = { ...pkg4.dependencies, ...pkg4.devDependencies };
|
|
418
431
|
allFrameworks.push(...detectNodeFrameworks(rootPkgPath));
|
|
419
432
|
if (allDeps.typescript || allDeps["@types/node"]) {
|
|
420
433
|
languages.push("TypeScript");
|
|
@@ -428,8 +441,8 @@ function analyzePackageJson(dir) {
|
|
|
428
441
|
for (const pkgPath of matches) {
|
|
429
442
|
allFrameworks.push(...detectNodeFrameworks(pkgPath));
|
|
430
443
|
try {
|
|
431
|
-
const
|
|
432
|
-
const deps = { ...
|
|
444
|
+
const pkg4 = JSON.parse(fs3.readFileSync(pkgPath, "utf-8"));
|
|
445
|
+
const deps = { ...pkg4.dependencies, ...pkg4.devDependencies };
|
|
433
446
|
if (deps.typescript || deps["@types/node"]) {
|
|
434
447
|
languages.push("TypeScript");
|
|
435
448
|
}
|
|
@@ -1170,15 +1183,15 @@ async function refineLoop(currentSetup, _targetAgent) {
|
|
|
1170
1183
|
}
|
|
1171
1184
|
function promptInput(question) {
|
|
1172
1185
|
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
1173
|
-
return new Promise((
|
|
1186
|
+
return new Promise((resolve2) => {
|
|
1174
1187
|
rl.question(chalk2.cyan(`${question} `), (answer) => {
|
|
1175
1188
|
rl.close();
|
|
1176
|
-
|
|
1189
|
+
resolve2(answer.trim());
|
|
1177
1190
|
});
|
|
1178
1191
|
});
|
|
1179
1192
|
}
|
|
1180
1193
|
function promptAgent() {
|
|
1181
|
-
return new Promise((
|
|
1194
|
+
return new Promise((resolve2) => {
|
|
1182
1195
|
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
1183
1196
|
console.log(chalk2.bold("Which coding agent are you using?"));
|
|
1184
1197
|
console.log(" 1. Claude Code");
|
|
@@ -1187,12 +1200,12 @@ function promptAgent() {
|
|
|
1187
1200
|
rl.question(chalk2.cyan("\nChoose (1-3): "), (answer) => {
|
|
1188
1201
|
rl.close();
|
|
1189
1202
|
const map = { "1": "claude", "2": "cursor", "3": "both" };
|
|
1190
|
-
|
|
1203
|
+
resolve2(map[answer.trim()] || "claude");
|
|
1191
1204
|
});
|
|
1192
1205
|
});
|
|
1193
1206
|
}
|
|
1194
1207
|
function promptAction() {
|
|
1195
|
-
return new Promise((
|
|
1208
|
+
return new Promise((resolve2) => {
|
|
1196
1209
|
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
1197
1210
|
console.log(chalk2.bold("What would you like to do?"));
|
|
1198
1211
|
console.log(" 1. Accept and apply");
|
|
@@ -1207,7 +1220,7 @@ function promptAction() {
|
|
|
1207
1220
|
"3": "explain",
|
|
1208
1221
|
"4": "decline"
|
|
1209
1222
|
};
|
|
1210
|
-
|
|
1223
|
+
resolve2(map[answer.trim()] || "accept");
|
|
1211
1224
|
});
|
|
1212
1225
|
});
|
|
1213
1226
|
}
|
|
@@ -1402,8 +1415,8 @@ async function updateCommand(options) {
|
|
|
1402
1415
|
return;
|
|
1403
1416
|
}
|
|
1404
1417
|
const rl = readline2.createInterface({ input: process.stdin, output: process.stdout });
|
|
1405
|
-
const answer = await new Promise((
|
|
1406
|
-
rl.question(chalk5.cyan("\n\nApply updated setup? (y/n): "),
|
|
1418
|
+
const answer = await new Promise((resolve2) => {
|
|
1419
|
+
rl.question(chalk5.cyan("\n\nApply updated setup? (y/n): "), resolve2);
|
|
1407
1420
|
});
|
|
1408
1421
|
rl.close();
|
|
1409
1422
|
if (answer.trim().toLowerCase() !== "y") {
|
|
@@ -1435,8 +1448,11 @@ function logoutCommand() {
|
|
|
1435
1448
|
}
|
|
1436
1449
|
|
|
1437
1450
|
// src/cli.ts
|
|
1451
|
+
var pkg2 = JSON.parse(
|
|
1452
|
+
fs12.readFileSync(new URL("../package.json", import.meta.url), "utf-8")
|
|
1453
|
+
);
|
|
1438
1454
|
var program = new Command();
|
|
1439
|
-
program.name("caliber").description("Configure your coding agent environment").version(
|
|
1455
|
+
program.name("caliber").description("Configure your coding agent environment").version(pkg2.version);
|
|
1440
1456
|
program.command("init").description("Initialize coding agent setup for this project").option("--agent <type>", "Target agent: claude, cursor, or both").option("--dry-run", "Preview changes without writing files").option("--force", "Overwrite existing setup without prompting").action(initCommand);
|
|
1441
1457
|
program.command("undo").description("Revert all config changes made by Caliber").action(undoCommand);
|
|
1442
1458
|
program.command("status").description("Show current Caliber setup status").option("--json", "Output as JSON").action(statusCommand);
|
|
@@ -1444,6 +1460,85 @@ program.command("update").description("Re-analyze project and update setup").opt
|
|
|
1444
1460
|
program.command("login").description("Authenticate with Caliber").action(loginCommand);
|
|
1445
1461
|
program.command("logout").description("Clear stored credentials").action(logoutCommand);
|
|
1446
1462
|
|
|
1463
|
+
// src/utils/version-check.ts
|
|
1464
|
+
import fs13 from "fs";
|
|
1465
|
+
import readline3 from "readline";
|
|
1466
|
+
import { execSync as execSync2 } from "child_process";
|
|
1467
|
+
import chalk7 from "chalk";
|
|
1468
|
+
import ora5 from "ora";
|
|
1469
|
+
var pkg3 = JSON.parse(
|
|
1470
|
+
fs13.readFileSync(new URL("../package.json", import.meta.url), "utf-8")
|
|
1471
|
+
);
|
|
1472
|
+
function promptYesNo(question) {
|
|
1473
|
+
const rl = readline3.createInterface({ input: process.stdin, output: process.stdout });
|
|
1474
|
+
return new Promise((resolve2) => {
|
|
1475
|
+
rl.question(chalk7.cyan(`${question} `), (answer) => {
|
|
1476
|
+
rl.close();
|
|
1477
|
+
const normalized = answer.trim().toLowerCase();
|
|
1478
|
+
resolve2(normalized === "" || normalized === "y" || normalized === "yes");
|
|
1479
|
+
});
|
|
1480
|
+
});
|
|
1481
|
+
}
|
|
1482
|
+
async function checkForUpdates() {
|
|
1483
|
+
try {
|
|
1484
|
+
const controller = new AbortController();
|
|
1485
|
+
const timeout = setTimeout(() => controller.abort(), 2e3);
|
|
1486
|
+
const res = await fetch("https://registry.npmjs.org/@caliber-ai/cli/latest", {
|
|
1487
|
+
signal: controller.signal
|
|
1488
|
+
});
|
|
1489
|
+
clearTimeout(timeout);
|
|
1490
|
+
if (!res.ok) return;
|
|
1491
|
+
const data = await res.json();
|
|
1492
|
+
const latest = data.version;
|
|
1493
|
+
if (!latest) return;
|
|
1494
|
+
const current = pkg3.version;
|
|
1495
|
+
if (current === latest) return;
|
|
1496
|
+
const isInteractive = process.stdin.isTTY === true;
|
|
1497
|
+
if (!isInteractive) {
|
|
1498
|
+
console.log(
|
|
1499
|
+
chalk7.yellow(
|
|
1500
|
+
`
|
|
1501
|
+
Update available: ${current} -> ${latest}
|
|
1502
|
+
Run ${chalk7.bold("npm install -g @caliber-ai/cli")} to upgrade.
|
|
1503
|
+
`
|
|
1504
|
+
)
|
|
1505
|
+
);
|
|
1506
|
+
return;
|
|
1507
|
+
}
|
|
1508
|
+
console.log(
|
|
1509
|
+
chalk7.yellow(`
|
|
1510
|
+
Update available: ${current} -> ${latest}`)
|
|
1511
|
+
);
|
|
1512
|
+
const shouldUpdate = await promptYesNo("Would you like to update now? (Y/n)");
|
|
1513
|
+
if (!shouldUpdate) {
|
|
1514
|
+
console.log();
|
|
1515
|
+
return;
|
|
1516
|
+
}
|
|
1517
|
+
const spinner = ora5("Updating @caliber-ai/cli...").start();
|
|
1518
|
+
try {
|
|
1519
|
+
execSync2("npm install -g @caliber-ai/cli", { stdio: "pipe" });
|
|
1520
|
+
spinner.succeed(chalk7.green(`Updated to ${latest}`));
|
|
1521
|
+
const args = process.argv.slice(2);
|
|
1522
|
+
console.log(chalk7.dim(`
|
|
1523
|
+
Restarting: caliber ${args.join(" ")}
|
|
1524
|
+
`));
|
|
1525
|
+
execSync2(`caliber ${args.map((a) => JSON.stringify(a)).join(" ")}`, {
|
|
1526
|
+
stdio: "inherit"
|
|
1527
|
+
});
|
|
1528
|
+
process.exit(0);
|
|
1529
|
+
} catch {
|
|
1530
|
+
spinner.fail("Update failed");
|
|
1531
|
+
console.log(
|
|
1532
|
+
chalk7.yellow(
|
|
1533
|
+
`Run ${chalk7.bold("npm install -g @caliber-ai/cli")} manually to upgrade.
|
|
1534
|
+
`
|
|
1535
|
+
)
|
|
1536
|
+
);
|
|
1537
|
+
}
|
|
1538
|
+
} catch {
|
|
1539
|
+
}
|
|
1540
|
+
}
|
|
1541
|
+
|
|
1447
1542
|
// src/bin.ts
|
|
1448
1543
|
var firstRun = isFirstRun();
|
|
1449
1544
|
getDeviceId();
|
|
@@ -1454,6 +1549,7 @@ var auth = getStoredAuth();
|
|
|
1454
1549
|
if (auth) {
|
|
1455
1550
|
identifyUser(auth.userId, auth.email);
|
|
1456
1551
|
}
|
|
1552
|
+
await checkForUpdates();
|
|
1457
1553
|
process.on("SIGINT", () => process.exit(130));
|
|
1458
1554
|
process.on("SIGTERM", () => process.exit(143));
|
|
1459
1555
|
program.parseAsync().finally(async () => {
|
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.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/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/utils/spinner-messages.ts","../src/commands/undo.ts","../src/commands/status.ts","../src/commands/update.ts","../src/commands/logout.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 { Command } from 'commander';\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';\n\nconst program = new Command();\n\nprogram\n .name('caliber')\n .description('Configure your coding agent environment')\n .version('0.1.0');\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\nexport { program };\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport readline from 'readline';\nimport path from 'path';\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, countSuggestedFiles } from '../telemetry.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 process.exit(1);\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 try {\n const match = await apiRequest<{ project: unknown; setup: unknown }>('/api/projects/match', {\n method: 'POST',\n body: { fingerprintHash: hash },\n });\n if (match.setup) {\n existingSetup = match.setup;\n trackEvent('existing_config_detected');\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\n trackEvent('generation_started', { target_agent: targetAgent });\n const generationStart = Date.now();\n\n const genSpinner = ora('Generating setup...').start();\n const genMessages = new SpinnerMessages(genSpinner, GENERATION_MESSAGES);\n genMessages.start();\n\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 },\n (error) => {\n genMessages.stop();\n trackEvent('error_occurred', { error_type: 'generation_failed', error_message: error });\n genSpinner.fail(`Generation error: ${error}`);\n },\n (status) => { genMessages.handleServerStatus(status); }\n );\n\n genMessages.stop();\n\n if (!generatedSetup) {\n genSpinner.fail('Failed to generate setup.');\n process.exit(1);\n }\n\n trackEvent('generation_completed', {\n target_agent: targetAgent,\n duration_ms: Date.now() - generationStart,\n files_suggested: countSuggestedFiles(generatedSetup),\n });\n\n genSpinner.succeed('Setup generated');\n printSetupSummary(generatedSetup);\n\n // Step 7: Accept / Refine / Explain / Decline\n let action = await promptAction();\n\n while (action === 'explain') {\n if (setupExplanation) {\n console.log(chalk.bold('\\nWhy this setup?\\n'));\n console.log(chalk.dim(setupExplanation));\n console.log('');\n } else {\n console.log(chalk.dim('\\nNo explanation available for this setup.\\n'));\n }\n action = await promptAction();\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('generation_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 for (const file of result.written) {\n trackEvent('config_file_written', { file_type: path.extname(file) || path.basename(file) });\n }\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 process.exit(1);\n }\n\n // Step 9: Save to server\n try {\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\n trackEvent('project_created', { project_name: fingerprint.packageName || 'untitled' });\n\n await apiRequest(`/api/setups/project/${project.id}`, {\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(): 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 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\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\n console.log('');\n\n if (claude) {\n if (claude.claudeMd) {\n console.log(` ${chalk.green('+')} CLAUDE.md ${chalk.dim('— project guidelines, commands, conventions')}`);\n }\n if (claude.settings) {\n console.log(` ${chalk.green('+')} .claude/settings.json ${chalk.dim('— tool permissions & hooks')}`);\n }\n if (claude.settingsLocal) {\n console.log(` ${chalk.green('+')} .claude/settings.local.json ${chalk.dim('— local dev permissions')}`);\n }\n\n const skills = claude.skills as Array<{ name: string; content: string }> | undefined;\n if (Array.isArray(skills) && skills.length > 0) {\n console.log(` ${chalk.green('+')} ${skills.length} skill${skills.length > 1 ? 's' : ''}:`);\n for (const skill of skills) {\n console.log(` ${chalk.dim('•')} ${skill.name}`);\n }\n }\n\n const mcpServers = claude.mcpServers as Record<string, unknown> | undefined;\n if (mcpServers && Object.keys(mcpServers).length > 0) {\n const names = Object.keys(mcpServers);\n console.log(` ${chalk.green('+')} ${names.length} MCP server${names.length > 1 ? 's' : ''}:`);\n for (const name of names) {\n console.log(` ${chalk.dim('•')} ${name}`);\n }\n }\n }\n\n if (cursor) {\n if (cursor.cursorrules) {\n console.log(` ${chalk.green('+')} .cursorrules ${chalk.dim('— coding rules for Cursor')}`);\n }\n\n const rules = cursor.rules as Array<{ filename: string }> | undefined;\n if (Array.isArray(rules) && rules.length > 0) {\n console.log(` ${chalk.green('+')} ${rules.length} Cursor rule${rules.length > 1 ? 's' : ''}:`);\n for (const rule of rules) {\n console.log(` ${chalk.dim('•')} ${rule.filename}`);\n }\n }\n\n const mcpServers = cursor.mcpServers as Record<string, unknown> | undefined;\n if (mcpServers && Object.keys(mcpServers).length > 0) {\n const names = Object.keys(mcpServers);\n console.log(` ${chalk.green('+')} ${names.length} MCP server${names.length > 1 ? 's' : ''}:`);\n for (const name of names) {\n console.log(` ${chalk.dim('•')} ${name}`);\n }\n }\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 spinner.fail(chalk.red(`Authentication failed: ${err instanceof Error ? err.message : 'Unknown error'}`));\n process.exit(1);\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 { 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 pkg = JSON.parse(\n fs.readFileSync(new URL('../package.json', import.meta.url), '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 function countSuggestedFiles(setup: Record<string, unknown>): number {\n let count = 0;\n const claude = setup.claude as Record<string, unknown> | undefined;\n const cursor = setup.cursor as Record<string, unknown> | undefined;\n if (claude) {\n if (claude.claudeMd) count++;\n if (claude.settings) count++;\n if (claude.settingsLocal) count++;\n if (Array.isArray(claude.skills)) count += claude.skills.length;\n if (claude.mcpServers && Object.keys(claude.mcpServers as object).length > 0) count++;\n }\n if (cursor) {\n if (cursor.cursorrules) count++;\n if (Array.isArray(cursor.rules)) count += cursor.rules.length;\n if (cursor.mcpServers && Object.keys(cursor.mcpServers as object).length > 0) count++;\n }\n return count;\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';\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 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\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 };\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';\n\nexport function getGitRemoteUrl(): string | 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 try {\n execSync('git rev-parse --is-inside-work-tree', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });\n return true;\n } catch {\n return false;\n }\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 claudeSettings?: Record<string, unknown>;\n claudeSkills?: Array<{ filename: string; content: string }>;\n cursorrules?: string;\n cursorRules?: Array<{ filename: string; content: string }>;\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 { getStoredAuth, storeAuth, isTokenExpired } from '../auth/token-store.js';\nimport { API_URL } from '../constants.js';\n\nasync function refreshTokenIfNeeded(): Promise<string | null> {\n const auth = getStoredAuth();\n if (!auth) return null;\n\n if (!isTokenExpired()) return auth.accessToken;\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\nexport async function apiRequest<T = unknown>(\n path: string,\n options: {\n method?: string;\n body?: unknown;\n } = {}\n): Promise<T> {\n const token = await refreshTokenIfNeeded();\n if (!token) {\n throw new Error('Not authenticated. Run `caliber login` first.');\n }\n\n const 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.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}\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 const token = await refreshTokenIfNeeded();\n if (!token) {\n throw new Error('Not authenticated. Run `caliber login` first.');\n }\n\n const 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.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 });\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 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 process.exit(1);\n }\n}\n","import chalk from 'chalk';\nimport fs from 'fs';\nimport { readManifest } from '../writers/manifest.js';\nimport { getStoredAuth } from '../auth/token-store.js';\n\nexport 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 // Auth status\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 // Config status\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 console.log('');\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, countSuggestedFiles } 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 process.exit(1);\n }\n\n const manifest = readManifest();\n if (!manifest) {\n console.log(chalk.yellow('No existing setup found. Run `caliber init` first.'));\n process.exit(1);\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 const generationStart = Date.now();\n\n const genSpinner = ora('Regenerating setup...').start();\n const genMessages = new SpinnerMessages(genSpinner, GENERATION_MESSAGES);\n genMessages.start();\n\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 });\n genSpinner.fail(`Generation error: ${error}`);\n },\n (status) => { genMessages.handleServerStatus(status); }\n );\n\n genMessages.stop();\n\n if (!generatedSetup) {\n genSpinner.fail('Failed to regenerate setup.');\n process.exit(1);\n }\n\n genSpinner.succeed('Setup regenerated');\n\n trackEvent('generation_completed', {\n target_agent: 'both',\n duration_ms: Date.now() - generationStart,\n files_suggested: countSuggestedFiles(generatedSetup),\n });\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('generation_cancelled');\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 { program } from './cli.js';\nimport { getStoredAuth } from './auth/token-store.js';\nimport { isFirstRun, getDeviceId, trackEvent, identifyUser, shutdownTelemetry } from './telemetry.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}\n\nprocess.on('SIGINT', () => process.exit(130));\nprocess.on('SIGTERM', () => process.exit(143));\n\nprogram.parseAsync().finally(async () => {\n await shutdownTelemetry();\n process.exit(0);\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAAO,UAAU;AACjB,OAAO,QAAQ;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,WAAW,KAAK,KAAK,GAAG,QAAQ,GAAG,UAAU;AACnD,IAAM,YAAY,KAAK,KAAK,UAAU,WAAW;AACjD,IAAM,cAAc;AACpB,IAAM,gBAAgB,KAAK,KAAK,aAAa,eAAe;AAC5D,IAAM,cAAc,KAAK,KAAK,aAAa,SAAS;AAAA;AAAA;;;ACV3D,SAAS,eAAe;;;ACAxB,OAAOA,YAAW;AAClB,OAAOC,UAAS;AAChB,OAAO,cAAc;AACrB,OAAOC,YAAU;;;ACDjB;AAFA,OAAO,QAAQ;AAYR,SAAS,gBAAmC;AACjD,MAAI;AACF,QAAI,CAAC,GAAG,WAAW,SAAS,EAAG,QAAO;AACtC,UAAM,OAAO,KAAK,MAAM,GAAG,aAAa,WAAW,OAAO,CAAC;AAC3D,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,UAAUC,OAKvB;AACD,MAAI,CAAC,GAAG,WAAW,QAAQ,GAAG;AAC5B,OAAG,UAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,EAC5C;AAEA,QAAM,OAAmB;AAAA,IACvB,aAAaA,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,KAAG,cAAc,WAAW,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,EAAE,MAAM,IAAM,CAAC;AAC5E;AAEO,SAAS,YAAY;AAC1B,MAAI;AACF,QAAI,GAAG,WAAW,SAAS,EAAG,IAAG,WAAW,SAAS;AAAA,EACvD,QAAQ;AAAA,EAER;AACF;AAEO,SAAS,iBAA0B;AACxC,QAAMA,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,OAAAC,YAAW;AAab,SAAS,oBAAoB,eAAgD;AAClF,SAAO,IAAI,QAAQ,CAAC,SAAS,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,IAAIA,KAAI,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,cAAQ;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;;;AGDA;AALA,SAAS,eAAe;AACxB,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAOC,SAAQ;AACf,SAAS,kBAAkB;AAI3B,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,MAAM,KAAK;AAAA,EACfD,IAAG,aAAa,IAAI,IAAI,mBAAmB,YAAY,GAAG,GAAG,OAAO;AACtE;AAEA,SAAS,iBAAiB;AACxB,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,aAAa,IAAI;AAAA,IACjB,IAAIE,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;AAEO,SAAS,oBAAoB,OAAwC;AAC1E,MAAI,QAAQ;AACZ,QAAM,SAAS,MAAM;AACrB,QAAM,SAAS,MAAM;AACrB,MAAI,QAAQ;AACV,QAAI,OAAO,SAAU;AACrB,QAAI,OAAO,SAAU;AACrB,QAAI,OAAO,cAAe;AAC1B,QAAI,MAAM,QAAQ,OAAO,MAAM,EAAG,UAAS,OAAO,OAAO;AACzD,QAAI,OAAO,cAAc,OAAO,KAAK,OAAO,UAAoB,EAAE,SAAS,EAAG;AAAA,EAChF;AACA,MAAI,QAAQ;AACV,QAAI,OAAO,YAAa;AACxB,QAAI,MAAM,QAAQ,OAAO,KAAK,EAAG,UAAS,OAAO,MAAM;AACvD,QAAI,OAAO,cAAc,OAAO,KAAK,OAAO,UAAoB,EAAE,SAAS,EAAG;AAAA,EAChF;AACA,SAAO;AACT;AAEA,eAAsB,oBAAoB;AACxC,MAAI;AACF,UAAM,QAAQ,KAAK;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,GAAI,CAAC;AAAA,IACpD,CAAC;AAAA,EACH,QAAQ;AAAA,EAAC;AACX;;;AHlGA,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,YAAQ,KAAK,MAAM,IAAI,0BAA0B,eAAe,QAAQ,IAAI,UAAU,eAAe,EAAE,CAAC;AACxG,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;AIjDA,OAAOC,aAAY;;;ACAnB,SAAS,gBAAgB;AAElB,SAAS,kBAAsC;AACpD,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;;;ACRA,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,UAMF,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,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;;;AL9CO,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;AAE/C,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,EACF;AACF;AAEO,SAAS,uBAAuB,aAAkC;AACvE,QAAM,MAAM;AAAA,IACV,YAAY,gBAAgB;AAAA,IAC5B,YAAY,eAAe;AAAA,EAC7B,EAAE,KAAK,IAAI;AAEX,SAAOC,QAAO,WAAW,QAAQ,EAAE,OAAO,GAAG,EAAE,OAAO,KAAK;AAC7D;;;AM1CA;AAEA,eAAe,uBAA+C;AAC5D,QAAMC,QAAO,cAAc;AAC3B,MAAI,CAACA,MAAM,QAAO;AAElB,MAAI,CAAC,eAAe,EAAG,QAAOA,MAAK;AAEnC,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,eAAsB,WACpBC,QACA,UAGI,CAAC,GACO;AACZ,QAAM,QAAQ,MAAM,qBAAqB;AACzC,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AAEA,QAAM,OAAO,MAAM,MAAM,GAAG,OAAO,GAAGA,MAAI,IAAI;AAAA,IAC5C,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,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;AAOA,eAAsB,UACpBA,QACA,MACA,SACA,YACA,SACA,UACe;AACf,QAAM,QAAQ,MAAM,qBAAqB;AACzC,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AAEA,QAAM,OAAO,MAAM,MAAM,GAAG,OAAO,GAAGA,MAAI,IAAI;AAAA,IAC5C,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,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,YAAY,CAAC;AAAA,iBAC/F,OAAO,SAAS,QAAS,SAAQ,OAAO,OAAO;AAAA,MAC1D,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF;;;ACzHA,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,WAAU;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,MAAK,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,MAAK,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,MAAK,KAAK,WAAW,UAAU;AAAA,MAC/B,KAAK,UAAU,WAAW,MAAM,CAAC;AAAA,IACnC;AACA,YAAQ,KAAKA,MAAK,KAAK,WAAW,UAAU,CAAC;AAAA,EAC/C;AAEA,SAAO;AACT;;;AC1CA;AAFA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAGV,SAAS,aAAa,OAAyB;AACpD,QAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG;AAC/D,QAAM,YAAYA,MAAK,KAAK,aAAa,SAAS;AAElD,aAAW,QAAQ,OAAO;AACxB,QAAI,CAACD,IAAG,WAAW,IAAI,EAAG;AAE1B,UAAM,OAAOC,MAAK,KAAK,WAAW,IAAI;AACtC,UAAM,UAAUA,MAAK,QAAQ,IAAI;AACjC,QAAI,CAACD,IAAG,WAAW,OAAO,GAAG;AAC3B,MAAAA,IAAG,UAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,IAC3C;AACA,IAAAA,IAAG,aAAa,MAAM,IAAI;AAAA,EAC5B;AAEA,SAAO;AACT;AAEO,SAAS,cAAc,WAAmB,MAAuB;AACtE,QAAM,aAAaC,MAAK,KAAK,WAAW,IAAI;AAC5C,MAAI,CAACD,IAAG,WAAW,UAAU,EAAG,QAAO;AAEvC,QAAM,UAAUC,MAAK,QAAQ,IAAI;AACjC,MAAI,CAACD,IAAG,WAAW,OAAO,GAAG;AAC3B,IAAAA,IAAG,UAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,EAC3C;AACA,EAAAA,IAAG,aAAa,YAAY,IAAI;AAChC,SAAO;AACT;;;AC9BA;AAFA,OAAOE,SAAQ;AACf,OAAOC,aAAY;AAgBZ,SAAS,eAAgC;AAC9C,MAAI;AACF,QAAI,CAACD,IAAG,WAAW,aAAa,EAAG,QAAO;AAC1C,WAAO,KAAK,MAAMA,IAAG,aAAa,eAAe,OAAO,CAAC;AAAA,EAC3D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,cAAc,UAAoB;AAChD,MAAI,CAACA,IAAG,WAAW,WAAW,GAAG;AAC/B,IAAAA,IAAG,UAAU,aAAa,EAAE,WAAW,KAAK,CAAC;AAAA,EAC/C;AACA,EAAAA,IAAG,cAAc,eAAe,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AACnE;AAEO,SAAS,aAAa,UAA0B;AACrD,QAAM,UAAUA,IAAG,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;;;AKvHO,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;;;AlB1CA,eAAsB,YAAY,SAAsB;AAEtD,UAAQ,IAAIE,OAAM,KAAK,IAAI,SAAS,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOrC,CAAC;AACF,UAAQ,IAAIA,OAAM,IAAI,6CAA6C,CAAC;AAGpE,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,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACA,UAAQ,IAAIA,OAAM,IAAI,oBAAoBC,MAAK,KAAK;AAAA,CAAI,CAAC;AAGzD,QAAM,UAAUC,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,QAAM,eAAeE,KAAI,gCAAgC,EAAE,MAAM;AACjE,MAAI,gBAAgB;AACpB,MAAI;AACF,UAAM,QAAQ,MAAM,WAAiD,uBAAuB;AAAA,MAC1F,QAAQ;AAAA,MACR,MAAM,EAAE,iBAAiB,KAAK;AAAA,IAChC,CAAC;AACD,QAAI,MAAM,OAAO;AACf,sBAAgB,MAAM;AACtB,iBAAW,0BAA0B;AACrC,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,MAAI,iBAAiD;AACrD,MAAI;AAEJ,aAAW,sBAAsB,EAAE,cAAc,YAAY,CAAC;AAC9D,QAAM,kBAAkB,KAAK,IAAI;AAEjC,QAAM,aAAaA,KAAI,qBAAqB,EAAE,MAAM;AACpD,QAAM,cAAc,IAAI,gBAAgB,YAAY,mBAAmB;AACvE,cAAY,MAAM;AAElB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA,QAAQ,YAAY;AAAA,IACtB;AAAA,IACA,MAAM;AAAA,IAAC;AAAA,IACP,CAAC,YAAY;AACX,uBAAiB,QAAQ;AACzB,yBAAmB,QAAQ;AAAA,IAC7B;AAAA,IACA,CAAC,UAAU;AACT,kBAAY,KAAK;AACjB,iBAAW,kBAAkB,EAAE,YAAY,qBAAqB,eAAe,MAAM,CAAC;AACtF,iBAAW,KAAK,qBAAqB,KAAK,EAAE;AAAA,IAC9C;AAAA,IACA,CAAC,WAAW;AAAE,kBAAY,mBAAmB,MAAM;AAAA,IAAG;AAAA,EACxD;AAEA,cAAY,KAAK;AAEjB,MAAI,CAAC,gBAAgB;AACnB,eAAW,KAAK,2BAA2B;AAC3C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,aAAW,wBAAwB;AAAA,IACjC,cAAc;AAAA,IACd,aAAa,KAAK,IAAI,IAAI;AAAA,IAC1B,iBAAiB,oBAAoB,cAAc;AAAA,EACrD,CAAC;AAED,aAAW,QAAQ,iBAAiB;AACpC,oBAAkB,cAAc;AAGhC,MAAI,SAAS,MAAM,aAAa;AAEhC,SAAO,WAAW,WAAW;AAC3B,QAAI,kBAAkB;AACpB,cAAQ,IAAIF,OAAM,KAAK,qBAAqB,CAAC;AAC7C,cAAQ,IAAIA,OAAM,IAAI,gBAAgB,CAAC;AACvC,cAAQ,IAAI,EAAE;AAAA,IAChB,OAAO;AACL,cAAQ,IAAIA,OAAM,IAAI,8CAA8C,CAAC;AAAA,IACvE;AACA,aAAS,MAAM,aAAa;AAAA,EAC9B;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,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;AAC/F,eAAW,QAAQ,OAAO,SAAS;AACjC,iBAAW,uBAAuB,EAAE,WAAWC,OAAK,QAAQ,IAAI,KAAKA,OAAK,SAAS,IAAI,EAAE,CAAC;AAAA,IAC5F;AAEA,YAAQ,IAAIH,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,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,MAAI;AACF,UAAM,UAAU,MAAM,WAA2B,iBAAiB;AAAA,MAChE,QAAQ;AAAA,MACR,MAAM;AAAA,QACJ,iBAAiB;AAAA,QACjB,MAAM,YAAY,eAAe;AAAA,QACjC,cAAc,YAAY;AAAA,QAC1B,aAAa,YAAY;AAAA,MAC3B;AAAA,IACF,CAAC;AAED,eAAW,mBAAmB,EAAE,cAAc,YAAY,eAAe,WAAW,CAAC;AAErF,UAAM,WAAW,uBAAuB,QAAQ,EAAE,IAAI;AAAA,MACpD,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,CAAC,YAAY;AAC9B,OAAG,SAASA,OAAM,KAAK,GAAG,QAAQ,GAAG,GAAG,CAAC,WAAW;AAClD,SAAG,MAAM;AACT,cAAQ,OAAO,KAAK,CAAC;AAAA,IACvB,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,cAAoC;AAC3C,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,KAAK,SAAS,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACpF,YAAQ,IAAIA,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,cAAQ,IAAI,OAAO,KAAK,CAAC,KAAK,QAAQ;AAAA,IACxC,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,eAAqE;AAC5E,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,KAAK,SAAS,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACpF,YAAQ,IAAIA,OAAM,KAAK,4BAA4B,CAAC;AACpD,YAAQ,IAAI,uBAAuB;AACnC,YAAQ,IAAI,sBAAsB;AAClC,YAAQ,IAAI,8BAA8B;AAC1C,YAAQ,IAAI,cAAc;AAC1B,OAAG,SAASA,OAAM,KAAK,kBAAkB,GAAG,CAAC,WAAW;AACtD,SAAG,MAAM;AACT,YAAM,MAAmE;AAAA,QACvE,KAAK;AAAA,QAAU,KAAK;AAAA,QAAU,KAAK;AAAA,QAAW,KAAK;AAAA,MACrD;AACA,cAAQ,IAAI,OAAO,KAAK,CAAC,KAAK,QAAQ;AAAA,IACxC,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,kBAAkB,OAAgC;AACzD,QAAM,SAAS,MAAM;AACrB,QAAM,SAAS,MAAM;AAErB,UAAQ,IAAI,EAAE;AAEd,MAAI,QAAQ;AACV,QAAI,OAAO,UAAU;AACnB,cAAQ,IAAI,KAAKA,OAAM,MAAM,GAAG,CAAC,cAAcA,OAAM,IAAI,kDAA6C,CAAC,EAAE;AAAA,IAC3G;AACA,QAAI,OAAO,UAAU;AACnB,cAAQ,IAAI,KAAKA,OAAM,MAAM,GAAG,CAAC,0BAA0BA,OAAM,IAAI,iCAA4B,CAAC,EAAE;AAAA,IACtG;AACA,QAAI,OAAO,eAAe;AACxB,cAAQ,IAAI,KAAKA,OAAM,MAAM,GAAG,CAAC,gCAAgCA,OAAM,IAAI,8BAAyB,CAAC,EAAE;AAAA,IACzG;AAEA,UAAM,SAAS,OAAO;AACtB,QAAI,MAAM,QAAQ,MAAM,KAAK,OAAO,SAAS,GAAG;AAC9C,cAAQ,IAAI,KAAKA,OAAM,MAAM,GAAG,CAAC,IAAI,OAAO,MAAM,SAAS,OAAO,SAAS,IAAI,MAAM,EAAE,GAAG;AAC1F,iBAAW,SAAS,QAAQ;AAC1B,gBAAQ,IAAI,OAAOA,OAAM,IAAI,QAAG,CAAC,IAAI,MAAM,IAAI,EAAE;AAAA,MACnD;AAAA,IACF;AAEA,UAAM,aAAa,OAAO;AAC1B,QAAI,cAAc,OAAO,KAAK,UAAU,EAAE,SAAS,GAAG;AACpD,YAAM,QAAQ,OAAO,KAAK,UAAU;AACpC,cAAQ,IAAI,KAAKA,OAAM,MAAM,GAAG,CAAC,IAAI,MAAM,MAAM,cAAc,MAAM,SAAS,IAAI,MAAM,EAAE,GAAG;AAC7F,iBAAW,QAAQ,OAAO;AACxB,gBAAQ,IAAI,OAAOA,OAAM,IAAI,QAAG,CAAC,IAAI,IAAI,EAAE;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ;AACV,QAAI,OAAO,aAAa;AACtB,cAAQ,IAAI,KAAKA,OAAM,MAAM,GAAG,CAAC,iBAAiBA,OAAM,IAAI,gCAA2B,CAAC,EAAE;AAAA,IAC5F;AAEA,UAAM,QAAQ,OAAO;AACrB,QAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,SAAS,GAAG;AAC5C,cAAQ,IAAI,KAAKA,OAAM,MAAM,GAAG,CAAC,IAAI,MAAM,MAAM,eAAe,MAAM,SAAS,IAAI,MAAM,EAAE,GAAG;AAC9F,iBAAW,QAAQ,OAAO;AACxB,gBAAQ,IAAI,OAAOA,OAAM,IAAI,QAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;AAAA,MACtD;AAAA,IACF;AAEA,UAAM,aAAa,OAAO;AAC1B,QAAI,cAAc,OAAO,KAAK,UAAU,EAAE,SAAS,GAAG;AACpD,YAAM,QAAQ,OAAO,KAAK,UAAU;AACpC,cAAQ,IAAI,KAAKA,OAAM,MAAM,GAAG,CAAC,IAAI,MAAM,MAAM,cAAc,MAAM,SAAS,IAAI,MAAM,EAAE,GAAG;AAC7F,iBAAW,QAAQ,OAAO;AACxB,gBAAQ,IAAI,OAAOA,OAAM,IAAI,QAAG,CAAC,IAAI,IAAI,EAAE;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,IAAI,EAAE;AAChB;;;AmB9XA,OAAOI,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,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;ACtCA,OAAOC,YAAW;AAClB,OAAOC,UAAQ;AAIR,SAAS,cAAc,SAA6B;AACzD,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;AAG5C,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;AAGA,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;AACA,UAAQ,IAAI,EAAE;AAChB;;;ACzCA,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,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,WAAW,aAAa;AAC9B,MAAI,CAAC,UAAU;AACb,YAAQ,IAAIA,OAAM,OAAO,oDAAoD,CAAC;AAC9E,YAAQ,KAAK,CAAC;AAAA,EAChB;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;AACzD,QAAM,kBAAkB,KAAK,IAAI;AAEjC,QAAM,aAAaA,KAAI,uBAAuB,EAAE,MAAM;AACtD,QAAM,cAAc,IAAI,gBAAgB,YAAY,mBAAmB;AACvE,cAAY,MAAM;AAElB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,MACE;AAAA,MACA,aAAa;AAAA,IACf;AAAA,IACA,MAAM;AAAA,IAAC;AAAA,IACP,CAAC,YAAY;AAAE,uBAAiB,QAAQ;AAAA,IAAkC;AAAA,IAC1E,CAAC,UAAU;AACT,kBAAY,KAAK;AACjB,iBAAW,kBAAkB,EAAE,YAAY,qBAAqB,eAAe,MAAM,CAAC;AACtF,iBAAW,KAAK,qBAAqB,KAAK,EAAE;AAAA,IAC9C;AAAA,IACA,CAAC,WAAW;AAAE,kBAAY,mBAAmB,MAAM;AAAA,IAAG;AAAA,EACxD;AAEA,cAAY,KAAK;AAEjB,MAAI,CAAC,gBAAgB;AACnB,eAAW,KAAK,6BAA6B;AAC7C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,aAAW,QAAQ,mBAAmB;AAEtC,aAAW,wBAAwB;AAAA,IACjC,cAAc;AAAA,IACd,aAAa,KAAK,IAAI,IAAI;AAAA,IAC1B,iBAAiB,oBAAoB,cAAc;AAAA,EACrD,CAAC;AAED,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,CAAC,YAAY;AACpD,OAAG,SAASF,OAAM,KAAK,kCAAkC,GAAG,OAAO;AAAA,EACrE,CAAC;AACD,KAAG,MAAM;AAET,MAAI,OAAO,KAAK,EAAE,YAAY,MAAM,KAAK;AACvC,eAAW,sBAAsB;AACjC,YAAQ,IAAIA,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;;;AC5GA,OAAOG,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;;;AvBNA,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,SAAS,EACd,YAAY,yCAAyC,EACrD,QAAQ,OAAO;AAElB,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;;;AwB5CvB,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;AACtC;AAEA,QAAQ,GAAG,UAAU,MAAM,QAAQ,KAAK,GAAG,CAAC;AAC5C,QAAQ,GAAG,WAAW,MAAM,QAAQ,KAAK,GAAG,CAAC;AAE7C,QAAQ,WAAW,EAAE,QAAQ,YAAY;AACvC,QAAM,kBAAkB;AACxB,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["chalk","ora","path","auth","URL","fs","path","os","path","fs","auth","os","crypto","fs","path","pkg","fs","path","path","fs","path","crypto","auth","path","fs","fs","path","fs","path","fs","path","fs","crypto","fs","MANIFEST_FILE","chalk","auth","ora","path","chalk","ora","ora","chalk","chalk","fs","auth","chalk","fs","chalk","ora","readline","auth","chalk","ora","readline","chalk","auth","chalk"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.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/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/utils/spinner-messages.ts","../src/commands/undo.ts","../src/commands/status.ts","../src/commands/update.ts","../src/commands/logout.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 { Command } from 'commander';\nimport fs from 'fs';\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';\n\nconst pkg = JSON.parse(\n fs.readFileSync(new URL('../package.json', import.meta.url), '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\nexport { program };\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport readline from 'readline';\nimport path from 'path';\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, countSuggestedFiles } from '../telemetry.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 process.exit(1);\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 try {\n const match = await apiRequest<{ project: unknown; setup: unknown }>('/api/projects/match', {\n method: 'POST',\n body: { fingerprintHash: hash },\n });\n if (match.setup) {\n existingSetup = match.setup;\n trackEvent('existing_config_detected');\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\n trackEvent('generation_started', { target_agent: targetAgent });\n const generationStart = Date.now();\n\n const genSpinner = ora('Generating setup...').start();\n const genMessages = new SpinnerMessages(genSpinner, GENERATION_MESSAGES);\n genMessages.start();\n\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 },\n (error) => {\n genMessages.stop();\n trackEvent('error_occurred', { error_type: 'generation_failed', error_message: error });\n genSpinner.fail(`Generation error: ${error}`);\n },\n (status) => { genMessages.handleServerStatus(status); }\n );\n\n genMessages.stop();\n\n if (!generatedSetup) {\n genSpinner.fail('Failed to generate setup.');\n process.exit(1);\n }\n\n trackEvent('generation_completed', {\n target_agent: targetAgent,\n duration_ms: Date.now() - generationStart,\n files_suggested: countSuggestedFiles(generatedSetup),\n });\n\n genSpinner.succeed('Setup generated');\n printSetupSummary(generatedSetup);\n\n // Step 7: Accept / Refine / Explain / Decline\n let action = await promptAction();\n\n while (action === 'explain') {\n if (setupExplanation) {\n console.log(chalk.bold('\\nWhy this setup?\\n'));\n console.log(chalk.dim(setupExplanation));\n console.log('');\n } else {\n console.log(chalk.dim('\\nNo explanation available for this setup.\\n'));\n }\n action = await promptAction();\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('generation_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 for (const file of result.written) {\n trackEvent('config_file_written', { file_type: path.extname(file) || path.basename(file) });\n }\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 process.exit(1);\n }\n\n // Step 9: Save to server\n try {\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\n trackEvent('project_created', { project_name: fingerprint.packageName || 'untitled' });\n\n await apiRequest(`/api/setups/project/${project.id}`, {\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(): 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 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\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\n console.log('');\n\n if (claude) {\n if (claude.claudeMd) {\n console.log(` ${chalk.green('+')} CLAUDE.md ${chalk.dim('— project guidelines, commands, conventions')}`);\n }\n if (claude.settings) {\n console.log(` ${chalk.green('+')} .claude/settings.json ${chalk.dim('— tool permissions & hooks')}`);\n }\n if (claude.settingsLocal) {\n console.log(` ${chalk.green('+')} .claude/settings.local.json ${chalk.dim('— local dev permissions')}`);\n }\n\n const skills = claude.skills as Array<{ name: string; content: string }> | undefined;\n if (Array.isArray(skills) && skills.length > 0) {\n console.log(` ${chalk.green('+')} ${skills.length} skill${skills.length > 1 ? 's' : ''}:`);\n for (const skill of skills) {\n console.log(` ${chalk.dim('•')} ${skill.name}`);\n }\n }\n\n const mcpServers = claude.mcpServers as Record<string, unknown> | undefined;\n if (mcpServers && Object.keys(mcpServers).length > 0) {\n const names = Object.keys(mcpServers);\n console.log(` ${chalk.green('+')} ${names.length} MCP server${names.length > 1 ? 's' : ''}:`);\n for (const name of names) {\n console.log(` ${chalk.dim('•')} ${name}`);\n }\n }\n }\n\n if (cursor) {\n if (cursor.cursorrules) {\n console.log(` ${chalk.green('+')} .cursorrules ${chalk.dim('— coding rules for Cursor')}`);\n }\n\n const rules = cursor.rules as Array<{ filename: string }> | undefined;\n if (Array.isArray(rules) && rules.length > 0) {\n console.log(` ${chalk.green('+')} ${rules.length} Cursor rule${rules.length > 1 ? 's' : ''}:`);\n for (const rule of rules) {\n console.log(` ${chalk.dim('•')} ${rule.filename}`);\n }\n }\n\n const mcpServers = cursor.mcpServers as Record<string, unknown> | undefined;\n if (mcpServers && Object.keys(mcpServers).length > 0) {\n const names = Object.keys(mcpServers);\n console.log(` ${chalk.green('+')} ${names.length} MCP server${names.length > 1 ? 's' : ''}:`);\n for (const name of names) {\n console.log(` ${chalk.dim('•')} ${name}`);\n }\n }\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 spinner.fail(chalk.red(`Authentication failed: ${err instanceof Error ? err.message : 'Unknown error'}`));\n process.exit(1);\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 { 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 pkg = JSON.parse(\n fs.readFileSync(new URL('../package.json', import.meta.url), '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 function countSuggestedFiles(setup: Record<string, unknown>): number {\n let count = 0;\n const claude = setup.claude as Record<string, unknown> | undefined;\n const cursor = setup.cursor as Record<string, unknown> | undefined;\n if (claude) {\n if (claude.claudeMd) count++;\n if (claude.settings) count++;\n if (claude.settingsLocal) count++;\n if (Array.isArray(claude.skills)) count += claude.skills.length;\n if (claude.mcpServers && Object.keys(claude.mcpServers as object).length > 0) count++;\n }\n if (cursor) {\n if (cursor.cursorrules) count++;\n if (Array.isArray(cursor.rules)) count += cursor.rules.length;\n if (cursor.mcpServers && Object.keys(cursor.mcpServers as object).length > 0) count++;\n }\n return count;\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';\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 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\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 };\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 claudeSettings?: Record<string, unknown>;\n claudeSkills?: Array<{ filename: string; content: string }>;\n cursorrules?: string;\n cursorRules?: Array<{ filename: string; content: string }>;\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 { getStoredAuth, storeAuth, isTokenExpired } from '../auth/token-store.js';\nimport { API_URL } from '../constants.js';\n\nasync function refreshTokenIfNeeded(): Promise<string | null> {\n const auth = getStoredAuth();\n if (!auth) return null;\n\n if (!isTokenExpired()) return auth.accessToken;\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\nexport async function apiRequest<T = unknown>(\n path: string,\n options: {\n method?: string;\n body?: unknown;\n } = {}\n): Promise<T> {\n const token = await refreshTokenIfNeeded();\n if (!token) {\n throw new Error('Not authenticated. Run `caliber login` first.');\n }\n\n const 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.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}\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 const token = await refreshTokenIfNeeded();\n if (!token) {\n throw new Error('Not authenticated. Run `caliber login` first.');\n }\n\n const 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.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 });\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 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 process.exit(1);\n }\n}\n","import chalk from 'chalk';\nimport fs from 'fs';\nimport { readManifest } from '../writers/manifest.js';\nimport { getStoredAuth } from '../auth/token-store.js';\n\nexport 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 // Auth status\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 // Config status\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 console.log('');\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, countSuggestedFiles } 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 process.exit(1);\n }\n\n const manifest = readManifest();\n if (!manifest) {\n console.log(chalk.yellow('No existing setup found. Run `caliber init` first.'));\n process.exit(1);\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 const generationStart = Date.now();\n\n const genSpinner = ora('Regenerating setup...').start();\n const genMessages = new SpinnerMessages(genSpinner, GENERATION_MESSAGES);\n genMessages.start();\n\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 });\n genSpinner.fail(`Generation error: ${error}`);\n },\n (status) => { genMessages.handleServerStatus(status); }\n );\n\n genMessages.stop();\n\n if (!generatedSetup) {\n genSpinner.fail('Failed to regenerate setup.');\n process.exit(1);\n }\n\n genSpinner.succeed('Setup regenerated');\n\n trackEvent('generation_completed', {\n target_agent: 'both',\n duration_ms: Date.now() - generationStart,\n files_suggested: countSuggestedFiles(generatedSetup),\n });\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('generation_cancelled');\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 fs from 'fs';\nimport readline from 'readline';\nimport { execSync } from 'child_process';\nimport chalk from 'chalk';\nimport ora from 'ora';\n\nconst pkg = JSON.parse(\n fs.readFileSync(new URL('../package.json', import.meta.url), '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', { 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 { 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}\n\nawait checkForUpdates();\n\nprocess.on('SIGINT', () => process.exit(130));\nprocess.on('SIGTERM', () => process.exit(143));\n\nprogram.parseAsync().finally(async () => {\n await shutdownTelemetry();\n process.exit(0);\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAAO,UAAU;AACjB,OAAO,QAAQ;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,WAAW,KAAK,KAAK,GAAG,QAAQ,GAAG,UAAU;AACnD,IAAM,YAAY,KAAK,KAAK,UAAU,WAAW;AACjD,IAAM,cAAc;AACpB,IAAM,gBAAgB,KAAK,KAAK,aAAa,eAAe;AAC5D,IAAM,cAAc,KAAK,KAAK,aAAa,SAAS;AAAA;AAAA;;;ACV3D,SAAS,eAAe;AACxB,OAAOA,UAAQ;;;ACDf,OAAOC,YAAW;AAClB,OAAOC,UAAS;AAChB,OAAO,cAAc;AACrB,OAAOC,YAAU;;;ACDjB;AAFA,OAAO,QAAQ;AAYR,SAAS,gBAAmC;AACjD,MAAI;AACF,QAAI,CAAC,GAAG,WAAW,SAAS,EAAG,QAAO;AACtC,UAAM,OAAO,KAAK,MAAM,GAAG,aAAa,WAAW,OAAO,CAAC;AAC3D,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,UAAUC,OAKvB;AACD,MAAI,CAAC,GAAG,WAAW,QAAQ,GAAG;AAC5B,OAAG,UAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,EAC5C;AAEA,QAAM,OAAmB;AAAA,IACvB,aAAaA,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,KAAG,cAAc,WAAW,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,EAAE,MAAM,IAAM,CAAC;AAC5E;AAEO,SAAS,YAAY;AAC1B,MAAI;AACF,QAAI,GAAG,WAAW,SAAS,EAAG,IAAG,WAAW,SAAS;AAAA,EACvD,QAAQ;AAAA,EAER;AACF;AAEO,SAAS,iBAA0B;AACxC,QAAMA,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,OAAAC,YAAW;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,IAAID,KAAI,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,MAAAC,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;;;AGDA;AALA,SAAS,eAAe;AACxB,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAOC,SAAQ;AACf,SAAS,kBAAkB;AAI3B,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,MAAM,KAAK;AAAA,EACfD,IAAG,aAAa,IAAI,IAAI,mBAAmB,YAAY,GAAG,GAAG,OAAO;AACtE;AAEA,SAAS,iBAAiB;AACxB,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,aAAa,IAAI;AAAA,IACjB,IAAIE,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;AAEO,SAAS,oBAAoB,OAAwC;AAC1E,MAAI,QAAQ;AACZ,QAAM,SAAS,MAAM;AACrB,QAAM,SAAS,MAAM;AACrB,MAAI,QAAQ;AACV,QAAI,OAAO,SAAU;AACrB,QAAI,OAAO,SAAU;AACrB,QAAI,OAAO,cAAe;AAC1B,QAAI,MAAM,QAAQ,OAAO,MAAM,EAAG,UAAS,OAAO,OAAO;AACzD,QAAI,OAAO,cAAc,OAAO,KAAK,OAAO,UAAoB,EAAE,SAAS,EAAG;AAAA,EAChF;AACA,MAAI,QAAQ;AACV,QAAI,OAAO,YAAa;AACxB,QAAI,MAAM,QAAQ,OAAO,KAAK,EAAG,UAAS,OAAO,MAAM;AACvD,QAAI,OAAO,cAAc,OAAO,KAAK,OAAO,UAAoB,EAAE,SAAS,EAAG;AAAA,EAChF;AACA,SAAO;AACT;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;;;AHlGA,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,YAAQ,KAAK,MAAM,IAAI,0BAA0B,eAAe,QAAQ,IAAI,UAAU,eAAe,EAAE,CAAC;AACxG,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;AIjDA,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;;;ACrBA,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,UAMF,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,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;;;AL9CO,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;AAE/C,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,EACF;AACF;AAEO,SAAS,uBAAuB,aAAkC;AACvE,QAAM,MAAM;AAAA,IACV,YAAY,gBAAgB;AAAA,IAC5B,YAAY,eAAe;AAAA,EAC7B,EAAE,KAAK,IAAI;AAEX,SAAOC,QAAO,WAAW,QAAQ,EAAE,OAAO,GAAG,EAAE,OAAO,KAAK;AAC7D;;;AM1CA;AAEA,eAAe,uBAA+C;AAC5D,QAAMC,QAAO,cAAc;AAC3B,MAAI,CAACA,MAAM,QAAO;AAElB,MAAI,CAAC,eAAe,EAAG,QAAOA,MAAK;AAEnC,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,eAAsB,WACpBC,QACA,UAGI,CAAC,GACO;AACZ,QAAM,QAAQ,MAAM,qBAAqB;AACzC,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AAEA,QAAM,OAAO,MAAM,MAAM,GAAG,OAAO,GAAGA,MAAI,IAAI;AAAA,IAC5C,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,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;AAOA,eAAsB,UACpBA,QACA,MACA,SACA,YACA,SACA,UACe;AACf,QAAM,QAAQ,MAAM,qBAAqB;AACzC,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AAEA,QAAM,OAAO,MAAM,MAAM,GAAG,OAAO,GAAGA,MAAI,IAAI;AAAA,IAC5C,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,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,YAAY,CAAC;AAAA,iBAC/F,OAAO,SAAS,QAAS,SAAQ,OAAO,OAAO;AAAA,MAC1D,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF;;;ACzHA,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,WAAU;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,MAAK,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,MAAK,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,MAAK,KAAK,WAAW,UAAU;AAAA,MAC/B,KAAK,UAAU,WAAW,MAAM,CAAC;AAAA,IACnC;AACA,YAAQ,KAAKA,MAAK,KAAK,WAAW,UAAU,CAAC;AAAA,EAC/C;AAEA,SAAO;AACT;;;AC1CA;AAFA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAGV,SAAS,aAAa,OAAyB;AACpD,QAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG;AAC/D,QAAM,YAAYA,MAAK,KAAK,aAAa,SAAS;AAElD,aAAW,QAAQ,OAAO;AACxB,QAAI,CAACD,IAAG,WAAW,IAAI,EAAG;AAE1B,UAAM,OAAOC,MAAK,KAAK,WAAW,IAAI;AACtC,UAAM,UAAUA,MAAK,QAAQ,IAAI;AACjC,QAAI,CAACD,IAAG,WAAW,OAAO,GAAG;AAC3B,MAAAA,IAAG,UAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,IAC3C;AACA,IAAAA,IAAG,aAAa,MAAM,IAAI;AAAA,EAC5B;AAEA,SAAO;AACT;AAEO,SAAS,cAAc,WAAmB,MAAuB;AACtE,QAAM,aAAaC,MAAK,KAAK,WAAW,IAAI;AAC5C,MAAI,CAACD,IAAG,WAAW,UAAU,EAAG,QAAO;AAEvC,QAAM,UAAUC,MAAK,QAAQ,IAAI;AACjC,MAAI,CAACD,IAAG,WAAW,OAAO,GAAG;AAC3B,IAAAA,IAAG,UAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,EAC3C;AACA,EAAAA,IAAG,aAAa,YAAY,IAAI;AAChC,SAAO;AACT;;;AC9BA;AAFA,OAAOE,SAAQ;AACf,OAAOC,aAAY;AAgBZ,SAAS,eAAgC;AAC9C,MAAI;AACF,QAAI,CAACD,IAAG,WAAW,aAAa,EAAG,QAAO;AAC1C,WAAO,KAAK,MAAMA,IAAG,aAAa,eAAe,OAAO,CAAC;AAAA,EAC3D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,cAAc,UAAoB;AAChD,MAAI,CAACA,IAAG,WAAW,WAAW,GAAG;AAC/B,IAAAA,IAAG,UAAU,aAAa,EAAE,WAAW,KAAK,CAAC;AAAA,EAC/C;AACA,EAAAA,IAAG,cAAc,eAAe,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AACnE;AAEO,SAAS,aAAa,UAA0B;AACrD,QAAM,UAAUA,IAAG,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;;;AKvHO,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;;;AlB1CA,eAAsB,YAAY,SAAsB;AAEtD,UAAQ,IAAIE,OAAM,KAAK,IAAI,SAAS,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOrC,CAAC;AACF,UAAQ,IAAIA,OAAM,IAAI,6CAA6C,CAAC;AAGpE,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,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACA,UAAQ,IAAIA,OAAM,IAAI,oBAAoBC,MAAK,KAAK;AAAA,CAAI,CAAC;AAGzD,QAAM,UAAUC,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,QAAM,eAAeE,KAAI,gCAAgC,EAAE,MAAM;AACjE,MAAI,gBAAgB;AACpB,MAAI;AACF,UAAM,QAAQ,MAAM,WAAiD,uBAAuB;AAAA,MAC1F,QAAQ;AAAA,MACR,MAAM,EAAE,iBAAiB,KAAK;AAAA,IAChC,CAAC;AACD,QAAI,MAAM,OAAO;AACf,sBAAgB,MAAM;AACtB,iBAAW,0BAA0B;AACrC,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,MAAI,iBAAiD;AACrD,MAAI;AAEJ,aAAW,sBAAsB,EAAE,cAAc,YAAY,CAAC;AAC9D,QAAM,kBAAkB,KAAK,IAAI;AAEjC,QAAM,aAAaA,KAAI,qBAAqB,EAAE,MAAM;AACpD,QAAM,cAAc,IAAI,gBAAgB,YAAY,mBAAmB;AACvE,cAAY,MAAM;AAElB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA,QAAQ,YAAY;AAAA,IACtB;AAAA,IACA,MAAM;AAAA,IAAC;AAAA,IACP,CAAC,YAAY;AACX,uBAAiB,QAAQ;AACzB,yBAAmB,QAAQ;AAAA,IAC7B;AAAA,IACA,CAAC,UAAU;AACT,kBAAY,KAAK;AACjB,iBAAW,kBAAkB,EAAE,YAAY,qBAAqB,eAAe,MAAM,CAAC;AACtF,iBAAW,KAAK,qBAAqB,KAAK,EAAE;AAAA,IAC9C;AAAA,IACA,CAAC,WAAW;AAAE,kBAAY,mBAAmB,MAAM;AAAA,IAAG;AAAA,EACxD;AAEA,cAAY,KAAK;AAEjB,MAAI,CAAC,gBAAgB;AACnB,eAAW,KAAK,2BAA2B;AAC3C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,aAAW,wBAAwB;AAAA,IACjC,cAAc;AAAA,IACd,aAAa,KAAK,IAAI,IAAI;AAAA,IAC1B,iBAAiB,oBAAoB,cAAc;AAAA,EACrD,CAAC;AAED,aAAW,QAAQ,iBAAiB;AACpC,oBAAkB,cAAc;AAGhC,MAAI,SAAS,MAAM,aAAa;AAEhC,SAAO,WAAW,WAAW;AAC3B,QAAI,kBAAkB;AACpB,cAAQ,IAAIF,OAAM,KAAK,qBAAqB,CAAC;AAC7C,cAAQ,IAAIA,OAAM,IAAI,gBAAgB,CAAC;AACvC,cAAQ,IAAI,EAAE;AAAA,IAChB,OAAO;AACL,cAAQ,IAAIA,OAAM,IAAI,8CAA8C,CAAC;AAAA,IACvE;AACA,aAAS,MAAM,aAAa;AAAA,EAC9B;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,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;AAC/F,eAAW,QAAQ,OAAO,SAAS;AACjC,iBAAW,uBAAuB,EAAE,WAAWC,OAAK,QAAQ,IAAI,KAAKA,OAAK,SAAS,IAAI,EAAE,CAAC;AAAA,IAC5F;AAEA,YAAQ,IAAIH,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,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,MAAI;AACF,UAAM,UAAU,MAAM,WAA2B,iBAAiB;AAAA,MAChE,QAAQ;AAAA,MACR,MAAM;AAAA,QACJ,iBAAiB;AAAA,QACjB,MAAM,YAAY,eAAe;AAAA,QACjC,cAAc,YAAY;AAAA,QAC1B,aAAa,YAAY;AAAA,MAC3B;AAAA,IACF,CAAC;AAED,eAAW,mBAAmB,EAAE,cAAc,YAAY,eAAe,WAAW,CAAC;AAErF,UAAM,WAAW,uBAAuB,QAAQ,EAAE,IAAI;AAAA,MACpD,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,CAACI,aAAY;AAC9B,OAAG,SAASJ,OAAM,KAAK,GAAG,QAAQ,GAAG,GAAG,CAAC,WAAW;AAClD,SAAG,MAAM;AACT,MAAAI,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,IAAIJ,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,MAAAI,SAAQ,IAAI,OAAO,KAAK,CAAC,KAAK,QAAQ;AAAA,IACxC,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,eAAqE;AAC5E,SAAO,IAAI,QAAQ,CAACA,aAAY;AAC9B,UAAM,KAAK,SAAS,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACpF,YAAQ,IAAIJ,OAAM,KAAK,4BAA4B,CAAC;AACpD,YAAQ,IAAI,uBAAuB;AACnC,YAAQ,IAAI,sBAAsB;AAClC,YAAQ,IAAI,8BAA8B;AAC1C,YAAQ,IAAI,cAAc;AAC1B,OAAG,SAASA,OAAM,KAAK,kBAAkB,GAAG,CAAC,WAAW;AACtD,SAAG,MAAM;AACT,YAAM,MAAmE;AAAA,QACvE,KAAK;AAAA,QAAU,KAAK;AAAA,QAAU,KAAK;AAAA,QAAW,KAAK;AAAA,MACrD;AACA,MAAAI,SAAQ,IAAI,OAAO,KAAK,CAAC,KAAK,QAAQ;AAAA,IACxC,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,kBAAkB,OAAgC;AACzD,QAAM,SAAS,MAAM;AACrB,QAAM,SAAS,MAAM;AAErB,UAAQ,IAAI,EAAE;AAEd,MAAI,QAAQ;AACV,QAAI,OAAO,UAAU;AACnB,cAAQ,IAAI,KAAKJ,OAAM,MAAM,GAAG,CAAC,cAAcA,OAAM,IAAI,kDAA6C,CAAC,EAAE;AAAA,IAC3G;AACA,QAAI,OAAO,UAAU;AACnB,cAAQ,IAAI,KAAKA,OAAM,MAAM,GAAG,CAAC,0BAA0BA,OAAM,IAAI,iCAA4B,CAAC,EAAE;AAAA,IACtG;AACA,QAAI,OAAO,eAAe;AACxB,cAAQ,IAAI,KAAKA,OAAM,MAAM,GAAG,CAAC,gCAAgCA,OAAM,IAAI,8BAAyB,CAAC,EAAE;AAAA,IACzG;AAEA,UAAM,SAAS,OAAO;AACtB,QAAI,MAAM,QAAQ,MAAM,KAAK,OAAO,SAAS,GAAG;AAC9C,cAAQ,IAAI,KAAKA,OAAM,MAAM,GAAG,CAAC,IAAI,OAAO,MAAM,SAAS,OAAO,SAAS,IAAI,MAAM,EAAE,GAAG;AAC1F,iBAAW,SAAS,QAAQ;AAC1B,gBAAQ,IAAI,OAAOA,OAAM,IAAI,QAAG,CAAC,IAAI,MAAM,IAAI,EAAE;AAAA,MACnD;AAAA,IACF;AAEA,UAAM,aAAa,OAAO;AAC1B,QAAI,cAAc,OAAO,KAAK,UAAU,EAAE,SAAS,GAAG;AACpD,YAAM,QAAQ,OAAO,KAAK,UAAU;AACpC,cAAQ,IAAI,KAAKA,OAAM,MAAM,GAAG,CAAC,IAAI,MAAM,MAAM,cAAc,MAAM,SAAS,IAAI,MAAM,EAAE,GAAG;AAC7F,iBAAW,QAAQ,OAAO;AACxB,gBAAQ,IAAI,OAAOA,OAAM,IAAI,QAAG,CAAC,IAAI,IAAI,EAAE;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ;AACV,QAAI,OAAO,aAAa;AACtB,cAAQ,IAAI,KAAKA,OAAM,MAAM,GAAG,CAAC,iBAAiBA,OAAM,IAAI,gCAA2B,CAAC,EAAE;AAAA,IAC5F;AAEA,UAAM,QAAQ,OAAO;AACrB,QAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,SAAS,GAAG;AAC5C,cAAQ,IAAI,KAAKA,OAAM,MAAM,GAAG,CAAC,IAAI,MAAM,MAAM,eAAe,MAAM,SAAS,IAAI,MAAM,EAAE,GAAG;AAC9F,iBAAW,QAAQ,OAAO;AACxB,gBAAQ,IAAI,OAAOA,OAAM,IAAI,QAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;AAAA,MACtD;AAAA,IACF;AAEA,UAAM,aAAa,OAAO;AAC1B,QAAI,cAAc,OAAO,KAAK,UAAU,EAAE,SAAS,GAAG;AACpD,YAAM,QAAQ,OAAO,KAAK,UAAU;AACpC,cAAQ,IAAI,KAAKA,OAAM,MAAM,GAAG,CAAC,IAAI,MAAM,MAAM,cAAc,MAAM,SAAS,IAAI,MAAM,EAAE,GAAG;AAC7F,iBAAW,QAAQ,OAAO;AACxB,gBAAQ,IAAI,OAAOA,OAAM,IAAI,QAAG,CAAC,IAAI,IAAI,EAAE;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,IAAI,EAAE;AAChB;;;AmB9XA,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,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;ACtCA,OAAOC,YAAW;AAClB,OAAOC,UAAQ;AAIR,SAAS,cAAc,SAA6B;AACzD,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;AAG5C,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;AAGA,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;AACA,UAAQ,IAAI,EAAE;AAChB;;;ACzCA,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,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,WAAW,aAAa;AAC9B,MAAI,CAAC,UAAU;AACb,YAAQ,IAAIA,OAAM,OAAO,oDAAoD,CAAC;AAC9E,YAAQ,KAAK,CAAC;AAAA,EAChB;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;AACzD,QAAM,kBAAkB,KAAK,IAAI;AAEjC,QAAM,aAAaA,KAAI,uBAAuB,EAAE,MAAM;AACtD,QAAM,cAAc,IAAI,gBAAgB,YAAY,mBAAmB;AACvE,cAAY,MAAM;AAElB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,MACE;AAAA,MACA,aAAa;AAAA,IACf;AAAA,IACA,MAAM;AAAA,IAAC;AAAA,IACP,CAAC,YAAY;AAAE,uBAAiB,QAAQ;AAAA,IAAkC;AAAA,IAC1E,CAAC,UAAU;AACT,kBAAY,KAAK;AACjB,iBAAW,kBAAkB,EAAE,YAAY,qBAAqB,eAAe,MAAM,CAAC;AACtF,iBAAW,KAAK,qBAAqB,KAAK,EAAE;AAAA,IAC9C;AAAA,IACA,CAAC,WAAW;AAAE,kBAAY,mBAAmB,MAAM;AAAA,IAAG;AAAA,EACxD;AAEA,cAAY,KAAK;AAEjB,MAAI,CAAC,gBAAgB;AACnB,eAAW,KAAK,6BAA6B;AAC7C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,aAAW,QAAQ,mBAAmB;AAEtC,aAAW,wBAAwB;AAAA,IACjC,cAAc;AAAA,IACd,aAAa,KAAK,IAAI,IAAI;AAAA,IAC1B,iBAAiB,oBAAoB,cAAc;AAAA,EACrD,CAAC;AAED,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,sBAAsB;AACjC,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;;;AC5GA,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;;;AvBLA,IAAMC,OAAM,KAAK;AAAA,EACfC,KAAG,aAAa,IAAI,IAAI,mBAAmB,YAAY,GAAG,GAAG,OAAO;AACtE;AAEA,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,SAAS,EACd,YAAY,yCAAyC,EACrD,QAAQD,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;;;AwBrDvB,OAAOE,UAAQ;AACf,OAAOC,eAAc;AACrB,SAAS,YAAAC,iBAAgB;AACzB,OAAOC,YAAW;AAClB,OAAOC,UAAS;AAEhB,IAAMC,OAAM,KAAK;AAAA,EACfL,KAAG,aAAa,IAAI,IAAI,mBAAmB,YAAY,GAAG,GAAG,OAAO;AACtE;AAEA,SAAS,YAAY,UAAoC;AACvD,QAAM,KAAKC,UAAS,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACpF,SAAO,IAAI,QAAQ,CAACK,aAAY;AAC9B,OAAG,SAASH,OAAM,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,OAAM;AAAA,UACJ;AAAA,oBAAuB,OAAO,OAAO,MAAM;AAAA,MAASA,OAAM,KAAK,gCAAgC,CAAC;AAAA;AAAA,QAClG;AAAA,MACF;AACA;AAAA,IACF;AAEA,YAAQ;AAAA,MACNA,OAAM,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,KAAI,6BAA6B,EAAE,MAAM;AACzD,QAAI;AACF,MAAAF,UAAS,kCAAkC,EAAE,OAAO,OAAO,CAAC;AAC5D,cAAQ,QAAQC,OAAM,MAAM,cAAc,MAAM,EAAE,CAAC;AAGnD,YAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AACjC,cAAQ,IAAIA,OAAM,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,OAAM;AAAA,UACJ,OAAOA,OAAM,KAAK,gCAAgC,CAAC;AAAA;AAAA,QACrD;AAAA,MACF;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AACF;;;AC/EA,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;AACtC;AAEA,MAAM,gBAAgB;AAEtB,QAAQ,GAAG,UAAU,MAAM,QAAQ,KAAK,GAAG,CAAC;AAC5C,QAAQ,GAAG,WAAW,MAAM,QAAQ,KAAK,GAAG,CAAC;AAE7C,QAAQ,WAAW,EAAE,QAAQ,YAAY;AACvC,QAAM,kBAAkB;AACxB,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["fs","chalk","ora","path","auth","URL","resolve","fs","path","os","path","fs","auth","os","resolve","crypto","fs","path","pkg","fs","path","path","fs","path","crypto","auth","path","fs","fs","path","fs","path","fs","path","fs","crypto","fs","MANIFEST_FILE","chalk","auth","ora","path","resolve","chalk","ora","ora","chalk","chalk","fs","auth","chalk","fs","chalk","ora","readline","auth","chalk","ora","readline","resolve","chalk","auth","chalk","pkg","fs","fs","readline","execSync","chalk","ora","pkg","resolve"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@caliber-ai/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "CLI for configuring coding agent environments",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -19,7 +19,9 @@
|
|
|
19
19
|
"posthog-node": "^5.21.2"
|
|
20
20
|
},
|
|
21
21
|
"files": [
|
|
22
|
-
"dist"
|
|
22
|
+
"dist",
|
|
23
|
+
"README.md",
|
|
24
|
+
"LICENSE"
|
|
23
25
|
],
|
|
24
26
|
"license": "MIT",
|
|
25
27
|
"author": "Caliber AI",
|