@orquentra/codebuddy 2.8.0 → 2.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/CLAUDE_CODEX.md +33 -0
  2. package/README.md +27 -3
  3. package/dist/{adapters-S4HHTWJW.js → adapters-OJRSVFV3.js} +2 -2
  4. package/dist/{chunk-GKNYMNFM.js → chunk-4DKYKDHI.js} +6 -1
  5. package/dist/chunk-4DKYKDHI.js.map +1 -0
  6. package/dist/{chunk-6KGYAFG7.js → chunk-7QMHIJBA.js} +30 -3
  7. package/dist/chunk-7QMHIJBA.js.map +1 -0
  8. package/dist/{chunk-6NZEZJYD.js → chunk-ESC4Y3L7.js} +3 -5
  9. package/dist/{chunk-6NZEZJYD.js.map → chunk-ESC4Y3L7.js.map} +1 -1
  10. package/dist/chunk-GQKWUHMA.js +20 -0
  11. package/dist/chunk-GQKWUHMA.js.map +1 -0
  12. package/dist/{chunk-J4T6HHI4.js → chunk-L6BRYZ6G.js} +537 -316
  13. package/dist/chunk-L6BRYZ6G.js.map +1 -0
  14. package/dist/{chunk-UK6XTS2Y.js → chunk-LRQNPYCK.js} +13 -19
  15. package/dist/chunk-LRQNPYCK.js.map +1 -0
  16. package/dist/{chunk-GXOML4UZ.js → chunk-LW75SKZR.js} +2 -2
  17. package/dist/{chunk-EJQVGFH2.js → chunk-UOTKHSQ5.js} +26 -9
  18. package/dist/chunk-UOTKHSQ5.js.map +1 -0
  19. package/dist/{chunk-W7GAXL6C.js → chunk-V7PT6ER5.js} +6 -5
  20. package/dist/chunk-V7PT6ER5.js.map +1 -0
  21. package/dist/{chunk-ZNLSCV3J.js → chunk-XSNW6Y3X.js} +1253 -315
  22. package/dist/chunk-XSNW6Y3X.js.map +1 -0
  23. package/dist/{chunk-6DONJW3W.js → chunk-YJPCS2GP.js} +274 -69
  24. package/dist/chunk-YJPCS2GP.js.map +1 -0
  25. package/dist/{chunk-XL2HLACE.js → chunk-YN7TEIUH.js} +1 -1
  26. package/dist/chunk-YN7TEIUH.js.map +1 -0
  27. package/dist/{chunk-TLWGZVPC.js → chunk-YNSTIMCF.js} +746 -66
  28. package/dist/chunk-YNSTIMCF.js.map +1 -0
  29. package/dist/{chunk-NY2YXP3R.js → chunk-YWDH6DQ6.js} +70 -4
  30. package/dist/chunk-YWDH6DQ6.js.map +1 -0
  31. package/dist/cli/index.js +23 -9
  32. package/dist/cli/index.js.map +1 -1
  33. package/dist/{codebuddy-DO7ZhoWn.d.ts → codebuddy-CHqMptZB.d.ts} +35 -0
  34. package/dist/index.d.ts +6 -4
  35. package/dist/index.js +9 -9
  36. package/dist/install-EU35ERK5.js +30 -0
  37. package/dist/langgraph/index.d.ts +1 -1
  38. package/dist/lean-43ADYTBW.js +28 -0
  39. package/dist/{main-QUASSFP7.js → main-SFC5LV4E.js} +1333 -437
  40. package/dist/main-SFC5LV4E.js.map +1 -0
  41. package/dist/{operations-WJR7AZZF.js → operations-6Z6ZDVBP.js} +3 -3
  42. package/dist/{pretool-command-JTKX6G3M.js → pretool-command-B5GY5T6E.js} +3 -3
  43. package/dist/prompt-gate-TDTFFQW2.js +8 -0
  44. package/dist/{runtime-OQQ22VJF.js → runtime-W5AW32SD.js} +15 -7
  45. package/dist/{summaries-ML53R7EL.js → summaries-32PHOB6L.js} +3 -4
  46. package/dist/{zvec-XDZNZ2OL.js → zvec-24HLAFGN.js} +3 -4
  47. package/dist/zvec-24HLAFGN.js.map +1 -0
  48. package/package.json +11 -2
  49. package/dist/chunk-6DONJW3W.js.map +0 -1
  50. package/dist/chunk-6KGYAFG7.js.map +0 -1
  51. package/dist/chunk-EJQVGFH2.js.map +0 -1
  52. package/dist/chunk-GKNYMNFM.js.map +0 -1
  53. package/dist/chunk-ITQO632W.js +0 -673
  54. package/dist/chunk-ITQO632W.js.map +0 -1
  55. package/dist/chunk-J4T6HHI4.js.map +0 -1
  56. package/dist/chunk-NY2YXP3R.js.map +0 -1
  57. package/dist/chunk-TLWGZVPC.js.map +0 -1
  58. package/dist/chunk-UK6XTS2Y.js.map +0 -1
  59. package/dist/chunk-W7GAXL6C.js.map +0 -1
  60. package/dist/chunk-XL2HLACE.js.map +0 -1
  61. package/dist/chunk-ZNLSCV3J.js.map +0 -1
  62. package/dist/install-BXM56QCD.js +0 -19
  63. package/dist/lean-command-7DFW32MA.js +0 -19
  64. package/dist/main-QUASSFP7.js.map +0 -1
  65. /package/dist/{adapters-S4HHTWJW.js.map → adapters-OJRSVFV3.js.map} +0 -0
  66. /package/dist/{chunk-GXOML4UZ.js.map → chunk-LW75SKZR.js.map} +0 -0
  67. /package/dist/{install-BXM56QCD.js.map → install-EU35ERK5.js.map} +0 -0
  68. /package/dist/{lean-command-7DFW32MA.js.map → lean-43ADYTBW.js.map} +0 -0
  69. /package/dist/{operations-WJR7AZZF.js.map → operations-6Z6ZDVBP.js.map} +0 -0
  70. /package/dist/{pretool-command-JTKX6G3M.js.map → pretool-command-B5GY5T6E.js.map} +0 -0
  71. /package/dist/{runtime-OQQ22VJF.js.map → prompt-gate-TDTFFQW2.js.map} +0 -0
  72. /package/dist/{summaries-ML53R7EL.js.map → runtime-W5AW32SD.js.map} +0 -0
  73. /package/dist/{zvec-XDZNZ2OL.js.map → summaries-32PHOB6L.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/main.ts","../src/integrations/github.ts","../src/cli/commands/change.ts","../src/change/engine.ts","../src/cli/commands/clients.ts","../src/clients/cost.ts","../src/clients/verify.ts","../src/cli/commands/context.ts","../src/cli/commands/dashboard.ts","../src/dashboard/server.ts","../src/dashboard/page.ts","../src/cli/commands/eval.ts","../src/eval/runner.ts","../src/cli/commands/github.ts","../src/cli/commands/hooks.ts","../src/cli/commands/indexing.ts","../src/cli/commands/llm.ts","../src/cli/commands/init-wizard.ts","../src/cli/commands/learn.ts","../src/learning/outcomes.ts","../src/cli/commands/map.ts","../src/cli/commands/memory-review.ts","../src/cli/commands/models.ts","../evals/fact-relevance.json","../src/providers/calibration.ts","../src/cli/commands/plan.ts","../src/cli/commands/risk.ts","../src/cli/commands/rules.ts","../src/cli/commands/suggest.ts","../src/cli/commands/symbols.ts","../src/cli/commands/telemetry.ts","../src/telemetry/collector.ts","../src/telemetry/admin-page.ts","../src/cli/commands/use-command.ts","../src/core/global-config.ts","../src/cli/commands/worklog.ts","../src/cli/commands/zvec.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { initConfigFile, loadRuntimeConfig, redactSecrets } from \"../core/config-file.js\";\nimport { MemoryFileStore } from \"../core/memory-file-store.js\";\nimport { migrateMemoryToFiles } from \"../core/migrate-to-files.js\";\nimport { createRuntime, inspectNamespace, listFactsPage, runDoctor } from \"../core/operations.js\";\nimport { bootstrapDatabase } from \"../db/bootstrap.js\";\nimport { createDatabaseClient } from \"../db/client.js\";\nimport { runMigrations } from \"../db/migrator.js\";\nimport { installGitHubWorkflow } from \"../integrations/github.js\";\nimport { generateGraphifyGraph } from \"../integrations/graphify.js\";\nimport { startMcpServer } from \"../mcp/server.js\";\nimport { showTelemetryNoticeOnce } from \"../telemetry/telemetry.js\";\nimport { VERSION } from \"../version.js\";\nimport { registerChangeCommand } from \"./commands/change.js\";\nimport {\n installClaudeEntry,\n listClaudeEntries,\n removeClaudeEntry,\n} from \"./commands/claude-desktop.js\";\nimport { registerClientsCommands } from \"./commands/clients.js\";\nimport { installCodexEntry, listCodexEntries, removeCodexEntry } from \"./commands/codex.js\";\nimport { registerContextCommands } from \"./commands/context.js\";\nimport { registerDashboardCommand } from \"./commands/dashboard.js\";\nimport { registerEvalCommand } from \"./commands/eval.js\";\nimport { registerGitHubCommands } from \"./commands/github.js\";\nimport { registerHooksCommands } from \"./commands/hooks.js\";\nimport { registerIndexCommands } from \"./commands/indexing.js\";\nimport { runInitWizard } from \"./commands/init-wizard.js\";\nimport { registerLearnCommand } from \"./commands/learn.js\";\nimport { registerLlmCommands } from \"./commands/llm.js\";\nimport { registerMapCommands } from \"./commands/map.js\";\nimport { registerMemoryCommands } from \"./commands/memory-review.js\";\nimport { registerModelsCommands } from \"./commands/models.js\";\nimport { registerPlanCommands } from \"./commands/plan.js\";\nimport { postgresDown, postgresStatus, postgresUp } from \"./commands/postgres-docker.js\";\nimport { registerRiskCommands } from \"./commands/risk.js\";\nimport { registerRulesCommands } from \"./commands/rules.js\";\nimport { registerSuggestCommand } from \"./commands/suggest.js\";\nimport { registerSymbolsCommand } from \"./commands/symbols.js\";\nimport { registerTelemetryCommands } from \"./commands/telemetry.js\";\nimport { runUseCommand } from \"./commands/use-command.js\";\nimport { registerWorklogCommands } from \"./commands/worklog.js\";\nimport { registerZvecCommands } from \"./commands/zvec.js\";\n\nexport function createCli(): Command {\n const program = new Command();\n\n program\n .name(\"codebuddy\")\n .description(\n \"Project memory and context for AI coding agents: recalls the right facts, files and risks on every prompt.\",\n )\n .version(VERSION);\n\n program.action(async () => {\n await runSafely(async () => {\n await runUseCommand();\n });\n });\n\n program\n .command(\"use\")\n .description(\n \"One-command setup for this folder: PostgreSQL (starts Docker if needed), migrations, embeddings, and agent wiring.\",\n )\n .argument(\"[namespace]\", \"Override the namespace (defaults to current folder name).\")\n .option(\"--postgres-url <url>\", \"Postgres URL to use for this project.\")\n .option(\"--skip-claude\", \"Do not register with Claude Desktop.\")\n .option(\"--skip-codex\", \"Do not register with Codex.\")\n .option(\"--graphify\", \"Enable Graphify setup without prompting.\")\n .option(\"--no-graphify\", \"Skip Graphify setup without prompting.\")\n .option(\n \"--docker\",\n \"Start CodeBuddy's bundled Postgres container when the default DB is unavailable.\",\n )\n .option(\"--no-docker\", \"Do not offer to start CodeBuddy's bundled Postgres container.\")\n .option(\"-y, --yes\", \"Never prompt: use flags and defaults (automatic without a TTY).\")\n .option(\"--non-interactive\", \"Same as --yes.\")\n .action(\n async (\n namespace: string | undefined,\n opts: {\n postgresUrl?: string;\n skipClaude?: boolean;\n skipCodex?: boolean;\n graphify?: boolean;\n docker?: boolean;\n yes?: boolean;\n nonInteractive?: boolean;\n },\n ) => {\n await runSafely(async () => {\n await runUseCommand({\n ...(namespace !== undefined ? { namespace } : {}),\n ...(opts.postgresUrl !== undefined ? { postgresUrl: opts.postgresUrl } : {}),\n ...(opts.skipClaude !== undefined ? { skipClaude: opts.skipClaude } : {}),\n ...(opts.skipCodex !== undefined ? { skipCodex: opts.skipCodex } : {}),\n ...(opts.graphify !== undefined ? { graphify: opts.graphify } : {}),\n ...(opts.docker !== undefined ? { useDocker: opts.docker } : {}),\n ...(opts.yes || opts.nonInteractive ? { interactive: false } : {}),\n });\n });\n },\n );\n\n program\n .command(\"init\")\n .description(\"Interactive setup: config file, Postgres, migrations, Claude Desktop.\")\n .option(\"--non-interactive\", \"Skip the wizard; just create .codebuddy/config.json.\")\n .option(\"--github-action\", \"Install the GitHub PR change-safety workflow.\")\n .action(async (opts: { nonInteractive?: boolean; githubAction?: boolean }) => {\n await runSafely(async () => {\n if (opts.nonInteractive || !process.stdin.isTTY) {\n const result = await initConfigFile();\n console.log(`${result.created ? \"created\" : \"updated permissions\"} ${result.path}`);\n if (opts.githubAction) {\n const workflow = await installGitHubWorkflow();\n console.log(`${workflow.created ? \"installed\" : \"already present\"} ${workflow.path}`);\n }\n return;\n }\n await runInitWizard();\n if (opts.githubAction) {\n const workflow = await installGitHubWorkflow();\n console.log(`${workflow.created ? \"installed\" : \"already present\"} ${workflow.path}`);\n }\n });\n });\n\n const graphify = program\n .command(\"graphify\")\n .description(\"Build the local Graphify repository graph.\");\n graphify\n .command(\"index\")\n .argument(\"[projectRoot]\", \"Project root (defaults to the current directory).\")\n .option(\"--graph <path>\", \"Graph path relative to the project root.\")\n .description(\"Generate or incrementally update graphify-out/graph.json.\")\n .action(async (projectRoot: string | undefined, opts: { graph?: string }) => {\n await runSafely(async () => {\n const root = projectRoot ?? process.cwd();\n const result = await generateGraphifyGraph({\n repositoryRoot: root,\n ...(opts.graph ? { graphPath: opts.graph } : {}),\n });\n console.log(JSON.stringify(result, null, 2));\n });\n });\n\n const migrate = program\n .command(\"migrate\")\n .description(\"Apply pending database migrations.\")\n .action(async () => {\n await runSafely(async () => {\n const config = await loadRuntimeConfig();\n const client = createDatabaseClient({ postgresUrl: config.postgresUrl });\n try {\n await bootstrapDatabase(client.sql);\n await runMigrations(client);\n console.log(\"migrations applied\");\n } finally {\n await client.close();\n }\n });\n });\n migrate\n .command(\"to-files\")\n .description(\"Preview or write existing facts and summaries as Markdown files.\")\n .option(\"--write\", \"Write files. Without this flag the command is a dry run.\")\n .action(async (opts: { write?: boolean }) => {\n await withRuntime(async (runtime) => {\n const config = await loadRuntimeConfig();\n const result = await migrateMemoryToFiles({\n repository: runtime.repository,\n store: new MemoryFileStore(config.projectRoot ?? process.cwd()),\n namespace: config.namespace,\n write: opts.write ?? false,\n });\n console.log(JSON.stringify(result, null, 2));\n });\n });\n\n program\n .command(\"reindex\")\n .description(\"Rebuild fact and summary records from Markdown files.\")\n .option(\"--full\", \"Scan every Markdown memory file.\")\n .action(async (_opts: { full?: boolean }) => {\n await withRuntime(async (runtime) => {\n console.log(JSON.stringify(await runtime.memory.reindexMemory(), null, 2));\n });\n });\n\n const postgres = program\n .command(\"postgres\")\n .description(\"Manage the bundled Postgres container.\");\n postgres\n .command(\"up\")\n .description(\"Start the bundled Postgres container (docker compose up -d).\")\n .action(async () => {\n await runSafely(async () => {\n const result = await postgresUp();\n process.stdout.write(result.stdout);\n if (result.code !== 0) {\n process.stderr.write(result.stderr);\n process.exitCode = result.code;\n }\n });\n });\n\n const db = program.command(\"db\").description(\"Check database connectivity and setup health.\");\n db.command(\"doctor\")\n .description(\"Check Postgres reachability, pgvector, and namespace assumptions.\")\n .action(async () => {\n await runSafely(async () => {\n const report = await runDoctor({ skipModelCheck: true });\n printDbDoctor(report);\n if (!report.db.ok || !report.pgvector.ok || !report.namespace.ok) process.exitCode = 1;\n });\n });\n db.command(\"test\")\n .description(\"Run a simple database connectivity test.\")\n .action(async () => {\n await runSafely(async () => {\n const report = await runDoctor({ skipModelCheck: true });\n if (!report.db.ok) {\n console.log(\"database test: fail\");\n if (report.db.error) console.log(` ${report.db.error}`);\n process.exitCode = 1;\n return;\n }\n console.log(\"database test: ok\");\n });\n });\n postgres\n .command(\"down\")\n .description(\"Stop the bundled Postgres container (data volume preserved).\")\n .action(async () => {\n await runSafely(async () => {\n const result = await postgresDown();\n process.stdout.write(result.stdout);\n if (result.code !== 0) {\n process.stderr.write(result.stderr);\n process.exitCode = result.code;\n }\n });\n });\n postgres\n .command(\"status\")\n .description(\"docker compose ps for the bundled Postgres container.\")\n .action(async () => {\n await runSafely(async () => {\n const result = await postgresStatus();\n process.stdout.write(result.stdout);\n if (result.code !== 0) {\n process.stderr.write(result.stderr);\n process.exitCode = result.code;\n }\n });\n });\n\n const claude = program\n .command(\"claude\")\n .description(\"Register CodeBuddy as an MCP server in Claude Desktop.\");\n claude\n .command(\"install\")\n .option(\"--namespace <name>\", \"Namespace for this Claude Desktop entry.\")\n .option(\"--server-name <name>\", \"Override the server key. Defaults to codebuddy-<namespace>.\")\n .description(\"Add or update a codebuddy MCP entry in Claude Desktop's config.\")\n .action(async (opts: { namespace?: string; serverName?: string }) => {\n await runSafely(async () => {\n const config = await loadRuntimeConfig();\n const namespace = opts.namespace ?? config.namespace ?? \"default\";\n const install = await installClaudeEntry({\n namespace,\n projectRoot: process.cwd(),\n ...(config.provider.apiKey ? { hfToken: config.provider.apiKey } : {}),\n ...(process.env.GROQ_API_KEY ? { groqApiKey: process.env.GROQ_API_KEY } : {}),\n databaseUrl: config.postgresUrl,\n ...(opts.serverName ? { serverName: opts.serverName } : {}),\n });\n console.log(\n `${install.created ? \"added\" : \"updated\"} ${install.serverKey} in ${install.path}`,\n );\n console.log(\"Restart Claude Desktop (⌘Q) to activate.\");\n });\n });\n claude\n .command(\"list\")\n .description(\"List codebuddy entries currently registered in Claude Desktop.\")\n .action(async () => {\n await runSafely(async () => {\n const result = await listClaudeEntries();\n if (result.entries.length === 0) {\n console.log(`No codebuddy entries in ${result.path}.`);\n return;\n }\n console.log(`Claude Desktop config: ${result.path}`);\n for (const entry of result.entries) {\n console.log(\n ` ${entry.key} namespace=${entry.namespace ?? \"?\"} db=${entry.databaseUrl ? String(redactSecrets(entry.databaseUrl)) : \"?\"}`,\n );\n }\n });\n });\n claude\n .command(\"remove\")\n .argument(\"<serverKey>\", \"e.g. codebuddy-work\")\n .description(\"Remove a codebuddy entry from Claude Desktop's config.\")\n .action(async (serverKey: string) => {\n await runSafely(async () => {\n const result = await removeClaudeEntry(serverKey);\n if (result.removed) {\n console.log(`removed ${serverKey} from ${result.path}`);\n console.log(\"Restart Claude Desktop (⌘Q) for the change to take effect.\");\n } else {\n console.log(`no entry \"${serverKey}\" found in ${result.path}`);\n process.exitCode = 1;\n }\n });\n });\n\n const codex = program\n .command(\"codex\")\n .description(\"Register CodeBuddy as an MCP server in Codex.\");\n codex\n .command(\"install\")\n .option(\"--namespace <name>\", \"Namespace for this Codex entry.\")\n .option(\"--server-name <name>\", \"Override the server key. Defaults to codebuddy-<namespace>.\")\n .description(\"Add or update a codebuddy MCP entry in ~/.codex/config.toml.\")\n .action(async (opts: { namespace?: string; serverName?: string }) => {\n await runSafely(async () => {\n const config = await loadRuntimeConfig();\n const namespace = opts.namespace ?? config.namespace ?? \"default\";\n const install = await installCodexEntry({\n namespace,\n projectRoot: process.cwd(),\n ...(config.provider.apiKey ? { hfToken: config.provider.apiKey } : {}),\n databaseUrl: config.postgresUrl,\n ...(opts.serverName ? { serverName: opts.serverName } : {}),\n });\n console.log(\n `${install.created ? \"added\" : \"updated\"} ${install.serverKey} in ${install.path}`,\n );\n console.log(\"Restart Codex to activate.\");\n });\n });\n codex\n .command(\"list\")\n .description(\"List codebuddy entries currently registered in Codex.\")\n .action(async () => {\n await runSafely(async () => {\n const result = await listCodexEntries();\n if (result.entries.length === 0) {\n console.log(`No codebuddy entries in ${result.path}.`);\n return;\n }\n console.log(`Codex config: ${result.path}`);\n for (const entry of result.entries) {\n console.log(\n ` ${entry.key} namespace=${entry.namespace ?? \"?\"} db=${entry.databaseUrl ? String(redactSecrets(entry.databaseUrl)) : \"?\"}`,\n );\n }\n });\n });\n codex\n .command(\"remove\")\n .argument(\"<serverKey>\", \"e.g. codebuddy-work\")\n .description(\"Remove a codebuddy entry from Codex config.\")\n .action(async (serverKey: string) => {\n await runSafely(async () => {\n const result = await removeCodexEntry(serverKey);\n if (result.removed) {\n console.log(`removed ${serverKey} from ${result.path}`);\n console.log(\"Restart Codex for the change to take effect.\");\n } else {\n console.log(`no entry \"${serverKey}\" found in ${result.path}`);\n process.exitCode = 1;\n }\n });\n });\n\n program\n .command(\"serve\")\n .description(\"Start the CodeBuddy MCP stdio server.\")\n .action(async () => runSafely(() => startMcpServer()));\n\n program\n .command(\"inspect\")\n .argument(\"[namespace]\")\n .description(\"Inspect namespaces or a namespace.\")\n .action(async (namespace?: string) => {\n await withRuntime(async (runtime) => {\n console.log(JSON.stringify(await inspectNamespace(runtime.repository, namespace), null, 2));\n });\n });\n\n program\n .command(\"namespaces\")\n .description(\"List namespaces.\")\n .action(async () => {\n await withRuntime(async (runtime) => {\n console.log(\n JSON.stringify({ namespaces: await runtime.repository.listNamespaces() }, null, 2),\n );\n });\n });\n\n program\n .command(\"prune\")\n .requiredOption(\"--older-than <duration>\", \"Duration such as 30d, 12h, or 60m.\")\n .description(\"Delete memories older than a duration.\")\n .action(async (opts: { olderThan: string }) => {\n await withRuntime(async (runtime) => {\n // Guard the footgun: `--older-than 0m` computes cutoff=now and deletes\n // every row across all namespaces. Require a strictly positive window.\n const durationMs = parseDuration(opts.olderThan);\n if (!Number.isFinite(durationMs) || durationMs <= 0) {\n throw new Error(\"--older-than must be a positive duration (e.g. 30d, 12h, 60m).\");\n }\n const cutoff = new Date(Date.now() - durationMs);\n console.log(JSON.stringify(await runtime.repository.pruneBefore(cutoff), null, 2));\n });\n });\n\n program\n .command(\"export\")\n .argument(\"<namespace>\")\n .description(\"Export facts from a namespace as JSON.\")\n .action(async (namespace: string) => {\n await withRuntime(async (runtime) => {\n const row = await runtime.repository.getNamespaceByName(namespace);\n if (!row) throw new Error(`Namespace ${namespace} does not exist.`);\n const facts = await runtime.repository.listFacts({ namespaceId: row.id, limit: 10_000 });\n console.log(JSON.stringify({ namespace, facts }, null, 2));\n });\n });\n\n program\n .command(\"stats\")\n .description(\"Show CodeBuddy storage and usage stats.\")\n .action(async () => {\n await withRuntime(async (runtime) => {\n console.log(JSON.stringify(await runtime.repository.getStats(), null, 2));\n });\n });\n\n program\n .command(\"doctor\")\n .description(\"Check CodeBuddy environment health.\")\n .option(\"--skip-model-check\", \"Do not call Hugging Face models.\")\n .action(async (opts: { skipModelCheck?: boolean }) => {\n await runSafely(async () => {\n const report = await runDoctor({ skipModelCheck: opts.skipModelCheck ?? true });\n printDoctor(report);\n if (\n !report.db.ok ||\n !report.pgvector.ok ||\n report.config.warning ||\n !report.scaffold.policies.ok ||\n !report.scaffold.codebuddyDir.ok ||\n !report.namespace.ok\n ) {\n process.exitCode = 1;\n }\n });\n });\n\n program\n .command(\"list-facts\")\n .option(\"--subject <subject>\")\n .option(\"--limit <limit>\", \"Maximum facts to print.\", Number)\n .option(\"--cursor <cursor>\")\n .description(\"List facts from the configured namespace.\")\n .action(async (opts: { subject?: string; limit?: number; cursor?: string }) => {\n await withRuntime(async (runtime) => {\n console.log(\n JSON.stringify(await listFactsPage(runtime.memory, runtime.repository, opts), null, 2),\n );\n });\n });\n\n registerPlanCommands(program, runSafely);\n registerChangeCommand(program, runSafely);\n registerRiskCommands(program, runSafely);\n registerMapCommands(program, runSafely);\n registerContextCommands(program, runSafely);\n registerEvalCommand(program, runSafely);\n registerIndexCommands(program, runSafely);\n registerLearnCommand(program, runSafely);\n registerMemoryCommands(program, runSafely);\n registerWorklogCommands(program, runSafely);\n registerZvecCommands(program, runSafely);\n registerLlmCommands(program, runSafely);\n registerSuggestCommand(program, runSafely);\n registerRulesCommands(program, runSafely);\n registerHooksCommands(program, runSafely);\n registerModelsCommands(program, runSafely);\n registerDashboardCommand(program, runSafely);\n registerClientsCommands(program, runSafely);\n registerGitHubCommands(program, runSafely);\n registerSymbolsCommand(program, runSafely);\n registerTelemetryCommands(program, runSafely);\n // Once per machine, on a terminal only; until then nothing is sent.\n program.hook(\"preAction\", () => showTelemetryNoticeOnce());\n\n program.action(async () => {\n await runSafely(() => runUseCommand());\n });\n\n groupHelp(program);\n return program;\n}\n\n/** Top-level `--help` in task groups instead of one 35-line list. */\nconst HELP_GROUPS: Array<[string, string[]]> = [\n [\"Get started:\", [\"use\", \"init\", \"doctor\", \"hooks\", \"clients\", \"models\", \"dashboard\"]],\n [\n \"Daily work:\",\n [\"context\", \"plan\", \"change\", \"risk\", \"suggest\", \"memory\", \"worklog\", \"map\", \"symbols\"],\n ],\n [\"Indexing and search:\", [\"index\", \"watch\", \"reindex\", \"zvec\", \"graphify\", \"llm\"]],\n [\n \"Database:\",\n [\n \"postgres\",\n \"db\",\n \"migrate\",\n \"stats\",\n \"inspect\",\n \"namespaces\",\n \"list-facts\",\n \"export\",\n \"prune\",\n ],\n ],\n [\n \"Integrations:\",\n [\"serve\", \"claude\", \"codex\", \"github\", \"rules\", \"learn\", \"eval\", \"telemetry\", \"collector\"],\n ],\n];\n\nfunction groupHelp(program: Command): void {\n const groupOf = new Map(\n HELP_GROUPS.flatMap(([group, names]) => names.map((name) => [name, group])),\n );\n for (const command of program.commands) {\n command.helpGroup(groupOf.get(command.name()) ?? \"Other:\");\n }\n // Help lists groups in order of first appearance; listed order wins, then names in group order.\n const position = new Map(\n HELP_GROUPS.flatMap(([, names]) => names).map((name, index) => [name, index]),\n );\n (program.commands as Command[]).sort(\n (a, b) => (position.get(a.name()) ?? 999) - (position.get(b.name()) ?? 999),\n );\n program.addHelpText(\n \"after\",\n `\nQuick start:\n codebuddy set up this project (PostgreSQL, hooks, agent)\n codebuddy models check the embedding model and memory index\n codebuddy dashboard live page of recalls, tool calls and tokens\n codebuddy context preview \"fix the login redirect\"\n see exactly what an agent would be given`,\n );\n}\n\nasync function withRuntime(\n fn: (runtime: Awaited<ReturnType<typeof createRuntime>>) => Promise<void>,\n) {\n await runSafely(async () => {\n const runtime = await createRuntime(await loadRuntimeConfig());\n try {\n await fn(runtime);\n } finally {\n await runtime.close();\n }\n });\n}\n\nasync function runSafely(fn: () => Promise<void>) {\n try {\n await fn();\n } catch (error) {\n console.error(pc.red(String(redactSecrets((error as Error).message))));\n process.exitCode = 1;\n }\n}\n\nfunction parseDuration(value: string): number {\n const match = /^(\\d+)([dhm])$/.exec(value);\n if (!match) throw new Error(\"--older-than must look like 30d, 12h, or 60m.\");\n const amount = Number(match[1]);\n const unit = match[2];\n if (unit === \"d\") return amount * 24 * 60 * 60 * 1000;\n if (unit === \"h\") return amount * 60 * 60 * 1000;\n return amount * 60 * 1000;\n}\n\nfunction printDoctor(report: Awaited<ReturnType<typeof runDoctor>>) {\n const ok = pc.green(\"ok\");\n const bad = pc.red(\"fail\");\n const warn = pc.yellow(\"warn\");\n console.log(`scaffold root: ${report.scaffold.codebuddyDir.ok ? ok : bad}`);\n if (report.scaffold.codebuddyDir.warning)\n console.log(` ${report.scaffold.codebuddyDir.warning}`);\n console.log(`policy scaffold: ${report.scaffold.policies.ok ? ok : bad}`);\n if (report.scaffold.policies.warning) console.log(` ${report.scaffold.policies.warning}`);\n console.log(`DB connectivity: ${report.db.ok ? ok : bad}`);\n if (report.db.error) console.log(` ${report.db.error}`);\n console.log(`pgvector: ${report.pgvector.ok ? ok : bad}`);\n if (report.pgvector.error) console.log(` ${report.pgvector.error}`);\n console.log(`namespace: ${report.namespace.ok ? ok : warn}`);\n console.log(\n ` runtime=${report.namespace.runtime ?? \"unset\"} default=${report.namespace.expectedDefault}`,\n );\n if (report.namespace.migrated) {\n console.log(` migrated legacy namespace \"default\" to \"${report.namespace.migrated}\"`);\n }\n if (report.namespace.warning) console.log(` ${report.namespace.warning}`);\n console.log(\n `vectors: ${report.vectors.count} index=${report.vectors.index ?? \"missing\"} tuning=${report.vectors.needsTuning ? \"recommended\" : \"not-needed\"}`,\n );\n console.log(\n `recent calls: 60s=${report.usage.last60s} hour=${report.usage.lastHour} 24h=${report.usage.last24h}`,\n );\n console.log(`estimated daily cap remaining: ${report.usage.estimatedDailyCapRemaining}`);\n if (report.usage.warning80Percent)\n console.log(pc.yellow(\"usage warning: daily cap is over 80% used\"));\n console.log(\n `config permissions: ${report.config.exists ? report.config.mode : \"missing\"} ${report.config.ok ? ok : warn}`,\n );\n if (report.config.warning) console.log(` ${report.config.warning}`);\n for (const model of report.models) {\n console.log(`model ${model.id}: ${model.status}${model.error ? ` (${model.error})` : \"\"}`);\n }\n}\n\nfunction printDbDoctor(report: Awaited<ReturnType<typeof runDoctor>>) {\n const ok = pc.green(\"ok\");\n const bad = pc.red(\"fail\");\n const warn = pc.yellow(\"warn\");\n console.log(`DB connectivity: ${report.db.ok ? ok : bad}`);\n if (report.db.postgresUrlSource) console.log(` url source: ${report.db.postgresUrlSource}`);\n if (report.db.error) console.log(` ${report.db.error}`);\n console.log(`pgvector: ${report.pgvector.ok ? ok : bad}`);\n if (report.pgvector.error) console.log(` ${report.pgvector.error}`);\n console.log(`namespace: ${report.namespace.ok ? ok : warn}`);\n console.log(` runtime=${report.namespace.runtime ?? \"unset\"}`);\n if (report.namespace.migrated) {\n console.log(` migrated legacy namespace \"default\" to \"${report.namespace.migrated}\"`);\n }\n if (report.namespace.warning) console.log(` ${report.namespace.warning}`);\n}\n","import { constants } from \"node:fs\";\nimport { access, mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { VERSION } from \"../version.js\";\n\nexport const CODEBUDDY_WORKFLOW_PATH = \".github/workflows/codebuddy.yml\";\n\nexport type InstallGitHubWorkflowResult = {\n path: string;\n created: boolean;\n};\n\nexport function renderGitHubWorkflow(version = VERSION): string {\n return `name: CodeBuddy Change Safety\n\non:\n pull_request:\n types: [opened, synchronize, reopened]\n\npermissions:\n contents: read\n pull-requests: write\n\njobs:\n codebuddy:\n runs-on: ubuntu-latest\n steps:\n - name: Check out pull request\n uses: actions/checkout@v4\n\n - name: Set up Node\n uses: actions/setup-node@v4\n with:\n node-version: 20\n\n - name: Install CodeBuddy\n run: npm install --global --no-audit --no-fund @orquentra/codebuddy@${version}\n\n - name: Generate change report\n run: codebuddy change --json > codebuddy-report.json\n\n - name: Publish step summary\n env:\n REPORT_PATH: codebuddy-report.json\n SUMMARY_PATH: $GITHUB_STEP_SUMMARY\n run: |\n node <<'NODE'\n const fs = require(\"fs\");\n const report = JSON.parse(fs.readFileSync(process.env.REPORT_PATH, \"utf8\"));\n const status = report.status.toUpperCase();\n const findings = (report.suggestions || []).slice(0, 8).map((item) =>\n \"- **\" + item.severity + \"** \" + item.title + \" — \" + item.detail,\n );\n const body = [\n \"<!-- codebuddy-report -->\",\n \"## CodeBuddy change report\",\n \"**Status:** \" + status,\n \"**Highest risk:** \" + report.risk.highestScore + \"/100\",\n \"**Changed paths:** \" + report.paths.length,\n \"**Direct dependents:** \" + report.architecture.totalDependents,\n findings.length ? \"\\\\n### Findings\\\\n\" + findings.join(\"\\\\n\") : \"\\\\nNo findings.\",\n ].join(\"\\\\n\");\n fs.writeFileSync(\"codebuddy-report.md\", body + \"\\\\n\");\n fs.appendFileSync(process.env.SUMMARY_PATH, body + \"\\\\n\");\n NODE\n\n - name: Comment on pull request\n uses: actions/github-script@v7\n with:\n github-token: \\${{ secrets.GITHUB_TOKEN }}\n script: |\n const fs = require(\"fs\");\n const body = fs.readFileSync(\"codebuddy-report.md\", \"utf8\");\n const { owner, repo } = context.repo;\n const issue_number = context.issue.number;\n const comments = await github.paginate(github.rest.issues.listComments, {\n owner, repo, issue_number, per_page: 100,\n });\n const existing = comments.find((comment) => comment.body?.includes(\"<!-- codebuddy-report -->\"));\n if (existing) {\n await github.rest.issues.updateComment({ owner, repo, comment_id: existing.id, body });\n } else {\n await github.rest.issues.createComment({ owner, repo, issue_number, body });\n }\n`;\n}\n\nexport async function installGitHubWorkflow(\n repositoryRoot = process.cwd(),\n options: { force?: boolean } = {},\n): Promise<InstallGitHubWorkflowResult> {\n const root = resolve(repositoryRoot);\n const path = join(root, CODEBUDDY_WORKFLOW_PATH);\n if (!options.force) {\n try {\n await access(path, constants.F_OK);\n return { path, created: false };\n } catch {\n // The workflow does not exist yet.\n }\n }\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, renderGitHubWorkflow(), \"utf8\");\n return { path, created: true };\n}\n","import type { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { buildChangeReport, verifyChange } from \"../../change/engine.js\";\nimport type { ChangeReport, ChangeStatus, ChangeVerificationResult } from \"../../change/types.js\";\nimport { resolveNamespaceFrom } from \"../../core/config-file.js\";\n\nexport function registerChangeCommand(\n program: Command,\n runSafely: (fn: () => Promise<void>) => Promise<void>,\n): void {\n const change = program.command(\"change\").description(\"Assess and verify the current change.\");\n\n change\n .command(\"report\", { isDefault: true })\n .description(\"Report whether the current change is ready, needs review, or is blocked.\")\n .option(\"--paths <paths>\", \"Comma-separated repo-relative paths to review.\")\n .option(\"--plan <id>\", \"Review the files listed in a plan.\")\n .option(\"--no-git\", \"Do not include the current Git change set.\")\n .option(\"--graphify <path>\", \"Use a Graphify graph.json for deeper architecture edges.\")\n .option(\"--json\", \"Print machine-readable JSON.\")\n .action(async (opts: ChangeOptions) => {\n await runSafely(async () => {\n const report = await buildChangeReport(toInput(opts, await resolveNamespaceFrom()));\n if (opts.json) {\n console.log(JSON.stringify(report, null, 2));\n return;\n }\n printReport(report);\n });\n });\n\n change\n .command(\"verify\")\n .description(\"Run the detected test command and report whether the change is verified.\")\n .option(\"--paths <paths>\", \"Comma-separated repo-relative paths to review.\")\n .option(\"--plan <id>\", \"Review the files listed in a plan.\")\n .option(\"--no-git\", \"Do not include the current Git change set.\")\n .option(\"--graphify <path>\", \"Use a Graphify graph.json for deeper architecture edges.\")\n .option(\"--command <command>\", \"Override the detected test command.\")\n .option(\"--timeout <ms>\", \"Stop the test command after this many milliseconds.\", Number)\n .option(\"--json\", \"Print machine-readable JSON.\")\n .action(async (opts: VerifyOptions) => {\n await runSafely(async () => {\n const result = await verifyChange({\n ...toInput(opts, await resolveNamespaceFrom()),\n ...(opts.command ? { command: opts.command } : {}),\n ...(opts.timeout !== undefined ? { timeoutMs: opts.timeout } : {}),\n });\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n printVerification(result);\n }\n if (result.test.status !== \"passed\") process.exitCode = 1;\n });\n });\n}\n\ntype ChangeOptions = {\n paths?: string;\n plan?: string;\n git?: boolean;\n json?: boolean;\n graphify?: string;\n};\n\ntype VerifyOptions = ChangeOptions & {\n command?: string;\n timeout?: number;\n};\n\nfunction toInput(opts: ChangeOptions, namespace: string) {\n return {\n namespace,\n ...(opts.paths ? { paths: parsePaths(opts.paths) } : {}),\n ...(opts.plan ? { planId: opts.plan } : {}),\n ...(opts.git !== undefined ? { useGit: opts.git } : {}),\n ...(opts.graphify ? { graphifyPath: opts.graphify } : {}),\n };\n}\n\nfunction parsePaths(value: string): string[] {\n return value\n .split(\",\")\n .map((path) => path.trim())\n .filter(Boolean);\n}\n\nfunction printReport(report: ChangeReport): void {\n console.log(`${statusBadge(report.status)} ${pc.bold(\"change report\")}`);\n if (report.paths.length === 0) {\n console.log(pc.dim(\" no changed paths detected\"));\n return;\n }\n console.log(` ${report.paths.length} path(s): ${report.paths.join(\", \")}`);\n console.log(` highest risk: ${report.risk.highestScore}`);\n console.log(\n ` architecture: ${report.architecture.totalDependents} direct dependent edge(s) across the change set (${report.architecture.source})`,\n );\n if (report.architecture.warning) console.log(pc.yellow(` ${report.architecture.warning}`));\n if (report.plan) {\n console.log(` plan: ${report.plan.id} ${report.plan.title} (${report.plan.status})`);\n if (report.plan.unexpectedPaths.length > 0)\n console.log(` plan drift: ${report.plan.unexpectedPaths.join(\", \")}`);\n if (report.plan.missingPlannedTests.length > 0)\n console.log(` planned tests still missing: ${report.plan.missingPlannedTests.join(\", \")}`);\n } else {\n console.log(pc.dim(\" plan: no active plan\"));\n }\n console.log(\n ` verification: ${report.verification.changedTestFiles.length} test file(s) changed; ${report.verification.uncoveredCodeFiles.length} code file(s) without a discovered test`,\n );\n if (report.suggestions.length > 0) {\n console.log(\"\\n findings:\");\n for (const suggestion of report.suggestions.slice(0, 8)) {\n console.log(` ${severityBadge(suggestion.severity)} ${suggestion.title}`);\n console.log(pc.dim(` ${suggestion.detail}`));\n }\n } else {\n console.log(pc.dim(\"\\n findings: none\"));\n }\n}\n\nfunction printVerification(result: ChangeVerificationResult): void {\n printReport(result.report);\n console.log(`\\n${testBadge(result.test.status)} verification`);\n console.log(` command: ${result.test.command ?? \"none detected\"}`);\n if (result.test.durationMs > 0) console.log(` duration: ${result.test.durationMs}ms`);\n if (result.test.output) {\n console.log(\" output:\");\n for (const line of result.test.output.split(\"\\n\")) console.log(` ${line}`);\n }\n}\n\nfunction statusBadge(status: ChangeStatus): string {\n if (status === \"blocked\") return pc.red(\"[blocked]\");\n if (status === \"review\") return pc.yellow(\"[review ]\");\n if (status === \"ready\") return pc.green(\"[ready ]\");\n return pc.dim(\"[no diff ]\");\n}\n\nfunction severityBadge(severity: string): string {\n if (severity === \"high\") return pc.red(\"[high]\");\n if (severity === \"medium\") return pc.yellow(\"[med ]\");\n return pc.dim(`[${severity.padEnd(5)}]`);\n}\n\nfunction testBadge(status: ChangeVerificationResult[\"test\"][\"status\"]): string {\n if (status === \"passed\") return pc.green(\"[passed ]\");\n if (status === \"timed_out\") return pc.red(\"[timeout]\");\n if (status === \"failed\") return pc.red(\"[failed ]\");\n return pc.yellow(\"[not run]\");\n}\n","import { spawn } from \"node:child_process\";\nimport { extname } from \"node:path\";\nimport { detectTestCommand } from \"../context/tests.js\";\nimport { PlanFileStore, type PlanSpec } from \"../core/plan-file-store.js\";\nimport { PlanLifecycle } from \"../core/plan-lifecycle.js\";\nimport { loadGraphifyMap } from \"../map/graphify.js\";\nimport { buildArchitectureMap } from \"../map/indexer.js\";\nimport type { ArchitectureMap } from \"../map/types.js\";\nimport { assessRisk, resolveRiskPaths } from \"../risk/service.js\";\nimport type { Assessment } from \"../risk/types.js\";\nimport { generateSuggestions } from \"../suggest/engine.js\";\nimport type { SuggestResult } from \"../suggest/types.js\";\nimport type {\n ChangePlanSummary,\n ChangeReport,\n ChangeTestResult,\n ChangeVerification,\n ChangeVerificationResult,\n TestCommandSource,\n} from \"./types.js\";\n\nconst CODE_EXTENSIONS = new Set([\".ts\", \".tsx\", \".js\", \".jsx\", \".mjs\", \".cjs\"]);\nconst DEFAULT_TEST_TIMEOUT_MS = 120_000;\nconst MAX_TEST_OUTPUT_CHARS = 12_000;\n\nexport type ChangeReportInput = {\n repositoryRoot?: string;\n namespace: string;\n paths?: string[];\n planId?: string;\n useGit?: boolean;\n graphifyPath?: string;\n};\n\nexport type ChangeVerifyInput = ChangeReportInput & {\n command?: string;\n timeoutMs?: number;\n};\n\n/**\n * Compose the signals CodeBuddy already owns into one change-readiness report.\n * This is deliberately read-only: it is safe to run before every commit or in CI.\n */\nexport async function buildChangeReport(input: ChangeReportInput): Promise<ChangeReport> {\n const repositoryRoot = input.repositoryRoot ?? process.cwd();\n const hasExplicitSelection = (input.paths?.length ?? 0) > 0 || input.planId !== undefined;\n const paths =\n input.useGit === false && !hasExplicitSelection\n ? []\n : await resolveRiskPaths({\n repositoryRoot,\n ...(input.paths !== undefined ? { paths: input.paths } : {}),\n ...(input.planId !== undefined ? { planId: input.planId } : {}),\n ...(input.useGit !== undefined ? { useGit: input.useGit } : { useGit: true }),\n });\n\n const planStore = new PlanFileStore(repositoryRoot);\n const [risk, suggestions, plan, architecture] = await Promise.all([\n paths.length === 0\n ? Promise.resolve(emptyAssessment())\n : assessRisk({\n repositoryRoot,\n namespace: input.namespace,\n paths,\n ...(input.useGit !== undefined ? { useGit: input.useGit } : {}),\n ...(input.planId !== undefined ? { planId: input.planId } : {}),\n }),\n paths.length === 0\n ? Promise.resolve(emptySuggestions())\n : generateSuggestions({ repositoryRoot, namespace: input.namespace, paths }),\n resolveRelevantPlan(planStore, input.namespace, input.planId),\n input.graphifyPath\n ? loadGraphifyMapOrFallback(input.graphifyPath, repositoryRoot)\n : buildArchitectureMap(repositoryRoot).then((map) => ({ map, warning: null })),\n ]);\n\n const planSummary = summarizePlan(plan, paths);\n const verification = buildVerification(paths, planSummary, suggestions);\n const { map, warning: graphifyWarning } = architecture;\n const dependentsByPath = countDependents(map.edges, paths);\n const highestScore = risk.items.reduce((highest, item) => Math.max(highest, item.score), 0);\n const status = getStatus(paths, highestScore, suggestions, verification);\n\n return {\n status,\n paths,\n plan: planSummary,\n risk: { highestScore, items: risk.items },\n architecture: {\n dependentsByPath,\n totalDependents: Object.values(dependentsByPath).reduce((sum, count) => sum + count, 0),\n source: input.graphifyPath && !graphifyWarning ? \"graphify\" : \"imports\",\n ...(graphifyWarning ? { warning: graphifyWarning } : {}),\n },\n suggestions: suggestions.suggestions,\n verification,\n };\n}\n\n/** Run the repository's verification command after producing the change report. */\nexport async function verifyChange(input: ChangeVerifyInput): Promise<ChangeVerificationResult> {\n const report = await buildChangeReport(input);\n const detected = input.command\n ? { command: input.command, source: \"explicit\" as const }\n : await detectedTestCommand(input.repositoryRoot ?? process.cwd());\n\n if (!detected) {\n return {\n report,\n test: {\n status: \"not_run\",\n command: null,\n source: null,\n exitCode: null,\n signal: null,\n durationMs: 0,\n output:\n \"No test command found. Pass --command, add a test script to package.json, or add pyproject.toml/pytest.ini/setup.cfg, go.mod or Cargo.toml.\",\n },\n };\n }\n\n return {\n report,\n test: await runTestCommand(\n detected.command,\n detected.source,\n input.repositoryRoot ?? process.cwd(),\n input.timeoutMs ?? DEFAULT_TEST_TIMEOUT_MS,\n ),\n };\n}\n\n/** The one detector `context explain` uses too (`context/tests.ts`). */\nasync function detectedTestCommand(\n repositoryRoot: string,\n): Promise<{ command: string; source: TestCommandSource } | null> {\n const command = await detectTestCommand(repositoryRoot);\n if (command === null) return null;\n return {\n command,\n source: /^(npm|pnpm|yarn|bun) test$/.test(command) ? \"package_script\" : \"project_marker\",\n };\n}\n\nfunction runTestCommand(\n command: string,\n source: TestCommandSource,\n repositoryRoot: string,\n timeoutMs: number,\n): Promise<ChangeTestResult> {\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw new Error(\"--timeout must be a positive number of milliseconds.\");\n }\n return new Promise((resolve) => {\n const startedAt = Date.now();\n const child = spawn(command, {\n cwd: repositoryRoot,\n env: process.env,\n shell: true,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n let output = \"\";\n let timedOut = false;\n const append = (chunk: Buffer | string) => {\n output += chunk.toString();\n if (output.length > MAX_TEST_OUTPUT_CHARS) {\n output = `[output truncated; showing last ${MAX_TEST_OUTPUT_CHARS} characters]\\n${output.slice(-MAX_TEST_OUTPUT_CHARS)}`;\n }\n };\n child.stdout.on(\"data\", append);\n child.stderr.on(\"data\", append);\n const timer = setTimeout(() => {\n timedOut = true;\n child.kill(\"SIGTERM\");\n }, timeoutMs);\n child.on(\"close\", (exitCode, signal) => {\n clearTimeout(timer);\n resolve({\n status: timedOut ? \"timed_out\" : exitCode === 0 ? \"passed\" : \"failed\",\n command,\n source,\n exitCode,\n signal,\n durationMs: Date.now() - startedAt,\n output: output.trim(),\n });\n });\n child.on(\"error\", (error) => {\n clearTimeout(timer);\n resolve({\n status: \"failed\",\n command,\n source,\n exitCode: null,\n signal: null,\n durationMs: Date.now() - startedAt,\n output: `${output.trim()}\\n${error.message}`.trim(),\n });\n });\n });\n}\n\n/**\n * An explicit `--graphify <path>` that cannot be read must not sink the whole\n * report: fall back to the import scan and carry the reason into the report, so\n * the failure is visible rather than silently swallowed.\n */\nasync function loadGraphifyMapOrFallback(\n graphifyPath: string,\n repositoryRoot: string,\n): Promise<{ map: ArchitectureMap; warning: string | null }> {\n try {\n return { map: await loadGraphifyMap(graphifyPath, repositoryRoot), warning: null };\n } catch (error) {\n return {\n map: await buildArchitectureMap(repositoryRoot),\n warning: `Graphify graph unusable, fell back to the import scan: ${(error as Error).message}`,\n };\n }\n}\n\nfunction emptyAssessment(): Assessment {\n return {\n items: [],\n stats: { pathsConsidered: 0, itemsProduced: 0, signalsRun: 0, perSignal: [] },\n };\n}\n\nfunction emptySuggestions(): SuggestResult {\n return {\n suggestions: [],\n stats: { pathsConsidered: 0, produced: 0, byCategory: {}, bySeverity: {} },\n };\n}\n\nasync function resolveRelevantPlan(\n store: PlanFileStore,\n namespace: string,\n planId?: string,\n): Promise<PlanSpec | null> {\n if (planId) {\n try {\n return await store.readPlan(planId);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n }\n }\n return new PlanLifecycle(store).current(namespace);\n}\n\nfunction summarizePlan(plan: PlanSpec | null, paths: string[]): ChangePlanSummary | null {\n if (!plan) return null;\n const plannedPaths = plan.filesToTouch.map((file) => file.path).sort();\n const plannedSet = new Set(plannedPaths);\n const unexpectedPaths = paths.filter((path) => !plannedSet.has(path));\n const plannedTests = plan.testsToAdd.map((test) => test.path).sort();\n const changed = new Set(paths);\n const missingPlannedTests = plannedTests.filter((path) => !changed.has(path));\n return {\n id: plan.id,\n title: plan.title,\n status: plan.status,\n plannedPaths,\n unexpectedPaths,\n plannedTests,\n missingPlannedTests,\n };\n}\n\nfunction buildVerification(\n paths: string[],\n plan: ChangePlanSummary | null,\n suggestions: { suggestions: ChangeReport[\"suggestions\"] },\n): ChangeVerification {\n const changedTestFiles = paths.filter(isTestFile);\n const changedCodeFiles = paths.filter((path) => isCodeFile(path) && !isTestFile(path));\n const uncovered = new Set(\n suggestions.suggestions\n .filter((suggestion) => suggestion.category === \"missing_test\" && suggestion.path)\n .map((suggestion) => suggestion.path as string),\n );\n const plannedTests = plan?.plannedTests ?? [];\n const missingPlannedTests = plan?.missingPlannedTests ?? [];\n return {\n changedCodeFiles,\n changedTestFiles,\n uncoveredCodeFiles: changedCodeFiles.filter((path) => uncovered.has(path)),\n plannedTests,\n missingPlannedTests,\n readyToVerify: changedTestFiles.length > 0 || changedCodeFiles.length === 0,\n };\n}\n\nfunction countDependents(\n edges: Array<{ from: string; to: string }>,\n paths: string[],\n): Record<string, number> {\n const targets = new Set(paths);\n const counts: Record<string, number> = {};\n for (const path of paths) counts[path] = 0;\n for (const edge of edges) {\n if (targets.has(edge.to)) counts[edge.to] = (counts[edge.to] ?? 0) + 1;\n }\n return counts;\n}\n\nfunction getStatus(\n paths: string[],\n highestRisk: number,\n suggestions: { suggestions: ChangeReport[\"suggestions\"] },\n verification: ChangeVerification,\n): ChangeReport[\"status\"] {\n if (paths.length === 0) return \"no_changes\";\n if (highestRisk >= 75 || suggestions.suggestions.some((item) => item.severity === \"high\")) {\n return \"blocked\";\n }\n if (\n highestRisk >= 50 ||\n suggestions.suggestions.some((item) => item.severity === \"medium\") ||\n verification.uncoveredCodeFiles.length > 0 ||\n verification.missingPlannedTests.length > 0\n ) {\n return \"review\";\n }\n return \"ready\";\n}\n\nfunction isCodeFile(path: string): boolean {\n return CODE_EXTENSIONS.has(extname(path).toLowerCase());\n}\n\nfunction isTestFile(path: string): boolean {\n return /(^|\\/)(__tests__\\/|.*\\.(test|spec)\\.)/.test(path);\n}\n","import { relative } from \"node:path\";\nimport type { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport {\n AUTOMATION_MODES,\n CLIENT_ADAPTERS,\n CLIENT_IDS,\n LIFECYCLE_EVENTS,\n MODE_LABELS,\n parseClient,\n parseMode,\n supportedModes,\n} from \"../../clients/adapters.js\";\nimport { measureClientCosts } from \"../../clients/cost.js\";\nimport {\n type ClientReport,\n detectClient,\n installClient,\n uninstallClient,\n} from \"../../clients/install.js\";\nimport { verifyClient } from \"../../clients/verify.js\";\nimport { estimateTokens } from \"../../savings/tokens.js\";\nimport { renderManagedBlock } from \"../../templates/install.js\";\n\n/**\n * `codebuddy clients` selects one explicit automation mode per coding agent and\n * reports, per host, which lifecycle events CodeBuddy automates and which are\n * missing. Install/uninstall are idempotent and only touch CodeBuddy's entries.\n */\nexport function registerClientsCommands(\n program: Command,\n runSafely: (fn: () => Promise<void>) => Promise<void>,\n): void {\n const clients = program\n .command(\"clients\")\n .description(\"Client adapters: capabilities and explicit automation modes per coding agent.\");\n\n clients\n .command(\"list\")\n .option(\"--namespace <name>\", \"Namespace whose MCP entries to look for.\")\n .description(\"Show each client's surfaces, lifecycle coverage, and mode in this repo.\")\n .action(async (opts: { namespace?: string }) => {\n await runSafely(async () => {\n for (const client of CLIENT_IDS) {\n const adapter = CLIENT_ADAPTERS[client];\n const status = await detectClient(client, process.cwd(), opts.namespace);\n const mcp = \"file\" in adapter.mcp ? adapter.mcp.file : \"global (--global)\";\n const lifecycle = LIFECYCLE_EVENTS.map((event) =>\n adapter.hookEvents.includes(event) ? pc.green(event) : pc.dim(`${event}✗`),\n ).join(\" \");\n const ruleCost = supportedModes(adapter)\n .flatMap((mode) =>\n mode === \"mcp-only\"\n ? []\n : [`${mode} ~${estimateTokens(renderManagedBlock(client, mode))}`],\n )\n .join(\", \");\n console.log(\n `${pc.bold(adapter.name)} (${client}) ${pc.dim(`verified ${adapter.host.bin} ${adapter.host.verified}`)}`,\n );\n console.log(\n ` rules ${adapter.rulesFile} · mcp ${mcp} · modes ${supportedModes(adapter).join(\"|\")}`,\n );\n console.log(` lifecycle: ${lifecycle}`);\n console.log(` rules block tokens: ${ruleCost}`);\n console.log(\n ` this repo: ${status.mode === \"none\" ? pc.dim(\"not installed\") : pc.cyan(status.mode)}`,\n );\n if (adapter.gap) console.log(pc.dim(` missing: ${adapter.gap}`));\n if (adapter.note) console.log(pc.dim(` note: ${adapter.note}`));\n for (const warning of status.warnings) console.log(pc.yellow(` ! ${warning}`));\n }\n console.log(pc.dim(\"Per-turn token cost per client: codebuddy clients cost\"));\n });\n });\n\n clients\n .command(\"install\")\n .argument(\"<client>\", `One of: ${CLIENT_IDS.join(\", \")}.`)\n .requiredOption(\"--mode <mode>\", `One of: ${AUTOMATION_MODES.join(\", \")}.`)\n .option(\"--namespace <name>\", \"Namespace for the MCP entry (defaults to config/folder).\")\n .option(\"--global\", \"Also add the MCP entry to the global config (Codex, Hermes).\")\n .description(\"Apply one automation mode: rules block, hooks, and MCP config.\")\n .action(\n async (client: string, opts: { mode: string; namespace?: string; global?: boolean }) => {\n await runSafely(async () => {\n const mode = parseMode(opts.mode);\n const report = await installClient({\n client: parseClient(client),\n mode,\n ...(opts.namespace ? { namespace: opts.namespace } : {}),\n ...(opts.global ? { global: true } : {}),\n });\n printReport(report, `${MODE_LABELS[mode]} mode`);\n });\n },\n );\n\n clients\n .command(\"uninstall\")\n .argument(\"<client>\", `One of: ${CLIENT_IDS.join(\", \")}.`)\n .option(\"--namespace <name>\", \"Namespace of the MCP entry to remove.\")\n .option(\"--global\", \"Also remove the MCP entry from the global config (Codex, Hermes).\")\n .description(\"Remove CodeBuddy's rules block, hooks, and MCP entry (user config untouched).\")\n .action(async (client: string, opts: { namespace?: string; global?: boolean }) => {\n await runSafely(async () => {\n const report = await uninstallClient({\n client: parseClient(client),\n ...(opts.namespace ? { namespace: opts.namespace } : {}),\n ...(opts.global ? { global: true } : {}),\n });\n printReport(report, \"uninstalled\");\n });\n });\n\n clients\n .command(\"verify\")\n .argument(\"[client]\", `One of: ${CLIENT_IDS.join(\", \")} (default: all).`)\n .option(\"--namespace <name>\", \"Namespace whose MCP entries to look for.\")\n .description(\n \"Compare installed hosts with the verified versions; run no-model conformance checks.\",\n )\n .action(async (client: string | undefined, opts: { namespace?: string }) => {\n await runSafely(async () => {\n const targets = client ? [parseClient(client)] : CLIENT_IDS;\n for (const id of targets) {\n const report = await verifyClient(\n id,\n opts.namespace ? { namespace: opts.namespace } : {},\n );\n const drift =\n report.drift === \"match\"\n ? pc.green(\"match\")\n : report.drift === \"drift\"\n ? pc.yellow(`drift (installed ${report.installed})`)\n : pc.dim(\"not installed\");\n console.log(\n `${pc.bold(CLIENT_ADAPTERS[id].name)}: verified ${report.verified} · ${drift}`,\n );\n console.log(\n ` events: ${report.events.map(({ event, wired }) => (wired ? pc.green(event) : pc.dim(`${event}✗`))).join(\" \")}`,\n );\n for (const check of report.checks) {\n const label =\n check.status === \"pass\"\n ? pc.green(\"pass\")\n : check.status === \"fail\"\n ? pc.red(\"fail\")\n : pc.dim(\"skip\");\n console.log(` ${label} ${check.name}: ${check.detail}`);\n }\n }\n });\n });\n\n clients\n .command(\"cost\")\n .option(\"--namespace <name>\", \"Namespace to measure (defaults to config/folder).\")\n .option(\"--json\", \"Print the measurements as JSON.\")\n .description(\"Measured per-turn CodeBuddy token cost per client and mode, for this repo.\")\n .action(async (opts: { namespace?: string; json?: boolean }) => {\n await runSafely(async () => {\n const costs = await measureClientCosts(process.cwd(), opts.namespace);\n if (opts.json) {\n console.log(JSON.stringify(costs, null, 2));\n return;\n }\n console.log(\n \"client mode rules mcp-schema block(1st) block(later) turn(1st) turn(later)\",\n );\n for (const cost of costs) {\n const fixed = cost.rules + cost.mcpSchema;\n console.log(\n [\n cost.client.padEnd(10),\n cost.mode.padEnd(7),\n String(cost.rules).padStart(5),\n String(cost.mcpSchema).padStart(11),\n String(cost.firstBlock).padStart(11),\n String(cost.laterBlock).padStart(13),\n String(fixed + cost.firstBlock).padStart(10),\n String(fixed + cost.laterBlock).padStart(12),\n ].join(\" \"),\n );\n }\n console.log(\n pc.dim(\n \"Measured with the cl100k estimator on the generated rules block, the MCP tools/list payload and this repo's hook block. Host framing (host-dependent, not measured):\",\n ),\n );\n for (const id of CLIENT_IDS) console.log(pc.dim(` ${id}: ${CLIENT_ADAPTERS[id].framing}`));\n });\n });\n}\n\nfunction printReport(report: ClientReport, title: string): void {\n console.log(`${pc.bold(CLIENT_ADAPTERS[report.client].name)}: ${title}`);\n for (const step of report.steps) {\n const where = relative(process.cwd(), step.target) || step.target;\n const label = step.action === \"unchanged\" ? pc.dim(step.action) : pc.green(step.action);\n console.log(` ${step.surface.padEnd(5)} ${label} ${where}`);\n }\n for (const note of report.notes) console.log(pc.dim(` ${note}`));\n}\n","import { mkdtemp, rm } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { InMemoryTransport } from \"@modelcontextprotocol/sdk/inMemory.js\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { buildBeforeEditContext, buildBootstrapContext } from \"../context/engine.js\";\nimport { SessionCapsuleLedger } from \"../context/session-ledger.js\";\nimport { resolveNamespaceFrom } from \"../core/config-file.js\";\nimport { renderLeanBlock } from \"../hooks/lean.js\";\nimport { renderContextBlock } from \"../hooks/runtime.js\";\nimport { registerCodeBuddyTools } from \"../mcp/tools/index.js\";\nimport { estimateTokens } from \"../savings/tokens.js\";\nimport { renderManagedBlock } from \"../templates/install.js\";\nimport { VERSION } from \"../version.js\";\nimport { CLIENT_ADAPTERS, CLIENT_IDS, type ClientId, supportedModes } from \"./adapters.js\";\n\n/**\n * Per-turn CodeBuddy token cost per client, measured on the real generated\n * artifacts with the shared cl100k estimator: the managed rules block, the MCP\n * `tools/list` payload, and the hook context block for this repo on the first\n * prompt and on a later prompt with nothing changed. Nothing is estimated by\n * hand; what the host adds or drops around them is the adapter's `framing`.\n */\n\nexport type ClientCost = {\n client: ClientId;\n mode: \"agent\" | \"hooks\" | \"lean\";\n rules: number;\n mcpSchema: number;\n /** Hook context block on the first prompt of a session (0 in agent mode). */\n firstBlock: number;\n /** Hook context block on a later prompt with nothing changed. */\n laterBlock: number;\n};\n\n/**\n * The MCP server's tools/list payload as a client receives it (`full`), and the\n * name listing a schema-deferring host sends instead (`listing`).\n */\nasync function mcpSchemaTokens(\n root: string,\n namespace: string,\n): Promise<{ full: number; listing: number }> {\n const server = new McpServer({ name: \"codebuddy\", version: VERSION });\n registerCodeBuddyTools(server, {\n config: { namespace, projectRoot: root },\n database: {\n get: () => Promise.reject(new Error(\"not used\")),\n status: () => ({ available: false, state: \"idle\" }),\n },\n });\n const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();\n const client = new Client({ name: \"codebuddy-cost\", version: VERSION });\n await Promise.all([server.connect(serverTransport), client.connect(clientTransport)]);\n try {\n const { tools } = await client.listTools();\n return {\n full: estimateTokens(tools),\n listing: estimateTokens(tools.map((tool) => tool.name).join(\"\\n\")),\n };\n } finally {\n await client.close();\n }\n}\n\n/**\n * The hook block for this repo on a first and a repeated prompt, ledger kept in\n * a temp dir; `lean` is the lean pointer block for the same targets.\n */\nasync function hookBlockTokens(\n root: string,\n namespace: string,\n): Promise<{ first: number; later: number; lean: { first: number; later: number } }> {\n const bootstrap = await buildBootstrapContext({ repositoryRoot: root, namespace });\n const beforeEdit = await buildBeforeEditContext({\n repositoryRoot: root,\n namespace,\n useGit: true,\n }).catch(() => null);\n const scratch = await mkdtemp(join(tmpdir(), \"codebuddy-cost-\"));\n try {\n const ledger = new SessionCapsuleLedger(scratch);\n const render = () => renderContextBlock(bootstrap, beforeEdit, ledger, \"cost\", true);\n const first = await render();\n await ledger.markSent(\"cost\", first.emitted);\n const later = await render();\n const pointers = (beforeEdit?.targetPaths ?? []).map((path) => ({ path, symbols: [] }));\n const renderLean = () =>\n renderLeanBlock({ repositoryRoot: root, prompt: \"\", pointers, ledger, sessionId: \"lean\" });\n const leanFirst = await renderLean();\n await ledger.markSent(\"lean\", leanFirst.emitted);\n const leanLater = await renderLean();\n return {\n first: estimateTokens(first.text),\n later: estimateTokens(later.text),\n lean: { first: estimateTokens(leanFirst.text), later: estimateTokens(leanLater.text) },\n };\n } finally {\n await rm(scratch, { recursive: true, force: true });\n }\n}\n\nexport async function measureClientCosts(\n projectRoot = process.cwd(),\n namespace?: string,\n): Promise<ClientCost[]> {\n const root = resolve(projectRoot);\n const ns = namespace ?? (await resolveNamespaceFrom(root));\n const mcpSchema = await mcpSchemaTokens(root, ns);\n const block = await hookBlockTokens(root, ns);\n return CLIENT_IDS.flatMap((client) => {\n const adapter = CLIENT_ADAPTERS[client];\n return supportedModes(adapter).flatMap((mode): ClientCost[] => {\n if (mode === \"mcp-only\") return [];\n if (mode === \"lean\") {\n // Lean sends no rules and registers no MCP server: only the pointer line.\n const later = adapter.ephemeralContext ? block.lean.first : block.lean.later;\n return [\n { client, mode, rules: 0, mcpSchema: 0, firstBlock: block.lean.first, laterBlock: later },\n ];\n }\n const hooks = mode === \"hooks\";\n const later = adapter.ephemeralContext ? block.first : block.later;\n return [\n {\n client,\n mode,\n rules: estimateTokens(renderManagedBlock(client, mode)),\n mcpSchema: adapter.defersMcpSchemas ? mcpSchema.listing : mcpSchema.full,\n firstBlock: hooks ? block.first : 0,\n laterBlock: hooks ? later : 0,\n },\n ];\n });\n });\n}\n","import { execFile } from \"node:child_process\";\nimport { readFile, realpath } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { resolveNamespaceFrom } from \"../core/config-file.js\";\nimport { hermesPluginInstalled } from \"../hooks/hermes-plugin.js\";\nimport { clientHooksInstalled } from \"../hooks/install.js\";\nimport { hermesConfigPath, readHermesConfig } from \"../integrations/hermes-config.js\";\nimport {\n CLIENT_ADAPTERS,\n type ClientId,\n LIFECYCLE_EVENTS,\n type LifecycleEvent,\n} from \"./adapters.js\";\n\n/**\n * `codebuddy clients verify`: compares the installed host with the version\n * its adapter was verified against, and runs the conformance checks that need\n * no model call (version, config/plugin/MCP listings). Offline-safe and\n * fail-soft: a missing host or a failing command is a reported result.\n */\n\nexport type HostRun = { ok: boolean; stdout: string };\nexport type HostRunner = (bin: string, args: string[], cwd: string) => Promise<HostRun>;\n\n/** Run a host CLI with a timeout; never throws. */\nexport const runHost: HostRunner = (bin, args, cwd) =>\n new Promise((done) => {\n execFile(bin, args, { cwd, timeout: 15_000, maxBuffer: 8 * 1024 * 1024 }, (error, stdout) =>\n done({ ok: !error, stdout: String(stdout ?? \"\") }),\n );\n });\n\nexport type Check = { name: string; status: \"pass\" | \"fail\" | \"skip\"; detail: string };\n\nexport type ClientVerification = {\n client: ClientId;\n /** Detected host version; null when the host is not installed. */\n installed: string | null;\n verified: string;\n drift: \"match\" | \"drift\" | \"not-installed\";\n events: Array<{ event: LifecycleEvent; wired: boolean }>;\n checks: Check[];\n};\n\ntype Context = { root: string; name: string; run: HostRunner; env: NodeJS.ProcessEnv };\n\nconst pass = (name: string, detail: string): Check => ({ name, status: \"pass\", detail });\nconst fail = (name: string, detail: string): Check => ({ name, status: \"fail\", detail });\nconst skip = (name: string, detail: string): Check => ({ name, status: \"skip\", detail });\n\nfunction json(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return null;\n }\n}\n\n/** Host-specific checks, run only when the host is installed. */\nconst CONFORMANCE: Partial<Record<ClientId, (ctx: Context) => Promise<Check[]>>> = {\n claude: async ({ root, name, run }) => {\n const hooks = (await clientHooksInstalled(root, \"claude\"))\n ? pass(\"hooks\", \".claude/settings.json has the CodeBuddy hooks\")\n : skip(\"hooks\", \"not installed in this repo\");\n const mcp = await run(\"claude\", [\"mcp\", \"get\", name], root);\n return [\n hooks,\n mcp.ok\n ? pass(\"mcp\", `claude mcp get ${name}: ${mcp.stdout.match(/Scope: (.+)/)?.[1] ?? \"found\"}`)\n : skip(\"mcp\", `claude mcp get ${name}: not configured`),\n ];\n },\n opencode: async ({ root, name, run }) => {\n const result = await run(\"opencode\", [\"debug\", \"config\"], root);\n const config = json(result.stdout) as {\n plugin?: string[];\n mcp?: Record<string, unknown>;\n } | null;\n if (!config) return [fail(\"config\", \"opencode debug config returned no JSON\")];\n const installed = await clientHooksInstalled(root, \"opencode\");\n const href = pathToFileURL(\n join(await realpath(root).catch(() => root), \".opencode\", \"plugins\", \"codebuddy.js\"),\n ).href;\n const loaded = config.plugin?.includes(href) === true;\n return [\n installed\n ? loaded\n ? pass(\"plugin\", \"opencode debug config loads .opencode/plugins/codebuddy.js\")\n : fail(\"plugin\", \"plugin file is installed but opencode does not load it\")\n : skip(\"plugin\", \"not installed in this repo\"),\n config.mcp?.[name]\n ? pass(\"mcp\", `opencode resolves the ${name} MCP entry`)\n : skip(\"mcp\", `no ${name} entry in the resolved config`),\n ];\n },\n codex: async ({ root, name, run }) => {\n const result = await run(\"codex\", [\"mcp\", \"list\", \"--json\"], root);\n const servers = json(result.stdout);\n if (!Array.isArray(servers)) return [fail(\"mcp\", \"codex mcp list --json returned no JSON\")];\n return [\n servers.some((server) => (server as { name?: string }).name === name)\n ? pass(\"mcp\", `codex mcp list has ${name}`)\n : skip(\"mcp\", `no ${name} entry (clients install codex --global adds it)`),\n ];\n },\n hermes: async ({ root, name, run, env }) => {\n const checks: Check[] = [];\n const listed = await run(\"hermes\", [\"mcp\", \"list\"], root);\n checks.push(\n listed.ok && listed.stdout.includes(name)\n ? pass(\"mcp\", `hermes mcp list has ${name}`)\n : skip(\"mcp\", `no ${name} entry (clients install hermes --global adds it)`),\n );\n if (!(await hermesPluginInstalled(root))) {\n checks.push(skip(\"plugin\", \"not installed in this repo\"));\n return checks;\n }\n const projectPlugins =\n /^(1|true|yes|on)$/i.test(env.HERMES_ENABLE_PROJECT_PLUGINS ?? \"\") ||\n /^\\s*HERMES_ENABLE_PROJECT_PLUGINS\\s*=\\s*[\"']?(1|true|yes|on)/im.test(\n await readFile(join(hermesConfigPath(), \"..\", \".env\"), \"utf8\").catch(() => \"\"),\n );\n const plugins = (await readHermesConfig(hermesConfigPath()))?.plugins as\n | { enabled?: unknown }\n | undefined;\n const enabled = Array.isArray(plugins?.enabled) && plugins.enabled.includes(\"codebuddy\");\n checks.push(\n projectPlugins\n ? pass(\"project-plugins\", \"HERMES_ENABLE_PROJECT_PLUGINS is set\")\n : fail(\"project-plugins\", \"set HERMES_ENABLE_PROJECT_PLUGINS=1 (shell or ~/.hermes/.env)\"),\n enabled\n ? pass(\"plugin-enabled\", \"codebuddy is in plugins.enabled\")\n : fail(\"plugin-enabled\", \"add codebuddy to plugins.enabled in ~/.hermes/config.yaml\"),\n );\n return checks;\n },\n};\n\nexport async function verifyClient(\n client: ClientId,\n options: { root?: string; namespace?: string; run?: HostRunner; env?: NodeJS.ProcessEnv } = {},\n): Promise<ClientVerification> {\n const root = resolve(options.root ?? process.cwd());\n const run = options.run ?? runHost;\n const adapter = CLIENT_ADAPTERS[client];\n const version = await run(adapter.host.bin, [\"--version\"], root);\n const installed = version.ok ? (version.stdout.match(/\\d+\\.\\d+\\.\\d+/)?.[0] ?? null) : null;\n const events = LIFECYCLE_EVENTS.map((event) => ({\n event,\n wired: adapter.hookEvents.includes(event),\n }));\n if (!installed) {\n return {\n client,\n installed: null,\n verified: adapter.host.verified,\n drift: \"not-installed\",\n events,\n checks: [skip(\"host\", `${adapter.host.bin} not found or printed no version`)],\n };\n }\n const name = `codebuddy-${options.namespace ?? (await resolveNamespaceFrom(root))}`;\n const conformance = CONFORMANCE[client];\n const checks = conformance\n ? await conformance({ root, name, run, env: options.env ?? process.env }).catch(\n (error: Error) => [fail(\"conformance\", error.message)],\n )\n : [];\n return {\n client,\n installed,\n verified: adapter.host.verified,\n drift: installed === adapter.host.verified ? \"match\" : \"drift\",\n events,\n checks: [pass(\"host\", `${adapter.host.bin} ${installed}`), ...checks],\n };\n}\n","import type { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { buildBeforeEditContext, buildBootstrapContext } from \"../../context/engine.js\";\nimport type { BeforeEditContext, BootstrapContext } from \"../../context/types.js\";\nimport { readConfigFile, resolveNamespaceFrom } from \"../../core/config-file.js\";\nimport { openHookSemantics } from \"../../hooks/semantic.js\";\n\n/**\n * Context previews are file-based (plan store, risk service, architecture map,\n * Markdown memory) so they run without a database connection — the same\n * lightweight path the plan and risk commands use.\n */\n\nasync function resolveTokenBudget(cwd = process.cwd()): Promise<number | undefined> {\n const file = await readConfigFile(cwd);\n return file.tokenBudget;\n}\n\nfunction parsePaths(value: string): string[] {\n return value\n .split(\",\")\n .map((path) => path.trim())\n .filter(Boolean);\n}\n\nexport function registerContextCommands(\n program: Command,\n runSafely: (fn: () => Promise<void>) => Promise<void>,\n): void {\n const context = program\n .command(\"context\")\n .description(\"Preview the compact project context CodeBuddy would send to an agent.\");\n\n context\n .command(\"bootstrap\")\n .option(\"--json\", \"Print machine-readable JSON.\")\n .description(\"Show start-of-turn project awareness (plan, policy, incidents, architecture).\")\n .action(async (opts: { json?: boolean }) => {\n await runSafely(async () => {\n const [namespace, tokenBudget] = await Promise.all([\n resolveNamespaceFrom(),\n resolveTokenBudget(),\n ]);\n const result = await buildBootstrapContext({\n namespace,\n ...(tokenBudget !== undefined ? { tokenBudget } : {}),\n });\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n printBootstrap(result);\n });\n });\n\n context\n .command(\"preview\")\n .argument(\"[task...]\", \"The task you are about to work on.\")\n .option(\"--paths <paths>\", \"Comma-separated repo-relative paths to target.\")\n .option(\"--plan <id>\", \"Resolve target files from a CodeBuddy plan.\")\n .option(\"--git\", \"Resolve target files from current git changes.\")\n .option(\"--json\", \"Print machine-readable JSON.\")\n .description(\"Show the context CodeBuddy would assemble before editing the given files.\")\n .action(\n async (\n taskParts: string[],\n opts: { paths?: string; plan?: string; git?: boolean; json?: boolean },\n ) => {\n await runSafely(async () => {\n const result = await runBeforeEdit(taskParts, opts);\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n printBeforeEdit(result);\n });\n },\n );\n\n context\n .command(\"explain\")\n .argument(\"[task...]\", \"The task you are about to work on.\")\n .option(\"--paths <paths>\", \"Comma-separated repo-relative paths to target.\")\n .option(\"--plan <id>\", \"Resolve target files from a CodeBuddy plan.\")\n .option(\"--git\", \"Resolve target files from current git changes.\")\n .description(\"Explain why each piece of before-edit context was included.\")\n .action(async (taskParts: string[], opts: { paths?: string; plan?: string; git?: boolean }) => {\n await runSafely(async () => {\n const result = await runBeforeEdit(taskParts, opts);\n console.log(pc.bold(`context for ${result.targetPaths.length} target path(s):`));\n for (const line of result.explain) console.log(` ${pc.dim(\"•\")} ${line}`);\n });\n });\n}\n\nasync function runBeforeEdit(\n taskParts: string[],\n opts: { paths?: string; plan?: string; git?: boolean },\n): Promise<BeforeEditContext> {\n const [namespace, tokenBudget] = await Promise.all([\n resolveNamespaceFrom(),\n resolveTokenBudget(),\n ]);\n const task = taskParts.join(\" \").trim();\n // Same recall as the prompt hook: dense evidence and the configured reranker.\n const semantics = task ? await openHookSemantics(process.cwd()) : null;\n try {\n return await buildBeforeEditContext({\n namespace,\n ...(task ? { task } : {}),\n ...(semantics?.semanticRanker ? { semanticRanker: semantics.semanticRanker } : {}),\n ...(semantics?.reranker ? { reranker: semantics.reranker } : {}),\n ...(opts.paths ? { paths: parsePaths(opts.paths) } : {}),\n ...(opts.plan ? { planId: opts.plan } : {}),\n ...(opts.git !== undefined ? { useGit: opts.git } : {}),\n ...(tokenBudget !== undefined ? { tokenBudget } : {}),\n });\n } finally {\n await semantics?.close();\n }\n}\n\nfunction printBootstrap(ctx: BootstrapContext): void {\n console.log(`${pc.bold(\"project\")} ${ctx.project.namespace} ${pc.dim(ctx.project.root)}`);\n console.log(\n `${pc.bold(\"plan\")} ${ctx.plan ? `${ctx.plan.title} (${ctx.plan.status})` : pc.dim(\"none\")} ${pc.dim(`policy=${ctx.policy}`)}`,\n );\n if (ctx.policyRules.length > 0) {\n console.log(pc.bold(\"policy rules:\"));\n for (const rule of ctx.policyRules) {\n console.log(` ${rule.id} (${rule.weight}) ${pc.dim(rule.pattern)}`);\n }\n }\n if (ctx.incidents.length > 0) {\n console.log(pc.bold(\"incident hotspots:\"));\n for (const incident of ctx.incidents) {\n console.log(\n ` ${severityColor(incident.severity)} ${incident.subject} ${pc.dim(incident.summary)}`,\n );\n }\n }\n printMemory(ctx);\n console.log(\n `${pc.bold(\"architecture\")} ${ctx.architecture.moduleCount} modules, ${ctx.architecture.edgeCount} edges`,\n );\n for (const hotspot of ctx.architecture.hotspots) {\n console.log(` ${hotspot.path} ${pc.dim(`in=${hotspot.inbound} out=${hotspot.outbound}`)}`);\n }\n printTokens(ctx);\n}\n\nfunction printBeforeEdit(ctx: BeforeEditContext): void {\n console.log(\n `${pc.bold(\"targets\")} ${ctx.targetPaths.length} path(s) ${pc.dim(`(source: ${ctx.pathSource})`)}`,\n );\n for (const path of ctx.targetPaths) console.log(` ${path}`);\n if (ctx.plan) console.log(`${pc.bold(\"plan\")} ${ctx.plan.title} (${ctx.plan.status})`);\n if (ctx.policyRules.length > 0) {\n console.log(pc.bold(\"matching policy rules:\"));\n for (const rule of ctx.policyRules) console.log(` ${rule.id} ${pc.dim(rule.pattern)}`);\n }\n if (ctx.incidents.length > 0) {\n console.log(pc.bold(\"incidents on target paths:\"));\n for (const incident of ctx.incidents) {\n console.log(` ${severityColor(incident.severity)} ${incident.subject}`);\n }\n }\n printMemory(ctx);\n if (ctx.risks.items.length > 0) {\n console.log(pc.bold(\"risk:\"));\n for (const item of ctx.risks.items) {\n console.log(` ${item.path} ${scoreColor(item.score)} ${pc.dim(item.reason)}`);\n }\n }\n if (ctx.neighbours.length > 0) {\n console.log(pc.bold(\"import neighbours:\"));\n for (const neighbour of ctx.neighbours) {\n console.log(\n ` ${neighbour.path} ${pc.dim(`→${neighbour.dependsOn.length} ←${neighbour.dependedOnBy.length}`)}`,\n );\n }\n }\n if (ctx.symbols.length > 0) {\n console.log(pc.bold(\"symbols (signatures, in place of full source):\"));\n for (const file of ctx.symbols) {\n console.log(` ${file.path} ${pc.dim(`${file.signatures.length} symbol(s)`)}`);\n }\n }\n if (ctx.diffs.length > 0) {\n console.log(pc.bold(\"changed hunks:\"));\n for (const diff of ctx.diffs) {\n console.log(` ${diff.path}${diff.truncated ? pc.dim(\" (truncated)\") : \"\"}`);\n for (const line of diff.patch.split(\"\\n\").slice(-8)) console.log(pc.dim(` ${line}`));\n }\n }\n printTokens(ctx);\n}\n\n/** Durable facts and worklog handoffs: the same memory the MCP tools return. */\nfunction printMemory(ctx: BootstrapContext | BeforeEditContext): void {\n if (ctx.facts.length > 0) {\n console.log(pc.bold(\"facts:\"));\n for (const fact of ctx.facts) {\n console.log(` ${fact.summary} ${pc.dim(`(${fact.confidence.toFixed(2)}, ${fact.reason})`)}`);\n }\n }\n if (ctx.handoffs.length > 0) {\n console.log(pc.bold(\"prior work:\"));\n for (const handoff of ctx.handoffs) {\n const drift =\n handoff.changedSince.length > 0\n ? `, ${handoff.changedSince.length} file(s) changed since`\n : \"\";\n console.log(\n ` ${handoff.summary.replace(/\\s+/g, \" \").slice(0, 160)} ${pc.dim(`(${handoff.ageDays}d ago${drift})`)}`,\n );\n }\n }\n}\n\nfunction printTokens(ctx: BootstrapContext | BeforeEditContext): void {\n const { returnedEstimate, budget } = ctx.tokens;\n console.log(pc.dim(`\\n~${returnedEstimate} tokens returned (budget ${budget})`));\n}\n\nfunction severityColor(severity: string): string {\n if (severity === \"critical\") return pc.red(severity);\n if (severity === \"high\") return pc.red(severity);\n if (severity === \"medium\") return pc.yellow(severity);\n return pc.dim(severity);\n}\n\nfunction scoreColor(score: number): string {\n if (score >= 75) return pc.red(String(score));\n if (score >= 50) return pc.yellow(String(score));\n return pc.green(String(score));\n}\n","import { spawn } from \"node:child_process\";\nimport type { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { startDashboard } from \"../../dashboard/server.js\";\nimport { readTraces, tracePath } from \"../../tracing/log.js\";\n\n/** Open a URL in the default browser; best-effort, the URL is printed either way. */\nfunction openBrowser(url: string): void {\n const [command, args] =\n process.platform === \"darwin\"\n ? [\"open\", [url]]\n : process.platform === \"win32\"\n ? [\"cmd\", [\"/c\", \"start\", \"\", url]]\n : [\"xdg-open\", [url]];\n try {\n spawn(command, args, { detached: true, stdio: \"ignore\" })\n .on(\"error\", () => undefined)\n .unref();\n } catch {\n // No browser launcher: the printed URL still works.\n }\n}\n\nexport function registerDashboardCommand(\n program: Command,\n runSafely: (fn: () => Promise<void>) => Promise<void>,\n): void {\n program\n .command(\"dashboard\")\n .description(\"Open a live local page of prompts recalled, MCP tool calls, tokens and latency.\")\n .option(\n \"--port <port>\",\n \"Port on 127.0.0.1 (the next free one is used if taken).\",\n Number,\n 4777,\n )\n .option(\"--no-open\", \"Print the URL without opening a browser.\")\n .action(async (opts: { port: number; open: boolean }) => {\n await runSafely(async () => {\n const root = process.cwd();\n const dashboard = await startDashboard({ repositoryRoot: root, port: opts.port });\n const recorded = (await readTraces(root)).length;\n console.log(`${pc.green(\"●\")} CodeBuddy dashboard ${pc.bold(dashboard.url)}`);\n console.log(\n pc.dim(\n recorded > 0\n ? ` ${recorded} event(s) in ${tracePath(root)}; new ones appear live.`\n : \" No traces yet: they appear as your agent uses CodeBuddy (hooks or MCP tools).\",\n ),\n );\n console.log(pc.dim(\" Ctrl+C to stop.\"));\n if (opts.open) openBrowser(dashboard.url);\n await new Promise<void>((resolve) => {\n const stop = () => void dashboard.close().then(resolve);\n process.once(\"SIGINT\", stop);\n process.once(\"SIGTERM\", stop);\n });\n });\n });\n}\n","import { unwatchFile, watchFile } from \"node:fs\";\nimport { open, stat } from \"node:fs/promises\";\nimport { createServer, type ServerResponse } from \"node:http\";\nimport type { AddressInfo } from \"node:net\";\nimport { basename } from \"node:path\";\nimport { parseTraceLines, readTraces, tracePath } from \"../tracing/log.js\";\nimport { DASHBOARD_HTML } from \"./page.js\";\n\n/**\n * `codebuddy dashboard`: a read-only page on 127.0.0.1 that shows the\n * project's usage traces and updates itself. `/api/traces` serves the latest\n * events; `/events` streams new ones (Server-Sent Events) as hooks and MCP\n * tools append them to `.codebuddy/cache/traces.jsonl`.\n */\n\nexport type DashboardHandle = { url: string; close(): Promise<void> };\n\nexport async function startDashboard(options: {\n repositoryRoot: string;\n port?: number;\n /** How often the trace file is checked for new lines. */\n pollMs?: number;\n}): Promise<DashboardHandle> {\n const { repositoryRoot } = options;\n const path = tracePath(repositoryRoot);\n const clients = new Set<ServerResponse>();\n let offset = (await stat(path).catch(() => null))?.size ?? 0;\n let reading = false;\n\n // Send only the bytes appended since the last check; a shrink (rotation) means start over.\n const onChange = async () => {\n if (reading) return;\n reading = true;\n try {\n const size = (await stat(path).catch(() => null))?.size ?? 0;\n if (size < offset) {\n offset = 0;\n broadcast(\"reset\", \"{}\");\n }\n if (size > offset) {\n const handle = await open(path, \"r\");\n try {\n const buffer = Buffer.alloc(size - offset);\n await handle.read(buffer, 0, buffer.length, offset);\n const text = buffer.toString(\"utf8\");\n // Keep a trailing partial line for the next round.\n const complete = text.slice(0, text.lastIndexOf(\"\\n\") + 1);\n offset += Buffer.byteLength(complete);\n for (const event of parseTraceLines(complete)) broadcast(\"trace\", JSON.stringify(event));\n } finally {\n await handle.close();\n }\n }\n } finally {\n reading = false;\n }\n };\n const broadcast = (event: string, data: string) => {\n for (const client of clients) client.write(`event: ${event}\\ndata: ${data}\\n\\n`);\n };\n watchFile(path, { interval: options.pollMs ?? 1_000 }, () => void onChange());\n\n let boundPort = 0;\n const server = createServer(async (request, response) => {\n // DNS rebinding: a web page can point its own name at 127.0.0.1 and read\n // this server same-origin. Only our own host names are answered.\n const host = request.headers.host ?? \"\";\n if (host !== `127.0.0.1:${boundPort}` && host !== `localhost:${boundPort}`) {\n response.writeHead(403, { \"content-type\": \"text/plain\" }).end(\"Forbidden host\");\n return;\n }\n const url = new URL(request.url ?? \"/\", \"http://localhost\");\n if (request.method !== \"GET\") {\n response.writeHead(405).end();\n return;\n }\n if (url.pathname === \"/\") {\n response.writeHead(200, {\n \"content-type\": \"text/html; charset=utf-8\",\n \"cache-control\": \"no-store\",\n });\n response.end(DASHBOARD_HTML);\n return;\n }\n if (url.pathname === \"/api/traces\") {\n const limit = Math.min(10_000, Math.max(1, Number(url.searchParams.get(\"limit\")) || 2_000));\n response.writeHead(200, { \"content-type\": \"application/json\", \"cache-control\": \"no-store\" });\n response.end(\n JSON.stringify({\n project: basename(repositoryRoot),\n path,\n events: await readTraces(repositoryRoot, limit),\n }),\n );\n return;\n }\n if (url.pathname === \"/events\") {\n response.writeHead(200, {\n \"content-type\": \"text/event-stream\",\n \"cache-control\": \"no-store\",\n connection: \"keep-alive\",\n });\n response.write(\": connected\\n\\n\");\n clients.add(response);\n request.on(\"close\", () => clients.delete(response));\n return;\n }\n response.writeHead(404, { \"content-type\": \"text/plain\" }).end(\"Not found\");\n });\n\n const port = await listen(server, options.port ?? 4777);\n boundPort = port;\n // Keep idle SSE connections from timing out.\n const heartbeat = setInterval(() => {\n for (const client of clients) client.write(\": ping\\n\\n\");\n }, 25_000);\n heartbeat.unref();\n\n return {\n url: `http://127.0.0.1:${port}/`,\n close: () =>\n new Promise((resolve) => {\n clearInterval(heartbeat);\n unwatchFile(path);\n for (const client of clients) client.end();\n server.closeAllConnections();\n server.close(() => resolve());\n }),\n };\n}\n\n/** Bind to 127.0.0.1 only; if the port is taken, try the next nine. Port 0 = any free port. */\nasync function listen(server: ReturnType<typeof createServer>, port: number): Promise<number> {\n for (let attempt = 0; attempt < 10; attempt += 1) {\n const candidate = port === 0 ? 0 : port + attempt;\n try {\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(candidate, \"127.0.0.1\", () => {\n server.off(\"error\", reject);\n resolve();\n });\n });\n return (server.address() as AddressInfo).port;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EADDRINUSE\" || port === 0) throw error;\n }\n }\n throw new Error(`Ports ${port}-${port + 9} are in use; pass --port.`);\n}\n","/**\n * The dashboard page: self-contained (no CDN, works offline), reads\n * `/api/traces` once and then follows `/events`. Teal = prompt recall,\n * orange = MCP tool calls, in both themes. Every value shown is escaped.\n */\nexport const DASHBOARD_HTML = `<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>CodeBuddy Traces</title>\n<style>\n:root {\n --bg: #f3f5f7; --panel: #ffffff; --fg: #141a21; --muted: #5d6874; --line: #dde3e8;\n --recall: #0a8f80; --tool: #c2410c; --recall-soft: #e0f2ef; --tool-soft: #fbeae2;\n --bad: #b42318; --bad-soft: #fdecea; --capture: #4b5563;\n --sans: ui-sans-serif, -apple-system, \"Segoe UI\", Roboto, sans-serif;\n --mono: ui-monospace, \"SF Mono\", Menlo, Consolas, monospace;\n}\n@media (prefers-color-scheme: dark) { :root {\n --bg: #0e1116; --panel: #161b22; --fg: #e6eaee; --muted: #94a0ad; --line: #28303a;\n --recall: #0d9488; --tool: #ea580c; --recall-soft: #10302c; --tool-soft: #3a1e12;\n --bad: #f97066; --bad-soft: #3b1715; --capture: #9aa4ae; color-scheme: dark } }\n* { box-sizing: border-box; }\nbody { margin: 0; background: var(--bg); color: var(--fg); font: 14px/1.5 var(--sans); }\n.wrap { max-width: 1280px; margin: 0 auto; padding: 20px 20px 48px; display: grid; gap: 16px; }\nheader { display: flex; flex-wrap: wrap; align-items: center; gap: 12px 20px; }\nh1 { font-size: 18px; margin: 0; letter-spacing: -.01em; }\nh1 small { font: 500 13px var(--mono); color: var(--muted); margin-left: 8px; }\nh2 { font-size: 13px; margin: 0 0 10px; text-transform: uppercase; letter-spacing: .08em; color: var(--muted); font-weight: 600; }\n.live { display: inline-flex; align-items: center; gap: 6px; font: 12px var(--mono); color: var(--muted); }\n.dot { width: 8px; height: 8px; border-radius: 50%; background: var(--muted); }\n.live.on .dot { background: var(--recall); box-shadow: 0 0 0 3px var(--recall-soft); }\n.spacer { flex: 1; }\n.seg { display: inline-flex; border: 1px solid var(--line); border-radius: 8px; overflow: hidden; background: var(--panel); }\n.seg button { border: 0; background: none; color: var(--muted); font: 500 12px var(--sans); padding: 6px 12px; cursor: pointer; }\n.seg button + button { border-left: 1px solid var(--line); }\n.seg button[aria-pressed=\"true\"] { background: var(--fg); color: var(--bg); }\n.seg button:focus-visible { outline: 2px solid var(--recall); outline-offset: -2px; }\n.wrap > * { min-width: 0; }\n.kpis { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 12px; }\n.kpi { background: var(--panel); border: 1px solid var(--line); border-radius: 10px; padding: 12px 14px; }\n.kpi .label { font-size: 12px; color: var(--muted); }\n.kpi .value { font: 600 24px/1.2 var(--mono); font-variant-numeric: tabular-nums; margin-top: 4px; }\n.kpi .sub { font-size: 12px; color: var(--muted); margin-top: 2px; }\n.panel { background: var(--panel); border: 1px solid var(--line); border-radius: 10px; padding: 14px 16px; min-width: 0; }\n.cols { display: grid; grid-template-columns: minmax(0, 1.25fr) minmax(0, 1fr); gap: 16px; }\n@media (max-width: 900px) { .cols { grid-template-columns: 1fr; } }\n.legend { display: flex; gap: 16px; font-size: 12px; color: var(--muted); margin-bottom: 6px; }\n.sw { display: inline-block; width: 10px; height: 10px; border-radius: 2px; margin-right: 6px; vertical-align: -1px; }\nsvg text { fill: var(--muted); font: 11px var(--mono); }\n.scroll { overflow-x: auto; }\ntable { width: 100%; border-collapse: collapse; font-size: 13px; }\nth { text-align: left; font: 600 11px var(--sans); text-transform: uppercase; letter-spacing: .06em; color: var(--muted); padding: 6px 8px; border-bottom: 1px solid var(--line); white-space: nowrap; }\ntd { padding: 7px 8px; border-bottom: 1px solid var(--line); vertical-align: top; }\ntr:last-child td { border-bottom: 0; }\ntd.n { font-family: var(--mono); font-variant-numeric: tabular-nums; text-align: right; white-space: nowrap; }\nth.n { text-align: right; }\n.chip { display: inline-block; font: 600 10px var(--mono); text-transform: uppercase; letter-spacing: .06em; padding: 2px 6px; border-radius: 4px; }\n.chip.recall { background: var(--recall-soft); color: var(--recall); }\n.chip.tool { background: var(--tool-soft); color: var(--tool); }\n.chip.capture, .chip.sync, .chip.guard, .chip.kw { background: var(--line); color: var(--capture); }\n.chip.err { background: var(--bad-soft); color: var(--bad); }\n.feed { display: grid; gap: 10px; max-height: 520px; overflow: auto; }\n.prompt { border: 1px solid var(--line); border-radius: 8px; padding: 10px 12px; }\n.prompt .q { font-weight: 500; overflow-wrap: anywhere; }\n.prompt .meta { font: 12px var(--mono); color: var(--muted); margin-top: 4px; display: flex; flex-wrap: wrap; gap: 4px 12px; overflow-wrap: anywhere; }\n.prompt ul { margin: 6px 0 0; padding-left: 18px; font-size: 13px; }\n.prompt details { margin-top: 6px; font-size: 12px; }\n.prompt summary { cursor: pointer; color: var(--muted); }\n.prompt pre { margin: 6px 0 0; padding: 8px 10px; background: var(--bg); border: 1px solid var(--line); border-radius: 6px; font: 12px/1.45 var(--mono); white-space: pre-wrap; overflow-wrap: anywhere; max-height: 260px; overflow: auto; }\n.prompt .none { font-size: 13px; color: var(--muted); margin-top: 6px; }\n.mono { font-family: var(--mono); }\n.muted { color: var(--muted); }\n.empty { padding: 40px 16px; text-align: center; color: var(--muted); }\n.empty code { font-family: var(--mono); background: var(--line); padding: 2px 6px; border-radius: 4px; color: var(--fg); }\n.log { max-height: 420px; overflow: auto; }\n@media (prefers-reduced-motion: no-preference) { tr.fresh td { animation: flash 1.2s ease-out; } }\n@keyframes flash { from { background: var(--recall-soft); } to { background: transparent; } }\n</style>\n</head>\n<body>\n<div class=\"wrap\">\n <header>\n <h1>CodeBuddy traces<small id=\"project\"></small></h1>\n <span class=\"live\" id=\"live\"><span class=\"dot\"></span><span id=\"liveText\">connecting</span></span>\n <span class=\"spacer\"></span>\n <div class=\"seg\" role=\"group\" aria-label=\"Time range\" id=\"range\">\n <button data-range=\"3600000\">1 hour</button>\n <button data-range=\"86400000\" aria-pressed=\"true\">24 hours</button>\n <button data-range=\"604800000\">7 days</button>\n <button data-range=\"0\">All</button>\n </div>\n </header>\n\n <section class=\"kpis\" id=\"kpis\" aria-label=\"Summary\"></section>\n\n <section class=\"panel\">\n <h2>Tokens delivered to the agent</h2>\n <div class=\"legend\"><span><span class=\"sw\" style=\"background:var(--recall)\"></span>prompt recall (hook)</span><span><span class=\"sw\" style=\"background:var(--tool)\"></span>MCP tool results</span></div>\n <div class=\"scroll\" id=\"chart\"></div>\n </section>\n\n <div class=\"cols\">\n <section class=\"panel\">\n <h2>Recent prompts and what was recalled</h2>\n <div class=\"feed\" id=\"feed\"></div>\n </section>\n <section class=\"panel\">\n <h2>MCP tools</h2>\n <div class=\"scroll\" id=\"tools\"></div>\n </section>\n </div>\n\n <section class=\"panel\">\n <h2>Activity</h2>\n <div class=\"log scroll\" id=\"log\"></div>\n </section>\n <p class=\"muted\" style=\"margin:0;font-size:12px;overflow-wrap:anywhere\">Token counts are cl100k estimates of the text exchanged. Traces stay on this machine in <span class=\"mono\" id=\"path\"></span>. Turn them off with <span class=\"mono\">CODEBUDDY_TRACE=0</span>.</p>\n</div>\n<script>\n(function () {\n var events = [];\n var range = 86400000;\n var fresh = new Set();\n var pending = false;\n\n function esc(value) {\n return String(value == null ? \"\" : value).replace(/[&<>\"']/g, function (c) {\n return { \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\", \"'\": \"&#39;\" }[c];\n });\n }\n function num(n) { return Math.round(n).toLocaleString(); }\n function compact(n) { return n >= 1e6 ? (n / 1e6).toFixed(1) + \"M\" : n >= 1e4 ? (n / 1e3).toFixed(1) + \"k\" : num(n); }\n function pct(sorted, p) { if (!sorted.length) return 0; return sorted[Math.min(sorted.length - 1, Math.floor(p * sorted.length))]; }\n function ms(n) { return n >= 1000 ? (n / 1000).toFixed(1) + \" s\" : Math.round(n) + \" ms\"; }\n function ago(ts) {\n var s = Math.max(0, (Date.now() - Date.parse(ts)) / 1000);\n return s < 60 ? Math.floor(s) + \"s ago\" : s < 3600 ? Math.floor(s / 60) + \"m ago\" : s < 86400 ? Math.floor(s / 3600) + \"h ago\" : Math.floor(s / 86400) + \"d ago\";\n }\n function visible() {\n if (!range) return events;\n var since = Date.now() - range;\n return events.filter(function (e) { return Date.parse(e.ts) >= since; });\n }\n\n function kpis(list) {\n var recalls = list.filter(function (e) { return e.kind === \"recall\"; });\n var tools = list.filter(function (e) { return e.kind === \"tool\"; });\n var injected = recalls.reduce(function (s, e) { return s + (e.tokensOut || 0); }, 0);\n var returned = tools.reduce(function (s, e) { return s + (e.tokensOut || 0); }, 0);\n var guards = list.filter(function (e) { return e.kind === \"guard\"; });\n var avoided = guards.reduce(function (s, e) { return s + ((e.detail && e.detail.avoided) || 0); }, 0);\n var withFacts = recalls.filter(function (e) { return e.detail && e.detail.facts && e.detail.facts.length; });\n var factCount = withFacts.reduce(function (s, e) { return s + e.detail.facts.length; }, 0);\n var dense = recalls.reduce(function (s, e) { return s + ((e.detail && e.detail.dense) || 0); }, 0);\n var lat = recalls.map(function (e) { return e.ms; }).sort(function (a, b) { return a - b; });\n var errors = list.filter(function (e) { return !e.ok; }).length;\n var captures = list.filter(function (e) { return e.kind === \"capture\"; });\n var saved = captures.reduce(function (s, e) { return s + ((e.detail && e.detail.saved) || 0); }, 0);\n var tiles = [\n [\"Prompts recalled\", num(recalls.length), recalls.length ? Math.round(100 * withFacts.length / recalls.length) + \"% got facts\" : \"no prompts yet\"],\n [\"Facts injected\", num(factCount), factCount ? Math.round(100 * dense / factCount) + \"% matched by meaning\" : \"-\"],\n [\"Tokens added to context\", compact(injected + returned), compact(injected) + \" by hooks, \" + compact(returned) + \" by MCP tools\"],\n [\"Tokens kept out (measured)\", compact(avoided), guards.length ? guards.length + \" large read\" + (guards.length === 1 ? \"\" : \"s\") + \" replaced by an outline\" : \"no large reads blocked\"],\n [\"MCP tool calls\", num(tools.length), tools.length ? new Set(tools.map(function (e) { return e.name; })).size + \" distinct tools\" : \"-\"],\n [\"Recall latency\", lat.length ? ms(pct(lat, 0.5)) : \"-\", lat.length ? \"p95 \" + ms(pct(lat, 0.95)) : \"-\"],\n [\"Memories saved\", num(saved), captures.length + \" capture\" + (captures.length === 1 ? \"\" : \"s\")],\n [\"Errors\", num(errors), errors ? \"see Activity\" : \"all good\"],\n ];\n document.getElementById(\"kpis\").innerHTML = tiles.map(function (t) {\n return '<div class=\"kpi\"><div class=\"label\">' + esc(t[0]) + '</div><div class=\"value\">' + esc(t[1]) + '</div><div class=\"sub\">' + esc(t[2]) + \"</div></div>\";\n }).join(\"\");\n }\n\n function chart(list) {\n var el = document.getElementById(\"chart\");\n var points = list.filter(function (e) { return (e.kind === \"recall\" || e.kind === \"tool\") && e.tokensOut; });\n if (!points.length) { el.innerHTML = '<div class=\"empty\">No tokens delivered in this range yet.</div>'; return; }\n var end = Date.now();\n // Zoom to the data: a few minutes of traces should not be one sliver of a 24-hour axis.\n var first = Date.parse(points[0].ts);\n var start = Math.max(range ? end - range : first, first - 60000);\n var buckets = 48, size = Math.max(10000, (end - start) / buckets);\n buckets = Math.ceil((end - start) / size);\n var rows = [];\n for (var i = 0; i < buckets; i++) rows.push({ recall: 0, tool: 0, n: 0 });\n points.forEach(function (e) {\n var i = Math.min(buckets - 1, Math.max(0, Math.floor((Date.parse(e.ts) - start) / size)));\n rows[i][e.kind] += e.tokensOut; rows[i].n += 1;\n });\n var max = Math.max.apply(null, rows.map(function (r) { return r.recall + r.tool; })) || 1;\n var W = 960, H = 200, L = 52, B = 22, T = 8, plotW = W - L - 8, plotH = H - B - T;\n var bw = plotW / buckets;\n var step = Math.pow(10, Math.floor(Math.log10(max)));\n var tick = max / step > 5 ? step * 2 : step;\n var svg = '<svg viewBox=\"0 0 ' + W + \" \" + H + '\" style=\"width:100%;min-width:560px;height:auto\" role=\"img\" aria-label=\"Tokens delivered over time\">';\n for (var v = 0; v <= max; v += tick) {\n var y = T + plotH - (v / max) * plotH;\n svg += '<line x1=\"' + L + '\" x2=\"' + (W - 8) + '\" y1=\"' + y + '\" y2=\"' + y + '\" stroke=\"var(--line)\"/><text x=\"' + (L - 6) + '\" y=\"' + (y + 4) + '\" text-anchor=\"end\">' + compact(v) + \"</text>\";\n }\n rows.forEach(function (r, i) {\n var x = L + i * bw + 1, w = Math.max(1, bw - 2);\n var hr = (r.recall / max) * plotH, ht = (r.tool / max) * plotH;\n var when = new Date(start + i * size);\n var label = when.toLocaleString() + \": \" + num(r.recall) + \" recall + \" + num(r.tool) + \" tool tokens (\" + r.n + \" events)\";\n if (r.recall) svg += '<rect x=\"' + x + '\" y=\"' + (T + plotH - hr) + '\" width=\"' + w + '\" height=\"' + hr + '\" rx=\"2\" fill=\"var(--recall)\"><title>' + esc(label) + \"</title></rect>\";\n if (r.tool) svg += '<rect x=\"' + x + '\" y=\"' + (T + plotH - hr - ht - (r.recall ? 2 : 0)) + '\" width=\"' + w + '\" height=\"' + ht + '\" rx=\"2\" fill=\"var(--tool)\"><title>' + esc(label) + \"</title></rect>\";\n });\n [0, Math.floor(buckets / 2), buckets - 1].forEach(function (i) {\n var d = new Date(start + i * size);\n var text = end - start <= 86400000 ? d.toLocaleTimeString([], { hour: \"2-digit\", minute: \"2-digit\" }) : d.toLocaleDateString([], { month: \"short\", day: \"numeric\" });\n svg += '<text x=\"' + (L + i * bw + bw / 2) + '\" y=\"' + (H - 6) + '\" text-anchor=\"middle\">' + esc(text) + \"</text>\";\n });\n el.innerHTML = svg + \"</svg>\";\n }\n\n function feed(list) {\n var recalls = list.filter(function (e) { return e.kind === \"recall\"; }).slice(-30).reverse();\n var el = document.getElementById(\"feed\");\n if (!recalls.length) {\n el.innerHTML = '<div class=\"empty\">No prompts yet. Run <code>codebuddy hooks install</code>, restart your agent, and send a prompt.</div>';\n return;\n }\n el.innerHTML = recalls.map(function (e) {\n var d = e.detail || {};\n var facts = d.facts || [];\n return '<div class=\"prompt\"><div class=\"q\">' + (esc(d.prompt) || '<span class=\"muted\">(no prompt text)</span>') + '</div>' +\n '<div class=\"meta\"><span>' + ago(e.ts) + \"</span><span>\" + ms(e.ms) + \"</span><span>≈\" + num(e.tokensOut || 0) + \" tokens injected</span>\" +\n (d.dense ? '<span class=\"chip recall\">' + d.dense + \" by meaning</span>\" : \"\") +\n (d.lexical ? '<span class=\"chip kw\">' + d.lexical + \" by keyword</span>\" : \"\") +\n (e.ok ? \"\" : '<span class=\"chip err\">' + esc(d.dropped || \"dropped\") + \"</span>\") + \"</div>\" +\n (facts.length ? \"<ul>\" + facts.map(function (f) { return \"<li>\" + esc(f) + \"</li>\"; }).join(\"\") + \"</ul>\" : '<div class=\"none\">No new facts: nothing matched, or already sent this session.</div>') +\n (d.files && d.files.length ? '<div class=\"meta\">files: ' + d.files.map(esc).join(\", \") + \"</div>\" : \"\") +\n (d.block ? '<details><summary>What the agent received</summary><pre>' + esc(d.block) + \"</pre></details>\" : \"\") +\n \"</div>\";\n }).join(\"\");\n }\n\n function tools(list) {\n var by = {};\n list.filter(function (e) { return e.kind === \"tool\"; }).forEach(function (e) {\n var t = by[e.name] || (by[e.name] = { calls: 0, errors: 0, lat: [], out: 0 });\n t.calls++; if (!e.ok) t.errors++; t.lat.push(e.ms); t.out += e.tokensOut || 0;\n });\n var names = Object.keys(by).sort(function (a, b) { return by[b].calls - by[a].calls; });\n var el = document.getElementById(\"tools\");\n if (!names.length) { el.innerHTML = '<div class=\"empty\">No MCP tool calls in this range.</div>'; return; }\n el.innerHTML = '<table><thead><tr><th>Tool</th><th class=\"n\">Calls</th><th class=\"n\">p50</th><th class=\"n\">p95</th><th class=\"n\">Tokens out</th><th class=\"n\">Errors</th></tr></thead><tbody>' +\n names.map(function (n) {\n var t = by[n], lat = t.lat.sort(function (a, b) { return a - b; });\n return '<tr><td class=\"mono\">' + esc(n) + '</td><td class=\"n\">' + t.calls + '</td><td class=\"n\">' + ms(pct(lat, 0.5)) + '</td><td class=\"n\">' + ms(pct(lat, 0.95)) + '</td><td class=\"n\">' + compact(t.out) + '</td><td class=\"n\">' + (t.errors ? '<span class=\"chip err\">' + t.errors + \"</span>\" : \"0\") + \"</td></tr>\";\n }).join(\"\") + \"</tbody></table>\";\n }\n\n function summary(e) {\n var d = e.detail || {};\n if (e.kind === \"recall\") return (d.facts ? d.facts.length : 0) + \" fact(s), \" + (d.files ? d.files.length : 0) + \" file(s)\";\n if (e.kind === \"capture\") return (d.saved || 0) + \" saved, \" + (d.queued || 0) + \" queued, \" + (d.changedFiles || 0) + \" changed file(s)\";\n if (e.kind === \"guard\") return \"denied \" + (d.file || \"a large read\") + \", ≈\" + num(d.avoided || 0) + \" tokens kept out\";\n if (e.kind === \"sync\") return (d.imported || 0) + \" new, \" + (d.updated || 0) + \" updated\" + (d.reembedding ? \", \" + d.reembedding + \" re-embedding\" : \"\");\n return e.session ? \"session \" + e.session.slice(0, 12) : \"\";\n }\n\n function log(list) {\n var rows = list.slice(-200).reverse();\n var el = document.getElementById(\"log\");\n if (!rows.length) { el.innerHTML = '<div class=\"empty\">Nothing recorded in this range.</div>'; return; }\n el.innerHTML = '<table><thead><tr><th>When</th><th>Kind</th><th>Name</th><th>Details</th><th class=\"n\">Time</th><th class=\"n\">In</th><th class=\"n\">Out</th></tr></thead><tbody>' +\n rows.map(function (e) {\n var key = e.ts + e.name;\n return '<tr class=\"' + (fresh.has(key) ? \"fresh\" : \"\") + '\"><td class=\"mono muted\" title=\"' + esc(e.ts) + '\">' + ago(e.ts) + '</td><td><span class=\"chip ' + (e.ok ? esc(e.kind) : \"err\") + '\">' + esc(e.ok ? e.kind : e.kind + \" failed\") + '</span></td><td class=\"mono\">' + esc(e.name) + \"</td><td>\" + esc(summary(e)) + '</td><td class=\"n\">' + ms(e.ms) + '</td><td class=\"n\">' + num(e.tokensIn || 0) + '</td><td class=\"n\">' + num(e.tokensOut || 0) + \"</td></tr>\";\n }).join(\"\") + \"</tbody></table>\";\n fresh.clear();\n }\n\n function render() {\n pending = false;\n var list = visible();\n kpis(list); chart(list); feed(list); tools(list); log(list);\n }\n function schedule() { if (!pending) { pending = true; requestAnimationFrame(render); } }\n\n function load() {\n return fetch(\"/api/traces?limit=10000\").then(function (r) { return r.json(); }).then(function (data) {\n events = data.events || [];\n document.getElementById(\"project\").textContent = data.project || \"\";\n document.getElementById(\"path\").textContent = data.path || \"\";\n document.title = \"CodeBuddy Traces · \" + (data.project || \"\");\n schedule();\n });\n }\n\n document.getElementById(\"range\").addEventListener(\"click\", function (event) {\n var button = event.target.closest(\"button\");\n if (!button) return;\n range = Number(button.dataset.range);\n this.querySelectorAll(\"button\").forEach(function (b) { b.setAttribute(\"aria-pressed\", String(b === button)); });\n schedule();\n });\n\n function connect() {\n var live = document.getElementById(\"live\"), text = document.getElementById(\"liveText\");\n var source = new EventSource(\"/events\");\n source.onopen = function () { live.classList.add(\"on\"); text.textContent = \"live\"; };\n source.onerror = function () { live.classList.remove(\"on\"); text.textContent = \"reconnecting\"; };\n source.addEventListener(\"trace\", function (message) {\n var e = JSON.parse(message.data);\n events.push(e); fresh.add(e.ts + e.name);\n if (events.length > 10000) events = events.slice(-10000);\n schedule();\n });\n source.addEventListener(\"reset\", function () { load(); });\n }\n\n load().then(connect);\n // Relative times (\"2m ago\") keep moving even when nothing new arrives.\n setInterval(schedule, 30000);\n})();\n</script>\n</body>\n</html>`;\n","import type { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { runEvaluation } from \"../../eval/runner.js\";\nimport type { EvaluationResult } from \"../../eval/types.js\";\n\nexport function registerEvalCommand(\n program: Command,\n runSafely: (fn: () => Promise<void>) => Promise<void>,\n): void {\n program\n .command(\"eval\")\n .argument(\"[dataset]\", \"Evaluation dataset JSON path.\")\n .option(\"--json\", \"Print machine-readable JSON.\")\n .description(\"Run the committed change-readiness evaluation dataset.\")\n .action(async (dataset: string | undefined, opts: { json?: boolean }) => {\n await runSafely(async () => {\n const result = await runEvaluation(dataset ? { datasetPath: dataset } : {});\n if (opts.json) console.log(JSON.stringify(result, null, 2));\n else printEvaluation(result);\n if (!result.passed) process.exitCode = 1;\n });\n });\n}\n\nfunction printEvaluation(result: EvaluationResult): void {\n console.log(\n `${result.passed ? pc.green(\"passed\") : pc.red(\"failed\")} ${result.summary.passed}/${result.summary.total} evaluation cases`,\n );\n for (const item of result.cases) {\n console.log(` ${item.passed ? pc.green(\"✓\") : pc.red(\"×\")} ${item.id}`);\n if (!item.passed) for (const failure of item.failures) console.log(pc.dim(` ${failure}`));\n }\n console.log(pc.dim(`dataset: ${result.datasetPath}`));\n}\n","import { readFile } from \"node:fs/promises\";\nimport { dirname, isAbsolute, join, resolve } from \"node:path\";\nimport { buildChangeReport } from \"../change/engine.js\";\nimport type { EvaluationDataset, EvaluationResult } from \"./types.js\";\n\nexport type RunEvaluationInput = { datasetPath?: string; repositoryRoot?: string };\n\nexport async function runEvaluation(input: RunEvaluationInput = {}): Promise<EvaluationResult> {\n const datasetPath = resolve(\n input.datasetPath ?? join(process.cwd(), \"evals\", \"change-readiness.json\"),\n );\n const dataset = JSON.parse(await readFile(datasetPath, \"utf8\")) as EvaluationDataset;\n if (dataset.version !== 1 || !Array.isArray(dataset.cases)) {\n throw new Error(`Unsupported evaluation dataset: ${datasetPath}`);\n }\n\n const datasetDirectory = dirname(datasetPath);\n const results = await Promise.all(\n dataset.cases.map(async (evaluationCase) => {\n const fixtureRoot = isAbsolute(evaluationCase.fixture)\n ? evaluationCase.fixture\n : resolve(input.repositoryRoot ?? datasetDirectory, evaluationCase.fixture);\n const report = await buildChangeReport({\n repositoryRoot: fixtureRoot,\n namespace: `eval:${evaluationCase.id}`,\n paths: evaluationCase.paths,\n useGit: false,\n });\n const failures: string[] = [];\n if (report.status !== evaluationCase.expectedStatus) {\n failures.push(`status expected ${evaluationCase.expectedStatus}, got ${report.status}`);\n }\n if (\n evaluationCase.minimumRisk !== undefined &&\n report.risk.highestScore < evaluationCase.minimumRisk\n ) {\n failures.push(\n `risk expected >= ${evaluationCase.minimumRisk}, got ${report.risk.highestScore}`,\n );\n }\n const categories: string[] = [\n ...new Set(report.suggestions.map((suggestion) => suggestion.category)),\n ];\n for (const category of evaluationCase.requiredCategories ?? []) {\n if (!categories.includes(category)) failures.push(`missing category ${category}`);\n }\n return {\n id: evaluationCase.id,\n description: evaluationCase.description,\n passed: failures.length === 0,\n expectedStatus: evaluationCase.expectedStatus,\n actualStatus: report.status,\n highestRisk: report.risk.highestScore,\n categories,\n failures,\n };\n }),\n );\n const passed = results.filter((result) => result.passed).length;\n return {\n datasetPath,\n passed: passed === results.length,\n cases: results,\n summary: { total: results.length, passed, failed: results.length - passed },\n };\n}\n","import type { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { installGitHubWorkflow } from \"../../integrations/github.js\";\n\nexport function registerGitHubCommands(\n program: Command,\n runSafely: (fn: () => Promise<void>) => Promise<void>,\n): void {\n const github = program.command(\"github\").description(\"Install GitHub workflow integrations.\");\n github\n .command(\"install\")\n .option(\"--force\", \"Replace an existing CodeBuddy workflow.\")\n .description(\"Install the PR change-safety report workflow.\")\n .action(async (opts: { force?: boolean }) => {\n await runSafely(async () => {\n const result = await installGitHubWorkflow(process.cwd(), {\n ...(opts.force !== undefined ? { force: opts.force } : {}),\n });\n console.log(`${result.created ? \"installed\" : \"already present\"} ${pc.dim(result.path)}`);\n if (result.created) console.log(\"Commit this workflow to enable CodeBuddy PR reports.\");\n });\n });\n}\n","import { execFile, spawn } from \"node:child_process\";\nimport { relative } from \"node:path\";\nimport type { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport {\n CLIENT_ADAPTERS,\n type ClientId,\n parseClient,\n supportedModes,\n} from \"../../clients/adapters.js\";\nimport { setHooks } from \"../../clients/install.js\";\nimport { clientHooksInstalled } from \"../../hooks/install.js\";\nimport { runLeanHookCommand } from \"../../hooks/lean-command.js\";\nimport { runPreToolHookCommand } from \"../../hooks/pretool-command.js\";\nimport { hookRoot } from \"../../hooks/root.js\";\nimport {\n runCaptureHook,\n runContextHook,\n runResetHook,\n runStageHook,\n runSyncHook,\n} from \"../../hooks/runtime.js\";\nimport { failSoft, readHookInput, writeStdout } from \"../../hooks/stdio.js\";\nimport { flushTelemetry } from \"../../telemetry/telemetry.js\";\nimport { installWorkflowRules } from \"../../templates/install.js\";\nimport { VERSION } from \"../../version.js\";\n\n/**\n * `codebuddy hooks` makes recall and capture deterministic by wiring CodeBuddy\n * into a client's lifecycle hooks. The management commands (install/\n * uninstall/status) edit `.claude/settings.json` or write the managed OpenCode/Hermes\n * plugins, idempotently and visibly. The runtime commands\n * (context/stage/capture/reset) are what the hooks invoke — they read\n * the hook payload on stdin and are strictly fail-soft: a hook must never break\n * the user's turn, so they always exit 0.\n */\nexport function registerHooksCommands(\n program: Command,\n runSafely: (fn: () => Promise<void>) => Promise<void>,\n): void {\n const hooks = program\n .command(\"hooks\")\n .description(\"Enforce automatic recall/capture via client lifecycle hooks.\");\n\n hooks\n .command(\"install\")\n .option(\n \"--client <client>\",\n \"Client with a CodeBuddy hook adapter (claude, opencode, hermes).\",\n \"claude\",\n )\n .description(\n \"Add CodeBuddy's recall/capture hooks (.claude/settings.json, .opencode/plugins/codebuddy.js or .hermes/plugins/codebuddy/).\",\n )\n .action(async (opts: { client?: string }) => {\n await runSafely(async () => {\n const client = assertHookClient(opts.client);\n const step = await setHooks(process.cwd(), true, client);\n if (!step) return;\n const where = relative(process.cwd(), step.target) || step.target;\n const changed = step.action !== \"unchanged\";\n console.log(\n `${changed ? pc.green(\"installed\") : pc.dim(\"unchanged\")} CodeBuddy hooks in ${where}`,\n );\n // Install the workflow rules too, not only update existing ones: without\n // them the agent never learns to prefer CodeBuddy over reading files whole.\n await reconcileRules(client, \"hooks\", { create: true });\n warnIfHookCommandStale();\n // Index existing memory and download the local models now, not on the first prompt.\n syncInBackground(process.cwd(), true);\n console.log(\n pc.dim(\n ` prompt→recall · edit→stage · turn end→capture · compaction→reset. Restart ${CLIENT_ADAPTERS[client].name} to activate.`,\n ),\n );\n });\n });\n\n hooks\n .command(\"uninstall\")\n .option(\n \"--client <client>\",\n \"Client with a CodeBuddy hook adapter (claude, opencode, hermes).\",\n \"claude\",\n )\n .description(\"Remove CodeBuddy's hooks for a client (user hooks untouched).\")\n .action(async (opts: { client?: string }) => {\n await runSafely(async () => {\n const client = assertHookClient(opts.client);\n const changed = (await setHooks(process.cwd(), false, client))?.action === \"removed\";\n console.log(\n changed ? pc.yellow(\"removed CodeBuddy hooks\") : pc.dim(\"no CodeBuddy hooks found\"),\n );\n await reconcileRules(client, \"agent\");\n });\n });\n\n hooks\n .command(\"status\")\n .option(\n \"--client <client>\",\n \"Client with a CodeBuddy hook adapter (claude, opencode, hermes).\",\n \"claude\",\n )\n .description(\"Report whether CodeBuddy hooks are installed.\")\n .action(async (opts: { client?: string }) => {\n await runSafely(async () => {\n const installed = await clientHooksInstalled(process.cwd(), parseClient(opts.client));\n console.log(\n installed\n ? pc.green(\"CodeBuddy hooks: installed\")\n : pc.dim(\"CodeBuddy hooks: not installed\"),\n );\n });\n });\n\n // ── runtime commands invoked by the hooks (read stdin, fail-soft) ──\n\n hooks\n .command(\"context\")\n .description(\"[hook] Emit compact project context for injection at prompt submit.\")\n .action(async () => {\n await failSoft(async () => {\n const input = await readHookInput();\n await runContextHook(input, writeStdout);\n });\n });\n\n hooks\n .command(\"lean\")\n .description(\"[hook] Emit ranked file pointers (lean mode).\")\n .action(async () => {\n await runLeanHookCommand();\n });\n\n hooks\n .command(\"stage\")\n .description(\"[hook] Record the files an edit tool just changed.\")\n .action(async () => {\n await failSoft(async () => {\n const input = await readHookInput();\n await runStageHook(input);\n });\n });\n\n hooks\n .command(\"capture\")\n .description(\"[hook] Capture durable memory from the turn's change set.\")\n .action(async () => {\n await failSoft(async () => {\n const input = await readHookInput();\n const { changedFiles, result } = await runCaptureHook(input);\n if (result) {\n process.stderr.write(\n `codebuddy: captured from ${changedFiles.length} changed file(s) — ` +\n `${result.saved.length} saved, ${result.queuedForReview.length} queued\\n`,\n );\n if (result.saved.length > 0) syncInBackground(hookRoot(input.cwd));\n }\n // End of a turn: off the prompt path, and throttled to one batch per 10 minutes.\n await flushTelemetry(hookRoot(input.cwd));\n });\n });\n\n hooks\n .command(\"sync\")\n .description(\n \"[hook] Reindex Markdown memory into PostgreSQL and embed it locally (runs detached after capture).\",\n )\n .option(\"--respace\", \"Also re-embed vectors made by another embedding model.\")\n .action(async (opts: { respace?: boolean }) => {\n await failSoft(async () => {\n const result = await runSyncHook(process.cwd(), opts.respace ? { respace: true } : {});\n process.stderr.write(\n result\n ? `codebuddy: synced ${result.reindex.facts.imported} new / ${result.reindex.facts.updated} updated fact(s)` +\n `${result.reindex.reembedding ? `, ${result.reindex.reembedding} re-embedding` : \"\"}` +\n `${result.drained ? \"\" : \" (embeddings still pending)\"}\\n`\n : \"codebuddy: nothing to sync (no PostgreSQL configured, or another sync is running)\\n\",\n );\n });\n });\n\n hooks\n .command(\"pretool\")\n .description(\n \"[hook] Outline large unranged Reads and cap content Greps (never grants permission).\",\n )\n .action(async () => {\n await runPreToolHookCommand();\n });\n\n hooks\n .command(\"reset\")\n .description(\"[hook] Forget what context was sent this session (after compaction or /clear).\")\n .action(async () => {\n await failSoft(async () => {\n await runResetHook(await readHookInput(), writeStdout);\n });\n });\n}\n\nfunction assertHookClient(value: string | undefined): ClientId {\n const client = parseClient(value);\n const adapter = CLIENT_ADAPTERS[client];\n if (!supportedModes(adapter).includes(\"hooks\")) {\n throw new Error(\n `${adapter.name} has no CodeBuddy hook adapter: ${adapter.gap ?? \"unsupported\"}.`,\n );\n }\n return client;\n}\n\n/**\n * Keep an existing managed rules block in step with the hooks, so the model is\n * not also told to call context_pack/context_after_turn the hooks already run.\n */\nasync function reconcileRules(\n client: ClientId,\n mode: \"agent\" | \"hooks\",\n options: { create?: boolean } = {},\n): Promise<void> {\n const result = await installWorkflowRules({\n client,\n mode,\n ...(options.create ? {} : { onlyIfManaged: true }),\n });\n if (result.action !== \"unchanged\") {\n const where = relative(process.cwd(), result.path) || result.path;\n console.log(\n `${pc.cyan(result.action === \"created\" ? \"added\" : \"updated\")} ${where} workflow (${mode === \"hooks\" ? \"hook\" : \"agent\"}-driven mode)`,\n );\n }\n}\n\n/**\n * The hooks run whatever `codebuddy` is first on PATH. Say so when that is\n * missing (recall and capture would silently do nothing) or a different\n * version from the one installing the hooks.\n */\nfunction warnIfHookCommandStale(): void {\n execFile(\n \"codebuddy\",\n [\"--version\"],\n { timeout: 10_000, shell: process.platform === \"win32\" },\n (error, stdout) => {\n const found = stdout.trim();\n if (error || !found) {\n console.log(\n pc.yellow(\n \" ! `codebuddy` is not on PATH, so the hooks cannot run. Install it globally: npm i -g @orquentra/codebuddy\",\n ),\n );\n } else if (found !== VERSION) {\n console.log(\n pc.yellow(\n ` ! The hooks will run codebuddy ${found} from PATH, not ${VERSION}. Update it: npm i -g @orquentra/codebuddy@${VERSION}`,\n ),\n );\n }\n },\n );\n}\n\n/**\n * Run `codebuddy hooks sync` in the background: the turn (or install) never\n * waits for indexing or a model download. The same entry point and loader\n * flags as this process, so it works from `dist/` and under `tsx` alike.\n */\nexport function syncInBackground(cwd: string, respace = false): void {\n const entry = process.argv[1];\n if (!entry) return;\n try {\n spawn(\n process.execPath,\n [...process.execArgv, entry, \"hooks\", \"sync\", ...(respace ? [\"--respace\"] : [])],\n {\n cwd,\n detached: true,\n stdio: \"ignore\",\n },\n ).unref();\n } catch {\n // Best-effort: the next sync (or `codebuddy reindex`) catches up.\n }\n}\n\n/**\n * Runtime hook commands must never fail the user's turn. Swallow everything and\n * exit 0; surface problems on stderr only.\n */\n","import type { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { syncFileVectors } from \"../../context/file-vectors.js\";\nimport { loadRuntimeConfig } from \"../../core/config-file.js\";\nimport { indexRepository } from \"../../indexer/engine.js\";\nimport type { IndexResult } from \"../../indexer/types.js\";\nimport { watchRepository } from \"../../indexer/watch.js\";\nimport { summarizeAfterIndex } from \"./llm.js\";\n\n/** A first run on a large repository can take minutes; later runs embed only changed files. */\nconst VECTOR_BUDGET_MS = 10 * 60_000;\n\n/**\n * `index` and `watch` are file-based (they read the working tree and write a\n * cache manifest) and need no database connection.\n */\nexport function registerIndexCommands(\n program: Command,\n runSafely: (fn: () => Promise<void>) => Promise<void>,\n): void {\n program\n .command(\"index\")\n .option(\"--full\", \"Re-summarize every file, ignoring existing content hashes.\")\n .option(\"--json\", \"Print machine-readable JSON.\")\n .option(\"--no-vectors\", \"Skip embedding source files for task → file ordering.\")\n .description(\"Index the repository: content hashes and lightweight file summaries.\")\n .action(async (opts: { full?: boolean; json?: boolean; vectors: boolean }) => {\n await runSafely(async () => {\n const result = await indexRepository({ ...(opts.full ? { full: true } : {}) });\n // Only with the local embedder: a hosted one would bill every chunk.\n const local =\n opts.vectors &&\n (await loadRuntimeConfig(process.cwd(), { requireDatabase: false }).catch(() => null))\n ?.provider.type === \"local\";\n const vectors = local ? await syncFileVectors(process.cwd(), VECTOR_BUDGET_MS) : null;\n if (opts.json) {\n console.log(JSON.stringify({ ...result, ...(vectors ? { vectors } : {}) }, null, 2));\n return;\n }\n printResult(result);\n if (vectors) {\n console.log(\n pc.dim(\n ` file vectors: ${vectors.embedded} embedded, ${vectors.files} current` +\n (vectors.pending > 0 ? `, ${vectors.pending} left for the next run` : \"\"),\n ),\n );\n } else if (local) {\n console.log(pc.dim(\" file vectors: skipped (local embedding runtime not available)\"));\n }\n });\n });\n\n program\n .command(\"watch\")\n .option(\"--debounce <ms>\", \"Coalesce file-change bursts within this window.\", Number)\n .option(\"--no-llm\", \"Do not write BYOK model summaries after index passes.\")\n .description(\"Watch the repository and incrementally re-index on change (Ctrl+C to stop).\")\n .action(async (opts: { debounce?: number; llm: boolean }) => {\n await runSafely(async () => {\n const controller = new AbortController();\n const stop = () => controller.abort();\n process.once(\"SIGINT\", stop);\n process.once(\"SIGTERM\", stop);\n console.log(pc.dim(\"watching for changes… press Ctrl+C to stop\"));\n await watchRepository({\n ...(opts.debounce !== undefined ? { debounceMs: opts.debounce } : {}),\n signal: controller.signal,\n onIndex: (result) => {\n printResult(result, true);\n if (!opts.llm || result.added + result.changed === 0) return;\n // One summary batch per pass, after the index; never blocks indexing.\n void summarizeAfterIndex(process.cwd())\n .then((summary) => {\n if (summary && summary.summarized > 0)\n console.log(pc.dim(` llm: ${summary.summarized} file(s) summarized`));\n })\n .catch((error) => console.error(pc.red(`llm: ${(error as Error).message}`)));\n },\n onError: (error) => console.error(pc.red(error.message)),\n });\n console.log(pc.dim(\"stopped watching\"));\n });\n });\n}\n\nfunction printResult(result: IndexResult, compact = false): void {\n const summary = `${result.totalIndexed} indexed (${pc.green(`+${result.added}`)} ${pc.yellow(`~${result.changed}`)} ${pc.dim(`=${result.unchanged}`)} ${pc.red(`-${result.removed}`)}) in ${result.durationMs}ms`;\n console.log(compact ? pc.dim(summary) : summary);\n if (result.skipped > 0)\n console.log(pc.dim(` ${result.skipped} skipped (too large or unreadable)`));\n for (const error of result.errors) console.log(pc.red(` ${error.path}: ${error.error}`));\n}\n","import type { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { z } from \"zod\";\nimport { readConfigFile, setLlmEnabled } from \"../../core/config-file.js\";\nimport { loadFreshIndex } from \"../../indexer/engine.js\";\nimport { coolingDown, usageToday } from \"../../llm/budget.js\";\nimport { chatJson } from \"../../llm/client.js\";\nimport { resolveLlmConfig } from \"../../llm/config.js\";\nimport {\n loadLlmSummaries,\n type SummarizeResult,\n summarizeRepository,\n} from \"../../llm/summaries.js\";\n\n/**\n * Bring-your-own-key small-model layer (Groq / OpenRouter free tiers). Keys\n * are read from GROQ_API_KEY / OPENROUTER_API_KEY and never stored or printed.\n */\nconst KEY_ENV = { groq: \"GROQ_API_KEY\", openrouter: \"OPENROUTER_API_KEY\" } as const;\n/** Files summarized after each `watch` index pass: one request. */\nconst WATCH_BATCH = 8;\n\nexport type LlmStatusReport = {\n enabled: boolean;\n reason: string;\n provider: \"groq\" | \"openrouter\";\n model: string | null;\n keyEnv: string;\n keyPresent: boolean;\n features: { summaries: boolean; rerank: boolean; memory: boolean } | null;\n usageToday: number;\n dailyTokenBudget: number;\n cooldownMs: number;\n summaries: { covered: number; indexed: number };\n};\n\nexport async function llmStatusReport(\n root: string,\n env: NodeJS.ProcessEnv = process.env,\n): Promise<LlmStatusReport> {\n const block = (await readConfigFile(root)).llm;\n const provider = block?.provider ?? \"groq\";\n const config = await resolveLlmConfig(root, env);\n const model = config.enabled ? config.model : (block?.model ?? null);\n const key = `${provider}:${model}`;\n const { manifest } = await loadFreshIndex(root);\n return {\n enabled: config.enabled,\n reason: config.enabled ? \"on\" : config.reason,\n provider,\n model,\n keyEnv: env.CODEBUDDY_LLM_API_KEY ? \"CODEBUDDY_LLM_API_KEY\" : KEY_ENV[provider],\n keyPresent: Boolean(env.CODEBUDDY_LLM_API_KEY || env[KEY_ENV[provider]]),\n features: config.enabled ? config.features : null,\n usageToday: (await usageToday(root))[key] ?? 0,\n dailyTokenBudget: config.enabled\n ? config.dailyTokenBudget\n : (block?.dailyTokenBudget ?? 400_000),\n cooldownMs: await coolingDown(root, key),\n summaries: {\n covered: (await loadLlmSummaries(root, manifest)).size,\n indexed: Object.keys(manifest.entries).length,\n },\n };\n}\n\nexport function formatLlmStatus(report: LlmStatusReport): string {\n const features = report.features\n ? Object.entries(report.features)\n .map(([name, on]) => `${name} ${on ? \"on\" : \"off\"}`)\n .join(\", \")\n : \"-\";\n return [\n `status: ${report.enabled ? \"on\" : `off (${report.reason})`}`,\n `provider: ${report.provider}${report.model ? ` ${report.model}` : \"\"}`,\n `key: ${report.keyPresent ? \"present\" : \"missing\"} (${report.keyEnv})`,\n `features: ${features}`,\n `usage today: ${report.usageToday} / ${report.dailyTokenBudget} tokens`,\n ...(report.cooldownMs > 0\n ? [`cooldown: rate limited, ${Math.ceil(report.cooldownMs / 1000)} s left`]\n : []),\n `summaries: ${report.summaries.covered} / ${report.summaries.indexed} files`,\n ].join(\"\\n\");\n}\n\n/** One summary batch after a `watch` index pass; null when the layer is off. */\nexport async function summarizeAfterIndex(\n root: string,\n env: NodeJS.ProcessEnv = process.env,\n): Promise<SummarizeResult | null> {\n const config = await resolveLlmConfig(root, env);\n if (!config.enabled || !config.features.summaries) return null;\n return summarizeRepository(root, { config, limit: WATCH_BATCH, pace: false });\n}\n\nexport function registerLlmCommands(\n program: Command,\n runSafely: (fn: () => Promise<void>) => Promise<void>,\n): void {\n const llm = program\n .command(\"llm\")\n .description(\n \"Optional bring-your-own-key small model (Groq/OpenRouter) for summaries, rerank and memory.\",\n );\n\n llm\n .command(\"status\", { isDefault: true })\n .option(\"--json\", \"Print machine-readable JSON.\")\n .description(\n \"Show provider, key presence (never the key), usage, cooldown and summary coverage.\",\n )\n .action(async (opts: { json?: boolean }) => {\n await runSafely(async () => {\n const report = await llmStatusReport(process.cwd());\n console.log(opts.json ? JSON.stringify(report, null, 2) : formatLlmStatus(report));\n if (!report.keyPresent) console.log(pc.dim(`next: export ${report.keyEnv}=<your key>`));\n });\n });\n\n llm\n .command(\"enable\")\n .option(\"--provider <provider>\", \"groq or openrouter\", \"groq\")\n .option(\"--model <model>\", \"Model id (default: llama-3.1-8b-instant on groq).\")\n .description(\"Turn the layer on in .codebuddy/config.json (the key stays in your environment).\")\n .action(async (opts: { provider: string; model?: string }) => {\n await runSafely(async () => {\n if (opts.provider !== \"groq\" && opts.provider !== \"openrouter\") {\n throw new Error(\"--provider must be groq or openrouter\");\n }\n await setLlmEnabled(true, {\n provider: opts.provider,\n ...(opts.model ? { model: opts.model } : {}),\n });\n console.log(formatLlmStatus(await llmStatusReport(process.cwd())));\n });\n });\n\n llm\n .command(\"disable\")\n .description(\"Turn the layer off; CodeBuddy falls back to deterministic retrieval and capture.\")\n .action(async () => {\n await runSafely(async () => {\n await setLlmEnabled(false);\n console.log(\"llm layer disabled\");\n });\n });\n\n llm\n .command(\"test\")\n .description(\"Send one tiny request and print the model and latency.\")\n .action(async () => {\n await runSafely(async () => {\n const config = await resolveLlmConfig(process.cwd());\n if (!config.enabled) throw new Error(`llm layer is off: ${config.reason}`);\n const result = await chatJson(config, {\n system: 'Answer with JSON only: {\"ok\":true}.',\n user: \"ping\",\n schema: z.object({ ok: z.boolean() }),\n maxTokens: 10,\n deadlineMs: 10_000,\n purpose: \"prompt\",\n repositoryRoot: process.cwd(),\n });\n if (!result.ok) throw new Error(`${result.reason}: ${result.detail}`);\n console.log(`ok: ${result.model} answered in ${result.latencyMs} ms`);\n });\n });\n\n llm\n .command(\"summarize\")\n .option(\"--limit <n>\", \"Summarize at most this many files.\", Number)\n .description(\n \"Write one-line summaries of changed files now (resumable; paced to the free tier).\",\n )\n .action(async (opts: { limit?: number }) => {\n await runSafely(async () => {\n const controller = new AbortController();\n process.once(\"SIGINT\", () => controller.abort());\n const result = await summarizeRepository(process.cwd(), {\n ...(opts.limit !== undefined ? { limit: opts.limit } : {}),\n signal: controller.signal,\n onProgress: (done, total) => console.log(pc.dim(`summarized ${done}/${total}`)),\n });\n console.log(\n `${result.summarized} summarized, ${result.skipped} skipped, ${result.remaining} remaining (${result.stoppedBy})`,\n );\n });\n });\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { confirm, isCancel, log, note, password, spinner, text } from \"@clack/prompts\";\nimport { configPath, defaultNamespaceForCwd, initConfigFile } from \"../../core/config-file.js\";\nimport { bootstrapDatabase } from \"../../db/bootstrap.js\";\nimport { createDatabaseClient, pingDatabase } from \"../../db/client.js\";\nimport { runMigrations } from \"../../db/migrator.js\";\nimport { installClaudeEntry } from \"./claude-desktop.js\";\nimport { postgresUp } from \"./postgres-docker.js\";\n\nexport type WizardResult = {\n configPath: string;\n databaseReady: boolean;\n claudeInstalled: boolean;\n};\n\nfunction bail(): never {\n log.warn(\"Aborted. No config was written.\");\n process.exit(1);\n}\n\nfunction unwrap<T>(value: T): Exclude<T, symbol> {\n if (isCancel(value)) bail();\n return value as Exclude<T, symbol>;\n}\n\nasync function pingOnce(databaseUrl: string): Promise<boolean> {\n const client = createDatabaseClient({ postgresUrl: databaseUrl });\n try {\n return await pingDatabase(client);\n } catch {\n return false;\n } finally {\n await client.close().catch(() => undefined);\n }\n}\n\nexport async function runInitWizard(): Promise<WizardResult> {\n const projectRoot = process.cwd();\n // Trap Ctrl-C cleanly so partial writes don't leave the user wedged.\n const sigintHandler = () => bail();\n process.on(\"SIGINT\", sigintHandler);\n\n try {\n note(\n \"Sets up your config file, checks Postgres, applies migrations, and (optionally) wires Claude Desktop.\",\n \"CodeBuddy init\",\n );\n\n // ── Hugging Face token (optional: embeddings run locally by default) ──\n const hfToken = unwrap(\n await password({\n message: \"Hugging Face token (optional; only for hosted embeddings)\",\n }),\n );\n\n // ── Postgres URL ────────────────────────────────────────────────\n const databaseUrl = unwrap(\n await text({\n message: \"Postgres URL\",\n initialValue:\n process.env.DATABASE_URL ?? \"postgres://codebuddy:codebuddy@localhost:5432/codebuddy\",\n validate: (value) => (value && value.length > 0 ? undefined : \"Postgres URL is required.\"),\n }),\n );\n\n // ── Namespace ───────────────────────────────────────────────────\n const namespace = unwrap(\n await text({\n message: \"Default namespace\",\n initialValue: process.env.CODEBUDDY_NAMESPACE ?? defaultNamespaceForCwd(projectRoot),\n validate: (value) =>\n value && /^[a-zA-Z0-9_.:-]+$/.test(value) ? undefined : \"Letters, digits, _ . : - only.\",\n }),\n );\n\n // ── Probe Postgres ──────────────────────────────────────────────\n const dbSpinner = spinner();\n dbSpinner.start(\"Checking Postgres connection\");\n let connected = await pingOnce(databaseUrl);\n dbSpinner.stop(connected ? \"Postgres reachable.\" : \"Postgres did not respond.\");\n\n if (!connected) {\n const startDocker = unwrap(\n await confirm({\n message: \"Start the bundled Postgres container with docker compose?\",\n initialValue: true,\n }),\n );\n if (startDocker) {\n const dockerSpinner = spinner();\n dockerSpinner.start(\"docker compose up -d\");\n try {\n const result = await postgresUp();\n if (result.code === 0) {\n dockerSpinner.stop(\"Postgres container started.\");\n // Give Postgres a few seconds to accept connections.\n for (let attempt = 0; attempt < 10 && !connected; attempt++) {\n await new Promise((resolve) => setTimeout(resolve, 500));\n connected = await pingOnce(databaseUrl);\n }\n if (!connected) {\n log.warn(\"Container started but did not accept connections in time.\");\n }\n } else {\n dockerSpinner.stop(`docker compose failed: ${result.stderr || result.stdout}`);\n }\n } catch (error) {\n dockerSpinner.stop(`docker compose failed: ${(error as Error).message}`);\n }\n }\n }\n\n // ── Migrations (only if DB is reachable) ────────────────────────\n if (connected) {\n const migrateSpinner = spinner();\n migrateSpinner.start(\"Enabling pgvector and applying migrations\");\n const client = createDatabaseClient({ postgresUrl: databaseUrl });\n try {\n await bootstrapDatabase(client.sql);\n await runMigrations(client);\n migrateSpinner.stop(\"Migrations applied.\");\n } catch (error) {\n migrateSpinner.stop(`Migration error: ${(error as Error).message}`);\n } finally {\n await client.close().catch(() => undefined);\n }\n } else {\n log.warn(\"Skipping migrations — Postgres is not reachable. Run `codebuddy migrate` later.\");\n }\n\n // ── Write config (last so failures above don't leave a half-config) ──\n const initialised = await initConfigFile();\n const fileConfig = {\n postgresUrl: databaseUrl,\n namespace,\n provider: { type: \"local\" as const, ...(hfToken ? { apiKey: hfToken } : {}) },\n tokenBudget: 4000,\n };\n await writeFile(initialised.path, `${JSON.stringify(fileConfig, null, 2)}\\n`, {\n mode: 0o600,\n });\n log.success(`Config written to ${initialised.path}`);\n\n // ── Claude Desktop registration (optional) ──────────────────────\n let claudeInstalled = false;\n const wireClaude = unwrap(\n await confirm({\n message: \"Register this namespace with Claude Desktop now?\",\n initialValue: true,\n }),\n );\n if (wireClaude) {\n try {\n const install = await installClaudeEntry({\n namespace,\n projectRoot,\n hfToken,\n databaseUrl,\n });\n claudeInstalled = true;\n log.success(\n `Added \"${install.serverKey}\" to ${install.path}. Restart Claude Desktop (⌘Q) to activate.`,\n );\n } catch (error) {\n log.warn(`Claude Desktop install failed: ${(error as Error).message}`);\n }\n }\n\n return {\n configPath: configPath(),\n databaseReady: connected,\n claudeInstalled,\n };\n } finally {\n process.off(\"SIGINT\", sigintHandler);\n }\n}\n","import type { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { resolveNamespaceFrom } from \"../../core/config-file.js\";\nimport { recordChangeOutcome } from \"../../learning/outcomes.js\";\n\nexport function registerLearnCommand(\n program: Command,\n runSafely: (fn: () => Promise<void>) => Promise<void>,\n): void {\n const learn = program.command(\"learn\").description(\"Record verified team change outcomes.\");\n learn\n .command(\"outcome\")\n .requiredOption(\"--outcome <outcome>\", \"safe or regression\")\n .requiredOption(\"--paths <paths>\", \"Comma-separated repo-relative paths.\")\n .requiredOption(\"--summary <summary>\", \"What happened and why it matters.\")\n .option(\"--severity <severity>\", \"Incident severity: low, medium, high, or critical.\")\n .option(\"--commit <sha>\", \"Commit associated with the outcome.\")\n .option(\"--plan <id>\", \"Plan associated with the outcome.\")\n .description(\"Write an explicit, reviewable outcome into shared Markdown memory.\")\n .action(\n async (opts: {\n outcome: string;\n paths: string;\n summary: string;\n severity?: \"low\" | \"medium\" | \"high\" | \"critical\";\n commit?: string;\n plan?: string;\n }) => {\n await runSafely(async () => {\n if (opts.outcome !== \"safe\" && opts.outcome !== \"regression\") {\n throw new Error(\"--outcome must be safe or regression.\");\n }\n const result = await recordChangeOutcome({\n namespace: await resolveNamespaceFrom(),\n outcome: opts.outcome,\n paths: opts.paths\n .split(\",\")\n .map((path) => path.trim())\n .filter(Boolean),\n summary: opts.summary,\n ...(opts.severity ? { severity: opts.severity } : {}),\n ...(opts.commit ? { commit: opts.commit } : {}),\n ...(opts.plan ? { planId: opts.plan } : {}),\n });\n console.log(`${pc.green(\"recorded\")} ${result.id} (${result.category})`);\n console.log(pc.dim(result.path));\n });\n },\n );\n}\n","import { computeFactHash, generateEntityId } from \"../core/ids.js\";\nimport { type IncidentSeverity, MemoryFileStore } from \"../core/memory-file-store.js\";\nimport { redactPersisted } from \"../core/sensitive.js\";\n\nexport type ChangeOutcome = \"safe\" | \"regression\";\n\nexport type RecordChangeOutcomeInput = {\n repositoryRoot?: string;\n namespace: string;\n outcome: ChangeOutcome;\n paths: string[];\n summary: string;\n severity?: IncidentSeverity;\n commit?: string;\n planId?: string;\n now?: Date;\n};\n\nexport type RecordChangeOutcomeResult = {\n id: string;\n path: string;\n category: \"general\" | \"incident\";\n};\n\nexport async function recordChangeOutcome(\n input: RecordChangeOutcomeInput,\n): Promise<RecordChangeOutcomeResult> {\n if (input.paths.length === 0) throw new Error(\"At least one path is required.\");\n if (!input.summary.trim()) throw new Error(\"A non-empty outcome summary is required.\");\n const now = input.now ?? new Date();\n const category = input.outcome === \"regression\" ? \"incident\" : \"general\";\n const id = generateEntityId(\"fact\", now.getTime());\n const object = input.outcome === \"regression\" ? \"regression observed\" : \"verified safe\";\n const content = [\n `Change outcome: ${input.outcome}`,\n `Paths: ${input.paths.join(\", \")}`,\n `Summary: ${input.summary.trim()}`,\n ...(input.commit ? [`Commit: ${input.commit}`] : []),\n ].join(\"\\n\");\n const store = new MemoryFileStore(input.repositoryRoot);\n const subject = `change outcome for ${input.paths[0]}`;\n const predicate = input.outcome === \"regression\" ? \"caused\" : \"survived\";\n // Fingerprint the form that is actually persisted, never the raw text.\n const persisted = redactPersisted({ subject, predicate, object, content });\n const path = await store.writeFact({\n id,\n namespace: input.namespace,\n subject,\n predicate,\n object,\n confidence: input.outcome === \"regression\" ? 0.95 : 0.85,\n createdAt: now.toISOString(),\n createdByAgent: \"codebuddy:learn\",\n sourceInteractionId: null,\n sourceDeleted: false,\n category,\n paths: input.paths,\n ...(input.outcome === \"regression\" ? { severity: input.severity ?? \"high\" } : {}),\n ...(input.commit ? { introducedBy: input.commit } : {}),\n ...(input.planId ? { sourcePlanId: input.planId } : {}),\n verification: [\"explicit change outcome recorded by a project owner\"],\n fingerprint: computeFactHash(input.namespace, persisted.content),\n content,\n });\n return { id, path, category };\n}\n","import type { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { buildArchitectureMap, neighbours, queryMap } from \"../../map/indexer.js\";\n\nexport function registerMapCommands(\n program: Command,\n runSafely: (fn: () => Promise<void>) => Promise<void>,\n): void {\n const map = program.command(\"map\").description(\"Query the lightweight architecture map.\");\n\n map\n .command(\"build\")\n .description(\"Scan the current repository and summarize the module graph.\")\n .action(async () => {\n await runSafely(async () => {\n const graph = await buildArchitectureMap();\n console.log(\n JSON.stringify({ modules: graph.modules.length, edges: graph.edges.length }, null, 2),\n );\n });\n });\n\n map\n .command(\"deps\")\n .argument(\"<path>\", \"Repo-relative module path.\")\n .option(\"--json\", \"Print machine-readable JSON.\")\n .description(\"List modules imported by a file.\")\n .action(async (path: string, opts: { json?: boolean }) => {\n await runSafely(async () => {\n const graph = await buildArchitectureMap();\n const edges = queryMap(graph, { from: path });\n if (opts.json) {\n console.log(JSON.stringify({ edges }, null, 2));\n return;\n }\n if (edges.length === 0) {\n console.log(pc.dim(\"no dependencies found\"));\n return;\n }\n for (const edge of edges) console.log(`${edge.from} -> ${edge.to}`);\n });\n });\n\n map\n .command(\"dependents\")\n .argument(\"<path>\", \"Repo-relative module path.\")\n .option(\"--json\", \"Print machine-readable JSON.\")\n .description(\"List modules that import a file.\")\n .action(async (path: string, opts: { json?: boolean }) => {\n await runSafely(async () => {\n const graph = await buildArchitectureMap();\n const result = neighbours(graph, path, \"in\");\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n if (result.edges.length === 0) {\n console.log(pc.dim(\"no dependents found\"));\n return;\n }\n for (const edge of result.edges) console.log(`${edge.from} -> ${edge.to}`);\n });\n });\n}\n","import { spawn } from \"node:child_process\";\nimport { relative } from \"node:path\";\nimport type { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { approveReviewItem } from \"../../memory-extract/engine.js\";\nimport { type ReviewItem, ReviewStore } from \"../../memory-extract/review-store.js\";\n\n/**\n * The review queue is file-based Markdown under `.codebuddy/memory/review/`;\n * these commands need no database. Approving promotes an item to a durable\n * fact; rejecting deletes it. Nothing is ever committed automatically.\n */\nexport function registerMemoryCommands(\n program: Command,\n runSafely: (fn: () => Promise<void>) => Promise<void>,\n): void {\n const memory = program.command(\"memory\").description(\"Inspect and curate CodeBuddy memory.\");\n const review = memory\n .command(\"review\")\n .description(\"Review memory candidates captured automatically after turns.\");\n\n review\n .command(\"list\", { isDefault: true })\n .option(\"--json\", \"Print machine-readable JSON.\")\n .description(\"List pending review candidates.\")\n .action(async (opts: { json?: boolean }) => {\n await runSafely(async () => {\n const items = await new ReviewStore().list();\n if (opts.json) {\n console.log(JSON.stringify(items, null, 2));\n return;\n }\n if (items.length === 0) {\n console.log(pc.dim(\"no pending review items\"));\n return;\n }\n for (const item of items) console.log(renderRow(item));\n console.log(pc.dim(`\\n${items.length} pending. approve <id> | reject <id> | show <id>`));\n });\n });\n\n review\n .command(\"show\")\n .argument(\"<id>\")\n .description(\"Show a single review candidate.\")\n .action(async (id: string) => {\n await runSafely(async () => {\n console.log(renderItem(await new ReviewStore().read(id)));\n });\n });\n\n review\n .command(\"approve\")\n .argument(\"<id>\")\n .option(\"--incident <id>\", \"For a queued incident resolution: the incident to resolve.\")\n .description(\"Promote a review candidate to a durable fact and remove it from the queue.\")\n .action(async (id: string, opts: { incident?: string }) => {\n await runSafely(async () => {\n const factId = await approveReviewItem(id, {\n ...(opts.incident !== undefined ? { incidentId: opts.incident } : {}),\n });\n console.log(`${pc.green(\"approved\")} ${id} → ${factId}`);\n });\n });\n\n review\n .command(\"reject\")\n .argument(\"<id>\")\n .description(\"Discard a review candidate without saving it.\")\n .action(async (id: string) => {\n await runSafely(async () => {\n const store = new ReviewStore();\n await store.read(id); // Validate existence for a clear error.\n await store.delete(id);\n console.log(`${pc.yellow(\"rejected\")} ${id}`);\n });\n });\n\n review\n .command(\"edit\")\n .argument(\"<id>\")\n .description(\"Open a review candidate in $EDITOR and re-validate on save.\")\n .action(async (id: string) => {\n await runSafely(async () => {\n const store = new ReviewStore();\n const item = await store.read(id);\n await openEditor(item.path);\n await store.read(id); // Re-parse to reject malformed edits loudly.\n console.log(pc.dim(\"saved and validated\"));\n });\n });\n}\n\nfunction renderRow(item: ReviewItem): string {\n const flag = item.sensitive ? pc.red(\" ⚠ sensitive\") : \"\";\n return `${classColor(item.class)} ${pc.dim(item.id)} ${truncate(item.content, 70)}${flag}`;\n}\n\nfunction renderItem(item: ReviewItem): string {\n const lines = [\n `${classColor(item.class)} ${pc.dim(item.id)}`,\n `${pc.bold(\"reason:\")} ${item.reason}`,\n `${pc.bold(\"confidence:\")} ${item.confidence.toFixed(2)}`,\n `${pc.bold(\"triple:\")} ${item.subject} · ${item.predicate} · ${item.object}`,\n ];\n if (item.paths.length > 0) lines.push(`${pc.bold(\"paths:\")} ${item.paths.join(\", \")}`);\n if (item.severity) lines.push(`${pc.bold(\"severity:\")} ${item.severity}`);\n if (item.resolvesIncidents) {\n lines.push(\n `${pc.bold(\"resolves:\")} ${item.resolvesIncidents.join(\", \") || \"(no candidate; approve with --incident <id>)\"}`,\n );\n }\n if (item.sensitive) lines.push(pc.red(`⚠ sensitive: ${item.sensitiveReasons.join(\", \")}`));\n lines.push(\"\", item.content, \"\", pc.dim(relative(process.cwd(), item.path)));\n return lines.join(\"\\n\");\n}\n\nfunction classColor(memoryClass: ReviewItem[\"class\"]): string {\n switch (memoryClass) {\n case \"incident\":\n return pc.red(memoryClass);\n case \"decision\":\n return pc.cyan(memoryClass);\n case \"fact\":\n return pc.green(memoryClass);\n case \"note\":\n return pc.yellow(memoryClass);\n default:\n return pc.dim(memoryClass);\n }\n}\n\nfunction truncate(value: string, max: number): string {\n const trimmed = value.trim();\n return trimmed.length <= max ? trimmed : `${trimmed.slice(0, max - 1)}…`;\n}\n\nfunction openEditor(path: string): Promise<void> {\n const editor = process.env.EDITOR ?? process.env.VISUAL ?? \"vi\";\n return new Promise((resolvePromise, reject) => {\n const child = spawn(editor, [path], { stdio: \"inherit\" });\n child.on(\"error\", reject);\n child.on(\"close\", () => resolvePromise());\n });\n}\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { spinner } from \"@clack/prompts\";\nimport type { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { buildProviderFromConfig } from \"../../core/codebuddy.js\";\nimport {\n loadRuntimeConfig,\n readConfigFile,\n redactSecrets,\n setConfigBlock,\n} from \"../../core/config-file.js\";\nimport { createDatabaseClient } from \"../../db/client.js\";\nimport { calibrateEmbedder } from \"../../providers/calibration.js\";\nimport { embeddingSpaceKey } from \"../../providers/embedding-space.js\";\nimport { localRuntimeInstalled, modelCacheDir } from \"../../providers/local.js\";\nimport {\n DEFAULT_CLOUD_EMBEDDING_MODELS,\n DEFAULT_RERANK_MODELS,\n getModelDefinition,\n LOCAL_EMBEDDING_MODEL,\n} from \"../../providers/models.js\";\nimport { syncInBackground } from \"./hooks.js\";\n\n/**\n * `codebuddy models`: which embedding model and reranker power per-prompt\n * memory recall, whether they are ready, and switching between local\n * (default, no key) and hosted ones (Hugging Face, OpenRouter).\n */\n\nconst EMBEDDERS = [\"local\", \"huggingface\", \"openrouter\"] as const;\nconst RERANKERS = [\"off\", \"local\", \"huggingface\", \"openrouter\"] as const;\ntype Embedder = (typeof EMBEDDERS)[number];\ntype RerankChoice = (typeof RERANKERS)[number];\nconst KEY_ENV = { huggingface: \"HF_TOKEN\", openrouter: \"OPENROUTER_API_KEY\" } as const;\n\nconst ok = (text: string) => `${pc.green(\"✓\")} ${text}`;\nconst warn = (text: string) => `${pc.yellow(\"!\")} ${text}`;\nconst row = (label: string, value: string) => ` ${pc.dim(label.padEnd(11))}${value}`;\n\n/** Run `work` under a spinner that always stops, so a failure never leaves the process hanging. */\nasync function withSpinner<T>(\n label: string,\n work: () => Promise<T>,\n done: (value: T) => string,\n): Promise<T> {\n const progress = spinner();\n progress.start(label);\n try {\n const value = await work();\n progress.stop(done(value));\n return value;\n } catch (error) {\n progress.error(pc.red(`✗ ${label}`));\n throw error;\n }\n}\n\nfunction keyPresent(provider: \"huggingface\" | \"openrouter\", apiKey?: string): boolean {\n return Boolean(process.env[KEY_ENV[provider]] || (provider === \"huggingface\" && apiKey));\n}\n\nfunction localModelDownloaded(id: string, revision?: string): boolean {\n const dir = join(modelCacheDir(), id, ...(revision ? [revision] : []));\n return existsSync(join(dir, \"onnx\", \"model_quantized.onnx\"));\n}\n\nasync function vectorCounts(\n postgresUrl: string,\n namespace: string,\n space: string | undefined,\n): Promise<{ ready: number; pending: number; failed: number; other: number } | string> {\n const client = createDatabaseClient({ postgresUrl, maxConnections: 1, connectTimeoutSeconds: 3 });\n try {\n const [counts] = await client.sql<\n Array<{ ready: number; pending: number; failed: number; other: number }>\n >`\n select\n count(*) filter (where e.status = 'ready' and e.embedding_space = ${space ?? \"\"})::int as ready,\n count(*) filter (where e.status in ('pending', 'processing'))::int as pending,\n count(*) filter (where e.status = 'failed')::int as failed,\n count(*) filter (where e.status = 'ready' and e.embedding_space is distinct from ${space ?? \"\"})::int as other\n from embeddings e join namespaces n on n.id = e.namespace_id\n where n.name = ${namespace}\n `;\n return counts ?? { ready: 0, pending: 0, failed: 0, other: 0 };\n } catch (error) {\n return String(redactSecrets((error as Error).message)).split(\"\\n\")[0] ?? \"unreachable\";\n } finally {\n await client.close().catch(() => undefined);\n }\n}\n\nasync function printStatus(): Promise<void> {\n const file = await readConfigFile();\n const config = await loadRuntimeConfig(process.cwd(), { requireDatabase: false });\n const provider = config.provider;\n const embedder = buildProviderFromConfig(config.provider);\n const space = embedder.space;\n const model =\n provider.type === \"local\"\n ? LOCAL_EMBEDDING_MODEL.id\n : (provider.model ?? DEFAULT_CLOUD_EMBEDDING_MODELS[provider.type]);\n const floor = provider.relevanceFloor ?? getModelDefinition(model)?.relevanceFloor;\n const next: string[] = [];\n\n console.log(pc.bold(\"Embeddings\"));\n console.log(row(\"provider\", `${provider.type} ${pc.dim(model)}`));\n if (provider.type === \"local\" && !localRuntimeInstalled()) {\n console.log(\n row(\"runtime\", warn(\"@huggingface/transformers is not installed: dense recall is off\")),\n );\n next.push(\"npm i -g @huggingface/transformers\");\n } else if (provider.type === \"local\") {\n const ready = localModelDownloaded(LOCAL_EMBEDDING_MODEL.id, LOCAL_EMBEDDING_MODEL.revision);\n console.log(\n row(\n \"model\",\n ready ? ok(`downloaded ${pc.dim(modelCacheDir())}`) : warn(\"not downloaded yet (~90 MB)\"),\n ),\n );\n if (!ready) next.push(\"codebuddy models pull\");\n } else {\n const present = keyPresent(provider.type, provider.apiKey);\n console.log(\n row(\n \"key\",\n present ? ok(KEY_ENV[provider.type]) : warn(`${KEY_ENV[provider.type]} is not set`),\n ),\n );\n if (!present) next.push(`export ${KEY_ENV[provider.type]}=…`);\n }\n console.log(\n row(\n \"floor\",\n floor !== undefined\n ? `${floor} ${pc.dim(provider.relevanceFloor !== undefined ? \"(calibrated for this project)\" : \"(built-in)\")}`\n : warn(\"not calibrated: dense recall is off for this model\"),\n ),\n );\n if (floor === undefined) next.push(\"codebuddy models calibrate\");\n\n const rerank = file.rerank?.provider ?? \"off\";\n console.log(pc.bold(\"Reranker\"));\n if (rerank === \"off\") {\n console.log(\n row(\"provider\", `off ${pc.dim(\"(default: no reranker beat dense order in evals)\")}`),\n );\n } else {\n console.log(\n row(\n \"provider\",\n `${rerank} ${pc.dim(file.rerank?.model ?? DEFAULT_RERANK_MODELS[rerank].id)}`,\n ),\n );\n if (rerank !== \"local\") {\n const present = keyPresent(rerank, file.provider?.apiKey);\n console.log(\n row(\n \"key\",\n present\n ? ok(KEY_ENV[rerank])\n : warn(`${KEY_ENV[rerank]} is not set; reranking is skipped`),\n ),\n );\n }\n }\n\n console.log(pc.bold(\"Memory index\"));\n if (process.env.CODEBUDDY_SEMANTIC === \"0\") {\n console.log(row(\"recall\", warn(\"CODEBUDDY_SEMANTIC=0: lexical only\")));\n }\n if (!config.postgresUrl) {\n console.log(row(\"postgres\", warn(\"not configured: recall is lexical only\")));\n next.push(\"codebuddy use (sets up PostgreSQL)\");\n } else {\n const counts = await vectorCounts(\n config.postgresUrl,\n config.namespace,\n space ? embeddingSpaceKey(space) : undefined,\n );\n if (typeof counts === \"string\") {\n console.log(row(\"postgres\", warn(`unreachable: ${counts}`)));\n next.push(\"codebuddy postgres up\");\n } else {\n console.log(row(\"postgres\", ok(`namespace ${config.namespace}`)));\n console.log(\n row(\n \"vectors\",\n `${counts.ready} ready` +\n (counts.pending ? `, ${counts.pending} pending` : \"\") +\n (counts.failed ? pc.red(`, ${counts.failed} failed`) : \"\") +\n (counts.other ? pc.yellow(`, ${counts.other} from another model`) : \"\"),\n ),\n );\n if (counts.pending || counts.other)\n next.push(\"codebuddy hooks sync (embeds pending and re-embeds old vectors)\");\n }\n }\n console.log(\n next.length > 0\n ? `\\n${pc.bold(\"Next\")}\\n${next.map((step) => ` ${pc.cyan(step)}`).join(\"\\n\")}`\n : `\\n${ok(\"Semantic recall is ready.\")} ${pc.dim('Try: codebuddy context preview \"<task>\"')}`,\n );\n}\n\nexport function registerModelsCommands(\n program: Command,\n runSafely: (fn: () => Promise<void>) => Promise<void>,\n): void {\n const models = program\n .command(\"models\")\n .description(\"Embedding model and reranker behind per-prompt memory recall.\")\n .action(async () => runSafely(printStatus));\n\n models\n .command(\"status\")\n .description(\"Show the embedding model, reranker, keys and vector index health.\")\n .action(async () => runSafely(printStatus));\n\n models\n .command(\"use\")\n .argument(\"<provider>\", `Embedding provider: ${EMBEDDERS.join(\" | \")}.`)\n .option(\"--model <id>\", \"Hosted model id (must return 384-d vectors).\")\n .option(\n \"--floor <cosine>\",\n \"Relevance floor; otherwise built-in or `models calibrate`.\",\n Number,\n )\n .description(\"Choose where embeddings run: local (default, no key) or a hosted API.\")\n .addHelpText(\n \"after\",\n `\nExamples:\n codebuddy models use local\n codebuddy models use openrouter # ${DEFAULT_CLOUD_EMBEDDING_MODELS.openrouter}, needs OPENROUTER_API_KEY\n codebuddy models use openrouter --model nvidia/nemotron-3.5-embed-1b:free\n codebuddy models use huggingface # ${DEFAULT_CLOUD_EMBEDDING_MODELS.huggingface}, needs HF_TOKEN`,\n )\n .action(async (choice: string, opts: { model?: string; floor?: number }) => {\n await runSafely(async () => {\n if (!EMBEDDERS.includes(choice as Embedder)) {\n throw new Error(`Unknown provider \"${choice}\". Use one of: ${EMBEDDERS.join(\", \")}.`);\n }\n const type = choice as Embedder;\n if (type === \"local\" && opts.model) {\n throw new Error(\n \"The local provider has one built-in model; --model is for hosted providers.\",\n );\n }\n const current = (await readConfigFile()).provider;\n await setConfigBlock(\"provider\", {\n type,\n ...(current?.apiKey ? { apiKey: current.apiKey } : {}),\n ...(opts.model ? { model: opts.model } : {}),\n ...(opts.floor !== undefined ? { relevanceFloor: opts.floor } : {}),\n });\n const model =\n type === \"local\"\n ? LOCAL_EMBEDDING_MODEL.id\n : (opts.model ?? DEFAULT_CLOUD_EMBEDDING_MODELS[type]);\n console.log(ok(`Embeddings: ${type} ${pc.dim(model)}`));\n const missingKey = type !== \"local\" && !keyPresent(type, current?.apiKey);\n if (missingKey) {\n console.log(\n warn(\n `Set ${KEY_ENV[type]} in your shell (keys are never stored in config), then run ${pc.cyan(\"codebuddy hooks sync\")}.`,\n ),\n );\n console.log(pc.dim(\" Existing vectors keep working until the new model can embed.\"));\n }\n if (opts.floor === undefined && getModelDefinition(model)?.relevanceFloor === undefined) {\n console.log(\n warn(\n `No floor for ${model} yet: run ${pc.cyan(\"codebuddy models calibrate\")} to turn on dense recall.`,\n ),\n );\n }\n if (!missingKey) {\n syncInBackground(process.cwd(), true);\n console.log(\n pc.dim(\" Re-embedding existing memory in the background (codebuddy hooks sync).\"),\n );\n }\n });\n });\n\n models\n .command(\"rerank\")\n .argument(\"<provider>\", `Reranker: ${RERANKERS.join(\" | \")}.`)\n .option(\"--model <id>\", \"Cross-encoder model id.\")\n .description(\"Optionally reorder recalled facts with a cross-encoder (off by default).\")\n .addHelpText(\n \"after\",\n `\nDefaults: local ${DEFAULT_RERANK_MODELS.local.id} · huggingface ${DEFAULT_RERANK_MODELS.huggingface.id}\n openrouter ${DEFAULT_RERANK_MODELS.openrouter.id} (paid per search)\nIn CodeBuddy's eval, no reranker beat the dense order; measure on your data\nbefore keeping one on. A reranker never admits a fact, it only orders them.`,\n )\n .action(async (choice: string, opts: { model?: string }) => {\n await runSafely(async () => {\n if (!RERANKERS.includes(choice as RerankChoice)) {\n throw new Error(`Unknown reranker \"${choice}\". Use one of: ${RERANKERS.join(\", \")}.`);\n }\n await setConfigBlock(\"rerank\", {\n provider: choice,\n ...(opts.model ? { model: opts.model } : {}),\n });\n if (choice === \"off\") {\n console.log(ok(\"Reranker off: facts keep their fused (keyword + vector) order.\"));\n return;\n }\n const reranker = choice as Exclude<RerankChoice, \"off\">;\n console.log(\n ok(`Reranker: ${reranker} ${pc.dim(opts.model ?? DEFAULT_RERANK_MODELS[reranker].id)}`),\n );\n if (\n reranker !== \"local\" &&\n !keyPresent(reranker, (await readConfigFile()).provider?.apiKey)\n ) {\n console.log(warn(`Set ${KEY_ENV[reranker]}; without it reranking is skipped.`));\n }\n if (reranker === \"local\")\n console.log(pc.dim(\" Run codebuddy models pull to download it now.\"));\n });\n });\n\n models\n .command(\"pull\")\n .description(\"Download the local models now instead of on first use.\")\n .action(async () => {\n await runSafely(async () => {\n const { LocalModelProvider, rerankLocally } = await import(\"../../providers/local.js\");\n const file = await readConfigFile();\n let started = Date.now();\n await withSpinner(\n `Downloading ${LOCAL_EMBEDDING_MODEL.id}`,\n () => new LocalModelProvider().embed({ input: \"warm up\" }),\n () => ok(`${LOCAL_EMBEDDING_MODEL.id} ready ${pc.dim(`${Date.now() - started} ms`)}`),\n );\n if (file.rerank?.provider === \"local\") {\n const id = file.rerank.model ?? DEFAULT_RERANK_MODELS.local.id;\n const revision =\n id === DEFAULT_RERANK_MODELS.local.id\n ? DEFAULT_RERANK_MODELS.local.revision\n : undefined;\n started = Date.now();\n await withSpinner(\n `Downloading ${id}`,\n () => rerankLocally({ id, ...(revision ? { revision } : {}) }, \"warm\", [\"up\"]),\n () => ok(`${id} ready ${pc.dim(`${Date.now() - started} ms`)}`),\n );\n }\n console.log(pc.dim(` Cache: ${modelCacheDir()}`));\n });\n });\n\n models\n .command(\"calibrate\")\n .option(\"--dry-run\", \"Measure only; do not save the floor.\")\n .description(\n \"Measure the configured embedder on a built-in task set and save its recall floor.\",\n )\n .action(async (opts: { dryRun?: boolean }) => {\n await runSafely(async () => {\n const config = await loadRuntimeConfig(process.cwd(), { requireDatabase: false });\n const embedder = buildProviderFromConfig(config.provider);\n const result = await withSpinner(\n `Embedding 44 calibration texts with ${embedder.space?.model ?? config.provider.type}`,\n () =>\n calibrateEmbedder(async (texts) => (await embedder.embed({ input: texts })).vectors),\n () => ok(\"Measured\"),\n );\n const pct = (value: number) => `${Math.round(value * 100)}%`;\n console.log(\n row(\n \"ranking\",\n `AUC ${result.auc.toFixed(3)} · right fact first ${pct(result.recallAt1)} ${pc.dim(\"(held-out tasks)\")}`,\n ),\n );\n console.log(\n row(\n \"floor\",\n `${result.best.floor}: precision ${pct(result.test.precision)}, recall ${pct(result.test.recall)}, ` +\n `silent on ${pct(result.test.abstain)} of unrelated tasks ${pc.dim(\"(chosen on dev, measured on test)\")}`,\n ),\n );\n console.log(\n row(\n \"recall floor\",\n `${result.recall.dev.floor}: precision ${pct(result.recall.test.precision)}, recall ${pct(result.recall.test.recall)} ` +\n pc.dim(\"(explicit recall: best F2 on dev, measured on test)\"),\n ),\n );\n if (opts.dryRun) return;\n const file = await readConfigFile();\n await setConfigBlock(\"provider\", {\n ...(file.provider ?? { type: config.provider.type }),\n relevanceFloor: result.best.floor,\n recallFloor: result.recall.dev.floor,\n });\n console.log(\n ok(\n `Saved relevanceFloor ${result.best.floor} and recallFloor ${result.recall.dev.floor} to .codebuddy/config.json`,\n ),\n );\n });\n });\n}\n","{\n \"version\": 2,\n \"note\": \"Task prompts vs durable project facts. Queries are paraphrased so most share few or no words with their fact; every unlisted (query, fact) pair is irrelevant. Hard negatives share a subsystem with a relevant fact but do not answer its task. Queries alternate dev/test by position (even index = dev): floors are chosen on dev and reported on test.\",\n \"facts\": {\n \"cookie\": \"OAuth callback breaks unless the session cookie is SameSite=Lax; Strict drops it on the cross-site redirect.\",\n \"pool\": \"Postgres connections go through one bounded pool of 10; never open ad-hoc clients in request handlers.\",\n \"release\": \"npm releases are published from CI with provenance; never publish from a laptop.\",\n \"biome\": \"Biome owns formatting and import order; run biome check --write before committing.\",\n \"hook\": \"Prompt hooks must answer within 15 seconds or the host drops the injected block.\",\n \"migration\": \"Migrations must create the pgvector extension before 0003 adds the vector column.\",\n \"redaction\": \"Secrets are redacted before a memory is written; the content hash is computed after redaction.\",\n \"ledger\": \"The session ledger keeps the last 8 acknowledged versions per section so a task switch back is not resent.\",\n \"zvec\": \"zvec-grep is optional; any failure falls back to keyword ranking with a retrieval explain line.\",\n \"tests\": \"Integration tests skip unless CODEBUDDY_TEST_DATABASE_URL points at a live Postgres.\",\n \"esm\": \"Source imports use .js specifiers even for TypeScript files because the package is ESM.\",\n \"stdout\": \"Never log to stdout in the MCP server: stdout carries JSON-RPC and any stray line corrupts it.\",\n \"budget\": \"The BYOK LLM layer stops background calls at 70% of the daily budget and backs off after a 429.\",\n \"worktree\": \"Use a temporary WIP commit instead of git stash; the stash stack is shared across worktrees.\",\n \"rateLimit\": \"The public API allows 100 requests per minute per token; bursts above it get HTTP 429.\",\n \"timezone\": \"All timestamps are stored in UTC and converted to the user's zone only for display.\",\n \"avatar\": \"Profile images are resized to 256px and stored as WebP in the media bucket.\",\n \"flags\": \"Feature flags are read once at boot; changing one requires a restart of the worker.\",\n \"pagination\": \"List endpoints use cursor pagination with an opaque base64url cursor of createdAt and id.\",\n \"i18n\": \"UI strings live in locales/en.json; never hard-code user-facing text in components.\",\n \"cookieDomain\": \"Session cookies are scoped to the app subdomain; never set them on the apex domain.\",\n \"poolMetrics\": \"Database pool metrics are exported to Prometheus under the codebuddy_pool_ prefix.\",\n \"releaseNotes\": \"Release notes are drafted from merged pull request titles by the changelog script.\",\n \"hookInstall\": \"Hooks are written to .claude/settings.json and merged idempotently with the user's own hooks.\",\n \"migrationNaming\": \"Migration files are numbered by drizzle-kit; never rename or edit a migration that has been applied.\",\n \"testsParallel\": \"Vitest runs test files in parallel, so every test must use its own temporary directory.\",\n \"logsStderr\": \"Server logs go to stderr through pino; never log full request bodies.\",\n \"retry5xx\": \"The HTTP client retries 5xx responses twice with jittered backoff.\",\n \"dateFormat\": \"Dates in the UI are formatted with the user's locale through Intl.DateTimeFormat.\",\n \"flagNames\": \"Feature flag names use kebab-case and are declared in flags.yaml.\"\n },\n \"queries\": [\n {\n \"q\": \"users get bounced back to sign-in forever after the identity provider returns\",\n \"relevant\": [\"cookie\"]\n },\n {\n \"q\": \"handlers are exhausting connections to the database under load\",\n \"relevant\": [\"pool\"]\n },\n {\n \"q\": \"cut a new version and push the package to the registry\",\n \"relevant\": [\"release\"]\n },\n {\n \"q\": \"the injected block sometimes never shows up in the chat\",\n \"relevant\": [\"hook\"]\n },\n {\n \"q\": \"fresh database setup fails on the embedding column\",\n \"relevant\": [\"migration\"]\n },\n {\n \"q\": \"an API key ended up in a saved note\",\n \"relevant\": [\"redaction\"]\n },\n {\n \"q\": \"context is sent again after I switch tasks and come back\",\n \"relevant\": [\"ledger\"]\n },\n {\n \"q\": \"semantic code search crashes and the agent gets no files\",\n \"relevant\": [\"zvec\"]\n },\n {\n \"q\": \"why do the db tests not run on my machine\",\n \"relevant\": [\"tests\"]\n },\n {\n \"q\": \"module not found when importing a sibling ts file at runtime\",\n \"relevant\": [\"esm\"]\n },\n {\n \"q\": \"Claude Desktop says Unexpected token in the server response\",\n \"relevant\": [\"stdout\"]\n },\n {\n \"q\": \"the summarizer quietly stopped calling Groq in the afternoon\",\n \"relevant\": [\"budget\"]\n },\n {\n \"q\": \"my uncommitted changes vanished after another session ran\",\n \"relevant\": [\"worktree\"]\n },\n {\n \"q\": \"clients see too many requests errors during the import job\",\n \"relevant\": [\"rateLimit\"]\n },\n {\n \"q\": \"meeting times show up one hour off for users in Berlin\",\n \"relevant\": [\"timezone\"]\n },\n {\n \"q\": \"uploaded profile pictures look blurry\",\n \"relevant\": [\"avatar\"]\n },\n {\n \"q\": \"I toggled the new checkout switch but nothing changed\",\n \"relevant\": [\"flags\"]\n },\n {\n \"q\": \"infinite scroll repeats items on the second page\",\n \"relevant\": [\"pagination\"]\n },\n {\n \"q\": \"translate the onboarding screen to German\",\n \"relevant\": [\"i18n\"]\n },\n {\n \"q\": \"format the code before I commit\",\n \"relevant\": [\"biome\"]\n },\n {\n \"q\": \"make the sidebar collapsible\",\n \"relevant\": []\n },\n {\n \"q\": \"add dark mode to the dashboard\",\n \"relevant\": []\n },\n {\n \"q\": \"write a haiku about the project\",\n \"relevant\": []\n },\n {\n \"q\": \"rename the button label on the settings page\",\n \"relevant\": []\n },\n {\n \"q\": \"where do I declare a new feature flag\",\n \"relevant\": [\"flagNames\"]\n },\n {\n \"q\": \"show dates in the user's own language and order\",\n \"relevant\": [\"dateFormat\"]\n },\n {\n \"q\": \"can I tidy up the name of the 0004 migration file\",\n \"relevant\": [\"migrationNaming\"]\n },\n {\n \"q\": \"tests interfere with each other when the whole suite runs\",\n \"relevant\": [\"testsParallel\"]\n },\n {\n \"q\": \"where can I see how busy the connection pool is\",\n \"relevant\": [\"poolMetrics\"]\n },\n {\n \"q\": \"how is the text for the changelog produced\",\n \"relevant\": [\"releaseNotes\"]\n },\n {\n \"q\": \"the login cookie shows up on example.com instead of app.example.com\",\n \"relevant\": [\"cookieDomain\"]\n },\n {\n \"q\": \"is it fine to print the incoming payload for debugging\",\n \"relevant\": [\"logsStderr\"]\n },\n {\n \"q\": \"our hook setup appears twice in the Claude settings file\",\n \"relevant\": [\"hookInstall\"]\n },\n {\n \"q\": \"flaky upstream 502s should not fail the request on the first try\",\n \"relevant\": [\"retry5xx\"]\n },\n {\n \"q\": \"rewrite the marketing copy on the landing page\",\n \"relevant\": []\n },\n {\n \"q\": \"upgrade React to the next major version\",\n \"relevant\": []\n },\n {\n \"q\": \"add a CSV export button to the reports table\",\n \"relevant\": []\n }\n ]\n}\n","import dataset from \"../../evals/fact-relevance.json\" with { type: \"json\" };\n\n/**\n * Measures an embedder on `evals/fact-relevance.json` (paraphrased coding\n * tasks vs project facts, with hard negatives and unrelated tasks) and picks\n * its relevance floor: the cosine that maximizes F0.5, precision-weighted\n * because a missed memory is cheaper than a false one.\n *\n * Queries alternate dev/test by position. The floor is chosen on dev only;\n * every reported number (AUC, Recall@1, MRR, precision/recall at the floor)\n * is measured on the held-out test queries, so it is not fitted to itself.\n * Used by `codebuddy models calibrate` and `npm run eval:semantic`.\n */\n\nexport type FloorPoint = {\n floor: number;\n precision: number;\n recall: number;\n f05: number;\n /** Share of unrelated tasks for which no fact clears the floor. */\n abstain: number;\n};\n\nexport type Split = \"dev\" | \"test\";\n\nexport type Calibration = {\n /** Held-out (test) ranking quality. */\n auc: number;\n recallAt1: number;\n mrr: number;\n /** The floor chosen on dev, with its dev metrics. */\n best: FloorPoint;\n /** The same floor measured on the held-out test queries. */\n test: FloorPoint;\n /** Best F2 on dev (recall-weighted), for explicit `recall`, and that floor on test. */\n recall: { dev: FloorPoint; test: FloorPoint };\n at(floor: number, split?: Split): FloorPoint;\n};\n\ntype Dataset = { facts: Record<string, string>; queries: Array<{ q: string; relevant: string[] }> };\n\nexport function splitOf(index: number): Split {\n return index % 2 === 0 ? \"dev\" : \"test\";\n}\n\nexport async function calibrateEmbedder(\n embed: (texts: string[]) => Promise<number[][]>,\n): Promise<Calibration> {\n const data = dataset as Dataset;\n const factIds = Object.keys(data.facts);\n const factVectors = await embed(Object.values(data.facts));\n const queryVectors = await embed(data.queries.map(({ q }) => q));\n const dot = (a: number[], b: number[]) =>\n a.reduce((sum, value, index) => sum + value * (b[index] ?? 0), 0);\n const scores = queryVectors.map((query) => factVectors.map((fact) => dot(query, fact)));\n const relevant = (qi: number, fi: number) =>\n data.queries[qi]?.relevant.includes(factIds[fi] ?? \"\") ?? false;\n const answerable = (qi: number) => (data.queries[qi]?.relevant.length ?? 0) > 0;\n const rows = (split: Split) =>\n scores.flatMap((row, qi) => (splitOf(qi) === split ? [{ row, qi }] : []));\n\n const positives: number[] = [];\n const negatives: number[] = [];\n let hits = 0;\n let reciprocal = 0;\n let answered = 0;\n for (const { row, qi } of rows(\"test\")) {\n for (const [fi, score] of row.entries()) (relevant(qi, fi) ? positives : negatives).push(score);\n if (!answerable(qi)) continue;\n answered += 1;\n const order = row.map((score, fi) => ({ score, fi })).sort((a, b) => b.score - a.score);\n const rank = order.findIndex(({ fi }) => relevant(qi, fi)) + 1;\n if (rank === 1) hits += 1;\n reciprocal += 1 / rank;\n }\n const auc =\n positives.reduce((wins, p) => wins + negatives.filter((n) => p > n).length, 0) /\n (positives.length * negatives.length);\n\n const at = (floor: number, split: Split = \"test\"): FloorPoint => {\n let tp = 0;\n let fp = 0;\n let relevantPairs = 0;\n let abstained = 0;\n let unrelated = 0;\n for (const { row, qi } of rows(split)) {\n relevantPairs += data.queries[qi]?.relevant.length ?? 0;\n const admitted = row.flatMap((score, fi) => (score >= floor ? [fi] : []));\n for (const fi of admitted) {\n if (relevant(qi, fi)) tp += 1;\n else fp += 1;\n }\n if (!answerable(qi)) {\n unrelated += 1;\n if (admitted.length === 0) abstained += 1;\n }\n }\n const precision = tp + fp === 0 ? 1 : tp / (tp + fp);\n const recall = relevantPairs === 0 ? 0 : tp / relevantPairs;\n const f05 =\n precision + recall === 0 ? 0 : (1.25 * precision * recall) / (0.25 * precision + recall);\n return { floor, precision, recall, f05, abstain: unrelated === 0 ? 1 : abstained / unrelated };\n };\n // Cosine ranges differ widely by model (MiniLM ~0.2–0.6, granite ~0.6–0.9).\n const sweep = Array.from({ length: 96 }, (_, i) =>\n at(Math.round((0.05 + i * 0.01) * 100) / 100, \"dev\"),\n );\n const best = sweep.reduce((left, right) => (right.f05 > left.f05 ? right : left));\n const f2 = ({ precision, recall }: FloorPoint) =>\n precision + recall === 0 ? 0 : (5 * precision * recall) / (4 * precision + recall);\n const recallBest = sweep.reduce((left, right) => (f2(right) > f2(left) ? right : left));\n return {\n auc,\n recallAt1: answered === 0 ? 0 : hits / answered,\n mrr: answered === 0 ? 0 : reciprocal / answered,\n best,\n test: at(best.floor, \"test\"),\n recall: { dev: recallBest, test: at(recallBest.floor, \"test\") },\n at,\n };\n}\n","import { spawn } from \"node:child_process\";\nimport { relative } from \"node:path\";\nimport type { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport {\n loadPlanPolicy,\n PLAN_POLICIES,\n type PlanPolicy,\n resolveNamespaceFrom,\n setPlanPolicy,\n} from \"../../core/config-file.js\";\nimport { PlanFileStore, type PlanSpec, type PlanStatus } from \"../../core/plan-file-store.js\";\nimport { PlanLifecycle } from \"../../core/plan-lifecycle.js\";\n\n/**\n * Resolve the active namespace for plan commands without requiring a\n * database connection — plans are file-based, so a developer can author\n * and inspect them with no Postgres running.\n */\n\nfunction makeLifecycle(cwd = process.cwd()): { store: PlanFileStore; lifecycle: PlanLifecycle } {\n const store = new PlanFileStore(cwd);\n return { store, lifecycle: new PlanLifecycle(store) };\n}\n\nfunction statusColor(status: PlanStatus): string {\n switch (status) {\n case \"draft\":\n return pc.dim(status);\n case \"approved\":\n return pc.cyan(status);\n case \"executing\":\n return pc.yellow(status);\n case \"complete\":\n return pc.green(status);\n case \"abandoned\":\n return pc.red(status);\n }\n}\n\nfunction renderPlan(plan: PlanSpec): string {\n const lines: string[] = [];\n lines.push(`${pc.bold(plan.title)} ${statusColor(plan.status)}`);\n lines.push(pc.dim(plan.id));\n lines.push(\"\");\n lines.push(`${pc.bold(\"Brief:\")} ${plan.brief}`);\n if (plan.filesToTouch.length > 0) {\n lines.push(\"\");\n lines.push(pc.bold(\"Files to touch:\"));\n for (const file of plan.filesToTouch) {\n lines.push(` ${file.action.padEnd(6)} ${file.path}${file.notes ? ` — ${file.notes}` : \"\"}`);\n }\n }\n if (plan.testsToAdd.length > 0) {\n lines.push(\"\");\n lines.push(pc.bold(\"Tests to add:\"));\n for (const test of plan.testsToAdd) {\n lines.push(` ${test.path}${test.description ? ` — ${test.description}` : \"\"}`);\n }\n }\n if (plan.outOfScope.length > 0) {\n lines.push(\"\");\n lines.push(pc.bold(\"Out of scope:\"));\n for (const item of plan.outOfScope) lines.push(` - ${item}`);\n }\n if (plan.risks.length > 0) {\n lines.push(\"\");\n lines.push(pc.bold(\"Risks:\"));\n for (const item of plan.risks) lines.push(` - ${item}`);\n }\n if (plan.commitSha) {\n lines.push(\"\");\n lines.push(`${pc.bold(\"Commit:\")} ${plan.commitSha}`);\n }\n lines.push(\"\");\n lines.push(pc.dim(\"─\".repeat(40)));\n lines.push(plan.body);\n return lines.join(\"\\n\");\n}\n\nfunction openEditor(path: string): Promise<void> {\n const editor = process.env.EDITOR ?? process.env.VISUAL ?? \"vi\";\n return new Promise((resolve, reject) => {\n const child = spawn(editor, [path], { stdio: \"inherit\" });\n child.on(\"error\", reject);\n child.on(\"close\", () => resolve());\n });\n}\n\nfunction runGit(args: string[]): Promise<{ code: number; stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n const child = spawn(\"git\", args, { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n let stdout = \"\";\n let stderr = \"\";\n child.stdout.on(\"data\", (c) => {\n stdout += String(c);\n });\n child.stderr.on(\"data\", (c) => {\n stderr += String(c);\n });\n child.on(\"error\", reject);\n child.on(\"close\", (code) => resolve({ code: code ?? 0, stdout, stderr }));\n });\n}\n\nexport function registerPlanCommands(\n program: Command,\n runSafely: (fn: () => Promise<void>) => Promise<void>,\n): void {\n const plan = program.command(\"plan\").description(\"Author and manage durable Markdown plans.\");\n\n // ── 02.4 read/create ──────────────────────────────────────────────\n plan\n .command(\"new\")\n .argument(\"<brief...>\", \"One-line description of the work.\")\n .option(\"--title <title>\", \"Plan title (defaults to the brief).\")\n .option(\"--no-edit\", \"Skip opening $EDITOR after creating the draft.\")\n .description(\"Create a draft plan and open it in $EDITOR.\")\n .action(async (briefParts: string[], opts: { title?: string; edit?: boolean }) => {\n await runSafely(async () => {\n const { lifecycle } = makeLifecycle();\n const namespace = await resolveNamespaceFrom();\n const brief = briefParts.join(\" \");\n const created = await lifecycle.create({\n namespace,\n title: opts.title ?? brief,\n brief,\n });\n console.log(`${pc.green(\"created\")} ${created.id} (${statusColor(created.status)})`);\n if (opts.edit !== false && process.stdin.isTTY) {\n await openEditor(created.path);\n // Re-read to validate the developer's edits.\n const { store } = makeLifecycle();\n await store.readPlan(created.id);\n console.log(pc.dim(\"saved and validated\"));\n }\n console.log(pc.dim(relative(process.cwd(), created.path)));\n });\n });\n\n plan\n .command(\"list\")\n .option(\"--status <status>\", \"Filter by status.\")\n .option(\"--all\", \"Include completed and abandoned plans.\")\n .description(\"List plans in the current namespace.\")\n .action(async (opts: { status?: string; all?: boolean }) => {\n await runSafely(async () => {\n const { store } = makeLifecycle();\n const namespace = await resolveNamespaceFrom();\n let plans = (await store.listPlans()).filter((p) => p.namespace === namespace);\n if (opts.status) plans = plans.filter((p) => p.status === opts.status);\n else if (!opts.all)\n plans = plans.filter((p) => p.status !== \"complete\" && p.status !== \"abandoned\");\n if (plans.length === 0) {\n console.log(pc.dim(\"no plans\"));\n return;\n }\n for (const p of plans) {\n console.log(`${statusColor(p.status).padEnd(20)} ${pc.bold(p.title)} ${pc.dim(p.id)}`);\n }\n });\n });\n\n plan\n .command(\"show\")\n .argument(\"<id>\")\n .description(\"Show a single plan.\")\n .action(async (id: string) => {\n await runSafely(async () => {\n const { store } = makeLifecycle();\n console.log(renderPlan(await store.readPlan(id)));\n });\n });\n\n plan\n .command(\"edit\")\n .argument(\"<id>\")\n .description(\"Open a plan in $EDITOR and validate on save.\")\n .action(async (id: string) => {\n await runSafely(async () => {\n const { store } = makeLifecycle();\n const existing = await store.readPlan(id);\n await openEditor(existing.path);\n await store.readPlan(id);\n console.log(pc.dim(\"saved and validated\"));\n });\n });\n\n // ── 02.5 lifecycle ────────────────────────────────────────────────\n plan\n .command(\"approve\")\n .argument(\"<id>\")\n .description(\"Promote a draft to approved (one active plan per namespace).\")\n .action(async (id: string) => {\n await runSafely(async () => {\n const { lifecycle } = makeLifecycle();\n const next = await lifecycle.approve(id);\n console.log(`${next.id} → ${statusColor(next.status)}`);\n });\n });\n\n plan\n .command(\"start\")\n .argument(\"<id>\")\n .description(\"Move an approved plan to executing.\")\n .action(async (id: string) => {\n await runSafely(async () => {\n const { lifecycle } = makeLifecycle();\n const next = await lifecycle.start(id);\n console.log(`${next.id} → ${statusColor(next.status)}`);\n });\n });\n\n plan\n .command(\"complete\")\n .argument(\"<id>\")\n .option(\"--commit <sha>\", \"Git commit the plan was completed in.\")\n .option(\"--notes <text>\", \"Completion notes.\")\n .description(\"Mark an executing plan complete.\")\n .action(async (id: string, opts: { commit?: string; notes?: string }) => {\n await runSafely(async () => {\n const { lifecycle } = makeLifecycle();\n const next = await lifecycle.complete(id, {\n ...(opts.commit ? { commitSha: opts.commit } : {}),\n ...(opts.notes ? { notes: opts.notes } : {}),\n });\n if (!opts.commit) console.log(pc.yellow(\"note: no --commit supplied\"));\n console.log(`${next.id} → ${statusColor(next.status)}`);\n });\n });\n\n plan\n .command(\"abandon\")\n .argument(\"<id>\")\n .option(\"--reason <text>\", \"Why the plan was abandoned.\")\n .description(\"Abandon a plan without completing it.\")\n .action(async (id: string, opts: { reason?: string }) => {\n await runSafely(async () => {\n const { lifecycle } = makeLifecycle();\n const next = await lifecycle.abandon(id, opts.reason ? { reason: opts.reason } : {});\n console.log(`${next.id} → ${statusColor(next.status)}`);\n });\n });\n\n plan\n .command(\"diff\")\n .argument(\"<id>\")\n .option(\"--from <ref>\", \"Git ref to compare from.\", \"HEAD\")\n .option(\"--to <ref>\", \"Git ref to compare to.\")\n .description(\"Show the git diff of a plan file between two revisions.\")\n .action(async (id: string, opts: { from: string; to?: string }) => {\n await runSafely(async () => {\n const { store } = makeLifecycle();\n const plan = await store.readPlan(id);\n const relPath = relative(process.cwd(), plan.path);\n const args = [\"diff\", opts.from, ...(opts.to ? [opts.to] : []), \"--\", relPath];\n const result = await runGit(args);\n if (result.stdout.trim().length === 0) {\n console.log(pc.dim(\"no changes\"));\n } else {\n process.stdout.write(result.stdout);\n }\n if (result.code !== 0 && result.stderr) process.stderr.write(result.stderr);\n });\n });\n\n // ── 02.7 policy ───────────────────────────────────────────────────\n plan\n .command(\"policy\")\n .argument(\"[mode]\", `One of: ${PLAN_POLICIES.join(\", \")}. Omit to read the current value.`)\n .description(\"Read or set the plan policy (off | suggest | required).\")\n .action(async (mode: string | undefined) => {\n await runSafely(async () => {\n if (mode === undefined) {\n console.log(await loadPlanPolicy());\n return;\n }\n if (!(PLAN_POLICIES as readonly string[]).includes(mode)) {\n throw new Error(`Invalid policy \"${mode}\". Use one of: ${PLAN_POLICIES.join(\", \")}.`);\n }\n await setPlanPolicy(mode as PlanPolicy);\n console.log(`${pc.green(\"plan policy\")} = ${mode}`);\n });\n });\n}\n","import type { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { resolveNamespaceFrom } from \"../../core/config-file.js\";\nimport { assessRisk } from \"../../risk/service.js\";\nimport type { Assessment, Evidence } from \"../../risk/types.js\";\n\nexport function registerRiskCommands(\n program: Command,\n runSafely: (fn: () => Promise<void>) => Promise<void>,\n): void {\n const risk = program.command(\"risk\").description(\"Assess evidence-backed change risk.\");\n\n risk\n .command(\"assess\")\n .option(\"--plan <id>\", \"Assess paths listed in a CodeBuddy plan.\")\n .option(\"--paths <paths>\", \"Comma-separated repo-relative paths to assess.\")\n .option(\"--git\", \"Assess staged, unstaged, and untracked git changes.\")\n .option(\"--limit <n>\", \"Maximum risk items to show.\", Number)\n .option(\"--json\", \"Print machine-readable JSON.\")\n .option(\"--explain\", \"Show evidence for each risk item.\")\n .description(\"Assess risk for a plan, explicit paths, or current git changes.\")\n .action(\n async (opts: {\n plan?: string;\n paths?: string;\n git?: boolean;\n limit?: number;\n json?: boolean;\n explain?: boolean;\n }) => {\n await runSafely(async () => {\n const namespace = await resolveNamespaceFrom();\n const assessment = await assessRisk({\n namespace,\n ...(opts.plan ? { planId: opts.plan } : {}),\n ...(opts.paths ? { paths: parsePaths(opts.paths) } : {}),\n ...(opts.git !== undefined ? { useGit: opts.git } : {}),\n ...(opts.limit !== undefined ? { limit: opts.limit } : {}),\n });\n if (opts.json) {\n console.log(JSON.stringify(assessment, null, 2));\n return;\n }\n printAssessment(assessment, opts.explain ?? false);\n });\n },\n );\n}\n\nfunction parsePaths(value: string): string[] {\n return value\n .split(\",\")\n .map((path) => path.trim())\n .filter(Boolean);\n}\n\nfunction printAssessment(assessment: Assessment, explain: boolean): void {\n if (assessment.items.length === 0) {\n console.log(pc.dim(\"no risk evidence found\"));\n return;\n }\n for (const item of assessment.items) {\n console.log(\n `${pc.bold(item.path)} score ${scoreColor(item.score)} category ${pc.cyan(item.category)}`,\n );\n console.log(` ${item.reason}`);\n if (explain) {\n for (const evidence of item.evidence) console.log(` ↳ ${formatEvidence(evidence)}`);\n } else {\n console.log(pc.dim(` ${item.evidence.length} evidence item(s)`));\n }\n }\n console.log(\n pc.dim(\n `\\n${assessment.stats.itemsProduced} item(s), ${assessment.stats.signalsRun} signal(s), ${assessment.stats.pathsConsidered} path(s) considered`,\n ),\n );\n}\n\nfunction scoreColor(score: number): string {\n if (score >= 75) return pc.red(String(score));\n if (score >= 50) return pc.yellow(String(score));\n return pc.green(String(score));\n}\n\nfunction formatEvidence(evidence: Evidence): string {\n switch (evidence.kind) {\n case \"memory_fact\":\n return `memory ${evidence.factId}: ${truncate(evidence.content, 90)}`;\n case \"git_commit\":\n return `commit ${evidence.sha.slice(0, 7)} ${evidence.ts}: ${evidence.message}`;\n case \"policy_rule\":\n return `policy ${evidence.ruleId}: ${evidence.pattern}`;\n case \"dependent_module\":\n return `dependent ${evidence.path} depth=${evidence.depth}`;\n case \"ci_failure\":\n return `ci ${evidence.runId} ${evidence.conclusion} ${evidence.ts}`;\n }\n}\n\nfunction truncate(value: string, max: number): string {\n return value.length <= max ? value : `${value.slice(0, max - 1)}…`;\n}\n","import { relative } from \"node:path\";\nimport type { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport {\n AUTOMATION_MODES,\n CLIENT_ADAPTERS,\n parseClient,\n parseMode,\n supportedModes,\n} from \"../../clients/adapters.js\";\nimport { defaultRulesMode, installWorkflowRules } from \"../../templates/install.js\";\nimport {\n clientDisplayName,\n renderWorkflowTemplate,\n WORKFLOW_CLIENTS,\n type WorkflowClient,\n} from \"../../templates/workflow.js\";\n\n/**\n * Without `--mode`, follow the installed hooks: hook-driven rules when this\n * client's CodeBuddy hooks are present, agent-driven otherwise.\n */\nasync function resolveMode(client: WorkflowClient, value: string | undefined) {\n if (value) {\n const mode = parseMode(value);\n if (!supportedModes(CLIENT_ADAPTERS[client]).includes(mode)) {\n throw new Error(`${clientDisplayName(client)} does not support --mode ${mode}.`);\n }\n return mode;\n }\n return defaultRulesMode(client);\n}\n\n/**\n * `codebuddy rules` prints and installs the client workflow templates. Install\n * is file-based and visible: it writes a clearly-marked managed block into the\n * client's Markdown rules file (CLAUDE.md / AGENTS.md) and reports exactly what\n * changed. The user stays in control of their client config.\n */\nexport function registerRulesCommands(\n program: Command,\n runSafely: (fn: () => Promise<void>) => Promise<void>,\n): void {\n const rules = program\n .command(\"rules\")\n .description(\"Print or install the client workflow templates (CLAUDE.md / AGENTS.md).\");\n\n rules\n .command(\"show\")\n .option(\"--client <client>\", `One of: ${WORKFLOW_CLIENTS.join(\", \")}.`, \"claude\")\n .option(\"--mode <mode>\", \"agent or hooks (default: follows installed hooks).\")\n .description(\"Print the workflow template for a client.\")\n .action(async (opts: { client?: string; mode?: string }) => {\n await runSafely(async () => {\n const client = parseClient(opts.client);\n const mode = await resolveMode(client, opts.mode);\n if (mode === \"mcp-only\") {\n console.log(\"MCP-only mode installs no workflow rules.\");\n return;\n }\n console.log(renderWorkflowTemplate(client, mode));\n });\n });\n\n rules\n .command(\"install\")\n .option(\"--client <client>\", `One of: ${WORKFLOW_CLIENTS.join(\", \")}.`, \"claude\")\n .option(\"--path <file>\", \"Override the target rules file.\")\n .option(\n \"--mode <mode>\",\n `One of: ${AUTOMATION_MODES.join(\", \")} (default: follows installed hooks; mcp-only removes the block).`,\n )\n .description(\"Install/update the workflow template in the client's rules file (managed block).\")\n .action(async (opts: { client?: string; path?: string; mode?: string }) => {\n await runSafely(async () => {\n const client = parseClient(opts.client);\n const result = await installWorkflowRules({\n client,\n mode: await resolveMode(client, opts.mode),\n ...(opts.path ? { targetPath: opts.path } : {}),\n });\n const where = relative(process.cwd(), result.path) || result.path;\n console.log(\n `${actionLabel(result.action)} ${clientDisplayName(client)} workflow in ${where}`,\n );\n if (result.action !== \"unchanged\") {\n console.log(pc.dim(\" managed block between codebuddy:workflow markers; safe to re-run\"));\n }\n });\n });\n}\n\nfunction actionLabel(action: string): string {\n switch (action) {\n case \"created\":\n return pc.green(\"created\");\n case \"added\":\n return pc.green(\"added\");\n case \"updated\":\n return pc.cyan(\"updated\");\n case \"removed\":\n return pc.yellow(\"removed\");\n default:\n return pc.dim(\"unchanged\");\n }\n}\n","import type { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { resolveNamespaceFrom } from \"../../core/config-file.js\";\nimport { generateSuggestions } from \"../../suggest/engine.js\";\nimport type { Suggestion, SuggestionSeverity } from \"../../suggest/types.js\";\n\n/**\n * `codebuddy suggest` is read-only and file-based (risk, plan, map, memory),\n * so it runs without a database — the same lightweight path as risk/context.\n */\n\nfunction parsePaths(value: string): string[] {\n return value\n .split(\",\")\n .map((path) => path.trim())\n .filter(Boolean);\n}\n\nexport function registerSuggestCommand(\n program: Command,\n runSafely: (fn: () => Promise<void>) => Promise<void>,\n): void {\n program\n .command(\"suggest\")\n .option(\"--paths <paths>\", \"Comma-separated repo-relative paths to review.\")\n .option(\"--plan <id>\", \"Review the files listed in a plan.\")\n .option(\"--git\", \"Review current git changes.\")\n .option(\"--limit <n>\", \"Maximum suggestions to show.\", Number)\n .option(\"--json\", \"Print machine-readable JSON.\")\n .description(\"Suggest evidence-backed, read-only code-quality improvements.\")\n .action(\n async (opts: {\n paths?: string;\n plan?: string;\n git?: boolean;\n limit?: number;\n json?: boolean;\n }) => {\n await runSafely(async () => {\n const namespace = await resolveNamespaceFrom();\n const result = await generateSuggestions({\n namespace,\n ...(opts.paths ? { paths: parsePaths(opts.paths) } : {}),\n ...(opts.plan ? { planId: opts.plan } : {}),\n ...(opts.git !== undefined ? { useGit: opts.git } : {}),\n ...(opts.limit !== undefined ? { limit: opts.limit } : {}),\n });\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n printSuggestions(result.suggestions);\n console.log(\n pc.dim(\n `\\n${result.stats.produced} suggestion(s) across ${result.stats.pathsConsidered} path(s)`,\n ),\n );\n });\n },\n );\n}\n\nfunction printSuggestions(suggestions: Suggestion[]): void {\n if (suggestions.length === 0) {\n console.log(pc.dim(\"no suggestions — nothing high-signal to report\"));\n return;\n }\n for (const suggestion of suggestions) {\n console.log(`${severityBadge(suggestion.severity)} ${pc.bold(suggestion.title)}`);\n console.log(` ${suggestion.detail}`);\n for (const evidence of suggestion.evidence) {\n console.log(pc.dim(` ↳ ${evidence.kind}: ${evidence.detail}`));\n }\n if (suggestion.commandHint) console.log(pc.dim(` → ${suggestion.commandHint}`));\n }\n}\n\nfunction severityBadge(severity: SuggestionSeverity): string {\n switch (severity) {\n case \"high\":\n return pc.red(\"[high]\");\n case \"medium\":\n return pc.yellow(\"[med ]\");\n case \"low\":\n return pc.cyan(\"[low ]\");\n default:\n return pc.dim(\"[info]\");\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { extractSymbolTable, supportsSymbols } from \"../../indexer/symbols.js\";\n\n/**\n * `codebuddy symbols <path>` inspects a file's symbol table — the basis for\n * symbol-level context (Roadmap N.3, shipped). File-based; no database.\n */\nexport function registerSymbolsCommand(\n program: Command,\n runSafely: (fn: () => Promise<void>) => Promise<void>,\n): void {\n program\n .command(\"symbols\")\n .argument(\"<path>\", \"Repo-relative or absolute path to a code file.\")\n .option(\"--json\", \"Print machine-readable JSON.\")\n .description(\"List a file's top-level symbols (functions, classes, types, exports).\")\n .action(async (path: string, opts: { json?: boolean }) => {\n await runSafely(async () => {\n if (!supportsSymbols(path)) {\n console.log(pc.dim(`no symbol extraction for ${path} (unsupported language)`));\n return;\n }\n const content = await readFile(resolve(path), \"utf8\");\n const table = extractSymbolTable(content, path);\n\n if (opts.json) {\n console.log(JSON.stringify({ path, symbols: table }, null, 2));\n return;\n }\n\n if (table.length === 0) {\n console.log(pc.dim(\"no top-level symbols found\"));\n return;\n }\n for (const symbol of table) {\n const badge = symbol.exported ? pc.green(\"export\") : pc.dim(\"local \");\n console.log(\n `${badge} ${pc.cyan(symbol.kind.padEnd(9))} ${pc.bold(symbol.name)} ${pc.dim(`L${symbol.startLine}-${symbol.endLine}`)}`,\n );\n }\n console.log(pc.dim(`\\n${table.length} symbol(s)`));\n });\n });\n}\n","import type { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { startCollector } from \"../../telemetry/collector.js\";\nimport {\n readTelemetryState,\n TELEMETRY_NOTICE,\n telemetryBlocked,\n telemetryStatePath,\n telemetryUrl,\n writeTelemetryState,\n} from \"../../telemetry/telemetry.js\";\n\nexport function registerTelemetryCommands(\n program: Command,\n runSafely: (fn: () => Promise<void>) => Promise<void>,\n): void {\n const telemetry = program\n .command(\"telemetry\")\n .description(\"Show or change anonymous usage telemetry (no prompts, code or paths).\");\n\n telemetry\n .command(\"status\")\n .description(\"Show whether this machine sends anonymous usage data.\")\n .action(async () => {\n await runSafely(async () => {\n const state = await readTelemetryState();\n const blocked = telemetryBlocked(state);\n console.log(\n blocked\n ? `${pc.yellow(\"○\")} telemetry off (${blocked})`\n : `${pc.green(\"●\")} telemetry on`,\n );\n console.log(pc.dim(` install id ${state.installId} (${telemetryStatePath()})`));\n if (telemetryUrl()) console.log(pc.dim(` collector ${telemetryUrl()}`));\n });\n });\n\n telemetry\n .command(\"enable\")\n .description(\"Allow anonymous usage data from this machine.\")\n .action(async () => {\n await runSafely(async () => {\n const state = await readTelemetryState();\n await writeTelemetryState({\n installId: state.installId,\n noticeAt: state.noticeAt ?? new Date().toISOString(),\n });\n console.log(TELEMETRY_NOTICE);\n console.log(pc.green(\"Telemetry enabled.\"));\n });\n });\n\n telemetry\n .command(\"disable\")\n .description(\"Stop sending anonymous usage data from this machine.\")\n .action(async () => {\n await runSafely(async () => {\n const state = await readTelemetryState();\n await writeTelemetryState({ ...state, disabled: true });\n console.log(\"Telemetry disabled. Nothing more is sent from this machine.\");\n });\n });\n\n program\n .command(\"collector\")\n .description(\"[admin] Receive anonymous telemetry and serve the usage admin panel.\")\n .option(\"--data <dir>\", \"Where events are stored (one JSONL file per day).\", \"./telemetry-data\")\n .option(\n \"--ingest-port <port>\",\n \"127.0.0.1 port for POST /v1/events (expose publicly).\",\n Number,\n 8787,\n )\n .option(\n \"--admin-port <port>\",\n \"127.0.0.1 port for the admin panel (keep private).\",\n Number,\n 8788,\n )\n .action(async (opts: { data: string; ingestPort: number; adminPort: number }) => {\n await runSafely(async () => {\n const collector = await startCollector({\n dataDir: opts.data,\n ingestPort: opts.ingestPort,\n adminPort: opts.adminPort,\n ...(process.env.CODEBUDDY_ADMIN_PASSWORD\n ? { adminPassword: process.env.CODEBUDDY_ADMIN_PASSWORD }\n : {}),\n });\n console.log(`${pc.green(\"●\")} ingest ${pc.bold(collector.ingestUrl)}`);\n console.log(`${pc.green(\"●\")} admin ${pc.bold(collector.adminUrl)}`);\n console.log(\n pc.dim(\n process.env.CODEBUDDY_ADMIN_PASSWORD\n ? \" admin panel is password-protected (CODEBUDDY_ADMIN_PASSWORD).\"\n : \" admin panel has no password: keep it private, or set CODEBUDDY_ADMIN_PASSWORD.\",\n ),\n );\n console.log(pc.dim(` events in ${opts.data}. Ctrl+C to stop.`));\n await new Promise<void>((resolve) => {\n const stop = () => void collector.close().then(resolve);\n process.once(\"SIGINT\", stop);\n process.once(\"SIGTERM\", stop);\n });\n });\n });\n}\n","import { createHash, timingSafeEqual } from \"node:crypto\";\nimport { appendFile, mkdir, readdir, readFile } from \"node:fs/promises\";\nimport { createServer, type IncomingMessage, type Server } from \"node:http\";\nimport type { AddressInfo } from \"node:net\";\nimport { join } from \"node:path\";\nimport { z } from \"zod\";\nimport { ADMIN_HTML } from \"./admin-page.js\";\n\n/**\n * `codebuddy collector`: receives anonymous telemetry batches\n * (`telemetry.ts`) and serves the admin panel. Two listeners, both on\n * 127.0.0.1 so a reverse proxy decides who reaches them: the ingest port\n * (`POST /v1/events` only, meant for `tailscale funnel`) and the admin port\n * (page + read API). With `adminPassword` the admin port asks for it (HTTP\n * Basic auth, any user name) and may be published, e.g. as `/admin` on the\n * funnel; without one it must stay private (`tailscale serve`). Events are\n * appended to one JSONL file per UTC day in `dataDir`.\n */\n\nconst MAX_BODY_BYTES = 256 * 1024;\n/** Batches per install per hour; a normal install sends ~6. */\nconst INSTALL_BATCHES_PER_HOUR = 30;\n/** Batches per minute across everyone, so a flood cannot fill the disk. */\nconst GLOBAL_BATCHES_PER_MINUTE = 600;\nconst NPM_PACKAGE = \"@orquentra/codebuddy\";\n\nconst name = z.string().regex(/^[A-Za-z][A-Za-z0-9_:.-]{0,63}$/);\nconst short = z.string().max(64);\nconst batchSchema = z.object({\n installId: z.string().uuid(),\n project: z.string().regex(/^[0-9a-f]{16}$/),\n version: short,\n platform: short,\n arch: short,\n node: short,\n clients: z.array(name).max(10),\n events: z\n .array(\n z.object({\n ts: z.string().datetime(),\n kind: name,\n name,\n ms: z.number().int().min(0).max(86_400_000),\n ok: z.boolean(),\n tokensIn: z.number().int().min(0).max(10_000_000).optional(),\n tokensOut: z.number().int().min(0).max(10_000_000).optional(),\n session: z\n .string()\n .regex(/^[0-9a-f]{16}$/)\n .optional(),\n }),\n )\n .min(1)\n .max(500),\n});\n\n/** One stored line: the batch metadata flattened onto each event. */\nexport type StoredEvent = Omit<z.infer<typeof batchSchema>, \"events\"> &\n z.infer<typeof batchSchema>[\"events\"][number] & { receivedAt: string };\n\nexport type CollectorHandle = { ingestUrl: string; adminUrl: string; close(): Promise<void> };\n\nexport async function startCollector(options: {\n dataDir: string;\n ingestPort?: number;\n adminPort?: number;\n /** Required for the admin panel when set; needed before it is made public. */\n adminPassword?: string;\n fetchImpl?: typeof fetch;\n}): Promise<CollectorHandle> {\n const { dataDir } = options;\n await mkdir(dataDir, { recursive: true });\n let summaryCache: { at: number; days: number; value: Summary } | undefined;\n let npmCache: { at: number; value: unknown } | undefined;\n const perInstall = new Map<string, number>();\n let globalCount = 0;\n const resetInstalls = setInterval(() => perInstall.clear(), 3_600_000);\n const resetGlobal = setInterval(() => {\n globalCount = 0;\n }, 60_000);\n resetInstalls.unref();\n resetGlobal.unref();\n\n const ingest = createServer(async (request, response) => {\n const url = new URL(request.url ?? \"/\", \"http://localhost\");\n if (url.pathname !== \"/v1/events\") {\n response.writeHead(404).end();\n return;\n }\n if (request.method !== \"POST\") {\n response.writeHead(405).end();\n return;\n }\n if (++globalCount > GLOBAL_BATCHES_PER_MINUTE) {\n response.writeHead(429).end();\n return;\n }\n const body = await readBody(request);\n if (body === null) {\n response.writeHead(413, { connection: \"close\" }).end();\n return;\n }\n let batch: z.infer<typeof batchSchema>;\n try {\n batch = batchSchema.parse(JSON.parse(body));\n } catch {\n response.writeHead(400).end();\n return;\n }\n const seen = (perInstall.get(batch.installId) ?? 0) + 1;\n perInstall.set(batch.installId, seen);\n if (seen > INSTALL_BATCHES_PER_HOUR) {\n response.writeHead(429).end();\n return;\n }\n const receivedAt = new Date().toISOString();\n const { events, ...meta } = batch;\n const lines = events.map((event) => JSON.stringify({ ...meta, ...event, receivedAt }));\n await appendFile(\n join(dataDir, `events-${receivedAt.slice(0, 10)}.jsonl`),\n `${lines.join(\"\\n\")}\\n`,\n );\n response.writeHead(204).end();\n summaryCache = undefined;\n });\n\n const admin = createServer(async (request, response) => {\n // DNS rebinding: only localhost and Tailscale (`*.ts.net`) host names are answered.\n const host = (request.headers.host ?? \"\").replace(/:\\d+$/, \"\");\n if (host !== \"127.0.0.1\" && host !== \"localhost\" && !host.endsWith(\".ts.net\")) {\n response.writeHead(403, { \"content-type\": \"text/plain\" }).end(\"Forbidden host\");\n return;\n }\n if (options.adminPassword && !passwordMatches(request, options.adminPassword)) {\n response\n .writeHead(401, {\n \"www-authenticate\": 'Basic realm=\"CodeBuddy admin\", charset=\"UTF-8\"',\n \"content-type\": \"text/plain\",\n })\n .end(\"Password required\");\n return;\n }\n if (request.method !== \"GET\") {\n response.writeHead(405).end();\n return;\n }\n const url = new URL(request.url ?? \"/\", \"http://localhost\");\n // Served at `/` or under a proxy mount (`/admin`) that may not be stripped.\n url.pathname = url.pathname.replace(/^\\/admin(?=\\/|$)/, \"\") || \"/\";\n const json = (value: unknown) => {\n response.writeHead(200, { \"content-type\": \"application/json\", \"cache-control\": \"no-store\" });\n response.end(JSON.stringify(value));\n };\n if (url.pathname === \"/\") {\n response.writeHead(200, {\n \"content-type\": \"text/html; charset=utf-8\",\n \"cache-control\": \"no-store\",\n });\n response.end(ADMIN_HTML);\n return;\n }\n if (url.pathname === \"/api/summary\") {\n const days = Math.min(365, Math.max(1, Number(url.searchParams.get(\"days\")) || 30));\n if (!summaryCache || summaryCache.days !== days || Date.now() - summaryCache.at > 30_000) {\n summaryCache = {\n at: Date.now(),\n days,\n value: summarize(await readEvents(dataDir, days), days),\n };\n }\n json(summaryCache.value);\n return;\n }\n if (url.pathname === \"/api/npm\") {\n if (!npmCache || Date.now() - npmCache.at > 3_600_000) {\n npmCache = { at: Date.now(), value: await npmDownloads(options.fetchImpl ?? fetch) };\n }\n json(npmCache.value);\n return;\n }\n response.writeHead(404, { \"content-type\": \"text/plain\" }).end(\"Not found\");\n });\n\n const ingestPort = await listen(ingest, options.ingestPort ?? 8787);\n const adminPort = await listen(admin, options.adminPort ?? 8788);\n const close = (server: Server) =>\n new Promise<void>((resolve) => {\n server.closeAllConnections();\n server.close(() => resolve());\n });\n return {\n ingestUrl: `http://127.0.0.1:${ingestPort}/v1/events`,\n adminUrl: `http://127.0.0.1:${adminPort}/`,\n close: async () => {\n clearInterval(resetInstalls);\n clearInterval(resetGlobal);\n await Promise.all([close(ingest), close(admin)]);\n },\n };\n}\n\n/** HTTP Basic auth, any user name; compared in constant time. */\nfunction passwordMatches(request: IncomingMessage, password: string): boolean {\n const header = request.headers.authorization ?? \"\";\n if (!header.startsWith(\"Basic \")) return false;\n const decoded = Buffer.from(header.slice(6), \"base64\").toString(\"utf8\");\n const given = decoded.slice(decoded.indexOf(\":\") + 1);\n const digest = (value: string) => createHash(\"sha256\").update(value).digest();\n return timingSafeEqual(digest(given), digest(password));\n}\n\nfunction readBody(request: IncomingMessage): Promise<string | null> {\n return new Promise((resolve) => {\n const chunks: Buffer[] = [];\n let size = 0;\n request.on(\"data\", (chunk: Buffer) => {\n size += chunk.length;\n // Over the limit: stop buffering; the 413 closes the connection.\n if (size > MAX_BODY_BYTES) resolve(null);\n else chunks.push(chunk);\n });\n request.on(\"end\", () => resolve(Buffer.concat(chunks).toString(\"utf8\")));\n request.on(\"error\", () => resolve(null));\n });\n}\n\nfunction listen(server: Server, port: number): Promise<number> {\n return new Promise((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(port, \"127.0.0.1\", () => resolve((server.address() as AddressInfo).port));\n });\n}\n\n/** Events received in the last `days` UTC days. */\n// ponytail: whole files read per summary (cached 30 s); move to PostgreSQL past ~1M events/month.\nexport async function readEvents(\n dataDir: string,\n days: number,\n now = Date.now(),\n): Promise<StoredEvent[]> {\n const since = new Date(now - (days - 1) * 86_400_000).toISOString().slice(0, 10);\n const files = (await readdir(dataDir).catch(() => [] as string[]))\n .filter((file) => /^events-\\d{4}-\\d{2}-\\d{2}\\.jsonl$/.test(file) && file.slice(7, 17) >= since)\n .sort();\n const events: StoredEvent[] = [];\n for (const file of files) {\n for (const line of (await readFile(join(dataDir, file), \"utf8\")).split(\"\\n\")) {\n if (!line) continue;\n try {\n events.push(JSON.parse(line) as StoredEvent);\n } catch {\n // A torn append; skip it.\n }\n }\n }\n return events;\n}\n\nexport type Summary = ReturnType<typeof summarize>;\n\nexport function summarize(events: StoredEvent[], days: number, now = Date.now()) {\n const day = (iso: string) => iso.slice(0, 10);\n const today = day(new Date(now).toISOString());\n const activeWithin = (window: number) => {\n const since = day(new Date(now - (window - 1) * 86_400_000).toISOString());\n return new Set(events.filter((e) => day(e.receivedAt) >= since).map((e) => e.installId)).size;\n };\n const daily = new Map<string, { installs: Set<string>; events: number }>();\n for (let index = days - 1; index >= 0; index -= 1) {\n daily.set(day(new Date(now - index * 86_400_000).toISOString()), {\n installs: new Set(),\n events: 0,\n });\n }\n const firstSeen = new Map<string, string>();\n const tools = new Map<\n string,\n { calls: number; errors: number; installs: Set<string>; ms: number[] }\n >();\n const kinds = new Map<string, number>();\n const latest = new Map<string, StoredEvent>();\n const users = new Map<\n string,\n {\n lastSeen: string;\n events: number;\n sessions: Set<string>;\n projects: Set<string>;\n features: Map<string, number>;\n }\n >();\n let errors = 0;\n let tokensOut = 0;\n for (const event of events) {\n const bucket = daily.get(day(event.receivedAt));\n if (bucket) {\n bucket.installs.add(event.installId);\n bucket.events += 1;\n }\n const seen = firstSeen.get(event.installId);\n if (!seen || event.receivedAt < seen) firstSeen.set(event.installId, event.receivedAt);\n latest.set(event.installId, event);\n const user = users.get(event.installId) ?? {\n lastSeen: event.receivedAt,\n events: 0,\n sessions: new Set<string>(),\n projects: new Set<string>(),\n features: new Map<string, number>(),\n };\n if (event.receivedAt > user.lastSeen) user.lastSeen = event.receivedAt;\n user.events += 1;\n if (event.session) user.sessions.add(event.session);\n user.projects.add(event.project);\n const feature = event.kind === \"tool\" ? event.name : event.kind;\n user.features.set(feature, (user.features.get(feature) ?? 0) + 1);\n users.set(event.installId, user);\n kinds.set(event.kind, (kinds.get(event.kind) ?? 0) + 1);\n if (!event.ok) errors += 1;\n tokensOut += event.tokensOut ?? 0;\n const key = event.kind === \"tool\" ? event.name : `${event.kind}`;\n const tool = tools.get(key) ?? { calls: 0, errors: 0, installs: new Set(), ms: [] };\n tool.calls += 1;\n if (!event.ok) tool.errors += 1;\n tool.installs.add(event.installId);\n tool.ms.push(event.ms);\n tools.set(key, tool);\n }\n const newPerDay = new Map<string, number>();\n for (const seen of firstSeen.values())\n newPerDay.set(day(seen), (newPerDay.get(day(seen)) ?? 0) + 1);\n /** Installs per value of a field, from each install's latest batch. */\n const share = (pick: (event: StoredEvent) => string[]) => {\n const counts = new Map<string, number>();\n for (const event of latest.values()) {\n for (const value of pick(event)) counts.set(value, (counts.get(value) ?? 0) + 1);\n }\n return [...counts]\n .map(([label, installs]) => ({ label, installs }))\n .sort((a, b) => b.installs - a.installs);\n };\n const median = (values: number[]) => {\n const sorted = [...values].sort((a, b) => a - b);\n return sorted[Math.floor(sorted.length / 2)] ?? 0;\n };\n return {\n generatedAt: new Date(now).toISOString(),\n days,\n totals: {\n installs: firstSeen.size,\n projects: new Set(events.map((e) => `${e.installId}:${e.project}`)).size,\n sessions: new Set(events.filter((e) => e.session).map((e) => e.session)).size,\n events: events.length,\n errorRate: events.length ? errors / events.length : 0,\n tokensOut,\n active1d: activeWithin(1),\n active7d: activeWithin(7),\n active30d: activeWithin(30),\n newToday: newPerDay.get(today) ?? 0,\n },\n daily: [...daily].map(([date, bucket]) => ({\n date,\n installs: bucket.installs.size,\n events: bucket.events,\n newInstalls: newPerDay.get(date) ?? 0,\n })),\n features: [...tools]\n .map(([label, tool]) => ({\n label,\n calls: tool.calls,\n installs: tool.installs.size,\n errorRate: tool.errors / tool.calls,\n p50ms: median(tool.ms),\n }))\n .sort((a, b) => b.calls - a.calls)\n .slice(0, 20),\n kinds: [...kinds].map(([label, count]) => ({ label, count })).sort((a, b) => b.count - a.count),\n clients: share((e) => (e.clients.length ? e.clients : [\"unknown\"])),\n versions: share((e) => [e.version]),\n platforms: share((e) => [`${e.platform}/${e.arch}`]),\n nodes: share((e) => [`node ${e.node}`]),\n /** One row per install, most recently active first. */\n users: [...users]\n .map(([installId, user]) => {\n const last = latest.get(installId);\n return {\n install: installId.slice(0, 8),\n firstSeen: firstSeen.get(installId) ?? user.lastSeen,\n lastSeen: user.lastSeen,\n events: user.events,\n sessions: user.sessions.size,\n projects: user.projects.size,\n client: last?.clients.join(\",\") || \"unknown\",\n version: last?.version ?? \"\",\n platform: last ? `${last.platform}/${last.arch}` : \"\",\n topFeature: [...user.features].sort((a, b) => b[1] - a[1])[0]?.[0] ?? \"\",\n };\n })\n .sort((a, b) => b.lastSeen.localeCompare(a.lastSeen))\n .slice(0, 1_000),\n recent: events\n .slice(-50)\n .reverse()\n .map((e) => ({\n receivedAt: e.receivedAt,\n install: e.installId.slice(0, 8),\n kind: e.kind,\n name: e.name,\n ms: e.ms,\n ok: e.ok,\n version: e.version,\n client: e.clients.join(\",\") || \"unknown\",\n })),\n };\n}\n\n/** Daily npm downloads for the last year, from the public npm API. */\nasync function npmDownloads(fetchImpl: typeof fetch) {\n const to = new Date().toISOString().slice(0, 10);\n const from = new Date(Date.now() - 364 * 86_400_000).toISOString().slice(0, 10);\n try {\n const response = await fetchImpl(\n `https://api.npmjs.org/downloads/range/${from}:${to}/${NPM_PACKAGE}`,\n { signal: AbortSignal.timeout(5_000) },\n );\n if (!response.ok) return { error: `npm API ${response.status}` };\n const body = (await response.json()) as {\n downloads?: Array<{ day: string; downloads: number }>;\n };\n return { package: NPM_PACKAGE, downloads: body.downloads ?? [] };\n } catch (error) {\n return { error: (error as Error).message };\n }\n}\n","/**\n * The collector's admin panel: self-contained (no CDN), reads `/api/summary`\n * and `/api/npm`, refreshes every 60 s. One hue (blue) for every chart: each\n * shows a single measure, so no legend is needed. Every value shown is escaped.\n */\nexport const ADMIN_HTML = `<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>CodeBuddy Usage</title>\n<style>\n:root {\n --bg: #f4f4f2; --panel: #fcfcfb; --fg: #0b0b0b; --muted: #52514e; --line: #e2e1dc;\n --bar: #2a78d6; --bar-soft: #e3edfa; --bad: #b42318;\n --sans: ui-sans-serif, -apple-system, \"Segoe UI\", Roboto, sans-serif;\n --mono: ui-monospace, \"SF Mono\", Menlo, Consolas, monospace;\n}\n@media (prefers-color-scheme: dark) { :root {\n --bg: #121211; --panel: #1a1a19; --fg: #f0efec; --muted: #c3c2b7; --line: #2e2e2b;\n --bar: #3987e5; --bar-soft: #1d2b3d; --bad: #f97066; color-scheme: dark } }\n* { box-sizing: border-box; }\nbody { margin: 0; background: var(--bg); color: var(--fg); font: 14px/1.5 var(--sans); }\n.wrap { max-width: 1200px; margin: 0 auto; padding: 20px 16px 48px; display: grid; gap: 16px; }\n.wrap > * { min-width: 0; }\nheader { display: flex; flex-wrap: wrap; align-items: center; gap: 12px 20px; }\nh1 { font-size: 20px; margin: 0; letter-spacing: -.01em; }\nh1 small { font: 500 13px var(--mono); color: var(--muted); margin-left: 8px; }\nh2 { font-size: 13px; margin: 0 0 10px; text-transform: uppercase; letter-spacing: .08em; color: var(--muted); font-weight: 600; }\n.spacer { flex: 1; }\n.seg { display: inline-flex; border: 1px solid var(--line); border-radius: 8px; overflow: hidden; background: var(--panel); }\n.seg button { border: 0; background: none; color: var(--muted); font: 500 12px var(--sans); padding: 6px 12px; cursor: pointer; }\n.seg button + button { border-left: 1px solid var(--line); }\n.seg button[aria-pressed=\"true\"] { background: var(--fg); color: var(--bg); }\n.seg button:focus-visible { outline: 2px solid var(--bar); outline-offset: -2px; }\n.kpis { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 12px; }\n.kpi { background: var(--panel); border: 1px solid var(--line); border-radius: 10px; padding: 12px 14px; }\n.kpi .label { font-size: 12px; color: var(--muted); }\n.kpi .value { font: 600 28px/1.2 var(--mono); font-variant-numeric: tabular-nums; margin-top: 4px; }\n.kpi .sub { font-size: 12px; color: var(--muted); margin-top: 2px; }\n.panel { background: var(--panel); border: 1px solid var(--line); border-radius: 10px; padding: 14px 16px; min-width: 0; position: relative; }\n.cols { display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); gap: 16px; }\n.chart svg { display: block; width: 100%; height: 180px; }\n.chart rect.hit { fill: transparent; }\n.chart rect.hit:hover + rect.mark, .chart rect.mark:hover { opacity: .75; }\nsvg text { fill: var(--muted); font: 11px var(--mono); }\n.tip { position: absolute; pointer-events: none; background: var(--fg); color: var(--bg); font: 12px var(--mono); padding: 4px 8px; border-radius: 6px; white-space: nowrap; display: none; z-index: 2; }\n.rows { display: grid; gap: 6px; }\n.row { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 2px 12px; font-size: 13px; }\n.row .track { grid-column: 1 / -1; height: 6px; background: var(--bar-soft); border-radius: 3px; }\n.row .fill { height: 6px; background: var(--bar); border-radius: 3px; }\n.row .n { font-family: var(--mono); font-variant-numeric: tabular-nums; color: var(--muted); }\n.scroll { overflow-x: auto; }\ntable { width: 100%; border-collapse: collapse; font-size: 13px; }\nth { text-align: left; font: 600 11px var(--sans); text-transform: uppercase; letter-spacing: .06em; color: var(--muted); padding: 6px 8px; border-bottom: 1px solid var(--line); white-space: nowrap; }\ntd { padding: 6px 8px; border-bottom: 1px solid var(--line); white-space: nowrap; }\ntr:last-child td { border-bottom: 0; }\ntd.n, th.n { text-align: right; font-family: var(--mono); font-variant-numeric: tabular-nums; }\n.bad { color: var(--bad); }\n.muted { color: var(--muted); }\n.mono { font-family: var(--mono); }\n.btn { border: 1px solid var(--line); background: var(--panel); color: var(--fg); font: 500 12px var(--sans); padding: 6px 12px; border-radius: 8px; cursor: pointer; }\n.btn:focus-visible { outline: 2px solid var(--bar); outline-offset: 2px; }\n.users { max-height: 560px; overflow: auto; }\n.users thead th { position: sticky; top: 0; background: var(--panel); }\n.empty { padding: 32px 16px; text-align: center; color: var(--muted); }\n</style>\n</head>\n<body>\n<div class=\"wrap\">\n <header>\n <h1>CodeBuddy usage<small id=\"updated\"></small></h1>\n <span class=\"spacer\"></span>\n <div class=\"seg\" role=\"group\" aria-label=\"Time range\" id=\"range\">\n <button data-days=\"7\">7 days</button>\n <button data-days=\"30\" aria-pressed=\"true\">30 days</button>\n <button data-days=\"90\">90 days</button>\n <button data-days=\"365\">1 year</button>\n </div>\n </header>\n <section class=\"kpis\" id=\"kpis\" aria-label=\"Summary\"></section>\n <div class=\"cols\">\n <section class=\"panel\"><h2>Daily active installs</h2><div class=\"chart\" id=\"active\"></div></section>\n <section class=\"panel\"><h2>npm downloads per day</h2><div class=\"chart\" id=\"npm\"></div></section>\n </div>\n <section class=\"panel\"><h2>Feature usage</h2><div class=\"scroll\" id=\"features\"></div></section>\n <div class=\"cols\">\n <section class=\"panel\"><h2>Agent clients</h2><div class=\"rows\" id=\"clients\"></div></section>\n <section class=\"panel\"><h2>Versions</h2><div class=\"rows\" id=\"versions\"></div></section>\n <section class=\"panel\"><h2>Platforms</h2><div class=\"rows\" id=\"platforms\"></div></section>\n </div>\n <section class=\"panel\">\n <div style=\"display:flex;align-items:center;gap:12px;margin-bottom:10px\"><h2 style=\"margin:0\">Users</h2><span class=\"muted\" id=\"userCount\" style=\"font-size:12px\"></span><span class=\"spacer\"></span><button class=\"btn\" id=\"csv\">Download CSV</button></div>\n <div class=\"scroll users\" id=\"users\"></div>\n </section>\n <section class=\"panel\"><h2>Latest events</h2><div class=\"scroll\" id=\"recent\"></div></section>\n <p class=\"muted\" style=\"margin:0;font-size:12px\">Anonymous telemetry from installs that did not opt out: random install ids, tool names, timings and versions. No prompts, code, paths or repository names are collected. Shares count each install once, from its latest batch.</p>\n</div>\n<div class=\"tip\" id=\"tip\"></div>\n<script>\n(function () {\n var days = 30;\n // Works at \"/\" and under a proxy mount such as \"/admin\" (with or without a trailing slash).\n var base = location.pathname.replace(/\\\\/?$/, \"/\");\n var summary = null;\n var npm = null;\n var tip = document.getElementById(\"tip\");\n\n function esc(value) {\n return String(value == null ? \"\" : value).replace(/[&<>\"']/g, function (c) {\n return { \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\", \"'\": \"&#39;\" }[c];\n });\n }\n function num(n) { return Math.round(n).toLocaleString(); }\n function compact(n) { return n >= 1e6 ? (n / 1e6).toFixed(1) + \"M\" : n >= 1e4 ? (n / 1e3).toFixed(1) + \"k\" : num(n); }\n function pct(n) { return (n * 100).toFixed(n < 0.1 ? 1 : 0) + \"%\"; }\n function ms(n) { return n >= 1000 ? (n / 1000).toFixed(1) + \" s\" : Math.round(n) + \" ms\"; }\n\n function kpi(label, value, sub) {\n return '<div class=\"kpi\"><div class=\"label\">' + esc(label) + '</div><div class=\"value\">' + esc(value) +\n '</div><div class=\"sub\">' + esc(sub || \"\") + \"</div></div>\";\n }\n\n /** Bars of one measure over days; hover shows the exact value. */\n function bars(points, label) {\n if (!points.length) return '<div class=\"empty\">No data yet.</div>';\n var w = 600, h = 180, top = 10, bottom = 22, left = 36;\n var max = Math.max.apply(null, points.map(function (p) { return p.value; }).concat([1]));\n var step = (w - left) / points.length;\n var bw = Math.max(1, step - 2);\n var out = '<svg viewBox=\"0 0 ' + w + \" \" + h + '\" preserveAspectRatio=\"none\" role=\"img\" aria-label=\"' + esc(label) + '\">';\n [0, 0.5, 1].forEach(function (f) {\n var y = top + (h - top - bottom) * (1 - f);\n out += '<line x1=\"' + left + '\" x2=\"' + w + '\" y1=\"' + y + '\" y2=\"' + y + '\" stroke=\"var(--line)\" stroke-width=\"1\"/>';\n out += '<text x=\"' + (left - 6) + '\" y=\"' + (y + 4) + '\" text-anchor=\"end\">' + esc(compact(max * f)) + \"</text>\";\n });\n points.forEach(function (p, i) {\n var bh = (h - top - bottom) * (p.value / max);\n var x = left + i * step + 1;\n var tipText = esc(p.date + \" · \" + num(p.value) + \" \" + label);\n out += '<rect class=\"hit\" x=\"' + (left + i * step) + '\" y=\"' + top + '\" width=\"' + step + '\" height=\"' + (h - top - bottom) + '\" data-tip=\"' + tipText + '\"/>';\n out += '<rect class=\"mark\" x=\"' + x + '\" y=\"' + (h - bottom - bh) + '\" width=\"' + bw + '\" height=\"' + bh + '\" rx=\"' + Math.min(2, bw / 2) + '\" fill=\"var(--bar)\" data-tip=\"' + tipText + '\"/>';\n });\n var first = points[0].date, last = points[points.length - 1].date;\n out += '<text x=\"' + left + '\" y=\"' + (h - 6) + '\">' + esc(first) + '</text><text x=\"' + w + '\" y=\"' + (h - 6) + '\" text-anchor=\"end\">' + esc(last) + \"</text>\";\n return out + \"</svg>\";\n }\n\n function rows(items, total) {\n if (!items.length) return '<div class=\"muted\">No data yet.</div>';\n return items.slice(0, 8).map(function (item) {\n var share = total ? item.installs / total : 0;\n return '<div class=\"row\"><span>' + esc(item.label) + '</span><span class=\"n\">' + num(item.installs) + \" · \" + pct(share) +\n '</span><div class=\"track\"><div class=\"fill\" style=\"width:' + (share * 100).toFixed(1) + '%\"></div></div></div>';\n }).join(\"\");\n }\n\n function npmPoints() {\n if (!npm || !npm.downloads) return [];\n return npm.downloads.slice(-Math.min(days, 365)).map(function (d) { return { date: d.day, value: d.downloads }; });\n }\n function npmTotal(n) {\n if (!npm || !npm.downloads) return null;\n return npm.downloads.slice(-n).reduce(function (sum, d) { return sum + d.downloads; }, 0);\n }\n\n function render() {\n if (!summary) return;\n var t = summary.totals;\n var npm30 = npmTotal(30), npm365 = npmTotal(365);\n document.getElementById(\"updated\").textContent = \"updated \" + new Date(summary.generatedAt).toLocaleTimeString();\n document.getElementById(\"kpis\").innerHTML =\n kpi(\"Active installs · 7 days\", num(t.active7d), num(t.active1d) + \" today\") +\n kpi(\"Active installs · 30 days\", num(t.active30d), num(t.newToday) + \" new today\") +\n kpi(\"Installs in range\", num(t.installs), num(t.projects) + \" projects\") +\n kpi(\"Agent sessions\", num(t.sessions), \"in \" + summary.days + \" days\") +\n kpi(\"Events\", compact(t.events), pct(1 - t.errorRate) + \" succeeded\") +\n kpi(\"Tokens delivered\", compact(t.tokensOut), \"context sent to agents\") +\n kpi(\"npm downloads · 30 days\", npm30 == null ? \"–\" : num(npm30), npm365 == null ? (npm && npm.error ? npm.error : \"\") : num(npm365) + \" in the last year\");\n document.getElementById(\"active\").innerHTML = bars(summary.daily.map(function (d) { return { date: d.date, value: d.installs }; }), \"active installs\");\n document.getElementById(\"npm\").innerHTML = npm && npm.error ? '<div class=\"empty\">' + esc(npm.error) + \"</div>\" : bars(npmPoints(), \"downloads\");\n document.getElementById(\"features\").innerHTML = summary.features.length\n ? \"<table><thead><tr><th>Feature</th><th class=\\\\\"n\\\\\">Calls</th><th class=\\\\\"n\\\\\">Installs</th><th class=\\\\\"n\\\\\">Median</th><th class=\\\\\"n\\\\\">Errors</th></tr></thead><tbody>\" +\n summary.features.map(function (f) {\n return \"<tr><td class=\\\\\"mono\\\\\">\" + esc(f.label) + '</td><td class=\"n\">' + num(f.calls) + '</td><td class=\"n\">' + num(f.installs) +\n '</td><td class=\"n\">' + ms(f.p50ms) + '</td><td class=\"n' + (f.errorRate > 0.05 ? \" bad\" : \"\") + '\">' + pct(f.errorRate) + \"</td></tr>\";\n }).join(\"\") + \"</tbody></table>\"\n : '<div class=\"empty\">No events yet. Installs send a batch at most every 10 minutes.</div>';\n var installs = summary.versions.reduce(function (sum, v) { return sum + v.installs; }, 0);\n document.getElementById(\"clients\").innerHTML = rows(summary.clients, installs);\n document.getElementById(\"versions\").innerHTML = rows(summary.versions, installs);\n document.getElementById(\"platforms\").innerHTML = rows(summary.platforms, installs);\n document.getElementById(\"userCount\").textContent = num(summary.users.length) + \" installs seen in \" + summary.days + \" days\";\n document.getElementById(\"users\").innerHTML = summary.users.length\n ? \"<table><thead><tr><th>Install</th><th>First seen</th><th>Last active</th><th class=\\\\\"n\\\\\">Events</th><th class=\\\\\"n\\\\\">Sessions</th><th class=\\\\\"n\\\\\">Projects</th><th>Client</th><th>Version</th><th>Platform</th><th>Top feature</th></tr></thead><tbody>\" +\n summary.users.map(function (u) {\n return '<tr><td class=\"mono\">' + esc(u.install) + \"</td><td>\" + esc(new Date(u.firstSeen).toLocaleDateString()) + \"</td><td>\" + esc(new Date(u.lastSeen).toLocaleString()) +\n '</td><td class=\"n\">' + num(u.events) + '</td><td class=\"n\">' + num(u.sessions) + '</td><td class=\"n\">' + num(u.projects) + \"</td><td>\" + esc(u.client) +\n '</td><td class=\"mono\">' + esc(u.version) + \"</td><td>\" + esc(u.platform) + '</td><td class=\"mono\">' + esc(u.topFeature) + \"</td></tr>\";\n }).join(\"\") + \"</tbody></table>\"\n : '<div class=\"empty\">No users yet.</div>';\n document.getElementById(\"recent\").innerHTML = summary.recent.length\n ? \"<table><thead><tr><th>Received</th><th>Install</th><th>Kind</th><th>Name</th><th>Client</th><th>Version</th><th class=\\\\\"n\\\\\">Time</th><th>Result</th></tr></thead><tbody>\" +\n summary.recent.map(function (e) {\n return \"<tr><td>\" + esc(new Date(e.receivedAt).toLocaleString()) + '</td><td class=\"mono\">' + esc(e.install) + \"</td><td>\" + esc(e.kind) +\n '</td><td class=\"mono\">' + esc(e.name) + \"</td><td>\" + esc(e.client) + '</td><td class=\"mono\">' + esc(e.version) +\n '</td><td class=\"n\">' + ms(e.ms) + '</td><td class=\"' + (e.ok ? \"\" : \"bad\") + '\">' + (e.ok ? \"ok\" : \"error\") + \"</td></tr>\";\n }).join(\"\") + \"</tbody></table>\"\n : '<div class=\"empty\">No events yet.</div>';\n }\n\n function load() {\n fetch(base + \"api/summary?days=\" + days).then(function (r) { return r.json(); }).then(function (s) { summary = s; render(); });\n }\n fetch(base + \"api/npm\").then(function (r) { return r.json(); }).then(function (n) { npm = n; render(); });\n\n document.getElementById(\"range\").addEventListener(\"click\", function (event) {\n var button = event.target.closest(\"button\");\n if (!button) return;\n days = Number(button.dataset.days);\n document.querySelectorAll(\"#range button\").forEach(function (b) { b.setAttribute(\"aria-pressed\", String(b === button)); });\n load();\n });\n document.getElementById(\"csv\").addEventListener(\"click\", function () {\n if (!summary) return;\n var cols = [\"install\", \"firstSeen\", \"lastSeen\", \"events\", \"sessions\", \"projects\", \"client\", \"version\", \"platform\", \"topFeature\"];\n var lines = [cols.join(\",\")].concat(summary.users.map(function (u) {\n return cols.map(function (c) { return '\"' + String(u[c]).replace(/\"/g, '\"\"') + '\"'; }).join(\",\");\n }));\n var link = document.createElement(\"a\");\n link.href = URL.createObjectURL(new Blob([lines.join(\"\\\\n\")], { type: \"text/csv\" }));\n link.download = \"codebuddy-users-\" + new Date().toISOString().slice(0, 10) + \".csv\";\n link.click();\n });\n document.addEventListener(\"mousemove\", function (event) {\n var text = event.target.getAttribute && event.target.getAttribute(\"data-tip\");\n if (!text) { tip.style.display = \"none\"; return; }\n tip.textContent = text;\n tip.style.display = \"block\";\n var x = Math.min(event.pageX + 12, document.documentElement.scrollWidth - tip.offsetWidth - 8);\n tip.style.left = x + \"px\";\n tip.style.top = (event.pageY - 32) + \"px\";\n });\n load();\n setInterval(load, 60000);\n})();\n</script>\n</body>\n</html>\n`;\n","import { basename } from \"node:path\";\nimport { confirm, isCancel, log, note, password, select, spinner, text } from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport {\n initProjectScaffold,\n migrateLegacyNamespace,\n readConfigFile,\n writeConfigFile,\n} from \"../../core/config-file.js\";\nimport { mergeGlobalConfig, readGlobalConfig } from \"../../core/global-config.js\";\nimport { bootstrapDatabase } from \"../../db/bootstrap.js\";\nimport { createDatabaseClient, pingDatabase } from \"../../db/client.js\";\nimport { runMigrations } from \"../../db/migrator.js\";\nimport { indexRepository } from \"../../indexer/engine.js\";\nimport { setupGraphify } from \"../../integrations/graphify.js\";\nimport { writeProjectMcpConfig } from \"../../integrations/project-mcp.js\";\nimport { installWorkflowRules } from \"../../templates/install.js\";\nimport { installClaudeEntry } from \"./claude-desktop.js\";\nimport { installCodexEntry } from \"./codex.js\";\nimport {\n isDockerDaemonRunning,\n tryStartDockerDesktop,\n waitForDockerDaemon,\n} from \"./docker-autostart.js\";\nimport { postgresUp } from \"./postgres-docker.js\";\n\nexport type UseCommandOptions = {\n namespace?: string;\n postgresUrl?: string;\n skipClaude?: boolean;\n skipCodex?: boolean;\n graphify?: boolean;\n useDocker?: boolean;\n /**\n * Prompt for missing values (default: stdin is a TTY). When false, flags and\n * defaults are used; graphify and the bundled Docker database stay off unless\n * their flags are given, and a missing required value fails with a message.\n */\n interactive?: boolean;\n};\n\nfunction bail(): never {\n log.warn(\"Aborted.\");\n process.exit(1);\n}\n\nfunction unwrap<T>(value: T): Exclude<T, symbol> {\n if (isCancel(value)) bail();\n return value as Exclude<T, symbol>;\n}\n\nasync function pingOnce(databaseUrl: string): Promise<boolean> {\n const client = createDatabaseClient({ postgresUrl: databaseUrl });\n try {\n return await pingDatabase(client);\n } catch {\n return false;\n } finally {\n await client.close().catch(() => undefined);\n }\n}\n\nfunction sanitizeNamespace(input: string): string {\n return input.replace(/[^a-zA-Z0-9_.:-]/g, \"-\").slice(0, 128) || \"default\";\n}\n\nconst DEFAULT_DB_URL = \"postgres://codebuddy:codebuddy@localhost:5432/codebuddy\";\n\n/**\n * One-command setup for a project folder. Reuses any HF token + Postgres URL\n * the user has already saved in ~/.codebuddy/global.json; prompts only for\n * what is genuinely missing. Auto-starts Docker Desktop if needed, brings up\n * the bundled Postgres container, applies migrations, and (unless suppressed)\n * registers per-folder Claude Desktop and Codex entries.\n */\nexport async function runUseCommand(options: UseCommandOptions = {}): Promise<void> {\n const sigintHandler = () => bail();\n process.on(\"SIGINT\", sigintHandler);\n\n try {\n const interactive = options.interactive ?? process.stdin.isTTY === true;\n const folderName = basename(process.cwd());\n const namespace = sanitizeNamespace(options.namespace ?? folderName);\n await initProjectScaffold();\n // Persist the folder namespace up front so an abort later (e.g. Docker) still fixes it.\n if (options.namespace === undefined) await migrateLegacyNamespace();\n const graphifyEnabled =\n options.graphify ??\n (interactive &&\n unwrap(\n await confirm({\n message: \"Set up Graphify for richer architecture context?\",\n initialValue: true,\n }),\n ));\n note(\n `Project folder: ${pc.bold(process.cwd())}\\nNamespace: ${pc.bold(namespace)}`,\n \"codebuddy use\",\n );\n\n const stored = await readGlobalConfig();\n\n // ── Embeddings: local by default; hosted only when chosen ─────────\n const projectConfig = await readConfigFile();\n let embeddings = projectConfig.provider?.type;\n if (embeddings) {\n log.info(`Embeddings: ${embeddings} (change with ${pc.cyan(\"codebuddy models use\")}).`);\n } else if (!interactive) {\n embeddings = \"local\";\n } else {\n embeddings = unwrap(\n await select({\n message: \"Where should memory embeddings run?\",\n initialValue: \"local\" as const,\n options: [\n {\n value: \"local\" as const,\n label: \"On this machine\",\n hint: \"recommended · no key · ~90 MB once\",\n },\n {\n value: \"openrouter\" as const,\n label: \"OpenRouter\",\n hint: \"OPENROUTER_API_KEY · free models listed\",\n },\n {\n value: \"huggingface\" as const,\n label: \"Hugging Face\",\n hint: \"HF_TOKEN · small free monthly credit\",\n },\n ],\n }),\n );\n if (embeddings === \"openrouter\" && !process.env.OPENROUTER_API_KEY) {\n log.warn(\n \"Export OPENROUTER_API_KEY before your agent starts; keys are never stored in config.\",\n );\n }\n }\n\n let hfToken: string | undefined;\n if (embeddings !== \"huggingface\") {\n hfToken = process.env.HF_TOKEN ?? stored.hfToken;\n } else if (process.env.HF_TOKEN) {\n hfToken = process.env.HF_TOKEN;\n log.info(\"Using HF_TOKEN from environment.\");\n } else if (stored.hfToken) {\n hfToken = stored.hfToken;\n log.info(`Reusing saved Hugging Face token (${pc.dim(\"~/.codebuddy/global.json\")}).`);\n } else if (!interactive) {\n throw new Error(\n \"Hugging Face embeddings need a token: set HF_TOKEN (no terminal to prompt for it).\",\n );\n } else {\n hfToken = unwrap(\n await password({\n message: \"Hugging Face token (for hosted embeddings)\",\n }),\n );\n if (!hfToken) log.warn(\"No token: hosted embeddings will fail until HF_TOKEN is set.\");\n }\n\n // ── Postgres URL ────────────────────────────────────────────────\n const initialUrl =\n options.postgresUrl ?? process.env.DATABASE_URL ?? stored.databaseUrl ?? DEFAULT_DB_URL;\n const databaseUrl =\n options.postgresUrl ??\n (interactive\n ? unwrap(\n await text({\n message: \"Postgres URL (press Enter to accept)\",\n initialValue: initialUrl,\n validate: (value) =>\n value && value.length > 0 ? undefined : \"Postgres URL is required.\",\n }),\n )\n : initialUrl);\n\n // ── Make sure Postgres is reachable; spin Docker up if not ──────\n const dbSpinner = spinner();\n dbSpinner.start(\"Checking Postgres\");\n let connected = await pingOnce(databaseUrl);\n if (connected) dbSpinner.stop(\"Local Postgres reachable.\");\n\n if (!connected && databaseUrl === DEFAULT_DB_URL) {\n dbSpinner.stop(\"Postgres unreachable on the default local URL.\");\n }\n\n const shouldUseDocker =\n !connected &&\n databaseUrl === DEFAULT_DB_URL &&\n (options.useDocker ??\n (interactive &&\n unwrap(\n await confirm({\n message: \"Postgres is unavailable. Start the bundled Docker database now?\",\n initialValue: true,\n }),\n )));\n\n if (shouldUseDocker) {\n if (!(await isDockerDaemonRunning())) {\n const dockerSpinner = spinner();\n dockerSpinner.start(\"Starting Docker Desktop\");\n await tryStartDockerDesktop();\n const ready = await waitForDockerDaemon(60_000);\n if (!ready) {\n dockerSpinner.stop(\"Docker daemon did not start in 60s. Aborting.\");\n bail();\n }\n dockerSpinner.stop(\"Docker daemon is up.\");\n }\n const composeSpinner = spinner();\n composeSpinner.start(\"docker compose up -d\");\n try {\n const result = await postgresUp();\n if (result.code === 0) {\n composeSpinner.stop(\"Postgres container started.\");\n for (let attempt = 0; attempt < 12 && !connected; attempt++) {\n await new Promise((resolve) => setTimeout(resolve, 500));\n connected = await pingOnce(databaseUrl);\n }\n if (!connected) {\n log.warn(\"Container running but Postgres did not accept connections in time.\");\n }\n } else {\n composeSpinner.stop(`docker compose failed: ${result.stderr || result.stdout}`);\n }\n } catch (error) {\n composeSpinner.stop(`docker compose failed: ${(error as Error).message}`);\n }\n } else if (!connected) {\n dbSpinner.stop(connected ? \"Postgres reachable.\" : \"Postgres unreachable at this URL.\");\n log.warn(\n \"Local Postgres is required. Start it, set DATABASE_URL, pass --postgres-url, or allow the bundled Docker database (--docker).\",\n );\n bail();\n }\n\n if (!connected) bail();\n\n // ── pgvector + migrations ───────────────────────────────────────\n const migrateSpinner = spinner();\n migrateSpinner.start(\"Enabling pgvector + applying migrations\");\n {\n const client = createDatabaseClient({ postgresUrl: databaseUrl });\n try {\n await bootstrapDatabase(client.sql);\n await runMigrations(client);\n migrateSpinner.stop(\"Database ready.\");\n } catch (error) {\n migrateSpinner.stop(`Migration error: ${(error as Error).message}`);\n bail();\n } finally {\n await client.close().catch(() => undefined);\n }\n }\n\n // ── Persist defaults so the next project is even faster ─────────\n await mergeGlobalConfig({\n ...(hfToken ? { hfToken } : {}),\n databaseUrl,\n installPath: process.argv[1] ?? undefined,\n });\n\n const existingConfig = await readConfigFile();\n const indexSpinner = spinner();\n indexSpinner.start(\"Indexing the existing repository\");\n try {\n const result = await indexRepository({ repositoryRoot: process.cwd() });\n indexSpinner.stop(`Repository indexed (${result.totalIndexed} files).`);\n } catch (error) {\n indexSpinner.stop(`Repository indexing skipped: ${(error as Error).message}`);\n }\n const graphifySetup = graphifyEnabled\n ? await setupGraphify({ repositoryRoot: process.cwd() })\n : null;\n const graphifyConfigured = graphifySetup?.available === true && graphifySetup.generated;\n await writeConfigFile({\n ...existingConfig,\n postgresUrl: databaseUrl,\n namespace,\n provider: {\n ...existingConfig.provider,\n type: embeddings,\n ...(hfToken ? { apiKey: hfToken } : {}),\n },\n tokenBudget: existingConfig.tokenBudget ?? 4000,\n graphify: { enabled: graphifyConfigured, graphPath: \"graphify-out/graph.json\" },\n });\n\n const graphifyMessage =\n graphifySetup?.message ?? \"Graphify disabled; CodeBuddy MCP remains available.\";\n await writeProjectMcpConfig({\n repositoryRoot: process.cwd(),\n namespace,\n graphify: graphifyConfigured,\n ...(graphifySetup?.graphPath ? { graphPath: graphifySetup.graphPath } : {}),\n });\n await installWorkflowRules({ client: \"claude\", projectRoot: process.cwd() });\n await installWorkflowRules({ client: \"codex\", projectRoot: process.cwd() });\n\n // ── Wire Claude Desktop unless suppressed ───────────────────────\n if (!options.skipClaude) {\n try {\n const install = await installClaudeEntry({\n namespace,\n projectRoot: process.cwd(),\n ...(hfToken ? { hfToken } : {}),\n databaseUrl,\n });\n log.success(\n `Registered ${pc.bold(install.serverKey)} in Claude Desktop. Restart with ⌘Q to activate.`,\n );\n } catch (error) {\n log.warn(`Claude Desktop registration skipped: ${(error as Error).message}`);\n }\n }\n\n // ── Wire Codex unless suppressed ────────────────────────────────\n if (!options.skipCodex) {\n try {\n const install = await installCodexEntry({\n namespace,\n projectRoot: process.cwd(),\n ...(hfToken ? { hfToken } : {}),\n databaseUrl,\n });\n log.success(\n `Registered ${pc.bold(install.serverKey)} in Codex. Restart Codex to activate.`,\n );\n } catch (error) {\n log.warn(`Codex registration skipped: ${(error as Error).message}`);\n }\n }\n\n note(\n [\n `${pc.green(\"✓\")} CodeBuddy is ready for ${pc.bold(folderName)}.`,\n `${pc.green(\"✓\")} Scaffolded ${pc.cyan(\".codebuddy/policies.yaml\")} for project-specific guardrails.`,\n `${pc.green(\"✓\")} ${graphifyMessage}`,\n `${pc.green(\"✓\")} Added agent workflow instructions to ${pc.cyan(\"CLAUDE.md\")} and ${pc.cyan(\"AGENTS.md\")}.`,\n ``,\n `Next:`,\n ` 1. Restart Claude Desktop and Codex.`,\n ` 2. Ask Claude or Codex to use the ${pc.cyan(\"context_pack\")} tool for each coding task.`,\n ` 3. Indexing, Graphify, Markdown memory import, and embeddings now update automatically while the MCP server is running.`,\n ` 4. Run ${pc.cyan(\"codebuddy doctor\")} or ${pc.cyan(\"codebuddy db doctor\")} if you want a full health check.`,\n ``,\n `Manage:`,\n ` codebuddy claude list ${pc.dim(\"# see every project wired up\")}`,\n ` codebuddy codex list ${pc.dim(\"# see Codex entries\")}`,\n ` codebuddy db test ${pc.dim(\"# quick Postgres connectivity check\")}`,\n ` codebuddy claude remove codebuddy-${namespace}`,\n ` codebuddy codex remove codebuddy-${namespace}`,\n ` codebuddy postgres down ${pc.dim(\"# stop the DB (data preserved)\")}`,\n ].join(\"\\n\"),\n \"Done\",\n );\n } finally {\n process.off(\"SIGINT\", sigintHandler);\n }\n}\n","import { chmod, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { z } from \"zod\";\n\n/**\n * User-level configuration shared across all projects on this machine.\n * Stored at ~/.codebuddy/global.json with 0600 permissions so the HF token\n * is never world-readable. Per-project namespace is NOT stored here — that\n * is implicit in the directory the user runs `codebuddy use` from.\n */\n\nexport const GLOBAL_DIR = \".codebuddy\";\nexport const GLOBAL_FILE = \"global.json\";\n\nconst globalConfigSchema = z.object({\n hfToken: z.string().min(1).optional(),\n databaseUrl: z.string().min(1).optional(),\n // Where the codebuddy install lives on this machine. Cached so future\n // `codebuddy use` calls in unrelated projects can find the CLI entry\n // without re-resolving via process.argv every time.\n installPath: z.string().optional(),\n});\n\nexport type GlobalConfig = z.infer<typeof globalConfigSchema>;\n\nexport function globalConfigPath(home = homedir()): string {\n return join(home, GLOBAL_DIR, GLOBAL_FILE);\n}\n\nexport async function readGlobalConfig(home = homedir()): Promise<GlobalConfig> {\n const path = globalConfigPath(home);\n try {\n const raw = await readFile(path, \"utf8\");\n return globalConfigSchema.parse(JSON.parse(raw));\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return {};\n throw error;\n }\n}\n\nexport async function writeGlobalConfig(\n next: GlobalConfig,\n home = homedir(),\n): Promise<{ path: string }> {\n const path = globalConfigPath(home);\n await mkdir(dirname(path), { recursive: true, mode: 0o700 });\n await writeFile(path, `${JSON.stringify(next, null, 2)}\\n`, { mode: 0o600 });\n await chmod(path, 0o600);\n return { path };\n}\n\nexport async function mergeGlobalConfig(\n patch: GlobalConfig,\n home = homedir(),\n): Promise<{ path: string; merged: GlobalConfig }> {\n const current = await readGlobalConfig(home);\n const merged: GlobalConfig = { ...current, ...patch };\n const { path } = await writeGlobalConfig(merged, home);\n return { path, merged };\n}\n","import { relative } from \"node:path\";\nimport type { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { type WorklogEntry, WorklogStore } from \"../../worklog/store.js\";\n\n/**\n * The worklog is file-based Markdown under `.codebuddy/worklog/`; these\n * commands need no database. Entries are written automatically after turns\n * that changed files, so a new chat can see what earlier chats did.\n */\nexport function registerWorklogCommands(\n program: Command,\n runSafely: (fn: () => Promise<void>) => Promise<void>,\n): void {\n const worklog = program\n .command(\"worklog\")\n .description(\"Inspect the cross-chat worklog of completed turns.\");\n\n worklog\n .command(\"list\", { isDefault: true })\n .option(\"--limit <n>\", \"Maximum entries to show.\", \"20\")\n .option(\"--json\", \"Print machine-readable JSON.\")\n .description(\"List worklog entries, newest first.\")\n .action(async (opts: { limit: string; json?: boolean }) => {\n await runSafely(async () => {\n const entries = (await new WorklogStore().list()).slice(0, Number(opts.limit) || 20);\n if (opts.json) {\n console.log(JSON.stringify(entries, null, 2));\n return;\n }\n if (entries.length === 0) {\n console.log(pc.dim(\"no worklog entries yet\"));\n return;\n }\n for (const entry of entries) console.log(renderRow(entry));\n });\n });\n\n worklog\n .command(\"show\")\n .argument(\"<id>\")\n .description(\"Show a single worklog entry.\")\n .action(async (id: string) => {\n await runSafely(async () => {\n console.log(renderEntry(await new WorklogStore().read(id)));\n });\n });\n\n worklog\n .command(\"latest\")\n .description(\"Show the most recent worklog entry.\")\n .action(async () => {\n await runSafely(async () => {\n const [entry] = await new WorklogStore().list();\n console.log(entry ? renderEntry(entry) : pc.dim(\"no worklog entries yet\"));\n });\n });\n}\n\nfunction renderRow(entry: WorklogEntry): string {\n const summary = entry.summary.replace(/\\s+/g, \" \");\n const short = summary.length <= 70 ? summary : `${summary.slice(0, 69)}…`;\n return `${pc.dim(entry.createdAt.slice(0, 16))} ${pc.dim(entry.id)} ${short} ${pc.dim(`(${entry.files.length} file(s))`)}`;\n}\n\nfunction renderEntry(entry: WorklogEntry): string {\n const lines = [`${pc.bold(entry.id)} ${pc.dim(entry.createdAt)} ${pc.dim(entry.namespace)}`];\n if (entry.sourceSessionId) lines.push(`${pc.bold(\"session:\")} ${entry.sourceSessionId}`);\n if (entry.sourcePlanId) lines.push(`${pc.bold(\"plan:\")} ${entry.sourcePlanId}`);\n if (entry.commitSha) lines.push(`${pc.bold(\"commit:\")} ${entry.commitSha}`);\n if (entry.files.length > 0) lines.push(`${pc.bold(\"files:\")} ${entry.files.join(\", \")}`);\n if (entry.verification.length > 0) {\n lines.push(`${pc.bold(\"verification:\")}`, ...entry.verification.map((line) => ` - ${line}`));\n }\n if (entry.savedMemory.length > 0) {\n lines.push(`${pc.bold(\"saved memory:\")} ${entry.savedMemory.join(\", \")}`);\n }\n if (entry.queuedForReview.length > 0) {\n lines.push(`${pc.bold(\"queued for review:\")} ${entry.queuedForReview.join(\", \")}`);\n }\n lines.push(\"\", entry.summary, \"\", pc.dim(relative(process.cwd(), entry.path)));\n return lines.join(\"\\n\");\n}\n","import type { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { setZvecEnabled } from \"../../core/config-file.js\";\nimport { buildZvecIndex, DEFAULT_ZVEC_MODEL, zvecStatus } from \"../../retrieval/zvec.js\";\n\n/**\n * Optional zvec-grep semantic retrieval. CodeBuddy never builds a zg index on\n * its own; `codebuddy zvec index` is the explicit step.\n */\nexport function registerZvecCommands(\n program: Command,\n runSafely: (fn: () => Promise<void>) => Promise<void>,\n): void {\n const zvec = program\n .command(\"zvec\")\n .description(\"Optional zvec-grep semantic file discovery for the context tools.\");\n\n zvec\n .command(\"status\", { isDefault: true })\n .option(\"--json\", \"Print machine-readable JSON.\")\n .description(\"Show whether zvec-grep is enabled, installed, supported and indexed.\")\n .action(async (opts: { json?: boolean }) => {\n await runSafely(async () => {\n const report = await zvecStatus(process.cwd());\n if (opts.json) {\n console.log(JSON.stringify(report, null, 2));\n return;\n }\n const mark = (ok: boolean) => (ok ? pc.green(\"yes\") : pc.yellow(\"no\"));\n console.log(`enabled: ${mark(report.enabled)}`);\n console.log(`binary: ${report.binary}`);\n console.log(\n `version: ${report.version ?? pc.yellow(\"not found\")}${report.version && !report.supported ? pc.yellow(\" (unsupported; need 0.2.x)\") : \"\"}`,\n );\n console.log(`index ready: ${mark(report.indexReady)}`);\n console.log(\n `zg server: ${report.server} ${pc.dim(\"(running = faster queries; optional)\")}`,\n );\n console.log(`status: ${report.reason}`);\n if (!report.version) console.log(pc.dim(\"install: npm install -g @zvec/zvec-grep\"));\n else if (report.supported && !report.indexReady)\n console.log(pc.dim(\"next: codebuddy zvec index\"));\n else if (report.indexReady && !report.enabled)\n console.log(pc.dim(\"next: codebuddy zvec enable\"));\n });\n });\n\n zvec\n .command(\"index\")\n .option(\"--model <model>\", \"Embedding model for a new index.\", DEFAULT_ZVEC_MODEL)\n .option(\"--rebuild\", \"Rebuild the index from scratch (e.g. after changing model).\")\n .description(\"Build or refresh the zg index for this repository (explicit; never automatic).\")\n .action(async (opts: { model: string; rebuild?: boolean }) => {\n await runSafely(async () => {\n const code = await buildZvecIndex(process.cwd(), {\n model: opts.model,\n ...(opts.rebuild ? { rebuild: true } : {}),\n });\n if (code !== 0) throw new Error(`zg index exited with code ${code}`);\n console.log(pc.dim(\"next: codebuddy zvec enable (.zvec-grep/ ignores itself in git)\"));\n });\n });\n\n zvec\n .command(\"enable\")\n .description(\"Use zvec-grep candidates in context_pack / context_before_edit.\")\n .action(async () => {\n await runSafely(async () => {\n await setZvecEnabled(true);\n console.log(\n `${pc.green(\"enabled\")} zvec-grep retrieval (falls back to keywords if unavailable)`,\n );\n });\n });\n\n zvec\n .command(\"disable\")\n .description(\"Stop using zvec-grep; keyword ranking only.\")\n .action(async () => {\n await runSafely(async () => {\n await setZvecEnabled(false);\n console.log(`${pc.yellow(\"disabled\")} zvec-grep retrieval`);\n });\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,eAAe;AACxB,OAAOA,UAAQ;;;ACDf,SAAS,iBAAiB;AAC1B,SAAS,QAAQ,OAAO,iBAAiB;AACzC,SAAS,SAAS,MAAM,eAAe;AAGhC,IAAM,0BAA0B;AAOhC,SAAS,qBAAqB,UAAU,SAAiB;AAC9D,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8EAuBqE,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiDrF;AAEA,eAAsB,sBACpB,iBAAiB,QAAQ,IAAI,GAC7B,UAA+B,CAAC,GACM;AACtC,QAAM,OAAO,QAAQ,cAAc;AACnC,QAAM,OAAO,KAAK,MAAM,uBAAuB;AAC/C,MAAI,CAAC,QAAQ,OAAO;AAClB,QAAI;AACF,YAAM,OAAO,MAAM,UAAU,IAAI;AACjC,aAAO,EAAE,MAAM,SAAS,MAAM;AAAA,IAChC,QAAQ;AAAA,IAER;AAAA,EACF;AACA,QAAM,MAAM,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9C,QAAM,UAAU,MAAM,qBAAqB,GAAG,MAAM;AACpD,SAAO,EAAE,MAAM,SAAS,KAAK;AAC/B;;;ACvGA,OAAO,QAAQ;;;ACDf,SAAS,aAAa;AACtB,SAAS,eAAe;AAoBxB,IAAM,kBAAkB,oBAAI,IAAI,CAAC,OAAO,QAAQ,OAAO,QAAQ,QAAQ,MAAM,CAAC;AAC9E,IAAM,0BAA0B;AAChC,IAAM,wBAAwB;AAoB9B,eAAsB,kBAAkB,OAAiD;AACvF,QAAM,iBAAiB,MAAM,kBAAkB,QAAQ,IAAI;AAC3D,QAAM,wBAAwB,MAAM,OAAO,UAAU,KAAK,KAAK,MAAM,WAAW;AAChF,QAAM,QACJ,MAAM,WAAW,SAAS,CAAC,uBACvB,CAAC,IACD,MAAM,iBAAiB;AAAA,IACrB;AAAA,IACA,GAAI,MAAM,UAAU,SAAY,EAAE,OAAO,MAAM,MAAM,IAAI,CAAC;AAAA,IAC1D,GAAI,MAAM,WAAW,SAAY,EAAE,QAAQ,MAAM,OAAO,IAAI,CAAC;AAAA,IAC7D,GAAI,MAAM,WAAW,SAAY,EAAE,QAAQ,MAAM,OAAO,IAAI,EAAE,QAAQ,KAAK;AAAA,EAC7E,CAAC;AAEP,QAAM,YAAY,IAAI,cAAc,cAAc;AAClD,QAAM,CAAC,MAAM,aAAa,MAAM,YAAY,IAAI,MAAM,QAAQ,IAAI;AAAA,IAChE,MAAM,WAAW,IACb,QAAQ,QAAQ,gBAAgB,CAAC,IACjC,WAAW;AAAA,MACT;AAAA,MACA,WAAW,MAAM;AAAA,MACjB;AAAA,MACA,GAAI,MAAM,WAAW,SAAY,EAAE,QAAQ,MAAM,OAAO,IAAI,CAAC;AAAA,MAC7D,GAAI,MAAM,WAAW,SAAY,EAAE,QAAQ,MAAM,OAAO,IAAI,CAAC;AAAA,IAC/D,CAAC;AAAA,IACL,MAAM,WAAW,IACb,QAAQ,QAAQ,iBAAiB,CAAC,IAClC,oBAAoB,EAAE,gBAAgB,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,IAC7E,oBAAoB,WAAW,MAAM,WAAW,MAAM,MAAM;AAAA,IAC5D,MAAM,eACF,0BAA0B,MAAM,cAAc,cAAc,IAC5D,qBAAqB,cAAc,EAAE,KAAK,CAACC,UAAS,EAAE,KAAAA,MAAK,SAAS,KAAK,EAAE;AAAA,EACjF,CAAC;AAED,QAAM,cAAc,cAAc,MAAM,KAAK;AAC7C,QAAM,eAAe,kBAAkB,OAAO,aAAa,WAAW;AACtE,QAAM,EAAE,KAAK,SAAS,gBAAgB,IAAI;AAC1C,QAAM,mBAAmB,gBAAgB,IAAI,OAAO,KAAK;AACzD,QAAM,eAAe,KAAK,MAAM,OAAO,CAAC,SAAS,SAAS,KAAK,IAAI,SAAS,KAAK,KAAK,GAAG,CAAC;AAC1F,QAAM,SAAS,UAAU,OAAO,cAAc,aAAa,YAAY;AAEvE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,MAAM,EAAE,cAAc,OAAO,KAAK,MAAM;AAAA,IACxC,cAAc;AAAA,MACZ;AAAA,MACA,iBAAiB,OAAO,OAAO,gBAAgB,EAAE,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC;AAAA,MACtF,QAAQ,MAAM,gBAAgB,CAAC,kBAAkB,aAAa;AAAA,MAC9D,GAAI,kBAAkB,EAAE,SAAS,gBAAgB,IAAI,CAAC;AAAA,IACxD;AAAA,IACA,aAAa,YAAY;AAAA,IACzB;AAAA,EACF;AACF;AAGA,eAAsB,aAAa,OAA6D;AAC9F,QAAM,SAAS,MAAM,kBAAkB,KAAK;AAC5C,QAAM,WAAW,MAAM,UACnB,EAAE,SAAS,MAAM,SAAS,QAAQ,WAAoB,IACtD,MAAM,oBAAoB,MAAM,kBAAkB,QAAQ,IAAI,CAAC;AAEnE,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,MACL;AAAA,MACA,MAAM;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,QACE;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,MAAM,MAAM;AAAA,MACV,SAAS;AAAA,MACT,SAAS;AAAA,MACT,MAAM,kBAAkB,QAAQ,IAAI;AAAA,MACpC,MAAM,aAAa;AAAA,IACrB;AAAA,EACF;AACF;AAGA,eAAe,oBACb,gBACgE;AAChE,QAAM,UAAU,MAAM,kBAAkB,cAAc;AACtD,MAAI,YAAY,KAAM,QAAO;AAC7B,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,6BAA6B,KAAK,OAAO,IAAI,mBAAmB;AAAA,EAC1E;AACF;AAEA,SAAS,eACP,SACA,QACA,gBACA,WAC2B;AAC3B,MAAI,CAAC,OAAO,SAAS,SAAS,KAAK,aAAa,GAAG;AACjD,UAAM,IAAI,MAAM,sDAAsD;AAAA,EACxE;AACA,SAAO,IAAI,QAAQ,CAACC,aAAY;AAC9B,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,QAAQ,MAAM,SAAS;AAAA,MAC3B,KAAK;AAAA,MACL,KAAK,QAAQ;AAAA,MACb,OAAO;AAAA,MACP,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,IAClC,CAAC;AACD,QAAI,SAAS;AACb,QAAI,WAAW;AACf,UAAM,SAAS,CAAC,UAA2B;AACzC,gBAAU,MAAM,SAAS;AACzB,UAAI,OAAO,SAAS,uBAAuB;AACzC,iBAAS,mCAAmC,qBAAqB;AAAA,EAAiB,OAAO,MAAM,CAAC,qBAAqB,CAAC;AAAA,MACxH;AAAA,IACF;AACA,UAAM,OAAO,GAAG,QAAQ,MAAM;AAC9B,UAAM,OAAO,GAAG,QAAQ,MAAM;AAC9B,UAAM,QAAQ,WAAW,MAAM;AAC7B,iBAAW;AACX,YAAM,KAAK,SAAS;AAAA,IACtB,GAAG,SAAS;AACZ,UAAM,GAAG,SAAS,CAAC,UAAU,WAAW;AACtC,mBAAa,KAAK;AAClB,MAAAA,SAAQ;AAAA,QACN,QAAQ,WAAW,cAAc,aAAa,IAAI,WAAW;AAAA,QAC7D;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY,KAAK,IAAI,IAAI;AAAA,QACzB,QAAQ,OAAO,KAAK;AAAA,MACtB,CAAC;AAAA,IACH,CAAC;AACD,UAAM,GAAG,SAAS,CAAC,UAAU;AAC3B,mBAAa,KAAK;AAClB,MAAAA,SAAQ;AAAA,QACN,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,YAAY,KAAK,IAAI,IAAI;AAAA,QACzB,QAAQ,GAAG,OAAO,KAAK,CAAC;AAAA,EAAK,MAAM,OAAO,GAAG,KAAK;AAAA,MACpD,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;AAOA,eAAe,0BACb,cACA,gBAC2D;AAC3D,MAAI;AACF,WAAO,EAAE,KAAK,MAAM,gBAAgB,cAAc,cAAc,GAAG,SAAS,KAAK;AAAA,EACnF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,KAAK,MAAM,qBAAqB,cAAc;AAAA,MAC9C,SAAS,0DAA2D,MAAgB,OAAO;AAAA,IAC7F;AAAA,EACF;AACF;AAEA,SAAS,kBAA8B;AACrC,SAAO;AAAA,IACL,OAAO,CAAC;AAAA,IACR,OAAO,EAAE,iBAAiB,GAAG,eAAe,GAAG,YAAY,GAAG,WAAW,CAAC,EAAE;AAAA,EAC9E;AACF;AAEA,SAAS,mBAAkC;AACzC,SAAO;AAAA,IACL,aAAa,CAAC;AAAA,IACd,OAAO,EAAE,iBAAiB,GAAG,UAAU,GAAG,YAAY,CAAC,GAAG,YAAY,CAAC,EAAE;AAAA,EAC3E;AACF;AAEA,eAAe,oBACb,OACA,WACA,QAC0B;AAC1B,MAAI,QAAQ;AACV,QAAI;AACF,aAAO,MAAM,MAAM,SAAS,MAAM;AAAA,IACpC,SAAS,OAAO;AACd,UAAK,MAAgC,SAAS,SAAU,QAAO;AAC/D,YAAM;AAAA,IACR;AAAA,EACF;AACA,SAAO,IAAI,cAAc,KAAK,EAAE,QAAQ,SAAS;AACnD;AAEA,SAAS,cAAc,MAAuB,OAA2C;AACvF,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,eAAe,KAAK,aAAa,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,KAAK;AACrE,QAAM,aAAa,IAAI,IAAI,YAAY;AACvC,QAAM,kBAAkB,MAAM,OAAO,CAAC,SAAS,CAAC,WAAW,IAAI,IAAI,CAAC;AACpE,QAAM,eAAe,KAAK,WAAW,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,KAAK;AACnE,QAAM,UAAU,IAAI,IAAI,KAAK;AAC7B,QAAM,sBAAsB,aAAa,OAAO,CAAC,SAAS,CAAC,QAAQ,IAAI,IAAI,CAAC;AAC5E,SAAO;AAAA,IACL,IAAI,KAAK;AAAA,IACT,OAAO,KAAK;AAAA,IACZ,QAAQ,KAAK;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,kBACP,OACA,MACA,aACoB;AACpB,QAAM,mBAAmB,MAAM,OAAO,UAAU;AAChD,QAAM,mBAAmB,MAAM,OAAO,CAAC,SAAS,WAAW,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC;AACrF,QAAM,YAAY,IAAI;AAAA,IACpB,YAAY,YACT,OAAO,CAAC,eAAe,WAAW,aAAa,kBAAkB,WAAW,IAAI,EAChF,IAAI,CAAC,eAAe,WAAW,IAAc;AAAA,EAClD;AACA,QAAM,eAAe,MAAM,gBAAgB,CAAC;AAC5C,QAAM,sBAAsB,MAAM,uBAAuB,CAAC;AAC1D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,oBAAoB,iBAAiB,OAAO,CAAC,SAAS,UAAU,IAAI,IAAI,CAAC;AAAA,IACzE;AAAA,IACA;AAAA,IACA,eAAe,iBAAiB,SAAS,KAAK,iBAAiB,WAAW;AAAA,EAC5E;AACF;AAEA,SAAS,gBACP,OACA,OACwB;AACxB,QAAM,UAAU,IAAI,IAAI,KAAK;AAC7B,QAAM,SAAiC,CAAC;AACxC,aAAW,QAAQ,MAAO,QAAO,IAAI,IAAI;AACzC,aAAW,QAAQ,OAAO;AACxB,QAAI,QAAQ,IAAI,KAAK,EAAE,EAAG,QAAO,KAAK,EAAE,KAAK,OAAO,KAAK,EAAE,KAAK,KAAK;AAAA,EACvE;AACA,SAAO;AACT;AAEA,SAAS,UACP,OACA,aACA,aACA,cACwB;AACxB,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,MAAI,eAAe,MAAM,YAAY,YAAY,KAAK,CAAC,SAAS,KAAK,aAAa,MAAM,GAAG;AACzF,WAAO;AAAA,EACT;AACA,MACE,eAAe,MACf,YAAY,YAAY,KAAK,CAAC,SAAS,KAAK,aAAa,QAAQ,KACjE,aAAa,mBAAmB,SAAS,KACzC,aAAa,oBAAoB,SAAS,GAC1C;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,WAAW,MAAuB;AACzC,SAAO,gBAAgB,IAAI,QAAQ,IAAI,EAAE,YAAY,CAAC;AACxD;AAEA,SAAS,WAAW,MAAuB;AACzC,SAAO,wCAAwC,KAAK,IAAI;AAC1D;;;ADzUO,SAAS,sBACd,SACAC,YACM;AACN,QAAM,SAAS,QAAQ,QAAQ,QAAQ,EAAE,YAAY,uCAAuC;AAE5F,SACG,QAAQ,UAAU,EAAE,WAAW,KAAK,CAAC,EACrC,YAAY,0EAA0E,EACtF,OAAO,mBAAmB,gDAAgD,EAC1E,OAAO,eAAe,oCAAoC,EAC1D,OAAO,YAAY,4CAA4C,EAC/D,OAAO,qBAAqB,0DAA0D,EACtF,OAAO,UAAU,8BAA8B,EAC/C,OAAO,OAAO,SAAwB;AACrC,UAAMA,WAAU,YAAY;AAC1B,YAAM,SAAS,MAAM,kBAAkB,QAAQ,MAAM,MAAM,qBAAqB,CAAC,CAAC;AAClF,UAAI,KAAK,MAAM;AACb,gBAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C;AAAA,MACF;AACA,kBAAY,MAAM;AAAA,IACpB,CAAC;AAAA,EACH,CAAC;AAEH,SACG,QAAQ,QAAQ,EAChB,YAAY,0EAA0E,EACtF,OAAO,mBAAmB,gDAAgD,EAC1E,OAAO,eAAe,oCAAoC,EAC1D,OAAO,YAAY,4CAA4C,EAC/D,OAAO,qBAAqB,0DAA0D,EACtF,OAAO,uBAAuB,qCAAqC,EACnE,OAAO,kBAAkB,uDAAuD,MAAM,EACtF,OAAO,UAAU,8BAA8B,EAC/C,OAAO,OAAO,SAAwB;AACrC,UAAMA,WAAU,YAAY;AAC1B,YAAM,SAAS,MAAM,aAAa;AAAA,QAChC,GAAG,QAAQ,MAAM,MAAM,qBAAqB,CAAC;AAAA,QAC7C,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,QAChD,GAAI,KAAK,YAAY,SAAY,EAAE,WAAW,KAAK,QAAQ,IAAI,CAAC;AAAA,MAClE,CAAC;AACD,UAAI,KAAK,MAAM;AACb,gBAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,MAC7C,OAAO;AACL,0BAAkB,MAAM;AAAA,MAC1B;AACA,UAAI,OAAO,KAAK,WAAW,SAAU,SAAQ,WAAW;AAAA,IAC1D,CAAC;AAAA,EACH,CAAC;AACL;AAeA,SAAS,QAAQ,MAAqB,WAAmB;AACvD,SAAO;AAAA,IACL;AAAA,IACA,GAAI,KAAK,QAAQ,EAAE,OAAO,WAAW,KAAK,KAAK,EAAE,IAAI,CAAC;AAAA,IACtD,GAAI,KAAK,OAAO,EAAE,QAAQ,KAAK,KAAK,IAAI,CAAC;AAAA,IACzC,GAAI,KAAK,QAAQ,SAAY,EAAE,QAAQ,KAAK,IAAI,IAAI,CAAC;AAAA,IACrD,GAAI,KAAK,WAAW,EAAE,cAAc,KAAK,SAAS,IAAI,CAAC;AAAA,EACzD;AACF;AAEA,SAAS,WAAW,OAAyB;AAC3C,SAAO,MACJ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO;AACnB;AAEA,SAAS,YAAY,QAA4B;AAC/C,UAAQ,IAAI,GAAG,YAAY,OAAO,MAAM,CAAC,IAAI,GAAG,KAAK,eAAe,CAAC,EAAE;AACvE,MAAI,OAAO,MAAM,WAAW,GAAG;AAC7B,YAAQ,IAAI,GAAG,IAAI,6BAA6B,CAAC;AACjD;AAAA,EACF;AACA,UAAQ,IAAI,KAAK,OAAO,MAAM,MAAM,aAAa,OAAO,MAAM,KAAK,IAAI,CAAC,EAAE;AAC1E,UAAQ,IAAI,mBAAmB,OAAO,KAAK,YAAY,EAAE;AACzD,UAAQ;AAAA,IACN,mBAAmB,OAAO,aAAa,eAAe,oDAAoD,OAAO,aAAa,MAAM;AAAA,EACtI;AACA,MAAI,OAAO,aAAa,QAAS,SAAQ,IAAI,GAAG,OAAO,KAAK,OAAO,aAAa,OAAO,EAAE,CAAC;AAC1F,MAAI,OAAO,MAAM;AACf,YAAQ,IAAI,WAAW,OAAO,KAAK,EAAE,IAAI,OAAO,KAAK,KAAK,KAAK,OAAO,KAAK,MAAM,GAAG;AACpF,QAAI,OAAO,KAAK,gBAAgB,SAAS;AACvC,cAAQ,IAAI,iBAAiB,OAAO,KAAK,gBAAgB,KAAK,IAAI,CAAC,EAAE;AACvE,QAAI,OAAO,KAAK,oBAAoB,SAAS;AAC3C,cAAQ,IAAI,kCAAkC,OAAO,KAAK,oBAAoB,KAAK,IAAI,CAAC,EAAE;AAAA,EAC9F,OAAO;AACL,YAAQ,IAAI,GAAG,IAAI,wBAAwB,CAAC;AAAA,EAC9C;AACA,UAAQ;AAAA,IACN,mBAAmB,OAAO,aAAa,iBAAiB,MAAM,0BAA0B,OAAO,aAAa,mBAAmB,MAAM;AAAA,EACvI;AACA,MAAI,OAAO,YAAY,SAAS,GAAG;AACjC,YAAQ,IAAI,eAAe;AAC3B,eAAW,cAAc,OAAO,YAAY,MAAM,GAAG,CAAC,GAAG;AACvD,cAAQ,IAAI,KAAK,cAAc,WAAW,QAAQ,CAAC,IAAI,WAAW,KAAK,EAAE;AACzE,cAAQ,IAAI,GAAG,IAAI,OAAO,WAAW,MAAM,EAAE,CAAC;AAAA,IAChD;AAAA,EACF,OAAO;AACL,YAAQ,IAAI,GAAG,IAAI,oBAAoB,CAAC;AAAA,EAC1C;AACF;AAEA,SAAS,kBAAkB,QAAwC;AACjE,cAAY,OAAO,MAAM;AACzB,UAAQ,IAAI;AAAA,EAAK,UAAU,OAAO,KAAK,MAAM,CAAC,eAAe;AAC7D,UAAQ,IAAI,cAAc,OAAO,KAAK,WAAW,eAAe,EAAE;AAClE,MAAI,OAAO,KAAK,aAAa,EAAG,SAAQ,IAAI,eAAe,OAAO,KAAK,UAAU,IAAI;AACrF,MAAI,OAAO,KAAK,QAAQ;AACtB,YAAQ,IAAI,WAAW;AACvB,eAAW,QAAQ,OAAO,KAAK,OAAO,MAAM,IAAI,EAAG,SAAQ,IAAI,OAAO,IAAI,EAAE;AAAA,EAC9E;AACF;AAEA,SAAS,YAAY,QAA8B;AACjD,MAAI,WAAW,UAAW,QAAO,GAAG,IAAI,WAAW;AACnD,MAAI,WAAW,SAAU,QAAO,GAAG,OAAO,WAAW;AACrD,MAAI,WAAW,QAAS,QAAO,GAAG,MAAM,WAAW;AACnD,SAAO,GAAG,IAAI,YAAY;AAC5B;AAEA,SAAS,cAAc,UAA0B;AAC/C,MAAI,aAAa,OAAQ,QAAO,GAAG,IAAI,QAAQ;AAC/C,MAAI,aAAa,SAAU,QAAO,GAAG,OAAO,QAAQ;AACpD,SAAO,GAAG,IAAI,IAAI,SAAS,OAAO,CAAC,CAAC,GAAG;AACzC;AAEA,SAAS,UAAU,QAA4D;AAC7E,MAAI,WAAW,SAAU,QAAO,GAAG,MAAM,WAAW;AACpD,MAAI,WAAW,YAAa,QAAO,GAAG,IAAI,WAAW;AACrD,MAAI,WAAW,SAAU,QAAO,GAAG,IAAI,WAAW;AAClD,SAAO,GAAG,OAAO,WAAW;AAC9B;;;AExJA,SAAS,gBAAgB;AAEzB,OAAOC,SAAQ;;;ACFf,SAAS,SAAS,UAAU;AAC5B,SAAS,cAAc;AACvB,SAAS,QAAAC,OAAM,WAAAC,gBAAe;AAC9B,SAAS,cAAc;AACvB,SAAS,yBAAyB;AAClC,SAAS,iBAAiB;AAmC1B,eAAe,gBACb,MACA,WAC4C;AAC5C,QAAM,SAAS,IAAI,UAAU,EAAE,MAAM,aAAa,SAAS,QAAQ,CAAC;AACpE,yBAAuB,QAAQ;AAAA,IAC7B,QAAQ,EAAE,WAAW,aAAa,KAAK;AAAA,IACvC,UAAU;AAAA,MACR,KAAK,MAAM,QAAQ,OAAO,IAAI,MAAM,UAAU,CAAC;AAAA,MAC/C,QAAQ,OAAO,EAAE,WAAW,OAAO,OAAO,OAAO;AAAA,IACnD;AAAA,EACF,CAAC;AACD,QAAM,CAAC,iBAAiB,eAAe,IAAI,kBAAkB,iBAAiB;AAC9E,QAAM,SAAS,IAAI,OAAO,EAAE,MAAM,kBAAkB,SAAS,QAAQ,CAAC;AACtE,QAAM,QAAQ,IAAI,CAAC,OAAO,QAAQ,eAAe,GAAG,OAAO,QAAQ,eAAe,CAAC,CAAC;AACpF,MAAI;AACF,UAAM,EAAE,MAAM,IAAI,MAAM,OAAO,UAAU;AACzC,WAAO;AAAA,MACL,MAAM,eAAe,KAAK;AAAA,MAC1B,SAAS,eAAe,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,IACnE;AAAA,EACF,UAAE;AACA,UAAM,OAAO,MAAM;AAAA,EACrB;AACF;AAMA,eAAe,gBACb,MACA,WACmF;AACnF,QAAM,YAAY,MAAM,sBAAsB,EAAE,gBAAgB,MAAM,UAAU,CAAC;AACjF,QAAM,aAAa,MAAM,uBAAuB;AAAA,IAC9C,gBAAgB;AAAA,IAChB;AAAA,IACA,QAAQ;AAAA,EACV,CAAC,EAAE,MAAM,MAAM,IAAI;AACnB,QAAM,UAAU,MAAM,QAAQC,MAAK,OAAO,GAAG,iBAAiB,CAAC;AAC/D,MAAI;AACF,UAAM,SAAS,IAAI,qBAAqB,OAAO;AAC/C,UAAM,SAAS,MAAM,mBAAmB,WAAW,YAAY,QAAQ,QAAQ,IAAI;AACnF,UAAM,QAAQ,MAAM,OAAO;AAC3B,UAAM,OAAO,SAAS,QAAQ,MAAM,OAAO;AAC3C,UAAM,QAAQ,MAAM,OAAO;AAC3B,UAAM,YAAY,YAAY,eAAe,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,SAAS,CAAC,EAAE,EAAE;AACtF,UAAM,aAAa,MACjB,gBAAgB,EAAE,gBAAgB,MAAM,QAAQ,IAAI,UAAU,QAAQ,WAAW,OAAO,CAAC;AAC3F,UAAM,YAAY,MAAM,WAAW;AACnC,UAAM,OAAO,SAAS,QAAQ,UAAU,OAAO;AAC/C,UAAM,YAAY,MAAM,WAAW;AACnC,WAAO;AAAA,MACL,OAAO,eAAe,MAAM,IAAI;AAAA,MAChC,OAAO,eAAe,MAAM,IAAI;AAAA,MAChC,MAAM,EAAE,OAAO,eAAe,UAAU,IAAI,GAAG,OAAO,eAAe,UAAU,IAAI,EAAE;AAAA,IACvF;AAAA,EACF,UAAE;AACA,UAAM,GAAG,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EACpD;AACF;AAEA,eAAsB,mBACpB,cAAc,QAAQ,IAAI,GAC1B,WACuB;AACvB,QAAM,OAAOC,SAAQ,WAAW;AAChC,QAAM,KAAK,aAAc,MAAM,qBAAqB,IAAI;AACxD,QAAM,YAAY,MAAM,gBAAgB,MAAM,EAAE;AAChD,QAAM,QAAQ,MAAM,gBAAgB,MAAM,EAAE;AAC5C,SAAO,WAAW,QAAQ,CAAC,WAAW;AACpC,UAAM,UAAU,gBAAgB,MAAM;AACtC,WAAO,eAAe,OAAO,EAAE,QAAQ,CAAC,SAAuB;AAC7D,UAAI,SAAS,WAAY,QAAO,CAAC;AACjC,UAAI,SAAS,QAAQ;AAEnB,cAAMC,SAAQ,QAAQ,mBAAmB,MAAM,KAAK,QAAQ,MAAM,KAAK;AACvE,eAAO;AAAA,UACL,EAAE,QAAQ,MAAM,OAAO,GAAG,WAAW,GAAG,YAAY,MAAM,KAAK,OAAO,YAAYA,OAAM;AAAA,QAC1F;AAAA,MACF;AACA,YAAM,QAAQ,SAAS;AACvB,YAAM,QAAQ,QAAQ,mBAAmB,MAAM,QAAQ,MAAM;AAC7D,aAAO;AAAA,QACL;AAAA,UACE;AAAA,UACA;AAAA,UACA,OAAO,eAAe,mBAAmB,QAAQ,IAAI,CAAC;AAAA,UACtD,WAAW,QAAQ,mBAAmB,UAAU,UAAU,UAAU;AAAA,UACpE,YAAY,QAAQ,MAAM,QAAQ;AAAA,UAClC,YAAY,QAAQ,QAAQ;AAAA,QAC9B;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;;;ACxIA,SAAS,gBAAgB;AACzB,SAAS,UAAU,gBAAgB;AACnC,SAAS,QAAAC,OAAM,WAAAC,gBAAe;AAC9B,SAAS,qBAAqB;AAuBvB,IAAM,UAAsB,CAAC,KAAK,MAAM,QAC7C,IAAI,QAAQ,CAAC,SAAS;AACpB;AAAA,IAAS;AAAA,IAAK;AAAA,IAAM,EAAE,KAAK,SAAS,MAAQ,WAAW,IAAI,OAAO,KAAK;AAAA,IAAG,CAAC,OAAO,WAChF,KAAK,EAAE,IAAI,CAAC,OAAO,QAAQ,OAAO,UAAU,EAAE,EAAE,CAAC;AAAA,EACnD;AACF,CAAC;AAgBH,IAAM,OAAO,CAACC,OAAc,YAA2B,EAAE,MAAAA,OAAM,QAAQ,QAAQ,OAAO;AACtF,IAAM,OAAO,CAACA,OAAc,YAA2B,EAAE,MAAAA,OAAM,QAAQ,QAAQ,OAAO;AACtF,IAAM,OAAO,CAACA,OAAc,YAA2B,EAAE,MAAAA,OAAM,QAAQ,QAAQ,OAAO;AAEtF,SAAS,KAAKC,OAAuB;AACnC,MAAI;AACF,WAAO,KAAK,MAAMA,KAAI;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,IAAM,cAA6E;AAAA,EACjF,QAAQ,OAAO,EAAE,MAAM,MAAAD,OAAM,IAAI,MAAM;AACrC,UAAM,QAAS,MAAM,qBAAqB,MAAM,QAAQ,IACpD,KAAK,SAAS,+CAA+C,IAC7D,KAAK,SAAS,4BAA4B;AAC9C,UAAM,MAAM,MAAM,IAAI,UAAU,CAAC,OAAO,OAAOA,KAAI,GAAG,IAAI;AAC1D,WAAO;AAAA,MACL;AAAA,MACA,IAAI,KACA,KAAK,OAAO,kBAAkBA,KAAI,KAAK,IAAI,OAAO,MAAM,aAAa,IAAI,CAAC,KAAK,OAAO,EAAE,IACxF,KAAK,OAAO,kBAAkBA,KAAI,kBAAkB;AAAA,IAC1D;AAAA,EACF;AAAA,EACA,UAAU,OAAO,EAAE,MAAM,MAAAA,OAAM,IAAI,MAAM;AACvC,UAAM,SAAS,MAAM,IAAI,YAAY,CAAC,SAAS,QAAQ,GAAG,IAAI;AAC9D,UAAM,SAAS,KAAK,OAAO,MAAM;AAIjC,QAAI,CAAC,OAAQ,QAAO,CAAC,KAAK,UAAU,wCAAwC,CAAC;AAC7E,UAAM,YAAY,MAAM,qBAAqB,MAAM,UAAU;AAC7D,UAAM,OAAO;AAAA,MACXE,MAAK,MAAM,SAAS,IAAI,EAAE,MAAM,MAAM,IAAI,GAAG,aAAa,WAAW,cAAc;AAAA,IACrF,EAAE;AACF,UAAM,SAAS,OAAO,QAAQ,SAAS,IAAI,MAAM;AACjD,WAAO;AAAA,MACL,YACI,SACE,KAAK,UAAU,4DAA4D,IAC3E,KAAK,UAAU,wDAAwD,IACzE,KAAK,UAAU,4BAA4B;AAAA,MAC/C,OAAO,MAAMF,KAAI,IACb,KAAK,OAAO,yBAAyBA,KAAI,YAAY,IACrD,KAAK,OAAO,MAAMA,KAAI,+BAA+B;AAAA,IAC3D;AAAA,EACF;AAAA,EACA,OAAO,OAAO,EAAE,MAAM,MAAAA,OAAM,IAAI,MAAM;AACpC,UAAM,SAAS,MAAM,IAAI,SAAS,CAAC,OAAO,QAAQ,QAAQ,GAAG,IAAI;AACjE,UAAM,UAAU,KAAK,OAAO,MAAM;AAClC,QAAI,CAAC,MAAM,QAAQ,OAAO,EAAG,QAAO,CAAC,KAAK,OAAO,wCAAwC,CAAC;AAC1F,WAAO;AAAA,MACL,QAAQ,KAAK,CAAC,WAAY,OAA6B,SAASA,KAAI,IAChE,KAAK,OAAO,sBAAsBA,KAAI,EAAE,IACxC,KAAK,OAAO,MAAMA,KAAI,iDAAiD;AAAA,IAC7E;AAAA,EACF;AAAA,EACA,QAAQ,OAAO,EAAE,MAAM,MAAAA,OAAM,KAAK,IAAI,MAAM;AAC1C,UAAM,SAAkB,CAAC;AACzB,UAAM,SAAS,MAAM,IAAI,UAAU,CAAC,OAAO,MAAM,GAAG,IAAI;AACxD,WAAO;AAAA,MACL,OAAO,MAAM,OAAO,OAAO,SAASA,KAAI,IACpC,KAAK,OAAO,uBAAuBA,KAAI,EAAE,IACzC,KAAK,OAAO,MAAMA,KAAI,kDAAkD;AAAA,IAC9E;AACA,QAAI,CAAE,MAAM,sBAAsB,IAAI,GAAI;AACxC,aAAO,KAAK,KAAK,UAAU,4BAA4B,CAAC;AACxD,aAAO;AAAA,IACT;AACA,UAAM,iBACJ,qBAAqB,KAAK,IAAI,iCAAiC,EAAE,KACjE,iEAAiE;AAAA,MAC/D,MAAM,SAASE,MAAK,iBAAiB,GAAG,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM,MAAM,EAAE;AAAA,IAC/E;AACF,UAAM,WAAW,MAAM,iBAAiB,iBAAiB,CAAC,IAAI;AAG9D,UAAM,UAAU,MAAM,QAAQ,SAAS,OAAO,KAAK,QAAQ,QAAQ,SAAS,WAAW;AACvF,WAAO;AAAA,MACL,iBACI,KAAK,mBAAmB,sCAAsC,IAC9D,KAAK,mBAAmB,+DAA+D;AAAA,MAC3F,UACI,KAAK,kBAAkB,iCAAiC,IACxD,KAAK,kBAAkB,2DAA2D;AAAA,IACxF;AACA,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,aACpB,QACA,UAA4F,CAAC,GAChE;AAC7B,QAAM,OAAOC,SAAQ,QAAQ,QAAQ,QAAQ,IAAI,CAAC;AAClD,QAAM,MAAM,QAAQ,OAAO;AAC3B,QAAM,UAAU,gBAAgB,MAAM;AACtC,QAAM,UAAU,MAAM,IAAI,QAAQ,KAAK,KAAK,CAAC,WAAW,GAAG,IAAI;AAC/D,QAAM,YAAY,QAAQ,KAAM,QAAQ,OAAO,MAAM,eAAe,IAAI,CAAC,KAAK,OAAQ;AACtF,QAAM,SAAS,iBAAiB,IAAI,CAAC,WAAW;AAAA,IAC9C;AAAA,IACA,OAAO,QAAQ,WAAW,SAAS,KAAK;AAAA,EAC1C,EAAE;AACF,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,MACL;AAAA,MACA,WAAW;AAAA,MACX,UAAU,QAAQ,KAAK;AAAA,MACvB,OAAO;AAAA,MACP;AAAA,MACA,QAAQ,CAAC,KAAK,QAAQ,GAAG,QAAQ,KAAK,GAAG,kCAAkC,CAAC;AAAA,IAC9E;AAAA,EACF;AACA,QAAMH,QAAO,aAAa,QAAQ,aAAc,MAAM,qBAAqB,IAAI,CAAE;AACjF,QAAM,cAAc,YAAY,MAAM;AACtC,QAAM,SAAS,cACX,MAAM,YAAY,EAAE,MAAM,MAAAA,OAAM,KAAK,KAAK,QAAQ,OAAO,QAAQ,IAAI,CAAC,EAAE;AAAA,IACtE,CAAC,UAAiB,CAAC,KAAK,eAAe,MAAM,OAAO,CAAC;AAAA,EACvD,IACA,CAAC;AACL,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,UAAU,QAAQ,KAAK;AAAA,IACvB,OAAO,cAAc,QAAQ,KAAK,WAAW,UAAU;AAAA,IACvD;AAAA,IACA,QAAQ,CAAC,KAAK,QAAQ,GAAG,QAAQ,KAAK,GAAG,IAAI,SAAS,EAAE,GAAG,GAAG,MAAM;AAAA,EACtE;AACF;;;AFpJO,SAAS,wBACd,SACAI,YACM;AACN,QAAM,UAAU,QACb,QAAQ,SAAS,EACjB,YAAY,+EAA+E;AAE9F,UACG,QAAQ,MAAM,EACd,OAAO,sBAAsB,0CAA0C,EACvE,YAAY,yEAAyE,EACrF,OAAO,OAAO,SAAiC;AAC9C,UAAMA,WAAU,YAAY;AAC1B,iBAAW,UAAU,YAAY;AAC/B,cAAM,UAAU,gBAAgB,MAAM;AACtC,cAAM,SAAS,MAAM,aAAa,QAAQ,QAAQ,IAAI,GAAG,KAAK,SAAS;AACvE,cAAM,MAAM,UAAU,QAAQ,MAAM,QAAQ,IAAI,OAAO;AACvD,cAAM,YAAY,iBAAiB;AAAA,UAAI,CAAC,UACtC,QAAQ,WAAW,SAAS,KAAK,IAAIC,IAAG,MAAM,KAAK,IAAIA,IAAG,IAAI,GAAG,KAAK,QAAG;AAAA,QAC3E,EAAE,KAAK,GAAG;AACV,cAAM,WAAW,eAAe,OAAO,EACpC;AAAA,UAAQ,CAAC,SACR,SAAS,aACL,CAAC,IACD,CAAC,GAAG,IAAI,KAAK,eAAe,mBAAmB,QAAQ,IAAI,CAAC,CAAC,EAAE;AAAA,QACrE,EACC,KAAK,IAAI;AACZ,gBAAQ;AAAA,UACN,GAAGA,IAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,MAAM,KAAKA,IAAG,IAAI,YAAY,QAAQ,KAAK,GAAG,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;AAAA,QACzG;AACA,gBAAQ;AAAA,UACN,WAAW,QAAQ,SAAS,aAAU,GAAG,eAAY,eAAe,OAAO,EAAE,KAAK,GAAG,CAAC;AAAA,QACxF;AACA,gBAAQ,IAAI,gBAAgB,SAAS,EAAE;AACvC,gBAAQ,IAAI,yBAAyB,QAAQ,EAAE;AAC/C,gBAAQ;AAAA,UACN,gBAAgB,OAAO,SAAS,SAASA,IAAG,IAAI,eAAe,IAAIA,IAAG,KAAK,OAAO,IAAI,CAAC;AAAA,QACzF;AACA,YAAI,QAAQ,IAAK,SAAQ,IAAIA,IAAG,IAAI,cAAc,QAAQ,GAAG,EAAE,CAAC;AAChE,YAAI,QAAQ,KAAM,SAAQ,IAAIA,IAAG,IAAI,WAAW,QAAQ,IAAI,EAAE,CAAC;AAC/D,mBAAW,WAAW,OAAO,SAAU,SAAQ,IAAIA,IAAG,OAAO,OAAO,OAAO,EAAE,CAAC;AAAA,MAChF;AACA,cAAQ,IAAIA,IAAG,IAAI,wDAAwD,CAAC;AAAA,IAC9E,CAAC;AAAA,EACH,CAAC;AAEH,UACG,QAAQ,SAAS,EACjB,SAAS,YAAY,WAAW,WAAW,KAAK,IAAI,CAAC,GAAG,EACxD,eAAe,iBAAiB,WAAW,iBAAiB,KAAK,IAAI,CAAC,GAAG,EACzE,OAAO,sBAAsB,0DAA0D,EACvF,OAAO,YAAY,8DAA8D,EACjF,YAAY,gEAAgE,EAC5E;AAAA,IACC,OAAO,QAAgB,SAAiE;AACtF,YAAMD,WAAU,YAAY;AAC1B,cAAM,OAAO,UAAU,KAAK,IAAI;AAChC,cAAM,SAAS,MAAM,cAAc;AAAA,UACjC,QAAQ,YAAY,MAAM;AAAA,UAC1B;AAAA,UACA,GAAI,KAAK,YAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA,UACtD,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,IAAI,CAAC;AAAA,QACxC,CAAC;AACD,QAAAE,aAAY,QAAQ,GAAG,YAAY,IAAI,CAAC,OAAO;AAAA,MACjD,CAAC;AAAA,IACH;AAAA,EACF;AAEF,UACG,QAAQ,WAAW,EACnB,SAAS,YAAY,WAAW,WAAW,KAAK,IAAI,CAAC,GAAG,EACxD,OAAO,sBAAsB,uCAAuC,EACpE,OAAO,YAAY,mEAAmE,EACtF,YAAY,+EAA+E,EAC3F,OAAO,OAAO,QAAgB,SAAmD;AAChF,UAAMF,WAAU,YAAY;AAC1B,YAAM,SAAS,MAAM,gBAAgB;AAAA,QACnC,QAAQ,YAAY,MAAM;AAAA,QAC1B,GAAI,KAAK,YAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA,QACtD,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,IAAI,CAAC;AAAA,MACxC,CAAC;AACD,MAAAE,aAAY,QAAQ,aAAa;AAAA,IACnC,CAAC;AAAA,EACH,CAAC;AAEH,UACG,QAAQ,QAAQ,EAChB,SAAS,YAAY,WAAW,WAAW,KAAK,IAAI,CAAC,kBAAkB,EACvE,OAAO,sBAAsB,0CAA0C,EACvE;AAAA,IACC;AAAA,EACF,EACC,OAAO,OAAO,QAA4B,SAAiC;AAC1E,UAAMF,WAAU,YAAY;AAC1B,YAAM,UAAU,SAAS,CAAC,YAAY,MAAM,CAAC,IAAI;AACjD,iBAAW,MAAM,SAAS;AACxB,cAAM,SAAS,MAAM;AAAA,UACnB;AAAA,UACA,KAAK,YAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA,QACpD;AACA,cAAM,QACJ,OAAO,UAAU,UACbC,IAAG,MAAM,OAAO,IAChB,OAAO,UAAU,UACfA,IAAG,OAAO,oBAAoB,OAAO,SAAS,GAAG,IACjDA,IAAG,IAAI,eAAe;AAC9B,gBAAQ;AAAA,UACN,GAAGA,IAAG,KAAK,gBAAgB,EAAE,EAAE,IAAI,CAAC,cAAc,OAAO,QAAQ,SAAM,KAAK;AAAA,QAC9E;AACA,gBAAQ;AAAA,UACN,aAAa,OAAO,OAAO,IAAI,CAAC,EAAE,OAAO,MAAM,MAAO,QAAQA,IAAG,MAAM,KAAK,IAAIA,IAAG,IAAI,GAAG,KAAK,QAAG,CAAE,EAAE,KAAK,GAAG,CAAC;AAAA,QACjH;AACA,mBAAW,SAAS,OAAO,QAAQ;AACjC,gBAAM,QACJ,MAAM,WAAW,SACbA,IAAG,MAAM,MAAM,IACf,MAAM,WAAW,SACfA,IAAG,IAAI,MAAM,IACbA,IAAG,IAAI,MAAM;AACrB,kBAAQ,IAAI,KAAK,KAAK,IAAI,MAAM,IAAI,KAAK,MAAM,MAAM,EAAE;AAAA,QACzD;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAEH,UACG,QAAQ,MAAM,EACd,OAAO,sBAAsB,mDAAmD,EAChF,OAAO,UAAU,iCAAiC,EAClD,YAAY,4EAA4E,EACxF,OAAO,OAAO,SAAiD;AAC9D,UAAMD,WAAU,YAAY;AAC1B,YAAM,QAAQ,MAAM,mBAAmB,QAAQ,IAAI,GAAG,KAAK,SAAS;AACpE,UAAI,KAAK,MAAM;AACb,gBAAQ,IAAI,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAC1C;AAAA,MACF;AACA,cAAQ;AAAA,QACN;AAAA,MACF;AACA,iBAAW,QAAQ,OAAO;AACxB,cAAM,QAAQ,KAAK,QAAQ,KAAK;AAChC,gBAAQ;AAAA,UACN;AAAA,YACE,KAAK,OAAO,OAAO,EAAE;AAAA,YACrB,KAAK,KAAK,OAAO,CAAC;AAAA,YAClB,OAAO,KAAK,KAAK,EAAE,SAAS,CAAC;AAAA,YAC7B,OAAO,KAAK,SAAS,EAAE,SAAS,EAAE;AAAA,YAClC,OAAO,KAAK,UAAU,EAAE,SAAS,EAAE;AAAA,YACnC,OAAO,KAAK,UAAU,EAAE,SAAS,EAAE;AAAA,YACnC,OAAO,QAAQ,KAAK,UAAU,EAAE,SAAS,EAAE;AAAA,YAC3C,OAAO,QAAQ,KAAK,UAAU,EAAE,SAAS,EAAE;AAAA,UAC7C,EAAE,KAAK,GAAG;AAAA,QACZ;AAAA,MACF;AACA,cAAQ;AAAA,QACNC,IAAG;AAAA,UACD;AAAA,QACF;AAAA,MACF;AACA,iBAAW,MAAM,WAAY,SAAQ,IAAIA,IAAG,IAAI,KAAK,EAAE,KAAK,gBAAgB,EAAE,EAAE,OAAO,EAAE,CAAC;AAAA,IAC5F,CAAC;AAAA,EACH,CAAC;AACL;AAEA,SAASC,aAAY,QAAsB,OAAqB;AAC9D,UAAQ,IAAI,GAAGD,IAAG,KAAK,gBAAgB,OAAO,MAAM,EAAE,IAAI,CAAC,KAAK,KAAK,EAAE;AACvE,aAAW,QAAQ,OAAO,OAAO;AAC/B,UAAM,QAAQ,SAAS,QAAQ,IAAI,GAAG,KAAK,MAAM,KAAK,KAAK;AAC3D,UAAM,QAAQ,KAAK,WAAW,cAAcA,IAAG,IAAI,KAAK,MAAM,IAAIA,IAAG,MAAM,KAAK,MAAM;AACtF,YAAQ,IAAI,KAAK,KAAK,QAAQ,OAAO,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,EAAE;AAAA,EAC7D;AACA,aAAWE,SAAQ,OAAO,MAAO,SAAQ,IAAIF,IAAG,IAAI,KAAKE,KAAI,EAAE,CAAC;AAClE;;;AG1MA,OAAOC,SAAQ;AAYf,eAAe,mBAAmB,MAAM,QAAQ,IAAI,GAAgC;AAClF,QAAM,OAAO,MAAM,eAAe,GAAG;AACrC,SAAO,KAAK;AACd;AAEA,SAASC,YAAW,OAAyB;AAC3C,SAAO,MACJ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO;AACnB;AAEO,SAAS,wBACd,SACAC,YACM;AACN,QAAM,UAAU,QACb,QAAQ,SAAS,EACjB,YAAY,uEAAuE;AAEtF,UACG,QAAQ,WAAW,EACnB,OAAO,UAAU,8BAA8B,EAC/C,YAAY,+EAA+E,EAC3F,OAAO,OAAO,SAA6B;AAC1C,UAAMA,WAAU,YAAY;AAC1B,YAAM,CAAC,WAAW,WAAW,IAAI,MAAM,QAAQ,IAAI;AAAA,QACjD,qBAAqB;AAAA,QACrB,mBAAmB;AAAA,MACrB,CAAC;AACD,YAAM,SAAS,MAAM,sBAAsB;AAAA,QACzC;AAAA,QACA,GAAI,gBAAgB,SAAY,EAAE,YAAY,IAAI,CAAC;AAAA,MACrD,CAAC;AACD,UAAI,KAAK,MAAM;AACb,gBAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C;AAAA,MACF;AACA,qBAAe,MAAM;AAAA,IACvB,CAAC;AAAA,EACH,CAAC;AAEH,UACG,QAAQ,SAAS,EACjB,SAAS,aAAa,oCAAoC,EAC1D,OAAO,mBAAmB,gDAAgD,EAC1E,OAAO,eAAe,6CAA6C,EACnE,OAAO,SAAS,gDAAgD,EAChE,OAAO,UAAU,8BAA8B,EAC/C,YAAY,2EAA2E,EACvF;AAAA,IACC,OACE,WACA,SACG;AACH,YAAMA,WAAU,YAAY;AAC1B,cAAM,SAAS,MAAM,cAAc,WAAW,IAAI;AAClD,YAAI,KAAK,MAAM;AACb,kBAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C;AAAA,QACF;AACA,wBAAgB,MAAM;AAAA,MACxB,CAAC;AAAA,IACH;AAAA,EACF;AAEF,UACG,QAAQ,SAAS,EACjB,SAAS,aAAa,oCAAoC,EAC1D,OAAO,mBAAmB,gDAAgD,EAC1E,OAAO,eAAe,6CAA6C,EACnE,OAAO,SAAS,gDAAgD,EAChE,YAAY,6DAA6D,EACzE,OAAO,OAAO,WAAqB,SAA2D;AAC7F,UAAMA,WAAU,YAAY;AAC1B,YAAM,SAAS,MAAM,cAAc,WAAW,IAAI;AAClD,cAAQ,IAAIC,IAAG,KAAK,eAAe,OAAO,YAAY,MAAM,kBAAkB,CAAC;AAC/E,iBAAW,QAAQ,OAAO,QAAS,SAAQ,IAAI,KAAKA,IAAG,IAAI,QAAG,CAAC,IAAI,IAAI,EAAE;AAAA,IAC3E,CAAC;AAAA,EACH,CAAC;AACL;AAEA,eAAe,cACb,WACA,MAC4B;AAC5B,QAAM,CAAC,WAAW,WAAW,IAAI,MAAM,QAAQ,IAAI;AAAA,IACjD,qBAAqB;AAAA,IACrB,mBAAmB;AAAA,EACrB,CAAC;AACD,QAAM,OAAO,UAAU,KAAK,GAAG,EAAE,KAAK;AAEtC,QAAM,YAAY,OAAO,MAAM,kBAAkB,QAAQ,IAAI,CAAC,IAAI;AAClE,MAAI;AACF,WAAO,MAAM,uBAAuB;AAAA,MAClC;AAAA,MACA,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,MACvB,GAAI,WAAW,iBAAiB,EAAE,gBAAgB,UAAU,eAAe,IAAI,CAAC;AAAA,MAChF,GAAI,WAAW,WAAW,EAAE,UAAU,UAAU,SAAS,IAAI,CAAC;AAAA,MAC9D,GAAI,KAAK,QAAQ,EAAE,OAAOF,YAAW,KAAK,KAAK,EAAE,IAAI,CAAC;AAAA,MACtD,GAAI,KAAK,OAAO,EAAE,QAAQ,KAAK,KAAK,IAAI,CAAC;AAAA,MACzC,GAAI,KAAK,QAAQ,SAAY,EAAE,QAAQ,KAAK,IAAI,IAAI,CAAC;AAAA,MACrD,GAAI,gBAAgB,SAAY,EAAE,YAAY,IAAI,CAAC;AAAA,IACrD,CAAC;AAAA,EACH,UAAE;AACA,UAAM,WAAW,MAAM;AAAA,EACzB;AACF;AAEA,SAAS,eAAe,KAA6B;AACnD,UAAQ,IAAI,GAAGE,IAAG,KAAK,SAAS,CAAC,IAAI,IAAI,QAAQ,SAAS,KAAKA,IAAG,IAAI,IAAI,QAAQ,IAAI,CAAC,EAAE;AACzF,UAAQ;AAAA,IACN,GAAGA,IAAG,KAAK,MAAM,CAAC,IAAI,IAAI,OAAO,GAAG,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,MAAM,MAAMA,IAAG,IAAI,MAAM,CAAC,KAAKA,IAAG,IAAI,UAAU,IAAI,MAAM,EAAE,CAAC;AAAA,EAC/H;AACA,MAAI,IAAI,YAAY,SAAS,GAAG;AAC9B,YAAQ,IAAIA,IAAG,KAAK,eAAe,CAAC;AACpC,eAAW,QAAQ,IAAI,aAAa;AAClC,cAAQ,IAAI,KAAK,KAAK,EAAE,KAAK,KAAK,MAAM,KAAKA,IAAG,IAAI,KAAK,OAAO,CAAC,EAAE;AAAA,IACrE;AAAA,EACF;AACA,MAAI,IAAI,UAAU,SAAS,GAAG;AAC5B,YAAQ,IAAIA,IAAG,KAAK,oBAAoB,CAAC;AACzC,eAAW,YAAY,IAAI,WAAW;AACpC,cAAQ;AAAA,QACN,KAAK,cAAc,SAAS,QAAQ,CAAC,IAAI,SAAS,OAAO,IAAIA,IAAG,IAAI,SAAS,OAAO,CAAC;AAAA,MACvF;AAAA,IACF;AAAA,EACF;AACA,cAAY,GAAG;AACf,UAAQ;AAAA,IACN,GAAGA,IAAG,KAAK,cAAc,CAAC,IAAI,IAAI,aAAa,WAAW,aAAa,IAAI,aAAa,SAAS;AAAA,EACnG;AACA,aAAW,WAAW,IAAI,aAAa,UAAU;AAC/C,YAAQ,IAAI,KAAK,QAAQ,IAAI,IAAIA,IAAG,IAAI,MAAM,QAAQ,OAAO,QAAQ,QAAQ,QAAQ,EAAE,CAAC,EAAE;AAAA,EAC5F;AACA,cAAY,GAAG;AACjB;AAEA,SAAS,gBAAgB,KAA8B;AACrD,UAAQ;AAAA,IACN,GAAGA,IAAG,KAAK,SAAS,CAAC,IAAI,IAAI,YAAY,MAAM,YAAYA,IAAG,IAAI,YAAY,IAAI,UAAU,GAAG,CAAC;AAAA,EAClG;AACA,aAAW,QAAQ,IAAI,YAAa,SAAQ,IAAI,KAAK,IAAI,EAAE;AAC3D,MAAI,IAAI,KAAM,SAAQ,IAAI,GAAGA,IAAG,KAAK,MAAM,CAAC,IAAI,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,MAAM,GAAG;AACrF,MAAI,IAAI,YAAY,SAAS,GAAG;AAC9B,YAAQ,IAAIA,IAAG,KAAK,wBAAwB,CAAC;AAC7C,eAAW,QAAQ,IAAI,YAAa,SAAQ,IAAI,KAAK,KAAK,EAAE,IAAIA,IAAG,IAAI,KAAK,OAAO,CAAC,EAAE;AAAA,EACxF;AACA,MAAI,IAAI,UAAU,SAAS,GAAG;AAC5B,YAAQ,IAAIA,IAAG,KAAK,4BAA4B,CAAC;AACjD,eAAW,YAAY,IAAI,WAAW;AACpC,cAAQ,IAAI,KAAK,cAAc,SAAS,QAAQ,CAAC,IAAI,SAAS,OAAO,EAAE;AAAA,IACzE;AAAA,EACF;AACA,cAAY,GAAG;AACf,MAAI,IAAI,MAAM,MAAM,SAAS,GAAG;AAC9B,YAAQ,IAAIA,IAAG,KAAK,OAAO,CAAC;AAC5B,eAAW,QAAQ,IAAI,MAAM,OAAO;AAClC,cAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,WAAW,KAAK,KAAK,CAAC,IAAIA,IAAG,IAAI,KAAK,MAAM,CAAC,EAAE;AAAA,IAC/E;AAAA,EACF;AACA,MAAI,IAAI,WAAW,SAAS,GAAG;AAC7B,YAAQ,IAAIA,IAAG,KAAK,oBAAoB,CAAC;AACzC,eAAW,aAAa,IAAI,YAAY;AACtC,cAAQ;AAAA,QACN,KAAK,UAAU,IAAI,IAAIA,IAAG,IAAI,SAAI,UAAU,UAAU,MAAM,UAAK,UAAU,aAAa,MAAM,EAAE,CAAC;AAAA,MACnG;AAAA,IACF;AAAA,EACF;AACA,MAAI,IAAI,QAAQ,SAAS,GAAG;AAC1B,YAAQ,IAAIA,IAAG,KAAK,gDAAgD,CAAC;AACrE,eAAW,QAAQ,IAAI,SAAS;AAC9B,cAAQ,IAAI,KAAK,KAAK,IAAI,IAAIA,IAAG,IAAI,GAAG,KAAK,WAAW,MAAM,YAAY,CAAC,EAAE;AAAA,IAC/E;AAAA,EACF;AACA,MAAI,IAAI,MAAM,SAAS,GAAG;AACxB,YAAQ,IAAIA,IAAG,KAAK,gBAAgB,CAAC;AACrC,eAAW,QAAQ,IAAI,OAAO;AAC5B,cAAQ,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,YAAYA,IAAG,IAAI,cAAc,IAAI,EAAE,EAAE;AAC3E,iBAAW,QAAQ,KAAK,MAAM,MAAM,IAAI,EAAE,MAAM,EAAE,EAAG,SAAQ,IAAIA,IAAG,IAAI,OAAO,IAAI,EAAE,CAAC;AAAA,IACxF;AAAA,EACF;AACA,cAAY,GAAG;AACjB;AAGA,SAAS,YAAY,KAAiD;AACpE,MAAI,IAAI,MAAM,SAAS,GAAG;AACxB,YAAQ,IAAIA,IAAG,KAAK,QAAQ,CAAC;AAC7B,eAAW,QAAQ,IAAI,OAAO;AAC5B,cAAQ,IAAI,KAAK,KAAK,OAAO,IAAIA,IAAG,IAAI,IAAI,KAAK,WAAW,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,CAAC,EAAE;AAAA,IAC9F;AAAA,EACF;AACA,MAAI,IAAI,SAAS,SAAS,GAAG;AAC3B,YAAQ,IAAIA,IAAG,KAAK,aAAa,CAAC;AAClC,eAAW,WAAW,IAAI,UAAU;AAClC,YAAM,QACJ,QAAQ,aAAa,SAAS,IAC1B,KAAK,QAAQ,aAAa,MAAM,2BAChC;AACN,cAAQ;AAAA,QACN,KAAK,QAAQ,QAAQ,QAAQ,QAAQ,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,IAAIA,IAAG,IAAI,IAAI,QAAQ,OAAO,QAAQ,KAAK,GAAG,CAAC;AAAA,MACxG;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,YAAY,KAAiD;AACpE,QAAM,EAAE,kBAAkB,OAAO,IAAI,IAAI;AACzC,UAAQ,IAAIA,IAAG,IAAI;AAAA,GAAM,gBAAgB,4BAA4B,MAAM,GAAG,CAAC;AACjF;AAEA,SAAS,cAAc,UAA0B;AAC/C,MAAI,aAAa,WAAY,QAAOA,IAAG,IAAI,QAAQ;AACnD,MAAI,aAAa,OAAQ,QAAOA,IAAG,IAAI,QAAQ;AAC/C,MAAI,aAAa,SAAU,QAAOA,IAAG,OAAO,QAAQ;AACpD,SAAOA,IAAG,IAAI,QAAQ;AACxB;AAEA,SAAS,WAAW,OAAuB;AACzC,MAAI,SAAS,GAAI,QAAOA,IAAG,IAAI,OAAO,KAAK,CAAC;AAC5C,MAAI,SAAS,GAAI,QAAOA,IAAG,OAAO,OAAO,KAAK,CAAC;AAC/C,SAAOA,IAAG,MAAM,OAAO,KAAK,CAAC;AAC/B;;;AC5OA,SAAS,SAAAC,cAAa;AAEtB,OAAOC,SAAQ;;;ACFf,SAAS,aAAa,iBAAiB;AACvC,SAAS,MAAM,YAAY;AAC3B,SAAS,oBAAyC;AAElD,SAAS,gBAAgB;;;ACClB,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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SAAS,QAAAC,aAAY;AACrB,SAAS,KAAAC,UAAS;;;ACAX,IAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","names":["pc","map","resolve","runSafely","pc","join","resolve","join","resolve","later","join","resolve","name","text","join","resolve","runSafely","pc","printReport","note","pc","parsePaths","runSafely","pc","spawn","pc","text","resolve","spawn","runSafely","pc","resolve","pc","readFile","dirname","join","resolve","resolve","join","readFile","dirname","runSafely","pc","pc","runSafely","pc","execFile","spawn","relative","pc","runSafely","relative","pc","execFile","spawn","pc","pc","name","runSafely","pc","runSafely","pc","writeFile","resolve","writeFile","pc","runSafely","pc","pc","runSafely","pc","spawn","relative","pc","runSafely","pc","relative","spawn","join","spinner","pc","row","KEY_ENV","text","pc","spinner","join","runSafely","spawn","relative","pc","pc","openEditor","resolve","spawn","runSafely","relative","plan","pc","runSafely","parsePaths","pc","scoreColor","truncate","relative","pc","runSafely","relative","pc","pc","parsePaths","runSafely","pc","severityBadge","readFile","resolve","pc","runSafely","pc","readFile","resolve","pc","mkdir","readFile","createServer","join","z","z","mkdir","createServer","join","json","listen","resolve","password","readFile","runSafely","pc","resolve","basename","confirm","isCancel","log","note","password","spinner","text","pc","mkdir","readFile","writeFile","dirname","join","z","bail","log","unwrap","isCancel","pingOnce","basename","confirm","note","pc","password","text","spinner","resolve","relative","pc","runSafely","pc","renderRow","short","relative","pc","runSafely","ok","pc","row","name","pc","ok","warn"]}