zam-core 0.9.0 → 0.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +87 -129
- package/dist/cli/app.js +22389 -0
- package/dist/cli/app.js.map +1 -0
- package/dist/{chunk-BOWP6D5I.js → cli/commands/mcp.js} +2873 -661
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/index.js +115 -16124
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-BOWP6D5I.js.map +0 -1
- package/dist/kernel-6JUK5NCB.js +0 -420
- package/dist/kernel-6JUK5NCB.js.map +0 -1
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/agent.ts","../../src/cli/agent-harness.ts","../../src/cli/terminal-open.ts","../../src/cli/commands/bridge.ts","../../src/cli/adapters/source-reader.ts","../../src/cli/llm/client.ts","../../src/cli/knowledge-contexts.ts","../../src/cli/llm/embedder.ts","../../src/cli/bridge-handlers.ts","../../src/cli/curriculum/breadcrumb.ts","../../src/cli/curriculum/providers/bildungsplan-bremen/manifest.ts","../../src/cli/curriculum/providers/bildungsplan-bremen/index.ts","../../src/cli/curriculum/providers/bildungsplan-bw/manifest.ts","../../src/cli/curriculum/providers/bildungsplan-bw/index.ts","../../src/cli/curriculum/providers/bildungsplan-hamburg/manifest.ts","../../src/cli/curriculum/providers/bildungsplan-hamburg/index.ts","../../src/cli/curriculum/providers/fachanforderungen-sh/manifest.ts","../../src/cli/curriculum/providers/fachanforderungen-sh/index.ts","../../src/cli/curriculum/providers/kerncurriculum-hessen/manifest.ts","../../src/cli/curriculum/providers/kerncurriculum-hessen/index.ts","../../src/cli/curriculum/providers/kerncurriculum-niedersachsen/manifest.ts","../../src/cli/curriculum/providers/kerncurriculum-niedersachsen/index.ts","../../src/cli/curriculum/providers/kernlehrplan-nrw/manifest.ts","../../src/cli/curriculum/providers/kernlehrplan-nrw/index.ts","../../src/cli/curriculum/providers/lehrplaene-rp/manifest.ts","../../src/cli/curriculum/providers/lehrplaene-rp/index.ts","../../src/cli/curriculum/providers/lehrplan-saarland/manifest.ts","../../src/cli/curriculum/providers/lehrplan-saarland/index.ts","../../src/cli/curriculum/providers/lehrplan-sachsen/manifest.ts","../../src/cli/curriculum/providers/lehrplan-sachsen/index.ts","../../src/cli/curriculum/providers/lehrplan-thueringen/manifest.ts","../../src/cli/curriculum/providers/lehrplan-thueringen/index.ts","../../src/cli/curriculum/providers/lehrplanplus-bayern/manifest.ts","../../src/cli/curriculum/providers/lehrplanplus-bayern/index.ts","../../src/cli/curriculum/providers/rahmenlehrplan-berlin-brandenburg/manifest.ts","../../src/cli/curriculum/providers/rahmenlehrplan-berlin-brandenburg/index.ts","../../src/cli/curriculum/providers/rahmenplan-mv/manifest.ts","../../src/cli/curriculum/providers/rahmenplan-mv/index.ts","../../src/cli/curriculum/providers/rahmenrichtlinien-st/manifest.ts","../../src/cli/curriculum/providers/rahmenrichtlinien-st/index.ts","../../src/cli/curriculum/registry.ts","../../src/cli/llm/vision.ts","../../src/cli/commands/shared/db.ts","../../src/cli/providers/config.ts","../../src/cli/provisioning/index.ts","../../src/cli/users/identity.ts","../../src/cli/workspaces/active.ts","../../src/cli/workspaces/backup.ts","../../src/cli/commands/card.ts","../../src/cli/commands/connector.ts","../../src/cli/commands/doctor.ts","../../src/cli/commands/git-sync.ts","../../src/cli/commands/goal.ts","../../src/cli/commands/init.ts","../../src/cli/commands/knowledge-context.ts","../../src/cli/commands/learn.ts","../../src/cli/learn-format.ts","../../src/cli/review-actions.ts","../../src/cli/commands/mcp.ts","../../src/cli/commands/monitor.ts","../../src/cli/commands/observer.ts","../../src/cli/commands/profile.ts","../../src/cli/commands/provider.ts","../../src/cli/commands/review.ts","../../src/cli/commands/session.ts","../../src/cli/commands/settings.ts","../../src/cli/commands/setup.ts","../../src/cli/commands/skill.ts","../../src/cli/commands/snapshot.ts","../../src/cli/commands/stats.ts","../../src/cli/commands/token.ts","../../src/cli/commands/ui.ts","../../src/cli/commands/update.ts","../../src/cli/commands/whoami.ts","../../src/cli/commands/workspace.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { Command } from \"commander\";\nimport { agentCommand } from \"./commands/agent.js\";\nimport { bridgeCommand } from \"./commands/bridge.js\";\nimport { cardCommand } from \"./commands/card.js\";\nimport { connectorCommand } from \"./commands/connector.js\";\nimport { doctorCommand } from \"./commands/doctor.js\";\nimport { gitSyncCommand } from \"./commands/git-sync.js\";\nimport { goalCommand } from \"./commands/goal.js\";\nimport { initCommand } from \"./commands/init.js\";\nimport { knowledgeContextCommand } from \"./commands/knowledge-context.js\";\nimport { learnCommand } from \"./commands/learn.js\";\nimport { mcpCommand } from \"./commands/mcp.js\";\nimport { monitorCommand } from \"./commands/monitor.js\";\nimport { observerCommand } from \"./commands/observer.js\";\nimport { profileCommand } from \"./commands/profile.js\";\nimport { providerCommand } from \"./commands/provider.js\";\nimport { reviewCommand } from \"./commands/review.js\";\nimport { sessionCommand } from \"./commands/session.js\";\nimport { settingsCommand } from \"./commands/settings.js\";\nimport { setupCommand } from \"./commands/setup.js\";\nimport { skillCommand } from \"./commands/skill.js\";\nimport { snapshotCommand } from \"./commands/snapshot.js\";\nimport { statsCommand } from \"./commands/stats.js\";\nimport { tokenCommand } from \"./commands/token.js\";\nimport { uiCommand } from \"./commands/ui.js\";\nimport { updateCommand } from \"./commands/update.js\";\nimport { whoamiCommand } from \"./commands/whoami.js\";\nimport { workspaceCommand } from \"./commands/workspace.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(\n readFileSync(join(__dirname, \"..\", \"..\", \"package.json\"), \"utf-8\"),\n) as { version: string };\n\nconst program = new Command();\n\nprogram\n .name(\"zam\")\n .description(\n \"The Symbiotic Learning Kernel: Elevating Human Intelligence through AI Collaboration.\",\n )\n .version(pkg.version);\n\nprogram.addCommand(initCommand);\nprogram.addCommand(setupCommand);\nprogram.addCommand(tokenCommand);\nprogram.addCommand(knowledgeContextCommand);\nprogram.addCommand(doctorCommand);\nprogram.addCommand(cardCommand);\nprogram.addCommand(sessionCommand);\nprogram.addCommand(statsCommand);\nprogram.addCommand(reviewCommand);\nprogram.addCommand(learnCommand);\nprogram.addCommand(uiCommand);\nprogram.addCommand(bridgeCommand);\nprogram.addCommand(mcpCommand);\nprogram.addCommand(skillCommand);\nprogram.addCommand(monitorCommand);\nprogram.addCommand(observerCommand);\nprogram.addCommand(settingsCommand);\nprogram.addCommand(whoamiCommand);\nprogram.addCommand(connectorCommand);\nprogram.addCommand(providerCommand);\nprogram.addCommand(snapshotCommand);\nprogram.addCommand(profileCommand);\nprogram.addCommand(updateCommand);\nprogram.addCommand(agentCommand);\nprogram.addCommand(goalCommand);\nprogram.addCommand(gitSyncCommand);\nprogram.addCommand(workspaceCommand);\n\nawait program.parseAsync();\n","/**\n * `zam agent` — provision and inspect the AI agent that drives ZAM sessions.\n *\n * Default mode still relies on an external agent CLI; this command installs one\n * for the user (currently opencode — the only candidate native on both Apple\n * Silicon and Windows on ARM with its own GUI) so non-developers don't have to.\n * opencode reads the AGENTS.md that `zam setup` writes, which is how it picks\n * up the ZAM skill. (Increment 12, Phase 6.)\n */\n\nimport { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { Command } from \"commander\";\nimport type { Database } from \"../../kernel/index.js\";\nimport {\n getSetting,\n hasCommand,\n installOpenCode,\n openDatabase,\n} from \"../../kernel/index.js\";\nimport {\n AGENT_HARNESSES,\n type ConnectHarnessId,\n type ConnectResult,\n connectHarnessMcp,\n getHarness,\n launchHarness,\n resolveHarnessExecutable,\n} from \"../agent-harness.js\";\nimport { findExecutable, normalizeShell } from \"../terminal-open.js\";\n\nconst C = {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n cyan: \"\\x1b[36m\",\n dim: \"\\x1b[2m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n};\n\nconst SUPPORTED_AGENTS = [\"opencode\"];\nconst CONNECT_HARNESSES: ConnectHarnessId[] = [\n \"claude-code\",\n \"antigravity\",\n \"codex\",\n \"opencode\",\n \"goose\",\n \"copilot\",\n];\n\nfunction isConnectHarnessId(value: string): value is ConnectHarnessId {\n return CONNECT_HARNESSES.includes(value as ConnectHarnessId);\n}\n\nfunction agentsMdPresent(cwd = process.cwd()): boolean {\n return existsSync(join(cwd, \"AGENTS.md\"));\n}\n\nfunction printStatus(): void {\n const installed = hasCommand(\"opencode\");\n const wired = agentsMdPresent();\n\n console.log(`${C.bold}ZAM agent${C.reset}`);\n console.log(\n ` opencode: ${\n installed\n ? `${C.green}installed${C.reset}`\n : `${C.yellow}not installed${C.reset} ${C.dim}(zam agent install)${C.reset}`\n }`,\n );\n console.log(\n ` AGENTS.md: ${\n wired\n ? `${C.green}present${C.reset} ${C.dim}(opencode reads this)${C.reset}`\n : `${C.yellow}missing${C.reset} ${C.dim}(run zam setup to wire the ZAM skill)${C.reset}`\n }`,\n );\n}\n\nconst installCmd = new Command(\"install\")\n .description(\"Download and install the default agent (opencode)\")\n .option(\"--agent <name>\", \"Agent to install\", \"opencode\")\n .action((opts: { agent: string }) => {\n if (!SUPPORTED_AGENTS.includes(opts.agent)) {\n console.error(\n `Unsupported agent: ${opts.agent}. Supported: ${SUPPORTED_AGENTS.join(\", \")}.`,\n );\n process.exit(1);\n }\n\n const result = installOpenCode();\n if (!result.success) {\n console.error(`${C.yellow}✗${C.reset} ${result.message}`);\n process.exit(1);\n }\n\n console.log(`${C.green}✓${C.reset} ${result.message}`);\n if (agentsMdPresent()) {\n console.log(\n ` ${C.dim}opencode will read AGENTS.md here and pick up the ZAM skill.${C.reset}`,\n );\n } else {\n console.log(\n ` Run ${C.cyan}zam setup${C.reset} to write AGENTS.md so opencode uses the ZAM skill.`,\n );\n }\n console.log(` Start it with: ${C.cyan}opencode${C.reset}`);\n });\n\nconst statusCmd = new Command(\"status\")\n .description(\"Show whether the agent is installed and wired to ZAM\")\n .action(printStatus);\n\nconst listCmd = new Command(\"list\")\n .description(\"List known agent harnesses and whether each is detected\")\n .action(() => {\n console.log(`${C.bold}Agent harnesses${C.reset}`);\n for (const h of AGENT_HARNESSES) {\n const status = resolveHarnessExecutable(h)\n ? `${C.green}detected${C.reset}`\n : `${C.yellow}not found${C.reset}`;\n console.log(\n ` ${h.id.padEnd(13)} ${status} ${C.dim}${h.label} (${h.kind})${C.reset}`,\n );\n }\n console.log(`\\n ${C.dim}Open one: zam agent open --id <id>${C.reset}`);\n console.log(\n ` ${C.dim}Point ZAM at a custom path: zam settings set agent.<id>.command <path>${C.reset}`,\n );\n });\n\nconst openCmd = new Command(\"open\")\n .description(\"Open an agent harness in the workspace, ready to drive ZAM\")\n .option(\n \"--id <id>\",\n \"Harness id (default: agent.default setting, else first detected)\",\n )\n .option(\"--dir <path>\", \"Workspace directory (defaults to cwd)\")\n .option(\n \"--shell <type>\",\n \"Shell type: zsh | bash | pwsh | powershell (auto-detected)\",\n )\n .action(async (opts: { id?: string; dir?: string; shell?: string }) => {\n let shell: ReturnType<typeof normalizeShell>;\n try {\n shell = normalizeShell(opts.shell);\n } catch (err) {\n console.error(`Error: ${(err as Error).message}`);\n process.exit(1);\n }\n\n let id = opts.id;\n let override: string | undefined;\n let db: Database | undefined;\n try {\n db = await openDatabase();\n if (!id) {\n id = (await getSetting(db, \"agent.default\")) || undefined;\n }\n if (!id) {\n id = AGENT_HARNESSES.find((h) => resolveHarnessExecutable(h))?.id;\n }\n if (id) {\n override = (await getSetting(db, `agent.${id}.command`)) || undefined;\n }\n } finally {\n await db?.close();\n }\n\n if (!id) {\n console.error(\n \"No agent harness configured or detected. Install one (e.g. zam agent install), then set a default: zam settings set agent.default <id>.\",\n );\n process.exit(1);\n }\n\n const harness = getHarness(id);\n if (!harness) {\n console.error(\n `Unknown harness: ${id}. Known: ${AGENT_HARNESSES.map((h) => h.id).join(\", \")}.`,\n );\n process.exit(1);\n }\n\n const executable = resolveHarnessExecutable(harness, override);\n if (!executable) {\n console.error(\n `${harness.label} was not detected. Install it, or point ZAM at it: zam settings set agent.${harness.id}.command <path>.`,\n );\n process.exit(1);\n }\n\n const workspace = opts.dir ?? process.cwd();\n launchHarness(harness, { executable, workspace, shell });\n });\n\nconst connectCmd = new Command(\"connect\")\n .description(\"Configure the ZAM MCP server for an agent harness\")\n .argument(\n \"<harness>\",\n \"Harness to connect: claude-code | antigravity | codex | opencode | goose | copilot\",\n )\n .option(\n \"--print\",\n \"Print configuration changes instead of writing them to disk\",\n )\n .action(async (harnessArg, opts: { print?: boolean }) => {\n if (!isConnectHarnessId(harnessArg)) {\n console.error(\n `Unsupported harness: ${harnessArg}. Supported: ${CONNECT_HARNESSES.join(\", \")}.`,\n );\n process.exit(1);\n }\n\n let zamPath = findExecutable(\"zam\");\n if (!zamPath) {\n console.warn(\n `${C.yellow}Warning: 'zam' executable was not found on your PATH. Falling back to literal 'zam'.${C.reset}`,\n );\n zamPath = \"zam\";\n }\n\n let result: ConnectResult;\n try {\n result = connectHarnessMcp(harnessArg, {\n zamPath,\n cwd: process.cwd(),\n home: homedir(),\n });\n } catch (error) {\n console.error(\n `Error preparing MCP configuration: ${error instanceof Error ? error.message : String(error)}`,\n );\n process.exit(1);\n }\n\n if (opts.print) {\n console.log(`Path: ${result.path}`);\n console.log(`Content:\\n${result.content}`);\n return;\n }\n\n if (result.alreadyConfigured) {\n console.log(\n `${C.green}✓${C.reset} MCP server 'zam' already configured in ${result.path}`,\n );\n return;\n }\n\n try {\n mkdirSync(dirname(result.path), { recursive: true });\n writeFileSync(result.path, result.content, \"utf-8\");\n console.log(\n `${C.green}✓${C.reset} Wrote MCP configuration to ${result.path}`,\n );\n console.log(` ${C.dim}${result.hint}${C.reset}`);\n } catch (error) {\n console.error(\n `Error writing MCP configuration: ${error instanceof Error ? error.message : String(error)}`,\n );\n process.exit(1);\n }\n });\n\nexport const agentCommand = new Command(\"agent\")\n .description(\"Provision and inspect the agent that drives ZAM sessions\")\n .addCommand(installCmd)\n .addCommand(statusCmd)\n .addCommand(openCmd)\n .addCommand(listCmd)\n .addCommand(connectCmd)\n .action(printStatus);\n","/**\n * Agent-harness registry (ADR 2026-06-23 §Decision 2 / action item 5).\n *\n * A *harness* is the external AI the learner works *with* — it drives ZAM via\n * `zam bridge`. This is the \"Open Agent\" axis, deliberately separate from the\n * providers ZAM calls itself (see `llm/client.ts` `getProviderForRole`).\n *\n * CLI harnesses open in a terminal in the workspace (reusing `terminal-open.ts`);\n * app harnesses are launched as a detached process with the workspace as an\n * argument. Commands/paths are best-effort and overridable per harness via the\n * `agent.<id>.command` setting, since these tools churn and install paths vary.\n */\n\nimport { spawn } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport {\n buildShellSetupCommand,\n findExecutable,\n isPowerShellShell,\n openTerminalWindow,\n psSingleQuoted,\n type TerminalShell,\n} from \"./terminal-open.js\";\n\nexport type AgentHarnessId =\n | \"claude-code\"\n | \"codex\"\n | \"opencode\"\n | \"cursor\"\n | \"copilot\"\n | \"antigravity\"\n | \"goose\";\n\nexport interface AgentHarness {\n id: AgentHarnessId;\n label: string;\n kind: \"cli\" | \"app\";\n /** Default executable / CLI command; override via `agent.<id>.command`. */\n command: string;\n /** Best-effort absolute paths to probe for app harnesses, per platform. */\n candidatePaths?: Partial<Record<NodeJS.Platform, string[]>>;\n}\n\n/**\n * Known harnesses. CLI-first ones (Claude Code, Codex, opencode) launch in a\n * terminal; GUI apps (Cursor, Copilot, Antigravity) launch as a process. The\n * commands are sensible defaults — when a tool isn't on PATH under that name,\n * the user points us at it with `zam settings set agent.<id>.command <path>`.\n */\nexport const AGENT_HARNESSES: AgentHarness[] = [\n { id: \"claude-code\", label: \"Claude Code\", kind: \"cli\", command: \"claude\" },\n { id: \"codex\", label: \"Codex\", kind: \"cli\", command: \"codex\" },\n { id: \"opencode\", label: \"opencode\", kind: \"cli\", command: \"opencode\" },\n {\n id: \"cursor\",\n label: \"Cursor\",\n kind: \"app\",\n command: \"cursor\",\n candidatePaths: {\n win32: [\n join(homedir(), \"AppData\", \"Local\", \"Programs\", \"cursor\", \"Cursor.exe\"),\n ],\n darwin: [\"/Applications/Cursor.app/Contents/MacOS/Cursor\"],\n },\n },\n { id: \"copilot\", label: \"GitHub Copilot\", kind: \"app\", command: \"copilot\" },\n {\n id: \"antigravity\",\n label: \"Antigravity\",\n kind: \"app\",\n command: \"antigravity\",\n },\n { id: \"goose\", label: \"goose\", kind: \"cli\", command: \"goose\" },\n];\n\nexport function getHarness(id: string): AgentHarness | undefined {\n return AGENT_HARNESSES.find((h) => h.id === id);\n}\n\nexport interface ResolveDeps {\n find?: (command: string) => string | null;\n exists?: (path: string) => boolean;\n platform?: NodeJS.Platform;\n}\n\n/**\n * Resolve the runnable executable for a harness, or null if not detected.\n * Tries the (possibly overridden) command on PATH first, then — for app\n * harnesses — the per-platform candidate paths. Dependencies are injectable so\n * the resolution logic is unit-testable without touching the real system.\n */\nexport function resolveHarnessExecutable(\n harness: AgentHarness,\n overrideCommand?: string,\n deps: ResolveDeps = {},\n): string | null {\n const find = deps.find ?? findExecutable;\n const exists = deps.exists ?? existsSync;\n const platform = deps.platform ?? process.platform;\n\n const found = find(overrideCommand || harness.command);\n if (found) return found;\n\n if (harness.kind === \"app\") {\n for (const candidate of harness.candidatePaths?.[platform] ?? []) {\n if (exists(candidate)) return candidate;\n }\n }\n return null;\n}\n\nexport type AgentLaunchPlan =\n | { kind: \"cli\"; shellSetup: string; shell: TerminalShell }\n | { kind: \"app\"; executable: string; args: string[] };\n\n/** Pure: build the launch plan for a resolved harness (no side effects). */\nexport function planHarnessLaunch(\n harness: AgentHarness,\n opts: { executable: string; workspace: string; shell: TerminalShell },\n): AgentLaunchPlan {\n if (harness.kind === \"cli\") {\n const invocation = isPowerShellShell(opts.shell)\n ? `& ${psSingleQuoted(opts.executable)}`\n : JSON.stringify(opts.executable);\n return {\n kind: \"cli\",\n shell: opts.shell,\n shellSetup: buildShellSetupCommand(\n opts.workspace,\n opts.shell,\n invocation,\n ),\n };\n }\n return { kind: \"app\", executable: opts.executable, args: [opts.workspace] };\n}\n\n/** Launch the harness: a terminal window for CLI, a detached process for app. */\nexport function launchHarness(\n harness: AgentHarness,\n opts: {\n executable: string;\n workspace: string;\n shell: TerminalShell;\n silent?: boolean;\n platform?: NodeJS.Platform;\n },\n): void {\n const plan = planHarnessLaunch(harness, opts);\n if (plan.kind === \"cli\") {\n openTerminalWindow({\n shellSetup: plan.shellSetup,\n label: `agent-${harness.id}`,\n dir: opts.workspace,\n shell: plan.shell,\n silent: opts.silent,\n platform: opts.platform,\n });\n return;\n }\n spawn(plan.executable, plan.args, {\n detached: true,\n stdio: \"ignore\",\n windowsHide: true,\n }).unref();\n if (!opts.silent) {\n console.log(`Launched ${harness.label} in ${opts.workspace}`);\n }\n}\n\nexport interface ConnectResult {\n path: string;\n content: string;\n alreadyConfigured: boolean;\n hint: string;\n}\n\nexport type ConnectHarnessId =\n | \"claude-code\"\n | \"antigravity\"\n | \"codex\"\n | \"opencode\"\n | \"goose\"\n | \"copilot\";\n\ninterface McpJsonConfig {\n mcpServers?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nfunction parseMcpJsonConfig(path: string, content: string): McpJsonConfig {\n let parsed: unknown;\n try {\n parsed = JSON.parse(content);\n } catch (error) {\n throw new Error(\n `Cannot update ${path}: existing file is not valid JSON (${error instanceof Error ? error.message : String(error)})`,\n );\n }\n\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new Error(`Cannot update ${path}: expected a JSON object`);\n }\n\n const config = parsed as McpJsonConfig;\n if (\n config.mcpServers !== undefined &&\n (typeof config.mcpServers !== \"object\" ||\n config.mcpServers === null ||\n Array.isArray(config.mcpServers))\n ) {\n throw new Error(`Cannot update ${path}: mcpServers must be a JSON object`);\n }\n return config;\n}\n\n/**\n * Pure helper to build the target path and expected MCP server configuration.\n */\nexport function connectHarnessMcp(\n harnessId: ConnectHarnessId,\n opts: {\n zamPath: string;\n cwd: string;\n home: string;\n readFile?: (path: string) => string;\n },\n): ConnectResult {\n const exists = (p: string) => {\n if (opts.readFile) {\n try {\n opts.readFile(p);\n return true;\n } catch {\n return false;\n }\n }\n return existsSync(p);\n };\n\n const read = (p: string) => {\n if (opts.readFile) return opts.readFile(p);\n return readFileSync(p, \"utf-8\");\n };\n\n let targetPath = \"\";\n let content = \"\";\n let alreadyConfigured = false;\n let hint = \"\";\n\n if (harnessId === \"claude-code\") {\n targetPath = join(opts.cwd, \".mcp.json\");\n hint =\n \"Claude Code will prompt you to approve the 'zam' MCP server on next launch.\";\n let existing: McpJsonConfig = {};\n if (exists(targetPath)) {\n existing = parseMcpJsonConfig(targetPath, read(targetPath));\n }\n if (!existing.mcpServers) {\n existing.mcpServers = {};\n }\n existing.mcpServers.zam = {\n command: opts.zamPath,\n args: [\"mcp\"],\n };\n content = JSON.stringify(existing, null, 2);\n } else if (harnessId === \"antigravity\") {\n targetPath = join(opts.home, \".gemini\", \"config\", \"mcp_config.json\");\n hint =\n \"Shared config read by Antigravity CLI and IDE (2.0+); older IDE builds read ~/.gemini/antigravity/mcp_config.json instead. Refresh Installed MCP Servers; the first tool call may still require approval.\";\n let existing: McpJsonConfig = {};\n if (exists(targetPath)) {\n existing = parseMcpJsonConfig(targetPath, read(targetPath));\n }\n if (!existing.mcpServers) {\n existing.mcpServers = {};\n }\n existing.mcpServers.zam = {\n command: opts.zamPath,\n args: [\"mcp\"],\n };\n content = JSON.stringify(existing, null, 2);\n } else if (harnessId === \"opencode\") {\n targetPath = join(opts.home, \".config\", \"opencode\", \"opencode.json\");\n hint = \"OpenCode will load the enabled 'zam' MCP server on next launch.\";\n let existing: McpJsonConfig = {};\n if (exists(targetPath)) {\n existing = parseMcpJsonConfig(targetPath, read(targetPath));\n }\n const mcp = existing.mcp;\n if (\n mcp !== undefined &&\n (typeof mcp !== \"object\" || mcp === null || Array.isArray(mcp))\n ) {\n throw new Error(`Cannot update ${targetPath}: mcp must be a JSON object`);\n }\n const servers = (mcp ?? {}) as Record<string, unknown>;\n servers.zam = {\n type: \"local\",\n command: [opts.zamPath, \"mcp\"],\n enabled: true,\n };\n existing.mcp = servers;\n content = JSON.stringify(existing, null, 2);\n } else if (harnessId === \"codex\") {\n targetPath = join(opts.home, \".codex\", \"config.toml\");\n hint =\n \"Codex will prompt for tool execution approvals or respect the TOML approval modes.\";\n let existingStr = \"\";\n if (exists(targetPath)) {\n existingStr = read(targetPath);\n }\n if (existingStr.includes(\"[mcp_servers.zam]\")) {\n alreadyConfigured = true;\n content = existingStr;\n } else {\n const block = `\n[mcp_servers.zam]\ncommand = ${JSON.stringify(opts.zamPath)}\nargs = [\"mcp\"]\ndefault_tools_approval_mode = \"approve\"\n\n[mcp_servers.zam.tools.zam_review_action]\napproval_mode = \"prompt\"\n`;\n content = existingStr ? `${existingStr.trimEnd()}\\n${block}` : block;\n }\n } else if (harnessId === \"goose\") {\n targetPath = join(opts.home, \".config\", \"goose\", \"config.yaml\");\n hint =\n \"goose will load the 'zam' extension on next session start. Run 'goose configure' to manage extensions.\";\n // The `zam` entry, indented for placement directly under the `extensions:` map.\n const zamExtension = [\n \" zam:\",\n \" name: ZAM\",\n ` cmd: ${opts.zamPath}`,\n \" args:\",\n \" - mcp\",\n \" enabled: true\",\n \" type: stdio\",\n \" timeout: 300\",\n \" description: Symbiotic learning agent with spaced repetition\",\n ].join(\"\\n\");\n let existingStr = \"\";\n if (exists(targetPath)) {\n existingStr = read(targetPath);\n }\n if (/^\\s+zam:\\s*$/m.test(existingStr) && existingStr.includes(\"- mcp\")) {\n // An indented `zam:` extension wired to `zam mcp` is already present.\n alreadyConfigured = true;\n content = existingStr;\n } else if (/^extensions:[ \\t]*$/m.test(existingStr)) {\n // Insert as the first child of the existing `extensions:` map. Appending at\n // end-of-file is wrong: goose configs carry top-level keys (providers, model,\n // …) after `extensions:`, so an appended block lands outside the map — or\n // under a trailing scalar — producing YAML that goose silently drops.\n content = existingStr.replace(\n /^extensions:[ \\t]*$/m,\n (line) => `${line}\\n${zamExtension}`,\n );\n } else if (existingStr.trim()) {\n // Config exists but has no `extensions:` map yet — add one.\n content = `${existingStr.trimEnd()}\\nextensions:\\n${zamExtension}\\n`;\n } else {\n content = `extensions:\\n${zamExtension}\\n`;\n }\n } else if (harnessId === \"copilot\") {\n targetPath = join(opts.home, \".copilot\", \"mcp-config.json\");\n hint =\n \"GitHub Copilot CLI will load the 'zam' MCP server on next session. Use '/mcp show' in Copilot CLI to verify.\";\n let existing: McpJsonConfig = {};\n if (exists(targetPath)) {\n existing = parseMcpJsonConfig(targetPath, read(targetPath));\n }\n if (!existing.mcpServers) {\n existing.mcpServers = {};\n }\n existing.mcpServers.zam = {\n type: \"local\",\n command: opts.zamPath,\n args: [\"mcp\"],\n tools: [\"*\"],\n };\n content = JSON.stringify(existing, null, 2);\n }\n\n return {\n path: targetPath,\n content,\n alreadyConfigured,\n hint,\n };\n}\n","/**\n * Cross-platform helpers for spawning an interactive shell in a new window.\n * Used by `zam monitor open` and `zam learn open`.\n */\n\nimport { execFileSync, execSync } from \"node:child_process\";\nimport {\n accessSync,\n constants,\n existsSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { basename, delimiter, extname, isAbsolute, join } from \"node:path\";\n\nexport type TerminalShell = \"zsh\" | \"bash\" | \"pwsh\" | \"powershell\";\n\nexport function isPowerShellShell(shell: TerminalShell): boolean {\n return shell === \"pwsh\" || shell === \"powershell\";\n}\n\nexport function psSingleQuoted(value: string): string {\n return `'${value.replace(/'/g, \"''\")}'`;\n}\n\nexport function detectShell(): TerminalShell {\n if (process.platform === \"win32\")\n return findExecutable(\"pwsh.exe\") ? \"pwsh\" : \"powershell\";\n const shell = process.env.SHELL ?? \"\";\n return basename(shell) === \"bash\" ? \"bash\" : \"zsh\";\n}\n\nexport function normalizeShell(shell: string | undefined): TerminalShell {\n if (!shell) return detectShell();\n const normalized = shell.toLowerCase();\n if (\n normalized === \"zsh\" ||\n normalized === \"bash\" ||\n normalized === \"pwsh\" ||\n normalized === \"powershell\"\n ) {\n return normalized;\n }\n throw new Error(\n `Unsupported shell: ${shell}. Expected zsh, bash, pwsh, or powershell.`,\n );\n}\n\n/**\n * Pick the path PowerShell/cmd can actually run from `where.exe` output.\n */\nexport function selectWindowsExecutable(\n results: string[],\n pathext: string = process.env.PATHEXT ?? \".COM;.EXE;.BAT;.CMD\",\n): string | null {\n if (results.length === 0) return null;\n const extensions = pathext\n .split(\";\")\n .map((ext) => ext.trim().toLowerCase())\n .filter(Boolean);\n const runnable = results.find((result) =>\n extensions.some((ext) => result.toLowerCase().endsWith(ext)),\n );\n return runnable ?? results[0];\n}\n\nfunction stripSurroundingQuotes(command: string): string {\n const trimmed = command.trim();\n if (trimmed.length < 2) return trimmed;\n const first = trimmed[0];\n const last = trimmed[trimmed.length - 1];\n if ((first === '\"' && last === '\"') || (first === \"'\" && last === \"'\")) {\n return trimmed.slice(1, -1);\n }\n return trimmed;\n}\n\nfunction executableExists(path: string): boolean {\n if (!existsSync(path)) return false;\n if (process.platform === \"win32\") return true;\n try {\n accessSync(path, constants.X_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction windowsExecutableNames(command: string): string[] {\n if (process.platform !== \"win32\") return [command];\n if (extname(command)) return [command];\n const extensions = (process.env.PATHEXT ?? \".COM;.EXE;.BAT;.CMD\")\n .split(\";\")\n .map((ext) => ext.trim())\n .filter(Boolean);\n return extensions.map((ext) => `${command}${ext}`);\n}\n\nfunction hasDirectoryPart(command: string): boolean {\n return isAbsolute(command) || command.includes(\"/\") || command.includes(\"\\\\\");\n}\n\nexport function findExecutable(command: string): string | null {\n const normalized = stripSurroundingQuotes(command);\n if (!normalized) return null;\n\n const matches: string[] = [];\n if (hasDirectoryPart(normalized)) {\n for (const candidate of windowsExecutableNames(normalized)) {\n if (executableExists(candidate)) matches.push(candidate);\n }\n return process.platform === \"win32\"\n ? selectWindowsExecutable(matches)\n : (matches[0] ?? null);\n }\n\n const pathEntries = (process.env.PATH ?? \"\")\n .split(delimiter)\n .map((entry) => entry.trim())\n .filter(Boolean);\n for (const entry of pathEntries) {\n for (const name of windowsExecutableNames(normalized)) {\n const candidate = join(entry, name);\n if (executableExists(candidate)) matches.push(candidate);\n }\n }\n\n return process.platform === \"win32\"\n ? selectWindowsExecutable(matches)\n : (matches[0] ?? null);\n}\n\nexport function resolveZamInvocation(shell: TerminalShell): string {\n const installed = findExecutable(\"zam\");\n if (installed) {\n return isPowerShellShell(shell)\n ? `& ${psSingleQuoted(installed)}`\n : installed;\n }\n\n const projectRoot = join(import.meta.dirname, \"..\", \"..\");\n const cliSource = join(projectRoot, \"src/cli/index.ts\");\n if (isPowerShellShell(shell)) {\n return `& npx --prefix ${psSingleQuoted(projectRoot)} tsx ${psSingleQuoted(cliSource)}`;\n }\n return `npx --prefix ${JSON.stringify(projectRoot)} tsx ${JSON.stringify(cliSource)}`;\n}\n\nexport function buildShellSetupCommand(\n dir: string,\n shell: TerminalShell,\n command: string,\n): string {\n if (isPowerShellShell(shell)) {\n return [`Set-Location -LiteralPath ${psSingleQuoted(dir)}`, command].join(\n \"; \",\n );\n }\n\n return `cd ${JSON.stringify(dir)} && ${command}`;\n}\n\nfunction isItermRunning(): boolean {\n try {\n const result = execSync(\n 'osascript -e \\'tell application \"System Events\" to (name of processes) contains \"iTerm2\"\\' 2>/dev/null',\n { encoding: \"utf-8\" },\n ).trim();\n return result === \"true\";\n } catch {\n return false;\n }\n}\n\nfunction openMacTerminal(\n shellSetup: string,\n label: string,\n dir: string,\n silent: boolean,\n): void {\n const useIterm = isItermRunning();\n const escaped = shellSetup.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n\n const appleScript = useIterm\n ? `tell application \"iTerm2\"\n activate\n set newWindow to (create window with default profile)\n tell current session of newWindow\n write text \"${escaped}\"\n end tell\nend tell`\n : `tell application \"Terminal\"\n activate\n do script \"${escaped}\"\nend tell`;\n\n const tmpFile = join(tmpdir(), `zam-terminal-${label}.scpt`);\n try {\n writeFileSync(tmpFile, appleScript);\n execSync(`osascript ${JSON.stringify(tmpFile)}`, { stdio: \"ignore\" });\n if (!silent) {\n console.log(\n `Opened ${useIterm ? \"iTerm2\" : \"Terminal.app\"} window (${label})`,\n );\n console.log(` Directory: ${dir}`);\n }\n } catch (err) {\n if (!silent) {\n console.error(`Failed to open terminal: ${(err as Error).message}`);\n console.log(`\\nRun this manually in a new terminal:\\n`);\n console.log(` ${shellSetup}`);\n }\n } finally {\n try {\n unlinkSync(tmpFile);\n } catch {\n /* ignore */\n }\n }\n}\n\nfunction openWindowsPowerShell(\n shellSetup: string,\n label: string,\n dir: string,\n requestedShell: TerminalShell,\n silent: boolean,\n): void {\n const requestedExecutable =\n requestedShell === \"powershell\" ? \"powershell.exe\" : \"pwsh.exe\";\n const executable = findExecutable(requestedExecutable)\n ? requestedExecutable\n : \"powershell.exe\";\n const startCommand = [\n \"Start-Process\",\n `-FilePath ${psSingleQuoted(executable)}`,\n `-ArgumentList @('-NoExit','-NoProfile','-Command',${psSingleQuoted(shellSetup)})`,\n ].join(\" \");\n\n const launcher = findExecutable(\"pwsh.exe\") ? \"pwsh.exe\" : \"powershell.exe\";\n\n try {\n execFileSync(\n launcher,\n [\"-NoProfile\", \"-ExecutionPolicy\", \"Bypass\", \"-Command\", startCommand],\n {\n stdio: \"ignore\",\n },\n );\n if (!silent) {\n console.log(\n `Opened ${executable === \"pwsh.exe\" ? \"PowerShell\" : \"Windows PowerShell\"} window (${label})`,\n );\n console.log(` Directory: ${dir}`);\n }\n } catch (err) {\n if (!silent) {\n console.error(`Failed to open PowerShell: ${(err as Error).message}`);\n console.log(`\\nRun this manually in a new PowerShell terminal:\\n`);\n console.log(` ${shellSetup}`);\n }\n }\n}\n\nexport function openTerminalWindow(opts: {\n shellSetup: string;\n label: string;\n dir: string;\n shell: TerminalShell;\n silent?: boolean;\n platform?: NodeJS.Platform;\n}): void {\n const { shellSetup, label, dir, shell, silent = false } = opts;\n const platform = opts.platform ?? process.platform;\n\n if (platform === \"darwin\" && !isPowerShellShell(shell)) {\n openMacTerminal(shellSetup, label, dir, silent);\n return;\n }\n\n if (platform === \"win32\" && isPowerShellShell(shell)) {\n openWindowsPowerShell(shellSetup, label, dir, shell, silent);\n return;\n }\n\n if (!silent) {\n console.log(`Run this in a new terminal:\\n`);\n console.log(` ${shellSetup}\\n`);\n console.log(\n `(Automatic terminal opening is only supported on macOS Terminal/iTerm2 and Windows PowerShell for now.)`,\n );\n }\n}\n","/**\n * `zam bridge` — Machine-readable JSON protocol for AI integration.\n *\n * All output is valid JSON only. No human-readable formatting.\n * Errors are also JSON: { \"error\": \"message\" }\n */\n\nimport { execFileSync } from \"node:child_process\";\nimport { randomBytes } from \"node:crypto\";\nimport { existsSync, readdirSync, readFileSync, rmSync } from \"node:fs\";\nimport { homedir, tmpdir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport { Command } from \"commander\";\nimport { ulid } from \"ulid\";\nimport type {\n BloomLevel,\n Database,\n KnowledgeContext,\n ListTokensOptions,\n NeighborhoodToken,\n Rating,\n ReviewActionType,\n SymbiosisMode,\n TokenPattern,\n} from \"../../kernel/index.js\";\nimport {\n appendUiObservationReport,\n assignTokenToContext,\n BUILT_IN_SENSITIVE_MATCHERS,\n clearProviderApiKey,\n confirmCardSplit,\n confirmFoundations,\n confirmSourceImport,\n createToken,\n decidePostCapture,\n decidePreCapture,\n deleteCardForUser,\n deleteToken,\n discoverSkills,\n ensureCard,\n generateConceptFreeCue,\n generateTokenSlug,\n getActiveWorkspaceContext,\n getAgentSkill,\n getCard,\n getCardDeletionImpact,\n getConfiguredWorkspaces,\n getDatabaseTargetInfo,\n getDisplayTitle,\n getKnowledgeContextByName,\n getProviderApiKey,\n getSetting,\n getSystemProfile,\n getTokenBySlug,\n getTokenDeleteImpact,\n getTokenNeighborhood,\n hasCommand,\n importCurriculumCards,\n isOllamaInstalled,\n listAgentSkills,\n listKnowledgeContexts,\n listPersonalCards,\n listProviderApiKeyRefs,\n listTokens,\n openDatabase,\n pairCommands,\n readMonitorLog,\n readUiObservationLog,\n resolveObserverPolicy,\n resolveReviewContext,\n setActiveWorkspaceContext,\n setProviderApiKey,\n setSetting,\n slugify,\n syncObserverSidecarPolicy,\n uiObservationLogExists,\n unassignTokenFromContext,\n updateToken,\n type WorkspaceConfig,\n type WorkspaceKind,\n} from \"../../kernel/index.js\";\nimport {\n cleanHtml,\n isSafeUrl,\n readImageOCR,\n readLocalFile,\n readWebLink,\n} from \"../adapters/source-reader.js\";\nimport {\n AGENT_HARNESSES,\n getHarness,\n launchHarness,\n resolveHarnessExecutable,\n} from \"../agent-harness.js\";\nimport {\n addToken as handleAddToken,\n analyzeMonitor as handleAnalyzeMonitor,\n checkDue as handleCheckDue,\n endSession as handleEndSession,\n findTokens as handleFindTokens,\n getMonitor as handleGetMonitor,\n getReview as handleGetReview,\n getReviewsBatch as handleGetReviewsBatch,\n reviewAction as handleReviewAction,\n sessionOpen as handleSessionOpen,\n startSession as handleStartSession,\n submitReview as handleSubmitReview,\n suggestFoundations as handleSuggestFoundations,\n} from \"../bridge-handlers.js\";\nimport {\n CURRICULUM_PROVIDERS,\n type CurriculumBreadcrumb,\n type CurriculumLevel,\n type CurriculumSelection,\n getCurriculumProvider,\n getLastCurriculumSelection,\n setLastCurriculumSelection,\n type TopicNode,\n} from \"../curriculum/index.js\";\nimport { resolveOperationKnowledgeContexts } from \"../knowledge-contexts.js\";\nimport {\n type ApiFlavor,\n checkVisionReadiness,\n DEFAULT_LLM_MODEL,\n DEFAULT_LLM_URL,\n ensureLlmReadyHeadless,\n evaluateAnswerViaLLM,\n generateFoundationsProposalsViaLLM,\n generateSplitProposalsViaLLM,\n getAvailableModels,\n getCloudModelRecommendation,\n getLlmConfig,\n getProviderForRole,\n getProviderRoleStatus,\n importCurriculumViaLLM,\n isLlmOnline,\n type LlmRole,\n translateQuestionViaLLM,\n} from \"../llm/client.js\";\nimport { observeUiSnapshotViaLLM } from \"../llm/vision.js\";\nimport {\n bindRoleProviders,\n buildProviderListing,\n findOrphanKeyRefs,\n maskSecret,\n type ProviderRecord,\n readScopedProviders,\n readScopedRoles,\n removeProviderRecord,\n rolesReferencing,\n upsertProviderRecord,\n VALID_API_FLAVORS,\n VALID_ROLES,\n withProviderScope,\n writeScopedProviders,\n writeScopedRoles,\n} from \"../providers/config.js\";\nimport {\n inspectSkillLinks,\n parseSetupAgents,\n type SkillLinkHealth,\n type SkillLinkState,\n summarizeSkillLinkHealth,\n wireSkills,\n} from \"../provisioning/index.js\";\nimport { normalizeShell } from \"../terminal-open.js\";\nimport { ensureDefaultUser, resolveUser } from \"../users/identity.js\";\nimport {\n activateWorkspacePath,\n defaultWorkspaceDir,\n ensureActiveWorkspace,\n existingWorkspaceDirOrHome,\n removeWorkspaceAndResolveActive,\n} from \"../workspaces/active.js\";\nimport { backupDatabaseTo } from \"../workspaces/backup.js\";\nimport { withDb as sharedWithDb } from \"./shared/db.js\";\n\nlet isServeMode = false;\nlet serveStdinPayload: string | undefined;\n\nfunction jsonOut(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n}\n\nfunction jsonError(message: string): never {\n let msg = message;\n if (message.startsWith('{\"error\":')) {\n try {\n const parsed = JSON.parse(message);\n msg = parsed.error;\n } catch {\n // ignore\n }\n }\n\n if (isServeMode) {\n throw new Error(JSON.stringify({ error: msg }));\n }\n console.log(JSON.stringify({ error: msg }, null, 2));\n process.exit(1);\n}\n\nfunction parseKnowledgeContextNames(value: unknown): string[] {\n if (value == null) return [];\n if (\n !Array.isArray(value) ||\n value.some((name) => typeof name !== \"string\" || !name.trim())\n ) {\n jsonError(\"knowledgeContexts must be an array of non-empty context names\");\n }\n return [...new Set(value.map((name) => name.trim()))];\n}\n\nasync function resolveKnowledgeContexts(\n db: Database,\n names: string[],\n): Promise<KnowledgeContext[]> {\n try {\n return await resolveOperationKnowledgeContexts(db, names);\n } catch (error) {\n jsonError((error as Error).message);\n }\n}\n\nfunction parseNonNegativeIntegerOption(name: string, value: string): number {\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed < 0) {\n jsonError(`${name} must be a non-negative integer`);\n }\n return parsed;\n}\n\nfunction parseProviderScope(scope: string | undefined): boolean {\n const value = scope ?? \"machine\";\n if (value === \"machine\") return true;\n if (value === \"shared\") return false;\n jsonError(`Invalid --scope: ${value}. Use machine or shared.`);\n}\n\nasync function withDb(\n fn: (db: Database) => void | Promise<void>,\n): Promise<void> {\n await sharedWithDb(fn, jsonError);\n}\n\ninterface ReviewTargetRow {\n card_id: string;\n token_id: string;\n user_id: string;\n slug: string;\n}\n\nasync function _getReviewTarget(\n db: Database,\n cardId: string,\n userId: string,\n): Promise<ReviewTargetRow> {\n const target = (await db\n .prepare(\n `SELECT c.id AS card_id, c.token_id, c.user_id, t.slug\n FROM cards c\n JOIN tokens t ON t.id = c.token_id\n WHERE c.id = ?`,\n )\n .get(cardId)) as ReviewTargetRow | undefined;\n\n if (!target) {\n jsonError(`Card not found: ${cardId}`);\n }\n if (target.user_id !== userId) {\n jsonError(`Card ${cardId} does not belong to user ${userId}`);\n }\n\n return target!;\n}\n\nfunction _parseTokenUpdates(opts: {\n concept?: string;\n domain?: string;\n bloom?: string;\n context?: string;\n mode?: string;\n sourceLink?: string;\n}): {\n concept?: string;\n domain?: string;\n bloom_level?: BloomLevel;\n context?: string;\n symbiosis_mode?: SymbiosisMode | null;\n source_link?: string | null;\n} {\n const updates: {\n concept?: string;\n domain?: string;\n bloom_level?: BloomLevel;\n context?: string;\n symbiosis_mode?: SymbiosisMode | null;\n source_link?: string | null;\n } = {};\n\n if (opts.concept !== undefined) updates.concept = opts.concept;\n if (opts.domain !== undefined) updates.domain = opts.domain;\n if (opts.bloom !== undefined)\n updates.bloom_level = Number(opts.bloom) as BloomLevel;\n if (opts.context !== undefined) updates.context = opts.context;\n if (opts.sourceLink !== undefined) {\n updates.source_link = opts.sourceLink === \"\" ? null : opts.sourceLink;\n }\n if (opts.mode !== undefined) {\n const validModes = [\"shadowing\", \"copilot\", \"autonomy\", \"none\"];\n if (!validModes.includes(opts.mode)) {\n jsonError(`Invalid mode: ${opts.mode}`);\n }\n updates.symbiosis_mode =\n opts.mode === \"none\" ? null : (opts.mode as SymbiosisMode);\n }\n\n return updates;\n}\n\nexport const bridgeCommand = new Command(\"bridge\").description(\n \"Machine-readable JSON protocol for AI integration\",\n);\n\n// ── zam bridge check-due ──────────────────────────────────────────────────\n\nbridgeCommand\n .command(\"check-due\")\n .description(\"Check due cards for a user (JSON)\")\n .option(\"--user <id>\", \"User ID (default: whoami)\")\n .option(\"--domain <domain>\", \"Filter by knowledge domain\")\n .option(\"--knowledge-context <context>\", \"Filter by knowledge context\")\n .action(async (opts) => {\n await withDb(async (db) => {\n try {\n const userId = await resolveUser(opts, db, { json: true });\n const result = await handleCheckDue(db, {\n user: userId,\n domain: opts.domain,\n knowledgeContext: opts.knowledgeContext,\n });\n jsonOut(result);\n } catch (err) {\n jsonError((err as Error).message);\n }\n });\n });\n\n// ── zam bridge backup-db ──────────────────────────────────────────────────\n\nbridgeCommand\n .command(\"backup-db\")\n .description(\"Back up the local database into the workspace (JSON)\")\n .option(\n \"--dir <path>\",\n \"Target directory (default: workspace dir, else ~/Documents/zam)\",\n )\n .action(async (opts) => {\n const target = getDatabaseTargetInfo();\n if (target.kind !== \"local\") {\n // Not an error: a Turso-backed database already lives in the cloud, so a\n // local file backup does not apply. Return a structured result the caller\n // (e.g. the Studio) can present as an informational, localized message.\n jsonOut({\n ok: false,\n reason: \"remote\",\n target: target.kind,\n location: target.location,\n });\n return;\n }\n await withDb(async (db) => {\n const workspaceDir = opts.dir || (await ensureActiveWorkspace(db)).path;\n const path = await backupDatabaseTo(db, workspaceDir);\n jsonOut({ ok: true, path });\n });\n });\n\n// ── zam bridge workspace-info / set-workspace-dir ──────────────────────────\n\nbridgeCommand\n .command(\"workspace-info\")\n .description(\"Report the workspace dir, its default, and the data dir (JSON)\")\n .action(async () => {\n await withDb(async (db) => {\n const activeWorkspace = await ensureActiveWorkspace(db);\n jsonOut({\n activeWorkspaceId: activeWorkspace.id,\n activeWorkspace,\n workspaceDir: activeWorkspace.path,\n defaultWorkspaceDir: defaultWorkspaceDir(),\n dataDir: join(homedir(), \".zam\"),\n });\n });\n });\n\nfunction provisionConfiguredWorkspaces(): ReturnType<typeof wireSkills> {\n return getConfiguredWorkspaces().flatMap((workspace) =>\n existsSync(workspace.path)\n ? wireSkills(workspace.path, parseSetupAgents(), { quiet: true })\n : [],\n );\n}\n\ninterface WorkspaceLinkHealth {\n health: SkillLinkHealth;\n states: Record<string, SkillLinkState>;\n}\n\n/**\n * Report, per workspace id, whether ZAM is cleanly linked. Read-only — it never\n * mutates the filesystem, so listing a workspace cannot change its links.\n * Workspaces whose directory is missing (e.g. an offline drive) are omitted.\n */\nfunction buildWorkspaceLinkHealth(\n workspaces: WorkspaceConfig[],\n): Record<string, WorkspaceLinkHealth> {\n const agents = parseSetupAgents();\n const map: Record<string, WorkspaceLinkHealth> = {};\n for (const workspace of workspaces) {\n if (!existsSync(workspace.path)) continue;\n const links = inspectSkillLinks(workspace.path, agents);\n map[workspace.id] = {\n health: summarizeSkillLinkHealth(links),\n states: Object.fromEntries(\n links.map((link) => [link.agents.join(\"+\"), link.state]),\n ),\n };\n }\n return map;\n}\n\nasync function ensureDesktopWorkspace(db: Database): Promise<{\n workspaceDir: string;\n activeWorkspaceId: string;\n skillLinks: ReturnType<typeof wireSkills>;\n}> {\n const activeWorkspace = await ensureActiveWorkspace(db);\n const skillLinks = provisionConfiguredWorkspaces();\n return {\n workspaceDir: activeWorkspace.path,\n activeWorkspaceId: activeWorkspace.id,\n skillLinks,\n };\n}\n\nbridgeCommand\n .command(\"workspace-list\")\n .description(\"List configured ZAM workspaces (JSON)\")\n .action(async () => {\n await withDb(async (db) => {\n const activeWorkspace = await ensureActiveWorkspace(db);\n const workspaces = getConfiguredWorkspaces();\n jsonOut({\n workspaces,\n activeWorkspaceId: activeWorkspace.id,\n activeWorkspace,\n workspaceDir: activeWorkspace.path,\n defaultWorkspaceDir: defaultWorkspaceDir(),\n dataDir: join(homedir(), \".zam\"),\n linkHealth: buildWorkspaceLinkHealth(workspaces),\n });\n });\n });\n\nbridgeCommand\n .command(\"workspace-repair-links\")\n .description(\n \"Relink ZAM skill junctions for a configured workspace, replacing broken links and outdated copies (JSON)\",\n )\n .requiredOption(\"--id <id>\", \"Workspace id\")\n .option(\n \"--agents <list>\",\n \"comma-separated agents to wire: all, claude, copilot, codex, agent\",\n )\n .action(async (opts) => {\n const id = String(opts.id ?? \"\").trim();\n if (!id) jsonError(\"A non-empty --id is required\");\n const workspace = getConfiguredWorkspaces().find((item) => item.id === id);\n if (!workspace) jsonError(`Workspace \"${id}\" is not configured`);\n if (!existsSync(workspace.path)) {\n jsonError(`Workspace path does not exist: ${workspace.path}`);\n }\n\n const agents = parseSetupAgents(opts.agents);\n // Force replaces anything that is not already a correct link — dangling\n // junctions and outdated copies alike. The Studio confirms before calling\n // this for a directory with no ZAM fingerprint.\n const skillLinks = wireSkills(workspace.path, agents, {\n force: true,\n quiet: true,\n });\n const links = inspectSkillLinks(workspace.path, agents);\n jsonOut({\n ok: true,\n workspace,\n skillLinks,\n linkHealth: {\n health: summarizeSkillLinkHealth(links),\n states: Object.fromEntries(\n links.map((link) => [link.agents.join(\"+\"), link.state]),\n ),\n },\n });\n });\n\nfunction parseBridgeWorkspaceKind(value?: string): WorkspaceKind {\n const kind = (value || \"custom\").toLowerCase();\n if (\n kind === \"personal\" ||\n kind === \"team\" ||\n kind === \"family\" ||\n kind === \"community\" ||\n kind === \"organization\" ||\n kind === \"custom\"\n ) {\n return kind;\n }\n jsonError(`Invalid workspace kind: ${value}`);\n}\n\nbridgeCommand\n .command(\"workspace-add\")\n .description(\"Register an existing directory as a ZAM workspace (JSON)\")\n .requiredOption(\"--path <dir>\", \"Existing workspace/repository directory\")\n .option(\"--id <id>\", \"Workspace id\")\n .option(\"--label <label>\", \"Human-readable label\")\n .option(\"--kind <kind>\", \"Workspace kind\", \"custom\")\n .action(async (opts) => {\n const raw = String(opts.path ?? \"\").trim();\n if (!raw) jsonError(\"A non-empty --path is required\");\n const path = resolve(raw);\n if (!existsSync(path)) jsonError(`Workspace path does not exist: ${path}`);\n const id = opts.id ? String(opts.id).trim() : undefined;\n if (opts.id && !id) jsonError(\"A non-empty --id is required\");\n const kind = parseBridgeWorkspaceKind(opts.kind);\n const skillLinks = wireSkills(path, parseSetupAgents(), { quiet: true });\n await withDb(async (db) => {\n const workspace = await activateWorkspacePath(db, path, {\n ...(id ? { id } : {}),\n ...(opts.label ? { label: opts.label } : {}),\n kind,\n });\n jsonOut({\n ok: true,\n workspace,\n workspaces: getConfiguredWorkspaces(),\n activeWorkspaceId: workspace.id,\n activeWorkspace: workspace,\n workspaceDir: workspace.path,\n skillLinks,\n });\n });\n });\n\nbridgeCommand\n .command(\"workspace-remove\")\n .description(\"Unregister a ZAM workspace without deleting its files (JSON)\")\n .requiredOption(\"--id <id>\", \"Workspace id\")\n .action(async (opts) => {\n const id = String(opts.id ?? \"\").trim();\n if (!id) jsonError(\"A non-empty --id is required\");\n const workspace = getConfiguredWorkspaces().find((item) => item.id === id);\n if (!workspace) jsonError(`Workspace \"${id}\" is not configured`);\n\n await withDb(async (db) => {\n const { activeWorkspace, workspaces } =\n await removeWorkspaceAndResolveActive(db, id);\n const skillLinks = provisionConfiguredWorkspaces();\n\n jsonOut({\n ok: true,\n removed: workspace,\n workspaces,\n activeWorkspaceId: activeWorkspace.id,\n activeWorkspace,\n workspaceDir: activeWorkspace.path,\n skillLinks,\n });\n });\n });\n\nbridgeCommand\n .command(\"set-workspace-dir\")\n .description(\"Set the personal workspace directory (JSON)\")\n .requiredOption(\"--dir <path>\", \"Path to the workspace directory\")\n .action(async (opts) => {\n const raw = String(opts.dir ?? \"\").trim();\n if (!raw) jsonError(\"A non-empty --dir is required\");\n const dir = resolve(raw);\n if (!existsSync(dir)) jsonError(`Workspace path does not exist: ${dir}`);\n const skillLinks = wireSkills(dir, parseSetupAgents(), { quiet: true });\n await withDb(async (db) => {\n const workspace = await activateWorkspacePath(db, dir);\n jsonOut({\n ok: true,\n workspace,\n workspaces: getConfiguredWorkspaces(),\n activeWorkspaceId: workspace.id,\n activeWorkspace: workspace,\n workspaceDir: workspace.path,\n skillLinks,\n });\n });\n });\n\n// ── zam bridge agent-list / agent-open ─────────────────────────────────────\n\nbridgeCommand\n .command(\"agent-list\")\n .description(\"List agent harnesses with detection state + the default (JSON)\")\n .action(async () => {\n await withDb(async (db) => {\n const configuredDefault = (await getSetting(db, \"agent.default\")) || null;\n const harnesses = await Promise.all(\n AGENT_HARNESSES.map(async (h) => {\n const override =\n (await getSetting(db, `agent.${h.id}.command`)) || undefined;\n return {\n id: h.id,\n label: h.label,\n kind: h.kind,\n detected: resolveHarnessExecutable(h, override) !== null,\n };\n }),\n );\n const fallbackDefault = harnesses.find((h) => h.detected)?.id ?? null;\n jsonOut({ harnesses, default: configuredDefault ?? fallbackDefault });\n });\n });\n\nbridgeCommand\n .command(\"agent-open\")\n .description(\"Launch an agent harness in the workspace (JSON)\")\n .option(\n \"--id <id>\",\n \"Harness id (default: agent.default setting, else first detected)\",\n )\n .option(\"--workspace <id>\", \"Configured workspace id to open\")\n .option(\"--dir <path>\", \"Explicit workspace directory to open\")\n .action(async (opts) => {\n await withDb(async (db) => {\n let id: string | undefined =\n opts.id || (await getSetting(db, \"agent.default\")) || undefined;\n if (!id) {\n id = AGENT_HARNESSES.find((h) => resolveHarnessExecutable(h))?.id;\n }\n if (!id) {\n jsonError(\n \"No agent harness configured or detected. Install one (Claude Code, Codex, opencode) or set agent.default.\",\n );\n }\n const harness = getHarness(id);\n if (!harness) {\n jsonError(`Unknown harness: ${id}`);\n }\n const override =\n (await getSetting(db, `agent.${harness.id}.command`)) || undefined;\n const executable = resolveHarnessExecutable(harness, override);\n if (!executable) {\n jsonError(\n `${harness.label} was not detected. Set its path: zam settings set agent.${harness.id}.command <path>`,\n );\n }\n const configuredWorkspace = opts.workspace\n ? getConfiguredWorkspaces().find((item) => item.id === opts.workspace)\n : undefined;\n if (opts.workspace && !configuredWorkspace) {\n jsonError(`Workspace is not configured: ${opts.workspace}`);\n }\n const activeWorkspace = await ensureActiveWorkspace(db);\n const workspace = opts.dir\n ? existsSync(opts.dir)\n ? opts.dir\n : homedir()\n : existingWorkspaceDirOrHome(configuredWorkspace ?? activeWorkspace);\n launchHarness(harness, {\n executable,\n workspace,\n shell: normalizeShell(undefined),\n silent: true,\n });\n jsonOut({\n ok: true,\n id: harness.id,\n label: harness.label,\n kind: harness.kind,\n workspace,\n });\n });\n });\n\n// ── zam bridge get-review ─────────────────────────────────────────────────\n\nbridgeCommand\n .command(\"get-review\")\n .description(\"Get next review card with prompt (JSON)\")\n .option(\"--user <id>\", \"User ID (default: whoami)\")\n .option(\"--no-resolve\", \"Skip resolving the token's source_link into context\")\n .option(\n \"--no-dynamic-question\",\n \"Use the stored question without generating a fresh LLM question\",\n )\n .option(\"--knowledge-context <context>\", \"Filter cards by knowledge context\")\n .action(async (opts) => {\n await withDb(async (db) => {\n try {\n const userId = await resolveUser(opts, db, { json: true });\n const result = await handleGetReview(db, {\n user: userId,\n noResolve: opts.resolve === false,\n noDynamicQuestion: opts.dynamicQuestion === false,\n knowledgeContext: opts.knowledgeContext,\n });\n jsonOut(result);\n } catch (err) {\n jsonError((err as Error).message);\n }\n });\n });\n\n// ── zam bridge get-reviews ────────────────────────────────────────────────\n\nbridgeCommand\n .command(\"get-reviews\")\n .description(\"Get a batch of due cards (JSON)\")\n .option(\"--user <id>\", \"User ID (default: whoami)\")\n .option(\"--domain <domain>\", \"Filter cards by domain prefix\")\n .option(\"--knowledge-context <context>\", \"Filter cards by knowledge context\")\n .option(\"--include-questions\", \"Include question content in response\")\n .option(\"--no-resolve\", \"Skip resolving the token's source_link into context\")\n .option(\n \"--no-dynamic-question\",\n \"Use the stored question without generating a fresh LLM question\",\n )\n .action(async (opts) => {\n await withDb(async (db) => {\n try {\n const userId = await resolveUser(opts, db, { json: true });\n const result = await handleGetReviewsBatch(db, {\n user: userId,\n domain: opts.domain,\n knowledgeContext: opts.knowledgeContext,\n includeQuestions: opts.includeQuestions,\n noResolve: opts.resolve === false,\n noDynamicQuestion: opts.dynamicQuestion === false,\n });\n jsonOut(result);\n } catch (err) {\n jsonError((err as Error).message);\n }\n });\n });\n\n// ── zam bridge submit ─────────────────────────────────────────────────────\n\nbridgeCommand\n .command(\"submit\")\n .description(\"Submit a rating for a card (JSON)\")\n .option(\"--user <id>\", \"User ID (default: whoami)\")\n .requiredOption(\"--card-id <id>\", \"Card ID\")\n .option(\"--rating <n>\", \"User rating (1-4); omit with --done-by agent\")\n .option(\"--session <id>\", \"Session ID to associate the review with\")\n .option(\n \"--done-by <user|agent>\",\n \"Done by user or agent (default: user)\",\n \"user\",\n )\n .action(async (opts) => {\n await withDb(async (db) => {\n try {\n const userId = await resolveUser(opts, db, { json: true });\n const result = await handleSubmitReview(db, {\n user: userId,\n cardId: opts.cardId,\n rating:\n opts.rating !== undefined\n ? (Number(opts.rating) as Rating)\n : undefined,\n sessionId: opts.session,\n doneBy: opts.doneBy as \"user\" | \"agent\",\n });\n jsonOut(result);\n } catch (err) {\n jsonError((err as Error).message);\n }\n });\n });\n\n// ── zam bridge review-action ───────────────────────────────────────────────\n\nbridgeCommand\n .command(\"review-action\")\n .description(\"Apply a review action (JSON)\")\n .option(\"--user <id>\", \"User ID (default: whoami)\")\n .requiredOption(\"--card-id <id>\", \"Card ID\")\n .requiredOption(\n \"--action <action>\",\n \"Action: rate | skip | edit-token | deprecate-token | delete-token | delete-card | stop\",\n )\n .option(\"--rating <n>\", \"Rating (1-4) for action=rate\")\n .option(\"--concept <concept>\", \"Updated concept text for action=edit-token\")\n .option(\"--domain <domain>\", \"Updated domain for action=edit-token\")\n .option(\"--bloom <level>\", \"Updated Bloom level for action=edit-token\")\n .option(\"--context <context>\", \"Updated context for action=edit-token\")\n .option(\"--mode <mode>\", \"Updated symbiosis mode for action=edit-token\")\n .option(\"--source-link <link>\", \"Updated source link for action=edit-token\")\n .option(\"--confirm\", \"Confirm destructive delete actions\")\n .action(async (opts) => {\n await withDb(async (db) => {\n try {\n const userId = await resolveUser(opts, db, { json: true });\n const result = await handleReviewAction(db, {\n user: userId,\n cardId: opts.cardId,\n action: opts.action as ReviewActionType,\n rating:\n opts.rating !== undefined\n ? (Number(opts.rating) as Rating)\n : undefined,\n concept: opts.concept,\n domain: opts.domain,\n bloomLevel: opts.bloom !== undefined ? Number(opts.bloom) : undefined,\n context: opts.context,\n symbiosisMode: opts.mode,\n sourceLink: opts.sourceLink,\n confirm: opts.confirm,\n });\n jsonOut(result);\n } catch (err) {\n jsonError((err as Error).message);\n }\n });\n });\n\n// ── zam bridge get-skill ──────────────────────────────────────────────────\n\nbridgeCommand\n .command(\"get-skill\")\n .description(\"Get an agent skill by slug (JSON)\")\n .requiredOption(\"--slug <slug>\", \"Skill slug\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const skill = await getAgentSkill(db, opts.slug);\n if (!skill) {\n jsonError(`Skill not found: ${opts.slug}`);\n }\n\n jsonOut({\n slug: skill?.slug,\n description: skill?.description,\n steps: skill?.steps,\n tokenSlugs: skill?.token_slugs,\n source: skill?.source,\n });\n });\n });\n\n// ── zam bridge start-session / end-session ────────────────────────────────\n\nbridgeCommand\n .command(\"start-session\")\n .description(\"Start a ZAM learning session (JSON)\")\n .requiredOption(\"--task <task>\", \"Session task description\")\n .option(\n \"--context <context>\",\n \"Execution context: shell | ui | reallife\",\n \"shell\",\n )\n .option(\"--user <id>\", \"User ID (default: whoami)\")\n .action(async (opts) => {\n const context = opts.context as \"shell\" | \"ui\" | \"reallife\";\n if (![\"shell\", \"ui\", \"reallife\"].includes(context)) {\n jsonError(\"context must be shell, ui, or reallife\");\n }\n\n await withDb(async (db) => {\n try {\n const userId = await resolveUser(opts, db, { json: true });\n const result = await handleStartSession(db, {\n user: userId,\n task: opts.task,\n context,\n });\n jsonOut(result);\n } catch (err) {\n jsonError((err as Error).message);\n }\n });\n });\n\nbridgeCommand\n .command(\"end-session\")\n .description(\"Complete an active ZAM learning session (JSON)\")\n .requiredOption(\"--session <id>\", \"Session ID\")\n .action(async (opts) => {\n await withDb(async (db) => {\n try {\n const result = await handleEndSession(db, { session: opts.session });\n jsonOut(result);\n } catch (err) {\n jsonError((err as Error).message);\n }\n });\n });\n\n// ── zam bridge session-open ───────────────────────────────────────────────\n\nbridgeCommand\n .command(\"session-open\")\n .description(\n \"Start a learning session and return due cards and relevant tokens (JSON)\",\n )\n .option(\"--user <id>\", \"User ID (default: whoami)\")\n .requiredOption(\"--task <task>\", \"Task description for the session\")\n .option(\n \"--context <context>\",\n \"Execution context: shell | ui | reallife\",\n \"shell\",\n )\n .action(async (opts) => {\n await withDb(async (db) => {\n try {\n const userId = await resolveUser(opts, db, { json: true });\n const result = await handleSessionOpen(db, {\n user: userId,\n task: opts.task,\n context: opts.context,\n });\n jsonOut(result);\n } catch (err) {\n jsonError((err as Error).message);\n }\n });\n });\n\n// ── zam bridge get-monitor ────────────────────────────────────────────────\n\nbridgeCommand\n .command(\"get-monitor\")\n .description(\"Read monitor log for a session (JSON)\")\n .requiredOption(\"--session <id>\", \"Session ID\")\n .action(async (opts) => {\n await withDb(async (db) => {\n try {\n const result = await handleGetMonitor(db, { session: opts.session });\n jsonOut(result);\n } catch (err) {\n jsonError((err as Error).message);\n }\n });\n });\n\n// ── zam bridge analyze-monitor ───────────────────────────────────────────\n\nbridgeCommand\n .command(\"analyze-monitor\")\n .description(\"Analyze monitor log with token patterns from stdin (JSON)\")\n .requiredOption(\"--session <id>\", \"Session ID\")\n .action(async (opts) => {\n try {\n let raw: string;\n if (isServeMode) {\n raw = serveStdinPayload ?? \"\";\n } else {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk as Buffer);\n }\n raw = Buffer.concat(chunks).toString(\"utf-8\").trim();\n }\n\n if (!raw) {\n jsonError(\"No input received on stdin. Pipe JSON with token patterns.\");\n }\n\n let data: { patterns: TokenPattern[] };\n try {\n data = JSON.parse(raw);\n } catch {\n jsonError(\"Invalid JSON input\");\n }\n\n if (!Array.isArray(data?.patterns)) {\n jsonError(\"JSON must include 'patterns' array\");\n }\n\n await withDb(async (db) => {\n try {\n const result = await handleAnalyzeMonitor(db, {\n session: opts.session,\n patterns: data.patterns,\n });\n jsonOut(result);\n } catch (err) {\n jsonError((err as Error).message);\n }\n });\n } catch (err) {\n jsonError((err as Error).message);\n }\n });\n\n// ── zam bridge add-token ──────────────────────────────────────────────────\n\nbridgeCommand\n .command(\"add-token\")\n .description(\"Create a token + card from JSON stdin\")\n .option(\"--user <id>\", \"User ID (default: whoami)\")\n .action(async (opts) => {\n try {\n let raw: string;\n if (isServeMode) {\n raw = serveStdinPayload ?? \"\";\n } else {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk as Buffer);\n }\n raw = Buffer.concat(chunks).toString(\"utf-8\").trim();\n }\n\n if (!raw) {\n jsonError(\"No input received on stdin. Pipe JSON with token data.\");\n }\n\n let data: {\n slug: string;\n title?: string;\n concept: string;\n domain?: string;\n bloom_level?: number;\n context?: string;\n symbiosis_mode?: string | null;\n source_link?: string | null;\n question?: string | null;\n knowledgeContexts?: string[];\n knowledge_contexts?: string[];\n prerequisites?: string[];\n };\n\n try {\n data = JSON.parse(raw);\n } catch {\n jsonError(\"Invalid JSON input\");\n }\n\n if (!data?.slug || !data?.concept) {\n jsonError(\"JSON must include 'slug' and 'concept' fields\");\n }\n\n await withDb(async (db) => {\n try {\n const userId = await resolveUser(opts, db, { json: true });\n const symbiosisMode = data.symbiosis_mode;\n if (\n symbiosisMode !== undefined &&\n symbiosisMode !== null &&\n ![\"shadowing\", \"copilot\", \"autonomy\"].includes(symbiosisMode)\n ) {\n jsonError(`Invalid symbiosis_mode: ${symbiosisMode}`);\n }\n const result = await handleAddToken(db, {\n user: userId,\n slug: data.slug,\n title: data.title,\n concept: data.concept,\n domain: data.domain,\n bloomLevel: data.bloom_level,\n context: data.context,\n symbiosisMode: symbiosisMode as SymbiosisMode | null | undefined,\n sourceLink: data.source_link,\n question: data.question,\n knowledgeContexts: data.knowledgeContexts,\n knowledge_contexts: data.knowledge_contexts,\n prerequisites: data.prerequisites,\n });\n jsonOut(result);\n } catch (err) {\n jsonError((err as Error).message);\n }\n });\n } catch (err) {\n jsonError((err as Error).message);\n }\n });\n\n// ── zam bridge relevant-tokens ────────────────────────────────────────────\n\nbridgeCommand\n .command(\"relevant-tokens\")\n .description(\"Find tokens relevant to a given context\")\n .option(\"--user <id>\", \"User ID (default: whoami)\")\n .action(async (opts) => {\n try {\n let raw: string;\n if (isServeMode) {\n raw = serveStdinPayload ?? \"\";\n } else {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk as Buffer);\n }\n raw = Buffer.concat(chunks).toString(\"utf-8\").trim();\n }\n\n if (!raw) {\n jsonError(\"No input received on stdin. Pipe JSON with context.\");\n }\n\n let data: {\n context: string;\n limit?: number;\n };\n\n try {\n data = JSON.parse(raw);\n } catch {\n jsonError(\"Invalid JSON input\");\n }\n\n if (!data?.context || data.context.trim() === \"\") {\n jsonError(\"JSON must include a non-empty 'context' field\");\n }\n\n await withDb(async (db) => {\n try {\n const userId = await resolveUser(opts, db, { json: true });\n const result = await handleFindTokens(db, {\n user: userId,\n context: data.context,\n limit: data.limit,\n });\n jsonOut(result);\n } catch (err) {\n jsonError((err as Error).message);\n }\n });\n } catch (err) {\n jsonError((err as Error).message);\n }\n });\n\n// ── zam bridge suggest-foundations ────────────────────────────────────────\n\nbridgeCommand\n .command(\"suggest-foundations\")\n .description(\"Propose existing tokens as foundation/prerequisite candidates\")\n .option(\"--user <id>\", \"User ID (default: whoami)\")\n .action(async (opts) => {\n try {\n let raw: string;\n if (isServeMode) {\n raw = serveStdinPayload ?? \"\";\n } else {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk as Buffer);\n }\n raw = Buffer.concat(chunks).toString(\"utf-8\").trim();\n }\n\n if (!raw) {\n jsonError(\"No input received on stdin. Pipe JSON.\");\n }\n\n let data: {\n slug?: string;\n concept?: string;\n question?: string;\n domain?: string;\n title?: string;\n bloom_level?: number;\n limit?: number;\n };\n\n try {\n data = JSON.parse(raw);\n } catch {\n jsonError(\"Invalid JSON input\");\n }\n\n await withDb(async (db) => {\n try {\n const userId = await resolveUser(opts, db, { json: true });\n const result = await handleSuggestFoundations(db, {\n user: userId,\n slug: data.slug,\n concept: data.concept,\n question: data.question,\n domain: data.domain,\n title: data.title,\n bloom_level: data.bloom_level,\n limit: data.limit,\n });\n jsonOut(result);\n } catch (err) {\n jsonError((err as Error).message);\n }\n });\n } catch (err) {\n jsonError((err as Error).message);\n }\n });\n\n// ── zam bridge discover-skills ──────────────────────────────────────────────\n\nbridgeCommand\n .command(\"discover-skills\")\n .description(\n \"Analyze monitor logs across sessions to discover recurring patterns\",\n )\n .option(\n \"--min-sessions <n>\",\n \"Minimum sessions a pattern must appear in (default: 2)\",\n \"2\",\n )\n .option(\n \"--limit <n>\",\n \"Max number of sessions to analyze (default: 20)\",\n \"20\",\n )\n .action(async (opts) => {\n try {\n const monitorDir = join(homedir(), \".zam\", \"monitor\");\n let files: string[];\n try {\n files = readdirSync(monitorDir).filter((f) => f.endsWith(\".jsonl\"));\n } catch {\n jsonOut({ proposals: [], message: \"No monitor logs found.\" });\n return;\n }\n\n if (files.length === 0) {\n jsonOut({ proposals: [], message: \"No monitor logs found.\" });\n return;\n }\n\n // Take the most recent N sessions by file modification time\n const limit = Number(opts.limit);\n const sorted = files\n .map((f) => ({ name: f, path: join(monitorDir, f) }))\n .sort((a, b) => b.name.localeCompare(a.name)) // ULID session IDs sort chronologically\n .slice(0, limit);\n\n // Load and parse each session's commands\n const sessionCommands = new Map<\n string,\n ReturnType<typeof pairCommands>\n >();\n for (const file of sorted) {\n const sessionId = file.name.replace(\".jsonl\", \"\");\n const events = readMonitorLog(sessionId);\n const commands = pairCommands(events);\n if (commands.length > 0) {\n sessionCommands.set(sessionId, commands);\n }\n }\n\n if (sessionCommands.size === 0) {\n jsonOut({ proposals: [], message: \"No command data in monitor logs.\" });\n return;\n }\n\n // Get existing skills to exclude\n let existingSkillSlugs: string[] = [];\n let db: Database | undefined;\n try {\n db = await openDatabase();\n existingSkillSlugs = (await listAgentSkills(db)).map((s) => s.slug);\n } catch {\n // DB not available — proceed without exclusion\n } finally {\n await db?.close();\n }\n\n const proposals = discoverSkills(sessionCommands, {\n minSessions: Number(opts.minSessions),\n existingSkillSlugs,\n });\n\n jsonOut({\n sessionsAnalyzed: sessionCommands.size,\n proposals,\n });\n } catch (err) {\n jsonError((err as Error).message);\n }\n });\n\n// ── zam bridge observe-ui-watch / get-observations ─────────────────────────\n\nbridgeCommand\n .command(\"observe-ui-watch\")\n .description(\n \"Poll live UI observer watch reports for a ZAM learning session (JSON)\",\n )\n .requiredOption(\n \"--session <id>\",\n \"ZAM session ID (also the observer log key)\",\n )\n .option(\"--after <n>\", \"Only return observations after this sequence\")\n .option(\"--limit <n>\", \"Maximum observations to return\", \"100\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const session = (await db\n .prepare(\"SELECT id, execution_context FROM sessions WHERE id = ?\")\n .get(opts.session)) as\n | { id: string; execution_context: string }\n | undefined;\n if (!session) {\n jsonError(`Session not found: ${opts.session}`);\n }\n\n const after =\n opts.after === undefined\n ? undefined\n : parseNonNegativeIntegerOption(\"after\", opts.after);\n const limit = parseNonNegativeIntegerOption(\"limit\", opts.limit);\n const observations = readUiObservationLog(opts.session)\n .filter((report) => after === undefined || report.sequence > after)\n .slice(0, limit);\n const last = observations[observations.length - 1];\n\n jsonOut({\n sessionId: opts.session,\n executionContext: session.execution_context,\n observationSource: \"ui\",\n logExists: uiObservationLogExists(opts.session),\n after: after ?? null,\n count: observations.length,\n nextSequence: last?.sequence ?? after ?? null,\n observations,\n });\n });\n });\n\nbridgeCommand\n .command(\"get-observations\")\n .description(\"Read UI observer reports for a session (JSON)\")\n .requiredOption(\"--session <id>\", \"Observer session ID\")\n .option(\"--after <n>\", \"Only return observations after this sequence\")\n .option(\"--limit <n>\", \"Maximum observations to return\", \"100\")\n .action((opts) => {\n try {\n const after =\n opts.after === undefined\n ? undefined\n : parseNonNegativeIntegerOption(\"after\", opts.after);\n const limit = parseNonNegativeIntegerOption(\"limit\", opts.limit);\n const observations = readUiObservationLog(opts.session)\n .filter((report) => after === undefined || report.sequence > after)\n .slice(0, limit);\n const last = observations[observations.length - 1];\n\n jsonOut({\n sessionId: opts.session,\n after: after ?? null,\n count: observations.length,\n nextSequence: last?.sequence ?? after ?? null,\n observations,\n });\n } catch (err) {\n jsonError((err as Error).message);\n }\n });\n\nbridgeCommand\n .command(\"observe-ui-snapshot\")\n .description(\n \"Analyze a captured UI snapshot or video recording with the configured vision LLM (JSON)\",\n )\n .requiredOption(\"--session <id>\", \"Observer session ID\")\n .requiredOption(\"--sequence <n>\", \"Monotonic observation sequence number\")\n .requiredOption(\"--image <path>\", \"PNG snapshot or video recording path\")\n .requiredOption(\"--observed-from <iso>\", \"Observation window start time\")\n .requiredOption(\"--observed-to <iso>\", \"Observation window end time\")\n .requiredOption(\"--process-name <name>\", \"Observed application process name\")\n .option(\"--process-id <n>\", \"Observed application process ID\")\n .option(\"--window-title <title>\", \"Observed window title\")\n .option(\"--evidence-ref <ref>\", \"Evidence reference to put in the report\")\n .option(\"--model <model>\", \"Override configured LLM model for this request\")\n .option(\"--max-tokens <n>\", \"Model response token budget\")\n .option(\"--timeout <ms>\", \"Hard request timeout in milliseconds\")\n .option(\"--redacted\", \"Mark the snapshot evidence as redacted\")\n .option(\"--write-log\", \"Append the generated report to the session JSONL\")\n .action(async (opts) => {\n const sequence = parseNonNegativeIntegerOption(\"sequence\", opts.sequence);\n const processId =\n opts.processId === undefined\n ? undefined\n : parseNonNegativeIntegerOption(\"process-id\", opts.processId);\n const maxTokens =\n opts.maxTokens === undefined\n ? undefined\n : parseNonNegativeIntegerOption(\"max-tokens\", opts.maxTokens);\n const hardTimeoutMs =\n opts.timeout === undefined\n ? undefined\n : parseNonNegativeIntegerOption(\"timeout\", opts.timeout);\n\n await withDb(async (db) => {\n const report = await observeUiSnapshotViaLLM(db, {\n sessionId: opts.session,\n sequence,\n observedFrom: opts.observedFrom,\n observedTo: opts.observedTo,\n imagePath: opts.image,\n application: {\n processName: opts.processName,\n processId,\n windowTitle: opts.windowTitle,\n },\n evidenceRef: opts.evidenceRef,\n redacted: opts.redacted === true,\n model: opts.model,\n maxTokens,\n hardTimeoutMs,\n });\n if (opts.writeLog === true) {\n appendUiObservationReport(report);\n }\n jsonOut(report);\n });\n });\n\n// ── zam bridge capture-ui ──────────────────────────────────────────────────\n\n/**\n * Resolve the PowerShell executable, preferring PowerShell 7+ (`pwsh`) over\n * the legacy Windows PowerShell 5.1 (`powershell`). pwsh 7 still ships the\n * Windows Desktop assemblies the screen-capture script needs, so it is the\n * default; `powershell` remains a fallback for machines without pwsh.\n */\nfunction resolveWindowsPowerShell(): string {\n try {\n execFileSync(\"where.exe\", [\"pwsh.exe\"], { stdio: \"ignore\" });\n return \"pwsh\";\n } catch {\n return \"powershell\";\n }\n}\n\ntype CaptureTarget = {\n requestedHwnd: string | null;\n requestedProcessName: string | null;\n matchedBy: string;\n hwnd: number | null;\n processId: number | null;\n processName: string | null;\n windowTitle: string | null;\n bounds: {\n left: number;\n top: number;\n right: number;\n bottom: number;\n width: number;\n height: number;\n } | null;\n};\n\ntype CaptureResult = {\n method: string;\n target: CaptureTarget | null;\n};\n\nfunction captureScreenshot(\n outputPath: string,\n hwnd?: string,\n processName?: string,\n): CaptureResult {\n const platform = process.platform;\n if (hwnd && !/^(0x)?[0-9a-fA-F]+$/.test(hwnd)) {\n throw new Error(`Invalid HWND format: ${hwnd}`);\n }\n if (processName && !/^[a-zA-Z0-9\\-_.]+$/.test(processName)) {\n throw new Error(`Invalid process name format: ${processName}`);\n }\n\n if (platform === \"win32\") {\n const stdout = execFileSync(\n resolveWindowsPowerShell(),\n [\n \"-NoProfile\",\n \"-Command\",\n `\nAdd-Type -AssemblyName System.Windows.Forms\nAdd-Type -AssemblyName System.Drawing\n\n$code = @'\nusing System;\nusing System.Runtime.InteropServices;\n\npublic class Win32 {\n public delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);\n\n [DllImport(\"user32.dll\")]\n public static extern bool SetProcessDPIAware();\n\n [DllImport(\"user32.dll\")]\n public static extern bool SetProcessDpiAwarenessContext(IntPtr dpiContext);\n\n [DllImport(\"user32.dll\")]\n public static extern bool GetWindowRect(IntPtr hWnd, out RECT rect);\n\n [DllImport(\"user32.dll\")]\n public static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam);\n\n [DllImport(\"user32.dll\")]\n public static extern bool EnumChildWindows(IntPtr hWnd, EnumWindowsProc lpEnumFunc, IntPtr lParam);\n\n [DllImport(\"user32.dll\")]\n public static extern bool IsWindowVisible(IntPtr hWnd);\n\n [DllImport(\"user32.dll\", SetLastError=true)]\n public static extern int GetWindowText(IntPtr hWnd, System.Text.StringBuilder lpString, int nMaxCount);\n\n [DllImport(\"user32.dll\", SetLastError=true)]\n public static extern int GetWindowTextLength(IntPtr hWnd);\n\n [DllImport(\"user32.dll\")]\n public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);\n\n [DllImport(\"user32.dll\")]\n public static extern bool SetForegroundWindow(IntPtr hWnd);\n\n [DllImport(\"user32.dll\")]\n public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);\n\n [DllImport(\"user32.dll\")]\n public static extern bool IsIconic(IntPtr hWnd);\n\n [DllImport(\"user32.dll\")]\n public static extern bool PrintWindow(IntPtr hWnd, IntPtr hdcBlt, uint nFlags);\n\n [StructLayout(LayoutKind.Sequential)]\n public struct RECT {\n public int Left;\n public int Top;\n public int Right;\n public int Bottom;\n }\n}\n'@\nAdd-Type -TypeDefinition $code\n\ntry {\n # DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 = -4. Without this, Windows\n # can return logical window bounds while PrintWindow renders physical\n # pixels, causing high-DPI captures to crop the right/bottom edge.\n [Win32]::SetProcessDpiAwarenessContext([IntPtr](-4)) | Out-Null\n} catch {\n try { [Win32]::SetProcessDPIAware() | Out-Null } catch {}\n}\n\nfunction Get-WindowTitle([IntPtr]$hWnd) {\n $length = [Win32]::GetWindowTextLength($hWnd)\n $capacity = [Math]::Max(1, $length + 1)\n $builder = New-Object System.Text.StringBuilder $capacity\n [Win32]::GetWindowText($hWnd, $builder, $builder.Capacity) | Out-Null\n $builder.ToString()\n}\n\nfunction Get-WindowProcess([IntPtr]$hWnd) {\n [uint32]$processId = 0\n [Win32]::GetWindowThreadProcessId($hWnd, [ref]$processId) | Out-Null\n if ($processId -eq 0) { return $null }\n Get-Process -Id $processId -ErrorAction SilentlyContinue\n}\n\nfunction Get-VisibleTopLevelWindows {\n $script:windowCandidates = New-Object System.Collections.ArrayList\n $callback = [Win32+EnumWindowsProc]{\n param([IntPtr]$candidateHwnd, [IntPtr]$lParam)\n if ([Win32]::IsWindowVisible($candidateHwnd)) {\n $candidateRect = New-Object Win32+RECT\n if ([Win32]::GetWindowRect($candidateHwnd, [ref]$candidateRect)) {\n $candidateWidth = $candidateRect.Right - $candidateRect.Left\n $candidateHeight = $candidateRect.Bottom - $candidateRect.Top\n if ($candidateWidth -gt 0 -and $candidateHeight -gt 0) {\n [void]$script:windowCandidates.Add($candidateHwnd)\n }\n }\n }\n return $true\n }\n [Win32]::EnumWindows($callback, [IntPtr]::Zero) | Out-Null\n $windows = $script:windowCandidates\n Remove-Variable -Name windowCandidates -Scope Script -ErrorAction SilentlyContinue\n $windows\n}\n\nfunction Find-TopLevelWindowByProcessName([string]$name) {\n foreach ($candidateHwnd in Get-VisibleTopLevelWindows) {\n $candidateProcess = Get-WindowProcess $candidateHwnd\n if ($candidateProcess -and $candidateProcess.ProcessName -ieq $name) {\n return [pscustomobject]@{\n Hwnd = $candidateHwnd\n MatchedBy = \"process-top-level-window\"\n }\n }\n\n $script:desiredChildProcessName = $name\n $script:foundChildProcessWindow = $false\n $childCallback = [Win32+EnumWindowsProc]{\n param([IntPtr]$childHwnd, [IntPtr]$lParam)\n $childProcess = Get-WindowProcess $childHwnd\n if ($childProcess -and $childProcess.ProcessName -ieq $script:desiredChildProcessName) {\n $script:foundChildProcessWindow = $true\n return $false\n }\n return $true\n }\n [Win32]::EnumChildWindows($candidateHwnd, $childCallback, [IntPtr]::Zero) | Out-Null\n $foundChild = $script:foundChildProcessWindow\n Remove-Variable -Name desiredChildProcessName -Scope Script -ErrorAction SilentlyContinue\n Remove-Variable -Name foundChildProcessWindow -Scope Script -ErrorAction SilentlyContinue\n\n if ($foundChild) {\n return [pscustomobject]@{\n Hwnd = $candidateHwnd\n MatchedBy = \"process-child-window\"\n }\n }\n }\n\n return $null\n}\n\nfunction New-CaptureTarget([IntPtr]$hWnd, [string]$matchedBy) {\n $target = [ordered]@{\n requestedHwnd = if ($targetHwnd -ne '') { $targetHwnd } else { $null }\n requestedProcessName = if ($processName -ne '') { $processName } else { $null }\n matchedBy = $matchedBy\n hwnd = $null\n processId = $null\n processName = $null\n windowTitle = $null\n bounds = $null\n }\n\n if ($hWnd -ne [IntPtr]::Zero) {\n $target.hwnd = $hWnd.ToInt64()\n $target.windowTitle = Get-WindowTitle $hWnd\n\n $windowProcess = Get-WindowProcess $hWnd\n if ($windowProcess) {\n $target.processId = $windowProcess.Id\n $target.processName = $windowProcess.ProcessName\n }\n\n $targetRect = New-Object Win32+RECT\n if ([Win32]::GetWindowRect($hWnd, [ref]$targetRect)) {\n $target.bounds = [ordered]@{\n left = $targetRect.Left\n top = $targetRect.Top\n right = $targetRect.Right\n bottom = $targetRect.Bottom\n width = $targetRect.Right - $targetRect.Left\n height = $targetRect.Bottom - $targetRect.Top\n }\n }\n }\n\n $target\n}\n\nfunction Write-CaptureResult([string]$method, [IntPtr]$hWnd, [string]$matchedBy) {\n $result = [ordered]@{\n method = $method\n target = New-CaptureTarget $hWnd $matchedBy\n }\n Write-Output (\"CAPTURE_RESULT:\" + ($result | ConvertTo-Json -Compress -Depth 6))\n}\n\n$hwndVal = [IntPtr]::Zero\n$matchedBy = \"fullscreen-fallback\"\n$targetHwnd = '${hwnd || \"\"}'\n$processName = '${processName || \"\"}'\n\nif ($targetHwnd -ne '') {\n if ($targetHwnd.StartsWith(\"0x\")) {\n $hwndVal = [IntPtr][Convert]::ToInt64($targetHwnd, 16)\n } else {\n $hwndVal = [IntPtr][Convert]::ToInt64($targetHwnd, 10)\n }\n $matchedBy = \"hwnd\"\n} elseif ($processName -ne '') {\n $proc = Get-Process -Name $processName -ErrorAction SilentlyContinue | Where-Object {$_.MainWindowHandle -ne 0} | Select-Object -First 1\n if ($proc) {\n $hwndVal = $proc.MainWindowHandle\n $matchedBy = \"process-main-window\"\n } else {\n $proc = Get-Process -Name $processName -ErrorAction SilentlyContinue | Select-Object -First 1\n if ($proc) {\n $hwndVal = $proc.MainWindowHandle\n $matchedBy = \"process-zero-main-window\"\n }\n }\n\n if ($hwndVal -eq [IntPtr]::Zero) {\n $windowMatch = Find-TopLevelWindowByProcessName $processName\n if ($windowMatch) {\n $hwndVal = $windowMatch.Hwnd\n $matchedBy = $windowMatch.MatchedBy\n }\n }\n}\n\nif ($hwndVal -ne [IntPtr]::Zero) {\n if ([Win32]::IsIconic($hwndVal)) {\n [Win32]::ShowWindow($hwndVal, 9) | Out-Null # SW_RESTORE = 9\n Start-Sleep -Milliseconds 250\n }\n\n $rect = New-Object Win32+RECT\n if ([Win32]::GetWindowRect($hwndVal, [ref]$rect)) {\n $width = $rect.Right - $rect.Left\n $height = $rect.Bottom - $rect.Top\n if ($width -gt 0 -and $height -gt 0) {\n $bitmap = New-Object System.Drawing.Bitmap($width, $height)\n $graphics = [System.Drawing.Graphics]::FromImage($bitmap)\n # PrintWindow renders the target window directly, regardless of\n # z-order, so an occluded or background window is still captured\n # correctly. SetForegroundWindow from a background process is\n # blocked by Windows, so CopyFromScreen would grab whatever sits\n # on top. PW_RENDERFULLCONTENT (0x2) handles modern/UWP windows.\n $hdc = $graphics.GetHdc()\n $printed = [Win32]::PrintWindow($hwndVal, $hdc, 2)\n $graphics.ReleaseHdc($hdc)\n $method = \"printwindow\"\n\n # Black-frame guard: PrintWindow can return a near-black frame on\n # some hardware-accelerated / DirectComposition surfaces. Sample a\n # sparse grid; if it is essentially black, fall back to a foreground\n # CopyFromScreen grab so the capture self-heals on those drivers.\n $needFallback = -not $printed\n if (-not $needFallback) {\n $sum = 0.0\n $cnt = 0\n $stepX = [Math]::Max(1, [int]($width / 12))\n $stepY = [Math]::Max(1, [int]($height / 12))\n for ($sy = 0; $sy -lt $height; $sy += $stepY) {\n for ($sx = 0; $sx -lt $width; $sx += $stepX) {\n $px = $bitmap.GetPixel($sx, $sy)\n $sum += ($px.R + $px.G + $px.B) / 3.0\n $cnt++\n }\n }\n if ($cnt -gt 0 -and ($sum / $cnt) -lt 6) { $needFallback = $true }\n }\n\n if ($needFallback) {\n [Win32]::SetForegroundWindow($hwndVal) | Out-Null\n Start-Sleep -Milliseconds 250\n $graphics.CopyFromScreen($rect.Left, $rect.Top, 0, 0, $bitmap.Size)\n $method = \"copyfromscreen\"\n }\n $bitmap.Save('${outputPath.replace(/\\\\/g, \"\\\\\\\\\")}', [System.Drawing.Imaging.ImageFormat]::Png)\n $graphics.Dispose()\n $bitmap.Dispose()\n Write-CaptureResult $method $hwndVal $matchedBy\n exit 0\n }\n }\n}\n\n# Fallback: full primary screen\n$screen = [System.Windows.Forms.Screen]::PrimaryScreen.Bounds\n$bitmap = New-Object System.Drawing.Bitmap($screen.Width, $screen.Height)\n$graphics = [System.Drawing.Graphics]::FromImage($bitmap)\n$graphics.CopyFromScreen($screen.Location, [System.Drawing.Point]::Empty, $screen.Size)\n$bitmap.Save('${outputPath.replace(/\\\\/g, \"\\\\\\\\\")}', [System.Drawing.Imaging.ImageFormat]::Png)\n$graphics.Dispose()\n$bitmap.Dispose()\nWrite-CaptureResult \"fullscreen\" $hwndVal $matchedBy\n `.trim(),\n ],\n { stdio: \"pipe\", encoding: \"utf8\" },\n );\n const resultMatch = /CAPTURE_RESULT:(\\{.*\\})/.exec(stdout ?? \"\");\n if (resultMatch) {\n const parsed = JSON.parse(resultMatch[1]) as CaptureResult;\n return parsed;\n }\n const methodMatch = /CAPTURE_METHOD:(\\w+)/.exec(stdout ?? \"\");\n return {\n method: methodMatch ? methodMatch[1] : \"unknown\",\n target: null,\n };\n } else if (platform === \"darwin\") {\n if (hwnd) {\n const parsedHwnd = hwnd.startsWith(\"0x\")\n ? parseInt(hwnd, 16)\n : parseInt(hwnd, 10);\n execFileSync(\"screencapture\", [\"-l\", String(parsedHwnd), outputPath], {\n stdio: \"pipe\",\n });\n return { method: \"screencapture-window\", target: null };\n } else if (processName) {\n try {\n const windowId = execFileSync(\n \"osascript\",\n [\n \"-e\",\n `tell application \"System Events\" to get id of window 1 of process \"${processName}\"`,\n ],\n { encoding: \"utf8\", stdio: [\"pipe\", \"pipe\", \"ignore\"] },\n ).trim();\n if (windowId && /^\\d+$/.test(windowId)) {\n execFileSync(\"screencapture\", [\"-l\", windowId, outputPath], {\n stdio: \"pipe\",\n });\n return { method: \"screencapture-window\", target: null };\n }\n } catch {\n // Fallback if AppleScript fails\n }\n execFileSync(\"screencapture\", [\"-x\", outputPath], { stdio: \"pipe\" });\n return { method: \"screencapture-full\", target: null };\n } else {\n execFileSync(\"screencapture\", [\"-x\", outputPath], { stdio: \"pipe\" });\n return { method: \"screencapture-full\", target: null };\n }\n } else {\n throw new Error(\n `Screen capture not supported on platform: ${platform}. Use zam-observer or provide --image.`,\n );\n }\n}\n\nbridgeCommand\n .command(\"capture-ui\")\n .description(\"Capture a screenshot for agent-side vision analysis (JSON)\")\n .option(\"--session <id>\", \"ZAM session ID (for metadata)\")\n .option(\"--output <path>\", \"PNG output path (defaults to temp file)\")\n .option(\"--image <path>\", \"Skip capture; return an existing image instead\")\n .option(\"--hwnd <hwnd>\", \"Window handle (decimal or hex) to capture\")\n .option(\"--process-name <name>\", \"Process name to capture\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const policy = await resolveObserverPolicy(db);\n const permission = {\n scope: policy.scope,\n consent: policy.consent,\n retention: policy.retention,\n };\n const isProvided = Boolean(opts.image);\n\n // A caller-provided --image is \"analyze this file\", not a capture: ZAM\n // is not holding the camera, so scope/target policy does not apply.\n // Live captures are gated below.\n if (!isProvided) {\n const pre = decidePreCapture(policy, {\n hasExplicitTarget: Boolean(opts.hwnd || opts.processName),\n requestedProcessName: opts.processName ?? null,\n });\n if (!pre.allowed) {\n jsonOut({\n sessionId: opts.session ?? null,\n granted: false,\n denied: true,\n denialReason: pre.denialReason,\n reason: pre.reason,\n capturedAt: new Date().toISOString(),\n platform: process.platform,\n permission: { ...permission, granted: false },\n });\n return;\n }\n }\n\n const outputPath =\n opts.image ??\n opts.output ??\n join(tmpdir(), `zam-capture-${randomBytes(4).toString(\"hex\")}.png`);\n\n const captureResult = isProvided\n ? ({ method: \"provided\", target: null } satisfies CaptureResult)\n : captureScreenshot(outputPath, opts.hwnd, opts.processName);\n\n // Post-resolution gate: the real process/title are only known now, so\n // the sensitive/denylist check runs against the window actually\n // captured. If it fails, discard the pixels before they leave.\n if (!isProvided) {\n const post = decidePostCapture(policy, {\n method: captureResult.method,\n processName: captureResult.target?.processName ?? null,\n windowTitle: captureResult.target?.windowTitle ?? null,\n });\n if (!post.allowed) {\n if (!opts.output) {\n try {\n rmSync(outputPath, { force: true });\n } catch {\n // best-effort discard\n }\n }\n jsonOut({\n sessionId: opts.session ?? null,\n granted: false,\n denied: true,\n denialReason: post.denialReason,\n reason: post.reason,\n capturedAt: new Date().toISOString(),\n platform: process.platform,\n permission: { ...permission, granted: false },\n });\n return;\n }\n }\n\n const imageBytes = readFileSync(outputPath);\n const base64 = imageBytes.toString(\"base64\");\n\n jsonOut({\n sessionId: opts.session ?? null,\n granted: true,\n imagePath: outputPath,\n base64,\n mimeType: \"image/png\",\n captureMethod: captureResult.method,\n captureTarget: captureResult.target,\n capturedAt: new Date().toISOString(),\n platform: process.platform,\n permission: { ...permission, granted: true },\n });\n });\n });\n\n// ── zam bridge start-recording ──────────────────────────────────────────────\n\nbridgeCommand\n .command(\"start-recording\")\n .description(\"Start screen recording in the background (JSON)\")\n .requiredOption(\"--session <id>\", \"ZAM session ID\")\n .option(\"--output <path>\", \"Video output path\")\n .action(async (opts) => {\n const platform = process.platform;\n if (platform !== \"darwin\" && platform !== \"win32\") {\n jsonOut({\n sessionId: opts.session,\n started: false,\n error:\n \"Screen recording is only supported on macOS (darwin) and Windows (win32)\",\n });\n return;\n }\n\n const sessionId = opts.session;\n const statePath = join(tmpdir(), `zam-recording-${sessionId}.json`);\n const defaultExt = platform === \"win32\" ? \".mkv\" : \".mov\";\n const outputPath =\n opts.output ?? join(tmpdir(), `zam-recording-${sessionId}${defaultExt}`);\n\n const { existsSync, writeFileSync, openSync, closeSync } = await import(\n \"node:fs\"\n );\n if (existsSync(statePath)) {\n jsonOut({\n sessionId,\n started: false,\n error: `Recording is already active for session ${sessionId}`,\n });\n return;\n }\n\n const logPath = join(tmpdir(), `zam-recording-${sessionId}.log`);\n let logFd: number;\n try {\n logFd = openSync(logPath, \"w\");\n } catch (e) {\n jsonOut({\n sessionId,\n started: false,\n error: `Failed to open log file at ${logPath}: ${(e as Error).message}`,\n });\n return;\n }\n\n const { spawn } = await import(\"node:child_process\");\n const ffmpegArgs =\n platform === \"darwin\"\n ? [\n \"-y\",\n \"-f\",\n \"avfoundation\",\n \"-r\",\n \"5\",\n \"-i\",\n \"0\",\n \"-pix_fmt\",\n \"yuv420p\",\n outputPath,\n ]\n : [\n \"-y\",\n \"-f\",\n \"gdigrab\",\n \"-framerate\",\n \"5\",\n \"-i\",\n \"desktop\",\n \"-pix_fmt\",\n \"yuv420p\",\n outputPath,\n ];\n\n const child = spawn(\"ffmpeg\", ffmpegArgs, {\n detached: true,\n stdio: [\"pipe\", logFd, logFd],\n });\n\n try {\n closeSync(logFd);\n } catch {}\n\n child.unref();\n\n if (child.pid) {\n writeFileSync(\n statePath,\n JSON.stringify({\n pid: child.pid,\n outputPath,\n startedAt: new Date().toISOString(),\n }),\n \"utf8\",\n );\n\n jsonOut({\n sessionId,\n started: true,\n outputPath,\n pid: child.pid,\n });\n } else {\n jsonOut({\n sessionId,\n started: false,\n error: \"Failed to spawn ffmpeg process\",\n });\n }\n });\n\n// ── zam bridge stop-recording ───────────────────────────────────────────────\n\nbridgeCommand\n .command(\"stop-recording\")\n .description(\n \"Stop active screen recording and apply idle-frame compression (JSON)\",\n )\n .requiredOption(\"--session <id>\", \"ZAM session ID\")\n .action(async (opts) => {\n const platform = process.platform;\n if (platform !== \"darwin\" && platform !== \"win32\") {\n jsonOut({\n sessionId: opts.session,\n stopped: false,\n error:\n \"Screen recording is only supported on macOS (darwin) and Windows (win32)\",\n });\n return;\n }\n\n const sessionId = opts.session;\n const statePath = join(tmpdir(), `zam-recording-${sessionId}.json`);\n const { existsSync, readFileSync, rmSync } = await import(\"node:fs\");\n\n if (!existsSync(statePath)) {\n jsonOut({\n sessionId,\n stopped: false,\n error: `No active recording found for session ${sessionId}`,\n });\n return;\n }\n\n const state = JSON.parse(readFileSync(statePath, \"utf8\"));\n const { pid, outputPath } = state;\n\n try {\n process.kill(pid, \"SIGINT\");\n } catch (_e) {\n // Process might already be dead\n }\n\n const isProcessRunning = (pId: number) => {\n try {\n process.kill(pId, 0);\n return true;\n } catch (_e) {\n return false;\n }\n };\n\n let attempts = 0;\n while (isProcessRunning(pid) && attempts < 20) {\n await new Promise((resolve) => setTimeout(resolve, 250));\n attempts++;\n }\n\n if (isProcessRunning(pid)) {\n try {\n process.kill(pid, \"SIGKILL\");\n } catch (_e) {}\n }\n\n try {\n rmSync(statePath, { force: true });\n } catch {}\n\n if (!existsSync(outputPath)) {\n jsonOut({\n sessionId,\n stopped: false,\n error: `Recording file not found at ${outputPath}`,\n });\n return;\n }\n\n const decimatedPath = outputPath.replace(/\\.[^.]+$/, \"-decimated.mp4\");\n const { execSync } = await import(\"node:child_process\");\n\n try {\n execSync(\n `ffmpeg -y -i \"${outputPath}\" -vf \"mpdecimate,setpts=N/FRAME_RATE/TB\" -an -pix_fmt yuv420p \"${decimatedPath}\"`,\n { stdio: \"ignore\" },\n );\n } catch (ffmpegErr) {\n jsonOut({\n sessionId,\n stopped: true,\n videoPath: outputPath,\n decimated: false,\n warning: `mpdecimate post-processing failed: ${(ffmpegErr as Error).message}`,\n });\n return;\n }\n\n try {\n rmSync(outputPath, { force: true });\n } catch {}\n\n jsonOut({\n sessionId,\n stopped: true,\n videoPath: decimatedPath,\n decimated: true,\n });\n });\n\n// ── zam bridge get-observer-policy ─────────────────────────────────────────\n\nbridgeCommand\n .command(\"get-observer-policy\")\n .description(\n \"Report the resolved observer policy so an agent can check before capturing (JSON)\",\n )\n .action(async () => {\n await withDb(async (db) => {\n const policy = await resolveObserverPolicy(db);\n jsonOut({\n scope: policy.scope,\n consent: policy.consent,\n retention: policy.retention,\n allowlist: policy.allowlist,\n denylist: policy.denylist,\n redactWindowTitles: policy.redactWindowTitles,\n audioOptIn: policy.audioOptIn,\n builtInSensitiveAlwaysRefused: true,\n builtInSensitiveMatchers: [...BUILT_IN_SENSITIVE_MATCHERS],\n });\n });\n });\n\n// ── zam bridge sync-observer-policy ────────────────────────────────────────\n\nbridgeCommand\n .command(\"sync-observer-policy\")\n .description(\n \"Write the resolved observer policy to the native sidecar file (JSON)\",\n )\n .action(async () => {\n await withDb(async (db) => {\n const { path, policy } = await syncObserverSidecarPolicy(db);\n jsonOut({ synced: true, path, policy });\n });\n });\n\n// ── zam bridge check-llm ──────────────────────────────────────────────────\n\nbridgeCommand\n .command(\"check-llm\")\n .description(\"Check if LLM is enabled and online (JSON)\")\n .action(async () => {\n await withDb(async (db) => {\n const provider = await getProviderForRole(db, \"recall\");\n const { enabled, url, model, apiKey } = provider;\n const unsupportedProvider = provider.apiFlavor !== \"chat-completions\";\n let online = false;\n let availableModels: string[] = [];\n let modelAvailable = false;\n if (enabled && !unsupportedProvider) {\n online = await isLlmOnline(url);\n if (online) {\n availableModels = await getAvailableModels(url, apiKey);\n // Empty list = server doesn't expose /models; don't claim it's wrong.\n modelAvailable =\n availableModels.length === 0 ||\n availableModels.some(\n (m) => m.toLowerCase() === model.toLowerCase(),\n );\n }\n }\n jsonOut({\n enabled,\n online,\n url,\n model,\n modelAvailable,\n availableModels,\n apiFlavor: provider.apiFlavor,\n unsupportedProvider,\n });\n });\n });\n\nbridgeCommand\n .command(\"provider-status\")\n .description(\"Show secret-safe provider status for LLM roles (JSON)\")\n .action(async () => {\n await withDb(async (db) => {\n const [recall, vision, text, embedding] = await Promise.all([\n getProviderRoleStatus(db, \"recall\"),\n getProviderRoleStatus(db, \"vision\"),\n getProviderRoleStatus(db, \"text\"),\n getProviderRoleStatus(db, \"embedding\"),\n ]);\n jsonOut({ roles: { recall, vision, text, embedding } });\n });\n });\n\n// ── zam bridge provider-config-* ───────────────────────────────────────────\n\nbridgeCommand\n .command(\"provider-config-list\")\n .description(\"List provider records and role bindings (JSON)\")\n .option(\"--scope <scope>\", \"machine (default) or shared\", \"machine\")\n .action(async (opts) => {\n const machine = parseProviderScope(opts.scope);\n await withProviderScope(machine, async (db) => {\n const providers = await readScopedProviders(db, machine);\n const roles = await readScopedRoles(db, machine);\n const rows = buildProviderListing(\n providers,\n (ref) => getProviderApiKey(ref) !== null,\n );\n jsonOut({\n scope: machine ? \"machine\" : \"shared\",\n providers: rows,\n roles,\n orphans: findOrphanKeyRefs(listProviderApiKeyRefs(), providers),\n });\n });\n });\n\nbridgeCommand\n .command(\"provider-config-upsert\")\n .description(\"Add or update a provider record (JSON)\")\n .requiredOption(\"--name <name>\", \"Provider name\")\n .option(\"--label <label>\", \"Human-readable label\")\n .option(\"--url <url>\", \"Endpoint base URL\")\n .option(\"--model <model>\", \"Model id\")\n .option(\n \"--flavor <flavor>\",\n `Wire protocol: ${VALID_API_FLAVORS.join(\" | \")}`,\n )\n .option(\"--local\", \"Mark as local endpoint\")\n .option(\"--no-local\", \"Mark as cloud/non-local endpoint\")\n .option(\"--runner <runner>\", \"Local runner hint\")\n .option(\"--key-ref <ref>\", \"Credential reference for API key\")\n .option(\"--scope <scope>\", \"machine (default) or shared\", \"machine\")\n .action(async (opts, command) => {\n const machine = parseProviderScope(opts.scope);\n let apiFlavor: ApiFlavor | undefined;\n if (opts.flavor) {\n if (!VALID_API_FLAVORS.includes(opts.flavor)) {\n jsonError(\n `Invalid --flavor: ${opts.flavor}. Use ${VALID_API_FLAVORS.join(\" or \")}.`,\n );\n }\n apiFlavor = opts.flavor;\n }\n // Commander stores the `--local` / `--no-local` pair on opts.local (true /\n // false) — there is no opts.noLocal. Because `--no-local` defaults opts.local\n // to true, only treat it as set when a flag was actually passed; otherwise\n // leave `local` undefined so an update doesn't clobber the stored value.\n let local: boolean | undefined;\n if (command.getOptionValueSource(\"local\") === \"cli\") {\n local = opts.local === true;\n }\n const patch: ProviderRecord = {};\n if (opts.label !== undefined) patch.label = opts.label;\n if (opts.url !== undefined) patch.url = opts.url;\n if (opts.model !== undefined) patch.model = opts.model;\n if (apiFlavor !== undefined) patch.apiFlavor = apiFlavor;\n if (opts.keyRef !== undefined) patch.apiKeyRef = opts.keyRef;\n if (local !== undefined) patch.local = local;\n if (opts.runner !== undefined) patch.runner = opts.runner;\n\n await withProviderScope(machine, async (db) => {\n const providers = await readScopedProviders(db, machine);\n const next = upsertProviderRecord(providers, opts.name, patch);\n await writeScopedProviders(db, machine, next);\n const rows = buildProviderListing(\n next,\n (ref) => getProviderApiKey(ref) !== null,\n );\n const row = rows.find((entry) => entry.name === opts.name);\n jsonOut({\n ok: true,\n scope: machine ? \"machine\" : \"shared\",\n name: opts.name,\n provider: row,\n cloudModelHint: opts.url ? getCloudModelRecommendation(opts.url) : null,\n });\n });\n });\n\nbridgeCommand\n .command(\"provider-config-remove\")\n .description(\"Remove a provider record (JSON)\")\n .requiredOption(\"--name <name>\", \"Provider name\")\n .option(\"--scope <scope>\", \"machine (default) or shared\", \"machine\")\n .action(async (opts) => {\n const machine = parseProviderScope(opts.scope);\n await withProviderScope(machine, async (db) => {\n const providers = await readScopedProviders(db, machine);\n const { providers: next, removed } = removeProviderRecord(\n providers,\n opts.name,\n );\n if (!removed) {\n jsonError(`No such provider: ${opts.name}`);\n }\n await writeScopedProviders(db, machine, next);\n jsonOut({\n ok: true,\n scope: machine ? \"machine\" : \"shared\",\n name: opts.name,\n removed: true,\n referencingRoles: rolesReferencing(\n await readScopedRoles(db, machine),\n opts.name,\n ),\n });\n });\n });\n\nbridgeCommand\n .command(\"provider-config-bind\")\n .description(\"Bind providers to an LLM role (JSON)\")\n .requiredOption(\"--role <role>\", `Role: ${VALID_ROLES.join(\" | \")}`)\n .requiredOption(\"--primary <name>\", \"Primary provider name\")\n .option(\"--fallback <name>\", \"Fallback provider name\")\n .option(\"--scope <scope>\", \"machine (default) or shared\", \"machine\")\n .action(async (opts) => {\n if (!VALID_ROLES.includes(opts.role)) {\n jsonError(`Invalid --role: ${opts.role}. Use ${VALID_ROLES.join(\", \")}.`);\n }\n const machine = parseProviderScope(opts.scope);\n await withProviderScope(machine, async (db) => {\n const providers = await readScopedProviders(db, machine);\n const roles = await readScopedRoles(db, machine);\n const nextRoles = bindRoleProviders(\n roles,\n opts.role as LlmRole,\n opts.primary,\n opts.fallback,\n );\n await writeScopedRoles(db, machine, nextRoles);\n const binding = nextRoles[opts.role as LlmRole];\n const primary = providers[opts.primary];\n jsonOut({\n ok: true,\n scope: machine ? \"machine\" : \"shared\",\n role: opts.role,\n binding,\n warnings: [\n ...(primary &&\n primary.apiFlavor === \"anthropic-messages\" &&\n (opts.role === \"recall\" || opts.role === \"text\")\n ? [\"unsupported-provider-for-role\"]\n : []),\n ...(opts.primary && !(opts.primary in providers)\n ? [\"primary-provider-undefined\"]\n : []),\n ...(opts.fallback && !(opts.fallback in providers)\n ? [\"fallback-provider-undefined\"]\n : []),\n ],\n });\n });\n });\n\nbridgeCommand\n .command(\"provider-set-key\")\n .description(\"Store an API key for a provider reference (JSON)\")\n .requiredOption(\"--ref <ref>\", \"Credential reference name\")\n .requiredOption(\"--key <value>\", \"API key value (write-only)\")\n .action((opts) => {\n const key = opts.key.trim();\n if (!key) jsonError(\"No key provided.\");\n setProviderApiKey(opts.ref, key);\n jsonOut({ ok: true, ref: opts.ref, masked: maskSecret(key) });\n });\n\nbridgeCommand\n .command(\"provider-clear-key\")\n .description(\"Remove a stored provider API key (JSON)\")\n .requiredOption(\"--ref <ref>\", \"Credential reference name\")\n .action((opts) => {\n clearProviderApiKey(opts.ref);\n jsonOut({ ok: true, ref: opts.ref });\n });\n\nbridgeCommand\n .command(\"list-models\")\n .description(\"List models exposed by an LLM endpoint (JSON)\")\n .requiredOption(\"--url <url>\", \"Endpoint base URL\")\n .option(\"--key-ref <ref>\", \"Resolve API key from credentials by reference\")\n .action(async (opts) => {\n const apiKey = opts.keyRef\n ? (getProviderApiKey(opts.keyRef) ?? undefined)\n : undefined;\n const models = await getAvailableModels(opts.url, apiKey);\n jsonOut({ models });\n });\n\nbridgeCommand\n .command(\"cloud-model-hint\")\n .description(\"Suggest a cloud model for an endpoint URL (JSON)\")\n .requiredOption(\"--url <url>\", \"Endpoint base URL\")\n .action((opts) => {\n jsonOut({ recommendation: getCloudModelRecommendation(opts.url) });\n });\n\nbridgeCommand\n .command(\"local-llm-hints\")\n .description(\"Detect installed local LLM servers and suggest defaults (JSON)\")\n .action(() => {\n const profile = getSystemProfile();\n const flmInstalled =\n hasCommand(\"flm\") || existsSync(\"C:\\\\Program Files\\\\flm\\\\flm.exe\");\n const ollamaInstalled = isOllamaInstalled();\n const runners = [\n { id: \"flm\", label: \"FastFlowLM\", installed: flmInstalled },\n { id: \"ollama\", label: \"Ollama\", installed: ollamaInstalled },\n {\n id: \"foundry-local\",\n label: \"Foundry Local\",\n installed: false,\n },\n ];\n\n let recommended = \"ollama\";\n if (profile.recommendedRunner === \"fastflowlm\" && flmInstalled) {\n recommended = \"flm\";\n } else if (profile.recommendedRunner === \"ollama\" && ollamaInstalled) {\n recommended = \"ollama\";\n } else if (flmInstalled) {\n recommended = \"flm\";\n } else if (ollamaInstalled) {\n recommended = \"ollama\";\n } else if (profile.recommendedRunner === \"fastflowlm\") {\n recommended = \"flm\";\n }\n\n const defaultUrl =\n recommended === \"ollama\" ? \"http://localhost:11434/v1\" : DEFAULT_LLM_URL;\n\n jsonOut({\n runners,\n recommended,\n defaultUrl,\n defaultModel: profile.recommendedModel || DEFAULT_LLM_MODEL,\n });\n });\n\n// Settings the Studio UI may write through the generic setter. Secret-bearing\n// keys (llm.api_key) and structured provider config (llm.providers/llm.roles)\n// must go through their dedicated commands, never this escape hatch.\nconst UI_WRITABLE_SETTINGS = new Set([\n \"llm.enabled\",\n \"llm.vision.enabled\",\n \"system.locale\",\n]);\n\nbridgeCommand\n .command(\"setting-set\")\n .description(\"Set a single allowlisted ZAM setting value (JSON)\")\n .requiredOption(\"--key <key>\", \"Setting key\")\n .requiredOption(\"--value <value>\", \"Setting value\")\n .action(async (opts) => {\n if (!UI_WRITABLE_SETTINGS.has(opts.key)) {\n jsonError(\n `Setting \"${opts.key}\" is not writable via setting-set. Allowed: ${[...UI_WRITABLE_SETTINGS].join(\", \")}.`,\n );\n }\n await withDb(async (db) => {\n await setSetting(db, opts.key, opts.value);\n jsonOut({ ok: true, key: opts.key, value: opts.value });\n });\n });\n\n// ── zam bridge check-vision ────────────────────────────────────────────────\n\nbridgeCommand\n .command(\"check-vision\")\n .description(\n \"Check if UI observer vision analysis is enabled and ready (JSON)\",\n )\n .action(async () => {\n await withDb(async (db) => {\n jsonOut(await checkVisionReadiness(db));\n });\n });\n\n// ── zam bridge ensure-llm ─────────────────────────────────────────────────\n\nbridgeCommand\n .command(\"ensure-llm\")\n .description(\n \"Start the local LLM server if needed and report readiness (JSON)\",\n )\n .option(\n \"--timeout <ms>\",\n \"Max time to wait for the server to come online\",\n \"25000\",\n )\n .action(async (opts) => {\n await withDb(async (db) => {\n const result = await ensureLlmReadyHeadless(db, {\n timeoutMs: Number(opts.timeout),\n });\n jsonOut(result);\n });\n });\n\n// ── zam bridge translate-question ──────────────────────────────────────────\n\nbridgeCommand\n .command(\"translate-question\")\n .description(\"Translate a question dynamically using the local LLM (JSON)\")\n .requiredOption(\"--question <text>\", \"Question in English to translate\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const isEnabled = (await getSetting(db, \"llm.enabled\")) === \"true\";\n if (!isEnabled) {\n jsonOut({\n success: false,\n error: \"LLM integration is disabled\",\n translation: opts.question,\n });\n return;\n }\n try {\n const translation = await translateQuestionViaLLM(db, opts.question);\n jsonOut({ success: true, translation });\n } catch (err) {\n jsonOut({\n success: false,\n error: (err as Error).message,\n translation: opts.question,\n });\n }\n });\n });\n\n// ── zam bridge evaluate-answer ────────────────────────────────────────────\n\nbridgeCommand\n .command(\"evaluate-answer\")\n .description(\n \"Evaluate the learner's active-recall answer using the local LLM (JSON)\",\n )\n .requiredOption(\"--slug <slug>\", \"Token slug\")\n .requiredOption(\"--concept <concept>\", \"Target concept text\")\n .requiredOption(\"--domain <domain>\", \"Token domain\")\n .requiredOption(\"--bloom-level <level>\", \"Bloom taxonomy level\")\n .requiredOption(\"--question <question>\", \"Question prompt presented\")\n .requiredOption(\"--user-answer <answer>\", \"User's typed answer\")\n .option(\"--context <context>\", \"Optional token context details\")\n .option(\"--source-link <link>\", \"Optional source link\")\n .option(\n \"--source-content <content>\",\n \"Pre-resolved source reference content (skips re-fetch when set)\",\n )\n .action(async (opts) => {\n await withDb(async (db) => {\n const isEnabled = (await getSetting(db, \"llm.enabled\")) === \"true\";\n if (!isEnabled) {\n jsonOut({\n success: false,\n error: \"LLM integration is disabled\",\n evaluation: \"\",\n });\n return;\n }\n\n let resolvedContextContent: string | null = opts.sourceContent ?? null;\n if (resolvedContextContent == null && opts.sourceLink) {\n try {\n const resolved = await resolveReviewContext(opts.sourceLink);\n resolvedContextContent = resolved?.content ?? null;\n } catch {\n // ignore context resolution errors\n }\n }\n\n try {\n const result = await evaluateAnswerViaLLM(db, {\n slug: opts.slug,\n concept: opts.concept,\n domain: opts.domain,\n bloomLevel: Number(opts.bloomLevel),\n context: opts.context,\n question: opts.question,\n userAnswer: opts.userAnswer,\n sourceLinkContent: resolvedContextContent,\n });\n jsonOut({\n success: true,\n evaluation: result.text,\n evaluationModel: result.model,\n });\n } catch (err) {\n jsonOut({\n success: false,\n error: (err as Error).message,\n evaluation: \"\",\n });\n }\n });\n });\n\n// ── zam bridge desktop-bootstrap / get-settings ───────────────────────────\n\nbridgeCommand\n .command(\"desktop-bootstrap\")\n .description(\"Initialize first-run desktop state (JSON)\")\n .option(\"--user <id>\", \"Preferred user ID when none is configured\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const userId = await ensureDefaultUser(db, opts.user);\n const { enabled, url, model, locale } = await getLlmConfig(db);\n const { workspaceDir, activeWorkspaceId, skillLinks } =\n await ensureDesktopWorkspace(db);\n jsonOut({\n userId,\n locale,\n llm: { enabled, url, model },\n activeWorkspaceId,\n workspaceDir,\n skillLinks,\n });\n });\n });\n\nbridgeCommand\n .command(\"get-settings\")\n .description(\"Get active ZAM settings (JSON)\")\n .action(async () => {\n await withDb(async (db) => {\n const { enabled, url, model, locale } = await getLlmConfig(db);\n jsonOut({\n locale,\n llm: {\n enabled,\n url,\n model,\n },\n });\n });\n });\n\n// ── zam bridge database-status / database-select-user ───────────────────────\n\ninterface DatabaseUserSummary {\n id: string;\n cardCount: number;\n}\n\nasync function readDatabaseUserSummaries(\n db: Database,\n): Promise<DatabaseUserSummary[]> {\n return (await db\n .prepare(\n `SELECT user_id AS id, COUNT(*) AS cardCount\n FROM cards\n GROUP BY user_id\n ORDER BY user_id`,\n )\n .all()) as DatabaseUserSummary[];\n}\n\nbridgeCommand\n .command(\"database-status\")\n .description(\"Show the active database target and learning profiles (JSON)\")\n .action(async () => {\n const target = getDatabaseTargetInfo();\n await withDb(async (db) => {\n const userId = (await getSetting(db, \"user.id\")) ?? null;\n const users = await readDatabaseUserSummaries(db);\n jsonOut({\n success: true,\n connected: true,\n target,\n userId,\n cardCount: users.find((user) => user.id === userId)?.cardCount ?? 0,\n users,\n });\n });\n });\n\nbridgeCommand\n .command(\"database-select-user\")\n .description(\"Select an existing learning profile for this database (JSON)\")\n .requiredOption(\"--user <id>\", \"Existing user ID\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const userId = String(opts.user ?? \"\").trim();\n const users = await readDatabaseUserSummaries(db);\n const selected = users.find((user) => user.id === userId);\n if (!selected) {\n jsonError(`Learning profile not found: ${userId}`);\n return;\n }\n await setSetting(db, \"user.id\", userId);\n jsonOut({\n success: true,\n userId,\n cardCount: selected.cardCount,\n });\n });\n });\n\n// ── zam bridge list-tokens (for graph pickers / entry points) ───────────────\n\nbridgeCommand\n .command(\"list-tokens\")\n .description(\n \"List tokens (optionally enriched with user card state for viz) (JSON)\",\n )\n .option(\n \"--user <id>\",\n \"User ID (default: whoami) — when provided, includes personal card info\",\n )\n .option(\"--domain <domain>\", \"Filter by exact domain\")\n .option(\n \"--domain-prefix <prefix>\",\n \"Filter by domain prefix (e.g. company-team) — uses / separator for hierarchy\",\n )\n .option(\"--knowledge-context <context>\", \"Filter by knowledge context\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const userId = opts.user\n ? await resolveUser(opts, db, { json: true })\n : undefined;\n const listOpts: ListTokensOptions = {};\n if (opts.domain) listOpts.domain = opts.domain;\n if (opts.domainPrefix) listOpts.domainPrefix = opts.domainPrefix;\n if (opts.knowledgeContext)\n listOpts.knowledgeContext = opts.knowledgeContext;\n\n const tokens = await listTokens(\n db,\n Object.keys(listOpts).length ? listOpts : undefined,\n );\n\n const cardMap = new Map<\n string,\n {\n token_id: string;\n state: string;\n reps: number;\n stability: number;\n difficulty: number;\n blocked: number;\n due_at: string;\n last_review_at: string | null;\n }\n >();\n if (userId && tokens.length > 0) {\n const ids = tokens.map((t) => t.id);\n const placeholders = ids.map(() => \"?\").join(\",\");\n const cards = (await db\n .prepare(\n `SELECT token_id, state, reps, stability, difficulty, blocked, due_at, last_review_at\n FROM cards WHERE token_id IN (${placeholders}) AND user_id = ?`,\n )\n .all(...ids, userId)) as Array<{\n token_id: string;\n state: string;\n reps: number;\n stability: number;\n difficulty: number;\n blocked: number;\n due_at: string;\n last_review_at: string | null;\n }>;\n for (const c of cards) cardMap.set(c.token_id, c);\n }\n\n // Fetch knowledge context assignments for all listed tokens\n const contextMap = new Map<\n string,\n Array<{ name: string; label: string | null; language: string | null }>\n >();\n if (tokens.length > 0) {\n const ids = tokens.map((t) => t.id);\n const placeholders = ids.map(() => \"?\").join(\",\");\n const mappings = (await db\n .prepare(\n `SELECT tc.token_id, c.name, c.label, c.language\n FROM token_contexts tc\n INNER JOIN contexts c ON c.id = tc.context_id\n WHERE tc.token_id IN (${placeholders})`,\n )\n .all(...ids)) as Array<{\n token_id: string;\n name: string;\n label: string | null;\n language: string | null;\n }>;\n for (const m of mappings) {\n const list = contextMap.get(m.token_id) ?? [];\n list.push({ name: m.name, label: m.label, language: m.language });\n contextMap.set(m.token_id, list);\n }\n }\n\n const out = tokens.map((t) => {\n const c = cardMap.get(t.id);\n return {\n id: t.id,\n slug: t.slug,\n title: t.title,\n display_title: getDisplayTitle(t),\n concept: t.concept,\n domain: t.domain,\n bloomLevel: t.bloom_level,\n knowledgeContexts: contextMap.get(t.id) ?? [],\n card: c\n ? {\n state: c.state,\n reps: c.reps,\n stability: c.stability,\n difficulty: c.difficulty,\n blocked: c.blocked === 1,\n dueAt: c.due_at,\n lastReviewAt: c.last_review_at ?? null,\n }\n : null,\n };\n });\n\n jsonOut({ tokens: out });\n });\n });\n\n// ── zam bridge get-neighborhood (core for 3D focus + direct prereqs/dependents) ─\n\nbridgeCommand\n .command(\"get-neighborhood\")\n .description(\n \"Get direct prerequisite neighborhood around a token (for 3D graph viz) (JSON)\",\n )\n .requiredOption(\"--focus <slug>\", \"Token slug to center the neighborhood on\")\n .option(\n \"--user <id>\",\n \"User ID (default: whoami) for personal card state in the result\",\n )\n .action(async (opts) => {\n await withDb(async (db) => {\n const userId = await resolveUser(opts, db, { json: true });\n\n const token = await getTokenBySlug(db, opts.focus);\n if (!token) {\n jsonError(`Token not found: ${opts.focus}`);\n }\n\n const nb = await getTokenNeighborhood(db, token!.id, userId);\n\n const allTokens = [nb.center, ...nb.prerequisites, ...nb.dependents];\n const contextMap = new Map<\n string,\n Array<{ name: string; label: string | null; language: string | null }>\n >();\n if (allTokens.length > 0) {\n const ids = allTokens.map((t) => t.id);\n const placeholders = ids.map(() => \"?\").join(\",\");\n const mappings = (await db\n .prepare(\n `SELECT tc.token_id, c.name, c.label, c.language\n FROM token_contexts tc\n INNER JOIN contexts c ON c.id = tc.context_id\n WHERE tc.token_id IN (${placeholders})`,\n )\n .all(...ids)) as Array<{\n token_id: string;\n name: string;\n label: string | null;\n language: string | null;\n }>;\n for (const m of mappings) {\n const list = contextMap.get(m.token_id) ?? [];\n list.push({ name: m.name, label: m.label, language: m.language });\n contextMap.set(m.token_id, list);\n }\n }\n\n const mapToken = (nt: NeighborhoodToken) => ({\n id: nt.id,\n slug: nt.slug,\n title: nt.title,\n display_title: getDisplayTitle(nt),\n concept: nt.concept,\n domain: nt.domain,\n bloomLevel: nt.bloom_level,\n knowledgeContexts: contextMap.get(nt.id) ?? [],\n card: nt.card\n ? {\n state: nt.card.state,\n reps: nt.card.reps,\n stability: nt.card.stability,\n difficulty: nt.card.difficulty,\n blocked: nt.card.blocked,\n dueAt: nt.card.due_at,\n lastReviewAt: nt.card.last_review_at,\n }\n : null,\n });\n\n jsonOut({\n focus: opts.focus,\n center: mapToken(nb.center),\n prerequisites: nb.prerequisites.map(mapToken),\n dependents: nb.dependents.map(mapToken),\n });\n });\n });\n\n// ── zam bridge personal-card-list ──────────────────────────────────────────\n\nbridgeCommand\n .command(\"personal-card-list\")\n .description(\"List and search personal learning cards (JSON)\")\n .option(\"--user <id>\", \"User ID (default: whoami)\")\n .option(\"--query <query>\", \"Text search query\")\n .option(\"--domain <domain>\", \"Filter by category/domain\")\n .option(\"--knowledge-context <context>\", \"Filter by knowledge context\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const userId = await resolveUser(opts, db, { json: true });\n const cards = await listPersonalCards(db, userId, {\n query: opts.query,\n domain: opts.domain,\n knowledgeContext: opts.knowledgeContext,\n });\n const contextMap = new Map<\n string,\n Array<{ name: string; label: string | null; language: string | null }>\n >();\n if (cards.length > 0) {\n const tokenIds = cards.map((card) => card.tokenId);\n const placeholders = tokenIds.map(() => \"?\").join(\",\");\n const mappings = (await db\n .prepare(\n `SELECT tc.token_id, c.name, c.label, c.language\n FROM token_contexts tc\n INNER JOIN contexts c ON c.id = tc.context_id\n WHERE tc.token_id IN (${placeholders})\n ORDER BY c.name`,\n )\n .all(...tokenIds)) as Array<{\n token_id: string;\n name: string;\n label: string | null;\n language: string | null;\n }>;\n for (const mapping of mappings) {\n const contexts = contextMap.get(mapping.token_id) ?? [];\n contexts.push({\n name: mapping.name,\n label: mapping.label,\n language: mapping.language,\n });\n contextMap.set(mapping.token_id, contexts);\n }\n }\n jsonOut({\n cards: cards.map((card) => ({\n ...card,\n knowledgeContexts: contextMap.get(card.tokenId) ?? [],\n })),\n });\n });\n });\n\n// ── zam bridge personal-card-create ────────────────────────────────────────\n\nbridgeCommand\n .command(\"personal-card-create\")\n .description(\"Atomically create a token and its personal card (JSON)\")\n .option(\"--user <id>\", \"User ID (default: whoami)\")\n .requiredOption(\"--concept <concept>\", \"Concept description / answer\")\n .option(\"--title <title>\", \"Human-friendly display title\")\n .option(\"--domain <domain>\", \"Knowledge category / domain\", \"\")\n .option(\"--question <question>\", \"Question prompt for recall\")\n .option(\"--source-link <link>\", \"Source file path or reference URL\")\n .option(\"--bloom <level>\", \"Bloom taxonomy level (1-5)\", \"1\")\n .option(\n \"--mode <mode>\",\n \"Symbiosis mode: shadowing | copilot | autonomy | none\",\n \"none\",\n )\n .option(\"--context <context>\", \"Context description\", \"\")\n .option(\n \"--knowledge-context <context>\",\n \"Assign token to a knowledge context (repeatable)\",\n (val, memo: string[]) => {\n memo.push(val);\n return memo;\n },\n [],\n )\n .action(async (opts) => {\n await withDb(async (db) => {\n const userId = await resolveUser(opts, db, { json: true });\n const contextNames = parseKnowledgeContextNames(\n opts.knowledgeContext || [],\n );\n const contexts = await resolveKnowledgeContexts(db, contextNames);\n\n const bloom = Number(opts.bloom) as BloomLevel;\n if (bloom < 1 || bloom > 5) {\n jsonError(\"bloom must be between 1 and 5\");\n }\n\n const mode = opts.mode === \"none\" ? null : (opts.mode as SymbiosisMode);\n if (mode && ![\"shadowing\", \"copilot\", \"autonomy\"].includes(mode)) {\n jsonError(`Invalid mode: ${opts.mode}`);\n }\n\n const slug = await generateTokenSlug(\n db,\n opts.domain,\n opts.concept,\n opts.question,\n );\n\n let question: string | null = opts.question || null;\n if (!question) {\n question = generateConceptFreeCue(bloom, slug, opts.domain);\n }\n\n const { token, card } = await db.transaction(async (tx) => {\n const createdToken = await createToken(tx, {\n slug,\n title: opts.title,\n concept: opts.concept,\n domain: opts.domain,\n bloom_level: bloom,\n context: opts.context,\n symbiosis_mode: mode,\n source_link: opts.sourceLink || null,\n question,\n });\n for (const context of contexts) {\n await assignTokenToContext(tx, createdToken.id, context.id);\n }\n const createdCard = await ensureCard(tx, createdToken.id, userId);\n return { token: createdToken, card: createdCard };\n });\n\n jsonOut({\n success: true,\n token: {\n id: token.id,\n slug: token.slug,\n title: token.title,\n display_title: getDisplayTitle(token),\n concept: token.concept,\n domain: token.domain,\n bloomLevel: token.bloom_level,\n context: token.context,\n symbiosisMode: token.symbiosis_mode,\n sourceLink: token.source_link,\n question: token.question,\n createdAt: token.created_at,\n updatedAt: token.updated_at,\n knowledgeContexts: contexts.map((context) => ({\n name: context.name,\n label: context.label,\n language: context.language,\n })),\n },\n card: {\n id: card.id,\n tokenId: card.token_id,\n userId: card.user_id,\n state: card.state,\n dueAt: card.due_at,\n blocked: card.blocked,\n },\n });\n });\n });\n\n// ── zam bridge personal-card-update ────────────────────────────────────────\n\nbridgeCommand\n .command(\"personal-card-update\")\n .description(\"Update the mutable token fields of a personal card (JSON)\")\n .option(\"--user <id>\", \"User ID (default: whoami)\")\n .requiredOption(\"--slug <slug>\", \"Token slug to update\")\n .option(\"--title <title>\", \"Updated display title\")\n .option(\"--concept <concept>\", \"Updated concept text\")\n .option(\"--domain <domain>\", \"Updated domain / category\")\n .option(\"--bloom <level>\", \"Updated Bloom taxonomy level (1-5)\")\n .option(\"--context <context>\", \"Updated context\")\n .option(\n \"--mode <mode>\",\n \"Updated symbiosis mode: shadowing | copilot | autonomy | none\",\n )\n .option(\"--source-link <link>\", \"Updated source link\")\n .option(\"--question <question>\", \"Updated question text\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const userId = await resolveUser(opts, db, { json: true });\n const updates: {\n title?: string;\n concept?: string;\n domain?: string;\n bloom_level?: BloomLevel;\n context?: string;\n symbiosis_mode?: SymbiosisMode | null;\n source_link?: string | null;\n question?: string | null;\n } = {};\n\n if (opts.title !== undefined) updates.title = opts.title;\n if (opts.concept !== undefined) updates.concept = opts.concept;\n if (opts.domain !== undefined) updates.domain = opts.domain;\n if (opts.bloom !== undefined) {\n const bloom = Number(opts.bloom) as BloomLevel;\n if (bloom < 1 || bloom > 5) {\n jsonError(\"bloom must be between 1 and 5\");\n }\n updates.bloom_level = bloom;\n }\n if (opts.context !== undefined) updates.context = opts.context;\n if (opts.sourceLink !== undefined) {\n updates.source_link = opts.sourceLink === \"\" ? null : opts.sourceLink;\n }\n if (opts.question !== undefined) {\n updates.question = opts.question === \"\" ? null : opts.question;\n }\n if (opts.mode !== undefined) {\n const validModes = [\"shadowing\", \"copilot\", \"autonomy\", \"none\"];\n if (!validModes.includes(opts.mode)) {\n jsonError(`Invalid mode: ${opts.mode}`);\n }\n updates.symbiosis_mode =\n opts.mode === \"none\" ? null : (opts.mode as SymbiosisMode);\n }\n\n const token = await db.transaction(async (tx) => {\n const existingToken = await getTokenBySlug(tx, opts.slug);\n if (!existingToken) {\n throw new Error(`Token not found: ${opts.slug}`);\n }\n const card = await getCard(tx, existingToken.id, userId);\n if (!card) {\n throw new Error(\n `Card not found for token ${opts.slug} and user ${userId}`,\n );\n }\n return updateToken(tx, opts.slug, updates);\n });\n\n jsonOut({\n success: true,\n token: {\n id: token.id,\n slug: token.slug,\n title: token.title,\n display_title: getDisplayTitle(token),\n concept: token.concept,\n domain: token.domain,\n bloomLevel: token.bloom_level,\n context: token.context,\n symbiosisMode: token.symbiosis_mode,\n sourceLink: token.source_link,\n question: token.question,\n createdAt: token.created_at,\n updatedAt: token.updated_at,\n },\n });\n });\n });\n\n// ── zam bridge personal-card-remove ────────────────────────────────────────\n\nbridgeCommand\n .command(\"personal-card-remove\")\n .description(\n \"Remove a personal card (optionally previewing the effects) (JSON)\",\n )\n .option(\"--user <id>\", \"User ID (default: whoami)\")\n .requiredOption(\"--slug <slug>\", \"Token slug\")\n .option(\"--confirm\", \"Perform the deletion instead of a preview\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const userId = await resolveUser(opts, db, { json: true });\n const token = await getTokenBySlug(db, opts.slug);\n if (!token) {\n jsonError(`Token not found: ${opts.slug}`);\n }\n\n const card = await getCard(db, token.id, userId);\n if (!card) {\n jsonError(`Card not found for token ${opts.slug} and user ${userId}`);\n }\n\n if (!opts.confirm) {\n const impact = await getCardDeletionImpact(db, token.id, userId);\n jsonOut({\n success: true,\n preview: true,\n requiresConfirmation: true,\n token: {\n id: token.id,\n slug: token.slug,\n title: token.title,\n display_title: getDisplayTitle(token),\n },\n impact,\n });\n return;\n }\n\n const result = await deleteCardForUser(db, token.id, userId);\n jsonOut({\n success: true,\n deletedCard: {\n id: result.card.id,\n tokenId: result.card.token_id,\n userId: result.card.user_id,\n },\n impact: result.impact,\n });\n });\n });\n\n// ── zam bridge personal-card-delete ────────────────────────────────────────\n\nbridgeCommand\n .command(\"personal-card-delete\")\n .description(\"Hard-delete a token and all its dependencies (JSON)\")\n .requiredOption(\"--slug <slug>\", \"Token slug\")\n .option(\"--confirm\", \"Perform the deletion instead of a preview\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const token = await getTokenBySlug(db, opts.slug);\n if (!token) {\n jsonError(`Token not found: ${opts.slug}`);\n }\n\n if (!opts.confirm) {\n const impact = await getTokenDeleteImpact(db, opts.slug);\n jsonOut({\n success: true,\n preview: true,\n requiresConfirmation: true,\n token: {\n id: token.id,\n slug: token.slug,\n title: token.title,\n display_title: getDisplayTitle(token),\n },\n impact,\n });\n return;\n }\n\n const result = await deleteToken(db, opts.slug);\n jsonOut({\n success: true,\n deletedToken: {\n id: result.token.id,\n slug: result.token.slug,\n },\n impact: result.impact,\n });\n });\n });\n\n// ── zam bridge personal-card-import-curriculum ─────────────────────────────\n\nbridgeCommand\n .command(\"personal-card-import-curriculum\")\n .description(\"Parse curriculum text using LLM and import cards (JSON)\")\n .option(\"--user <id>\", \"User ID (default: whoami)\")\n .requiredOption(\"--text <text>\", \"Curriculum syllabus/content text\")\n .requiredOption(\n \"--domain <domain>\",\n \"Default category/domain for imported cards\",\n )\n .option(\"--source <url>\", \"Provenance source link or URL\")\n .option(\"--preview\", \"Return parsed cards without saving them\")\n .option(\n \"--knowledge-context <context>\",\n \"Assign imported tokens to a knowledge context (repeatable)\",\n (val, memo: string[]) => {\n memo.push(val);\n return memo;\n },\n [],\n )\n .action(async (opts) => {\n await withDb(async (db) => {\n const userId = await resolveUser(opts, db, { json: true });\n\n const contextNames = parseKnowledgeContextNames(\n opts.knowledgeContext || [],\n );\n const contexts = await resolveKnowledgeContexts(db, contextNames);\n const firstContext = contexts[0]?.name;\n\n const cards = await importCurriculumViaLLM(\n db,\n opts.text,\n opts.domain,\n opts.source || null,\n { knowledgeContext: firstContext },\n );\n\n if (opts.preview) {\n jsonOut({\n success: true,\n proposals: cards,\n });\n return;\n }\n\n const result = await importCurriculumCards(db, userId, cards);\n\n for (const card of cards) {\n const baseText =\n card.question && card.question.trim().length > 0\n ? card.question\n : card.concept;\n const cleanDomain = slugify(card.domain || \"\");\n const cleanBase = slugify(baseText);\n let baseSlug = cleanDomain ? `${cleanDomain}-${cleanBase}` : cleanBase;\n if (baseSlug.length > 60) {\n baseSlug = baseSlug.slice(0, 60).replace(/-$/, \"\");\n }\n if (!baseSlug) {\n baseSlug = \"token\";\n }\n const token = await getTokenBySlug(db, baseSlug);\n if (token) {\n for (const context of contexts) {\n await assignTokenToContext(db, token.id, context.id);\n }\n }\n }\n\n jsonOut({\n success: true,\n createdCount: result.createdCount,\n ensuredCount: result.ensuredCount,\n });\n });\n });\n\n// ── zam bridge personal-card-split-proposals ───────────────────────────────\n\nbridgeCommand\n .command(\"personal-card-split-proposals\")\n .description(\"Generate atomic proposals for splitting a card (JSON)\")\n .requiredOption(\"--slug <slug>\", \"Original token slug\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const token = await getTokenBySlug(db, opts.slug);\n if (!token) {\n jsonError(`Token not found: ${opts.slug}`);\n }\n\n const proposals = await generateSplitProposalsViaLLM(db, token);\n jsonOut({\n success: true,\n proposals,\n });\n });\n });\n\n// ── zam bridge personal-card-confirm-split ─────────────────────────────────\n\nbridgeCommand\n .command(\"personal-card-confirm-split\")\n .description(\"Save confirmed card split and modify original card (JSON)\")\n .option(\"--user <id>\", \"User ID (default: whoami)\")\n .requiredOption(\"--slug <slug>\", \"Original token slug\")\n .requiredOption(\n \"--action <action>\",\n \"Original card action: 'block' or 'remove'\",\n )\n .requiredOption(\n \"--original-question <question>\",\n \"Rewritten question of the original card\",\n )\n .requiredOption(\n \"--original-concept <concept>\",\n \"Rewritten concept of the original card\",\n )\n .requiredOption(\n \"--proposals <json>\",\n \"JSON string representing proposals array\",\n )\n .action(async (opts) => {\n await withDb(async (db) => {\n const userId = await resolveUser(opts, db, { json: true });\n const proposals = JSON.parse(opts.proposals);\n\n const result = await confirmCardSplit(\n db,\n userId,\n opts.slug,\n opts.action as \"block\" | \"remove\",\n opts.originalQuestion,\n opts.originalConcept,\n proposals,\n );\n\n jsonOut({\n success: true,\n createdCount: result.createdCount,\n ensuredCount: result.ensuredCount,\n });\n });\n });\n\n// ── zam bridge personal-card-foundations-proposals ─────────────────────────\n\nbridgeCommand\n .command(\"personal-card-foundations-proposals\")\n .description(\"Generate prerequisite suggestions for a card (JSON)\")\n .requiredOption(\"--slug <slug>\", \"Original token slug\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const token = await getTokenBySlug(db, opts.slug);\n if (!token) {\n jsonError(`Token not found: ${opts.slug}`);\n }\n\n const proposals = await generateFoundationsProposalsViaLLM(db, token);\n\n const resolvedProposals = [];\n for (const prop of proposals) {\n const baseText =\n prop.question && prop.question.trim().length > 0\n ? prop.question\n : prop.concept;\n const cleanDomain = slugify(prop.domain || \"\");\n const cleanBase = slugify(baseText);\n let baseSlug = cleanDomain ? `${cleanDomain}-${cleanBase}` : cleanBase;\n if (baseSlug.length > 60) {\n baseSlug = baseSlug.slice(0, 60).replace(/-$/, \"\");\n }\n if (!baseSlug) {\n baseSlug = \"token\";\n }\n\n const existingToken = await getTokenBySlug(db, baseSlug);\n if (existingToken) {\n resolvedProposals.push({\n ...prop,\n exists: true,\n slug: existingToken.slug,\n question: existingToken.question || prop.question,\n concept: existingToken.concept,\n domain: existingToken.domain,\n });\n } else {\n resolvedProposals.push({\n ...prop,\n exists: false,\n slug: null,\n });\n }\n }\n\n jsonOut({\n success: true,\n proposals: resolvedProposals,\n });\n });\n });\n\n// ── zam bridge personal-card-confirm-foundations ───────────────────────────\n\nbridgeCommand\n .command(\"personal-card-confirm-foundations\")\n .description(\"Save confirmed foundational prerequisites (JSON)\")\n .option(\"--user <id>\", \"User ID (default: whoami)\")\n .requiredOption(\"--slug <slug>\", \"Original token slug\")\n .requiredOption(\n \"--proposals <json>\",\n \"JSON string representing proposals array\",\n )\n .action(async (opts) => {\n await withDb(async (db) => {\n const userId = await resolveUser(opts, db, { json: true });\n const proposals = JSON.parse(opts.proposals);\n\n const result = await confirmFoundations(db, userId, opts.slug, proposals);\n\n jsonOut({\n success: true,\n createdCount: result.createdCount,\n linkedCount: result.linkedCount,\n });\n });\n });\n\n// ── zam bridge personal-source-import ──────────────────────────────────────\n\nbridgeCommand\n .command(\"personal-source-import\")\n .description(\n \"Fetch and clean plain text from local file, web link, or vision scan (JSON)\",\n )\n .requiredOption(\"--type <file|web|scan>\", \"Source type\")\n .requiredOption(\"--uri <uri>\", \"Source path or URL\")\n .option(\"--refresh\", \"Re-fetch an already cached web source\")\n .action(async (opts) => {\n await withDb(async (db) => {\n if (opts.type === \"web\" && !opts.refresh) {\n const cached = (await db\n .prepare(\n \"SELECT id, content FROM sources WHERE uri = ? AND type = 'web'\",\n )\n .get(opts.uri)) as { id: string; content: string | null } | undefined;\n if (cached?.content) {\n jsonOut({\n success: true,\n sourceId: cached.id,\n content: cached.content,\n cached: true,\n });\n return;\n }\n }\n\n let content = \"\";\n if (opts.type === \"file\") {\n content = await readLocalFile(opts.uri);\n } else if (opts.type === \"web\") {\n content = await readWebLink(opts.uri);\n } else if (opts.type === \"scan\") {\n content = await readImageOCR(db, opts.uri);\n } else {\n throw new Error(`Invalid source type: ${opts.type}`);\n }\n\n const sourceId = ulid();\n await db\n .prepare(\n `INSERT INTO sources (id, type, uri, content)\n VALUES (?, ?, ?, ?)\n ON CONFLICT(uri) DO UPDATE SET\n type = excluded.type,\n content = excluded.content`,\n )\n .run(sourceId, opts.type, opts.uri, content);\n\n const record = (await db\n .prepare(\"SELECT id, content FROM sources WHERE uri = ?\")\n .get(opts.uri)) as { id: string; content: string };\n\n jsonOut({\n success: true,\n sourceId: record.id,\n content: record.content,\n cached: false,\n });\n });\n });\n\n// ── zam bridge personal-source-confirm-import ──────────────────────────────\n\nbridgeCommand\n .command(\"personal-source-confirm-import\")\n .description(\n \"Confirm and save cards generated from a source reference (JSON)\",\n )\n .option(\"--user <id>\", \"User ID (default: whoami)\")\n .requiredOption(\"--sourceId <id>\", \"Source database ID\")\n .requiredOption(\n \"--proposals <json>\",\n \"JSON string representing proposals array\",\n )\n .option(\n \"--knowledge-context <context>\",\n \"Assign confirmed tokens to a knowledge context (repeatable)\",\n (val, memo: string[]) => {\n memo.push(val);\n return memo;\n },\n [],\n )\n .action(async (opts) => {\n await withDb(async (db) => {\n const userId = await resolveUser(opts, db, { json: true });\n const proposals = JSON.parse(opts.proposals);\n const contextNames = parseKnowledgeContextNames(\n opts.knowledgeContext || [],\n );\n const contexts = await resolveKnowledgeContexts(db, contextNames);\n\n const result = await confirmSourceImport(\n db,\n userId,\n opts.sourceId,\n proposals,\n );\n\n for (const p of proposals) {\n const baseText =\n p.question && p.question.trim().length > 0 ? p.question : p.concept;\n const cleanDomain = slugify(p.domain || \"\");\n const cleanBase = slugify(baseText);\n let baseSlug = cleanDomain ? `${cleanDomain}-${cleanBase}` : cleanBase;\n if (baseSlug.length > 60) {\n baseSlug = baseSlug.slice(0, 60).replace(/-$/, \"\");\n }\n if (!baseSlug) {\n baseSlug = \"token\";\n }\n const token = await getTokenBySlug(db, baseSlug);\n if (token) {\n for (const context of contexts) {\n await assignTokenToContext(db, token.id, context.id);\n }\n }\n }\n\n jsonOut({\n success: true,\n createdCount: result.createdCount,\n ensuredCount: result.linkedCount,\n });\n });\n });\n\n// ── zam bridge curriculum-list-providers ────────────────────────────────────\n\nbridgeCommand\n .command(\"curriculum-list-providers\")\n .description(\"List registered curriculum providers (JSON)\")\n .action(() => {\n jsonOut({\n success: true,\n providers: CURRICULUM_PROVIDERS.map((provider) => ({\n id: provider.id,\n country: provider.country,\n countryLabel: provider.countryLabel,\n region: provider.region,\n regionLabel: provider.regionLabel,\n label: provider.label,\n })),\n });\n });\n\n// ── zam bridge curriculum-list-level ────────────────────────────────────────\n\nconst CURRICULUM_LEVELS: CurriculumLevel[] = [\n \"schoolType\",\n \"grade\",\n \"subject\",\n \"track\",\n \"topic\",\n];\n\nbridgeCommand\n .command(\"curriculum-list-level\")\n .description(\"List taxonomy options for the next import-wizard step (JSON)\")\n .requiredOption(\"--provider <id>\", \"Curriculum provider id\")\n .requiredOption(\n \"--level <level>\",\n `Level to list: ${CURRICULUM_LEVELS.join(\"|\")}`,\n )\n .option(\"--selection <json>\", \"JSON selection made so far\", \"{}\")\n .action((opts) => {\n const provider = getCurriculumProvider(opts.provider);\n if (!provider) jsonError(`Unknown curriculum provider: ${opts.provider}`);\n\n if (!CURRICULUM_LEVELS.includes(opts.level)) {\n jsonError(\n `Invalid --level: ${opts.level}. Use one of ${CURRICULUM_LEVELS.join(\", \")}.`,\n );\n }\n\n let selection: CurriculumSelection;\n try {\n selection = JSON.parse(opts.selection);\n } catch {\n jsonError(\"Invalid --selection JSON\");\n return;\n }\n\n const level = opts.level as CurriculumLevel;\n if (level === \"schoolType\") {\n jsonOut({ success: true, options: provider.listSchoolTypes() });\n return;\n }\n\n if (!selection.schoolType) jsonError(\"selection.schoolType is required\");\n if (level === \"grade\") {\n jsonOut({\n success: true,\n options: provider.listGrades(selection.schoolType),\n });\n return;\n }\n\n if (!selection.grade) jsonError(\"selection.grade is required\");\n if (level === \"subject\") {\n jsonOut({\n success: true,\n options: provider.listSubjects(selection.schoolType, selection.grade),\n });\n return;\n }\n\n if (!selection.subject) jsonError(\"selection.subject is required\");\n if (level === \"track\") {\n jsonOut({\n success: true,\n options: provider.listTracks(\n selection.schoolType,\n selection.grade,\n selection.subject,\n ),\n });\n return;\n }\n\n jsonOut({ success: true, options: provider.listTopics(selection) });\n });\n\n// ── zam bridge curriculum-resolve-topics ─────────────────────────────────────\n\nbridgeCommand\n .command(\"curriculum-resolve-topics\")\n .description(\"Resolve selected curriculum topics to source URLs (JSON)\")\n .requiredOption(\"--provider <id>\", \"Curriculum provider id\")\n .requiredOption(\"--topics <json>\", \"JSON array of topic nodes to resolve\")\n .action((opts) => {\n const provider = getCurriculumProvider(opts.provider);\n if (!provider) jsonError(`Unknown curriculum provider: ${opts.provider}`);\n\n let topics: TopicNode[];\n try {\n topics = JSON.parse(opts.topics);\n } catch {\n jsonError(\"Invalid --topics JSON\");\n return;\n }\n\n const resolved = topics.map((topic) => provider.resolveTopic(topic));\n jsonOut({ success: true, resolved });\n });\n\nasync function fetchRawHtml(url: string): Promise<string> {\n if (!(await isSafeUrl(url))) {\n throw new Error(`Access denied to unsafe target URL: ${url}`);\n }\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 10000);\n try {\n const res = await fetch(url, {\n signal: controller.signal,\n headers: {\n \"User-Agent\": \"ZAM-Content-Studio/0.6.3\",\n },\n });\n if (!res.ok) {\n throw new Error(`Web server responded with status ${res.status}`);\n }\n const contentType = res.headers.get(\"content-type\") || \"\";\n if (\n !contentType.includes(\"text/html\") &&\n !contentType.includes(\"application/xhtml+xml\")\n ) {\n throw new Error(`Unsupported content type: ${contentType}`);\n }\n return await res.text();\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new Error(\"Connection request timed out after 10 seconds\");\n }\n throw err;\n } finally {\n clearTimeout(timeoutId);\n }\n}\n\n// ── zam bridge curriculum-extract-topics ─────────────────────────────────────\n\nbridgeCommand\n .command(\"curriculum-extract-topics\")\n .description(\n \"Fetch and extract specific texts for selected curriculum topics (JSON)\",\n )\n .requiredOption(\"--provider <id>\", \"Curriculum provider id\")\n .requiredOption(\"--topics <json>\", \"JSON array of selected topic nodes\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const provider = getCurriculumProvider(opts.provider);\n if (!provider) jsonError(`Unknown curriculum provider: ${opts.provider}`);\n\n let topics: TopicNode[];\n try {\n topics = JSON.parse(opts.topics);\n } catch {\n jsonError(\"Invalid --topics JSON\");\n return;\n }\n\n // Group topics by their resolved source URI\n const topicsByUri = new Map<string, TopicNode[]>();\n for (const topic of topics) {\n const resolved = provider.resolveTopic(topic);\n const list = topicsByUri.get(resolved.uri) || [];\n list.push(topic);\n topicsByUri.set(resolved.uri, list);\n }\n\n const extracted: Array<{\n topicId: string;\n uri: string;\n sourceId: string;\n text: string;\n }> = [];\n\n for (const [uri, uriTopics] of topicsByUri.entries()) {\n const rawHtml = await fetchRawHtml(uri);\n\n let extractedTexts: Record<string, string> = {};\n if (provider.extractTopics) {\n const fullTopicIds = uriTopics.map((t) => `${t.sourceRef}#${t.id}`);\n extractedTexts = provider.extractTopics(rawHtml, fullTopicIds);\n } else {\n const cleanText = cleanHtml(rawHtml);\n for (const t of uriTopics) {\n extractedTexts[`${t.sourceRef}#${t.id}`] = cleanText;\n }\n }\n\n const pageCleanedText = cleanHtml(rawHtml);\n const sourceId = ulid();\n await db\n .prepare(\n `INSERT INTO sources (id, type, uri, content)\n VALUES (?, 'web', ?, ?)\n ON CONFLICT(uri) DO UPDATE SET\n type = excluded.type,\n content = excluded.content`,\n )\n .run(sourceId, uri, pageCleanedText);\n\n const record = (await db\n .prepare(\"SELECT id FROM sources WHERE uri = ?\")\n .get(uri)) as { id: string };\n\n for (const topic of uriTopics) {\n const resolved = provider.resolveTopic(topic);\n const text = extractedTexts[resolved.topicId] || \"\";\n extracted.push({\n topicId: resolved.topicId,\n uri,\n sourceId: record.id,\n text,\n });\n }\n }\n\n jsonOut({ success: true, extracted });\n });\n });\n\n// ── zam bridge curriculum-get-last-selection ─────────────────────────────────\n\nbridgeCommand\n .command(\"curriculum-get-last-selection\")\n .description(\"Read the learner's last navigated curriculum path (JSON)\")\n .action(async () => {\n await withDb(async (db) => {\n const breadcrumb = await getLastCurriculumSelection(db);\n jsonOut({ success: true, breadcrumb: breadcrumb ?? null });\n });\n });\n\n// ── zam bridge curriculum-set-last-selection ─────────────────────────────────\n\nbridgeCommand\n .command(\"curriculum-set-last-selection\")\n .description(\"Persist the learner's last navigated curriculum path (JSON)\")\n .requiredOption(\n \"--breadcrumb <json>\",\n \"JSON breadcrumb: {providerId, schoolType?, grade?, subject?, track?}\",\n )\n .action(async (opts) => {\n await withDb(async (db) => {\n let breadcrumb: CurriculumBreadcrumb;\n try {\n breadcrumb = JSON.parse(opts.breadcrumb);\n } catch {\n jsonError(\"Invalid --breadcrumb JSON\");\n return;\n }\n if (!breadcrumb.providerId) {\n jsonError(\"breadcrumb.providerId is required\");\n return;\n }\n await setLastCurriculumSelection(db, breadcrumb);\n jsonOut({ success: true });\n });\n });\n\n// ── zam bridge list-knowledge-contexts ────────────────────────────────────────\n\nbridgeCommand\n .command(\"list-knowledge-contexts\")\n .description(\"List all knowledge contexts (JSON)\")\n .action(async () => {\n await withDb(async (db) => {\n const contexts = await listKnowledgeContexts(db);\n jsonOut({ success: true, contexts });\n });\n });\n\n// ── zam bridge assign-knowledge-context ───────────────────────────────────────\n\nbridgeCommand\n .command(\"assign-knowledge-context\")\n .description(\"Assign a token to a knowledge context (JSON)\")\n .requiredOption(\"--token <slug>\", \"Token slug\")\n .requiredOption(\"--context <name>\", \"Context name\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const context = await getKnowledgeContextByName(db, opts.context);\n if (!context) {\n jsonError(`Knowledge context not found: ${opts.context}`);\n }\n const token = await getTokenBySlug(db, opts.token);\n if (!token) {\n jsonError(`Token not found: ${opts.token}`);\n }\n await assignTokenToContext(db, token.id, context.id);\n jsonOut({ success: true, token: token.slug, context: context.name });\n });\n });\n\n// ── zam bridge unassign-knowledge-context ─────────────────────────────────────\n\nbridgeCommand\n .command(\"unassign-knowledge-context\")\n .description(\"Remove a token from a knowledge context (JSON)\")\n .requiredOption(\"--token <slug>\", \"Token slug\")\n .requiredOption(\"--context <name>\", \"Context name\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const context = await getKnowledgeContextByName(db, opts.context);\n if (!context) {\n jsonError(`Knowledge context not found: ${opts.context}`);\n }\n const token = await getTokenBySlug(db, opts.token);\n if (!token) {\n jsonError(`Token not found: ${opts.token}`);\n }\n await unassignTokenFromContext(db, token.id, context.id);\n jsonOut({ success: true, token: token.slug, context: context.name });\n });\n });\n\n// ── zam bridge get-active-knowledge-context ───────────────────────────────────\n\nbridgeCommand\n .command(\"get-active-knowledge-context\")\n .description(\"Get the active knowledge context name (JSON)\")\n .action(async () => {\n await withDb(async (db) => {\n const configured = getActiveWorkspaceContext();\n const active = configured\n ? await getKnowledgeContextByName(db, configured)\n : undefined;\n jsonOut({\n success: true,\n activeContext: active?.name ?? null,\n staleContext: configured && !active ? configured : null,\n });\n });\n });\n\n// ── zam bridge set-active-knowledge-context ───────────────────────────────────\n\nbridgeCommand\n .command(\"set-active-knowledge-context\")\n .description(\"Set the active knowledge context name (JSON)\")\n .argument(\"[name]\", \"Context name to use (use empty/none to clear)\")\n .action(async (name) => {\n await withDb(async (db) => {\n if (!name || name === \"none\" || name === \"null\" || name === \"undefined\") {\n if (!setActiveWorkspaceContext(undefined)) {\n jsonError(\"No active workspace configured\");\n }\n jsonOut({ success: true, activeContext: null });\n return;\n }\n const context = await getKnowledgeContextByName(db, name);\n if (!context) {\n jsonError(`Knowledge context not found: ${name}`);\n return;\n }\n if (!setActiveWorkspaceContext(context.name)) {\n jsonError(\"No active workspace configured\");\n }\n jsonOut({ success: true, activeContext: context.name });\n });\n });\n\n// ── zam bridge serve ──────────────────────────────────────────────────────\n\nbridgeCommand\n .command(\"serve\")\n .description(\"Start the persistent JSON-RPC stdin/stdout server\")\n .option(\"--stdin\", \"Use stdin/stdout for communication\")\n .action(async (_opts) => {\n isServeMode = true;\n\n // Diagnostic log. A windowed GUI swallows the daemon's stderr, so failures\n // that only happen when the bridge is spawned by the desktop app are\n // otherwise invisible. Logging the resolved environment makes a wrong\n // home directory (→ missing credentials → empty database) obvious.\n const {\n appendFileSync,\n existsSync: fileExists,\n mkdirSync: makeDir,\n } = await import(\"node:fs\");\n const nodeOs = await import(\"node:os\");\n const nodePath = await import(\"node:path\");\n const logDir = nodePath.join(nodeOs.homedir(), \".zam\");\n const logPath = nodePath.join(logDir, \"desktop-bridge.log\");\n const logDiag = (msg: string): void => {\n try {\n if (!fileExists(logDir)) makeDir(logDir, { recursive: true });\n appendFileSync(logPath, `[${new Date().toISOString()}] ${msg}\\n`);\n } catch {\n // best-effort only — never let logging break the bridge\n }\n };\n logDiag(\n `serve start | homedir=${nodeOs.homedir()} | USERPROFILE=${\n process.env.USERPROFILE ?? \"\"\n } | HOME=${process.env.HOME ?? \"\"} | cwd=${process.cwd()}`,\n );\n\n // Configure exitOverride so commander doesn't process.exit on parsing errors\n bridgeCommand.exitOverride();\n for (const cmd of bridgeCommand.commands) {\n cmd.exitOverride();\n }\n\n // Prevent Commander from writing directly to stdout/stderr\n let outputBuffer = \"\";\n const outputOpts = {\n writeOut: (str: string) => {\n outputBuffer += str;\n },\n writeErr: (str: string) => {\n outputBuffer += str;\n },\n };\n bridgeCommand.configureOutput(outputOpts);\n for (const cmd of bridgeCommand.commands) {\n cmd.configureOutput(outputOpts);\n }\n\n const processRequest = async (line: string): Promise<string> => {\n outputBuffer = \"\";\n let requestId: string | number | null = null;\n try {\n const req = JSON.parse(line);\n requestId = req.id ?? null;\n const cmd = req.cmd;\n const args = req.args ?? [];\n\n if (typeof req.stdin === \"string\") {\n serveStdinPayload = req.stdin;\n } else if (typeof req.stdin === \"object\" && req.stdin !== null) {\n serveStdinPayload = JSON.stringify(req.stdin);\n } else {\n serveStdinPayload = undefined;\n }\n\n if (!cmd) {\n return JSON.stringify({\n id: requestId,\n error: \"Missing 'cmd' field\",\n });\n }\n\n const originalLog = console.log;\n const originalError = console.error;\n console.log = (...logArgs) => {\n outputBuffer += `${logArgs\n .map((a) => (typeof a === \"object\" ? JSON.stringify(a) : String(a)))\n .join(\" \")}\\n`;\n };\n console.error = (...logArgs) => {\n outputBuffer += `${logArgs\n .map((a) => (typeof a === \"object\" ? JSON.stringify(a) : String(a)))\n .join(\" \")}\\n`;\n };\n\n try {\n await bridgeCommand.parseAsync([\"node\", \"bridge\", cmd, ...args]);\n } catch (err) {\n if (err instanceof Error && err.message.startsWith('{\"error\":')) {\n try {\n const parsed = JSON.parse(err.message);\n return JSON.stringify({ id: requestId, error: parsed.error });\n } catch {\n return JSON.stringify({ id: requestId, error: err.message });\n }\n }\n if ((err as { code?: string }).code?.startsWith(\"commander.\")) {\n return JSON.stringify({\n id: requestId,\n error: outputBuffer.trim() || (err as Error).message,\n });\n }\n return JSON.stringify({\n id: requestId,\n error: (err as Error).message || String(err),\n });\n } finally {\n console.log = originalLog;\n console.error = originalError;\n }\n\n // Parse stdout accumulated output\n let result: unknown;\n const trimmed = outputBuffer.trim();\n try {\n result = JSON.parse(trimmed);\n } catch {\n result = trimmed;\n }\n\n return JSON.stringify({ id: requestId, result });\n } catch (err) {\n return JSON.stringify({\n id: requestId,\n error: `Invalid JSON request: ${(err as Error).message}`,\n });\n } finally {\n serveStdinPayload = undefined;\n }\n };\n\n const readline = await import(\"node:readline\");\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n terminal: false,\n });\n\n // Process requests strictly one at a time. processRequest() relies on a\n // shared output buffer and temporarily swaps the global console methods, so\n // overlapping executions would corrupt each other's responses. Chaining on\n // a single promise serialises them regardless of how fast lines arrive.\n let pending: Promise<void> = Promise.resolve();\n rl.on(\"line\", (line) => {\n if (!line.trim()) return;\n pending = pending.then(async () => {\n const response = await processRequest(line);\n process.stdout.write(`${response}\\n`);\n });\n });\n });\n","import dns from \"node:dns\";\nimport fs from \"node:fs\";\nimport type { Database } from \"../../kernel/index.js\";\nimport { extractTextFromScanViaLLM } from \"../llm/client.js\";\n\nconst MAX_SOURCE_BYTES = 2 * 1024 * 1024;\nconst MAX_REDIRECTS = 5;\n\nfunction isPrivateOrReservedIp(address: string): boolean {\n const ip = address.toLowerCase().split(\"%\", 1)[0];\n const mappedV4 = ip.match(/^::ffff:(\\d+\\.\\d+\\.\\d+\\.\\d+)$/)?.[1];\n const ipv4 = mappedV4 ?? (ip.includes(\".\") ? ip : null);\n if (ipv4) {\n const parts = ipv4.split(\".\").map(Number);\n if (\n parts.length !== 4 ||\n parts.some((part) => !Number.isInteger(part) || part < 0 || part > 255)\n ) {\n return true;\n }\n const [a, b] = parts;\n return (\n a === 0 ||\n a === 10 ||\n a === 127 ||\n (a === 100 && b >= 64 && b <= 127) ||\n (a === 169 && b === 254) ||\n (a === 172 && b >= 16 && b <= 31) ||\n (a === 192 && b === 168) ||\n (a === 192 && b === 0) ||\n (a === 192 && b === 0 && parts[2] === 2) ||\n (a === 198 && (b === 18 || b === 19 || b === 51)) ||\n (a === 203 && b === 0 && parts[2] === 113) ||\n a >= 224\n );\n }\n\n return (\n ip === \"::\" ||\n ip === \"::1\" ||\n ip.startsWith(\"fc\") ||\n ip.startsWith(\"fd\") ||\n /^fe[89ab]/.test(ip) ||\n ip.startsWith(\"ff\") ||\n ip.startsWith(\"2001:db8:\")\n );\n}\n\n/**\n * Clean up HTML contents by removing script, style, and svg tags,\n * then stripping outer tags and normalizing whitespace.\n */\nexport function cleanHtml(html: string): string {\n let text = html.replace(\n /<(head|script|style|svg)[^>]*>[\\s\\S]*?<\\/\\1>/gi,\n \" \",\n );\n text = text.replace(/<[^>]+>/g, \" \");\n text = text\n .replace(/ /g, \" \")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\");\n return text.replace(/\\s+/g, \" \").trim();\n}\n\n/**\n * Returns true if a URL is safe to fetch (http/https and not loopback or private range IPs).\n */\nexport async function isSafeUrl(urlString: string): Promise<boolean> {\n try {\n const url = new URL(urlString);\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n return false;\n }\n if (url.username || url.password) return false;\n const hostname = url.hostname.toLowerCase().replace(/\\.$/, \"\");\n if (hostname === \"localhost\" || hostname.endsWith(\".localhost\"))\n return false;\n\n const results = await dns.promises.lookup(hostname, {\n all: true,\n verbatim: true,\n });\n return (\n results.length > 0 &&\n results.every((result) => !isPrivateOrReservedIp(result.address))\n );\n } catch {\n return false;\n }\n}\n\n/**\n * Reads local textbook/class-note file.\n */\nexport async function readLocalFile(filepath: string): Promise<string> {\n if (!fs.existsSync(filepath)) {\n throw new Error(`File not found: ${filepath}`);\n }\n const stat = fs.statSync(filepath);\n if (!stat.isFile()) {\n throw new Error(`Not a file: ${filepath}`);\n }\n if (stat.size > MAX_SOURCE_BYTES) {\n throw new Error(\"File exceeds 2MB limit\");\n }\n return fs.readFileSync(filepath, \"utf-8\");\n}\n\n/**\n * Fetches and sanitizes web link content.\n */\nexport async function readWebLink(url: string): Promise<string> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 10000);\n\n try {\n let currentUrl = new URL(url);\n for (let redirects = 0; redirects <= MAX_REDIRECTS; redirects++) {\n if (!(await isSafeUrl(currentUrl.href))) {\n throw new Error(\n `Access denied to unsafe target URL: ${currentUrl.href}`,\n );\n }\n\n const res = await fetch(currentUrl, {\n redirect: \"manual\",\n signal: controller.signal,\n headers: {\n \"User-Agent\": \"ZAM-Content-Studio/0.9.0\",\n },\n });\n\n if (res.status >= 300 && res.status < 400) {\n const location = res.headers.get(\"location\");\n if (!location) {\n throw new Error(\"Web server returned a redirect without a location\");\n }\n if (redirects === MAX_REDIRECTS) {\n throw new Error(`Web request exceeded ${MAX_REDIRECTS} redirects`);\n }\n currentUrl = new URL(location, currentUrl);\n continue;\n }\n if (!res.ok) {\n throw new Error(`Web server responded with status ${res.status}`);\n }\n\n const contentType = res.headers.get(\"content-type\") || \"\";\n if (\n !contentType.includes(\"text/html\") &&\n !contentType.includes(\"text/plain\") &&\n !contentType.includes(\"application/xhtml+xml\") &&\n !contentType.includes(\"text/xml\")\n ) {\n throw new Error(`Unsupported content type: ${contentType}`);\n }\n const declaredLength = Number(res.headers.get(\"content-length\"));\n if (\n Number.isFinite(declaredLength) &&\n declaredLength > MAX_SOURCE_BYTES\n ) {\n throw new Error(\"Response body exceeds 2MB limit\");\n }\n\n const text = await readResponseBodyWithLimit(res, MAX_SOURCE_BYTES);\n if (\n contentType.includes(\"text/html\") ||\n contentType.includes(\"application/xhtml+xml\")\n ) {\n return cleanHtml(text);\n }\n return text;\n }\n throw new Error(\"Web request failed\");\n } catch (err: unknown) {\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new Error(\"Connection request timed out after 10 seconds\");\n }\n throw err;\n } finally {\n clearTimeout(timeoutId);\n }\n}\n\nasync function readResponseBodyWithLimit(\n response: Response,\n maxBytes: number,\n): Promise<string> {\n if (!response.body) return \"\";\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let totalBytes = 0;\n let text = \"\";\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n totalBytes += value.byteLength;\n if (totalBytes > maxBytes) {\n await reader.cancel();\n throw new Error(\"Response body exceeds 2MB limit\");\n }\n text += decoder.decode(value, { stream: true });\n }\n return text + decoder.decode();\n}\n\n/**\n * Extracts text from scan file using vision OCR.\n */\nexport async function readImageOCR(\n db: Database,\n imagePath: string,\n): Promise<string> {\n return extractTextFromScanViaLLM(db, imagePath);\n}\n","/**\n * Local LLM client — CLI/harness layer.\n *\n * This module talks to a user-run, OpenAI-compatible local LLM server\n * (FastFlowLM `flm serve`, Ollama, LM Studio, …). It deliberately lives in the\n * CLI layer, NOT the kernel: the kernel is AI-agnostic and carries zero LLM\n * dependencies (see CLAUDE.md). Everything that does HTTP, spawns runner\n * processes, prints to the terminal, or prompts interactively belongs here.\n *\n * Config is read from kernel settings via a single `getLlmConfig` helper so the\n * default model lives in exactly one place (it changes every few weeks as local\n * models improve).\n */\n\nimport { spawn } from \"node:child_process\";\nimport { existsSync, readFileSync, statSync } from \"node:fs\";\nimport type { Database, SupportedLocale } from \"../../kernel/index.js\";\nimport {\n getActiveWorkspaceContext,\n getKnowledgeContextByName,\n getMachineAiConfig,\n getProviderApiKey,\n getSetting,\n getSystemProfile,\n hasCommand,\n normalizeLocale,\n resolveReviewContext,\n t,\n updateToken,\n} from \"../../kernel/index.js\";\n\n/** Single source of truth for connection defaults (easy to bump as models evolve). */\nexport const DEFAULT_LLM_URL = \"http://localhost:8000/v1\";\n\n/** Default completion budget for open-ended tasks (vision, translation, …). */\nexport const DEFAULT_LLM_MAX_TOKENS = 10_000;\n\n/** Tight output caps for recall — short questions/evaluations, faster round-trips. */\nexport const RECALL_QUESTION_MAX_OUTPUT_TOKENS = 400;\nexport const RECALL_EVALUATION_MAX_OUTPUT_TOKENS = 1200;\n\nconst RECALL_ENDPOINT_CACHE_MS = 60_000;\nlet cachedRecallEndpoint: {\n endpoint: ProviderConfig;\n signature: string;\n expiresAt: number;\n} | null = null;\n\n/** Clear the in-process recall-endpoint cache (used by tests and explicit resets). */\nexport function clearRecallEndpointCache(): void {\n cachedRecallEndpoint = null;\n}\n\n/**\n * Compact fingerprint of the resolved recall provider. When any of these change\n * — a role rebind, a provider url/model/flavor edit, or an enable toggle — the\n * cached endpoint is treated as stale even within its TTL, so a configuration\n * change in Studio takes effect on the next card instead of after up to\n * RECALL_ENDPOINT_CACHE_MS.\n */\nfunction recallEndpointSignature(cfg: ProviderConfig): string {\n return [\n cfg.enabled ? \"on\" : \"off\",\n cfg.providerName ?? \"\",\n cfg.url,\n cfg.model,\n cfg.apiFlavor,\n cfg.fallback?.url ?? \"\",\n cfg.fallback?.model ?? \"\",\n ].join(\"|\");\n}\nexport const DEFAULT_LLM_MODEL = \"qwen3.5:4b\";\nexport const DEFAULT_LLM_API_KEY = \"sk-none\";\n\nexport interface LlmConfig {\n enabled: boolean;\n url: string;\n model: string;\n apiKey: string;\n locale: SupportedLocale;\n maxFrames?: number;\n}\n\n/** Read all LLM-related settings at once, applying defaults in one place. */\nexport async function getLlmConfig(db: Database): Promise<LlmConfig> {\n return {\n enabled: (await getSetting(db, \"llm.enabled\")) === \"true\",\n url: (await getSetting(db, \"llm.url\")) || DEFAULT_LLM_URL,\n model: (await getSetting(db, \"llm.model\")) || DEFAULT_LLM_MODEL,\n apiKey: (await getSetting(db, \"llm.api_key\")) || DEFAULT_LLM_API_KEY,\n locale: ((await getSetting(db, \"system.locale\")) ||\n \"en\") as SupportedLocale,\n };\n}\n\n/**\n * Vision/UI-observer model settings, kept separate from the text-chat config.\n *\n * The default text model (e.g. a local German chat model) cannot interpret\n * images, so screen snapshots must target a deliberately chosen multimodal\n * endpoint. `llm.vision.enabled` is therefore an explicit, default-off opt-in:\n * it doubles as the consent gate for sending captured screen content to a\n * provider. `url`/`model`/`apiKey` fall back to the base `llm.*` config so a\n * single multimodal endpoint only needs `llm.vision.enabled=true`.\n */\nexport type ApiFlavor = \"chat-completions\" | \"anthropic-messages\";\n\nexport interface CloudModelRecommendation {\n model: string;\n flavor: ApiFlavor;\n}\n\n/** Suggests a cheap/appropriate cloud model and API flavor based on the endpoint URL. */\nexport function getCloudModelRecommendation(\n url: string,\n): CloudModelRecommendation | null {\n const lowercase = url.toLowerCase();\n if (lowercase.includes(\"openrouter.ai\")) {\n return { model: \"openrouter/free\", flavor: \"chat-completions\" };\n }\n if (lowercase.includes(\"openai.com\") || lowercase.includes(\"api.openai\")) {\n return { model: \"gpt-5-mini\", flavor: \"chat-completions\" };\n }\n if (lowercase.includes(\"googleapis.com\") || lowercase.includes(\"google\")) {\n return { model: \"gemini-3.5-flash\", flavor: \"chat-completions\" };\n }\n if (lowercase.includes(\"deepseek.com\")) {\n return { model: \"deepseek-v4-flash\", flavor: \"chat-completions\" };\n }\n if (lowercase.includes(\"mimo\")) {\n return { model: \"mimo-v2.5\", flavor: \"chat-completions\" };\n }\n if (lowercase.includes(\"anthropic.com\")) {\n return {\n model: \"claude-haiku-4-5-20251001\",\n flavor: \"anthropic-messages\",\n };\n }\n return null;\n}\n\n// ── Role-based provider resolution (ADR 2026-06-23) ──────────────────────────\n\nexport type LlmRole = \"vision\" | \"recall\" | \"text\" | \"embedding\";\n\n/** A resolved endpoint for one role, with an optional fallback to try next. */\nexport interface ProviderConfig {\n enabled: boolean;\n url: string;\n model: string;\n apiKey: string;\n apiFlavor: ApiFlavor;\n locale: SupportedLocale;\n providerName?: string;\n label?: string;\n source: \"legacy\" | \"shared\" | \"machine\";\n local: boolean;\n /** Optional hint for which local server process to auto-start (flm, ollama, …). */\n runner?: string;\n /** Vision only: max frames to sample from a recording. */\n maxFrames?: number;\n /** Optional next endpoint to try when the primary is unusable. */\n fallback?: ProviderConfig;\n}\n\n/** Infer the wire protocol from the endpoint host (anthropic.com → Messages API). */\nexport function inferApiFlavor(url: string): ApiFlavor {\n try {\n return new URL(url).hostname.toLowerCase().endsWith(\"anthropic.com\")\n ? \"anthropic-messages\"\n : \"chat-completions\";\n } catch {\n return \"chat-completions\";\n }\n}\n\ninterface ProviderRecord {\n label?: string;\n url?: string;\n model?: string;\n apiFlavor?: ApiFlavor;\n apiKey?: string;\n apiKeyRef?: string;\n local?: boolean;\n runner?: string;\n}\ntype ProvidersMap = Record<string, ProviderRecord>;\ninterface RoleBinding {\n primary?: string;\n fallback?: string;\n}\ntype RolesMap = Partial<Record<LlmRole, RoleBinding>>;\n\nasync function readJsonSetting<T>(\n db: Database,\n key: string,\n): Promise<T | null> {\n const raw = await getSetting(db, key);\n if (!raw) return null;\n try {\n return JSON.parse(raw) as T;\n } catch {\n return null;\n }\n}\n\nfunction resolveProviderApiKey(rec: ProviderRecord): string {\n if (rec.apiKey) return rec.apiKey;\n if (rec.apiKeyRef) {\n const key = getProviderApiKey(rec.apiKeyRef);\n if (key) return key;\n }\n return DEFAULT_LLM_API_KEY;\n}\n\n/**\n * Resolve the configured provider for a role.\n *\n * New-style config: JSON `llm.providers` (named endpoint records) + `llm.roles`\n * (role → {primary, fallback}). When either is absent, falls back to the legacy\n * `llm.*` / `llm.vision.*` keys, so existing installs behave identically.\n *\n * Enablement stays on the existing gates — `llm.enabled` for recall/text,\n * `llm.vision.enabled` for vision — so the vision consent/privacy semantics are\n * preserved regardless of how providers are wired.\n */\nexport async function getProviderForRole(\n db: Database,\n role: LlmRole,\n): Promise<ProviderConfig> {\n const enabled =\n role === \"vision\"\n ? (await getSetting(db, \"llm.vision.enabled\")) === \"true\"\n : (await getSetting(db, \"llm.enabled\")) === \"true\";\n\n const base = await getLegacyRoleConfig(db, role, enabled);\n\n const providers = await readJsonSetting<ProvidersMap>(db, \"llm.providers\");\n const roles = await readJsonSetting<RolesMap>(db, \"llm.roles\");\n const binding = roles?.[role];\n\n let resolved = base;\n if (providers && binding?.primary && providers[binding.primary]) {\n const primary = materializeProvider(\n providers[binding.primary],\n base,\n role,\n {\n providerName: binding.primary,\n source: \"shared\",\n },\n );\n const fallback =\n binding.fallback && providers[binding.fallback]\n ? materializeProvider(providers[binding.fallback], base, role, {\n providerName: binding.fallback,\n source: \"shared\",\n })\n : undefined;\n resolved = { ...primary, fallback };\n }\n\n const machine = getMachineAiConfig();\n const machineProviders = machine.providers as ProvidersMap | undefined;\n const machineBinding = machine.roles?.[role];\n if (\n machineProviders &&\n machineBinding?.primary &&\n machineProviders[machineBinding.primary]\n ) {\n const primary = materializeProvider(\n machineProviders[machineBinding.primary],\n resolved,\n role,\n { providerName: machineBinding.primary, source: \"machine\" },\n );\n const fallback =\n machineBinding.fallback && machineProviders[machineBinding.fallback]\n ? materializeProvider(\n machineProviders[machineBinding.fallback],\n resolved,\n role,\n { providerName: machineBinding.fallback, source: \"machine\" },\n )\n : undefined;\n return { ...primary, fallback };\n }\n\n return resolved;\n}\n\nfunction materializeProvider(\n rec: ProviderRecord,\n base: ProviderConfig,\n role: LlmRole,\n meta: {\n providerName: string;\n source: ProviderConfig[\"source\"];\n },\n): ProviderConfig {\n const url = rec.url || base.url;\n return {\n enabled: base.enabled,\n url,\n model: rec.model || base.model,\n apiKey: resolveProviderApiKey(rec),\n apiFlavor: rec.apiFlavor || inferApiFlavor(url),\n locale: base.locale,\n providerName: meta.providerName,\n label: rec.label,\n source: meta.source,\n local: rec.local ?? isLocalEndpoint(url),\n ...(rec.runner ? { runner: rec.runner } : {}),\n ...(role === \"vision\" ? { maxFrames: base.maxFrames } : {}),\n };\n}\n\n/** Legacy `llm.*` / `llm.vision.*` resolution — the back-compat default. */\nasync function getLegacyRoleConfig(\n db: Database,\n role: LlmRole,\n enabled: boolean,\n): Promise<ProviderConfig> {\n const base = await getLlmConfig(db);\n\n if (role === \"vision\") {\n const maxFramesStr = await getSetting(db, \"llm.vision.max_frames\");\n const parsed = maxFramesStr ? parseInt(maxFramesStr, 10) : 100;\n const url = (await getSetting(db, \"llm.vision.url\")) || base.url;\n const recommendation = getCloudModelRecommendation(url);\n let model = await getSetting(db, \"llm.vision.model\");\n if (!model) model = recommendation?.model || base.model;\n return {\n enabled,\n url,\n model,\n apiKey: (await getSetting(db, \"llm.vision.api_key\")) || base.apiKey,\n apiFlavor: recommendation?.flavor || inferApiFlavor(url),\n locale: base.locale,\n source: \"legacy\",\n local: isLocalEndpoint(url),\n maxFrames: Number.isNaN(parsed) ? 100 : parsed,\n };\n }\n\n if (role === \"embedding\") {\n const url = (await getSetting(db, \"llm.embedding.url\")) || base.url;\n return {\n enabled,\n url,\n // Kept as a literal (not imported) to avoid a client.ts <-> embedder.ts\n // import cycle; must match DEFAULT_EMBEDDING_MODEL in embedder.ts.\n model: (await getSetting(db, \"llm.embedding.model\")) || \"embeddinggemma\",\n apiKey: (await getSetting(db, \"llm.embedding.api_key\")) || base.apiKey,\n apiFlavor: inferApiFlavor(url),\n locale: base.locale,\n source: \"legacy\",\n local: isLocalEndpoint(url),\n };\n }\n\n // recall / text both map to the base text endpoint today.\n return {\n enabled,\n url: base.url,\n model: base.model,\n apiKey: base.apiKey,\n apiFlavor: inferApiFlavor(base.url),\n locale: base.locale,\n source: \"legacy\",\n local: isLocalEndpoint(base.url),\n };\n}\n\n/** Guard for paths that only speak chat-completions (recall text today). */\nfunction assertChatCompletions(cfg: ProviderConfig): void {\n if (cfg.apiFlavor !== \"chat-completions\") {\n throw new Error(\n `This role is configured for a \"${cfg.apiFlavor}\" provider, which is not ` +\n `supported here yet. Use a chat-completions provider for this role.`,\n );\n }\n}\n\n/**\n * Vision/UI-observer config in the legacy `LlmConfig` shape, for callers that\n * don't need flavor/fallback (e.g. `checkVisionReadiness`). Delegates to\n * {@link getProviderForRole} so the role config stays the single source.\n */\nexport async function getVisionConfig(db: Database): Promise<LlmConfig> {\n const p = await getProviderForRole(db, \"vision\");\n return {\n enabled: p.enabled,\n url: p.url,\n model: p.model,\n apiKey: p.apiKey,\n locale: p.locale,\n maxFrames: p.maxFrames,\n };\n}\n\nconst LANGUAGE_NAMES: Record<SupportedLocale, string> = {\n en: \"English\",\n de: \"German\",\n es: \"Spanish\",\n fr: \"French\",\n pt: \"Portuguese\",\n zh: \"Chinese\",\n ja: \"Japanese\",\n};\n\nconst LOCALIZED_RATING_PREFIX: Record<SupportedLocale, string> = {\n en: \"Suggested rating\",\n de: \"Empfohlene Bewertung\",\n es: \"Calificación sugerida\",\n fr: \"Note suggérée\",\n pt: \"Avaliação sugerida\",\n zh: \"建议评分\",\n ja: \"推奨評価\",\n};\n\nconst BLOOM_VERBS = {\n 1: \"Remember\",\n 2: \"Understand\",\n 3: \"Apply\",\n 4: \"Analyze\",\n 5: \"Synthesize\",\n} as const;\n\ninterface ChatCompletionResponse {\n choices?: Array<{\n message?: { content?: string };\n finish_reason?: string;\n }>;\n}\n\n/**\n * Thrown when a chat completion hits its token/context limit before producing\n * usable content. Distinguished from a generic empty/malformed response so\n * callers with a resizable input (e.g. curriculum import) can retry with a\n * smaller prompt instead of failing outright.\n */\nexport class LlmResponseTruncatedError extends Error {\n constructor(label: string) {\n super(\n `${label}: the model's response was cut off before producing usable output (finish_reason=length). ` +\n \"The prompt likely left no room in the model's context window for a reply.\",\n );\n this.name = \"LlmResponseTruncatedError\";\n }\n}\n\n/** Extract the assistant message content from an OpenAI-compatible response. */\nasync function readChatContent(res: Response, label: string): Promise<string> {\n if (!res.ok) {\n const errorText = await res.text().catch(() => \"\");\n throw new Error(\n `${label} failed: ${res.statusText} (${res.status}) - ${errorText}`,\n );\n }\n const data = (await res.json()) as ChatCompletionResponse;\n const choice = data.choices?.[0];\n const content = choice?.message?.content;\n const trimmed = content?.trim() ?? \"\";\n // `finish_reason=length` means the completion hit the context window before\n // the model finished on its own. Observed in practice both as an\n // immediate near-empty reply (no room to start) and as a long-but-cut-off\n // reply (started generating an array of cards, ran out of room before\n // closing it) -- neither is safe to hand to a JSON parser.\n if (choice?.finish_reason === \"length\") {\n throw new LlmResponseTruncatedError(label);\n }\n if (!trimmed) {\n throw new Error(\"Empty response from LLM\");\n }\n return trimmed;\n}\n\n/**\n * Generate a high-quality, concept-free active-recall question using the local LLM.\n */\nexport async function generateQuestionViaLLM(\n db: Database,\n input: {\n slug: string;\n concept: string;\n domain: string;\n bloomLevel: number;\n context?: string;\n sourceLinkContent?: string | null;\n },\n): Promise<LlmTextResult> {\n const cfg = await getProviderForRole(db, \"recall\");\n const endpoint = await resolveUsableRecallEndpoint(db);\n\n const bloom = (\n input.bloomLevel >= 1 && input.bloomLevel <= 5 ? input.bloomLevel : 1\n ) as keyof typeof BLOOM_VERBS;\n const verb = BLOOM_VERBS[bloom];\n\n const langName = LANGUAGE_NAMES[cfg.locale] || \"English\";\n\n const systemPrompt = `You are ZAM, a highly precise agentic skills trainer.\nYour task is to generate a single, clear, conceptual active-recall question (flashcard front) in ${langName} for a knowledge token.\n\nGuidelines:\n1. The question MUST match the Bloom level: ${verb} (Level ${bloom}).\n2. CRITICAL: The question MUST NOT contain or reveal the concept text itself! The concept is the answer (flashcard back) that the learner needs to recall.\n3. Keep the question concise, highly specific, and clear. Avoid generic prompts like \"What is the concept of...\" if possible, and ask about the core mechanism, function, or purpose of the slug/concept without giving the answer away.\n4. Output ONLY the raw question text in ${langName}. Do not include any preamble, headers, markdown fences, or conversational filler.`;\n\n const userPrompt = `Domain: ${input.domain}\nSlug: ${input.slug}\nConcept to Recall (DO NOT REVEAL IN QUESTION): ${input.concept}\nContext: ${input.context || \"(none)\"}\n${input.sourceLinkContent ? `Source Reference:\\n${input.sourceLinkContent}` : \"\"}\n\nActive-Recall Question:`;\n\n const res = await fetchWithInteractiveTimeout(\n `${endpoint.url}/chat/completions`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${endpoint.apiKey}`,\n },\n body: JSON.stringify({\n model: endpoint.model,\n messages: [\n { role: \"system\", content: systemPrompt },\n { role: \"user\", content: userPrompt },\n ],\n temperature: 0.1,\n max_tokens: RECALL_QUESTION_MAX_OUTPUT_TOKENS,\n }),\n locale: cfg.locale,\n },\n );\n\n const text = await readChatContent(res, \"LLM request\");\n return {\n text,\n model: endpoint.model,\n providerName: endpoint.providerName,\n };\n}\n\n/**\n * Warmly evaluate the learner's active-recall answer against the target concept.\n * Suggests an FSRS rating (1-4) and explains in the active locale with praise/motivation.\n */\nexport async function evaluateAnswerViaLLM(\n db: Database,\n input: {\n slug: string;\n concept: string;\n domain: string;\n bloomLevel: number;\n context?: string;\n question: string;\n userAnswer: string;\n sourceLinkContent?: string | null;\n },\n): Promise<LlmTextResult> {\n const cfg = await getProviderForRole(db, \"recall\");\n const endpoint = await resolveUsableRecallEndpoint(db);\n const langName = LANGUAGE_NAMES[cfg.locale] || \"English\";\n const ratingPrefix =\n LOCALIZED_RATING_PREFIX[cfg.locale] || \"Suggested rating\";\n\n const systemPrompt = `You are ZAM, an extremely warm, encouraging, and patient skills trainer.\nYour mission is to build lasting autonomy through conceptual knowledge, not rote procedure.\nCompare the learner's active-recall answer against the target concept, context, and optional source code.\n\nFSRS Rating scale:\n- 1: drew a blank / completely forgot or wrong (Again)\n- 2: hard recall / partially correct (Hard)\n- 3: knew it / mostly correct (Good)\n- 4: perfect, instant, and accurate recall (Easy)\n\nGuidelines:\n1. Provide a constructive, encouraging evaluation in ${langName} (2-3 sentences) to promote the joy of learning. Seamlessly weave a brief explanation of the correct solution (target concept) into your feedback paragraphs. Do NOT append a separate, duplicate reference answer or raw \"Musterlösung\" block at the end of your response.\n2. Celebrate every honest attempt! Offer high praise or a motivating word of encouragement in ${langName} if they did well or tried hard.\n3. CRITICAL: ZAM is a strict one-shot card flow, NOT an interactive chat. The correct Musterlösung (reference answer) is revealed alongside your feedback. Therefore, NEVER ask the user to think further, keep guessing, or suggest they try to solve the remaining parts of the question. Instead, immediately evaluate what they wrote, explain the complete solution and target concept directly.\n4. Suggest a clear FSRS rating (1 to 4) at the very end of your response in the exact format: \"${ratingPrefix}: X\" in ${langName}.\n5. Output ONLY the evaluation and rating suggestion. Keep it concise, friendly, and clean. No conversational introduction or markdown wrapper.`;\n\n const userPrompt = `Domain: ${input.domain}\nSlug: ${input.slug}\nRecall Question: ${input.question}\nLearner's Answer: ${input.userAnswer}\n\nTarget Concept (Correct Answer): ${input.concept}\nTarget Context: ${input.context || \"(none)\"}\n${input.sourceLinkContent ? `Source Code Reference:\\n${input.sourceLinkContent}` : \"\"}\n\nEvaluation:`;\n\n const res = await fetchWithInteractiveTimeout(\n `${endpoint.url}/chat/completions`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${endpoint.apiKey}`,\n },\n body: JSON.stringify({\n model: endpoint.model,\n messages: [\n { role: \"system\", content: systemPrompt },\n { role: \"user\", content: userPrompt },\n ],\n temperature: 0.2,\n max_tokens: RECALL_EVALUATION_MAX_OUTPUT_TOKENS,\n }),\n locale: cfg.locale,\n },\n );\n\n const text = await readChatContent(res, \"LLM evaluation\");\n return {\n text,\n model: endpoint.model,\n providerName: endpoint.providerName,\n };\n}\n\nexport interface GeneratedCardProposal {\n question: string;\n concept: string;\n title?: string; // human-friendly display title for knowledge graph (no domain, Unicode ok)\n domain: string;\n context: string;\n bloom_level: number;\n symbiosis_mode: \"shadowing\" | \"copilot\" | \"autonomy\";\n source_link: string | null;\n}\n\nconst MAX_IMPORT_TEXT_CHARS = 200_000;\nconst VALID_GENERATED_MODES = new Set([\"shadowing\", \"copilot\", \"autonomy\"]);\n\nfunction parseGeneratedCardArray(\n responseText: string,\n label: string,\n limits: { min: number; max: number },\n): GeneratedCardProposal[] {\n const startIdx = responseText.indexOf(\"[\");\n const endIdx = responseText.lastIndexOf(\"]\");\n if (startIdx === -1 || endIdx === -1 || startIdx > endIdx) {\n throw new Error(`Invalid ${label} response: JSON array brackets not found`);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(responseText.substring(startIdx, endIdx + 1));\n } catch {\n throw new Error(`Invalid ${label} response: malformed JSON`);\n }\n if (!Array.isArray(parsed)) {\n throw new Error(`Invalid ${label} response: expected a JSON array`);\n }\n if (parsed.length < limits.min || parsed.length > limits.max) {\n throw new Error(\n `Invalid ${label} response: expected ${limits.min}-${limits.max} cards, got ${parsed.length}`,\n );\n }\n\n return parsed.map((value, index) => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(\n `Invalid ${label} card at index ${index}: expected an object`,\n );\n }\n const card = value as Record<string, unknown>;\n for (const field of [\"question\", \"concept\", \"domain\", \"context\"] as const) {\n if (typeof card[field] !== \"string\" || card[field].trim().length === 0) {\n throw new Error(\n `Invalid ${label} card at index ${index}: ${field} must be a non-empty string`,\n );\n }\n }\n if (\n card.title !== undefined &&\n (typeof card.title !== \"string\" || card.title.trim().length === 0)\n ) {\n throw new Error(\n `Invalid ${label} card at index ${index}: title must be a non-empty string if provided`,\n );\n }\n if (\n typeof card.bloom_level !== \"number\" ||\n !Number.isInteger(card.bloom_level) ||\n card.bloom_level < 1 ||\n card.bloom_level > 5\n ) {\n throw new Error(\n `Invalid ${label} card at index ${index}: bloom_level must be an integer from 1 to 5`,\n );\n }\n if (\n typeof card.symbiosis_mode !== \"string\" ||\n !VALID_GENERATED_MODES.has(card.symbiosis_mode)\n ) {\n throw new Error(\n `Invalid ${label} card at index ${index}: invalid symbiosis_mode`,\n );\n }\n\n return {\n question: card.question as string,\n concept: card.concept as string,\n title: card.title ? (card.title as string) : undefined,\n domain: card.domain as string,\n context: card.context as string,\n bloom_level: card.bloom_level,\n symbiosis_mode:\n card.symbiosis_mode as GeneratedCardProposal[\"symbiosis_mode\"],\n source_link: null,\n };\n });\n}\n\n/**\n * Chunk size used after a model reports context-window exhaustion. A 3,000\n * character chunk leaves enough response headroom for the common 4,096-token\n * local-model default while still preserving the complete curriculum: every\n * chunk is processed and the proposals are combined, never just the prefix.\n */\nconst CURRICULUM_CHUNK_TEXT_CHARS = 3_000;\n\nfunction splitCurriculumText(text: string, maxChars: number): string[] {\n if (text.length <= maxChars) return [text];\n\n const chunks: string[] = [];\n let start = 0;\n while (start < text.length) {\n let end = Math.min(start + maxChars, text.length);\n if (end < text.length) {\n const minimumBoundary = start + Math.floor(maxChars * 0.6);\n const sentenceWindow = text.slice(minimumBoundary, end);\n let sentenceBoundary = -1;\n for (const match of sentenceWindow.matchAll(/[.!?;:]\\s+/g)) {\n sentenceBoundary = (match.index ?? 0) + match[0].length;\n }\n if (sentenceBoundary > 0) {\n end = minimumBoundary + sentenceBoundary;\n } else {\n const whitespaceBoundary = text.lastIndexOf(\" \", end);\n if (whitespaceBoundary >= minimumBoundary) end = whitespaceBoundary + 1;\n }\n }\n chunks.push(text.slice(start, end));\n start = end;\n }\n return chunks;\n}\n\nfunction deduplicateGeneratedCards(\n cards: GeneratedCardProposal[],\n): GeneratedCardProposal[] {\n const seen = new Set<string>();\n return cards.filter((card) => {\n const key = `${card.question.trim().toLocaleLowerCase()}\\u0000${card.concept\n .trim()\n .toLocaleLowerCase()}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n\nasync function requestCurriculumCards(\n endpoint: { url: string; model: string; apiKey?: string },\n locale: SupportedLocale,\n langName: string,\n curriculumText: string,\n targetCategory: string,\n sourceUrl: string | null | undefined,\n): Promise<string> {\n const systemPrompt = `You are ZAM, a highly precise agentic curriculum parser.\nYour task is to analyze curriculum objectives, syllabus requirements, or textbook notes, and extract atomic facts, concepts, or skills as structured learning cards in ${langName}.\n\nFor each extracted learning card, you MUST generate:\n1. \"question\": A clear, concise active-recall question testing the concept. The question must not reveal the answer itself.\n2. \"concept\": The reference answer, core fact, or target conceptual explanation.\n3. \"title\": A short, human-friendly title for the knowledge graph node. Concise name for the concept. No domain prefix. Human-readable, natural language. Support Unicode (umlauts, Chinese, Japanese, Arabic, etc.). Name the core idea as well as possible.\n4. \"domain\": The category of the card. Use \"${targetCategory}\" as the default, but you may refine it if a specific sub-topic is evident.\n5. \"context\": The exact sentence or short excerpt from the source text that this card is based on.\n6. \"bloom_level\": Initial Bloom cognitive level (1 = Remember, 2 = Understand, 3 = Apply, 4 = Analyze, 5 = Synthesize).\n7. \"symbiosis_mode\": ZAM agent symbiosis level: \"shadowing\" (reading/monitoring), \"copilot\" (interactive helper), or \"autonomy\" (autonomous tasks).\n\nGuidelines:\n- Break complex requirements into multiple separate, atomic cards.\n- Keep questions focused on one fact.\n- Do not repeat the same concept in multiple cards.\n- Test the subject matter directly. Never ask what learners \"must know\", what\n a curriculum \"requires\", or merely restate a competency as a question.\n- Stay within the scope of the supplied curriculum. A reference answer may add\n the definition, formula, or minimal worked example needed to answer a direct\n subject-matter question, but it must not introduce named methods, terminology,\n or adjacent topics that the curriculum passage does not mention.\n- Keep every reference answer concise, mathematically/factually correct, and\n focused on the competency being tested.\n- Set \"context\" to the exact sentence or bullet that supports that specific\n card. Never reuse an unrelated passage merely because it comes from the same\n curriculum section.\n- Output ONLY a raw valid JSON array of objects. Do NOT wrap the JSON in markdown code blocks, HTML, or include any preamble, headers, or conversational filler.`;\n\n const userPrompt = `Curriculum Text to Parse:\n${curriculumText}\n\nTarget Category: ${targetCategory}\n${sourceUrl ? `Source Reference Link: ${sourceUrl}` : \"\"}\n\nJSON Array Output:`;\n\n const res = await fetchWithInteractiveTimeout(\n `${endpoint.url}/chat/completions`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${endpoint.apiKey}`,\n },\n body: JSON.stringify({\n model: endpoint.model,\n messages: [\n { role: \"system\", content: systemPrompt },\n { role: \"user\", content: userPrompt },\n ],\n temperature: 0.1,\n max_tokens: DEFAULT_LLM_MAX_TOKENS,\n }),\n locale,\n },\n );\n\n return readChatContent(res, \"LLM curriculum import\");\n}\n\n/**\n * Parse curriculum text and generate structured flashcard JSON data via LLM.\n *\n * A long curriculum text can exhaust a small local model's context window\n * before it produces a complete reply (seen in practice with a 4096-token\n * Ollama default and a ~17,000-character fetched page): sometimes there is no\n * room left to start (a stray \"[\" and nothing else), sometimes the model\n * spends its whole remaining budget enumerating cards without ever closing\n * the array. Either way `finish_reason=length` means the content is not\n * trustworthy JSON. Retrying the complete source as bounded chunks turns that\n * hard failure into a series of safe requests without silently discarding the\n * latter part of the authoritative curriculum.\n */\nexport async function importCurriculumViaLLM(\n db: Database,\n text: string,\n targetCategory: string,\n sourceUrl?: string | null,\n options?: { knowledgeContext?: string },\n): Promise<GeneratedCardProposal[]> {\n if (text.length > MAX_IMPORT_TEXT_CHARS) {\n throw new Error(\n `Curriculum text exceeds the ${MAX_IMPORT_TEXT_CHARS.toLocaleString()} character limit`,\n );\n }\n const cfg = await getProviderForRole(db, \"text\");\n let locale = cfg.locale;\n const contextName = options?.knowledgeContext || getActiveWorkspaceContext();\n if (contextName) {\n const context = await getKnowledgeContextByName(db, contextName);\n if (context?.language) {\n locale = normalizeLocale(context.language) as SupportedLocale;\n }\n }\n\n const endpoint = await resolveUsableTextEndpoint(db);\n const langName = LANGUAGE_NAMES[locale] || \"English\";\n\n let responseText: string;\n try {\n responseText = await requestCurriculumCards(\n endpoint,\n locale,\n langName,\n text,\n targetCategory,\n sourceUrl,\n );\n } catch (err) {\n if (\n !(err instanceof LlmResponseTruncatedError) ||\n text.length <= CURRICULUM_CHUNK_TEXT_CHARS\n ) {\n throw err;\n }\n\n const chunks = splitCurriculumText(text, CURRICULUM_CHUNK_TEXT_CHARS);\n const cards: GeneratedCardProposal[] = [];\n for (const [index, chunk] of chunks.entries()) {\n let chunkResponse: string;\n try {\n chunkResponse = await requestCurriculumCards(\n endpoint,\n locale,\n langName,\n chunk,\n targetCategory,\n sourceUrl,\n );\n } catch (chunkError) {\n if (chunkError instanceof LlmResponseTruncatedError) {\n throw new Error(\n `Curriculum chunk ${index + 1} of ${chunks.length} is still too large for ` +\n \"the configured model's context window. Configure a model with a larger \" +\n \"context window, or import a smaller source.\",\n );\n }\n throw chunkError;\n }\n cards.push(\n ...parseGeneratedCardArray(chunkResponse, \"curriculum import\", {\n min: 0,\n max: 200,\n }),\n );\n }\n\n const deduplicated = deduplicateGeneratedCards(cards);\n if (deduplicated.length > 200) {\n throw new Error(\n `Invalid curriculum import response: expected 0-200 cards, got ${deduplicated.length}`,\n );\n }\n return deduplicated.map((card) => ({\n ...card,\n source_link: sourceUrl || null,\n }));\n }\n\n return parseGeneratedCardArray(responseText, \"curriculum import\", {\n min: 0,\n max: 200,\n }).map((card) => ({ ...card, source_link: sourceUrl || null }));\n}\n\n/**\n * Generate 2 to 4 atomic proposal cards by splitting a broad card.\n */\nexport async function generateSplitProposalsViaLLM(\n db: Database,\n token: {\n question: string | null;\n concept: string;\n domain: string;\n context: string;\n source_link: string | null;\n },\n): Promise<GeneratedCardProposal[]> {\n const cfg = await getProviderForRole(db, \"text\");\n const endpoint = await resolveUsableTextEndpoint(db);\n const langName = LANGUAGE_NAMES[cfg.locale] || \"English\";\n\n const systemPrompt = `You are ZAM, a highly precise agentic learning assistant.\nYour task is to analyze a learning card that is too broad or covers multiple ideas, and split it into 2 to 4 atomic, focused proposal cards in ${langName}.\n\nThe input card details are:\n- Question: ${token.question || \"N/A\"}\n- Core Concept: ${token.concept}\n- Domain: ${token.domain}\n- Excerpt Context: ${token.context || \"N/A\"}\n\nFor each split proposal card, you MUST generate:\n1. \"question\": A clear, concise active-recall question testing a single focused fact or concept. The question must not reveal the answer itself.\n2. \"concept\": The reference answer or core fact.\n3. \"domain\": The category of the card (default to \"${token.domain}\").\n4. \"context\": The context excerpt from the original card's context or a derivation of it.\n5. \"bloom_level\": Bloom taxonomy level (1 to 5).\n6. \"symbiosis_mode\": Symbiosis mode (\"shadowing\", \"copilot\", or \"autonomy\").\n\nGuidelines:\n- Make sure each card is completely atomic (covers exactly one concept).\n- Do not repeat the same concept across cards.\n- Output ONLY a raw valid JSON array of objects. Do NOT wrap the JSON in markdown code blocks, HTML, or include any conversational filler.`;\n\n const userPrompt = `Split the broad card details above into 2 to 4 atomic cards.\n\nJSON Array Output:`;\n\n const res = await fetchWithInteractiveTimeout(\n `${endpoint.url}/chat/completions`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${endpoint.apiKey}`,\n },\n body: JSON.stringify({\n model: endpoint.model,\n messages: [\n { role: \"system\", content: systemPrompt },\n { role: \"user\", content: userPrompt },\n ],\n temperature: 0.2,\n max_tokens: DEFAULT_LLM_MAX_TOKENS,\n }),\n locale: cfg.locale,\n },\n );\n\n const responseText = await readChatContent(res, \"LLM card split proposals\");\n\n return parseGeneratedCardArray(responseText, \"card split\", {\n min: 2,\n max: 4,\n }).map((card) => ({ ...card, source_link: token.source_link || null }));\n}\n\n/**\n * Generate 2 to 4 prerequisite suggestions for a card.\n */\nexport async function generateFoundationsProposalsViaLLM(\n db: Database,\n token: {\n question: string | null;\n concept: string;\n domain: string;\n context: string;\n source_link: string | null;\n },\n): Promise<GeneratedCardProposal[]> {\n const cfg = await getProviderForRole(db, \"text\");\n const endpoint = await resolveUsableTextEndpoint(db);\n const langName = LANGUAGE_NAMES[cfg.locale] || \"English\";\n\n const systemPrompt = `You are ZAM, a highly precise agentic learning assistant.\nYour task is to analyze a learning card and propose 2 to 4 atomic, foundational prerequisite concepts (foundations) that a learner must master *before* studying this card, in ${langName}.\n\nThe current card details are:\n- Question: ${token.question || \"N/A\"}\n- Core Concept: ${token.concept}\n- Domain: ${token.domain}\n- Excerpt Context: ${token.context || \"N/A\"}\n\nFor each proposed foundational card, you MUST generate:\n1. \"question\": A clear, concise active-recall question testing a single foundational fact or prerequisite concept.\n2. \"concept\": The reference answer or core fact.\n3. \"domain\": The category of the card (default to \"${token.domain}\").\n4. \"context\": The context excerpt explaining where this prerequisite fits in the learning hierarchy.\n5. \"bloom_level\": Bloom taxonomy level (typically 1 or 2 for foundational facts).\n6. \"symbiosis_mode\": Symbiosis mode (\"shadowing\", \"copilot\", or \"autonomy\").\n\nGuidelines:\n- Recommend only highly relevant and necessary prerequisites.\n- Keep each proposed card atomic and focused on one concept.\n- Output ONLY a raw valid JSON array of objects. Do NOT wrap the JSON in markdown code blocks, HTML, or include any conversational filler.`;\n\n const userPrompt = `Suggest 2 to 4 foundational prerequisite cards for the card above.\n\nJSON Array Output:`;\n\n const res = await fetchWithInteractiveTimeout(\n `${endpoint.url}/chat/completions`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${endpoint.apiKey}`,\n },\n body: JSON.stringify({\n model: endpoint.model,\n messages: [\n { role: \"system\", content: systemPrompt },\n { role: \"user\", content: userPrompt },\n ],\n temperature: 0.2,\n max_tokens: DEFAULT_LLM_MAX_TOKENS,\n }),\n locale: cfg.locale,\n },\n );\n\n const responseText = await readChatContent(\n res,\n \"LLM card foundations proposals\",\n );\n\n return parseGeneratedCardArray(responseText, \"foundation proposal\", {\n min: 2,\n max: 4,\n }).map((card) => ({ ...card, source_link: token.source_link || null }));\n}\n\n/**\n * Extract plain text from an image/scan path using LLM vision.\n */\nexport async function extractTextFromScanViaLLM(\n db: Database,\n imagePath: string,\n): Promise<string> {\n const p = await getProviderForRole(db, \"vision\");\n if (!p.enabled) {\n throw new Error(\n \"Vision role is not enabled in settings (llm.vision.enabled)\",\n );\n }\n\n if (!existsSync(imagePath)) {\n throw new Error(`Scan file not found: ${imagePath}`);\n }\n\n const stat = statSync(imagePath);\n if (!stat.isFile()) {\n throw new Error(`Scan path is not a file: ${imagePath}`);\n }\n if (stat.size > 10 * 1024 * 1024) {\n throw new Error(\"Scan file exceeds 10MB limit\");\n }\n\n const ext = imagePath.split(\".\").pop()?.toLowerCase();\n const mimeByExtension: Record<string, string> = {\n jpeg: \"image/jpeg\",\n jpg: \"image/jpeg\",\n png: \"image/png\",\n webp: \"image/webp\",\n };\n const mime = ext ? mimeByExtension[ext] : undefined;\n if (!mime) {\n throw new Error(\"Unsupported scan format; use PNG, JPEG, or WebP\");\n }\n\n const imageBytes = readFileSync(imagePath);\n const dataUrl = `data:${mime};base64,${imageBytes.toString(\"base64\")}`;\n\n const visionEndpoint = await getVisionConfig(db);\n const langName = LANGUAGE_NAMES[p.locale] || \"English\";\n\n const systemPrompt =\n \"You are ZAM's OCR processor. Extract all visible text from the image exactly as written. Output only the extracted text without commentary, formatting, or prefixes.\";\n\n const res = await fetchWithInteractiveTimeout(\n `${visionEndpoint.url}/chat/completions`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${visionEndpoint.apiKey || DEFAULT_LLM_API_KEY}`,\n },\n body: JSON.stringify({\n model: visionEndpoint.model,\n messages: [\n { role: \"system\", content: systemPrompt },\n {\n role: \"user\",\n content: [\n {\n type: \"text\",\n text: `Extract all text from this scan in ${langName}:`,\n },\n {\n type: \"image_url\",\n image_url: { url: dataUrl },\n },\n ],\n },\n ],\n temperature: 0,\n max_tokens: DEFAULT_LLM_MAX_TOKENS,\n }),\n locale: p.locale,\n },\n );\n\n if (!res.ok) {\n throw new Error(`LLM vision OCR request failed with status ${res.status}`);\n }\n\n const responseText = await readChatContent(\n res,\n \"LLM scan OCR text extraction\",\n );\n return responseText.trim();\n}\n\n/**\n * Translate a question into the active locale using the local LLM.\n */\nexport async function translateQuestionViaLLM(\n db: Database,\n question: string,\n): Promise<string> {\n const cfg = await getProviderForRole(db, \"recall\");\n const endpoint = await resolveUsableRecallEndpoint(db);\n const targetLang = LANGUAGE_NAMES[cfg.locale] || \"English\";\n\n const systemPrompt = `You are a highly precise translator. Translate the given active-recall question into clear, natural ${targetLang}.\nOutput ONLY the raw translation. Do not include any headers, preamble, quotes, or conversational filler.`;\n\n const res = await fetchWithInteractiveTimeout(\n `${endpoint.url}/chat/completions`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${endpoint.apiKey}`,\n },\n body: JSON.stringify({\n model: endpoint.model,\n messages: [\n { role: \"system\", content: systemPrompt },\n { role: \"user\", content: question },\n ],\n temperature: 0.1,\n max_tokens: DEFAULT_LLM_MAX_TOKENS,\n }),\n locale: cfg.locale,\n },\n );\n\n return readChatContent(res, \"Translation\");\n}\n\n/**\n * Checks if the LLM server is online and responsive at the specified URL.\n * A reachable server returning any HTTP status counts as online; only network\n * failures / timeouts count as offline.\n */\nexport async function isLlmOnline(url: string): Promise<boolean> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 1500);\n // Check OpenAI standard /models list to verify readiness\n const res = await fetch(`${url}/models`, {\n method: \"GET\",\n signal: controller.signal,\n });\n clearTimeout(timeoutId);\n return res.ok || res.status < 500;\n } catch {\n return false;\n }\n}\n\n/**\n * List the model ids the server actually serves (OpenAI `/v1/models`).\n * Returns [] on any error so callers can treat \"unknown\" as \"skip validation\".\n */\nexport async function getAvailableModels(\n url: string,\n apiKey = DEFAULT_LLM_API_KEY,\n): Promise<string[]> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 3000);\n const res = await fetch(`${url}/models`, {\n method: \"GET\",\n headers: { Authorization: `Bearer ${apiKey}` },\n signal: controller.signal,\n });\n clearTimeout(timeoutId);\n if (!res.ok) return [];\n const data = (await res.json()) as { data?: Array<{ id?: string }> };\n return (data.data ?? [])\n .map((m) => m.id)\n .filter((id): id is string => typeof id === \"string\" && id.length > 0);\n } catch {\n return [];\n }\n}\n\nexport interface VisionReadyResult {\n enabled: boolean;\n online: boolean;\n url: string;\n model: string;\n modelAvailable: boolean;\n availableModels: string[];\n usable: boolean;\n /** True when llm.vision.model is explicitly configured (not a fallback). */\n visionModelExplicit: boolean;\n /** Human-readable warning when usable but likely misconfigured. */\n warning?: string;\n}\n\ninterface ProviderEndpointReadiness {\n endpoint: ProviderConfig;\n online: boolean;\n availableModels: string[];\n modelAvailable: boolean;\n}\n\nfunction isLocalEndpoint(url: string): boolean {\n return (\n url.includes(\"localhost\") ||\n url.includes(\"127.0.0.1\") ||\n url.includes(\"[::1]\") ||\n url.includes(\"::1\")\n );\n}\n\nasync function checkProviderEndpoint(\n endpoint: ProviderConfig,\n): Promise<ProviderEndpointReadiness> {\n const online = await isLlmOnline(endpoint.url);\n if (!online) {\n return {\n endpoint,\n online: false,\n availableModels: [],\n modelAvailable: false,\n };\n }\n\n const availableModels = await getAvailableModels(\n endpoint.url,\n endpoint.apiKey,\n );\n const modelAvailable =\n availableModels.length === 0 ||\n availableModels.some(\n (candidate) => candidate.toLowerCase() === endpoint.model.toLowerCase(),\n );\n\n return { endpoint, online, availableModels, modelAvailable };\n}\n\nfunction isEndpointUsable(readiness: ProviderEndpointReadiness): boolean {\n return readiness.online && readiness.modelAvailable;\n}\n\nfunction providerChain(primary: ProviderConfig): ProviderConfig[] {\n return [primary, ...(primary.fallback ? [primary.fallback] : [])];\n}\n\nasync function checkProviderChain(primary: ProviderConfig): Promise<{\n primary: ProviderEndpointReadiness;\n firstUsable?: ProviderEndpointReadiness;\n}> {\n let first: ProviderEndpointReadiness | undefined;\n for (const endpoint of providerChain(primary)) {\n const readiness = await checkProviderEndpoint(endpoint);\n first ??= readiness;\n if (isEndpointUsable(readiness)) {\n return { primary: first, firstUsable: readiness };\n }\n }\n return { primary: first! };\n}\n\n/** LLM-generated or stored text plus the model that produced it (when applicable). */\nexport interface LlmTextResult {\n text: string;\n model: string;\n providerName?: string;\n}\n\n/** How a review question was resolved for display in the UI. */\nexport interface QuestionResolution {\n question: string;\n source: \"llm\" | \"original\";\n model?: string;\n}\n\nexport async function resolveUsableRecallEndpoint(\n db: Database,\n): Promise<ProviderConfig> {\n // Resolve the role config first (cheap, local reads) so configuration changes\n // are observed immediately. The cached value reuses only the *network* health\n // check, and only while the resolved provider signature is unchanged AND the\n // TTL holds — so the enable gate and a Studio rebind both take effect at once.\n const cfg = await getProviderForRole(db, \"recall\");\n if (!cfg.enabled) {\n throw new Error(\"LLM integration is disabled in settings (llm.enabled)\");\n }\n assertChatCompletions(cfg);\n\n const signature = recallEndpointSignature(cfg);\n if (\n cachedRecallEndpoint &&\n cachedRecallEndpoint.signature === signature &&\n cachedRecallEndpoint.expiresAt > Date.now()\n ) {\n return cachedRecallEndpoint.endpoint;\n }\n\n const chain = await checkProviderChain(cfg);\n const selected = chain.firstUsable;\n if (!selected || !isEndpointUsable(selected)) {\n throw new Error(\"No recall LLM endpoint is online\");\n }\n cachedRecallEndpoint = {\n endpoint: selected.endpoint,\n signature,\n expiresAt: Date.now() + RECALL_ENDPOINT_CACHE_MS,\n };\n return selected.endpoint;\n}\n\nasync function resolveUsableTextEndpoint(\n db: Database,\n): Promise<ProviderConfig> {\n const cfg = await getProviderForRole(db, \"text\");\n if (!cfg.enabled) {\n throw new Error(\n \"Text LLM integration is disabled in settings (llm.enabled)\",\n );\n }\n assertChatCompletions(cfg);\n\n const chain = await checkProviderChain(cfg);\n const selected = chain.firstUsable;\n if (!selected || !isEndpointUsable(selected)) {\n throw new Error(\"No text LLM endpoint is online\");\n }\n return selected.endpoint;\n}\n\nasync function prepareRecallChain(\n db: Database,\n opts: { timeoutMs: number; interactive: boolean },\n): Promise<LlmReadyResult> {\n const cfg = await getProviderForRole(db, \"recall\");\n const fail = (\n reason: LlmReadiness[\"reason\"],\n partial: Partial<LlmReadyResult> = {},\n ): LlmReadyResult => ({\n usable: false,\n reason,\n online: false,\n model: cfg.model,\n availableModels: [],\n providerName: cfg.providerName,\n label: cfg.label,\n local: cfg.local ?? isLocalEndpoint(cfg.url),\n activeTier: \"primary\",\n ...partial,\n });\n\n if (!cfg.enabled) return fail(\"disabled\");\n if (cfg.apiFlavor !== \"chat-completions\") return fail(\"unsupported-provider\");\n\n const chain = providerChain(cfg);\n const deadline = Date.now() + opts.timeoutMs;\n let lastReason: LlmReadiness[\"reason\"] = \"offline\";\n let lastOnline = false;\n let lastModel = cfg.model;\n let lastAvailable: string[] = [];\n\n for (let index = 0; index < chain.length; index++) {\n const endpoint = chain[index];\n let online = await isLlmOnline(endpoint.url);\n\n if (!online && (endpoint.local ?? isLocalEndpoint(endpoint.url))) {\n if (opts.interactive) {\n online = await startLocalRunner(\n endpoint.url,\n endpoint.model,\n cfg.locale,\n endpoint.runner,\n );\n } else {\n spawnLocalRunner(endpoint.url, endpoint.model, endpoint.runner);\n while (Date.now() < deadline) {\n await new Promise((resolve) => setTimeout(resolve, 1000));\n if (await isLlmOnline(endpoint.url)) {\n online = true;\n break;\n }\n }\n }\n }\n\n lastOnline = online;\n lastModel = endpoint.model;\n\n if (!online) {\n lastReason = \"offline\";\n continue;\n }\n\n const availableModels = await getAvailableModels(\n endpoint.url,\n endpoint.apiKey,\n );\n lastAvailable = availableModels;\n const modelKnown =\n availableModels.length === 0 ||\n availableModels.some(\n (candidate) => candidate.toLowerCase() === endpoint.model.toLowerCase(),\n );\n if (!modelKnown) {\n lastReason = \"model-not-found\";\n continue;\n }\n\n return {\n usable: true,\n online: true,\n model: endpoint.model,\n availableModels,\n providerName: endpoint.providerName,\n label: endpoint.label,\n local: endpoint.local ?? isLocalEndpoint(endpoint.url),\n activeTier: index === 0 ? \"primary\" : \"fallback\",\n };\n }\n\n return fail(lastReason, {\n online: lastOnline,\n model: lastModel,\n availableModels: lastAvailable,\n });\n}\n\nasync function isVisionProviderModelExplicit(\n db: Database,\n active: ProviderConfig,\n): Promise<boolean> {\n if (await getSetting(db, \"llm.vision.model\")) return true;\n\n const providers = await readJsonSetting<ProvidersMap>(db, \"llm.providers\");\n const roles = await readJsonSetting<RolesMap>(db, \"llm.roles\");\n const binding = roles?.vision;\n const sharedExplicit = [binding?.primary, binding?.fallback].some((id) => {\n if (!id) return false;\n const rec = providers?.[id];\n return (\n rec?.model === active.model &&\n (rec.url === undefined || rec.url === active.url)\n );\n });\n if (sharedExplicit) return true;\n\n const machine = getMachineAiConfig();\n const machineBinding = machine.roles?.vision;\n return [machineBinding?.primary, machineBinding?.fallback].some((id) => {\n if (!id) return false;\n const rec = machine.providers?.[id];\n return (\n rec?.model === active.model &&\n (rec.url === undefined || rec.url === active.url)\n );\n });\n}\n\n/** Non-starting readiness check for the opt-in UI observer vision endpoint. */\nexport async function checkVisionReadiness(\n db: Database,\n): Promise<VisionReadyResult> {\n const cfg = await getProviderForRole(db, \"vision\");\n const chain = cfg.enabled ? await checkProviderChain(cfg) : undefined;\n const selected = chain?.firstUsable ?? chain?.primary;\n const active = selected?.endpoint ?? cfg;\n const online = selected?.online ?? false;\n const availableModels = selected?.availableModels ?? [];\n const modelAvailable = selected?.modelAvailable ?? false;\n const visionModelExplicit = await isVisionProviderModelExplicit(db, active);\n\n // Warn when vision falls back to the base text model — it is almost\n // certainly a text-only model that cannot interpret images.\n let warning: string | undefined;\n if (cfg.enabled && online && modelAvailable && !visionModelExplicit) {\n const cloudRec = getCloudModelRecommendation(active.url);\n if (cloudRec && active.model === cloudRec.model) {\n // Auto-recommended cloud vision model is active; do not warn about text-only fallback.\n } else {\n warning =\n `No explicit vision model configured (llm.vision.model). ` +\n `Falling back to base model \"${active.model}\", which may not support image input. ` +\n `Set a multimodal model: zam settings set llm.vision.model <model>`;\n }\n }\n\n return {\n enabled: cfg.enabled,\n online,\n url: active.url,\n model: active.model,\n modelAvailable,\n availableModels,\n usable: cfg.enabled && online && modelAvailable,\n visionModelExplicit,\n warning,\n };\n}\n\nexport interface ProviderRoleStatus {\n role: LlmRole;\n enabled: boolean;\n providerName?: string;\n label?: string;\n source: ProviderConfig[\"source\"];\n url: string;\n model: string;\n apiFlavor: ApiFlavor;\n local: boolean;\n online: boolean;\n modelAvailable: boolean;\n availableModels: string[];\n usable: boolean;\n reason?: \"disabled\" | \"offline\" | \"model-not-found\" | \"unsupported-provider\";\n fallback?: {\n providerName?: string;\n label?: string;\n source: ProviderConfig[\"source\"];\n url: string;\n model: string;\n apiFlavor: ApiFlavor;\n local: boolean;\n };\n}\n\nfunction summarizeFallback(\n provider: ProviderConfig | undefined,\n): ProviderRoleStatus[\"fallback\"] {\n if (!provider) return undefined;\n return {\n providerName: provider.providerName,\n label: provider.label,\n source: provider.source,\n url: provider.url,\n model: provider.model,\n apiFlavor: provider.apiFlavor,\n local: provider.local,\n };\n}\n\n/** Secret-safe status for a provider role, suitable for bridge/UI output. */\nexport async function getProviderRoleStatus(\n db: Database,\n role: LlmRole,\n): Promise<ProviderRoleStatus> {\n const cfg = await getProviderForRole(db, role);\n const unsupportedProvider =\n role !== \"vision\" && cfg.apiFlavor !== \"chat-completions\";\n\n if (!cfg.enabled) {\n return {\n role,\n enabled: false,\n providerName: cfg.providerName,\n label: cfg.label,\n source: cfg.source,\n url: cfg.url,\n model: cfg.model,\n apiFlavor: cfg.apiFlavor,\n local: cfg.local,\n online: false,\n modelAvailable: false,\n availableModels: [],\n usable: false,\n reason: \"disabled\",\n fallback: summarizeFallback(cfg.fallback),\n };\n }\n\n if (unsupportedProvider) {\n return {\n role,\n enabled: true,\n providerName: cfg.providerName,\n label: cfg.label,\n source: cfg.source,\n url: cfg.url,\n model: cfg.model,\n apiFlavor: cfg.apiFlavor,\n local: cfg.local,\n online: false,\n modelAvailable: false,\n availableModels: [],\n usable: false,\n reason: \"unsupported-provider\",\n fallback: summarizeFallback(cfg.fallback),\n };\n }\n\n const chain = await checkProviderChain(cfg);\n const selected = chain.firstUsable ?? chain.primary;\n const active = selected.endpoint;\n const usable = selected.online && selected.modelAvailable;\n const reason = usable\n ? undefined\n : selected.online\n ? \"model-not-found\"\n : \"offline\";\n\n return {\n role,\n enabled: true,\n providerName: active.providerName,\n label: active.label,\n source: active.source,\n url: active.url,\n model: active.model,\n apiFlavor: active.apiFlavor,\n local: active.local,\n online: selected.online,\n modelAvailable: selected.modelAvailable,\n availableModels: selected.availableModels,\n usable,\n reason,\n fallback: summarizeFallback(cfg.fallback),\n };\n}\n\n/** Whether the local LLM can actually be used this session, and if not, why. */\nexport interface LlmReadiness {\n usable: boolean;\n reason?: \"disabled\" | \"offline\" | \"model-not-found\" | \"unsupported-provider\";\n}\n\ntype RunnerKind = \"fastflowlm\" | \"ollama\" | \"generic\" | \"unknown\";\n\nfunction runnerKindFromHint(hint?: string): RunnerKind | undefined {\n if (!hint) return undefined;\n const normalized = hint.trim().toLowerCase();\n if (normalized === \"flm\" || normalized === \"fastflowlm\") {\n return \"fastflowlm\";\n }\n if (normalized === \"ollama\") return \"ollama\";\n if (\n normalized === \"foundry-local\" ||\n normalized === \"foundry\" ||\n normalized === \"generic\"\n ) {\n return \"generic\";\n }\n return undefined;\n}\n\nfunction defaultPortForRunner(runner: RunnerKind, url: string): string {\n try {\n const urlObj = new URL(url);\n const explicit = urlObj.port;\n if (explicit) return explicit;\n if (runner === \"ollama\") return \"11434\";\n if (urlObj.protocol === \"https:\") return \"443\";\n return \"80\";\n } catch {\n return runner === \"ollama\" ? \"11434\" : \"8000\";\n }\n}\n\n/** Pick the local runner from an explicit hint, else URL port / model name. */\nfunction detectRunner(\n url: string,\n model: string,\n hint?: string,\n): { runner: RunnerKind; port: string } {\n const fromHint = runnerKindFromHint(hint);\n if (fromHint) {\n return { runner: fromHint, port: defaultPortForRunner(fromHint, url) };\n }\n\n let runner: RunnerKind = \"unknown\";\n let port = \"8000\";\n try {\n const urlObj = new URL(url);\n port = urlObj.port || (urlObj.protocol === \"https:\" ? \"443\" : \"80\");\n if (\n port === \"8000\" ||\n port === \"8080\" ||\n model.includes(\"qwen\") ||\n model.includes(\"gemma\")\n ) {\n runner = \"fastflowlm\";\n } else if (port === \"11434\" || model.includes(\"llama\")) {\n runner = \"ollama\";\n }\n } catch {\n runner = getSystemProfile().recommendedRunner;\n }\n return { runner, port };\n}\n\n/**\n * Best-effort, SILENT runner start for non-interactive contexts (bridge / GUI).\n * No console output, no prompts — just spawn the detached server if we can.\n */\nfunction spawnLocalRunner(url: string, model: string, hint?: string): void {\n const { runner, port } = detectRunner(url, model, hint);\n try {\n if (runner === \"fastflowlm\") {\n const flmExe = existsSync(\"C:\\\\Program Files\\\\flm\\\\flm.exe\")\n ? \"C:\\\\Program Files\\\\flm\\\\flm.exe\"\n : \"flm\";\n if (!hasCommand(\"flm\") && flmExe === \"flm\") return;\n spawn(flmExe, [\"serve\", model, \"--port\", port], {\n detached: true,\n stdio: \"ignore\",\n windowsHide: true,\n }).unref();\n } else if (runner === \"ollama\" || runner === \"generic\") {\n if (!hasCommand(\"ollama\")) return;\n spawn(\"ollama\", [\"serve\"], {\n detached: true,\n stdio: \"ignore\",\n windowsHide: true,\n }).unref();\n }\n } catch {\n // best-effort: caller polls for the server and reports offline if it fails\n }\n}\n\n/**\n * Detect the configured runner and start it, then poll until the server is\n * online (or the user opts out). Returns true once reachable, false otherwise.\n */\nasync function startLocalRunner(\n url: string,\n model: string,\n locale: SupportedLocale,\n hint?: string,\n): Promise<boolean> {\n const { runner, port } = detectRunner(url, model, hint);\n\n if (runner === \"fastflowlm\") {\n const flmExe = existsSync(\"C:\\\\Program Files\\\\flm\\\\flm.exe\")\n ? \"C:\\\\Program Files\\\\flm\\\\flm.exe\"\n : \"flm\";\n if (!hasCommand(\"flm\") && flmExe === \"flm\") {\n console.warn(\n \"\\x1b[31m✗ FastFlowLM is configured but could not be found on the system.\\x1b[0m\",\n );\n console.warn(\"Please run 'zam init' or install it manually.\");\n return false;\n }\n const args = [\"serve\", model, \"--port\", port];\n console.log(\n `\\x1b[36mStarting FastFlowLM serve process: ${flmExe} ${args.join(\" \")}\\x1b[0m`,\n );\n try {\n spawn(flmExe, args, {\n detached: true,\n stdio: \"ignore\",\n windowsHide: true,\n }).unref();\n } catch (err) {\n console.error(\n `\\x1b[31m✗ Failed to launch FastFlowLM process: ${(err as Error).message}\\x1b[0m`,\n );\n return false;\n }\n } else if (runner === \"ollama\" || runner === \"generic\") {\n if (!hasCommand(\"ollama\")) {\n console.warn(\n \"\\x1b[31m✗ Ollama is configured but the 'ollama' command is not available in PATH.\\x1b[0m\",\n );\n console.warn(\"Please run 'zam init' or install it manually.\");\n return false;\n }\n console.log(\"\\x1b[36mStarting Ollama serve process: ollama serve\\x1b[0m\");\n try {\n spawn(\"ollama\", [\"serve\"], {\n detached: true,\n stdio: \"ignore\",\n windowsHide: true,\n }).unref();\n } catch (err) {\n console.error(\n `\\x1b[31m✗ Failed to launch Ollama process: ${(err as Error).message}\\x1b[0m`,\n );\n return false;\n }\n } else {\n console.warn(\n \"\\x1b[33m⚠ Unknown local LLM runner configured. Cannot auto-start.\\x1b[0m\",\n );\n return false;\n }\n\n // Poll until the server is online (or the user opts out).\n console.log(\n \"Waiting for LLM server to become responsive and load the model...\",\n );\n let attempts = 0;\n const dotsPerLine = 30;\n while (true) {\n await new Promise((resolve) => setTimeout(resolve, 500));\n if (await isLlmOnline(url)) {\n if (attempts > 0) process.stdout.write(\"\\n\");\n return true;\n }\n attempts++;\n process.stdout.write(\".\");\n if (attempts % dotsPerLine === 0) process.stdout.write(\"\\n\");\n\n // 60 attempts * 500ms = 30 seconds\n if (attempts >= 60) {\n process.stdout.write(\"\\n\");\n console.log(`\\x1b[33m${t(locale, \"wait_warning\")}\\x1b[0m`);\n console.log(`\\x1b[2m${t(locale, \"wait_info\")}\\x1b[0m`);\n\n const { confirm } = await import(\"@inquirer/prompts\");\n const keepWaiting = await confirm({\n message: t(locale, \"keep_waiting_llm\"),\n default: true,\n }).catch(() => false);\n\n if (!keepWaiting) {\n return false;\n }\n attempts = 0;\n }\n }\n}\n\n/**\n * Make the local LLM ready for the session and report whether it is usable.\n *\n * Starts the local runner if needed, then — crucially — verifies the configured\n * model is actually served. A wrong model name otherwise leaves the server\n * reachable but every request hanging/failing, which previously looked like\n * \"the AI is just slow\". We now fail fast with an actionable message instead.\n */\nexport async function ensureLocalLlmRunning(\n db: Database,\n): Promise<LlmReadiness> {\n const result = await prepareRecallChain(db, {\n timeoutMs: 25_000,\n interactive: true,\n });\n if (result.usable) {\n const location = result.local ? \"local\" : \"cloud\";\n console.log(\n `\\x1b[32m✓ Recall LLM ready (${location}: ${result.model}).\\x1b[0m`,\n );\n return { usable: true };\n }\n if (result.reason === \"unsupported-provider\") {\n console.warn(\n `\\x1b[31m✗ Recall provider is not supported for active recall.\\x1b[0m`,\n );\n } else if (result.reason === \"model-not-found\") {\n console.warn(\n `\\x1b[31m✗ Configured model \"${result.model}\" is not available on the server.\\x1b[0m`,\n );\n console.warn(` Available models: ${result.availableModels.join(\", \")}`);\n } else if (result.reason === \"offline\") {\n console.warn(\n `\\x1b[33m⚠ No recall LLM endpoint is reachable. Continuing without AI coaching.\\x1b[0m\\n`,\n );\n }\n return { usable: false, reason: result.reason };\n}\n\n/** Readiness plus the live status details a UI needs to render. */\nexport interface LlmReadyResult extends LlmReadiness {\n online: boolean;\n model: string;\n availableModels: string[];\n providerName?: string;\n label?: string;\n local?: boolean;\n activeTier?: \"primary\" | \"fallback\";\n}\n\n/**\n * Non-interactive readiness check for the bridge / desktop GUI: start the local\n * runner if needed, wait (bounded) for it to come online, validate the model —\n * all WITHOUT console output or prompts, so the bridge's JSON stays clean.\n */\nexport async function ensureLlmReadyHeadless(\n db: Database,\n opts: { timeoutMs?: number } = {},\n): Promise<LlmReadyResult> {\n return prepareRecallChain(db, {\n timeoutMs: opts.timeoutMs ?? 25_000,\n interactive: false,\n });\n}\n\n/**\n * Wraps a fetch call in an interactive wait loop with progress dots.\n * Every `timeoutMs`, prompts the user (in their locale) to keep waiting or skip.\n * In non-TTY / bridge contexts the timeout is a hard deadline because there\n * is no interactive prompt that can ask whether to keep waiting.\n */\nexport async function fetchWithInteractiveTimeout(\n url: string,\n options: RequestInit & {\n timeoutMs?: number;\n hardTimeoutMs?: number;\n locale?: SupportedLocale;\n } = {},\n): Promise<Response> {\n const {\n timeoutMs = 20000,\n hardTimeoutMs = 120000,\n locale = \"en\",\n ...fetchOptions\n } = options;\n const controller = new AbortController();\n const fetchPromise = fetch(url, {\n ...fetchOptions,\n signal: controller.signal,\n });\n\n if (!process.stdout.isTTY || process.env.ZAM_BRIDGE === \"true\") {\n let timeoutId: NodeJS.Timeout | undefined;\n const hardTimeout = new Promise<never>((_resolve, reject) => {\n timeoutId = setTimeout(() => {\n reject(new Error(`LLM request timed out after ${hardTimeoutMs}ms`));\n controller.abort();\n }, hardTimeoutMs);\n });\n try {\n return await Promise.race([fetchPromise, hardTimeout]);\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n let attempts = 0;\n const dotsPerLine = 30;\n while (true) {\n let timeoutId: NodeJS.Timeout | undefined;\n const timeoutPromise = new Promise<\"timeout\">((resolve) => {\n timeoutId = setTimeout(() => resolve(\"timeout\"), timeoutMs);\n });\n const dotsInterval = setInterval(() => {\n process.stdout.write(\".\");\n attempts++;\n if (attempts % dotsPerLine === 0) process.stdout.write(\"\\n\");\n }, 500);\n\n try {\n const result = await Promise.race([fetchPromise, timeoutPromise]);\n clearInterval(dotsInterval);\n clearTimeout(timeoutId);\n\n if (result !== \"timeout\") {\n if (attempts > 0) process.stdout.write(\"\\n\");\n return result;\n }\n\n // Timeout hit — ask the learner whether to keep waiting.\n console.log(`\\n\\x1b[33m${t(locale, \"local_ai_working\")}\\x1b[0m`);\n const { confirm } = await import(\"@inquirer/prompts\");\n const keepWaiting = await confirm({\n message: t(locale, \"keep_waiting\"),\n default: true,\n }).catch(() => false);\n\n if (!keepWaiting) {\n controller.abort();\n console.log(`\\x1b[33m${t(locale, \"proceeding_offline\")}\\x1b[0m\\n`);\n throw new Error(\"User cancelled waiting for slow LLM response\");\n }\n attempts = 0;\n } catch (err) {\n clearInterval(dotsInterval);\n clearTimeout(timeoutId);\n if (attempts > 0) process.stdout.write(\"\\n\");\n throw err;\n }\n }\n}\n\n/**\n * Ensures a token has a high-quality active-recall question.\n * When LLM is enabled, generates a fresh question on the fly, self-heals it into\n * the database, and returns it. Otherwise falls back to the stored question.\n */\nexport async function ensureHighQualityQuestion(\n db: Database,\n token: {\n id: string;\n slug: string;\n concept: string;\n domain: string;\n bloomLevel: number;\n sourceLink?: string | null;\n question?: string | null;\n },\n): Promise<QuestionResolution | null> {\n const { enabled } = await getLlmConfig(db);\n\n if (enabled) {\n try {\n let sourceLinkContent: string | null = null;\n if (token.sourceLink) {\n const resolved = await resolveReviewContext(token.sourceLink).catch(\n () => null,\n );\n if (resolved) {\n sourceLinkContent = resolved.content;\n }\n }\n\n const generated = await generateQuestionViaLLM(db, {\n slug: token.slug,\n concept: token.concept,\n domain: token.domain,\n bloomLevel: token.bloomLevel,\n sourceLinkContent,\n });\n\n if (generated.text.trim().length > 0) {\n // Persist the latest high-quality question as the offline fallback.\n await updateToken(db, token.slug, { question: generated.text });\n return {\n question: generated.text,\n source: \"llm\",\n model: generated.model,\n };\n }\n } catch {\n // Fail silently and fall back to the stored database question.\n }\n }\n\n if (token.question && token.question.trim().length > 0) {\n return {\n question: token.question.trim(),\n source: \"original\",\n };\n }\n\n return null;\n}\n\n/**\n * Generate a high-quality, human-friendly title for a token using LLM.\n * Follows ADR: thoughtful name (not definition), no domain echo, concise, language-aware.\n */\nexport async function generateTitleViaLLM(\n db: Database,\n input: {\n slug: string;\n concept: string;\n domain: string;\n question?: string | null;\n context?: string | null;\n },\n opts: { timeoutMs?: number; knowledgeContext?: string } = {},\n): Promise<LlmTextResult> {\n const cfg = await getProviderForRole(db, \"text\"); // or recall? text for generation\n let locale = cfg.locale;\n const contextName = opts.knowledgeContext || getActiveWorkspaceContext();\n if (contextName) {\n const context = await getKnowledgeContextByName(db, contextName);\n if (context?.language) {\n locale = normalizeLocale(context.language) as SupportedLocale;\n }\n }\n\n const endpoint = await resolveUsableTextEndpoint(db); // assume exists or use recall\n\n const systemPrompt = `You are an expert at naming knowledge items for a personal knowledge graph.\nYour task: given a knowledge token's concept (the full reference answer), question, domain, and optional context, produce a short, descriptive, human-friendly TITLE.\n\nStrict rules from the project ADR:\n- Concise name for the concept (≤ 80 chars ideal).\n- Thoughtful, memorable name — NOT a definition or the first sentence of the concept.\n- NEVER echo the domain name (e.g. do not say \"Workflow Engine Node Drain\" if domain is \"workflow-engine\"; just \"Node Drain Protection\").\n- Prefer a name over spoiling the full concept.\n- Support Unicode (umlauts, etc.).\n- Output the title in the same language as the concept/content (e.g., German if the concept is German, English if the concept is English).\n- Output ONLY the raw title text. No preamble, quotes, explanations, or markdown.\n\nExample good titles:\n- \"RAG Retrieval Quality Evaluation\" (for RAG failure modes focused on retrieval)\n- \"Pythagorean Theorem Converse Proof\"\n- \"macOS Applications Directory Layout\"\n- \"Chronotype Sleep Preference\"`;\n\n const userPrompt = `Domain: ${input.domain}\nSlug: ${input.slug}\nQuestion: ${input.question || \"(none)\"}\nConcept: ${input.concept}\nContext: ${input.context || \"(none)\"}\n\nTitle:`;\n\n // Use recall endpoint as fallback if text not available; many setups share.\n const url = `${endpoint.url}/chat/completions`;\n const apiKey = endpoint.apiKey;\n const model = endpoint.model;\n\n try {\n const res = await fetchWithInteractiveTimeout(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n model,\n messages: [\n { role: \"system\", content: systemPrompt },\n { role: \"user\", content: userPrompt },\n ],\n temperature: 0.2,\n max_tokens: 100,\n }),\n locale,\n timeoutMs: opts.timeoutMs,\n hardTimeoutMs: opts.timeoutMs,\n });\n\n const text = await readChatContent(res, \"title generation\");\n return {\n text: text.trim(),\n model,\n providerName: endpoint.providerName,\n };\n } catch (_e) {\n // Fallback to simple\n return {\n text: input.concept.split(/[.;]/)[0].trim().substring(0, 80),\n model: \"fallback\",\n providerName: \"heuristic\",\n };\n }\n}\n\nexport async function repairUmlautsViaLLM(\n db: Database,\n input: { text: string },\n opts: { timeoutMs?: number } = {},\n): Promise<string> {\n const cfg = await getProviderForRole(db, \"text\");\n const endpoint = await resolveUsableTextEndpoint(db);\n\n const systemPrompt = `You are an expert editor specializing in German language orthography.\nYour task: given a text that may contain legacy ASCII-folded German umlauts (like 'ue' instead of 'ü', 'ae' instead of 'ä', 'oe' instead of 'ö', 'Ue' instead of 'Ü', etc.), repair them back to proper German umlauts (ä, ö, ü, Ä, Ö, Ü, ß) where appropriate.\n\nStrict rules:\n- ONLY change character sequences that are clearly meant to be German umlauts (e.g. change \"Ueber\" to \"Über\", \"fuer\" to \"für\", \"moeglich\" to \"möglich\").\n- DO NOT change words that are correct in their current form (e.g. do NOT change \"nahe\" to \"nähe\", do NOT change English words or technical terms, do NOT change names like \"Ueda\").\n- Output ONLY the repaired text. No preamble, no explanation, no markdown formatting.`;\n\n const userPrompt = `Text to repair:\n\"\"\"\n${input.text}\n\"\"\"\n\nRepaired text:`;\n\n const url = `${endpoint.url}/chat/completions`;\n const apiKey = endpoint.apiKey;\n const model = endpoint.model;\n\n try {\n const res = await fetchWithInteractiveTimeout(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n model,\n messages: [\n { role: \"system\", content: systemPrompt },\n { role: \"user\", content: userPrompt },\n ],\n temperature: 0.1,\n }),\n locale: cfg.locale,\n timeoutMs: opts.timeoutMs,\n hardTimeoutMs: opts.timeoutMs,\n });\n\n const text = await readChatContent(res, \"umlaut repair\");\n return text.trim();\n } catch (_e) {\n return input.text;\n }\n}\n","import type { Database, KnowledgeContext } from \"../kernel/index.js\";\nimport {\n getActiveWorkspaceContext,\n getKnowledgeContextByName,\n} from \"../kernel/index.js\";\n\n/**\n * Resolve contexts for a token-creation operation. Explicit names win;\n * otherwise the active workspace's machine-local default applies.\n */\nexport async function resolveOperationKnowledgeContexts(\n db: Database,\n requestedNames: string[],\n): Promise<KnowledgeContext[]> {\n const explicitNames = [\n ...new Set(requestedNames.map((name) => name.trim()).filter(Boolean)),\n ];\n const activeDefault = getActiveWorkspaceContext();\n const selectedNames =\n explicitNames.length > 0\n ? explicitNames\n : activeDefault\n ? [activeDefault]\n : [];\n\n const contexts: KnowledgeContext[] = [];\n for (const name of selectedNames) {\n const context = await getKnowledgeContextByName(db, name);\n if (!context) {\n const subject =\n explicitNames.length > 0 ? \"Knowledge\" : \"Active knowledge\";\n throw new Error(`${subject} context not found: ${name}`);\n }\n contexts.push(context);\n }\n return contexts;\n}\n","/**\n * Embedding generation — CLI/harness layer (ADR 2026-07-03).\n *\n * Talks to an OpenAI-compatible `/v1/embeddings` endpoint (Ollama, FastFlowLM\n * server mode, …) via the `embedding` role in the provider system\n * (client.ts). Lives here — NOT in the kernel — for the same reason the rest\n * of `src/cli/llm/` does: the kernel is AI-agnostic and carries zero LLM\n * dependencies. The kernel only stores vectors and derives staleness\n * (`src/kernel/models/token-embedding.ts`); everything that does HTTP belongs\n * here.\n */\n\nimport type { Database, Token } from \"../../kernel/index.js\";\nimport {\n computeContentHash,\n embeddingContentForToken,\n getEmbeddingCoverage,\n getSetting,\n listTokensNeedingEmbedding,\n searchTokensHybrid,\n upsertTokenEmbedding,\n} from \"../../kernel/index.js\";\nimport {\n DEFAULT_LLM_API_KEY,\n getAvailableModels,\n getProviderForRole,\n isLlmOnline,\n type ProviderConfig,\n} from \"./client.js\";\n\n/** Single source of truth for the default embedding model (see canonicalEmbeddingModelId). */\nexport const DEFAULT_EMBEDDING_MODEL = \"embeddinggemma\";\n\n/** Canonical model id every stored vector and kernel call uses. */\nconst CANONICAL_EMBEDDING_MODEL_ID = \"embeddinggemma-300m\";\n\n/**\n * Different runtimes serve the same EmbeddingGemma weights under different\n * wire tags (Ollama `embeddinggemma`, FastFlowLM `embed-gemma` /\n * `embed-gemma:300m`, Hugging Face `google/embeddinggemma-300m`). Every\n * stored vector and kernel call must use one canonical id so a Turso-synced\n * DB does not re-embed everything whenever a differently-tagged machine runs\n * a search. The configured raw model name is still used on the wire (the\n * HTTP request body) — only the DB-facing id is canonicalized. Unknown ids\n * pass through lowercased, unchanged.\n */\nconst EMBEDDINGGEMMA_ALIASES = new Set([\n \"embeddinggemma\",\n \"embeddinggemma:300m\",\n \"embeddinggemma-300m\",\n \"embed-gemma\",\n \"embed-gemma:300m\",\n \"google/embeddinggemma-300m\",\n]);\n\nexport function canonicalEmbeddingModelId(model: string): string {\n const lowered = model.trim().toLowerCase();\n if (EMBEDDINGGEMMA_ALIASES.has(lowered)) {\n return CANONICAL_EMBEDDING_MODEL_ID;\n }\n return lowered;\n}\n\n/** Model-specific retrieval prompt used for stored token vectors. */\nexport function embeddingTextForToken(\n t: Pick<Token, \"concept\" | \"question\" | \"domain\"> & { title?: string | null },\n model: string,\n): string {\n const isGemma = EMBEDDINGGEMMA_ALIASES.has(model.trim().toLowerCase());\n const content = embeddingContentForToken(t);\n return isGemma ? `title: none | text: ${content}` : content;\n}\n\n/** Model-specific retrieval prompt used for search and dedup queries. */\nexport function embeddingTextForQuery(text: string, model: string): string {\n const isGemma = EMBEDDINGGEMMA_ALIASES.has(model.trim().toLowerCase());\n return isGemma ? `task: search result | query: ${text}` : text;\n}\n\n/**\n * Resolve a usable embedding endpoint, or null when unavailable — never\n * throws. Semantic search is a pure capability add: the caller always has a\n * lexical fallback, so any failure here must degrade quietly instead of\n * raising. Does NOT auto-start a local runner (consistent with the\n * no-autostart rule for the embedding role — FastFlowLM's embedding server\n * mode in particular must be started manually alongside an LLM).\n */\nexport async function resolveUsableEmbeddingEndpoint(\n db: Database,\n): Promise<ProviderConfig | null> {\n const cfg = await getProviderForRole(db, \"embedding\");\n if (!cfg.enabled) return null;\n\n for (const endpoint of [cfg, ...(cfg.fallback ? [cfg.fallback] : [])]) {\n if (endpoint.apiFlavor !== \"chat-completions\") continue;\n const online = await isLlmOnline(endpoint.url);\n if (!online) continue;\n\n const availableModels = await getAvailableModels(\n endpoint.url,\n endpoint.apiKey,\n );\n const modelAvailable =\n availableModels.length === 0 ||\n availableModels.some(\n (candidate) => candidate.toLowerCase() === endpoint.model.toLowerCase(),\n );\n if (modelAvailable) return endpoint;\n }\n\n return null;\n}\n\ninterface EmbeddingsResponseItem {\n embedding?: unknown;\n index?: unknown;\n}\n\ninterface EmbeddingsResponse {\n data?: EmbeddingsResponseItem[];\n}\n\n/** POST `${url}/embeddings` for a batch of texts; returns vectors in input order. */\nexport async function embedTexts(\n endpoint: { url: string; model: string; apiKey: string },\n texts: string[],\n): Promise<number[][]> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 60_000);\n\n let res: Response;\n try {\n res = await fetch(`${endpoint.url}/embeddings`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${endpoint.apiKey || DEFAULT_LLM_API_KEY}`,\n },\n body: JSON.stringify({ model: endpoint.model, input: texts }),\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timeoutId);\n }\n\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n throw new Error(\n `Embedding request failed: ${res.statusText} (${res.status}) - ${body}`,\n );\n }\n\n const data = (await res.json()) as EmbeddingsResponse;\n const items = data.data ?? [];\n if (items.length !== texts.length) {\n throw new Error(\n `Embedding response returned ${items.length} vectors for ${texts.length} inputs`,\n );\n }\n\n const ordered: number[][] = new Array(texts.length);\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const index = typeof item.index === \"number\" ? item.index : i;\n if (!Number.isInteger(index)) {\n throw new Error(\"Embedding response item is missing a valid index\");\n }\n if (index < 0 || index >= texts.length) {\n throw new Error(`Embedding response index out of range: ${index}`);\n }\n if (\n !Array.isArray(item.embedding) ||\n item.embedding.length === 0 ||\n !item.embedding.every((n) => typeof n === \"number\" && Number.isFinite(n))\n ) {\n throw new Error(\n `Embedding response at index ${index} is not a non-empty array of finite numbers`,\n );\n }\n ordered[index] = item.embedding as number[];\n }\n\n const firstLength = ordered[0]?.length;\n if (ordered.some((vec) => vec === undefined || vec.length !== firstLength)) {\n throw new Error(\"Embedding response vectors have inconsistent lengths\");\n }\n\n return ordered;\n}\n\n/** How many texts to send per embedding request during a backfill pass. */\nconst EMBED_BATCH_SIZE = 16;\n\nexport interface EnsureTokenEmbeddingsResult {\n status: \"ok\" | \"unavailable\";\n embedded: number;\n remaining: number;\n reason?: string;\n}\n\n/**\n * Lazily top up embeddings for tokens that are missing, stale, or embedded\n * under a different model. Bounded by `opts.limit` (default 64) so a search\n * or dedup check never blocks on embedding the entire token base; `zam token\n * reembed` calls this in a loop with a much larger cap to backfill\n * exhaustively.\n */\nexport async function ensureTokenEmbeddings(\n db: Database,\n opts?: { limit?: number; force?: boolean; dims?: number },\n): Promise<EnsureTokenEmbeddingsResult> {\n const endpoint = await resolveUsableEmbeddingEndpoint(db);\n if (!endpoint) {\n const reason = await describeUnavailableReason(db);\n return { status: \"unavailable\", embedded: 0, remaining: 0, reason };\n }\n\n const model = canonicalEmbeddingModelId(endpoint.model);\n const pending = await listTokensNeedingEmbedding(db, model, {\n limit: opts?.limit ?? 64,\n force: opts?.force,\n dims: opts?.dims,\n });\n\n // The upfront endpoint check cannot rule out mid-flight failures (server\n // dies between health check and embed call, model 404s at embed time).\n // Those must degrade like any other unavailability — with the partial\n // progress kept — instead of throwing into a search path.\n let embedded = 0;\n let failure: string | undefined;\n try {\n for (let i = 0; i < pending.length; i += EMBED_BATCH_SIZE) {\n const batch = pending.slice(i, i + EMBED_BATCH_SIZE);\n const formattedTexts = batch.map((item) =>\n embeddingTextForToken(item.token, endpoint.model),\n );\n const vectors = await embedTexts(\n { url: endpoint.url, model: endpoint.model, apiKey: endpoint.apiKey },\n formattedTexts,\n );\n for (const [index, item] of batch.entries()) {\n await upsertTokenEmbedding(db, {\n tokenId: item.token.id,\n embedding: vectors[index],\n model,\n contentHash: computeContentHash(item.text),\n });\n embedded++;\n }\n }\n } catch (err) {\n failure = err instanceof Error ? err.message : String(err);\n }\n\n const coverage = await getEmbeddingCoverage(db, model, { dims: opts?.dims });\n const remaining = coverage.missing + coverage.stale;\n if (failure !== undefined) {\n return { status: \"unavailable\", embedded, remaining, reason: failure };\n }\n return { status: \"ok\", embedded, remaining };\n}\n\nasync function describeUnavailableReason(db: Database): Promise<string> {\n const cfg = await getProviderForRole(db, \"embedding\");\n if (!cfg.enabled) {\n return \"embedding role is disabled in settings (llm.enabled)\";\n }\n const endpoints = [cfg, ...(cfg.fallback ? [cfg.fallback] : [])];\n const online = await Promise.all(\n endpoints.map((endpoint) => isLlmOnline(endpoint.url)),\n );\n if (!online.some(Boolean)) {\n return `embedding endpoints offline (${endpoints.map((endpoint) => endpoint.url).join(\", \")})`;\n }\n return `no configured embedding model is available (${endpoints.map((endpoint) => endpoint.model).join(\", \")})`;\n}\n\nexport interface EmbedQueryResult {\n vector: number[];\n model: string;\n}\n\n/**\n * Embed a single query string. Returns null when the embedder is unavailable\n * OR on any network error — semantic search must never break search; callers\n * fall back to lexical-only results.\n */\nexport async function embedQuery(\n db: Database,\n text: string,\n): Promise<EmbedQueryResult | null> {\n const endpoint = await resolveUsableEmbeddingEndpoint(db);\n if (!endpoint) return null;\n\n try {\n const [vector] = await embedTexts(\n { url: endpoint.url, model: endpoint.model, apiKey: endpoint.apiKey },\n [embeddingTextForQuery(text, endpoint.model)],\n );\n return { vector, model: canonicalEmbeddingModelId(endpoint.model) };\n } catch {\n return null;\n }\n}\n\n/**\n * Identify existing tokens whose concepts/questions/domains are highly similar\n * to a new candidate token. Returns an empty array when the embedder is unavailable.\n */\nexport async function findPossibleDuplicates(\n db: Database,\n candidate: {\n concept: string;\n question?: string | null;\n domain?: string;\n title?: string | null;\n },\n embed: typeof embedQuery = embedQuery,\n): Promise<\n Array<{ slug: string; concept: string; title?: string; similarity: number }>\n> {\n const queryText = embeddingContentForToken({\n concept: candidate.concept,\n question: candidate.question ?? null,\n domain: candidate.domain ?? \"\",\n title: candidate.title ?? null,\n });\n\n const q = await embed(db, queryText);\n if (!q) {\n return [];\n }\n\n // Registration-time dedup must cover an upgraded or previously-offline DB,\n // not just the subset that already happened to have vectors. This exhaustive\n // pass is normally a no-op after the first successful semantic operation.\n // We use a bounded top-up strategy to keep registration latency low.\n const coverage = await getEmbeddingCoverage(db, q.model, {\n dims: q.vector.length,\n });\n const totalNeeding = coverage.missing + coverage.stale;\n if (totalNeeding > 0) {\n await ensureTokenEmbeddings(db, { limit: 100, dims: q.vector.length });\n if (totalNeeding > 100) {\n console.warn(\n `Warning: Duplicate check is incomplete. ${\n totalNeeding - 100\n } tokens are still missing embeddings. Run 'zam token reembed' to complete indexing.`,\n );\n }\n }\n\n const threshold = await resolveDedupThreshold(db);\n\n const hits = await searchTokensHybrid(db, queryText, {\n queryEmbedding: q.vector,\n model: q.model,\n limit: 1000,\n vectorTopK: 1000,\n });\n\n const results: Array<{\n slug: string;\n concept: string;\n title?: string;\n similarity: number;\n }> = [];\n for (const hit of hits) {\n if (hit.similarity !== null && hit.similarity >= threshold) {\n results.push({\n slug: hit.slug,\n concept: hit.concept,\n title: hit.title,\n similarity: hit.similarity,\n });\n }\n }\n\n return results;\n}\n\n/**\n * Resolve the dedup similarity threshold from settings with fallback.\n * Shared to avoid duplicating the parse + validate + default logic.\n */\nexport async function resolveDedupThreshold(db: Database): Promise<number> {\n const thresholdStr = await getSetting(db, \"search.dedup_threshold\");\n const parsed = thresholdStr ? Number.parseFloat(thresholdStr) : Number.NaN;\n // A malformed setting must not silently disable (NaN compares false) or\n // flood (negative) — fall back to the default.\n return Number.isFinite(parsed) && parsed > 0 && parsed <= 1 ? parsed : 0.85;\n}\n\n/**\n * Resolve the suggest-foundations min similarity from settings with fallback.\n * Used for the lower bound of the \"foundation band\" (distinct from dedup).\n */\nexport async function resolveSuggestMinSimilarity(\n db: Database,\n): Promise<number> {\n const minStr = await getSetting(db, \"search.suggest_min_similarity\");\n const parsed = minStr ? Number.parseFloat(minStr) : Number.NaN;\n return Number.isFinite(parsed) && parsed > 0 && parsed <= 1 ? parsed : 0.45;\n}\n","import type {\n BloomLevel,\n Database,\n KnowledgeContext,\n Rating,\n ReviewActionType,\n SymbiosisMode,\n SynthesisConfidence,\n Token,\n TokenPattern,\n UpdateTokenInput,\n} from \"../kernel/index.js\";\nimport {\n addPrerequisite,\n analyzeObservation,\n assignTokenToContext,\n buildReviewQueue,\n createToken,\n ensureCard,\n executeReviewAction,\n generateConceptFreeCue,\n generatePrompt,\n getCard,\n getCardById,\n getCardDeletionImpact,\n getDatabaseTargetInfo,\n getDisplayTitle,\n getDueCards,\n getSessionSummary,\n getSetting,\n getTokenById,\n getTokenBySlug,\n getTokenDeleteImpact,\n getUserStats,\n isObserverPolicyConfigured,\n endSession as kernelEndSession,\n startSession as kernelStartSession,\n suggestFoundations as kernelSuggestFoundations,\n logStep,\n monitorLogExists,\n OBSERVER_POLICY_UNSET_HINT,\n pairCommands,\n prepareSessionSynthesis,\n readMonitorLog,\n resolveReviewContext,\n searchTokensHybrid,\n updateCard,\n} from \"../kernel/index.js\";\nimport { resolveOperationKnowledgeContexts } from \"./knowledge-contexts.js\";\nimport { ensureHighQualityQuestion } from \"./llm/client.js\";\nimport {\n embedQuery,\n ensureTokenEmbeddings,\n findPossibleDuplicates,\n resolveDedupThreshold,\n resolveSuggestMinSimilarity,\n} from \"./llm/embedder.js\";\n\nconst BLOOM_VERBS: Record<BloomLevel, string> = {\n 1: \"Remember\",\n 2: \"Understand\",\n 3: \"Apply\",\n 4: \"Analyze\",\n 5: \"Synthesize\",\n};\n\nasync function resolveHandlerUser(\n db: Database,\n user?: string,\n): Promise<string> {\n if (user) return user;\n const stored = await getSetting(db, \"user.id\");\n if (stored) return stored;\n throw new Error(\n \"No user specified. Set a default with: zam whoami --set <id>\",\n );\n}\n\nfunction parseKnowledgeContextNames(value: unknown): string[] {\n if (value == null) return [];\n if (\n !Array.isArray(value) ||\n value.some((name) => typeof name !== \"string\" || !name.trim())\n ) {\n throw new Error(\n \"knowledgeContexts must be an array of non-empty context names\",\n );\n }\n return [...new Set(value.map((name) => name.trim()))];\n}\n\nasync function resolveKnowledgeContexts(\n db: Database,\n names: string[],\n): Promise<KnowledgeContext[]> {\n return await resolveOperationKnowledgeContexts(db, names);\n}\n\n// 1. checkDue\nexport interface CheckDueParams {\n user?: string;\n domain?: string;\n knowledgeContext?: string;\n}\n\nexport async function checkDue(db: Database, params: CheckDueParams) {\n const userId = await resolveHandlerUser(db, params.user);\n const dueCards = await getDueCards(\n db,\n userId,\n undefined,\n params.domain,\n params.knowledgeContext,\n );\n const domains = [\n ...new Set(dueCards.map((c) => c.domain).filter(Boolean)),\n ].sort();\n\n const stats = await getUserStats(db, userId);\n\n return {\n database: getDatabaseTargetInfo(),\n stats,\n userId,\n domain: params.domain ?? null,\n knowledgeContext: params.knowledgeContext ?? null,\n dueCount: dueCards.length,\n domains,\n cards: dueCards.map((c) => ({\n cardId: c.id,\n tokenId: c.token_id,\n slug: c.slug,\n concept: c.concept,\n domain: c.domain,\n bloomLevel: c.bloom_level,\n state: c.state,\n dueAt: c.due_at,\n })),\n };\n}\n\n// 2. getReview\nexport interface GetReviewParams {\n user?: string;\n noResolve?: boolean;\n noDynamicQuestion?: boolean;\n knowledgeContext?: string;\n}\n\nexport async function getReview(db: Database, params: GetReviewParams) {\n const userId = await resolveHandlerUser(db, params.user);\n const queue = await buildReviewQueue(db, {\n userId,\n maxReviews: 1,\n maxNew: 1,\n knowledgeContext: params.knowledgeContext || undefined,\n });\n\n if (queue.items.length === 0) {\n return {\n userId,\n hasReview: false,\n card: null,\n prompt: null,\n resolvedContext: null,\n queueSize: 0,\n };\n }\n\n const item = queue.items[0];\n const isLlmEnabled = (await getSetting(db, \"llm.enabled\")) === \"true\";\n\n let resolvedQuestion = item.question;\n let questionSource: \"llm\" | \"original\" = \"original\";\n let questionModel: string | undefined;\n\n if (isLlmEnabled && params.noDynamicQuestion !== true) {\n try {\n const healed = await ensureHighQualityQuestion(db, {\n id: item.tokenId,\n slug: item.slug,\n concept: item.concept,\n domain: item.domain,\n bloomLevel: item.bloomLevel as BloomLevel,\n sourceLink: item.sourceLink,\n question: item.question,\n });\n if (healed) {\n resolvedQuestion = healed.question;\n questionSource = healed.source;\n questionModel = healed.model;\n }\n } catch {\n // ignore\n }\n }\n\n const prompt = generatePrompt({\n cardId: item.cardId,\n tokenId: item.tokenId,\n slug: item.slug,\n concept: item.concept,\n domain: item.domain,\n bloomLevel: item.bloomLevel as BloomLevel,\n sourceLink: item.sourceLink,\n question: resolvedQuestion,\n });\n\n let resolvedContext = null;\n if (params.noResolve !== true) {\n try {\n resolvedContext = await resolveReviewContext(item.sourceLink);\n } catch {\n resolvedContext = null;\n }\n }\n\n const fullQueue = await buildReviewQueue(db, {\n userId,\n knowledgeContext: params.knowledgeContext || undefined,\n });\n\n return {\n userId,\n hasReview: true,\n card: item,\n prompt,\n questionSource,\n questionModel: questionModel ?? null,\n resolvedContext,\n queueSize: fullQueue.items.length,\n };\n}\n\n// 3. getReviewsBatch\nexport interface GetReviewsBatchParams {\n user?: string;\n domain?: string;\n knowledgeContext?: string;\n includeQuestions?: boolean;\n noResolve?: boolean;\n noDynamicQuestion?: boolean;\n}\n\nexport async function getReviewsBatch(\n db: Database,\n params: GetReviewsBatchParams,\n) {\n const userId = await resolveHandlerUser(db, params.user);\n const dueCards = await getDueCards(\n db,\n userId,\n undefined,\n params.domain,\n params.knowledgeContext,\n );\n\n const isLlmEnabled = (await getSetting(db, \"llm.enabled\")) === \"true\";\n\n const cards = [];\n for (const card of dueCards) {\n if (params.includeQuestions) {\n const token = await getTokenBySlug(db, card.slug);\n if (!token) {\n // Degrade gracefully\n cards.push({\n cardId: card.id,\n tokenId: card.token_id,\n slug: card.slug,\n concept: card.concept,\n domain: card.domain,\n bloomLevel: card.bloom_level,\n state: card.state,\n dueAt: card.due_at,\n });\n continue;\n }\n\n let resolvedQuestion = token.question;\n if (isLlmEnabled && params.noDynamicQuestion !== true) {\n try {\n const healed = await ensureHighQualityQuestion(db, {\n id: token.id,\n slug: token.slug,\n concept: token.concept,\n domain: token.domain,\n bloomLevel: token.bloom_level as BloomLevel,\n sourceLink: token.source_link,\n question: token.question,\n });\n if (healed) {\n resolvedQuestion = healed.question;\n }\n } catch {\n // ignore\n }\n }\n\n const finalQuestion = resolvedQuestion?.trim()\n ? resolvedQuestion.trim()\n : generateConceptFreeCue(\n token.bloom_level as BloomLevel,\n token.slug,\n token.domain,\n );\n\n let resolvedContext = null;\n if (params.noResolve !== true && token.source_link) {\n try {\n resolvedContext = await resolveReviewContext(token.source_link);\n } catch {\n resolvedContext = null;\n }\n }\n\n const bloom = (\n token.bloom_level >= 1 && token.bloom_level <= 5 ? token.bloom_level : 1\n ) as BloomLevel;\n\n cards.push({\n cardId: card.id,\n tokenId: card.token_id,\n slug: card.slug,\n concept: card.concept,\n domain: card.domain,\n bloomLevel: card.bloom_level,\n state: card.state,\n dueAt: card.due_at,\n bloomVerb: BLOOM_VERBS[bloom],\n question: finalQuestion,\n sourceLink: token.source_link ?? null,\n resolvedContext,\n });\n } else {\n cards.push({\n cardId: card.id,\n tokenId: card.token_id,\n slug: card.slug,\n concept: card.concept,\n domain: card.domain,\n bloomLevel: card.bloom_level,\n state: card.state,\n dueAt: card.due_at,\n });\n }\n }\n\n return { cards };\n}\n\n// 4. submitReview\nexport interface SubmitReviewParams {\n user?: string;\n cardId?: string;\n tokenId?: string;\n rating?: Rating;\n sessionId?: string;\n doneBy?: \"user\" | \"agent\";\n}\n\nexport async function submitReview(db: Database, params: SubmitReviewParams) {\n const userId = await resolveHandlerUser(db, params.user);\n if (\n params.doneBy !== undefined &&\n ![\"user\", \"agent\"].includes(params.doneBy)\n ) {\n throw new Error(\"doneBy must be user or agent\");\n }\n if (params.doneBy === \"agent\") {\n if (params.rating !== undefined) {\n throw new Error(\"Agent-completed steps must not include a rating\");\n }\n if (!params.sessionId) {\n throw new Error(\"sessionId is required for an agent-completed step\");\n }\n if (!params.cardId) {\n throw new Error(\"cardId is required for an agent-completed step\");\n }\n const card = await getCardById(db, params.cardId);\n if (!card) {\n throw new Error(`Card not found: ${params.cardId}`);\n }\n if (card.user_id !== userId) {\n throw new Error(\n `Card ${params.cardId} does not belong to user ${userId}`,\n );\n }\n await logStep(db, {\n session_id: params.sessionId,\n token_id: card.token_id,\n done_by: \"agent\",\n });\n return {\n success: true,\n rating: null,\n evaluation: null,\n blocked: null,\n recordedOnly: true,\n };\n }\n\n if (params.rating == null || params.rating < 1 || params.rating > 4) {\n throw new Error(\"Rating must be between 1 and 4\");\n }\n let cardId = params.cardId;\n if (!cardId) {\n if (!params.tokenId) {\n throw new Error(\"cardId or tokenId is required\");\n }\n const token = await getTokenById(db, params.tokenId);\n if (!token || token.deprecated_at) {\n throw new Error(`Active token not found: ${params.tokenId}`);\n }\n cardId = (await ensureCard(db, token.id, userId)).id;\n }\n\n const result = await executeReviewAction(db, {\n action: \"rate\",\n cardId,\n userId,\n rating: params.rating,\n });\n\n let stepError: string | undefined;\n if (params.sessionId) {\n try {\n await logStep(db, {\n session_id: params.sessionId,\n token_id: result.token.id,\n done_by: \"user\",\n rating: params.rating,\n });\n } catch (err) {\n stepError = (err as Error).message;\n }\n }\n\n return {\n success: true,\n rating: params.rating,\n evaluation: result.evaluation,\n blocked: result.blocked ?? null,\n ...(stepError ? { stepError } : {}),\n };\n}\n\n// 5. reviewAction\nexport interface ReviewActionParams {\n user?: string;\n cardId: string;\n action: ReviewActionType;\n rating?: Rating;\n concept?: string;\n domain?: string;\n bloomLevel?: number;\n context?: string;\n symbiosisMode?: string;\n sourceLink?: string;\n confirm?: boolean;\n}\n\nexport async function reviewAction(db: Database, params: ReviewActionParams) {\n const userId = await resolveHandlerUser(db, params.user);\n const action = params.action;\n\n const validActions: ReviewActionType[] = [\n \"rate\",\n \"skip\",\n \"edit-token\",\n \"deprecate-token\",\n \"delete-token\",\n \"delete-card\",\n \"stop\",\n ];\n if (!validActions.includes(action)) {\n throw new Error(`Unsupported action: ${action}`);\n }\n\n const target = (await db\n .prepare(\n `SELECT c.id AS card_id, c.token_id, c.user_id, t.slug\n FROM cards c\n JOIN tokens t ON t.id = c.token_id\n WHERE c.id = ?`,\n )\n .get(params.cardId)) as\n | { card_id: string; token_id: string; user_id: string; slug: string }\n | undefined;\n\n if (!target) {\n throw new Error(`Card not found: ${params.cardId}`);\n }\n if (target.user_id !== userId) {\n throw new Error(`Card ${params.cardId} does not belong to user ${userId}`);\n }\n\n if (\n (action === \"delete-token\" || action === \"delete-card\") &&\n !params.confirm\n ) {\n if (action === \"delete-token\") {\n return {\n success: true,\n action,\n preview: true,\n requiresConfirmation: true,\n token: { slug: target.slug, tokenId: target.token_id },\n impact: await getTokenDeleteImpact(db, target.slug),\n };\n }\n\n return {\n success: true,\n action,\n preview: true,\n requiresConfirmation: true,\n token: { slug: target.slug, tokenId: target.token_id },\n impact: await getCardDeletionImpact(db, target.token_id, userId),\n };\n }\n\n if (\n action === \"rate\" &&\n (params.rating == null || params.rating < 1 || params.rating > 4)\n ) {\n throw new Error(\"Rating must be between 1 and 4 for action=rate\");\n }\n\n let tokenUpdates: UpdateTokenInput | undefined;\n if (action === \"edit-token\") {\n tokenUpdates = {};\n if (params.concept !== undefined) tokenUpdates.concept = params.concept;\n if (params.domain !== undefined) tokenUpdates.domain = params.domain;\n if (params.bloomLevel !== undefined)\n tokenUpdates.bloom_level = params.bloomLevel as BloomLevel;\n if (params.context !== undefined) tokenUpdates.context = params.context;\n if (params.sourceLink !== undefined) {\n tokenUpdates.source_link =\n params.sourceLink === \"\" ? null : params.sourceLink;\n }\n if (params.symbiosisMode !== undefined) {\n const validModes = [\"shadowing\", \"copilot\", \"autonomy\", \"none\"];\n if (!validModes.includes(params.symbiosisMode)) {\n throw new Error(`Invalid mode: ${params.symbiosisMode}`);\n }\n tokenUpdates.symbiosis_mode =\n params.symbiosisMode === \"none\"\n ? null\n : (params.symbiosisMode as SymbiosisMode);\n }\n }\n\n const result = await executeReviewAction(db, {\n action,\n cardId: params.cardId,\n userId,\n rating: params.rating,\n tokenUpdates,\n });\n\n return {\n success: true,\n action,\n token: {\n slug: result.token.slug,\n tokenId: result.token.id,\n },\n rating: params.rating ?? null,\n evaluation: result.evaluation ?? null,\n blocked: result.blocked ?? null,\n updatedToken: result.updatedToken ?? null,\n deletedToken: result.deletedToken ?? null,\n deletedCard: result.deletedCard ?? null,\n skipped: result.skipped ?? false,\n stopped: result.stopped ?? false,\n };\n}\n\n// 6. addToken\nexport interface AddTokenParams {\n user?: string;\n slug: string;\n concept: string;\n title?: string;\n domain?: string;\n bloomLevel?: number;\n context?: string;\n symbiosisMode?: \"shadowing\" | \"copilot\" | \"autonomy\" | null;\n sourceLink?: string | null;\n question?: string | null;\n knowledgeContexts?: string[];\n knowledge_contexts?: string[];\n prerequisites?: string[];\n}\n\nexport async function addToken(db: Database, params: AddTokenParams) {\n const userId = await resolveHandlerUser(db, params.user);\n if (!params.slug.trim() || !params.concept.trim()) {\n throw new Error(\"slug and concept must be non-empty\");\n }\n if (\n params.bloomLevel !== undefined &&\n (!Number.isInteger(params.bloomLevel) ||\n params.bloomLevel < 1 ||\n params.bloomLevel > 5)\n ) {\n throw new Error(\"bloomLevel must be an integer between 1 and 5\");\n }\n\n const possibleDuplicates = await findPossibleDuplicates(db, {\n concept: params.concept,\n question: params.question ?? null,\n domain: params.domain,\n title: params.title ?? null,\n });\n\n const ctxNames = parseKnowledgeContextNames(\n params.knowledgeContexts ?? params.knowledge_contexts,\n );\n const assignedContexts = await resolveKnowledgeContexts(db, ctxNames);\n const prerequisiteSlugs = [\n ...new Set(\n (params.prerequisites ?? []).map((slug) => slug.trim()).filter(Boolean),\n ),\n ];\n const prerequisites: Token[] = [];\n for (const slug of prerequisiteSlugs) {\n const prerequisite = await getTokenBySlug(db, slug);\n if (!prerequisite) {\n throw new Error(`Prerequisite token not found: ${slug}`);\n }\n prerequisites.push(prerequisite);\n }\n\n const token = await createToken(db, {\n slug: params.slug,\n title: params.title,\n concept: params.concept,\n domain: params.domain,\n bloom_level: (params.bloomLevel ?? 1) as BloomLevel,\n context: params.context,\n symbiosis_mode: params.symbiosisMode,\n source_link: params.sourceLink ?? null,\n question: params.question ?? null,\n });\n\n for (const context of assignedContexts) {\n await assignTokenToContext(db, token.id, context.id);\n }\n\n for (const prerequisite of prerequisites) {\n await addPrerequisite(db, token.id, prerequisite.id);\n }\n\n const card = await ensureCard(db, token.id, userId);\n\n try {\n await ensureTokenEmbeddings(db, { limit: 8 });\n } catch {\n // ignore\n }\n\n return {\n success: true,\n token: {\n ...token,\n knowledgeContexts: assignedContexts.map((c) => ({\n name: c.name,\n label: c.label,\n language: c.language,\n })),\n prerequisites: prerequisites.map((prerequisite) => prerequisite.slug),\n },\n card: {\n id: card.id,\n tokenId: card.token_id,\n userId: card.user_id,\n state: card.state,\n dueAt: card.due_at,\n blocked: card.blocked,\n },\n possible_duplicates: possibleDuplicates,\n };\n}\n\n// 7. findTokens\nexport interface FindTokensParams {\n user?: string;\n context: string;\n limit?: number;\n}\n\nexport async function findTokens(db: Database, params: FindTokensParams) {\n const userId = await resolveHandlerUser(db, params.user);\n if (!params.context.trim()) {\n throw new Error(\"context must be non-empty\");\n }\n const truncatedContext = params.context.slice(0, 2000);\n\n const q = await embedQuery(db, truncatedContext);\n\n try {\n await ensureTokenEmbeddings(db, {\n limit: 32,\n dims: q?.vector.length,\n });\n } catch {\n // ignore\n }\n\n let limit = params.limit ?? 10;\n if (typeof limit !== \"number\" || limit <= 0 || !Number.isInteger(limit)) {\n limit = 10;\n }\n if (limit > 100) {\n limit = 100;\n }\n\n const results = await searchTokensHybrid(db, truncatedContext, {\n queryEmbedding: q?.vector,\n model: q?.model,\n limit,\n });\n\n const tokens = [];\n const contextMap = new Map<\n string,\n Array<{ name: string; label: string | null; language: string | null }>\n >();\n\n if (results.length > 0) {\n const ids = results.map((t) => t.id);\n const placeholders = ids.map(() => \"?\").join(\",\");\n const mappings = (await db\n .prepare(\n `SELECT tc.token_id, c.name, c.label, c.language\n FROM token_contexts tc\n INNER JOIN contexts c ON c.id = tc.context_id\n WHERE tc.token_id IN (${placeholders})`,\n )\n .all(...ids)) as Array<{\n token_id: string;\n name: string;\n label: string | null;\n language: string | null;\n }>;\n for (const m of mappings) {\n const list = contextMap.get(m.token_id) ?? [];\n list.push({ name: m.name, label: m.label, language: m.language });\n contextMap.set(m.token_id, list);\n }\n }\n\n for (const t of results) {\n const card = await getCard(db, t.id, userId);\n tokens.push({\n slug: t.slug,\n title: t.title,\n display_title: getDisplayTitle(t),\n concept: t.concept,\n domain: t.domain,\n bloom_level: t.bloom_level,\n score: t.score,\n similarity: t.similarity,\n knowledgeContexts: contextMap.get(t.id) ?? [],\n card: card\n ? {\n state: card.state,\n due_at: card.due_at,\n blocked: card.blocked,\n }\n : null,\n });\n }\n\n return {\n semantic: q !== null,\n tokens,\n };\n}\n\n// 8. suggestFoundations\nexport interface SuggestFoundationsParams {\n user?: string;\n slug?: string;\n concept?: string;\n question?: string;\n domain?: string;\n title?: string;\n bloom_level?: number;\n limit?: number;\n}\n\nexport async function suggestFoundations(\n db: Database,\n params: SuggestFoundationsParams,\n) {\n let queryText = \"\";\n let targetTokenId: string | undefined;\n let targetBloomLevel: BloomLevel | undefined;\n let targetJson: { slug: string } | null = null;\n\n if (params.slug !== undefined) {\n if (typeof params.slug !== \"string\" || params.slug.trim() === \"\") {\n throw new Error(\"Invalid slug\");\n }\n const token = await getTokenBySlug(db, params.slug);\n if (!token) {\n throw new Error(`Token not found: ${params.slug}`);\n }\n const { embeddingContentForToken: getContent } = await import(\n \"../kernel/index.js\"\n );\n queryText = getContent(token);\n targetTokenId = token.id;\n targetBloomLevel = token.bloom_level;\n targetJson = { slug: token.slug };\n } else {\n if (\n !params.concept ||\n typeof params.concept !== \"string\" ||\n params.concept.trim() === \"\"\n ) {\n throw new Error(\n \"JSON must include a non-empty 'slug' or 'concept' field\",\n );\n }\n const { embeddingContentForToken: getContent } = await import(\n \"../kernel/index.js\"\n );\n queryText = getContent({\n concept: params.concept,\n question: typeof params.question === \"string\" ? params.question : null,\n domain: typeof params.domain === \"string\" ? params.domain : \"\",\n title: typeof params.title === \"string\" ? params.title : null,\n });\n if (params.bloom_level !== undefined) {\n if (\n typeof params.bloom_level !== \"number\" ||\n !Number.isInteger(params.bloom_level) ||\n params.bloom_level < 1 ||\n params.bloom_level > 5\n ) {\n throw new Error(\"bloom_level must be an integer between 1 and 5\");\n }\n targetBloomLevel = params.bloom_level as BloomLevel;\n }\n }\n\n let limit = params.limit ?? 5;\n if (typeof limit !== \"number\" || limit <= 0 || !Number.isInteger(limit)) {\n limit = 5;\n }\n if (limit > 20) {\n limit = 20;\n }\n\n const q = await embedQuery(db, queryText);\n if (q === null) {\n return {\n semantic: false,\n target: targetJson,\n suggestions: [],\n };\n }\n\n try {\n await ensureTokenEmbeddings(db, {\n limit: 100,\n dims: q.vector.length,\n });\n } catch {\n // ignore\n }\n\n const maxSimilarity = await resolveDedupThreshold(db);\n const minSimilarity = await resolveSuggestMinSimilarity(db);\n if (minSimilarity >= maxSimilarity) {\n return {\n semantic: true,\n target: targetJson,\n suggestions: [],\n };\n }\n\n const suggestions = await kernelSuggestFoundations(db, {\n queryEmbedding: q.vector,\n model: q.model,\n targetTokenId,\n targetBloomLevel,\n limit,\n minSimilarity,\n maxSimilarity,\n });\n\n return {\n semantic: true,\n target: targetJson,\n suggestions: suggestions.map((s) => ({\n slug: s.token.slug,\n concept: s.token.concept,\n domain: s.token.domain,\n bloom_level: s.token.bloom_level,\n similarity: s.similarity,\n already_prerequisite: s.alreadyPrerequisite,\n would_create_cycle: s.wouldCreateCycle,\n bloom_above_target: s.bloomAboveTarget,\n })),\n };\n}\n\n// 9. linkPrereq\nexport interface LinkPrereqParams {\n token: string;\n requires: string;\n blockUser?: string;\n}\n\nexport async function linkPrereq(db: Database, params: LinkPrereqParams) {\n if (!params.token.trim() || !params.requires.trim()) {\n throw new Error(\"token and requires must be non-empty slugs\");\n }\n const token = await getTokenBySlug(db, params.token);\n if (!token) {\n throw new Error(`Token not found: ${params.token}`);\n }\n const requires = await getTokenBySlug(db, params.requires);\n if (!requires) {\n throw new Error(`Prerequisite token not found: ${params.requires}`);\n }\n\n await addPrerequisite(db, token.id, requires.id);\n\n let blockedCardId: string | undefined;\n if (params.blockUser) {\n const card = await getCard(db, token.id, params.blockUser);\n if (card) {\n await updateCard(db, card.id, { blocked: 1 });\n blockedCardId = card.id;\n }\n }\n\n return {\n success: true,\n token: params.token,\n requires: params.requires,\n ...(blockedCardId ? { blockedCardId } : {}),\n };\n}\n\n// 10. startSession / endSession\nexport interface StartSessionParams {\n user?: string;\n task: string;\n context?: \"shell\" | \"ui\" | \"reallife\";\n}\n\nexport async function startSession(db: Database, params: StartSessionParams) {\n if (!params.task.trim()) {\n throw new Error(\"task must be non-empty\");\n }\n const context = params.context ?? \"shell\";\n if (![\"shell\", \"ui\", \"reallife\"].includes(context)) {\n throw new Error(\"context must be shell, ui, or reallife\");\n }\n\n const userId = await resolveHandlerUser(db, params.user);\n const session = await kernelStartSession(db, {\n user_id: userId,\n task: params.task,\n execution_context: context,\n });\n\n const observerPolicyHint =\n context === \"ui\" && !(await isObserverPolicyConfigured(db))\n ? OBSERVER_POLICY_UNSET_HINT\n : undefined;\n\n return {\n id: session.id,\n userId: session.user_id,\n task: session.task,\n executionContext: session.execution_context,\n startedAt: session.started_at,\n completedAt: session.completed_at,\n ...(observerPolicyHint ? { observerPolicyHint } : {}),\n };\n}\n\nexport interface EndSessionParams {\n session: string;\n synthesize?: boolean;\n patterns?: TokenPattern[];\n minConfidence?: SynthesisConfidence;\n}\n\nexport async function endSession(db: Database, params: EndSessionParams) {\n const synthesisPreview = params.synthesize\n ? await prepareSessionSynthesis(db, {\n sessionId: params.session,\n explicitPatterns: params.patterns,\n minConfidence: params.minConfidence ?? \"medium\",\n })\n : undefined;\n const synthesis = synthesisPreview\n ? {\n ...synthesisPreview,\n candidates: await Promise.all(\n synthesisPreview.candidates.map(async (candidate) => ({\n ...candidate,\n cardId:\n (await getCard(db, candidate.tokenId, synthesisPreview.userId))\n ?.id ?? null,\n })),\n ),\n }\n : undefined;\n const session = await kernelEndSession(db, params.session);\n const summary = await getSessionSummary(db, params.session);\n return {\n id: session.id,\n userId: session.user_id,\n task: session.task,\n executionContext: session.execution_context,\n startedAt: session.started_at,\n completedAt: session.completed_at,\n summary,\n ...(synthesis ? { synthesis } : {}),\n };\n}\n\n// 11. getMonitor / analyzeMonitor\nexport interface GetMonitorParams {\n session: string;\n}\n\nexport async function getMonitor(_db: Database, params: GetMonitorParams) {\n if (!monitorLogExists(params.session)) {\n return {\n sessionId: params.session,\n exists: false,\n commands: [],\n timeSpan: null,\n };\n }\n\n const events = readMonitorLog(params.session);\n const commands = pairCommands(events);\n\n let timeSpan: { start: string; end: string; durationMs: number } | null =\n null;\n if (commands.length > 0) {\n const first = commands[0];\n const last = commands[commands.length - 1];\n const endTs = last.endedAt ?? last.startedAt;\n timeSpan = {\n start: first.startedAt,\n end: endTs,\n durationMs:\n new Date(endTs).getTime() - new Date(first.startedAt).getTime(),\n };\n }\n\n return {\n sessionId: params.session,\n exists: true,\n commands: commands.map((c) => ({\n seq: c.seq,\n command: c.command,\n cwd: c.cwd,\n startedAt: c.startedAt,\n endedAt: c.endedAt,\n durationMs: c.durationMs,\n exitCode: c.exitCode,\n })),\n timeSpan,\n };\n}\n\nexport interface AnalyzeMonitorParams {\n session: string;\n patterns: TokenPattern[];\n}\n\nexport async function analyzeMonitor(\n _db: Database,\n params: AnalyzeMonitorParams,\n) {\n if (!monitorLogExists(params.session)) {\n return {\n sessionId: params.session,\n ratings: [],\n unmatchedCommands: [],\n timeSpan: null,\n };\n }\n\n const events = readMonitorLog(params.session);\n const commands = pairCommands(events);\n const result = analyzeObservation(commands, params.patterns);\n\n return {\n sessionId: params.session,\n ...result,\n };\n}\n\n// 12. sessionOpen\nexport interface SessionOpenParams {\n user?: string;\n task: string;\n context?: \"shell\" | \"ui\" | \"reallife\";\n}\n\nexport async function sessionOpen(db: Database, params: SessionOpenParams) {\n const sessionResult = await startSession(db, params);\n const checkDueResult = await checkDue(db, { user: params.user });\n const findTokensResult = await findTokens(db, {\n user: params.user,\n context: params.task,\n limit: 10,\n });\n\n return {\n session: {\n id: sessionResult.id,\n userId: sessionResult.userId,\n task: sessionResult.task,\n executionContext: sessionResult.executionContext,\n startedAt: sessionResult.startedAt,\n completedAt: sessionResult.completedAt,\n },\n due: {\n dueCount: checkDueResult.dueCount,\n domains: checkDueResult.domains,\n cards: checkDueResult.cards,\n },\n relevant: findTokensResult,\n };\n}\n","/**\n * Persists the learner's last navigated curriculum path so a reopened\n * wizard can show it first and jump straight back to the right level,\n * instead of re-navigating all steps from scratch (ADR 2026-07-02,\n * resolved decision 6). Backed by the existing settings/user_config store.\n */\n\nimport { type Database, getSetting, setSetting } from \"../../kernel/index.js\";\nimport type { CurriculumSelection } from \"./types.js\";\n\nconst LAST_SELECTION_KEY = \"curriculum.lastSelection\";\n\nexport interface CurriculumBreadcrumb extends CurriculumSelection {\n providerId: string;\n}\n\nexport async function getLastCurriculumSelection(\n db: Database,\n): Promise<CurriculumBreadcrumb | undefined> {\n const raw = await getSetting(db, LAST_SELECTION_KEY);\n if (!raw) return undefined;\n try {\n return JSON.parse(raw) as CurriculumBreadcrumb;\n } catch {\n return undefined;\n }\n}\n\nexport async function setLastCurriculumSelection(\n db: Database,\n breadcrumb: CurriculumBreadcrumb,\n): Promise<void> {\n await setSetting(db, LAST_SELECTION_KEY, JSON.stringify(breadcrumb));\n}\n","import type { TaxonomyNode } from \"../../types.js\";\n\ninterface ManifestTopic extends TaxonomyNode {\n hours?: number;\n}\n\nexport interface BildungsplanBremenManifest {\n schoolYear: string;\n capturedOn: string;\n sourceRevision: string;\n schoolTypes: TaxonomyNode[];\n grades: Record<string, string[]>;\n subjects: Record<string, TaxonomyNode[]>;\n tracks: Record<string, TaxonomyNode[]>;\n topics: Record<string, ManifestTopic[]>;\n contentUrls: Record<string, string>;\n}\n\nexport const BILDUNGSPLAN_BREMEN_MANIFEST: BildungsplanBremenManifest = {\n schoolYear: \"2025/2026\",\n capturedOn: \"2026-07-02\",\n sourceRevision: \"Bildungspläne Bremen\",\n\n schoolTypes: [\n { id: \"oberschule\", label: \"Oberschule\" },\n { id: \"gymnasium\", label: \"Gymnasium\" },\n ],\n\n grades: {\n oberschule: [\"7\", \"8\", \"9\", \"10\"],\n gymnasium: [\"7\", \"8\", \"9\", \"10\"],\n },\n\n subjects: {\n oberschule: [\n { id: \"mathematik\", label: \"Mathematik\" },\n { id: \"informatik\", label: \"Informatik\" },\n { id: \"physik\", label: \"Physik\" },\n { id: \"chemie\", label: \"Chemie\" },\n { id: \"biologie\", label: \"Biologie\" },\n ],\n gymnasium: [\n { id: \"mathematik\", label: \"Mathematik\" },\n { id: \"informatik\", label: \"Informatik\" },\n { id: \"physik\", label: \"Physik\" },\n { id: \"chemie\", label: \"Chemie\" },\n { id: \"biologie\", label: \"Biologie\" },\n ],\n },\n\n tracks: {},\n\n topics: {\n \"oberschule|10|mathematik\": [\n { id: \"funktionen\", label: \"Funktionen\" },\n { id: \"geometrie\", label: \"Geometrie\" },\n ],\n \"gymnasium|10|mathematik\": [{ id: \"analysis\", label: \"Analysis\" }],\n \"oberschule|9|informatik\": [{ id: \"algorithmen\", label: \"Algorithmen\" }],\n \"oberschule|9|physik\": [{ id: \"mechanik\", label: \"Mechanik\" }],\n \"oberschule|9|chemie\": [\n { id: \"reaktionen\", label: \"Chemische Reaktionen\" },\n ],\n \"oberschule|9|biologie\": [{ id: \"zellen\", label: \"Zellen\" }],\n \"gymnasium|9|physik\": [{ id: \"elektrizitaet\", label: \"Elektrizität\" }],\n \"gymnasium|9|chemie\": [{ id: \"bindungen\", label: \"Chemische Bindungen\" }],\n \"gymnasium|9|biologie\": [{ id: \"genetik\", label: \"Genetik\" }],\n },\n\n contentUrls: {\n \"oberschule|10|mathematik\":\n \"https://www.lis.bremen.de/schulqualitaet/bildungsplaene-21942\",\n \"gymnasium|10|mathematik\":\n \"https://www.lis.bremen.de/schulqualitaet/bildungsplaene-21942\",\n \"oberschule|9|informatik\":\n \"https://www.lis.bremen.de/schulqualitaet/bildungsplaene-21942\",\n \"oberschule|9|physik\":\n \"https://www.lis.bremen.de/schulqualitaet/bildungsplaene-21942\",\n \"oberschule|9|chemie\":\n \"https://www.lis.bremen.de/schulqualitaet/bildungsplaene-21942\",\n \"oberschule|9|biologie\":\n \"https://www.lis.bremen.de/schulqualitaet/bildungsplaene-21942\",\n \"gymnasium|9|physik\":\n \"https://www.lis.bremen.de/schulqualitaet/bildungsplaene-21942\",\n \"gymnasium|9|chemie\":\n \"https://www.lis.bremen.de/schulqualitaet/bildungsplaene-21942\",\n \"gymnasium|9|biologie\":\n \"https://www.lis.bremen.de/schulqualitaet/bildungsplaene-21942\",\n },\n};\n","import type { CurriculumProvider } from \"../../types.js\";\nimport { BILDUNGSPLAN_BREMEN_MANIFEST as MANIFEST } from \"./manifest.js\";\n\nexport const bildungsplanBremenProvider: CurriculumProvider = {\n id: \"bildungsplan-bremen\",\n country: \"DE\",\n countryLabel: \"Deutschland\",\n region: \"HB\",\n regionLabel: \"Bremen\",\n label: \"Bildungsplan (Bremen)\",\n\n listSchoolTypes() {\n return MANIFEST.schoolTypes;\n },\n\n listGrades(schoolType) {\n return (MANIFEST.grades[schoolType] || []).map((id) => ({\n id,\n label: `Klasse ${id}`,\n }));\n },\n\n listSubjects(schoolType, _grade) {\n return MANIFEST.subjects[schoolType] || [];\n },\n\n listTracks(schoolType, grade, subject) {\n const key = `${schoolType}|${grade}|${subject}`;\n return MANIFEST.tracks[key] || [];\n },\n\n listTopics(selection) {\n const key = selection.track\n ? `${selection.schoolType}|${selection.grade}|${selection.subject}|${selection.track}`\n : `${selection.schoolType}|${selection.grade}|${selection.subject}`;\n const list = MANIFEST.topics[key] || [];\n return list.map((t) => ({\n ...t,\n sourceRef: key,\n }));\n },\n\n resolveTopic(topic) {\n const uri = MANIFEST.contentUrls[topic.sourceRef];\n if (!uri) {\n throw new Error(\n `Bildungsplan Bremen: no resolvable source URL for topic \"${topic.id}\" (${topic.sourceRef}).`,\n );\n }\n return {\n provider: \"bildungsplan-bremen\",\n topicId: `${topic.sourceRef}#${topic.id}`,\n uri,\n };\n },\n\n extractTopics(html, topicIds) {\n const results: Record<string, string> = {};\n const headingMatches = Array.from(\n html.matchAll(/<h[1-6][^>]*>([\\s\\S]*?)<\\/h[1-6]>/gi),\n );\n\n const sections: Array<{ header: string; content: string }> = [];\n for (const m of headingMatches) {\n const headerText = cleanHtmlText(m[1]).trim();\n const start = m.index! + m[0].length;\n const nextHeading = html.indexOf(\"<h\", start);\n const rawContent =\n nextHeading > -1\n ? html.slice(start, nextHeading)\n : html.slice(start, start + 1500);\n const content = cleanHtmlText(rawContent).slice(0, 1500);\n if (headerText) sections.push({ header: headerText, content });\n }\n\n for (const topicId of topicIds) {\n const hashIdx = topicId.indexOf(\"#\");\n if (hashIdx === -1) continue;\n const key = topicId.substring(0, hashIdx);\n const shortId = topicId.substring(hashIdx + 1);\n\n const list = MANIFEST.topics[key] ?? [];\n const match = list.find((t) => t.id === shortId);\n if (!match) continue;\n\n const label = match.label;\n const normalizedLabel = normalizeForComparison(label);\n\n let section = sections.find(\n (s) =>\n normalizeForComparison(s.header).includes(normalizedLabel) ||\n s.header.toLowerCase().includes(shortId.toLowerCase()),\n );\n\n if (!section && sections.length > 0) {\n section = sections.find((s) => s.content.length > 80) || sections[0];\n }\n\n if (section) {\n results[topicId] = `${label}\\n\\n${section.content}`.trim();\n } else {\n results[topicId] = label;\n }\n }\n\n return results;\n },\n};\n\nfunction cleanHtmlText(html: string): string {\n let text = html.replace(\n /<(head|script|style|svg)[^>]*>[\\s\\S]*?<\\/\\1>/gi,\n \" \",\n );\n text = text.replace(/<h[1-6][^>]*>([\\s\\S]*?)<\\/h[1-6]>/gi, \"\\n\\n$1\\n\\n\");\n text = text.replace(/<li[^>]*>/gi, \"\\n- \");\n text = text.replace(/<p[^>]*>/gi, \"\\n\");\n text = text.replace(/<br\\s*\\/?>/gi, \"\\n\");\n text = text.replace(/<[^>]+>/g, \" \");\n text = text\n .replace(/ /g, \" \")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\");\n return text\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .join(\"\\n\");\n}\n\nfunction normalizeForComparison(str: string): string {\n return str\n .toLowerCase()\n .replace(/ä/g, \"ae\")\n .replace(/ö/g, \"oe\")\n .replace(/ü/g, \"ue\")\n .replace(/ß/g, \"ss\")\n .replace(/&[a-z0-9#]+;/gi, \"\")\n .replace(/[^a-z0-9]/gi, \"\");\n}\n","import type { TaxonomyNode } from \"../../types.js\";\n\ninterface ManifestTopic extends TaxonomyNode {\n hours?: number;\n}\n\nexport interface BildungsplanBwManifest {\n schoolYear: string;\n capturedOn: string;\n sourceRevision: string;\n schoolTypes: TaxonomyNode[];\n grades: Record<string, string[]>;\n subjects: Record<string, TaxonomyNode[]>;\n tracks: Record<string, TaxonomyNode[]>;\n topics: Record<string, ManifestTopic[]>;\n contentUrls: Record<string, string>;\n}\n\nexport const BILDUNGSPLAN_BW_MANIFEST: BildungsplanBwManifest = {\n schoolYear: \"2026/2027\",\n capturedOn: \"2026-07-02\",\n sourceRevision: \"Bildungsplan Baden-Württemberg Gymnasium 2016\",\n\n schoolTypes: [{ id: \"gymnasium\", label: \"Gymnasium\" }],\n\n grades: {\n gymnasium: [\"9\", \"10\", \"11\", \"12\"],\n },\n\n subjects: {\n gymnasium: [\n { id: \"mathematik\", label: \"Mathematik\" },\n { id: \"informatik\", label: \"Informatik\" },\n { id: \"physik\", label: \"Physik\" },\n { id: \"chemie\", label: \"Chemie\" },\n { id: \"biologie\", label: \"Biologie\" },\n ],\n },\n\n tracks: {},\n\n topics: {\n \"gymnasium|10|mathematik\": [\n { id: \"leitidee-zahl\", label: \"Leitidee Zahl - Variable - Operation\" },\n { id: \"leitidee-messung\", label: \"Leitidee Messen\" },\n { id: \"leitidee-raum\", label: \"Leitidee Raum und Form\" },\n { id: \"leitidee-funktion\", label: \"Leitidee Funktionaler Zusammenhang\" },\n { id: \"leitidee-daten\", label: \"Leitidee Daten und Zufall\" },\n ],\n \"gymnasium|10|informatik\": [\n { id: \"ik-daten-codierung\", label: \"Daten und Codierung\" },\n { id: \"ik-algorithmen\", label: \"Algorithmen\" },\n { id: \"ik-rechner-netze\", label: \"Rechner und Netze\" },\n {\n id: \"ik-informationsgesellschaft\",\n label: \"Informationsgesellschaft und Datensicherheit\",\n },\n ],\n \"gymnasium|10|physik\": [\n { id: \"optik-akustik\", label: \"Optik und Akustik\" },\n { id: \"mechanik\", label: \"Mechanik\" },\n {\n id: \"elektrizitaet-magnetismus\",\n label: \"Elektrizität und Magnetismus\",\n },\n { id: \"energie-waerme\", label: \"Energie und Wärmelehre\" },\n ],\n \"gymnasium|10|chemie\": [\n { id: \"stoffe-reaktionen\", label: \"Stoffe und chemische Reaktionen\" },\n { id: \"atome-molekuele\", label: \"Atome und Moleküle\" },\n { id: \"saeuren-basen\", label: \"Säuren, Basen und Salze\" },\n { id: \"organische-chemie\", label: \"Organische Chemie\" },\n ],\n \"gymnasium|10|biologie\": [\n { id: \"zellen\", label: \"Zellen und Gewebe\" },\n { id: \"genetik\", label: \"Genetik und Vererbung\" },\n { id: \"oekologie\", label: \"Ökologie und Umwelt\" },\n { id: \"evolution\", label: \"Evolution und Vielfalt\" },\n ],\n },\n\n contentUrls: {\n \"gymnasium|10|mathematik\":\n \"http://www.bildungsplaene-bw.de/,Lde/LS/BP2016BW/ALLG/GYM/M/bp/klasse-10\",\n \"gymnasium|10|informatik\":\n \"https://www.bildungsplaene-bw.de/,Lde/BP2016BW_ALLG_SEK1_INFWF\",\n \"gymnasium|10|physik\":\n \"https://www.bildungsplaene-bw.de/,Lde/BP2016BW_ALLG_GYM_PH\",\n \"gymnasium|10|chemie\":\n \"https://www.bildungsplaene-bw.de/,Lde/BP2016BW_ALLG_GYM_CH\",\n \"gymnasium|10|biologie\":\n \"https://www.bildungsplaene-bw.de/,Lde/BP2016BW_ALLG_GYM_BIO\",\n },\n};\n","import type { CurriculumProvider } from \"../../types.js\";\nimport { BILDUNGSPLAN_BW_MANIFEST as MANIFEST } from \"./manifest.js\";\n\nexport const bildungsplanBwProvider: CurriculumProvider = {\n id: \"bildungsplan-bw\",\n country: \"DE\",\n countryLabel: \"Deutschland\",\n region: \"BW\",\n regionLabel: \"Baden-Württemberg\",\n label: \"Bildungsplan (Baden-Württemberg)\",\n\n listSchoolTypes() {\n return MANIFEST.schoolTypes;\n },\n\n listGrades(schoolType) {\n return (MANIFEST.grades[schoolType] || []).map((id) => ({\n id,\n label: `Klasse ${id}`,\n }));\n },\n\n listSubjects(schoolType, _grade) {\n return MANIFEST.subjects[schoolType] || [];\n },\n\n listTracks(schoolType, grade, subject) {\n const key = `${schoolType}|${grade}|${subject}`;\n return MANIFEST.tracks[key] || [];\n },\n\n listTopics(selection) {\n const key = selection.track\n ? `${selection.schoolType}|${selection.grade}|${selection.subject}|${selection.track}`\n : `${selection.schoolType}|${selection.grade}|${selection.subject}`;\n const list = MANIFEST.topics[key] || [];\n return list.map((t) => ({\n ...t,\n sourceRef: key,\n }));\n },\n\n resolveTopic(topic) {\n const uri = MANIFEST.contentUrls[topic.sourceRef];\n if (!uri) {\n throw new Error(\n `Bildungsplan Baden-Württemberg: no resolvable source URL for topic \"${topic.id}\" (${topic.sourceRef}).`,\n );\n }\n return {\n provider: \"bildungsplan-bw\",\n topicId: `${topic.sourceRef}#${topic.id}`,\n uri,\n };\n },\n\n extractTopics(html, topicIds) {\n const chunks = html.split('<div class=\"bp-topic-block\" id=\"bp_topic_');\n const sections: Array<{\n id: string;\n headerText: string;\n contentHtml: string;\n }> = [];\n\n for (let i = 1; i < chunks.length; i++) {\n const chunk = chunks[i];\n const quoteIdx = chunk.indexOf('\"');\n if (quoteIdx === -1) continue;\n const id = chunk.slice(0, quoteIdx);\n\n const contentHtml = chunk.slice(quoteIdx + 1);\n const headerMatch = contentHtml.match(\n /<h[1-6][^>]*>([\\s\\S]*?)<\\/h[1-6]>/i,\n );\n const headerText = headerMatch\n ? cleanHtmlText(headerMatch[1]).trim()\n : \"\";\n\n sections.push({\n id,\n headerText,\n contentHtml,\n });\n }\n\n const results: Record<string, string> = {};\n\n for (const topicId of topicIds) {\n const hashIdx = topicId.indexOf(\"#\");\n if (hashIdx === -1) continue;\n const key = topicId.substring(0, hashIdx);\n const shortId = topicId.substring(hashIdx + 1);\n\n const list = MANIFEST.topics[key] ?? [];\n const match = list.find((t) => t.id === shortId);\n if (!match) continue;\n\n const label = match.label;\n const normalizedLabel = normalizeForComparison(label);\n\n const sectionIndex = sections.findIndex((s) => {\n const normalizedHeader = normalizeForComparison(s.headerText);\n return normalizedHeader.includes(normalizedLabel) || s.id === shortId;\n });\n\n if (sectionIndex === -1) {\n continue;\n }\n\n results[topicId] = cleanHtmlText(sections[sectionIndex].contentHtml);\n }\n\n return results;\n },\n};\n\nfunction cleanHtmlText(html: string): string {\n let text = html.replace(\n /<(head|script|style|svg)[^>]*>[\\s\\S]*?<\\/\\1>/gi,\n \" \",\n );\n text = text.replace(/<h[1-6][^>]*>([\\s\\S]*?)<\\/h[1-6]>/gi, \"\\n\\n$1\\n\\n\");\n text = text.replace(/<li[^>]*>/gi, \"\\n- \");\n text = text.replace(/<p[^>]*>/gi, \"\\n\");\n text = text.replace(/<br\\s*\\/?>/gi, \"\\n\");\n text = text.replace(/<[^>]+>/g, \" \");\n text = text\n .replace(/ /g, \" \")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/–/g, \"–\")\n .replace(/—/g, \"—\")\n .replace(/·/g, \"·\");\n return text\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .join(\"\\n\");\n}\n\nfunction normalizeForComparison(str: string): string {\n return str\n .toLowerCase()\n .replace(/ä/g, \"ae\")\n .replace(/ö/g, \"oe\")\n .replace(/ü/g, \"ue\")\n .replace(/ß/g, \"ss\")\n .replace(/&[a-z0-9#]+;/gi, \"\")\n .replace(/[^a-z0-9]/gi, \"\");\n}\n","import type { TaxonomyNode } from \"../../types.js\";\n\ninterface ManifestTopic extends TaxonomyNode {\n hours?: number;\n}\n\nexport interface BildungsplanHamburgManifest {\n schoolYear: string;\n capturedOn: string;\n sourceRevision: string;\n schoolTypes: TaxonomyNode[];\n grades: Record<string, string[]>;\n subjects: Record<string, TaxonomyNode[]>;\n tracks: Record<string, TaxonomyNode[]>;\n topics: Record<string, ManifestTopic[]>;\n contentUrls: Record<string, string>;\n}\n\nexport const BILDUNGSPLAN_HAMBURG_MANIFEST: BildungsplanHamburgManifest = {\n schoolYear: \"2025/2026\",\n capturedOn: \"2026-07-02\",\n sourceRevision: \"Bildungspläne Hamburg\",\n\n schoolTypes: [\n { id: \"stadtteilschule\", label: \"Stadtteilschule (Realschule)\" },\n { id: \"gymnasium\", label: \"Gymnasium\" },\n ],\n\n grades: {\n stadtteilschule: [\"7\", \"8\", \"9\", \"10\"],\n gymnasium: [\"7\", \"8\", \"9\", \"10\"],\n },\n\n subjects: {\n stadtteilschule: [\n { id: \"mathematik\", label: \"Mathematik\" },\n { id: \"informatik\", label: \"Informatik\" },\n { id: \"physik\", label: \"Physik\" },\n { id: \"chemie\", label: \"Chemie\" },\n { id: \"biologie\", label: \"Biologie\" },\n ],\n gymnasium: [\n { id: \"mathematik\", label: \"Mathematik\" },\n { id: \"informatik\", label: \"Informatik\" },\n { id: \"physik\", label: \"Physik\" },\n { id: \"chemie\", label: \"Chemie\" },\n { id: \"biologie\", label: \"Biologie\" },\n ],\n },\n\n tracks: {},\n\n topics: {\n \"stadtteilschule|10|mathematik\": [\n { id: \"funktionen\", label: \"Funktionen\" },\n { id: \"geometrie\", label: \"Geometrie\" },\n ],\n \"gymnasium|10|mathematik\": [{ id: \"analysis\", label: \"Analysis\" }],\n \"stadtteilschule|9|physik\": [{ id: \"mechanik\", label: \"Mechanik\" }],\n \"stadtteilschule|9|chemie\": [{ id: \"reaktionen\", label: \"Reaktionen\" }],\n \"stadtteilschule|9|biologie\": [{ id: \"zellen\", label: \"Zellen\" }],\n \"gymnasium|9|physik\": [{ id: \"elektrizitaet\", label: \"Elektrizität\" }],\n \"gymnasium|9|chemie\": [{ id: \"bindungen\", label: \"Bindungen\" }],\n \"gymnasium|9|biologie\": [{ id: \"genetik\", label: \"Genetik\" }],\n },\n\n contentUrls: {\n \"stadtteilschule|10|mathematik\": \"https://www.hamburg.de/bildungsplaene\",\n \"gymnasium|10|mathematik\": \"https://www.hamburg.de/bildungsplaene\",\n \"stadtteilschule|9|physik\": \"https://www.hamburg.de/bildungsplaene\",\n \"stadtteilschule|9|chemie\": \"https://www.hamburg.de/bildungsplaene\",\n \"stadtteilschule|9|biologie\": \"https://www.hamburg.de/bildungsplaene\",\n \"gymnasium|9|physik\": \"https://www.hamburg.de/bildungsplaene\",\n \"gymnasium|9|chemie\": \"https://www.hamburg.de/bildungsplaene\",\n \"gymnasium|9|biologie\": \"https://www.hamburg.de/bildungsplaene\",\n },\n};\n","import type { CurriculumProvider } from \"../../types.js\";\nimport { BILDUNGSPLAN_HAMBURG_MANIFEST as MANIFEST } from \"./manifest.js\";\n\nexport const bildungsplanHamburgProvider: CurriculumProvider = {\n id: \"bildungsplan-hamburg\",\n country: \"DE\",\n countryLabel: \"Deutschland\",\n region: \"HH\",\n regionLabel: \"Hamburg\",\n label: \"Bildungsplan (Hamburg)\",\n\n listSchoolTypes() {\n return MANIFEST.schoolTypes;\n },\n\n listGrades(schoolType) {\n return (MANIFEST.grades[schoolType] || []).map((id) => ({\n id,\n label: `Klasse ${id}`,\n }));\n },\n\n listSubjects(schoolType, _grade) {\n return MANIFEST.subjects[schoolType] || [];\n },\n\n listTracks(schoolType, grade, subject) {\n const key = `${schoolType}|${grade}|${subject}`;\n return MANIFEST.tracks[key] || [];\n },\n\n listTopics(selection) {\n const key = selection.track\n ? `${selection.schoolType}|${selection.grade}|${selection.subject}|${selection.track}`\n : `${selection.schoolType}|${selection.grade}|${selection.subject}`;\n const list = MANIFEST.topics[key] || [];\n return list.map((t) => ({\n ...t,\n sourceRef: key,\n }));\n },\n\n resolveTopic(topic) {\n const uri = MANIFEST.contentUrls[topic.sourceRef];\n if (!uri) {\n throw new Error(\n `Bildungsplan Hamburg: no resolvable source URL for topic \"${topic.id}\" (${topic.sourceRef}).`,\n );\n }\n return {\n provider: \"bildungsplan-hamburg\",\n topicId: `${topic.sourceRef}#${topic.id}`,\n uri,\n };\n },\n\n extractTopics(html, topicIds) {\n const results: Record<string, string> = {};\n const headingMatches = Array.from(\n html.matchAll(/<h[1-6][^>]*>([\\s\\S]*?)<\\/h[1-6]>/gi),\n );\n\n const sections: Array<{ header: string; content: string }> = [];\n for (const m of headingMatches) {\n const headerText = cleanHtmlText(m[1]).trim();\n const start = m.index! + m[0].length;\n const nextHeading = html.indexOf(\"<h\", start);\n const rawContent =\n nextHeading > -1\n ? html.slice(start, nextHeading)\n : html.slice(start, start + 1500);\n const content = cleanHtmlText(rawContent).slice(0, 1500);\n if (headerText) sections.push({ header: headerText, content });\n }\n\n for (const topicId of topicIds) {\n const hashIdx = topicId.indexOf(\"#\");\n if (hashIdx === -1) continue;\n const key = topicId.substring(0, hashIdx);\n const shortId = topicId.substring(hashIdx + 1);\n\n const list = MANIFEST.topics[key] ?? [];\n const match = list.find((t) => t.id === shortId);\n if (!match) continue;\n\n const label = match.label;\n const normalizedLabel = normalizeForComparison(label);\n\n let section = sections.find(\n (s) =>\n normalizeForComparison(s.header).includes(normalizedLabel) ||\n s.header.toLowerCase().includes(shortId.toLowerCase()),\n );\n\n if (!section && sections.length > 0) {\n section = sections.find((s) => s.content.length > 80) || sections[0];\n }\n\n if (section) {\n results[topicId] = `${label}\\n\\n${section.content}`.trim();\n } else {\n results[topicId] = label;\n }\n }\n\n return results;\n },\n};\n\nfunction cleanHtmlText(html: string): string {\n let text = html.replace(\n /<(head|script|style|svg)[^>]*>[\\s\\S]*?<\\/\\1>/gi,\n \" \",\n );\n text = text.replace(/<h[1-6][^>]*>([\\s\\S]*?)<\\/h[1-6]>/gi, \"\\n\\n$1\\n\\n\");\n text = text.replace(/<li[^>]*>/gi, \"\\n- \");\n text = text.replace(/<p[^>]*>/gi, \"\\n\");\n text = text.replace(/<br\\s*\\/?>/gi, \"\\n\");\n text = text.replace(/<[^>]+>/g, \" \");\n text = text\n .replace(/ /g, \" \")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\");\n return text\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .join(\"\\n\");\n}\n\nfunction normalizeForComparison(str: string): string {\n return str\n .toLowerCase()\n .replace(/ä/g, \"ae\")\n .replace(/ö/g, \"oe\")\n .replace(/ü/g, \"ue\")\n .replace(/ß/g, \"ss\")\n .replace(/&[a-z0-9#]+;/gi, \"\")\n .replace(/[^a-z0-9]/gi, \"\");\n}\n","import type { TaxonomyNode } from \"../../types.js\";\n\ninterface ManifestTopic extends TaxonomyNode {\n hours?: number;\n}\n\nexport interface FachanforderungenShManifest {\n schoolYear: string;\n capturedOn: string;\n sourceRevision: string;\n schoolTypes: TaxonomyNode[];\n grades: Record<string, string[]>;\n subjects: Record<string, TaxonomyNode[]>;\n tracks: Record<string, TaxonomyNode[]>;\n topics: Record<string, ManifestTopic[]>;\n contentUrls: Record<string, string>;\n}\n\nexport const FACHANFORDERUNGEN_SH_MANIFEST: FachanforderungenShManifest = {\n schoolYear: \"2025/2026\",\n capturedOn: \"2026-07-02\",\n sourceRevision: \"Fachanforderungen Schleswig-Holstein\",\n\n schoolTypes: [\n { id: \"gemeinschaftsschule\", label: \"Gemeinschaftsschule\" },\n { id: \"gymnasium\", label: \"Gymnasium\" },\n ],\n\n grades: {\n gemeinschaftsschule: [\"7\", \"8\", \"9\", \"10\"],\n gymnasium: [\"7\", \"8\", \"9\", \"10\"],\n },\n\n subjects: {\n gemeinschaftsschule: [\n { id: \"mathematik\", label: \"Mathematik\" },\n { id: \"informatik\", label: \"Informatik\" },\n { id: \"physik\", label: \"Physik\" },\n { id: \"chemie\", label: \"Chemie\" },\n { id: \"biologie\", label: \"Biologie\" },\n ],\n gymnasium: [\n { id: \"mathematik\", label: \"Mathematik\" },\n { id: \"informatik\", label: \"Informatik\" },\n { id: \"physik\", label: \"Physik\" },\n { id: \"chemie\", label: \"Chemie\" },\n { id: \"biologie\", label: \"Biologie\" },\n ],\n },\n\n tracks: {},\n\n topics: {\n \"gemeinschaftsschule|10|mathematik\": [\n { id: \"funktionen\", label: \"Funktionen\" },\n ],\n \"gymnasium|10|mathematik\": [{ id: \"analysis\", label: \"Analysis\" }],\n \"gemeinschaftsschule|9|physik\": [{ id: \"mechanik\", label: \"Mechanik\" }],\n \"gemeinschaftsschule|9|chemie\": [{ id: \"reaktionen\", label: \"Reaktionen\" }],\n \"gemeinschaftsschule|9|biologie\": [{ id: \"zellen\", label: \"Zellen\" }],\n \"gymnasium|9|physik\": [{ id: \"elektrizitaet\", label: \"Elektrizität\" }],\n \"gymnasium|9|chemie\": [{ id: \"bindungen\", label: \"Bindungen\" }],\n \"gymnasium|9|biologie\": [{ id: \"genetik\", label: \"Genetik\" }],\n },\n\n contentUrls: {\n \"gemeinschaftsschule|10|mathematik\":\n \"https://fachportal.lernnetz.de/sh/fachanforderungen.html\",\n \"gymnasium|10|mathematik\":\n \"https://fachportal.lernnetz.de/sh/fachanforderungen.html\",\n \"gemeinschaftsschule|9|physik\":\n \"https://fachportal.lernnetz.de/sh/fachanforderungen.html\",\n \"gemeinschaftsschule|9|chemie\":\n \"https://fachportal.lernnetz.de/sh/fachanforderungen.html\",\n \"gemeinschaftsschule|9|biologie\":\n \"https://fachportal.lernnetz.de/sh/fachanforderungen.html\",\n \"gymnasium|9|physik\":\n \"https://fachportal.lernnetz.de/sh/fachanforderungen.html\",\n \"gymnasium|9|chemie\":\n \"https://fachportal.lernnetz.de/sh/fachanforderungen.html\",\n \"gymnasium|9|biologie\":\n \"https://fachportal.lernnetz.de/sh/fachanforderungen.html\",\n },\n};\n","import type { CurriculumProvider } from \"../../types.js\";\nimport { FACHANFORDERUNGEN_SH_MANIFEST as MANIFEST } from \"./manifest.js\";\n\nexport const fachanforderungenShProvider: CurriculumProvider = {\n id: \"fachanforderungen-sh\",\n country: \"DE\",\n countryLabel: \"Deutschland\",\n region: \"SH\",\n regionLabel: \"Schleswig-Holstein\",\n label: \"Fachanforderungen (Schleswig-Holstein)\",\n\n listSchoolTypes() {\n return MANIFEST.schoolTypes;\n },\n\n listGrades(schoolType) {\n return (MANIFEST.grades[schoolType] || []).map((id) => ({\n id,\n label: `Klasse ${id}`,\n }));\n },\n\n listSubjects(schoolType, _grade) {\n return MANIFEST.subjects[schoolType] || [];\n },\n\n listTracks(schoolType, grade, subject) {\n const key = `${schoolType}|${grade}|${subject}`;\n return MANIFEST.tracks[key] || [];\n },\n\n listTopics(selection) {\n const key = selection.track\n ? `${selection.schoolType}|${selection.grade}|${selection.subject}|${selection.track}`\n : `${selection.schoolType}|${selection.grade}|${selection.subject}`;\n const list = MANIFEST.topics[key] || [];\n return list.map((t) => ({\n ...t,\n sourceRef: key,\n }));\n },\n\n resolveTopic(topic) {\n const uri = MANIFEST.contentUrls[topic.sourceRef];\n if (!uri) {\n throw new Error(\n `Fachanforderungen SH: no resolvable source URL for topic \"${topic.id}\" (${topic.sourceRef}).`,\n );\n }\n return {\n provider: \"fachanforderungen-sh\",\n topicId: `${topic.sourceRef}#${topic.id}`,\n uri,\n };\n },\n\n extractTopics(html, topicIds) {\n const results: Record<string, string> = {};\n const headingMatches = Array.from(\n html.matchAll(/<h[1-6][^>]*>([\\s\\S]*?)<\\/h[1-6]>/gi),\n );\n\n const sections: Array<{ header: string; content: string }> = [];\n for (const m of headingMatches) {\n const headerText = cleanHtmlText(m[1]).trim();\n const start = m.index! + m[0].length;\n const nextHeading = html.indexOf(\"<h\", start);\n const rawContent =\n nextHeading > -1\n ? html.slice(start, nextHeading)\n : html.slice(start, start + 1500);\n const content = cleanHtmlText(rawContent).slice(0, 1500);\n if (headerText) sections.push({ header: headerText, content });\n }\n\n for (const topicId of topicIds) {\n const hashIdx = topicId.indexOf(\"#\");\n if (hashIdx === -1) continue;\n const key = topicId.substring(0, hashIdx);\n const shortId = topicId.substring(hashIdx + 1);\n\n const list = MANIFEST.topics[key] ?? [];\n const match = list.find((t) => t.id === shortId);\n if (!match) continue;\n\n const label = match.label;\n const normalizedLabel = normalizeForComparison(label);\n\n let section = sections.find(\n (s) =>\n normalizeForComparison(s.header).includes(normalizedLabel) ||\n s.header.toLowerCase().includes(shortId.toLowerCase()),\n );\n\n if (!section && sections.length > 0) {\n section = sections.find((s) => s.content.length > 80) || sections[0];\n }\n\n if (section) {\n results[topicId] = `${label}\\n\\n${section.content}`.trim();\n } else {\n results[topicId] = label;\n }\n }\n\n return results;\n },\n};\n\nfunction cleanHtmlText(html: string): string {\n let text = html.replace(\n /<(head|script|style|svg)[^>]*>[\\s\\S]*?<\\/\\1>/gi,\n \" \",\n );\n text = text.replace(/<h[1-6][^>]*>([\\s\\S]*?)<\\/h[1-6]>/gi, \"\\n\\n$1\\n\\n\");\n text = text.replace(/<li[^>]*>/gi, \"\\n- \");\n text = text.replace(/<p[^>]*>/gi, \"\\n\");\n text = text.replace(/<br\\s*\\/?>/gi, \"\\n\");\n text = text.replace(/<[^>]+>/g, \" \");\n text = text\n .replace(/ /g, \" \")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\");\n return text\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .join(\"\\n\");\n}\n\nfunction normalizeForComparison(str: string): string {\n return str\n .toLowerCase()\n .replace(/ä/g, \"ae\")\n .replace(/ö/g, \"oe\")\n .replace(/ü/g, \"ue\")\n .replace(/ß/g, \"ss\")\n .replace(/&[a-z0-9#]+;/gi, \"\")\n .replace(/[^a-z0-9]/gi, \"\");\n}\n","import type { TaxonomyNode } from \"../../types.js\";\n\ninterface ManifestTopic extends TaxonomyNode {\n hours?: number;\n}\n\nexport interface KerncurriculumHessenManifest {\n schoolYear: string;\n capturedOn: string;\n sourceRevision: string;\n schoolTypes: TaxonomyNode[];\n grades: Record<string, string[]>;\n subjects: Record<string, TaxonomyNode[]>;\n tracks: Record<string, TaxonomyNode[]>;\n topics: Record<string, ManifestTopic[]>;\n contentUrls: Record<string, string>;\n}\n\nexport const KERNCURRICULUM_HESSEN_MANIFEST: KerncurriculumHessenManifest = {\n schoolYear: \"2025/2026\",\n capturedOn: \"2026-07-02\",\n sourceRevision: \"Kerncurricula Hessen (Sekundarstufe I)\",\n\n schoolTypes: [\n { id: \"realschule\", label: \"Realschule\" },\n { id: \"gymnasium\", label: \"Gymnasium\" },\n ],\n\n grades: {\n realschule: [\"7\", \"8\", \"9\", \"10\"],\n gymnasium: [\"7\", \"8\", \"9\", \"10\"],\n },\n\n subjects: {\n realschule: [\n { id: \"mathematik\", label: \"Mathematik\" },\n { id: \"informatik\", label: \"Informatik\" },\n { id: \"physik\", label: \"Physik\" },\n { id: \"chemie\", label: \"Chemie\" },\n { id: \"biologie\", label: \"Biologie\" },\n ],\n gymnasium: [\n { id: \"mathematik\", label: \"Mathematik\" },\n { id: \"informatik\", label: \"Informatik\" },\n { id: \"physik\", label: \"Physik\" },\n { id: \"chemie\", label: \"Chemie\" },\n { id: \"biologie\", label: \"Biologie\" },\n ],\n },\n\n tracks: {},\n\n topics: {\n // Minimal for Hessen Realschule / Gym - based on Kerncurricula Inhaltsfelder\n \"realschule|10|mathematik\": [\n { id: \"funktionen\", label: \"Funktionen\" },\n { id: \"geometrie\", label: \"Geometrie\" },\n { id: \"wahrscheinlichkeit\", label: \"Wahrscheinlichkeit und Statistik\" },\n ],\n \"gymnasium|10|mathematik\": [\n { id: \"analysis\", label: \"Analysis\" },\n { id: \"vektoren\", label: \"Vektoren und Geometrie\" },\n { id: \"stochastik\", label: \"Stochastik\" },\n ],\n \"realschule|9|informatik\": [\n { id: \"daten\", label: \"Daten und Information\" },\n { id: \"algorithmen\", label: \"Algorithmen und Programmierung\" },\n { id: \"netze\", label: \"Netze und Sicherheit\" },\n ],\n \"realschule|9|physik\": [\n { id: \"mechanik\", label: \"Mechanik\" },\n { id: \"energie\", label: \"Energie\" },\n { id: \"elektrizitaet\", label: \"Elektrizität\" },\n ],\n \"realschule|9|chemie\": [\n { id: \"stoffe\", label: \"Stoffe und Reaktionen\" },\n { id: \"atome\", label: \"Atome und Periodensystem\" },\n { id: \"organisch\", label: \"Organische Verbindungen\" },\n ],\n \"realschule|9|biologie\": [\n { id: \"zelle\", label: \"Zelle und Stoffwechsel\" },\n { id: \"vererbung\", label: \"Vererbung\" },\n { id: \"oekologie\", label: \"Ökologie\" },\n ],\n \"gymnasium|9|physik\": [\n { id: \"optik\", label: \"Optik\" },\n { id: \"mechanik-dynamik\", label: \"Mechanik und Dynamik\" },\n { id: \"felder\", label: \"Elektrische und magnetische Felder\" },\n ],\n \"gymnasium|9|chemie\": [\n { id: \"bindung\", label: \"Chemische Bindung\" },\n { id: \"reaktionsgeschwindigkeit\", label: \"Reaktionsgeschwindigkeit\" },\n { id: \"saeure-base\", label: \"Säure-Base-Reaktionen\" },\n ],\n \"gymnasium|9|biologie\": [\n { id: \"genetik\", label: \"Genetik\" },\n { id: \"evolution\", label: \"Evolution\" },\n { id: \"neurobiologie\", label: \"Neurobiologie\" },\n ],\n },\n\n contentUrls: {\n \"realschule|10|mathematik\":\n \"https://kultusministerium.hessen.de/Unterricht/Kerncurricula-und-Lehrplaene/Kerncurricula/sekundarstufe-i-kerncurricula\",\n \"gymnasium|10|mathematik\":\n \"https://kultusministerium.hessen.de/Unterricht/Kerncurricula-und-Lehrplaene/Kerncurricula/sekundarstufe-i-kerncurricula\",\n \"realschule|9|informatik\":\n \"https://kultusministerium.hessen.de/Unterricht/Kerncurricula-und-Lehrplaene/Kerncurricula/sekundarstufe-i-kerncurricula\",\n \"realschule|9|physik\":\n \"https://kultusministerium.hessen.de/Unterricht/Kerncurricula-und-Lehrplaene/Kerncurricula/sekundarstufe-i-kerncurricula\",\n \"realschule|9|chemie\":\n \"https://kultusministerium.hessen.de/Unterricht/Kerncurricula-und-Lehrplaene/Kerncurricula/sekundarstufe-i-kerncurricula\",\n \"realschule|9|biologie\":\n \"https://kultusministerium.hessen.de/Unterricht/Kerncurricula-und-Lehrplaene/Kerncurricula/sekundarstufe-i-kerncurricula\",\n \"gymnasium|9|physik\":\n \"https://kultusministerium.hessen.de/Unterricht/Kerncurricula-und-Lehrplaene/Kerncurricula/sekundarstufe-i-kerncurricula\",\n \"gymnasium|9|chemie\":\n \"https://kultusministerium.hessen.de/Unterricht/Kerncurricula-und-Lehrplaene/Kerncurricula/sekundarstufe-i-kerncurricula\",\n \"gymnasium|9|biologie\":\n \"https://kultusministerium.hessen.de/Unterricht/Kerncurricula-und-Lehrplaene/Kerncurricula/sekundarstufe-i-kerncurricula\",\n },\n};\n","import type { CurriculumProvider } from \"../../types.js\";\nimport { KERNCURRICULUM_HESSEN_MANIFEST as MANIFEST } from \"./manifest.js\";\n\nexport const kerncurriculumHessenProvider: CurriculumProvider = {\n id: \"kerncurriculum-hessen\",\n country: \"DE\",\n countryLabel: \"Deutschland\",\n region: \"HE\",\n regionLabel: \"Hessen\",\n label: \"Kerncurriculum (Hessen)\",\n\n listSchoolTypes() {\n return MANIFEST.schoolTypes;\n },\n\n listGrades(schoolType) {\n return (MANIFEST.grades[schoolType] || []).map((id) => ({\n id,\n label: `Klasse ${id}`,\n }));\n },\n\n listSubjects(schoolType, _grade) {\n return MANIFEST.subjects[schoolType] || [];\n },\n\n listTracks(schoolType, grade, subject) {\n const key = `${schoolType}|${grade}|${subject}`;\n return MANIFEST.tracks[key] || [];\n },\n\n listTopics(selection) {\n const key = selection.track\n ? `${selection.schoolType}|${selection.grade}|${selection.subject}|${selection.track}`\n : `${selection.schoolType}|${selection.grade}|${selection.subject}`;\n const list = MANIFEST.topics[key] || [];\n return list.map((t) => ({\n ...t,\n sourceRef: key,\n }));\n },\n\n resolveTopic(topic) {\n const uri = MANIFEST.contentUrls[topic.sourceRef];\n if (!uri) {\n throw new Error(\n `Kerncurriculum Hessen: no resolvable source URL for topic \"${topic.id}\" (${topic.sourceRef}).`,\n );\n }\n return {\n provider: \"kerncurriculum-hessen\",\n topicId: `${topic.sourceRef}#${topic.id}`,\n uri,\n };\n },\n\n extractTopics(html, topicIds) {\n // Reuse tolerant heading-based extractor (adapted for Hessen portal)\n const results: Record<string, string> = {};\n const headingMatches = Array.from(\n html.matchAll(/<h[1-6][^>]*>([\\s\\S]*?)<\\/h[1-6]>/gi),\n );\n\n const sections: Array<{ header: string; content: string }> = [];\n for (const m of headingMatches) {\n const headerText = cleanHtmlText(m[1]).trim();\n const start = m.index! + m[0].length;\n const nextHeading = html.indexOf(\"<h\", start);\n const rawContent =\n nextHeading > -1\n ? html.slice(start, nextHeading)\n : html.slice(start, start + 1500);\n const content = cleanHtmlText(rawContent).slice(0, 1500);\n if (headerText) sections.push({ header: headerText, content });\n }\n\n for (const topicId of topicIds) {\n const hashIdx = topicId.indexOf(\"#\");\n if (hashIdx === -1) continue;\n const key = topicId.substring(0, hashIdx);\n const shortId = topicId.substring(hashIdx + 1);\n\n const list = MANIFEST.topics[key] ?? [];\n const match = list.find((t) => t.id === shortId);\n if (!match) continue;\n\n const label = match.label;\n const normalizedLabel = normalizeForComparison(label);\n\n let section = sections.find(\n (s) =>\n normalizeForComparison(s.header).includes(normalizedLabel) ||\n s.header.toLowerCase().includes(shortId.toLowerCase()),\n );\n\n if (!section && sections.length > 0) {\n section = sections.find((s) => s.content.length > 80) || sections[0];\n }\n\n if (section) {\n results[topicId] = `${label}\\n\\n${section.content}`.trim();\n } else {\n results[topicId] = label;\n }\n }\n\n return results;\n },\n};\n\nfunction cleanHtmlText(html: string): string {\n let text = html.replace(\n /<(head|script|style|svg)[^>]*>[\\s\\S]*?<\\/\\1>/gi,\n \" \",\n );\n text = text.replace(/<h[1-6][^>]*>([\\s\\S]*?)<\\/h[1-6]>/gi, \"\\n\\n$1\\n\\n\");\n text = text.replace(/<li[^>]*>/gi, \"\\n- \");\n text = text.replace(/<p[^>]*>/gi, \"\\n\");\n text = text.replace(/<br\\s*\\/?>/gi, \"\\n\");\n text = text.replace(/<[^>]+>/g, \" \");\n text = text\n .replace(/ /g, \" \")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\");\n return text\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .join(\"\\n\");\n}\n\nfunction normalizeForComparison(str: string): string {\n return str\n .toLowerCase()\n .replace(/ä/g, \"ae\")\n .replace(/ö/g, \"oe\")\n .replace(/ü/g, \"ue\")\n .replace(/ß/g, \"ss\")\n .replace(/&[a-z0-9#]+;/gi, \"\")\n .replace(/[^a-z0-9]/gi, \"\");\n}\n","import type { TaxonomyNode } from \"../../types.js\";\n\ninterface ManifestTopic extends TaxonomyNode {\n hours?: number;\n}\n\nexport interface KerncurriculumNiedersachsenManifest {\n schoolYear: string;\n capturedOn: string;\n sourceRevision: string;\n schoolTypes: TaxonomyNode[];\n grades: Record<string, string[]>;\n subjects: Record<string, TaxonomyNode[]>;\n tracks: Record<string, TaxonomyNode[]>;\n topics: Record<string, ManifestTopic[]>;\n contentUrls: Record<string, string>;\n}\n\nexport const KERNCURRICULUM_NIEDERSACHSEN_MANIFEST: KerncurriculumNiedersachsenManifest =\n {\n schoolYear: \"2025/2026\",\n capturedOn: \"2026-07-02\",\n sourceRevision: \"Kerncurricula Niedersachsen (CuVo)\",\n\n schoolTypes: [\n { id: \"realschule\", label: \"Realschule\" },\n { id: \"gymnasium\", label: \"Gymnasium\" },\n ],\n\n grades: {\n realschule: [\"7\", \"8\", \"9\", \"10\"],\n gymnasium: [\"7\", \"8\", \"9\", \"10\"],\n },\n\n subjects: {\n realschule: [\n { id: \"mathematik\", label: \"Mathematik\" },\n { id: \"informatik\", label: \"Informatik\" },\n { id: \"physik\", label: \"Physik\" },\n { id: \"chemie\", label: \"Chemie\" },\n { id: \"biologie\", label: \"Biologie\" },\n ],\n gymnasium: [\n { id: \"mathematik\", label: \"Mathematik\" },\n { id: \"informatik\", label: \"Informatik\" },\n { id: \"physik\", label: \"Physik\" },\n { id: \"chemie\", label: \"Chemie\" },\n { id: \"biologie\", label: \"Biologie\" },\n ],\n },\n\n tracks: {},\n\n topics: {\n \"realschule|10|mathematik\": [\n { id: \"algebra-funktionen\", label: \"Algebra und Funktionen\" },\n { id: \"geometrie\", label: \"Geometrie\" },\n ],\n \"gymnasium|10|mathematik\": [\n { id: \"analysis\", label: \"Analysis\" },\n { id: \"lineare-algebra\", label: \"Lineare Algebra\" },\n ],\n \"realschule|9|physik\": [\n { id: \"mechanik\", label: \"Mechanik\" },\n { id: \"energie\", label: \"Energie und Wärme\" },\n ],\n \"realschule|9|chemie\": [\n { id: \"reaktionen\", label: \"Chemische Reaktionen\" },\n { id: \"stoffkreislauf\", label: \"Stoffkreisläufe\" },\n ],\n \"realschule|9|biologie\": [\n { id: \"zellen\", label: \"Zellen\" },\n { id: \"oekologie\", label: \"Ökologie\" },\n ],\n \"gymnasium|9|physik\": [\n { id: \"elektrizitaet\", label: \"Elektrizität und Magnetismus\" },\n ],\n \"gymnasium|9|chemie\": [{ id: \"bindungen\", label: \"Chemische Bindungen\" }],\n \"gymnasium|9|biologie\": [{ id: \"genetik\", label: \"Genetik\" }],\n },\n\n contentUrls: {\n \"realschule|10|mathematik\": \"https://cuvo.nibis.de/cuvo.php\",\n \"gymnasium|10|mathematik\": \"https://cuvo.nibis.de/cuvo.php\",\n \"realschule|9|physik\": \"https://cuvo.nibis.de/cuvo.php\",\n \"realschule|9|chemie\": \"https://cuvo.nibis.de/cuvo.php\",\n \"realschule|9|biologie\": \"https://cuvo.nibis.de/cuvo.php\",\n \"gymnasium|9|physik\": \"https://cuvo.nibis.de/cuvo.php\",\n \"gymnasium|9|chemie\": \"https://cuvo.nibis.de/cuvo.php\",\n \"gymnasium|9|biologie\": \"https://cuvo.nibis.de/cuvo.php\",\n },\n };\n","import type { CurriculumProvider } from \"../../types.js\";\nimport { KERNCURRICULUM_NIEDERSACHSEN_MANIFEST as MANIFEST } from \"./manifest.js\";\n\nexport const kerncurriculumNiedersachsenProvider: CurriculumProvider = {\n id: \"kerncurriculum-niedersachsen\",\n country: \"DE\",\n countryLabel: \"Deutschland\",\n region: \"NI\",\n regionLabel: \"Niedersachsen\",\n label: \"Kerncurriculum (Niedersachsen)\",\n\n listSchoolTypes() {\n return MANIFEST.schoolTypes;\n },\n\n listGrades(schoolType) {\n return (MANIFEST.grades[schoolType] || []).map((id) => ({\n id,\n label: `Klasse ${id}`,\n }));\n },\n\n listSubjects(schoolType, _grade) {\n return MANIFEST.subjects[schoolType] || [];\n },\n\n listTracks(schoolType, grade, subject) {\n const key = `${schoolType}|${grade}|${subject}`;\n return MANIFEST.tracks[key] || [];\n },\n\n listTopics(selection) {\n const key = selection.track\n ? `${selection.schoolType}|${selection.grade}|${selection.subject}|${selection.track}`\n : `${selection.schoolType}|${selection.grade}|${selection.subject}`;\n const list = MANIFEST.topics[key] || [];\n return list.map((t) => ({\n ...t,\n sourceRef: key,\n }));\n },\n\n resolveTopic(topic) {\n const uri = MANIFEST.contentUrls[topic.sourceRef];\n if (!uri) {\n throw new Error(\n `Kerncurriculum Niedersachsen: no resolvable source URL for topic \"${topic.id}\" (${topic.sourceRef}).`,\n );\n }\n return {\n provider: \"kerncurriculum-niedersachsen\",\n topicId: `${topic.sourceRef}#${topic.id}`,\n uri,\n };\n },\n\n extractTopics(html, topicIds) {\n const results: Record<string, string> = {};\n const headingMatches = Array.from(\n html.matchAll(/<h[1-6][^>]*>([\\s\\S]*?)<\\/h[1-6]>/gi),\n );\n\n const sections: Array<{ header: string; content: string }> = [];\n for (const m of headingMatches) {\n const headerText = cleanHtmlText(m[1]).trim();\n const start = m.index! + m[0].length;\n const nextHeading = html.indexOf(\"<h\", start);\n const rawContent =\n nextHeading > -1\n ? html.slice(start, nextHeading)\n : html.slice(start, start + 1500);\n const content = cleanHtmlText(rawContent).slice(0, 1500);\n if (headerText) sections.push({ header: headerText, content });\n }\n\n for (const topicId of topicIds) {\n const hashIdx = topicId.indexOf(\"#\");\n if (hashIdx === -1) continue;\n const key = topicId.substring(0, hashIdx);\n const shortId = topicId.substring(hashIdx + 1);\n\n const list = MANIFEST.topics[key] ?? [];\n const match = list.find((t) => t.id === shortId);\n if (!match) continue;\n\n const label = match.label;\n const normalizedLabel = normalizeForComparison(label);\n\n let section = sections.find(\n (s) =>\n normalizeForComparison(s.header).includes(normalizedLabel) ||\n s.header.toLowerCase().includes(shortId.toLowerCase()),\n );\n\n if (!section && sections.length > 0) {\n section = sections.find((s) => s.content.length > 80) || sections[0];\n }\n\n if (section) {\n results[topicId] = `${label}\\n\\n${section.content}`.trim();\n } else {\n results[topicId] = label;\n }\n }\n\n return results;\n },\n};\n\nfunction cleanHtmlText(html: string): string {\n let text = html.replace(\n /<(head|script|style|svg)[^>]*>[\\s\\S]*?<\\/\\1>/gi,\n \" \",\n );\n text = text.replace(/<h[1-6][^>]*>([\\s\\S]*?)<\\/h[1-6]>/gi, \"\\n\\n$1\\n\\n\");\n text = text.replace(/<li[^>]*>/gi, \"\\n- \");\n text = text.replace(/<p[^>]*>/gi, \"\\n\");\n text = text.replace(/<br\\s*\\/?>/gi, \"\\n\");\n text = text.replace(/<[^>]+>/g, \" \");\n text = text\n .replace(/ /g, \" \")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\");\n return text\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .join(\"\\n\");\n}\n\nfunction normalizeForComparison(str: string): string {\n return str\n .toLowerCase()\n .replace(/ä/g, \"ae\")\n .replace(/ö/g, \"oe\")\n .replace(/ü/g, \"ue\")\n .replace(/ß/g, \"ss\")\n .replace(/&[a-z0-9#]+;/gi, \"\")\n .replace(/[^a-z0-9]/gi, \"\");\n}\n","import type { TaxonomyNode } from \"../../types.js\";\n\ninterface ManifestTopic extends TaxonomyNode {\n hours?: number;\n}\n\nexport interface KernlehrplanNrwManifest {\n schoolYear: string;\n capturedOn: string;\n sourceRevision: string;\n schoolTypes: TaxonomyNode[];\n grades: Record<string, string[]>;\n subjects: Record<string, TaxonomyNode[]>;\n tracks: Record<string, TaxonomyNode[]>;\n topics: Record<string, ManifestTopic[]>;\n contentUrls: Record<string, string>;\n}\n\nexport const KERNLEHRPLAN_NRW_MANIFEST: KernlehrplanNrwManifest = {\n schoolYear: \"2025/2026\",\n capturedOn: \"2026-07-02\",\n sourceRevision: \"Kernlehrpläne Sekundarstufe I NRW (Lehrplannavigator)\",\n\n schoolTypes: [\n { id: \"realschule\", label: \"Realschule\" },\n { id: \"gymnasium\", label: \"Gymnasium\" },\n ],\n\n grades: {\n realschule: [\"7\", \"8\", \"9\", \"10\"],\n gymnasium: [\"7\", \"8\", \"9\", \"10\"],\n },\n\n subjects: {\n realschule: [\n { id: \"mathematik\", label: \"Mathematik\" },\n { id: \"informatik\", label: \"Informatik\" },\n { id: \"physik\", label: \"Physik\" },\n { id: \"chemie\", label: \"Chemie\" },\n { id: \"biologie\", label: \"Biologie\" },\n ],\n gymnasium: [\n { id: \"mathematik\", label: \"Mathematik\" },\n { id: \"informatik\", label: \"Informatik\" },\n { id: \"physik\", label: \"Physik\" },\n { id: \"chemie\", label: \"Chemie\" },\n { id: \"biologie\", label: \"Biologie\" },\n ],\n },\n\n tracks: {},\n\n topics: {\n // Minimal starter set for Realschule Mathematik (example for one grade)\n \"realschule|10|mathematik\": [\n { id: \"arithmetik-algebra\", label: \"Arithmetik und Algebra\" },\n { id: \"funktionen\", label: \"Funktionen\" },\n { id: \"geometrie\", label: \"Geometrie\" },\n { id: \"stochastik\", label: \"Stochastik\" },\n ],\n // Minimal starter for Realschule Informatik (from UV examples in 5/6 + typical)\n \"realschule|8|informatik\": [\n { id: \"daten-codierung\", label: \"Daten und Codierung\" },\n { id: \"algorithmen\", label: \"Algorithmen\" },\n {\n id: \"ki-datenbewusstsein\",\n label: \"Künstliche Intelligenz und Datenbewusstsein\",\n },\n ],\n // Starter for Gymnasium Mathematik (higher track)\n \"gymnasium|10|mathematik\": [\n { id: \"analysis\", label: \"Analysis / Funktionen\" },\n {\n id: \"lineare-algebra-geometrie\",\n label: \"Lineare Algebra und Geometrie\",\n },\n { id: \"stochastik\", label: \"Stochastik\" },\n ],\n // Starter for Gymnasium WP Informatik\n \"gymnasium|10|informatik\": [\n { id: \"logische-schaltungen\", label: \"Logische Schaltungen\" },\n {\n id: \"algorithmen-programmierung\",\n label: \"Algorithmen und Programmierung\",\n },\n { id: \"daten-netze-sicherheit\", label: \"Daten, Netze und Sicherheit\" },\n ],\n // Naturwissenschaften for Realschule example\n \"realschule|9|physik\": [\n { id: \"mechanik-kraefte\", label: \"Mechanik und Kräfte\" },\n { id: \"waerme-energie\", label: \"Wärme und Energie\" },\n { id: \"elektrizitaet\", label: \"Elektrizität\" },\n ],\n \"realschule|9|chemie\": [\n { id: \"stoffe-eigenschaften\", label: \"Stoffe und ihre Eigenschaften\" },\n { id: \"reaktionen\", label: \"Chemische Reaktionen\" },\n { id: \"atombau\", label: \"Atombau und Periodensystem\" },\n ],\n \"realschule|9|biologie\": [\n { id: \"zellen-lebewesen\", label: \"Zellen und Lebewesen\" },\n { id: \"vererbung\", label: \"Vererbung und Genetik\" },\n { id: \"oekosysteme\", label: \"Ökosysteme\" },\n ],\n // Naturwissenschaften for Gymnasium\n \"gymnasium|9|physik\": [\n { id: \"optik\", label: \"Optik\" },\n { id: \"elektromagnetismus\", label: \"Elektromagnetismus\" },\n { id: \"atomphysik\", label: \"Atom- und Kernphysik\" },\n ],\n \"gymnasium|9|chemie\": [\n { id: \"chemische-bindung\", label: \"Chemische Bindung\" },\n { id: \"saeuren-basen-salze\", label: \"Säuren, Basen, Salze\" },\n { id: \"organische\", label: \"Organische Chemie\" },\n ],\n \"gymnasium|9|biologie\": [\n { id: \"genetik-evolution\", label: \"Genetik und Evolution\" },\n { id: \"physiologie\", label: \"Physiologie des Menschen\" },\n { id: \"oekologie-umwelt\", label: \"Ökologie und Umweltschutz\" },\n ],\n },\n\n contentUrls: {\n \"realschule|10|mathematik\":\n \"https://lehrplannavigator.nrw.de/sekundarstufe-i/realschule/mathematik-neu-ab-20222023\",\n \"realschule|8|informatik\":\n \"https://lehrplannavigator.nrw.de/sekundarstufe-i/realschule/informatik-realschule-neu-ab-20212022\",\n \"gymnasium|10|mathematik\":\n \"https://lehrplannavigator.nrw.de/sekundarstufe-i/kernlehrplaene-fuer-das-gymnasium-ab-20192020/mathematik\",\n \"gymnasium|10|informatik\":\n \"https://lehrplannavigator.nrw.de/sekundarstufe-i/kernlehrplaene-fuer-das-gymnasium-ab-20192020/wp-informatik-neu-ab-20232024\",\n \"realschule|9|physik\":\n \"https://lehrplannavigator.nrw.de/sekundarstufe-i/realschule/physik\",\n \"realschule|9|chemie\":\n \"https://lehrplannavigator.nrw.de/sekundarstufe-i/realschule/chemie\",\n \"realschule|9|biologie\":\n \"https://lehrplannavigator.nrw.de/sekundarstufe-i/realschule/biologie\",\n \"gymnasium|9|physik\":\n \"https://lehrplannavigator.nrw.de/sekundarstufe-i/kernlehrplaene-fuer-das-gymnasium-ab-20192020/physik\",\n \"gymnasium|9|chemie\":\n \"https://lehrplannavigator.nrw.de/sekundarstufe-i/kernlehrplaene-fuer-das-gymnasium-ab-20192020/chemie\",\n \"gymnasium|9|biologie\":\n \"https://lehrplannavigator.nrw.de/sekundarstufe-i/kernlehrplaene-fuer-das-gymnasium-ab-20192020/biologie\",\n },\n};\n","import type { CurriculumProvider } from \"../../types.js\";\nimport { KERNLEHRPLAN_NRW_MANIFEST as MANIFEST } from \"./manifest.js\";\n\nexport const kernlehrplanNrwProvider: CurriculumProvider = {\n id: \"kernlehrplan-nrw\",\n country: \"DE\",\n countryLabel: \"Deutschland\",\n region: \"NW\",\n regionLabel: \"Nordrhein-Westfalen\",\n label: \"Kernlehrplan (Nordrhein-Westfalen)\",\n\n listSchoolTypes() {\n return MANIFEST.schoolTypes;\n },\n\n listGrades(schoolType) {\n return (MANIFEST.grades[schoolType] || []).map((id) => ({\n id,\n label: `Klasse ${id}`,\n }));\n },\n\n listSubjects(schoolType, _grade) {\n return MANIFEST.subjects[schoolType] || [];\n },\n\n listTracks(schoolType, grade, subject) {\n const key = `${schoolType}|${grade}|${subject}`;\n return MANIFEST.tracks[key] || [];\n },\n\n listTopics(selection) {\n const key = selection.track\n ? `${selection.schoolType}|${selection.grade}|${selection.subject}|${selection.track}`\n : `${selection.schoolType}|${selection.grade}|${selection.subject}`;\n const list = MANIFEST.topics[key] || [];\n return list.map((t) => ({\n ...t,\n sourceRef: key,\n }));\n },\n\n resolveTopic(topic) {\n const uri = MANIFEST.contentUrls[topic.sourceRef];\n if (!uri) {\n throw new Error(\n `Kernlehrplan NRW: no resolvable source URL for topic \"${topic.id}\" (${topic.sourceRef}).`,\n );\n }\n return {\n provider: \"kernlehrplan-nrw\",\n topicId: `${topic.sourceRef}#${topic.id}`,\n uri,\n };\n },\n\n extractTopics(html, topicIds) {\n // Basic extractor for NRW navigator pages (headings-based, tolerant).\n // The pages are mostly landing pages; detailed content often in linked\n // PDFs or Unterrichtsvorhaben. This pulls reasonable text chunks for the\n // LLM-based import step. Can be refined with more specific fixtures.\n const results: Record<string, string> = {};\n\n // Simple heading + paragraph scraper\n const headingMatches = Array.from(\n html.matchAll(/<h[1-6][^>]*>([\\s\\S]*?)<\\/h[1-6]>/gi),\n );\n\n const sections: Array<{ header: string; content: string }> = [];\n for (const m of headingMatches) {\n const headerText = cleanHtmlText(m[1]).trim();\n // Take some following text until next heading (rough)\n const start = m.index! + m[0].length;\n const nextHeading = html.indexOf(\"<h\", start);\n const rawContent =\n nextHeading > -1\n ? html.slice(start, nextHeading)\n : html.slice(start, start + 2000);\n const content = cleanHtmlText(rawContent).slice(0, 2000);\n if (headerText) sections.push({ header: headerText, content });\n }\n\n for (const topicId of topicIds) {\n const hashIdx = topicId.indexOf(\"#\");\n if (hashIdx === -1) continue;\n const key = topicId.substring(0, hashIdx);\n const shortId = topicId.substring(hashIdx + 1);\n\n const list = MANIFEST.topics[key] ?? [];\n const match = list.find((t) => t.id === shortId);\n if (!match) continue;\n\n const label = match.label;\n const normalizedLabel = normalizeForComparison(label);\n\n // Try exact id match or label in header\n let section = sections.find(\n (s) =>\n normalizeForComparison(s.header).includes(normalizedLabel) ||\n s.header.toLowerCase().includes(shortId.toLowerCase()),\n );\n\n if (!section && sections.length > 0) {\n // Fallback: use first substantial section or the main content area\n section = sections.find((s) => s.content.length > 100) || sections[0];\n }\n\n if (section) {\n results[topicId] = `${label}\\n\\n${section.content}`.trim();\n } else {\n // Last resort: return the topic label so the pipeline has something\n results[topicId] = label;\n }\n }\n\n return results;\n },\n};\n\nfunction cleanHtmlText(html: string): string {\n let text = html.replace(\n /<(head|script|style|svg)[^>]*>[\\s\\S]*?<\\/\\1>/gi,\n \" \",\n );\n text = text.replace(/<h[1-6][^>]*>([\\s\\S]*?)<\\/h[1-6]>/gi, \"\\n\\n$1\\n\\n\");\n text = text.replace(/<li[^>]*>/gi, \"\\n- \");\n text = text.replace(/<p[^>]*>/gi, \"\\n\");\n text = text.replace(/<br\\s*\\/?>/gi, \"\\n\");\n text = text.replace(/<[^>]+>/g, \" \");\n text = text\n .replace(/ /g, \" \")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/–/g, \"–\")\n .replace(/—/g, \"—\");\n return text\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .join(\"\\n\");\n}\n\nfunction normalizeForComparison(str: string): string {\n return str\n .toLowerCase()\n .replace(/ä/g, \"ae\")\n .replace(/ö/g, \"oe\")\n .replace(/ü/g, \"ue\")\n .replace(/ß/g, \"ss\")\n .replace(/&[a-z0-9#]+;/gi, \"\")\n .replace(/[^a-z0-9]/gi, \"\");\n}\n","import type { TaxonomyNode } from \"../../types.js\";\n\ninterface ManifestTopic extends TaxonomyNode {\n hours?: number;\n}\n\nexport interface LehrplaeneRpManifest {\n schoolYear: string;\n capturedOn: string;\n sourceRevision: string;\n schoolTypes: TaxonomyNode[];\n grades: Record<string, string[]>;\n subjects: Record<string, TaxonomyNode[]>;\n tracks: Record<string, TaxonomyNode[]>;\n topics: Record<string, ManifestTopic[]>;\n contentUrls: Record<string, string>;\n}\n\nexport const LEHRPLAENE_RP_MANIFEST: LehrplaeneRpManifest = {\n schoolYear: \"2025/2026\",\n capturedOn: \"2026-07-02\",\n sourceRevision: \"Lehrpläne Rheinland-Pfalz\",\n\n schoolTypes: [\n { id: \"realschule-plus\", label: \"Realschule plus\" },\n { id: \"gymnasium\", label: \"Gymnasium\" },\n ],\n\n grades: {\n \"realschule-plus\": [\"7\", \"8\", \"9\", \"10\"],\n gymnasium: [\"7\", \"8\", \"9\", \"10\"],\n },\n\n subjects: {\n \"realschule-plus\": [\n { id: \"mathematik\", label: \"Mathematik\" },\n { id: \"informatik\", label: \"Informatik\" },\n { id: \"physik\", label: \"Physik\" },\n { id: \"chemie\", label: \"Chemie\" },\n { id: \"biologie\", label: \"Biologie\" },\n ],\n gymnasium: [\n { id: \"mathematik\", label: \"Mathematik\" },\n { id: \"informatik\", label: \"Informatik\" },\n { id: \"physik\", label: \"Physik\" },\n { id: \"chemie\", label: \"Chemie\" },\n { id: \"biologie\", label: \"Biologie\" },\n ],\n },\n\n tracks: {},\n\n topics: {\n \"realschule-plus|10|mathematik\": [\n { id: \"funktionen\", label: \"Funktionen\" },\n ],\n \"gymnasium|10|mathematik\": [{ id: \"analysis\", label: \"Analysis\" }],\n \"realschule-plus|9|physik\": [{ id: \"mechanik\", label: \"Mechanik\" }],\n \"realschule-plus|9|chemie\": [{ id: \"reaktionen\", label: \"Reaktionen\" }],\n \"realschule-plus|9|biologie\": [{ id: \"zellen\", label: \"Zellen\" }],\n \"gymnasium|9|physik\": [{ id: \"elektrizitaet\", label: \"Elektrizität\" }],\n \"gymnasium|9|chemie\": [{ id: \"bindungen\", label: \"Bindungen\" }],\n \"gymnasium|9|biologie\": [{ id: \"genetik\", label: \"Genetik\" }],\n },\n\n contentUrls: {\n \"realschule-plus|10|mathematik\": \"https://lehrplaene.bildung-rp.de/\",\n \"gymnasium|10|mathematik\": \"https://lehrplaene.bildung-rp.de/\",\n \"realschule-plus|9|physik\": \"https://lehrplaene.bildung-rp.de/\",\n \"realschule-plus|9|chemie\": \"https://lehrplaene.bildung-rp.de/\",\n \"realschule-plus|9|biologie\": \"https://lehrplaene.bildung-rp.de/\",\n \"gymnasium|9|physik\": \"https://lehrplaene.bildung-rp.de/\",\n \"gymnasium|9|chemie\": \"https://lehrplaene.bildung-rp.de/\",\n \"gymnasium|9|biologie\": \"https://lehrplaene.bildung-rp.de/\",\n },\n};\n","import type { CurriculumProvider } from \"../../types.js\";\nimport { LEHRPLAENE_RP_MANIFEST as MANIFEST } from \"./manifest.js\";\n\nexport const lehrplaeneRpProvider: CurriculumProvider = {\n id: \"lehrplaene-rp\",\n country: \"DE\",\n countryLabel: \"Deutschland\",\n region: \"RP\",\n regionLabel: \"Rheinland-Pfalz\",\n label: \"Lehrpläne (Rheinland-Pfalz)\",\n\n listSchoolTypes() {\n return MANIFEST.schoolTypes;\n },\n\n listGrades(schoolType) {\n return (MANIFEST.grades[schoolType] || []).map((id) => ({\n id,\n label: `Klasse ${id}`,\n }));\n },\n\n listSubjects(schoolType, _grade) {\n return MANIFEST.subjects[schoolType] || [];\n },\n\n listTracks(schoolType, grade, subject) {\n const key = `${schoolType}|${grade}|${subject}`;\n return MANIFEST.tracks[key] || [];\n },\n\n listTopics(selection) {\n const key = selection.track\n ? `${selection.schoolType}|${selection.grade}|${selection.subject}|${selection.track}`\n : `${selection.schoolType}|${selection.grade}|${selection.subject}`;\n const list = MANIFEST.topics[key] || [];\n return list.map((t) => ({\n ...t,\n sourceRef: key,\n }));\n },\n\n resolveTopic(topic) {\n const uri = MANIFEST.contentUrls[topic.sourceRef];\n if (!uri) {\n throw new Error(\n `Lehrpläne RP: no resolvable source URL for topic \"${topic.id}\" (${topic.sourceRef}).`,\n );\n }\n return {\n provider: \"lehrplaene-rp\",\n topicId: `${topic.sourceRef}#${topic.id}`,\n uri,\n };\n },\n\n extractTopics(html, topicIds) {\n const results: Record<string, string> = {};\n const headingMatches = Array.from(\n html.matchAll(/<h[1-6][^>]*>([\\s\\S]*?)<\\/h[1-6]>/gi),\n );\n\n const sections: Array<{ header: string; content: string }> = [];\n for (const m of headingMatches) {\n const headerText = cleanHtmlText(m[1]).trim();\n const start = m.index! + m[0].length;\n const nextHeading = html.indexOf(\"<h\", start);\n const rawContent =\n nextHeading > -1\n ? html.slice(start, nextHeading)\n : html.slice(start, start + 1500);\n const content = cleanHtmlText(rawContent).slice(0, 1500);\n if (headerText) sections.push({ header: headerText, content });\n }\n\n for (const topicId of topicIds) {\n const hashIdx = topicId.indexOf(\"#\");\n if (hashIdx === -1) continue;\n const key = topicId.substring(0, hashIdx);\n const shortId = topicId.substring(hashIdx + 1);\n\n const list = MANIFEST.topics[key] ?? [];\n const match = list.find((t) => t.id === shortId);\n if (!match) continue;\n\n const label = match.label;\n const normalizedLabel = normalizeForComparison(label);\n\n let section = sections.find(\n (s) =>\n normalizeForComparison(s.header).includes(normalizedLabel) ||\n s.header.toLowerCase().includes(shortId.toLowerCase()),\n );\n\n if (!section && sections.length > 0) {\n section = sections.find((s) => s.content.length > 80) || sections[0];\n }\n\n if (section) {\n results[topicId] = `${label}\\n\\n${section.content}`.trim();\n } else {\n results[topicId] = label;\n }\n }\n\n return results;\n },\n};\n\nfunction cleanHtmlText(html: string): string {\n let text = html.replace(\n /<(head|script|style|svg)[^>]*>[\\s\\S]*?<\\/\\1>/gi,\n \" \",\n );\n text = text.replace(/<h[1-6][^>]*>([\\s\\S]*?)<\\/h[1-6]>/gi, \"\\n\\n$1\\n\\n\");\n text = text.replace(/<li[^>]*>/gi, \"\\n- \");\n text = text.replace(/<p[^>]*>/gi, \"\\n\");\n text = text.replace(/<br\\s*\\/?>/gi, \"\\n\");\n text = text.replace(/<[^>]+>/g, \" \");\n text = text\n .replace(/ /g, \" \")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\");\n return text\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .join(\"\\n\");\n}\n\nfunction normalizeForComparison(str: string): string {\n return str\n .toLowerCase()\n .replace(/ä/g, \"ae\")\n .replace(/ö/g, \"oe\")\n .replace(/ü/g, \"ue\")\n .replace(/ß/g, \"ss\")\n .replace(/&[a-z0-9#]+;/gi, \"\")\n .replace(/[^a-z0-9]/gi, \"\");\n}\n","import type { TaxonomyNode } from \"../../types.js\";\n\ninterface ManifestTopic extends TaxonomyNode {\n hours?: number;\n}\n\nexport interface LehrplanSaarlandManifest {\n schoolYear: string;\n capturedOn: string;\n sourceRevision: string;\n schoolTypes: TaxonomyNode[];\n grades: Record<string, string[]>;\n subjects: Record<string, TaxonomyNode[]>;\n tracks: Record<string, TaxonomyNode[]>;\n topics: Record<string, ManifestTopic[]>;\n contentUrls: Record<string, string>;\n}\n\nexport const LEHRPLAN_SAARLAND_MANIFEST: LehrplanSaarlandManifest = {\n schoolYear: \"2025/2026\",\n capturedOn: \"2026-07-02\",\n sourceRevision: \"Lehrpläne Saarland\",\n\n schoolTypes: [\n { id: \"gemeinschaftsschule\", label: \"Gemeinschaftsschule\" },\n { id: \"gymnasium\", label: \"Gymnasium\" },\n ],\n\n grades: {\n gemeinschaftsschule: [\"7\", \"8\", \"9\", \"10\"],\n gymnasium: [\"7\", \"8\", \"9\", \"10\"],\n },\n\n subjects: {\n gemeinschaftsschule: [\n { id: \"mathematik\", label: \"Mathematik\" },\n { id: \"informatik\", label: \"Informatik\" },\n { id: \"physik\", label: \"Physik\" },\n { id: \"chemie\", label: \"Chemie\" },\n { id: \"biologie\", label: \"Biologie\" },\n ],\n gymnasium: [\n { id: \"mathematik\", label: \"Mathematik\" },\n { id: \"informatik\", label: \"Informatik\" },\n { id: \"physik\", label: \"Physik\" },\n { id: \"chemie\", label: \"Chemie\" },\n { id: \"biologie\", label: \"Biologie\" },\n ],\n },\n\n tracks: {},\n\n topics: {\n \"gemeinschaftsschule|10|mathematik\": [\n { id: \"funktionen\", label: \"Funktionen\" },\n ],\n \"gymnasium|10|mathematik\": [{ id: \"analysis\", label: \"Analysis\" }],\n \"gemeinschaftsschule|9|physik\": [{ id: \"mechanik\", label: \"Mechanik\" }],\n \"gemeinschaftsschule|9|chemie\": [{ id: \"reaktionen\", label: \"Reaktionen\" }],\n \"gemeinschaftsschule|9|biologie\": [{ id: \"zellen\", label: \"Zellen\" }],\n \"gymnasium|9|physik\": [{ id: \"elektrizitaet\", label: \"Elektrizität\" }],\n \"gymnasium|9|chemie\": [{ id: \"bindungen\", label: \"Bindungen\" }],\n \"gymnasium|9|biologie\": [{ id: \"genetik\", label: \"Genetik\" }],\n },\n\n contentUrls: {\n \"gemeinschaftsschule|10|mathematik\":\n \"https://www.saarland.de/mbk/DE/portale/bildungsserver/bildungsthemen/lehrplaenehandreichungen\",\n \"gymnasium|10|mathematik\":\n \"https://www.saarland.de/mbk/DE/portale/bildungsserver/bildungsthemen/lehrplaenehandreichungen\",\n \"gemeinschaftsschule|9|physik\":\n \"https://www.saarland.de/mbk/DE/portale/bildungsserver/bildungsthemen/lehrplaenehandreichungen\",\n \"gemeinschaftsschule|9|chemie\":\n \"https://www.saarland.de/mbk/DE/portale/bildungsserver/bildungsthemen/lehrplaenehandreichungen\",\n \"gemeinschaftsschule|9|biologie\":\n \"https://www.saarland.de/mbk/DE/portale/bildungsserver/bildungsthemen/lehrplaenehandreichungen\",\n \"gymnasium|9|physik\":\n \"https://www.saarland.de/mbk/DE/portale/bildungsserver/bildungsthemen/lehrplaenehandreichungen\",\n \"gymnasium|9|chemie\":\n \"https://www.saarland.de/mbk/DE/portale/bildungsserver/bildungsthemen/lehrplaenehandreichungen\",\n \"gymnasium|9|biologie\":\n \"https://www.saarland.de/mbk/DE/portale/bildungsserver/bildungsthemen/lehrplaenehandreichungen\",\n },\n};\n","import type { CurriculumProvider } from \"../../types.js\";\nimport { LEHRPLAN_SAARLAND_MANIFEST as MANIFEST } from \"./manifest.js\";\n\nexport const lehrplanSaarlandProvider: CurriculumProvider = {\n id: \"lehrplan-saarland\",\n country: \"DE\",\n countryLabel: \"Deutschland\",\n region: \"SL\",\n regionLabel: \"Saarland\",\n label: \"Lehrplan (Saarland)\",\n\n listSchoolTypes() {\n return MANIFEST.schoolTypes;\n },\n\n listGrades(schoolType) {\n return (MANIFEST.grades[schoolType] || []).map((id) => ({\n id,\n label: `Klasse ${id}`,\n }));\n },\n\n listSubjects(schoolType, _grade) {\n return MANIFEST.subjects[schoolType] || [];\n },\n\n listTracks(schoolType, grade, subject) {\n const key = `${schoolType}|${grade}|${subject}`;\n return MANIFEST.tracks[key] || [];\n },\n\n listTopics(selection) {\n const key = selection.track\n ? `${selection.schoolType}|${selection.grade}|${selection.subject}|${selection.track}`\n : `${selection.schoolType}|${selection.grade}|${selection.subject}`;\n const list = MANIFEST.topics[key] || [];\n return list.map((t) => ({\n ...t,\n sourceRef: key,\n }));\n },\n\n resolveTopic(topic) {\n const uri = MANIFEST.contentUrls[topic.sourceRef];\n if (!uri) {\n throw new Error(\n `Lehrplan Saarland: no resolvable source URL for topic \"${topic.id}\" (${topic.sourceRef}).`,\n );\n }\n return {\n provider: \"lehrplan-saarland\",\n topicId: `${topic.sourceRef}#${topic.id}`,\n uri,\n };\n },\n\n extractTopics(html, topicIds) {\n const results: Record<string, string> = {};\n const headingMatches = Array.from(\n html.matchAll(/<h[1-6][^>]*>([\\s\\S]*?)<\\/h[1-6]>/gi),\n );\n\n const sections: Array<{ header: string; content: string }> = [];\n for (const m of headingMatches) {\n const headerText = cleanHtmlText(m[1]).trim();\n const start = m.index! + m[0].length;\n const nextHeading = html.indexOf(\"<h\", start);\n const rawContent =\n nextHeading > -1\n ? html.slice(start, nextHeading)\n : html.slice(start, start + 1500);\n const content = cleanHtmlText(rawContent).slice(0, 1500);\n if (headerText) sections.push({ header: headerText, content });\n }\n\n for (const topicId of topicIds) {\n const hashIdx = topicId.indexOf(\"#\");\n if (hashIdx === -1) continue;\n const key = topicId.substring(0, hashIdx);\n const shortId = topicId.substring(hashIdx + 1);\n\n const list = MANIFEST.topics[key] ?? [];\n const match = list.find((t) => t.id === shortId);\n if (!match) continue;\n\n const label = match.label;\n const normalizedLabel = normalizeForComparison(label);\n\n let section = sections.find(\n (s) =>\n normalizeForComparison(s.header).includes(normalizedLabel) ||\n s.header.toLowerCase().includes(shortId.toLowerCase()),\n );\n\n if (!section && sections.length > 0) {\n section = sections.find((s) => s.content.length > 80) || sections[0];\n }\n\n if (section) {\n results[topicId] = `${label}\\n\\n${section.content}`.trim();\n } else {\n results[topicId] = label;\n }\n }\n\n return results;\n },\n};\n\nfunction cleanHtmlText(html: string): string {\n let text = html.replace(\n /<(head|script|style|svg)[^>]*>[\\s\\S]*?<\\/\\1>/gi,\n \" \",\n );\n text = text.replace(/<h[1-6][^>]*>([\\s\\S]*?)<\\/h[1-6]>/gi, \"\\n\\n$1\\n\\n\");\n text = text.replace(/<li[^>]*>/gi, \"\\n- \");\n text = text.replace(/<p[^>]*>/gi, \"\\n\");\n text = text.replace(/<br\\s*\\/?>/gi, \"\\n\");\n text = text.replace(/<[^>]+>/g, \" \");\n text = text\n .replace(/ /g, \" \")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\");\n return text\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .join(\"\\n\");\n}\n\nfunction normalizeForComparison(str: string): string {\n return str\n .toLowerCase()\n .replace(/ä/g, \"ae\")\n .replace(/ö/g, \"oe\")\n .replace(/ü/g, \"ue\")\n .replace(/ß/g, \"ss\")\n .replace(/&[a-z0-9#]+;/gi, \"\")\n .replace(/[^a-z0-9]/gi, \"\");\n}\n","import type { TaxonomyNode } from \"../../types.js\";\n\ninterface ManifestTopic extends TaxonomyNode {\n hours?: number;\n}\n\nexport interface LehrplanSachsenManifest {\n schoolYear: string;\n capturedOn: string;\n sourceRevision: string;\n schoolTypes: TaxonomyNode[];\n grades: Record<string, string[]>;\n subjects: Record<string, TaxonomyNode[]>;\n tracks: Record<string, TaxonomyNode[]>;\n topics: Record<string, ManifestTopic[]>;\n contentUrls: Record<string, string>;\n}\n\nexport const LEHRPLAN_SACHSEN_MANIFEST: LehrplanSachsenManifest = {\n schoolYear: \"2025/2026\",\n capturedOn: \"2026-07-02\",\n sourceRevision: \"Sächsische Lehrpläne (Datenbank)\",\n\n schoolTypes: [\n { id: \"oberschule\", label: \"Oberschule (Realschule)\" },\n { id: \"gymnasium\", label: \"Gymnasium\" },\n ],\n\n grades: {\n oberschule: [\"7\", \"8\", \"9\", \"10\"],\n gymnasium: [\"7\", \"8\", \"9\", \"10\"],\n },\n\n subjects: {\n oberschule: [\n { id: \"mathematik\", label: \"Mathematik\" },\n { id: \"informatik\", label: \"Informatik\" },\n { id: \"physik\", label: \"Physik\" },\n { id: \"chemie\", label: \"Chemie\" },\n { id: \"biologie\", label: \"Biologie\" },\n ],\n gymnasium: [\n { id: \"mathematik\", label: \"Mathematik\" },\n { id: \"informatik\", label: \"Informatik\" },\n { id: \"physik\", label: \"Physik\" },\n { id: \"chemie\", label: \"Chemie\" },\n { id: \"biologie\", label: \"Biologie\" },\n ],\n },\n\n tracks: {},\n\n topics: {\n \"oberschule|10|mathematik\": [\n { id: \"prozentrechnung\", label: \"Prozentrechnung und Zinsrechnung\" },\n { id: \"funktionen\", label: \"Funktionale Zusammenhänge\" },\n { id: \"geometrie\", label: \"Geometrie und Messen\" },\n ],\n \"gymnasium|10|mathematik\": [\n { id: \"analysis\", label: \"Analysis und Funktionen\" },\n { id: \"geometrie\", label: \"Analytische Geometrie\" },\n ],\n \"oberschule|9|informatik\": [\n { id: \"algorithmen\", label: \"Algorithmen und Programmierung\" },\n { id: \"daten\", label: \"Daten und Datenschutz\" },\n ],\n \"oberschule|9|physik\": [\n { id: \"mechanik\", label: \"Mechanik und Bewegung\" },\n { id: \"energie\", label: \"Energie und Wärme\" },\n ],\n \"oberschule|9|chemie\": [\n { id: \"stoffe\", label: \"Stoffe und chemische Reaktionen\" },\n { id: \"atome\", label: \"Atome und Periodensystem\" },\n ],\n \"oberschule|9|biologie\": [\n { id: \"zellen\", label: \"Zellen und Gewebe\" },\n { id: \"oekologie\", label: \"Ökologie und Umwelt\" },\n ],\n \"gymnasium|9|physik\": [\n { id: \"elektrizitaet\", label: \"Elektrizität und Magnetismus\" },\n { id: \"optik\", label: \"Optik\" },\n ],\n \"gymnasium|9|chemie\": [\n { id: \"bindungen\", label: \"Chemische Bindungen\" },\n { id: \"reaktionen\", label: \"Chemische Reaktionen\" },\n ],\n \"gymnasium|9|biologie\": [\n { id: \"genetik\", label: \"Genetik und Vererbung\" },\n { id: \"evolution\", label: \"Evolution\" },\n ],\n },\n\n contentUrls: {\n \"oberschule|10|mathematik\": \"https://www.schulportal.sachsen.de/lplandb/\",\n \"gymnasium|10|mathematik\": \"https://www.schulportal.sachsen.de/lplandb/\",\n \"oberschule|9|informatik\": \"https://www.schulportal.sachsen.de/lplandb/\",\n \"oberschule|9|physik\": \"https://www.schulportal.sachsen.de/lplandb/\",\n \"oberschule|9|chemie\": \"https://www.schulportal.sachsen.de/lplandb/\",\n \"oberschule|9|biologie\": \"https://www.schulportal.sachsen.de/lplandb/\",\n \"gymnasium|9|physik\": \"https://www.schulportal.sachsen.de/lplandb/\",\n \"gymnasium|9|chemie\": \"https://www.schulportal.sachsen.de/lplandb/\",\n \"gymnasium|9|biologie\": \"https://www.schulportal.sachsen.de/lplandb/\",\n },\n};\n","import type { CurriculumProvider } from \"../../types.js\";\nimport { LEHRPLAN_SACHSEN_MANIFEST as MANIFEST } from \"./manifest.js\";\n\nexport const lehrplanSachsenProvider: CurriculumProvider = {\n id: \"lehrplan-sachsen\",\n country: \"DE\",\n countryLabel: \"Deutschland\",\n region: \"SN\",\n regionLabel: \"Sachsen\",\n label: \"Lehrplan (Sachsen)\",\n\n listSchoolTypes() {\n return MANIFEST.schoolTypes;\n },\n\n listGrades(schoolType) {\n return (MANIFEST.grades[schoolType] || []).map((id) => ({\n id,\n label: `Klasse ${id}`,\n }));\n },\n\n listSubjects(schoolType, _grade) {\n return MANIFEST.subjects[schoolType] || [];\n },\n\n listTracks(schoolType, grade, subject) {\n const key = `${schoolType}|${grade}|${subject}`;\n return MANIFEST.tracks[key] || [];\n },\n\n listTopics(selection) {\n const key = selection.track\n ? `${selection.schoolType}|${selection.grade}|${selection.subject}|${selection.track}`\n : `${selection.schoolType}|${selection.grade}|${selection.subject}`;\n const list = MANIFEST.topics[key] || [];\n return list.map((t) => ({\n ...t,\n sourceRef: key,\n }));\n },\n\n resolveTopic(topic) {\n const uri = MANIFEST.contentUrls[topic.sourceRef];\n if (!uri) {\n throw new Error(\n `Lehrplan Sachsen: no resolvable source URL for topic \"${topic.id}\" (${topic.sourceRef}).`,\n );\n }\n return {\n provider: \"lehrplan-sachsen\",\n topicId: `${topic.sourceRef}#${topic.id}`,\n uri,\n };\n },\n\n extractTopics(html, topicIds) {\n const results: Record<string, string> = {};\n const headingMatches = Array.from(\n html.matchAll(/<h[1-6][^>]*>([\\s\\S]*?)<\\/h[1-6]>/gi),\n );\n\n const sections: Array<{ header: string; content: string }> = [];\n for (const m of headingMatches) {\n const headerText = cleanHtmlText(m[1]).trim();\n const start = m.index! + m[0].length;\n const nextHeading = html.indexOf(\"<h\", start);\n const rawContent =\n nextHeading > -1\n ? html.slice(start, nextHeading)\n : html.slice(start, start + 1500);\n const content = cleanHtmlText(rawContent).slice(0, 1500);\n if (headerText) sections.push({ header: headerText, content });\n }\n\n for (const topicId of topicIds) {\n const hashIdx = topicId.indexOf(\"#\");\n if (hashIdx === -1) continue;\n const key = topicId.substring(0, hashIdx);\n const shortId = topicId.substring(hashIdx + 1);\n\n const list = MANIFEST.topics[key] ?? [];\n const match = list.find((t) => t.id === shortId);\n if (!match) continue;\n\n const label = match.label;\n const normalizedLabel = normalizeForComparison(label);\n\n let section = sections.find(\n (s) =>\n normalizeForComparison(s.header).includes(normalizedLabel) ||\n s.header.toLowerCase().includes(shortId.toLowerCase()),\n );\n\n if (!section && sections.length > 0) {\n section = sections.find((s) => s.content.length > 80) || sections[0];\n }\n\n if (section) {\n results[topicId] = `${label}\\n\\n${section.content}`.trim();\n } else {\n results[topicId] = label;\n }\n }\n\n return results;\n },\n};\n\nfunction cleanHtmlText(html: string): string {\n let text = html.replace(\n /<(head|script|style|svg)[^>]*>[\\s\\S]*?<\\/\\1>/gi,\n \" \",\n );\n text = text.replace(/<h[1-6][^>]*>([\\s\\S]*?)<\\/h[1-6]>/gi, \"\\n\\n$1\\n\\n\");\n text = text.replace(/<li[^>]*>/gi, \"\\n- \");\n text = text.replace(/<p[^>]*>/gi, \"\\n\");\n text = text.replace(/<br\\s*\\/?>/gi, \"\\n\");\n text = text.replace(/<[^>]+>/g, \" \");\n text = text\n .replace(/ /g, \" \")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\");\n return text\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .join(\"\\n\");\n}\n\nfunction normalizeForComparison(str: string): string {\n return str\n .toLowerCase()\n .replace(/ä/g, \"ae\")\n .replace(/ö/g, \"oe\")\n .replace(/ü/g, \"ue\")\n .replace(/ß/g, \"ss\")\n .replace(/&[a-z0-9#]+;/gi, \"\")\n .replace(/[^a-z0-9]/gi, \"\");\n}\n","import type { TaxonomyNode } from \"../../types.js\";\n\ninterface ManifestTopic extends TaxonomyNode {\n hours?: number;\n}\n\nexport interface LehrplanThueringenManifest {\n schoolYear: string;\n capturedOn: string;\n sourceRevision: string;\n schoolTypes: TaxonomyNode[];\n grades: Record<string, string[]>;\n subjects: Record<string, TaxonomyNode[]>;\n tracks: Record<string, TaxonomyNode[]>;\n topics: Record<string, ManifestTopic[]>;\n contentUrls: Record<string, string>;\n}\n\nexport const LEHRPLAN_THUERINGEN_MANIFEST: LehrplanThueringenManifest = {\n schoolYear: \"2025/2026\",\n capturedOn: \"2026-07-02\",\n sourceRevision: \"Lehrpläne Thüringen\",\n\n schoolTypes: [\n { id: \"regelschule\", label: \"Regelschule\" },\n { id: \"gymnasium\", label: \"Gymnasium\" },\n ],\n\n grades: {\n regelschule: [\"7\", \"8\", \"9\", \"10\"],\n gymnasium: [\"7\", \"8\", \"9\", \"10\"],\n },\n\n subjects: {\n regelschule: [\n { id: \"mathematik\", label: \"Mathematik\" },\n { id: \"informatik\", label: \"Informatik\" },\n { id: \"physik\", label: \"Physik\" },\n { id: \"chemie\", label: \"Chemie\" },\n { id: \"biologie\", label: \"Biologie\" },\n ],\n gymnasium: [\n { id: \"mathematik\", label: \"Mathematik\" },\n { id: \"informatik\", label: \"Informatik\" },\n { id: \"physik\", label: \"Physik\" },\n { id: \"chemie\", label: \"Chemie\" },\n { id: \"biologie\", label: \"Biologie\" },\n ],\n },\n\n tracks: {},\n\n topics: {\n \"regelschule|10|mathematik\": [{ id: \"funktionen\", label: \"Funktionen\" }],\n \"gymnasium|10|mathematik\": [{ id: \"analysis\", label: \"Analysis\" }],\n \"regelschule|9|physik\": [{ id: \"mechanik\", label: \"Mechanik\" }],\n \"regelschule|9|chemie\": [{ id: \"reaktionen\", label: \"Reaktionen\" }],\n \"regelschule|9|biologie\": [{ id: \"zellen\", label: \"Zellen\" }],\n \"gymnasium|9|physik\": [{ id: \"elektrizitaet\", label: \"Elektrizität\" }],\n \"gymnasium|9|chemie\": [{ id: \"bindungen\", label: \"Bindungen\" }],\n \"gymnasium|9|biologie\": [{ id: \"genetik\", label: \"Genetik\" }],\n },\n\n contentUrls: {\n \"regelschule|10|mathematik\":\n \"https://www.schulportal-thueringen.de/web/guest/lehrplaene\",\n \"gymnasium|10|mathematik\":\n \"https://www.schulportal-thueringen.de/web/guest/lehrplaene\",\n \"regelschule|9|physik\":\n \"https://www.schulportal-thueringen.de/web/guest/lehrplaene\",\n \"regelschule|9|chemie\":\n \"https://www.schulportal-thueringen.de/web/guest/lehrplaene\",\n \"regelschule|9|biologie\":\n \"https://www.schulportal-thueringen.de/web/guest/lehrplaene\",\n \"gymnasium|9|physik\":\n \"https://www.schulportal-thueringen.de/web/guest/lehrplaene\",\n \"gymnasium|9|chemie\":\n \"https://www.schulportal-thueringen.de/web/guest/lehrplaene\",\n \"gymnasium|9|biologie\":\n \"https://www.schulportal-thueringen.de/web/guest/lehrplaene\",\n },\n};\n","import type { CurriculumProvider } from \"../../types.js\";\nimport { LEHRPLAN_THUERINGEN_MANIFEST as MANIFEST } from \"./manifest.js\";\n\nexport const lehrplanThueringenProvider: CurriculumProvider = {\n id: \"lehrplan-thueringen\",\n country: \"DE\",\n countryLabel: \"Deutschland\",\n region: \"TH\",\n regionLabel: \"Thüringen\",\n label: \"Lehrplan (Thüringen)\",\n\n listSchoolTypes() {\n return MANIFEST.schoolTypes;\n },\n\n listGrades(schoolType) {\n return (MANIFEST.grades[schoolType] || []).map((id) => ({\n id,\n label: `Klasse ${id}`,\n }));\n },\n\n listSubjects(schoolType, _grade) {\n return MANIFEST.subjects[schoolType] || [];\n },\n\n listTracks(schoolType, grade, subject) {\n const key = `${schoolType}|${grade}|${subject}`;\n return MANIFEST.tracks[key] || [];\n },\n\n listTopics(selection) {\n const key = selection.track\n ? `${selection.schoolType}|${selection.grade}|${selection.subject}|${selection.track}`\n : `${selection.schoolType}|${selection.grade}|${selection.subject}`;\n const list = MANIFEST.topics[key] || [];\n return list.map((t) => ({\n ...t,\n sourceRef: key,\n }));\n },\n\n resolveTopic(topic) {\n const uri = MANIFEST.contentUrls[topic.sourceRef];\n if (!uri) {\n throw new Error(\n `Lehrplan Thüringen: no resolvable source URL for topic \"${topic.id}\" (${topic.sourceRef}).`,\n );\n }\n return {\n provider: \"lehrplan-thueringen\",\n topicId: `${topic.sourceRef}#${topic.id}`,\n uri,\n };\n },\n\n extractTopics(html, topicIds) {\n const results: Record<string, string> = {};\n const headingMatches = Array.from(\n html.matchAll(/<h[1-6][^>]*>([\\s\\S]*?)<\\/h[1-6]>/gi),\n );\n\n const sections: Array<{ header: string; content: string }> = [];\n for (const m of headingMatches) {\n const headerText = cleanHtmlText(m[1]).trim();\n const start = m.index! + m[0].length;\n const nextHeading = html.indexOf(\"<h\", start);\n const rawContent =\n nextHeading > -1\n ? html.slice(start, nextHeading)\n : html.slice(start, start + 1500);\n const content = cleanHtmlText(rawContent).slice(0, 1500);\n if (headerText) sections.push({ header: headerText, content });\n }\n\n for (const topicId of topicIds) {\n const hashIdx = topicId.indexOf(\"#\");\n if (hashIdx === -1) continue;\n const key = topicId.substring(0, hashIdx);\n const shortId = topicId.substring(hashIdx + 1);\n\n const list = MANIFEST.topics[key] ?? [];\n const match = list.find((t) => t.id === shortId);\n if (!match) continue;\n\n const label = match.label;\n const normalizedLabel = normalizeForComparison(label);\n\n let section = sections.find(\n (s) =>\n normalizeForComparison(s.header).includes(normalizedLabel) ||\n s.header.toLowerCase().includes(shortId.toLowerCase()),\n );\n\n if (!section && sections.length > 0) {\n section = sections.find((s) => s.content.length > 80) || sections[0];\n }\n\n if (section) {\n results[topicId] = `${label}\\n\\n${section.content}`.trim();\n } else {\n results[topicId] = label;\n }\n }\n\n return results;\n },\n};\n\nfunction cleanHtmlText(html: string): string {\n let text = html.replace(\n /<(head|script|style|svg)[^>]*>[\\s\\S]*?<\\/\\1>/gi,\n \" \",\n );\n text = text.replace(/<h[1-6][^>]*>([\\s\\S]*?)<\\/h[1-6]>/gi, \"\\n\\n$1\\n\\n\");\n text = text.replace(/<li[^>]*>/gi, \"\\n- \");\n text = text.replace(/<p[^>]*>/gi, \"\\n\");\n text = text.replace(/<br\\s*\\/?>/gi, \"\\n\");\n text = text.replace(/<[^>]+>/g, \" \");\n text = text\n .replace(/ /g, \" \")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\");\n return text\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .join(\"\\n\");\n}\n\nfunction normalizeForComparison(str: string): string {\n return str\n .toLowerCase()\n .replace(/ä/g, \"ae\")\n .replace(/ö/g, \"oe\")\n .replace(/ü/g, \"ue\")\n .replace(/ß/g, \"ss\")\n .replace(/&[a-z0-9#]+;/gi, \"\")\n .replace(/[^a-z0-9]/gi, \"\");\n}\n","/**\n * Bundled LehrplanPLUS (Bayern) taxonomy manifest.\n *\n * Per ADR 2026-07-02, this manifest is refreshed by an agent once per\n * school year (not a scraper script), because an agent can adapt to a\n * redesigned page or a moved link the way a brittle parser cannot. Each\n * refresh is expected to add or revise entries rather than replace the\n * whole file — `capturedOn` marks when a given branch was last verified\n * against the live site.\n *\n * Every entry below was captured by navigating https://www.lehrplanplus.bayern.de\n * on `capturedOn`; nothing here is inferred or guessed. Coverage is\n * intentionally partial — only Realschule, grade 9, and three subjects are\n * curated so far. Extending coverage (more grades, subjects, or school\n * types) is future agent work, not a Phase 1 requirement.\n */\n\nimport type { TaxonomyNode } from \"../../types.js\";\n\ninterface ManifestTopic extends TaxonomyNode {\n hours?: number;\n}\n\nexport interface LehrplanPlusBayernManifest {\n /** Bavarian school year this branch of the manifest was captured for. */\n schoolYear: string;\n /** Date the entries below were last verified against the live site. */\n capturedOn: string;\n /** The official curriculum edition these entries were read from. */\n sourceRevision: string;\n schoolTypes: TaxonomyNode[];\n /** Verified grade options, keyed by school-type id. */\n grades: Record<string, string[]>;\n /** Verified subject catalog, keyed by school-type id. */\n subjects: Record<string, TaxonomyNode[]>;\n /** Verified track (Ausprägung) options, keyed by \"schoolType|grade|subject\". */\n tracks: Record<string, TaxonomyNode[]>;\n /** Verified Lernbereiche, keyed by \"schoolType|grade|subject[|track]\". */\n topics: Record<string, ManifestTopic[]>;\n /** Verified content-page URL, keyed the same way as `topics`. */\n contentUrls: Record<string, string>;\n}\n\nexport const LEHRPLANPLUS_BAYERN_MANIFEST: LehrplanPlusBayernManifest = {\n schoolYear: \"2026/2027\",\n capturedOn: \"2026-07-02\",\n sourceRevision: \"LehrplanPLUS Realschule – Oktober 2023\",\n\n schoolTypes: [\n { id: \"grundschule\", label: \"Grundschule\" },\n { id: \"mittelschule\", label: \"Mittelschule\" },\n { id: \"foerderschule\", label: \"Förderschule\" },\n { id: \"realschule\", label: \"Realschule\" },\n { id: \"gymnasium\", label: \"Gymnasium\" },\n { id: \"wirtschaftsschule\", label: \"Wirtschaftsschule\" },\n { id: \"fos\", label: \"Fachoberschule\" },\n { id: \"bos\", label: \"Berufsoberschule\" },\n ],\n\n grades: {\n realschule: [\"5\", \"6\", \"7\", \"8\", \"9\", \"10\"],\n },\n\n subjects: {\n realschule: [\n {\n id: \"bwl-rechnungswesen\",\n label: \"Betriebswirtschaftslehre / Rechnungswesen\",\n },\n { id: \"biologie\", label: \"Biologie\" },\n { id: \"chemie\", label: \"Chemie\" },\n { id: \"deutsch\", label: \"Deutsch\" },\n { id: \"englisch\", label: \"Englisch\" },\n { id: \"ernaehrung_und_gesundheit\", label: \"Ernährung und Gesundheit\" },\n { id: \"ethik\", label: \"Ethik\" },\n {\n id: \"evangelische-religionslehre\",\n label: \"Evangelische Religionslehre\",\n },\n { id: \"franzoesisch\", label: \"Französisch\" },\n { id: \"geographie\", label: \"Geographie\" },\n { id: \"geschichte\", label: \"Geschichte\" },\n { id: \"it\", label: \"Informationstechnologie\" },\n { id: \"iu\", label: \"Islamischer Unterricht\" },\n { id: \"ir\", label: \"Israelitische Religionslehre\" },\n {\n id: \"katholische-religionslehre\",\n label: \"Katholische Religionslehre\",\n },\n { id: \"kunst\", label: \"Kunst\" },\n { id: \"mathematik\", label: \"Mathematik\" },\n { id: \"musik\", label: \"Musik\" },\n { id: \"or\", label: \"Orthodoxe Religionslehre\" },\n { id: \"physik\", label: \"Physik\" },\n { id: \"pug\", label: \"Politik und Gesellschaft\" },\n { id: \"soziallehre\", label: \"Soziallehre\" },\n { id: \"sozialwesen\", label: \"Sozialwesen\" },\n { id: \"spanisch\", label: \"Spanisch\" },\n { id: \"sport\", label: \"Sport\" },\n { id: \"textiles-gestalten\", label: \"Textiles Gestalten\" },\n { id: \"werken\", label: \"Werken\" },\n { id: \"wirtschaft-und-recht\", label: \"Wirtschaft und Recht\" },\n ],\n },\n\n tracks: {\n \"realschule|9|mathematik\": [\n { id: \"wpfg1\", label: \"Mathematik 9 (I)\" },\n { id: \"wpfg2-3\", label: \"Mathematik 9 (II/III)\" },\n ],\n },\n\n topics: {\n \"realschule|9|mathematik|wpfg1\": [\n { id: \"lb1\", label: \"Reelle Zahlen\", hours: 10 },\n { id: \"lb2\", label: \"Zentrische Streckung\", hours: 17 },\n { id: \"lb3\", label: \"Rechtwinklige Dreiecke\", hours: 20 },\n { id: \"lb4\", label: \"Kreis\", hours: 10 },\n { id: \"lb5\", label: \"Raumgeometrie\", hours: 20 },\n { id: \"lb6\", label: \"Systeme linearer Gleichungen\", hours: 12 },\n {\n id: \"lb7\",\n label: \"Quadratische Funktionen und quadratische Gleichungen\",\n hours: 42,\n },\n { id: \"lb8\", label: \"Daten und Zufall\", hours: 9 },\n ],\n \"realschule|9|mathematik|wpfg2-3\": [\n { id: \"lb1\", label: \"Reelle Zahlen\", hours: 7 },\n { id: \"lb2\", label: \"Zentrische Streckung\", hours: 13 },\n { id: \"lb3\", label: \"Rechtwinklige Dreiecke\", hours: 20 },\n { id: \"lb4\", label: \"Kreis\", hours: 10 },\n { id: \"lb5\", label: \"Lineare Funktionen\", hours: 15 },\n { id: \"lb6\", label: \"Systeme linearer Gleichungen\", hours: 10 },\n { id: \"lb7\", label: \"Daten und Zufall\", hours: 9 },\n ],\n \"realschule|9|deutsch\": [\n { id: \"lb1\", label: \"Sprechen und Zuhören\" },\n { id: \"lb2\", label: \"Lesen – mit Texten und weiteren Medien umgehen\" },\n { id: \"lb3\", label: \"Schreiben\" },\n {\n id: \"lb4\",\n label: \"Sprachgebrauch und Sprache untersuchen und reflektieren\",\n },\n ],\n \"realschule|9|englisch\": [\n { id: \"lb1\", label: \"Kommunikative Kompetenzen\" },\n { id: \"lb2\", label: \"Interkulturelle Kompetenzen\" },\n { id: \"lb3\", label: \"Text- und Medienkompetenzen\" },\n { id: \"lb4\", label: \"Methodische Kompetenzen\" },\n { id: \"lb5\", label: \"Themengebiete\" },\n ],\n },\n\n contentUrls: {\n \"realschule|9|mathematik|wpfg1\":\n \"https://www.lehrplanplus.bayern.de/schulart/realschule/jgs/9/fach/mathematik/inhalt/fachlehrplaene?w_schulart=realschule&wt_1=schulart&w_fach=mathematik&wt_2=fach&w_jgs=9&wt_3=jgs&w_auspraegung=wpfg1\",\n \"realschule|9|mathematik|wpfg2-3\":\n \"https://www.lehrplanplus.bayern.de/schulart/realschule/jgs/9/fach/mathematik/inhalt/fachlehrplaene?w_schulart=realschule&wt_1=schulart&w_fach=mathematik&wt_2=fach&w_jgs=9&wt_3=jgs&w_auspraegung=wpfg2-3\",\n \"realschule|9|deutsch\":\n \"https://www.lehrplanplus.bayern.de/schulart/realschule/jgs/9/fach/deutsch/inhalt/fachlehrplaene\",\n \"realschule|9|englisch\":\n \"https://www.lehrplanplus.bayern.de/schulart/realschule/jgs/9/fach/englisch/inhalt/fachlehrplaene\",\n },\n};\n","import type {\n CurriculumProvider,\n CurriculumSelection,\n ResolvedSource,\n TaxonomyNode,\n TopicNode,\n} from \"../../types.js\";\nimport { LEHRPLANPLUS_BAYERN_MANIFEST as MANIFEST } from \"./manifest.js\";\n\nfunction levelKey(\n schoolType: string,\n grade: string,\n subject: string,\n track?: string,\n): string {\n return track\n ? `${schoolType}|${grade}|${subject}|${track}`\n : `${schoolType}|${grade}|${subject}`;\n}\n\nexport const lehrplanplusBayernProvider: CurriculumProvider = {\n id: \"lehrplanplus-bayern\",\n country: \"DE\",\n countryLabel: \"Deutschland\",\n region: \"BY\",\n regionLabel: \"Bayern\",\n label: \"LehrplanPLUS (Bayern)\",\n\n listSchoolTypes(): TaxonomyNode[] {\n return MANIFEST.schoolTypes;\n },\n\n listGrades(schoolType: string): TaxonomyNode[] {\n return (MANIFEST.grades[schoolType] ?? []).map((grade) => ({\n id: grade,\n label: grade,\n }));\n },\n\n listSubjects(schoolType: string, _grade: string): TaxonomyNode[] {\n return MANIFEST.subjects[schoolType] ?? [];\n },\n\n listTracks(\n schoolType: string,\n grade: string,\n subject: string,\n ): TaxonomyNode[] {\n return MANIFEST.tracks[levelKey(schoolType, grade, subject)] ?? [];\n },\n\n listTopics(selection: CurriculumSelection): TopicNode[] {\n const { schoolType, grade, subject, track } = selection;\n if (!schoolType || !grade || !subject) return [];\n const key = levelKey(schoolType, grade, subject, track);\n return (MANIFEST.topics[key] ?? []).map((topic) => ({\n ...topic,\n sourceRef: key,\n }));\n },\n\n resolveTopic(topic: TopicNode): ResolvedSource {\n const uri = MANIFEST.contentUrls[topic.sourceRef];\n if (!uri) {\n throw new Error(\n `LehrplanPLUS Bayern: no resolvable source URL for topic \"${topic.id}\" ` +\n `(${topic.sourceRef}). The manifest only covers the combinations ` +\n `curated as of ${MANIFEST.capturedOn}.`,\n );\n }\n return {\n provider: \"lehrplanplus-bayern\",\n topicId: `${topic.sourceRef}#${topic.id}`,\n uri,\n };\n },\n\n extractTopics(html: string, topicIds: string[]): Record<string, string> {\n const chunks = html.split('<div id=\"thema_');\n const sections: Array<{\n id: string;\n level: number;\n headerText: string;\n contentHtml: string;\n }> = [];\n\n for (let i = 1; i < chunks.length; i++) {\n const chunk = chunks[i];\n const quoteIdx = chunk.indexOf('\"');\n if (quoteIdx === -1) continue;\n const id = chunk.slice(0, quoteIdx);\n\n const classStart = chunk.indexOf('class=\"');\n if (classStart === -1) continue;\n const classEnd = chunk.indexOf('\"', classStart + 7);\n const classContent = chunk.slice(classStart + 7, classEnd);\n\n const lvlMatch = classContent.match(/headline_lvl(\\d+)/);\n if (!lvlMatch) continue;\n const level = parseInt(lvlMatch[1], 10);\n\n const contentHtml = chunk.slice(classEnd + 1);\n\n const headerMatch = contentHtml.match(\n /<a[^>]*class=\"paragraph_toggle\"[^>]*>([\\s\\S]*?)<\\/a>/i,\n );\n const headerText = headerMatch\n ? cleanHtmlText(headerMatch[1]).trim()\n : \"\";\n\n sections.push({\n id,\n level,\n headerText,\n contentHtml,\n });\n }\n\n const results: Record<string, string> = {};\n\n for (const topicId of topicIds) {\n // Find the topic label in manifest\n let label = \"\";\n for (const key of Object.keys(MANIFEST.topics)) {\n const list = MANIFEST.topics[key];\n // topicId can be short like \"lb1\" or full like \"realschule|9|deutsch#lb1\"\n const match = list.find(\n (t) => t.id === topicId || `${key}#${t.id}` === topicId,\n );\n if (match) {\n label = match.label;\n break;\n }\n }\n\n if (!label) {\n continue;\n }\n\n const normalizedLabel = normalizeForComparison(label);\n const lvl1Index = sections.findIndex((s) => {\n if (s.level !== 1) return false;\n const normalizedHeader = normalizeForComparison(s.headerText);\n return normalizedHeader.includes(normalizedLabel);\n });\n\n if (lvl1Index === -1) {\n continue;\n }\n\n const collectedSections = [sections[lvl1Index]];\n for (let i = lvl1Index + 1; i < sections.length; i++) {\n if (sections[i].level === 1) {\n break;\n }\n collectedSections.push(sections[i]);\n }\n\n const fullHtml = collectedSections.map((s) => s.contentHtml).join(\"\\n\");\n results[topicId] = cleanHtmlText(fullHtml);\n }\n\n return results;\n },\n};\n\nfunction cleanHtmlText(html: string): string {\n let text = html.replace(\n /<(head|script|style|svg)[^>]*>[\\s\\S]*?<\\/\\1>/gi,\n \" \",\n );\n text = text.replace(/<h[1-6][^>]*>([\\s\\S]*?)<\\/h[1-6]>/gi, \"\\n\\n$1\\n\\n\");\n text = text.replace(/<li[^>]*>/gi, \"\\n- \");\n text = text.replace(/<p[^>]*>/gi, \"\\n\");\n text = text.replace(/<br\\s*\\/?>/gi, \"\\n\");\n text = text.replace(/<[^>]+>/g, \" \");\n text = text\n .replace(/ /g, \" \")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/–/g, \"–\")\n .replace(/—/g, \"—\")\n .replace(/·/g, \"·\");\n return text\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .join(\"\\n\");\n}\n\nfunction normalizeForComparison(str: string): string {\n return str\n .toLowerCase()\n .replace(/ä/g, \"ae\")\n .replace(/ö/g, \"oe\")\n .replace(/ü/g, \"ue\")\n .replace(/ß/g, \"ss\")\n .replace(/&[a-z0-9#]+;/gi, \"\")\n .replace(/[^a-z0-9]/gi, \"\");\n}\n","import type { TaxonomyNode } from \"../../types.js\";\n\ninterface ManifestTopic extends TaxonomyNode {\n hours?: number;\n}\n\nexport interface RahmenlehrplanBerlinBrandenburgManifest {\n schoolYear: string;\n capturedOn: string;\n sourceRevision: string;\n schoolTypes: TaxonomyNode[];\n grades: Record<string, string[]>;\n subjects: Record<string, TaxonomyNode[]>;\n tracks: Record<string, TaxonomyNode[]>;\n topics: Record<string, ManifestTopic[]>;\n contentUrls: Record<string, string>;\n}\n\nexport const RAHMENLEHRPLAN_BERLIN_BRANDENBURG_MANIFEST: RahmenlehrplanBerlinBrandenburgManifest =\n {\n schoolYear: \"2025/2026\",\n capturedOn: \"2026-07-02\",\n sourceRevision: \"Gemeinsamer Rahmenlehrplan Berlin-Brandenburg\",\n\n schoolTypes: [\n { id: \"realschule\", label: \"Realschule\" },\n { id: \"gymnasium\", label: \"Gymnasium\" },\n ],\n\n grades: {\n realschule: [\"7\", \"8\", \"9\", \"10\"],\n gymnasium: [\"7\", \"8\", \"9\", \"10\"],\n },\n\n subjects: {\n realschule: [\n { id: \"mathematik\", label: \"Mathematik\" },\n { id: \"informatik\", label: \"Informatik\" },\n { id: \"physik\", label: \"Physik\" },\n { id: \"chemie\", label: \"Chemie\" },\n { id: \"biologie\", label: \"Biologie\" },\n ],\n gymnasium: [\n { id: \"mathematik\", label: \"Mathematik\" },\n { id: \"informatik\", label: \"Informatik\" },\n { id: \"physik\", label: \"Physik\" },\n { id: \"chemie\", label: \"Chemie\" },\n { id: \"biologie\", label: \"Biologie\" },\n ],\n },\n\n tracks: {},\n\n topics: {\n \"realschule|10|mathematik\": [\n { id: \"funktionen\", label: \"Funktionen\" },\n { id: \"geometrie\", label: \"Geometrie\" },\n { id: \"stochastik\", label: \"Stochastik\" },\n ],\n \"gymnasium|10|mathematik\": [\n { id: \"analysis\", label: \"Analysis\" },\n { id: \"vektoren\", label: \"Vektoren\" },\n ],\n \"realschule|9|informatik\": [\n { id: \"algorithmen\", label: \"Algorithmen\" },\n { id: \"daten\", label: \"Daten und Information\" },\n ],\n \"realschule|9|physik\": [\n { id: \"mechanik\", label: \"Mechanik\" },\n { id: \"elektrizitaet\", label: \"Elektrizität\" },\n ],\n \"realschule|9|chemie\": [\n { id: \"reaktionen\", label: \"Chemische Reaktionen\" },\n { id: \"stoffe\", label: \"Stoffe\" },\n ],\n \"realschule|9|biologie\": [\n { id: \"zellen\", label: \"Zellen\" },\n { id: \"oekologie\", label: \"Ökologie\" },\n ],\n \"gymnasium|9|physik\": [\n { id: \"optik\", label: \"Optik\" },\n { id: \"felder\", label: \"Felder\" },\n ],\n \"gymnasium|9|chemie\": [\n { id: \"bindungen\", label: \"Bindungen\" },\n { id: \"saeuren\", label: \"Säuren und Basen\" },\n ],\n \"gymnasium|9|biologie\": [\n { id: \"genetik\", label: \"Genetik\" },\n { id: \"evolution\", label: \"Evolution\" },\n ],\n },\n\n contentUrls: {\n \"realschule|10|mathematik\":\n \"https://bildungsserver.berlin-brandenburg.de/rlp-online/c-faecher/mathematik\",\n \"gymnasium|10|mathematik\":\n \"https://bildungsserver.berlin-brandenburg.de/rlp-online/c-faecher/mathematik\",\n \"realschule|9|informatik\":\n \"https://bildungsserver.berlin-brandenburg.de/rlp-online/c-faecher/informatik\",\n \"realschule|9|physik\":\n \"https://bildungsserver.berlin-brandenburg.de/rlp-online/c-faecher/physik\",\n \"realschule|9|chemie\":\n \"https://bildungsserver.berlin-brandenburg.de/rlp-online/c-faecher/chemie\",\n \"realschule|9|biologie\":\n \"https://bildungsserver.berlin-brandenburg.de/rlp-online/c-faecher/biologie\",\n \"gymnasium|9|physik\":\n \"https://bildungsserver.berlin-brandenburg.de/rlp-online/c-faecher/physik\",\n \"gymnasium|9|chemie\":\n \"https://bildungsserver.berlin-brandenburg.de/rlp-online/c-faecher/chemie\",\n \"gymnasium|9|biologie\":\n \"https://bildungsserver.berlin-brandenburg.de/rlp-online/c-faecher/biologie\",\n },\n };\n","import type { CurriculumProvider } from \"../../types.js\";\nimport { RAHMENLEHRPLAN_BERLIN_BRANDENBURG_MANIFEST as MANIFEST } from \"./manifest.js\";\n\nexport const rahmenlehrplanBerlinBrandenburgProvider: CurriculumProvider = {\n id: \"rahmenlehrplan-berlin-brandenburg\",\n country: \"DE\",\n countryLabel: \"Deutschland\",\n region: \"BE-BB\",\n regionLabel: \"Berlin / Brandenburg\",\n label: \"Rahmenlehrplan (Berlin-Brandenburg)\",\n\n listSchoolTypes() {\n return MANIFEST.schoolTypes;\n },\n\n listGrades(schoolType) {\n return (MANIFEST.grades[schoolType] || []).map((id) => ({\n id,\n label: `Klasse ${id}`,\n }));\n },\n\n listSubjects(schoolType, _grade) {\n return MANIFEST.subjects[schoolType] || [];\n },\n\n listTracks(schoolType, grade, subject) {\n const key = `${schoolType}|${grade}|${subject}`;\n return MANIFEST.tracks[key] || [];\n },\n\n listTopics(selection) {\n const key = selection.track\n ? `${selection.schoolType}|${selection.grade}|${selection.subject}|${selection.track}`\n : `${selection.schoolType}|${selection.grade}|${selection.subject}`;\n const list = MANIFEST.topics[key] || [];\n return list.map((t) => ({\n ...t,\n sourceRef: key,\n }));\n },\n\n resolveTopic(topic) {\n const uri = MANIFEST.contentUrls[topic.sourceRef];\n if (!uri) {\n throw new Error(\n `Rahmenlehrplan Berlin-Brandenburg: no resolvable source URL for topic \"${topic.id}\" (${topic.sourceRef}).`,\n );\n }\n return {\n provider: \"rahmenlehrplan-berlin-brandenburg\",\n topicId: `${topic.sourceRef}#${topic.id}`,\n uri,\n };\n },\n\n extractTopics(html, topicIds) {\n const results: Record<string, string> = {};\n const headingMatches = Array.from(\n html.matchAll(/<h[1-6][^>]*>([\\s\\S]*?)<\\/h[1-6]>/gi),\n );\n\n const sections: Array<{ header: string; content: string }> = [];\n for (const m of headingMatches) {\n const headerText = cleanHtmlText(m[1]).trim();\n const start = m.index! + m[0].length;\n const nextHeading = html.indexOf(\"<h\", start);\n const rawContent =\n nextHeading > -1\n ? html.slice(start, nextHeading)\n : html.slice(start, start + 1500);\n const content = cleanHtmlText(rawContent).slice(0, 1500);\n if (headerText) sections.push({ header: headerText, content });\n }\n\n for (const topicId of topicIds) {\n const hashIdx = topicId.indexOf(\"#\");\n if (hashIdx === -1) continue;\n const key = topicId.substring(0, hashIdx);\n const shortId = topicId.substring(hashIdx + 1);\n\n const list = MANIFEST.topics[key] ?? [];\n const match = list.find((t) => t.id === shortId);\n if (!match) continue;\n\n const label = match.label;\n const normalizedLabel = normalizeForComparison(label);\n\n let section = sections.find(\n (s) =>\n normalizeForComparison(s.header).includes(normalizedLabel) ||\n s.header.toLowerCase().includes(shortId.toLowerCase()),\n );\n\n if (!section && sections.length > 0) {\n section = sections.find((s) => s.content.length > 80) || sections[0];\n }\n\n if (section) {\n results[topicId] = `${label}\\n\\n${section.content}`.trim();\n } else {\n results[topicId] = label;\n }\n }\n\n return results;\n },\n};\n\nfunction cleanHtmlText(html: string): string {\n let text = html.replace(\n /<(head|script|style|svg)[^>]*>[\\s\\S]*?<\\/\\1>/gi,\n \" \",\n );\n text = text.replace(/<h[1-6][^>]*>([\\s\\S]*?)<\\/h[1-6]>/gi, \"\\n\\n$1\\n\\n\");\n text = text.replace(/<li[^>]*>/gi, \"\\n- \");\n text = text.replace(/<p[^>]*>/gi, \"\\n\");\n text = text.replace(/<br\\s*\\/?>/gi, \"\\n\");\n text = text.replace(/<[^>]+>/g, \" \");\n text = text\n .replace(/ /g, \" \")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\");\n return text\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .join(\"\\n\");\n}\n\nfunction normalizeForComparison(str: string): string {\n return str\n .toLowerCase()\n .replace(/ä/g, \"ae\")\n .replace(/ö/g, \"oe\")\n .replace(/ü/g, \"ue\")\n .replace(/ß/g, \"ss\")\n .replace(/&[a-z0-9#]+;/gi, \"\")\n .replace(/[^a-z0-9]/gi, \"\");\n}\n","import type { TaxonomyNode } from \"../../types.js\";\n\ninterface ManifestTopic extends TaxonomyNode {\n hours?: number;\n}\n\nexport interface RahmenplanMvManifest {\n schoolYear: string;\n capturedOn: string;\n sourceRevision: string;\n schoolTypes: TaxonomyNode[];\n grades: Record<string, string[]>;\n subjects: Record<string, TaxonomyNode[]>;\n tracks: Record<string, TaxonomyNode[]>;\n topics: Record<string, ManifestTopic[]>;\n contentUrls: Record<string, string>;\n}\n\nexport const RAHMENPLAN_MV_MANIFEST: RahmenplanMvManifest = {\n schoolYear: \"2025/2026\",\n capturedOn: \"2026-07-02\",\n sourceRevision: \"Rahmenpläne Mecklenburg-Vorpommern\",\n\n schoolTypes: [\n { id: \"regionale-schule\", label: \"Regionale Schule\" },\n { id: \"gymnasium\", label: \"Gymnasium\" },\n ],\n\n grades: {\n \"regionale-schule\": [\"7\", \"8\", \"9\", \"10\"],\n gymnasium: [\"7\", \"8\", \"9\", \"10\"],\n },\n\n subjects: {\n \"regionale-schule\": [\n { id: \"mathematik\", label: \"Mathematik\" },\n { id: \"informatik\", label: \"Informatik\" },\n { id: \"physik\", label: \"Physik\" },\n { id: \"chemie\", label: \"Chemie\" },\n { id: \"biologie\", label: \"Biologie\" },\n ],\n gymnasium: [\n { id: \"mathematik\", label: \"Mathematik\" },\n { id: \"informatik\", label: \"Informatik\" },\n { id: \"physik\", label: \"Physik\" },\n { id: \"chemie\", label: \"Chemie\" },\n { id: \"biologie\", label: \"Biologie\" },\n ],\n },\n\n tracks: {},\n\n topics: {\n \"regionale-schule|10|mathematik\": [\n { id: \"funktionen\", label: \"Funktionen\" },\n ],\n \"gymnasium|10|mathematik\": [{ id: \"analysis\", label: \"Analysis\" }],\n \"regionale-schule|9|physik\": [{ id: \"mechanik\", label: \"Mechanik\" }],\n \"regionale-schule|9|chemie\": [{ id: \"reaktionen\", label: \"Reaktionen\" }],\n \"regionale-schule|9|biologie\": [{ id: \"zellen\", label: \"Zellen\" }],\n \"gymnasium|9|physik\": [{ id: \"elektrizitaet\", label: \"Elektrizität\" }],\n \"gymnasium|9|chemie\": [{ id: \"bindungen\", label: \"Bindungen\" }],\n \"gymnasium|9|biologie\": [{ id: \"genetik\", label: \"Genetik\" }],\n },\n\n contentUrls: {\n \"regionale-schule|10|mathematik\":\n \"https://www.bildung-mv.de/schueler/schule-und-unterricht/faecher-und-rahmenplaene/rahmenplaene-an-allgemeinbildenden-schulen/\",\n \"gymnasium|10|mathematik\":\n \"https://www.bildung-mv.de/schueler/schule-und-unterricht/faecher-und-rahmenplaene/rahmenplaene-an-allgemeinbildenden-schulen/\",\n \"regionale-schule|9|physik\":\n \"https://www.bildung-mv.de/schueler/schule-und-unterricht/faecher-und-rahmenplaene/rahmenplaene-an-allgemeinbildenden-schulen/\",\n \"regionale-schule|9|chemie\":\n \"https://www.bildung-mv.de/schueler/schule-und-unterricht/faecher-und-rahmenplaene/rahmenplaene-an-allgemeinbildenden-schulen/\",\n \"regionale-schule|9|biologie\":\n \"https://www.bildung-mv.de/schueler/schule-und-unterricht/faecher-und-rahmenplaene/rahmenplaene-an-allgemeinbildenden-schulen/\",\n \"gymnasium|9|physik\":\n \"https://www.bildung-mv.de/schueler/schule-und-unterricht/faecher-und-rahmenplaene/rahmenplaene-an-allgemeinbildenden-schulen/\",\n \"gymnasium|9|chemie\":\n \"https://www.bildung-mv.de/schueler/schule-und-unterricht/faecher-und-rahmenplaene/rahmenplaene-an-allgemeinbildenden-schulen/\",\n \"gymnasium|9|biologie\":\n \"https://www.bildung-mv.de/schueler/schule-und-unterricht/faecher-und-rahmenplaene/rahmenplaene-an-allgemeinbildenden-schulen/\",\n },\n};\n","import type { CurriculumProvider } from \"../../types.js\";\nimport { RAHMENPLAN_MV_MANIFEST as MANIFEST } from \"./manifest.js\";\n\nexport const rahmenplanMvProvider: CurriculumProvider = {\n id: \"rahmenplan-mv\",\n country: \"DE\",\n countryLabel: \"Deutschland\",\n region: \"MV\",\n regionLabel: \"Mecklenburg-Vorpommern\",\n label: \"Rahmenplan (Mecklenburg-Vorpommern)\",\n\n listSchoolTypes() {\n return MANIFEST.schoolTypes;\n },\n\n listGrades(schoolType) {\n return (MANIFEST.grades[schoolType] || []).map((id) => ({\n id,\n label: `Klasse ${id}`,\n }));\n },\n\n listSubjects(schoolType, _grade) {\n return MANIFEST.subjects[schoolType] || [];\n },\n\n listTracks(schoolType, grade, subject) {\n const key = `${schoolType}|${grade}|${subject}`;\n return MANIFEST.tracks[key] || [];\n },\n\n listTopics(selection) {\n const key = selection.track\n ? `${selection.schoolType}|${selection.grade}|${selection.subject}|${selection.track}`\n : `${selection.schoolType}|${selection.grade}|${selection.subject}`;\n const list = MANIFEST.topics[key] || [];\n return list.map((t) => ({\n ...t,\n sourceRef: key,\n }));\n },\n\n resolveTopic(topic) {\n const uri = MANIFEST.contentUrls[topic.sourceRef];\n if (!uri) {\n throw new Error(\n `Rahmenplan MV: no resolvable source URL for topic \"${topic.id}\" (${topic.sourceRef}).`,\n );\n }\n return {\n provider: \"rahmenplan-mv\",\n topicId: `${topic.sourceRef}#${topic.id}`,\n uri,\n };\n },\n\n extractTopics(html, topicIds) {\n const results: Record<string, string> = {};\n const headingMatches = Array.from(\n html.matchAll(/<h[1-6][^>]*>([\\s\\S]*?)<\\/h[1-6]>/gi),\n );\n\n const sections: Array<{ header: string; content: string }> = [];\n for (const m of headingMatches) {\n const headerText = cleanHtmlText(m[1]).trim();\n const start = m.index! + m[0].length;\n const nextHeading = html.indexOf(\"<h\", start);\n const rawContent =\n nextHeading > -1\n ? html.slice(start, nextHeading)\n : html.slice(start, start + 1500);\n const content = cleanHtmlText(rawContent).slice(0, 1500);\n if (headerText) sections.push({ header: headerText, content });\n }\n\n for (const topicId of topicIds) {\n const hashIdx = topicId.indexOf(\"#\");\n if (hashIdx === -1) continue;\n const key = topicId.substring(0, hashIdx);\n const shortId = topicId.substring(hashIdx + 1);\n\n const list = MANIFEST.topics[key] ?? [];\n const match = list.find((t) => t.id === shortId);\n if (!match) continue;\n\n const label = match.label;\n const normalizedLabel = normalizeForComparison(label);\n\n let section = sections.find(\n (s) =>\n normalizeForComparison(s.header).includes(normalizedLabel) ||\n s.header.toLowerCase().includes(shortId.toLowerCase()),\n );\n\n if (!section && sections.length > 0) {\n section = sections.find((s) => s.content.length > 80) || sections[0];\n }\n\n if (section) {\n results[topicId] = `${label}\\n\\n${section.content}`.trim();\n } else {\n results[topicId] = label;\n }\n }\n\n return results;\n },\n};\n\nfunction cleanHtmlText(html: string): string {\n let text = html.replace(\n /<(head|script|style|svg)[^>]*>[\\s\\S]*?<\\/\\1>/gi,\n \" \",\n );\n text = text.replace(/<h[1-6][^>]*>([\\s\\S]*?)<\\/h[1-6]>/gi, \"\\n\\n$1\\n\\n\");\n text = text.replace(/<li[^>]*>/gi, \"\\n- \");\n text = text.replace(/<p[^>]*>/gi, \"\\n\");\n text = text.replace(/<br\\s*\\/?>/gi, \"\\n\");\n text = text.replace(/<[^>]+>/g, \" \");\n text = text\n .replace(/ /g, \" \")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\");\n return text\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .join(\"\\n\");\n}\n\nfunction normalizeForComparison(str: string): string {\n return str\n .toLowerCase()\n .replace(/ä/g, \"ae\")\n .replace(/ö/g, \"oe\")\n .replace(/ü/g, \"ue\")\n .replace(/ß/g, \"ss\")\n .replace(/&[a-z0-9#]+;/gi, \"\")\n .replace(/[^a-z0-9]/gi, \"\");\n}\n","import type { TaxonomyNode } from \"../../types.js\";\n\ninterface ManifestTopic extends TaxonomyNode {\n hours?: number;\n}\n\nexport interface RahmenrichtlinienStManifest {\n schoolYear: string;\n capturedOn: string;\n sourceRevision: string;\n schoolTypes: TaxonomyNode[];\n grades: Record<string, string[]>;\n subjects: Record<string, TaxonomyNode[]>;\n tracks: Record<string, TaxonomyNode[]>;\n topics: Record<string, ManifestTopic[]>;\n contentUrls: Record<string, string>;\n}\n\nexport const RAHMENRICHTLINIEN_ST_MANIFEST: RahmenrichtlinienStManifest = {\n schoolYear: \"2025/2026\",\n capturedOn: \"2026-07-02\",\n sourceRevision: \"Rahmenrichtlinien Sachsen-Anhalt\",\n\n schoolTypes: [\n { id: \"sekundarschule\", label: \"Sekundarschule\" },\n { id: \"gymnasium\", label: \"Gymnasium\" },\n ],\n\n grades: {\n sekundarschule: [\"7\", \"8\", \"9\", \"10\"],\n gymnasium: [\"7\", \"8\", \"9\", \"10\"],\n },\n\n subjects: {\n sekundarschule: [\n { id: \"mathematik\", label: \"Mathematik\" },\n { id: \"informatik\", label: \"Informatik\" },\n { id: \"physik\", label: \"Physik\" },\n { id: \"chemie\", label: \"Chemie\" },\n { id: \"biologie\", label: \"Biologie\" },\n ],\n gymnasium: [\n { id: \"mathematik\", label: \"Mathematik\" },\n { id: \"informatik\", label: \"Informatik\" },\n { id: \"physik\", label: \"Physik\" },\n { id: \"chemie\", label: \"Chemie\" },\n { id: \"biologie\", label: \"Biologie\" },\n ],\n },\n\n tracks: {},\n\n topics: {\n \"sekundarschule|10|mathematik\": [{ id: \"funktionen\", label: \"Funktionen\" }],\n \"gymnasium|10|mathematik\": [{ id: \"analysis\", label: \"Analysis\" }],\n \"sekundarschule|9|physik\": [{ id: \"mechanik\", label: \"Mechanik\" }],\n \"sekundarschule|9|chemie\": [{ id: \"reaktionen\", label: \"Reaktionen\" }],\n \"sekundarschule|9|biologie\": [{ id: \"zellen\", label: \"Zellen\" }],\n \"gymnasium|9|physik\": [{ id: \"elektrizitaet\", label: \"Elektrizität\" }],\n \"gymnasium|9|chemie\": [{ id: \"bindungen\", label: \"Bindungen\" }],\n \"gymnasium|9|biologie\": [{ id: \"genetik\", label: \"Genetik\" }],\n },\n\n contentUrls: {\n \"sekundarschule|10|mathematik\":\n \"https://lisa.sachsen-anhalt.de/schulqualitaet/lehrplaene-rahmenrichtlinien\",\n \"gymnasium|10|mathematik\":\n \"https://lisa.sachsen-anhalt.de/schulqualitaet/lehrplaene-rahmenrichtlinien\",\n \"sekundarschule|9|physik\":\n \"https://lisa.sachsen-anhalt.de/schulqualitaet/lehrplaene-rahmenrichtlinien\",\n \"sekundarschule|9|chemie\":\n \"https://lisa.sachsen-anhalt.de/schulqualitaet/lehrplaene-rahmenrichtlinien\",\n \"sekundarschule|9|biologie\":\n \"https://lisa.sachsen-anhalt.de/schulqualitaet/lehrplaene-rahmenrichtlinien\",\n \"gymnasium|9|physik\":\n \"https://lisa.sachsen-anhalt.de/schulqualitaet/lehrplaene-rahmenrichtlinien\",\n \"gymnasium|9|chemie\":\n \"https://lisa.sachsen-anhalt.de/schulqualitaet/lehrplaene-rahmenrichtlinien\",\n \"gymnasium|9|biologie\":\n \"https://lisa.sachsen-anhalt.de/schulqualitaet/lehrplaene-rahmenrichtlinien\",\n },\n};\n","import type { CurriculumProvider } from \"../../types.js\";\nimport { RAHMENRICHTLINIEN_ST_MANIFEST as MANIFEST } from \"./manifest.js\";\n\nexport const rahmenrichtlinienStProvider: CurriculumProvider = {\n id: \"rahmenrichtlinien-st\",\n country: \"DE\",\n countryLabel: \"Deutschland\",\n region: \"ST\",\n regionLabel: \"Sachsen-Anhalt\",\n label: \"Rahmenrichtlinien (Sachsen-Anhalt)\",\n\n listSchoolTypes() {\n return MANIFEST.schoolTypes;\n },\n\n listGrades(schoolType) {\n return (MANIFEST.grades[schoolType] || []).map((id) => ({\n id,\n label: `Klasse ${id}`,\n }));\n },\n\n listSubjects(schoolType, _grade) {\n return MANIFEST.subjects[schoolType] || [];\n },\n\n listTracks(schoolType, grade, subject) {\n const key = `${schoolType}|${grade}|${subject}`;\n return MANIFEST.tracks[key] || [];\n },\n\n listTopics(selection) {\n const key = selection.track\n ? `${selection.schoolType}|${selection.grade}|${selection.subject}|${selection.track}`\n : `${selection.schoolType}|${selection.grade}|${selection.subject}`;\n const list = MANIFEST.topics[key] || [];\n return list.map((t) => ({\n ...t,\n sourceRef: key,\n }));\n },\n\n resolveTopic(topic) {\n const uri = MANIFEST.contentUrls[topic.sourceRef];\n if (!uri) {\n throw new Error(\n `Rahmenrichtlinien ST: no resolvable source URL for topic \"${topic.id}\" (${topic.sourceRef}).`,\n );\n }\n return {\n provider: \"rahmenrichtlinien-st\",\n topicId: `${topic.sourceRef}#${topic.id}`,\n uri,\n };\n },\n\n extractTopics(html, topicIds) {\n const results: Record<string, string> = {};\n const headingMatches = Array.from(\n html.matchAll(/<h[1-6][^>]*>([\\s\\S]*?)<\\/h[1-6]>/gi),\n );\n\n const sections: Array<{ header: string; content: string }> = [];\n for (const m of headingMatches) {\n const headerText = cleanHtmlText(m[1]).trim();\n const start = m.index! + m[0].length;\n const nextHeading = html.indexOf(\"<h\", start);\n const rawContent =\n nextHeading > -1\n ? html.slice(start, nextHeading)\n : html.slice(start, start + 1500);\n const content = cleanHtmlText(rawContent).slice(0, 1500);\n if (headerText) sections.push({ header: headerText, content });\n }\n\n for (const topicId of topicIds) {\n const hashIdx = topicId.indexOf(\"#\");\n if (hashIdx === -1) continue;\n const key = topicId.substring(0, hashIdx);\n const shortId = topicId.substring(hashIdx + 1);\n\n const list = MANIFEST.topics[key] ?? [];\n const match = list.find((t) => t.id === shortId);\n if (!match) continue;\n\n const label = match.label;\n const normalizedLabel = normalizeForComparison(label);\n\n let section = sections.find(\n (s) =>\n normalizeForComparison(s.header).includes(normalizedLabel) ||\n s.header.toLowerCase().includes(shortId.toLowerCase()),\n );\n\n if (!section && sections.length > 0) {\n section = sections.find((s) => s.content.length > 80) || sections[0];\n }\n\n if (section) {\n results[topicId] = `${label}\\n\\n${section.content}`.trim();\n } else {\n results[topicId] = label;\n }\n }\n\n return results;\n },\n};\n\nfunction cleanHtmlText(html: string): string {\n let text = html.replace(\n /<(head|script|style|svg)[^>]*>[\\s\\S]*?<\\/\\1>/gi,\n \" \",\n );\n text = text.replace(/<h[1-6][^>]*>([\\s\\S]*?)<\\/h[1-6]>/gi, \"\\n\\n$1\\n\\n\");\n text = text.replace(/<li[^>]*>/gi, \"\\n- \");\n text = text.replace(/<p[^>]*>/gi, \"\\n\");\n text = text.replace(/<br\\s*\\/?>/gi, \"\\n\");\n text = text.replace(/<[^>]+>/g, \" \");\n text = text\n .replace(/ /g, \" \")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\");\n return text\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .join(\"\\n\");\n}\n\nfunction normalizeForComparison(str: string): string {\n return str\n .toLowerCase()\n .replace(/ä/g, \"ae\")\n .replace(/ö/g, \"oe\")\n .replace(/ü/g, \"ue\")\n .replace(/ß/g, \"ss\")\n .replace(/&[a-z0-9#]+;/gi, \"\")\n .replace(/[^a-z0-9]/gi, \"\");\n}\n","import { bildungsplanBremenProvider } from \"./providers/bildungsplan-bremen/index.js\";\nimport { bildungsplanBwProvider } from \"./providers/bildungsplan-bw/index.js\";\nimport { bildungsplanHamburgProvider } from \"./providers/bildungsplan-hamburg/index.js\";\nimport { fachanforderungenShProvider } from \"./providers/fachanforderungen-sh/index.js\";\nimport { kerncurriculumHessenProvider } from \"./providers/kerncurriculum-hessen/index.js\";\nimport { kerncurriculumNiedersachsenProvider } from \"./providers/kerncurriculum-niedersachsen/index.js\";\nimport { kernlehrplanNrwProvider } from \"./providers/kernlehrplan-nrw/index.js\";\nimport { lehrplaeneRpProvider } from \"./providers/lehrplaene-rp/index.js\";\nimport { lehrplanSaarlandProvider } from \"./providers/lehrplan-saarland/index.js\";\nimport { lehrplanSachsenProvider } from \"./providers/lehrplan-sachsen/index.js\";\nimport { lehrplanThueringenProvider } from \"./providers/lehrplan-thueringen/index.js\";\nimport { lehrplanplusBayernProvider } from \"./providers/lehrplanplus-bayern/index.js\";\nimport { rahmenlehrplanBerlinBrandenburgProvider } from \"./providers/rahmenlehrplan-berlin-brandenburg/index.js\";\nimport { rahmenplanMvProvider } from \"./providers/rahmenplan-mv/index.js\";\nimport { rahmenrichtlinienStProvider } from \"./providers/rahmenrichtlinien-st/index.js\";\nimport type { CurriculumProvider, TaxonomyNode } from \"./types.js\";\n\n/** Registered curriculum providers. Add a new plugin here to extend it. */\nexport const CURRICULUM_PROVIDERS: CurriculumProvider[] = [\n lehrplanplusBayernProvider,\n bildungsplanBwProvider,\n kernlehrplanNrwProvider,\n kerncurriculumHessenProvider,\n kerncurriculumNiedersachsenProvider,\n lehrplanSachsenProvider,\n rahmenlehrplanBerlinBrandenburgProvider,\n bildungsplanHamburgProvider,\n bildungsplanBremenProvider,\n rahmenplanMvProvider,\n lehrplaeneRpProvider,\n lehrplanSaarlandProvider,\n rahmenrichtlinienStProvider,\n fachanforderungenShProvider,\n lehrplanThueringenProvider,\n];\n\nexport function getCurriculumProvider(\n id: string,\n): CurriculumProvider | undefined {\n return CURRICULUM_PROVIDERS.find((provider) => provider.id === id);\n}\n\nexport interface CurriculumRegionOption extends TaxonomyNode {\n providerId: string;\n}\n\n/** Distinct countries across all registered providers (wizard step 1). */\nexport function listCurriculumCountries(): TaxonomyNode[] {\n const countries: TaxonomyNode[] = [];\n for (const provider of CURRICULUM_PROVIDERS) {\n if (!countries.some((c) => c.id === provider.country)) {\n countries.push({ id: provider.country, label: provider.countryLabel });\n }\n }\n return countries;\n}\n\n/** Regions within a country, each naming the provider that serves it (wizard step 2). */\nexport function listCurriculumRegions(\n country: string,\n): CurriculumRegionOption[] {\n return CURRICULUM_PROVIDERS.filter(\n (provider) => provider.country === country,\n ).map((provider) => ({\n id: provider.region,\n label: provider.regionLabel,\n providerId: provider.id,\n }));\n}\n","import { randomBytes } from \"node:crypto\";\nimport { readFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { basename, join } from \"node:path\";\nimport type {\n Database,\n SupportedLocale,\n UiActionType,\n UiApplicationContext,\n UiCandidateToken,\n UiObservationKind,\n UiObservationReport,\n UiObservedAction,\n} from \"../../kernel/index.js\";\nimport {\n isUiObservationReport,\n UI_OBSERVATION_PROTOCOL_VERSION,\n} from \"../../kernel/index.js\";\nimport {\n type ApiFlavor,\n DEFAULT_LLM_API_KEY,\n DEFAULT_LLM_MAX_TOKENS,\n fetchWithInteractiveTimeout,\n getProviderForRole,\n} from \"./client.js\";\n\nconst LANGUAGE_NAMES: Record<SupportedLocale, string> = {\n en: \"English\",\n de: \"German\",\n es: \"Spanish\",\n fr: \"French\",\n pt: \"Portuguese\",\n zh: \"Chinese\",\n ja: \"Japanese\",\n};\n\nconst OBSERVATION_KINDS = new Set<UiObservationKind>([\n \"progress\",\n \"step-completed\",\n \"error\",\n \"help-seeking\",\n \"uncertain\",\n \"privacy-pause\",\n \"heartbeat\",\n]);\n\nconst ACTION_TYPES = new Set<UiActionType>([\n \"click\",\n \"shortcut\",\n \"typing\",\n \"scroll\",\n \"window-change\",\n]);\n\ninterface ChatCompletionResponse {\n choices?: Array<{ message?: { content?: string } }>;\n error?: unknown;\n}\n\ninterface VisionObservationDraft {\n kind?: unknown;\n summary?: unknown;\n actions?: unknown;\n candidateTokens?: unknown;\n confidence?: unknown;\n}\n\nexport interface UiSnapshotObservationInput {\n sessionId: string;\n sequence: number;\n observedFrom: string;\n observedTo: string;\n imagePath: string;\n application: UiApplicationContext;\n evidenceRef?: string;\n redacted?: boolean;\n model?: string;\n maxTokens?: number;\n hardTimeoutMs?: number;\n}\n\nexport async function observeUiSnapshotViaLLM(\n db: Database,\n input: UiSnapshotObservationInput,\n): Promise<UiObservationReport> {\n const cfg = await getProviderForRole(db, \"vision\");\n if (!cfg.enabled) {\n throw new Error(\n \"Vision observation is disabled in settings (llm.vision.enabled)\",\n );\n }\n\n const imageUrls: string[] = [];\n const isVideo = /\\.(mp4|mov|m4v|avi|mkv|webm)$/i.test(input.imagePath);\n\n if (isVideo) {\n const { mkdirSync, readdirSync, rmSync } = await import(\"node:fs\");\n const { execSync } = await import(\"node:child_process\");\n const tempDir = join(\n tmpdir(),\n `zam-frames-${randomBytes(4).toString(\"hex\")}`,\n );\n mkdirSync(tempDir, { recursive: true });\n\n try {\n execSync(\n `ffmpeg -i \"${input.imagePath}\" -vf \"fps=1/3,scale=1280:-1\" -vsync vfr \"${tempDir}/frame_%03d.png\"`,\n { stdio: \"ignore\" },\n );\n\n let files = readdirSync(tempDir)\n .filter((f) => f.endsWith(\".png\"))\n .sort();\n\n if (files.length === 0) {\n execSync(\n `ffmpeg -i \"${input.imagePath}\" -vframes 1 \"${tempDir}/frame_001.png\"`,\n { stdio: \"ignore\" },\n );\n files = readdirSync(tempDir)\n .filter((f) => f.endsWith(\".png\"))\n .sort();\n }\n\n const maxFrames = cfg.maxFrames ?? 100;\n let sampledFiles = files;\n if (files.length > maxFrames) {\n if (maxFrames <= 1) {\n sampledFiles = [files[0]];\n } else {\n const step = (files.length - 1) / (maxFrames - 1);\n sampledFiles = [];\n for (let i = 0; i < maxFrames; i++) {\n const index = Math.round(i * step);\n sampledFiles.push(files[index]);\n }\n }\n }\n\n for (const file of sampledFiles) {\n const bytes = readFileSync(join(tempDir, file));\n imageUrls.push(`data:image/png;base64,${bytes.toString(\"base64\")}`);\n }\n } finally {\n try {\n rmSync(tempDir, { recursive: true, force: true });\n } catch {}\n }\n } else {\n const imageBytes = readFileSync(input.imagePath);\n const ext = input.imagePath.split(\".\").pop()?.toLowerCase();\n const mime = ext === \"jpg\" || ext === \"jpeg\" ? \"image/jpeg\" : \"image/png\";\n imageUrls.push(`data:${mime};base64,${imageBytes.toString(\"base64\")}`);\n }\n\n if (imageUrls.length === 0) {\n throw new Error(\"No image data available for vision analysis\");\n }\n\n // Try the role's primary endpoint, then its configured fallback. The\n // frame-sampled `imageUrls` are shared across endpoints; only the endpoint\n // (url/key/model/flavor) changes. `input.model` overrides the primary only.\n const endpoints: Array<\n Pick<VisionRequestArgs, \"url\" | \"apiKey\" | \"model\" | \"apiFlavor\">\n > = [\n {\n url: cfg.url,\n apiKey: cfg.apiKey || DEFAULT_LLM_API_KEY,\n model: input.model ?? cfg.model,\n apiFlavor: cfg.apiFlavor,\n },\n ];\n if (cfg.fallback) {\n endpoints.push({\n url: cfg.fallback.url,\n apiKey: cfg.fallback.apiKey || DEFAULT_LLM_API_KEY,\n model: cfg.fallback.model,\n apiFlavor: cfg.fallback.apiFlavor,\n });\n }\n\n let lastRequestError: Error | undefined;\n let sawUnparseableDraft = false;\n let sawInvalidDraft = false;\n\n for (const endpoint of endpoints) {\n let content: string;\n try {\n content = await requestVisionDraft({\n ...endpoint,\n locale: cfg.locale,\n imageUrls,\n input,\n });\n } catch (err) {\n lastRequestError = err as Error;\n continue;\n }\n\n let draft: VisionObservationDraft;\n try {\n draft = extractDraft(content);\n } catch {\n sawUnparseableDraft = true;\n continue;\n }\n\n const report = buildReport(input, draft);\n if (isUiObservationReport(report)) {\n return report;\n }\n sawInvalidDraft = true;\n }\n\n // All endpoints exhausted. Surface a hard request error only when no endpoint\n // produced any draft at all; otherwise return an uncertain report reflecting\n // the most informative failure seen.\n if (lastRequestError && !sawUnparseableDraft && !sawInvalidDraft) {\n throw lastRequestError;\n }\n if (sawInvalidDraft) {\n return uncertainReport(\n input,\n \"Vision model returned an invalid UI report draft.\",\n );\n }\n return uncertainReport(\n input,\n \"Vision model returned output that could not be parsed as JSON.\",\n );\n}\n\ntype VisionRequestArgs = {\n url: string;\n apiKey: string;\n model: string;\n apiFlavor: ApiFlavor;\n locale: SupportedLocale;\n imageUrls: string[];\n input: UiSnapshotObservationInput;\n};\n\nconst VISION_SYSTEM_PROMPT =\n \"You are ZAM's UI observer. Return only strict JSON. Do not include markdown, prose, or fields outside the requested schema.\";\n\nfunction visionSchema(language: string): string {\n return `{\n \"kind\": \"progress | step-completed | error | help-seeking | uncertain\",\n \"summary\": \"short factual UI summary in ${language}\",\n \"actions\": [{\"type\": \"click | shortcut | typing | scroll | window-change\", \"target\": \"optional UI target\", \"result\": \"optional visible result\"}],\n \"candidateTokens\": [{\"slug\": \"optional-kebab-case-skill-token\", \"confidence\": 0.0, \"rationale\": \"why this token may matter\"}],\n \"confidence\": 0.0\n}`;\n}\n\nfunction visionUserText(args: VisionRequestArgs, language: string): string {\n const intro =\n args.imageUrls.length > 1\n ? \"Observe this sequence of Windows/macOS application snapshots showing a task performed over time.\"\n : \"Observe this Windows/macOS application snapshot for a learning session.\";\n return `${intro}\nApplication process: ${args.input.application.processName}\nWindow title: ${args.input.application.windowTitle ?? \"(unknown)\"}\n\nReturn this JSON draft only:\n${visionSchema(language)}`;\n}\n\n/** Dispatch to the configured wire protocol for the vision endpoint. */\nasync function requestVisionDraft(args: VisionRequestArgs): Promise<string> {\n if (args.apiFlavor === \"anthropic-messages\") {\n return requestAnthropicVisionDraft(args);\n }\n return requestChatCompletionsVisionDraft(args);\n}\n\nasync function requestChatCompletionsVisionDraft(\n args: VisionRequestArgs,\n): Promise<string> {\n const language = LANGUAGE_NAMES[args.locale] ?? \"English\";\n\n const res = await fetchWithInteractiveTimeout(\n `${args.url}/chat/completions`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${args.apiKey}`,\n },\n body: JSON.stringify({\n model: args.model,\n messages: [\n { role: \"system\", content: VISION_SYSTEM_PROMPT },\n {\n role: \"user\",\n content: [\n { type: \"text\", text: visionUserText(args, language) },\n ...args.imageUrls.map((url) => ({\n type: \"image_url\",\n image_url: { url },\n })),\n ],\n },\n ],\n temperature: 0,\n max_tokens: args.input.maxTokens ?? DEFAULT_LLM_MAX_TOKENS,\n ...(args.url.includes(\"11434\") ||\n args.url.includes(\"localhost\") ||\n args.url.includes(\"127.0.0.1\")\n ? { options: { num_ctx: 32768 } }\n : {}),\n }),\n locale: args.locale,\n hardTimeoutMs: args.input.hardTimeoutMs ?? 180000,\n },\n );\n\n if (!res.ok) {\n const errorText = await res.text().catch(() => \"\");\n // Provide a clear hint when the model rejects image input — this\n // typically means the configured model is text-only.\n if (\n errorText.includes(\"image\") &&\n (errorText.includes(\"not support\") || errorText.includes(\"unsupported\"))\n ) {\n throw new Error(\n `Vision model \"${args.model}\" does not support image input. ` +\n `Set a multimodal model: zam settings set llm.vision.model <model>`,\n );\n }\n throw new Error(\n `Vision LLM request failed: ${res.statusText} (${res.status}) - ${errorText}`,\n );\n }\n\n const data = (await res.json()) as ChatCompletionResponse;\n if (data.error !== undefined) {\n const errorMsg = formatModelError(data.error);\n // Provide a clear hint when the model rejects image input.\n if (\n errorMsg.includes(\"image\") &&\n (errorMsg.includes(\"not support\") || errorMsg.includes(\"unsupported\"))\n ) {\n throw new Error(\n `Vision model \"${args.model}\" does not support image input. ` +\n `Set a multimodal model: zam settings set llm.vision.model <model>`,\n );\n }\n throw new Error(`Vision model failed: ${errorMsg}`);\n }\n\n const content = data.choices?.[0]?.message?.content;\n if (!content || typeof content !== \"string\") {\n throw new Error(\"Empty response from vision model\");\n }\n return content.trim();\n}\n\ninterface AnthropicImageBlock {\n type: \"image\";\n source: { type: \"base64\"; media_type: string; data: string };\n}\n\ninterface AnthropicMessageResponse {\n content?: Array<{ type?: string; text?: string }>;\n stop_reason?: string;\n error?: unknown;\n}\n\nfunction dataUrlToAnthropicImage(dataUrl: string): AnthropicImageBlock {\n const match = dataUrl.match(/^data:(image\\/[a-zA-Z]+);base64,(.+)$/);\n if (!match) {\n throw new Error(\"Unsupported image data for Anthropic vision request\");\n }\n return {\n type: \"image\",\n source: { type: \"base64\", media_type: match[1], data: match[2] },\n };\n}\n\n/**\n * Anthropic Messages API vision request (ADR 2026-06-23 item 2). The Messages\n * API is not OpenAI-shaped: keys go on `x-api-key`, images are base64 source\n * blocks, and the reply is a content-block array.\n */\nasync function requestAnthropicVisionDraft(\n args: VisionRequestArgs,\n): Promise<string> {\n const language = LANGUAGE_NAMES[args.locale] ?? \"English\";\n const base = args.url.replace(/\\/+$/, \"\").replace(/\\/v1$/, \"\");\n\n const res = await fetchWithInteractiveTimeout(`${base}/v1/messages`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": args.apiKey,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify({\n model: args.model,\n max_tokens: args.input.maxTokens ?? DEFAULT_LLM_MAX_TOKENS,\n system: VISION_SYSTEM_PROMPT,\n messages: [\n {\n role: \"user\",\n content: [\n { type: \"text\", text: visionUserText(args, language) },\n ...args.imageUrls.map(dataUrlToAnthropicImage),\n ],\n },\n ],\n }),\n locale: args.locale,\n hardTimeoutMs: args.input.hardTimeoutMs ?? 180000,\n });\n\n if (!res.ok) {\n const errorText = await res.text().catch(() => \"\");\n throw new Error(\n `Vision LLM request failed: ${res.statusText} (${res.status}) - ${errorText}`,\n );\n }\n\n const data = (await res.json()) as AnthropicMessageResponse;\n if (data.error !== undefined) {\n throw new Error(`Vision model failed: ${formatModelError(data.error)}`);\n }\n if (data.stop_reason === \"refusal\") {\n throw new Error(\"Vision model refused the request (safety classifier).\");\n }\n const text = data.content?.find(\n (b) => b.type === \"text\" && typeof b.text === \"string\",\n )?.text;\n if (!text) {\n throw new Error(\"Empty response from vision model\");\n }\n return text.trim();\n}\n\nfunction extractDraft(content: string): VisionObservationDraft {\n const fenced = content.match(/```(?:json)?\\s*([\\s\\S]*?)```/i);\n const candidate = (fenced?.[1] ?? content).trim();\n try {\n return JSON.parse(candidate) as VisionObservationDraft;\n } catch {\n const start = candidate.indexOf(\"{\");\n const end = candidate.lastIndexOf(\"}\");\n if (start === -1 || end <= start) throw new Error(\"no JSON object found\");\n return JSON.parse(\n candidate.slice(start, end + 1),\n ) as VisionObservationDraft;\n }\n}\n\nfunction buildReport(\n input: UiSnapshotObservationInput,\n draft: VisionObservationDraft,\n): UiObservationReport {\n return {\n version: UI_OBSERVATION_PROTOCOL_VERSION,\n sessionId: input.sessionId,\n sequence: input.sequence,\n observedFrom: input.observedFrom,\n observedTo: input.observedTo,\n kind: parseKind(draft.kind),\n application: input.application,\n summary: parseSummary(draft.summary),\n actions: parseActions(draft.actions),\n evidence: [\n {\n type: \"keyframe\",\n ref: input.evidenceRef ?? basename(input.imagePath),\n redacted: input.redacted ?? false,\n },\n ],\n candidateTokens: parseCandidateTokens(draft.candidateTokens),\n confidence: parseConfidence(draft.confidence, 0.35),\n };\n}\n\nfunction uncertainReport(\n input: UiSnapshotObservationInput,\n summary: string,\n): UiObservationReport {\n return {\n version: UI_OBSERVATION_PROTOCOL_VERSION,\n sessionId: input.sessionId,\n sequence: input.sequence,\n observedFrom: input.observedFrom,\n observedTo: input.observedTo,\n kind: \"uncertain\",\n application: input.application,\n summary,\n actions: [],\n evidence: [\n {\n type: \"keyframe\",\n ref: input.evidenceRef ?? basename(input.imagePath),\n redacted: input.redacted ?? false,\n },\n ],\n candidateTokens: [],\n confidence: 0.1,\n };\n}\n\nfunction parseKind(value: unknown): UiObservationKind {\n if (\n typeof value === \"string\" &&\n OBSERVATION_KINDS.has(value as UiObservationKind)\n ) {\n return value as UiObservationKind;\n }\n return \"uncertain\";\n}\n\nfunction parseSummary(value: unknown): string {\n if (typeof value === \"string\" && value.trim().length > 0) {\n return value.trim();\n }\n return \"Vision model did not provide a factual UI summary.\";\n}\n\nfunction parseActions(value: unknown): UiObservedAction[] {\n if (!Array.isArray(value)) return [];\n return value.flatMap((item): UiObservedAction[] => {\n if (!isRecord(item) || typeof item.type !== \"string\") return [];\n if (!ACTION_TYPES.has(item.type as UiActionType)) return [];\n const action: UiObservedAction = { type: item.type as UiActionType };\n if (typeof item.target === \"string\" && item.target.trim()) {\n action.target = item.target.trim();\n }\n if (typeof item.result === \"string\" && item.result.trim()) {\n action.result = item.result.trim();\n }\n return [action];\n });\n}\n\nfunction parseCandidateTokens(value: unknown): UiCandidateToken[] {\n if (!Array.isArray(value)) return [];\n return value.flatMap((item): UiCandidateToken[] => {\n if (!isRecord(item)) return [];\n if (typeof item.slug !== \"string\" || !/^[A-Za-z0-9._-]+$/.test(item.slug)) {\n return [];\n }\n if (typeof item.rationale !== \"string\" || !item.rationale.trim()) {\n return [];\n }\n return [\n {\n slug: item.slug,\n confidence: parseConfidence(item.confidence, 0.2),\n rationale: item.rationale.trim(),\n },\n ];\n });\n}\n\nfunction parseConfidence(value: unknown, fallback: number): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return fallback;\n return Math.max(0, Math.min(1, value));\n}\n\nfunction formatModelError(error: unknown): string {\n if (typeof error === \"string\") return error;\n if (isRecord(error) && typeof error.message === \"string\") {\n return error.message;\n }\n return JSON.stringify(error);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","/**\n * Shared database helpers for CLI commands.\n *\n * Every command needs the same openDatabase → execute → close → handle errors\n * pattern. These wrappers keep command files focused on their domain logic.\n */\n\nimport type { Database } from \"../../../kernel/index.js\";\nimport { openDatabase } from \"../../../kernel/index.js\";\n\ntype ErrorHandler = (message: string) => void;\n\nfunction defaultErrorHandler(message: string): void {\n console.error(\"Error:\", message);\n process.exit(1);\n}\n\n/** Opens the DB, awaits fn, closes the DB, handles errors. */\nexport async function withDb(\n fn: (db: Database) => void | Promise<void>,\n onError: ErrorHandler = defaultErrorHandler,\n): Promise<void> {\n let db: Database | undefined;\n try {\n db = await openDatabase();\n await fn(db);\n } catch (err) {\n onError((err as Error).message);\n } finally {\n await db?.close();\n }\n}\n\n/**\n * JSON output helper — used by commands that support --json.\n */\nexport function jsonOut(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n}\n","import type { Database } from \"../../kernel/index.js\";\nimport {\n getMachineAiConfig,\n getProviderApiKey,\n getSetting,\n saveMachineAiConfig,\n setSetting,\n} from \"../../kernel/index.js\";\nimport { withDb } from \"../commands/shared/db.js\";\nimport { type ApiFlavor, inferApiFlavor, type LlmRole } from \"../llm/client.js\";\n\nexport const VALID_API_FLAVORS: ApiFlavor[] = [\n \"chat-completions\",\n \"anthropic-messages\",\n];\nexport const VALID_ROLES: LlmRole[] = [\"vision\", \"recall\", \"text\", \"embedding\"];\n\nexport interface ProviderRecord {\n label?: string;\n url?: string;\n model?: string;\n apiFlavor?: ApiFlavor;\n apiKeyRef?: string;\n local?: boolean;\n runner?: string;\n}\nexport type ProvidersMap = Record<string, ProviderRecord>;\nexport interface RoleBinding {\n primary?: string;\n fallback?: string;\n}\nexport type RolesMap = Partial<Record<LlmRole, RoleBinding>>;\n\n/** Merge the provided (non-undefined) fields into the named provider record. */\nexport function upsertProviderRecord(\n providers: ProvidersMap,\n name: string,\n patch: ProviderRecord,\n): ProvidersMap {\n const merged: ProviderRecord = { ...(providers[name] ?? {}) };\n if (patch.url !== undefined) merged.url = patch.url;\n if (patch.model !== undefined) merged.model = patch.model;\n if (patch.apiFlavor !== undefined) merged.apiFlavor = patch.apiFlavor;\n if (patch.apiKeyRef !== undefined) merged.apiKeyRef = patch.apiKeyRef;\n if (patch.label !== undefined) merged.label = patch.label;\n if (patch.local !== undefined) merged.local = patch.local;\n if (patch.runner !== undefined) merged.runner = patch.runner;\n return { ...providers, [name]: merged };\n}\n\n/** Drop a provider record. `removed` is false when the name was not present. */\nexport function removeProviderRecord(\n providers: ProvidersMap,\n name: string,\n): { providers: ProvidersMap; removed: boolean } {\n if (!(name in providers)) return { providers, removed: false };\n const next = { ...providers };\n delete next[name];\n return { providers: next, removed: true };\n}\n\n/** Roles that reference `name` as their primary or fallback provider. */\nexport function rolesReferencing(roles: RolesMap, name: string): LlmRole[] {\n return VALID_ROLES.filter((role) => {\n const binding = roles[role];\n return binding?.primary === name || binding?.fallback === name;\n });\n}\n\n/** Bind a role to a primary (and optional fallback) provider. */\nexport function bindRoleProviders(\n roles: RolesMap,\n role: LlmRole,\n primary: string,\n fallback?: string,\n): RolesMap {\n const binding: RoleBinding = { primary };\n if (fallback) binding.fallback = fallback;\n return { ...roles, [role]: binding };\n}\n\n/** Show a stored key as a recognizable, non-revealing last-4 fingerprint. */\nexport function maskSecret(key: string): string {\n return key.length <= 4 ? \"••••\" : `…${key.slice(-4)}`;\n}\n\nexport interface ProviderListingRow {\n name: string;\n url?: string;\n model?: string;\n apiFlavor: ApiFlavor;\n apiKeyRef?: string;\n label?: string;\n local?: boolean;\n runner?: string;\n keyState: \"set\" | \"missing\" | \"none\";\n}\n\n/** Project provider records into display rows, resolving flavor and key state. */\nexport function buildProviderListing(\n providers: ProvidersMap,\n hasKey: (ref: string) => boolean,\n): ProviderListingRow[] {\n return Object.entries(providers).map(([name, rec]) => {\n const apiFlavor =\n rec.apiFlavor ?? (rec.url ? inferApiFlavor(rec.url) : \"chat-completions\");\n let keyState: ProviderListingRow[\"keyState\"];\n if (!rec.apiKeyRef) keyState = \"none\";\n else keyState = hasKey(rec.apiKeyRef) ? \"set\" : \"missing\";\n const row: ProviderListingRow = {\n name,\n url: rec.url,\n model: rec.model,\n apiFlavor,\n apiKeyRef: rec.apiKeyRef,\n keyState,\n };\n if (rec.label !== undefined) row.label = rec.label;\n if (rec.local !== undefined) row.local = rec.local;\n if (rec.runner !== undefined) row.runner = rec.runner;\n return row;\n });\n}\n\n/** Stored key refs that no provider record references (safe to clear). */\nexport function findOrphanKeyRefs(\n storedRefs: string[],\n providers: ProvidersMap,\n): string[] {\n const used = new Set(\n Object.values(providers)\n .map((rec) => rec.apiKeyRef)\n .filter((ref): ref is string => !!ref),\n );\n return storedRefs.filter((ref) => !used.has(ref));\n}\n\nasync function readJson<T>(db: Database, key: string, fallback: T): Promise<T> {\n const raw = await getSetting(db, key);\n if (!raw) return fallback;\n try {\n return JSON.parse(raw) as T;\n } catch {\n return fallback;\n }\n}\n\nconst readProviders = (db: Database): Promise<ProvidersMap> =>\n readJson<ProvidersMap>(db, \"llm.providers\", {});\nconst readRoles = (db: Database): Promise<RolesMap> =>\n readJson<RolesMap>(db, \"llm.roles\", {});\n\nexport async function readScopedProviders(\n db: Database | undefined,\n machine: boolean,\n): Promise<ProvidersMap> {\n if (machine) return getMachineAiConfig().providers ?? {};\n if (!db)\n throw new Error(\"Database is required for shared provider settings.\");\n return readProviders(db);\n}\n\nexport async function readScopedRoles(\n db: Database | undefined,\n machine: boolean,\n): Promise<RolesMap> {\n if (machine) return getMachineAiConfig().roles ?? {};\n if (!db)\n throw new Error(\"Database is required for shared provider settings.\");\n return readRoles(db);\n}\n\nexport async function writeScopedProviders(\n db: Database | undefined,\n machine: boolean,\n p: ProvidersMap,\n): Promise<void> {\n if (machine) {\n const config = getMachineAiConfig();\n saveMachineAiConfig({ ...config, providers: p });\n return;\n }\n if (!db)\n throw new Error(\"Database is required for shared provider settings.\");\n await setSetting(db, \"llm.providers\", JSON.stringify(p));\n}\n\nexport async function writeScopedRoles(\n db: Database | undefined,\n machine: boolean,\n r: RolesMap,\n): Promise<void> {\n if (machine) {\n const config = getMachineAiConfig();\n saveMachineAiConfig({ ...config, roles: r });\n return;\n }\n if (!db)\n throw new Error(\"Database is required for shared provider settings.\");\n await setSetting(db, \"llm.roles\", JSON.stringify(r));\n}\n\nexport async function withProviderScope(\n machine: boolean,\n action: (db: Database | undefined) => Promise<void>,\n): Promise<void> {\n if (machine) {\n await action(undefined);\n return;\n }\n await withDb(action);\n}\n\nexport function providerApiKeyIsSet(ref: string): boolean {\n return getProviderApiKey(ref) !== null;\n}\n","import {\n existsSync,\n lstatSync,\n mkdirSync,\n readFileSync,\n realpathSync,\n rmSync,\n symlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport { basename, dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n// The bundled CLI resolves from dist/cli/index.js; source tests resolve from\n// src/cli/provisioning/index.ts. Select the first candidate containing package.json.\nconst packageRoot =\n [\n fileURLToPath(new URL(\"../..\", import.meta.url)),\n fileURLToPath(new URL(\"../../..\", import.meta.url)),\n ].find((candidate) => existsSync(join(candidate, \"package.json\"))) ??\n fileURLToPath(new URL(\"../..\", import.meta.url));\n\nexport type SetupAgent = \"claude\" | \"copilot\" | \"codex\" | \"agent\";\n\nconst ALL_SETUP_AGENTS: SetupAgent[] = [\"claude\", \"copilot\", \"codex\", \"agent\"];\n\nconst SKILL_PAIRS: Array<{\n from: string;\n to: string;\n agents: SetupAgent[];\n}> = [\n {\n from: join(packageRoot, \".claude\", \"skills\", \"zam\", \"SKILL.md\"),\n to: join(\".claude\", \"skills\", \"zam\", \"SKILL.md\"),\n agents: [\"claude\", \"copilot\"],\n },\n {\n from: join(packageRoot, \".agent\", \"skills\", \"zam\", \"SKILL.md\"),\n to: join(\".agent\", \"skills\", \"zam\", \"SKILL.md\"),\n agents: [\"agent\"],\n },\n {\n from: join(packageRoot, \".agents\", \"skills\", \"zam\", \"SKILL.md\"),\n to: join(\".agents\", \"skills\", \"zam\", \"SKILL.md\"),\n agents: [\"codex\"],\n },\n];\n\nexport function parseSetupAgents(value?: string): Set<SetupAgent> {\n if (!value || value.trim().toLowerCase() === \"all\") {\n return new Set(ALL_SETUP_AGENTS);\n }\n const aliases: Record<string, SetupAgent[]> = {\n claude: [\"claude\"],\n copilot: [\"copilot\"],\n codex: [\"codex\"],\n agent: [\"agent\"],\n opencode: [\"agent\"],\n };\n const selected = new Set<SetupAgent>();\n for (const raw of value.split(\",\")) {\n const key = raw.trim().toLowerCase();\n const mapped = aliases[key];\n if (!mapped) {\n throw new Error(\n `Unknown agent \"${raw}\". Use: all, claude, copilot, codex, agent.`,\n );\n }\n for (const item of mapped) selected.add(item);\n }\n return selected;\n}\n\nexport type SkillWireAction = \"linked\" | \"relinked\" | \"skipped\";\n\nexport interface SkillWireResult {\n source: string;\n destination: string;\n action: SkillWireAction;\n reason?: string;\n}\n\nexport interface SkillWireOptions {\n force?: boolean;\n dryRun?: boolean;\n quiet?: boolean;\n}\n\n/**\n * Health of a single agent's `skills/zam` destination relative to the packaged\n * source. Drives both wiring decisions and the read-only status surfaced to the\n * CLI and Studio.\n */\nexport type SkillLinkState =\n | \"linked\"\n | \"missing\"\n | \"broken\"\n | \"stale-copy\"\n | \"unmanaged\"\n | \"source-directory\"\n | \"source-missing\";\n\nfunction pathExists(path: string): boolean {\n try {\n lstatSync(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction isSymbolicLink(path: string): boolean {\n try {\n return lstatSync(path).isSymbolicLink();\n } catch {\n return false;\n }\n}\n\nfunction comparableRealPath(path: string): string {\n const real = realpathSync(path);\n return process.platform === \"win32\" ? real.toLowerCase() : real;\n}\n\nfunction pathsResolveToSameDirectory(\n sourceDir: string,\n destinationDir: string,\n): boolean {\n try {\n return comparableRealPath(destinationDir) === comparableRealPath(sourceDir);\n } catch {\n return false;\n }\n}\n\nfunction linkPointsTo(sourceDir: string, destinationDir: string): boolean {\n return (\n isSymbolicLink(destinationDir) &&\n pathsResolveToSameDirectory(sourceDir, destinationDir)\n );\n}\n\n/**\n * True when the destination is a real directory that carries the ZAM skill\n * fingerprint (`name: zam` in SKILL.md). Such a directory is an outdated copy of\n * the skill — safe to replace with a live link even without `--force`. A\n * directory whose SKILL.md names a different skill is treated as unmanaged.\n */\nfunction isZamSkillCopy(destinationDir: string): boolean {\n try {\n if (!lstatSync(destinationDir).isDirectory()) return false;\n const skillFile = join(destinationDir, \"SKILL.md\");\n if (!existsSync(skillFile)) return false;\n return /^name:\\s*zam\\s*$/m.test(readFileSync(skillFile, \"utf8\"));\n } catch {\n return false;\n }\n}\n\n/**\n * Classify a destination directory against its packaged source so wiring and\n * inspection share one decision. `broken` covers a symlink that no longer\n * resolves to the source (a dangling junction after a ZAM move/update);\n * `stale-copy` is an outdated copied skill; `unmanaged` is a foreign directory.\n */\nexport function classifySkillDestination(\n sourceDir: string,\n destinationDir: string,\n): SkillLinkState {\n if (!existsSync(sourceDir)) return \"source-missing\";\n if (\n !isSymbolicLink(destinationDir) &&\n pathsResolveToSameDirectory(sourceDir, destinationDir)\n ) {\n return \"source-directory\";\n }\n if (linkPointsTo(sourceDir, destinationDir)) return \"linked\";\n if (!pathExists(destinationDir)) return \"missing\";\n if (isSymbolicLink(destinationDir)) return \"broken\";\n if (isZamSkillCopy(destinationDir)) return \"stale-copy\";\n return \"unmanaged\";\n}\n\nexport function wireSkills(\n cwd: string = process.cwd(),\n agents: Set<SetupAgent> = parseSetupAgents(),\n opts: SkillWireOptions = {},\n): SkillWireResult[] {\n const results: SkillWireResult[] = [];\n const log = (message: string) => {\n if (!opts.quiet) console.log(message);\n };\n\n for (const { from, to, agents: pairAgents } of SKILL_PAIRS) {\n if (!pairAgents.some((agent) => agents.has(agent))) continue;\n const sourceDir = dirname(from);\n const destinationDir = dirname(join(cwd, to));\n const label = dirname(to);\n const state = classifySkillDestination(sourceDir, destinationDir);\n\n if (state === \"source-missing\") {\n if (!opts.quiet) {\n console.warn(` warn source not found, skipping: ${sourceDir}`);\n }\n results.push({\n source: sourceDir,\n destination: destinationDir,\n action: \"skipped\",\n reason: \"source-not-found\",\n });\n continue;\n }\n\n if (state === \"source-directory\") {\n log(` skip ${label} (package source)`);\n results.push({\n source: sourceDir,\n destination: destinationDir,\n action: \"skipped\",\n reason: \"source-directory\",\n });\n continue;\n }\n\n if (state === \"linked\") {\n log(` skip ${label} (already linked)`);\n results.push({\n source: sourceDir,\n destination: destinationDir,\n action: \"skipped\",\n reason: \"already-linked\",\n });\n continue;\n }\n\n // A dangling ZAM junction or an outdated ZAM copy is clearly ours, so heal\n // it even without --force. A directory with no ZAM fingerprint stays put\n // unless the caller forces the replacement.\n const destinationExists = state !== \"missing\";\n const replaceExisting =\n destinationExists &&\n (Boolean(opts.force) || state === \"broken\" || state === \"stale-copy\");\n\n if (destinationExists && !replaceExisting) {\n if (!opts.quiet) {\n console.warn(\n ` warn ${label} already exists and is not managed by ZAM; use --force to replace it`,\n );\n }\n results.push({\n source: sourceDir,\n destination: destinationDir,\n action: \"skipped\",\n reason: \"unmanaged-destination\",\n });\n continue;\n }\n\n const action: SkillWireAction = destinationExists ? \"relinked\" : \"linked\";\n if (opts.dryRun) {\n log(` would ${action === \"linked\" ? \"link\" : \"relink\"} ${label}`);\n } else {\n if (destinationExists) {\n rmSync(destinationDir, { recursive: true, force: true });\n }\n mkdirSync(dirname(destinationDir), { recursive: true });\n symlinkSync(\n sourceDir,\n destinationDir,\n process.platform === \"win32\" ? \"junction\" : \"dir\",\n );\n log(` ${action === \"linked\" ? \"link\" : \"relink\"} ${label}`);\n }\n results.push({ source: sourceDir, destination: destinationDir, action });\n }\n\n return results;\n}\n\nexport type SkillLinkHealth = \"healthy\" | \"needs-repair\" | \"unmanaged\";\n\nexport interface SkillLinkInspection {\n agents: SetupAgent[];\n source: string;\n destination: string;\n state: SkillLinkState;\n}\n\n/**\n * Read-only counterpart to {@link wireSkills}: report the link state for each\n * agent destination without touching the filesystem. Used to show whether a\n * workspace is cleanly linked and whether a repair is warranted.\n */\nexport function inspectSkillLinks(\n cwd: string = process.cwd(),\n agents: Set<SetupAgent> = parseSetupAgents(),\n): SkillLinkInspection[] {\n const results: SkillLinkInspection[] = [];\n for (const { from, to, agents: pairAgents } of SKILL_PAIRS) {\n if (!pairAgents.some((agent) => agents.has(agent))) continue;\n const sourceDir = dirname(from);\n const destinationDir = dirname(join(cwd, to));\n results.push({\n agents: pairAgents,\n source: sourceDir,\n destination: destinationDir,\n state: classifySkillDestination(sourceDir, destinationDir),\n });\n }\n return results;\n}\n\n/**\n * Collapse per-agent link states into one workspace verdict. `unmanaged` wins\n * because replacing a foreign directory needs explicit confirmation; otherwise\n * a missing, broken, or stale link reads as `needs-repair`.\n */\nexport function summarizeSkillLinkHealth(\n inspections: SkillLinkInspection[],\n): SkillLinkHealth {\n if (inspections.some((item) => item.state === \"unmanaged\")) {\n return \"unmanaged\";\n }\n const repairable: SkillLinkState[] = [\"missing\", \"broken\", \"stale-copy\"];\n if (inspections.some((item) => repairable.includes(item.state))) {\n return \"needs-repair\";\n }\n return \"healthy\";\n}\n\nconst ZAM_BLOCK_START = \"<!-- ZAM:START -->\";\nconst ZAM_BLOCK_END = \"<!-- ZAM:END -->\";\n\nfunction upsertMarkedBlock(\n dest: string,\n blockBody: string,\n dryRun: boolean,\n): \"write\" | \"update\" | \"skip\" {\n const block = `${ZAM_BLOCK_START}\\n${blockBody.trim()}\\n${ZAM_BLOCK_END}`;\n if (!existsSync(dest)) {\n if (!dryRun) {\n mkdirSync(dirname(dest), { recursive: true });\n writeFileSync(dest, `${block}\\n`, \"utf8\");\n }\n return \"write\";\n }\n\n const existing = readFileSync(dest, \"utf8\");\n if (existing.includes(block)) return \"skip\";\n\n const start = existing.indexOf(ZAM_BLOCK_START);\n const end = existing.indexOf(ZAM_BLOCK_END);\n const next =\n start >= 0 && end > start\n ? `${existing.slice(0, start)}${block}${existing.slice(end + ZAM_BLOCK_END.length)}`\n : `${existing.trimEnd()}\\n\\n${block}\\n`;\n\n if (!dryRun) writeFileSync(dest, next, \"utf8\");\n return start >= 0 && end > start ? \"update\" : \"write\";\n}\n\nfunction logInstructionAction(\n action: \"write\" | \"update\" | \"skip\",\n label: string,\n dryRun: boolean,\n): void {\n if (action === \"skip\") {\n console.log(` skip ${label} (ZAM block already present)`);\n } else {\n console.log(` ${dryRun ? \"would \" : \"\"}${action} ${label}`);\n }\n}\n\nexport interface InstructionWriteOptions {\n dryRun?: boolean;\n updateExisting?: boolean;\n}\n\nexport function writeClaudeMd(\n skipClaudeMd: boolean,\n cwd: string = process.cwd(),\n opts: InstructionWriteOptions = {},\n): void {\n if (skipClaudeMd) return;\n\n const dest = join(cwd, \"CLAUDE.md\");\n if (existsSync(dest)) {\n if (!opts.updateExisting) {\n console.log(` skip CLAUDE.md (already present)`);\n return;\n }\n const action = upsertMarkedBlock(\n dest,\n `## ZAM learning sessions\n\nZAM is available in this repository. Use the \\`zam\\` skill in Claude Code to turn real work into an observed learning session with active recall and FSRS scheduling.\n\n- Skill files live under \\`.claude/skills/zam/\\`.\n- Fast-changing review data lives in \\`~/.zam/\\`, not in this repository.\n- The skill directory is linked to this ZAM installation and updates with it.`,\n Boolean(opts.dryRun),\n );\n logInstructionAction(action, \"CLAUDE.md\", Boolean(opts.dryRun));\n return;\n }\n\n const name = basename(cwd);\n const content = `# ZAM Personal Kernel — ${name}\n\nThis is a ZAM personal instance. ZAM builds lasting skills through spaced\nrepetition during real work — not separate study sessions.\n\n## First time here?\nRun \\`/setup\\` in Claude Code or Gemini CLI to complete first-time setup.\n\n## Regular use\nRun \\`/zam\\` to start a learning session on whatever you are working on.\n\n## What lives here\n- \\`beliefs/\\` — your worldview, approved by git commit\n- \\`goals/\\` — your objectives, decomposed into tasks and learning tokens\n\n## Fast-changing data\nLearning tokens, cards, and review history live in local SQLite by default.\nUse \\`zam connector setup turso\\` to store cloud credentials in\n\\`~/.zam/credentials.json\\` and use a Turso database across machines.\n`;\n if (opts.dryRun) {\n console.log(` would write CLAUDE.md`);\n } else {\n writeFileSync(dest, content, \"utf8\");\n console.log(` write CLAUDE.md`);\n }\n}\n\nexport function writeAgentsMd(\n skipAgentsMd: boolean,\n cwd: string = process.cwd(),\n opts: InstructionWriteOptions = {},\n): void {\n if (skipAgentsMd) return;\n\n const dest = join(cwd, \"AGENTS.md\");\n if (existsSync(dest)) {\n if (!opts.updateExisting) {\n console.log(` skip AGENTS.md (already present)`);\n return;\n }\n const action = upsertMarkedBlock(\n dest,\n `## ZAM learning sessions\n\nZAM is available in this repository. Select the \\`zam\\` skill through \\`/skills\\` or invoke \\`$zam\\` where supported to turn real work into an observed learning session with active recall and FSRS scheduling.\n\n- Skill files live under \\`.agents/skills/zam/\\`.\n- Fast-changing review data lives in \\`~/.zam/\\`, not in this repository.\n- The skill directory is linked to this ZAM installation and updates with it.`,\n Boolean(opts.dryRun),\n );\n logInstructionAction(action, \"AGENTS.md\", Boolean(opts.dryRun));\n return;\n }\n\n const name = basename(cwd);\n const content = `# ZAM Personal Kernel - ${name}\n\nThis is a ZAM personal instance. ZAM builds lasting skills through spaced\nrepetition during real work, not separate study sessions.\n\n## First time here?\nRun \\`zam setup\\` from the shell. When this repository includes\n\\`.agents/skills/setup/\\`, you can instead select \\`setup\\` through \\`/skills\\`\nor invoke \\`$setup\\`.\n\n## Regular use\nSelect the \\`zam\\` skill through \\`/skills\\` or invoke \\`$zam\\` to start a\nlearning session on whatever you are working on.\n\n## What lives here\n- \\`beliefs/\\` - your worldview, approved by git commit\n- \\`goals/\\` - your objectives, decomposed into tasks and learning tokens\n\n## Fast-changing data\nLearning tokens, cards, and review history live in local SQLite by default.\nUse \\`zam connector setup turso\\` to store cloud credentials in\n\\`~/.zam/credentials.json\\` and use a Turso database across machines.\n\n## Codex skills\nCodex discovers repository skills under \\`.agents/skills/\\`. Run\n\\`zam setup --force\\` after upgrading \\`zam-core\\` to refresh them.\n`;\n if (opts.dryRun) {\n console.log(` would write AGENTS.md`);\n } else {\n writeFileSync(dest, content, \"utf8\");\n console.log(` write AGENTS.md`);\n }\n}\n\nexport function writeCopilotInstructions(\n cwd: string = process.cwd(),\n opts: InstructionWriteOptions = {},\n): void {\n const dest = join(cwd, \".github\", \"copilot-instructions.md\");\n const action = upsertMarkedBlock(\n dest,\n `## ZAM learning sessions\n\nZAM is available in this repository through \\`.claude/skills/zam/\\`. Use the \\`zam\\` project skill from Copilot-compatible skill selection surfaces to turn real work into an observed learning session with active recall and FSRS scheduling.\n\n- Fast-changing review data lives in \\`~/.zam/\\`, not in this repository.\n- The skill directory is linked to this ZAM installation and updates with it.`,\n Boolean(opts.dryRun),\n );\n logInstructionAction(\n action,\n \".github/copilot-instructions.md\",\n Boolean(opts.dryRun),\n );\n}\n","import type { Database } from \"../../kernel/index.js\";\nimport { getSetting, setSetting } from \"../../kernel/index.js\";\n\nexport interface ResolveUserOptions {\n /** If true, output JSON error instead of console.error (for bridge commands). */\n json?: boolean;\n}\n\n/**\n * Ensure the desktop has a usable local identity on first launch.\n * Existing explicit configuration always wins.\n */\nexport async function ensureDefaultUser(\n db: Database,\n preferredUserId?: string,\n): Promise<string> {\n const stored = await getSetting(db, \"user.id\");\n if (stored) return stored;\n\n const userId =\n preferredUserId?.trim() ||\n process.env.ZAM_USER?.trim() ||\n process.env.USERNAME?.trim() ||\n process.env.USER?.trim() ||\n \"default\";\n await setSetting(db, \"user.id\", userId);\n return userId;\n}\n\n/**\n * Returns the user ID from the explicit --user flag, or falls back to the\n * stored `user.id` setting. Exits with an error if neither is available.\n */\nexport async function resolveUser(\n opts: { user?: string },\n db: Database,\n resolveOpts?: ResolveUserOptions,\n): Promise<string> {\n if (opts.user) return opts.user;\n\n const stored = await getSetting(db, \"user.id\");\n if (stored) return stored;\n\n const message =\n \"No user specified. Set a default with: zam whoami --set <id>\";\n if (resolveOpts?.json) {\n console.log(JSON.stringify({ error: message }, null, 2));\n } else {\n console.error(message);\n }\n process.exit(1);\n}\n","import { existsSync, mkdirSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { basename, join, resolve } from \"node:path\";\nimport {\n type Database,\n deleteSetting,\n getActiveWorkspace,\n getConfiguredWorkspaces,\n getSetting,\n removeConfiguredWorkspace,\n setActiveWorkspaceId,\n upsertConfiguredWorkspace,\n type WorkspaceConfig,\n type WorkspaceKind,\n} from \"../../kernel/index.js\";\n\nconst LEGACY_WORKSPACE_DIR_KEY = \"personal.workspace_dir\";\nconst DEFAULT_WORKSPACE_ID = \"personal\";\n\nexport function defaultWorkspaceDir(): string {\n return join(homedir(), \"Documents\", \"zam\");\n}\n\nfunction normalizeWorkspacePath(path: string): string {\n const resolved = resolve(path);\n return process.platform === \"win32\" ? resolved.toLowerCase() : resolved;\n}\n\nfunction sameWorkspacePath(left: string, right: string): boolean {\n return normalizeWorkspacePath(left) === normalizeWorkspacePath(right);\n}\n\nfunction labelFromPath(path: string): string {\n return basename(path) || \"ZAM\";\n}\n\nexport function workspaceIdFromPath(dir: string): string {\n const base = basename(dir)\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n const prefix = base || \"workspace\";\n const existing = new Set(getConfiguredWorkspaces().map((item) => item.id));\n if (!existing.has(prefix)) return prefix;\n let index = 2;\n while (existing.has(`${prefix}-${index}`)) index++;\n return `${prefix}-${index}`;\n}\n\nfunction findWorkspaceByPath(dir: string): WorkspaceConfig | undefined {\n return getConfiguredWorkspaces().find((workspace) =>\n sameWorkspacePath(workspace.path, dir),\n );\n}\n\nasync function clearLegacyWorkspaceDir(db: Database): Promise<void> {\n await deleteSetting(db, LEGACY_WORKSPACE_DIR_KEY);\n}\n\nexport async function migrateLegacyWorkspaceDir(\n db: Database,\n): Promise<WorkspaceConfig | undefined> {\n const legacyDir = await getSetting(db, LEGACY_WORKSPACE_DIR_KEY);\n if (!legacyDir) return undefined;\n\n const path = resolve(legacyDir);\n const existing = findWorkspaceByPath(path);\n const migrated =\n existing ??\n ({\n id: getConfiguredWorkspaces().some(\n (workspace) => workspace.id === DEFAULT_WORKSPACE_ID,\n )\n ? workspaceIdFromPath(path)\n : DEFAULT_WORKSPACE_ID,\n label: labelFromPath(path),\n kind: \"personal\",\n path,\n } satisfies WorkspaceConfig);\n\n if (!existing) {\n upsertConfiguredWorkspace(migrated);\n }\n if (!getActiveWorkspace()) {\n setActiveWorkspaceId(migrated.id);\n }\n await clearLegacyWorkspaceDir(db);\n return migrated;\n}\n\nexport async function ensureActiveWorkspace(\n db: Database,\n): Promise<WorkspaceConfig> {\n await migrateLegacyWorkspaceDir(db);\n\n const active = getActiveWorkspace();\n if (active) {\n mkdirSync(active.path, { recursive: true });\n return active;\n }\n\n const configured = getConfiguredWorkspaces()[0];\n if (configured) {\n setActiveWorkspaceId(configured.id);\n mkdirSync(configured.path, { recursive: true });\n return configured;\n }\n\n const workspace: WorkspaceConfig = {\n id: DEFAULT_WORKSPACE_ID,\n label: \"Personal\",\n kind: \"personal\",\n path: defaultWorkspaceDir(),\n };\n mkdirSync(workspace.path, { recursive: true });\n upsertConfiguredWorkspace(workspace);\n setActiveWorkspaceId(workspace.id);\n await clearLegacyWorkspaceDir(db);\n return workspace;\n}\n\nexport async function activateWorkspace(\n db: Database,\n workspace: WorkspaceConfig,\n): Promise<WorkspaceConfig> {\n upsertConfiguredWorkspace(workspace);\n setActiveWorkspaceId(workspace.id);\n await clearLegacyWorkspaceDir(db);\n return workspace;\n}\n\nexport async function activateWorkspacePath(\n db: Database,\n dir: string,\n opts: {\n id?: string;\n label?: string;\n kind?: WorkspaceKind;\n } = {},\n): Promise<WorkspaceConfig> {\n await migrateLegacyWorkspaceDir(db);\n const path = resolve(dir);\n const existing = opts.id ? undefined : findWorkspaceByPath(path);\n if (existing) {\n setActiveWorkspaceId(existing.id);\n await clearLegacyWorkspaceDir(db);\n return existing;\n }\n\n const workspace: WorkspaceConfig = {\n id: opts.id || workspaceIdFromPath(path),\n label: opts.label || labelFromPath(path),\n kind: opts.kind || \"personal\",\n path,\n };\n return activateWorkspace(db, workspace);\n}\n\nexport async function removeWorkspaceAndResolveActive(\n db: Database,\n id: string,\n): Promise<{\n activeWorkspace: WorkspaceConfig;\n workspaces: WorkspaceConfig[];\n}> {\n removeConfiguredWorkspace(id);\n await clearLegacyWorkspaceDir(db);\n const activeWorkspace = await ensureActiveWorkspace(db);\n return {\n activeWorkspace,\n workspaces: getConfiguredWorkspaces(),\n };\n}\n\nexport function existingWorkspaceDirOrHome(workspace: WorkspaceConfig): string {\n return existsSync(workspace.path) ? workspace.path : homedir();\n}\n","import { mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Database } from \"../../kernel/index.js\";\n\n/**\n * Consistent single-file backup of the open database into\n * `<targetDir>/zam-backups/`. Uses SQLite `VACUUM INTO`, which writes a clean\n * snapshot even in WAL mode with a live connection. Returns the backup path.\n */\nexport async function backupDatabaseTo(\n db: Database,\n targetDir: string,\n): Promise<string> {\n const backupDir = join(targetDir, \"zam-backups\");\n mkdirSync(backupDir, { recursive: true });\n const stamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n const dest = join(backupDir, `zam-${stamp}.db`);\n await db.exec(`VACUUM INTO '${dest.replace(/'/g, \"''\")}'`);\n return dest;\n}\n","/**\n * `zam card` — Card scheduling subcommand group.\n */\n\nimport { Command } from \"commander\";\nimport type { Rating } from \"../../kernel/index.js\";\nimport {\n cascadeBlock,\n deleteCardForUser,\n ensureCard,\n evaluateRating,\n getCardDeletionImpact,\n getDueCards,\n getPrerequisites,\n getTokenBySlug,\n unblockReady,\n} from \"../../kernel/index.js\";\nimport { resolveUser } from \"../users/identity.js\";\nimport { withDb } from \"./shared/db.js\";\n\nexport const cardCommand = new Command(\"card\").description(\n \"Manage spaced-repetition cards\",\n);\n\n// ── zam card due ──────────────────────────────────────────────────────────\n\ncardCommand\n .command(\"due\")\n .description(\"Show due tokens for a user\")\n .option(\"--user <id>\", \"User ID (default: whoami)\")\n .option(\"--domain <domain>\", \"Filter by knowledge domain\")\n .option(\"--knowledge-context <context>\", \"Filter by knowledge context\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--summary\", \"Show only counts per domain (no slugs or concepts)\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const userId = await resolveUser(opts, db);\n const dueCards = await getDueCards(\n db,\n userId,\n undefined,\n opts.domain,\n opts.knowledgeContext,\n );\n\n if (opts.json) {\n console.log(JSON.stringify(dueCards, null, 2));\n return;\n }\n\n if (dueCards.length === 0) {\n console.log(\"No cards due for review.\");\n return;\n }\n\n if (opts.summary) {\n const byDomain = new Map<string, { count: number; blooms: number[] }>();\n for (const c of dueCards) {\n const d = c.domain || \"general\";\n const entry = byDomain.get(d) ?? { count: 0, blooms: [] };\n entry.count++;\n entry.blooms.push(c.bloom_level);\n byDomain.set(d, entry);\n }\n console.log(`${dueCards.length} card(s) due:\\n`);\n console.log(\"Domain Count Bloom levels\");\n console.log(\"─\".repeat(45));\n for (const [domain, { count, blooms }] of [\n ...byDomain.entries(),\n ].sort()) {\n const bloomStr = blooms.sort().join(\", \");\n console.log(\n `${domain.padEnd(16)} ${String(count).padEnd(6)} ${bloomStr}`,\n );\n }\n return;\n }\n\n console.log(`${dueCards.length} card(s) due:\\n`);\n console.log(\n \"Slug Concept Domain Bloom State\",\n );\n console.log(\"─\".repeat(90));\n for (const c of dueCards) {\n console.log(\n `${c.slug.padEnd(21)} ${c.concept.slice(0, 31).padEnd(31)} ${(c.domain || \"-\").padEnd(11)} ${String(c.bloom_level).padEnd(6)} ${c.state}`,\n );\n }\n });\n });\n\n// ── zam card update ───────────────────────────────────────────────────────\n\ncardCommand\n .command(\"update\")\n .description(\"Apply a rating to a card\")\n .option(\"--user <id>\", \"User ID (default: whoami)\")\n .requiredOption(\"--token <slug>\", \"Token slug\")\n .requiredOption(\"--rating <n>\", \"Rating (1=Again, 2=Hard, 3=Good, 4=Easy)\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--quiet\", \"Suppress output (exit code only)\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const userId = await resolveUser(opts, db);\n const token = await getTokenBySlug(db, opts.token);\n if (!token) {\n console.error(`Token not found: ${opts.token}`);\n process.exit(1);\n }\n\n const card = await ensureCard(db, token.id, userId);\n const rating = Number(opts.rating) as Rating;\n\n if (rating < 1 || rating > 4) {\n console.error(\"Rating must be between 1 and 4.\");\n process.exit(1);\n }\n\n const result = await evaluateRating(db, {\n cardId: card.id,\n tokenId: token.id,\n userId,\n rating,\n });\n\n // If rating is 1 (forgot) and token has prerequisites, cascade block\n if (rating === 1) {\n const prereqs = await getPrerequisites(db, token.id);\n if (prereqs.length > 0) {\n const blockResult = await cascadeBlock(db, userId, token.slug);\n if (opts.quiet) return;\n if (opts.json) {\n console.log(\n JSON.stringify(\n { evaluation: result, blocked: blockResult },\n null,\n 2,\n ),\n );\n } else {\n console.log(\n `Rated ${token.slug} as Again (1) — next due: ${result.nextDueAt}`,\n );\n console.log(\n `Blocked ${blockResult.blockedSlug}. Prerequisites surfaced:`,\n );\n for (const p of blockResult.prerequisites) {\n console.log(` - ${p.slug}: ${p.concept}`);\n }\n }\n return;\n }\n }\n\n if (opts.quiet) return;\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n const ratingLabels: Record<number, string> = {\n 1: \"Again\",\n 2: \"Hard\",\n 3: \"Good\",\n 4: \"Easy\",\n };\n console.log(\n `Rated ${token.slug} as ${ratingLabels[rating]} (${rating})`,\n );\n console.log(` Next due: ${result.nextDueAt}`);\n console.log(` Stability: ${result.stability.toFixed(2)}`);\n console.log(` State: ${result.state}`);\n console.log(` Reps: ${result.reps}`);\n }\n });\n });\n\n// ── zam card block ────────────────────────────────────────────────────────\n\ncardCommand\n .command(\"block\")\n .description(\"Block a card and surface its prerequisites\")\n .option(\"--user <id>\", \"User ID (default: whoami)\")\n .requiredOption(\"--token <slug>\", \"Token slug\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--quiet\", \"Suppress output (exit code only)\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const userId = await resolveUser(opts, db);\n const token = await getTokenBySlug(db, opts.token);\n if (!token) {\n console.error(`Token not found: ${opts.token}`);\n process.exit(1);\n }\n\n const prereqs = await getPrerequisites(db, token.id);\n if (prereqs.length === 0) {\n console.error(\n `Cannot block ${opts.token}: token has no prerequisites.`,\n );\n process.exit(1);\n }\n\n const result = await cascadeBlock(db, userId, token.slug);\n\n if (opts.quiet) return;\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log(`Blocked ${result.blockedSlug}. Prerequisites surfaced:`);\n for (const prerequisite of result.prerequisites) {\n console.log(` - ${prerequisite.slug}: ${prerequisite.concept}`);\n }\n });\n });\n\n// ── zam card unblock ──────────────────────────────────────────────────────\n\ncardCommand\n .command(\"unblock\")\n .description(\"Unblock cards whose prerequisites are met\")\n .option(\"--user <id>\", \"User ID (default: whoami)\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--quiet\", \"Suppress output (exit code only)\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const userId = await resolveUser(opts, db);\n const result = await unblockReady(db, userId);\n\n if (opts.quiet) return;\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n if (result.unblocked.length === 0) {\n console.log(\"No cards ready to unblock.\");\n } else {\n console.log(`Unblocked ${result.unblocked.length} card(s):`);\n for (const u of result.unblocked) {\n console.log(` - ${u.slug}: ${u.concept}`);\n }\n }\n });\n });\n\n// ── zam card delete ───────────────────────────────────────────────────────\n\ncardCommand\n .command(\"delete\")\n .description(\"Delete one user's card for a token\")\n .option(\"--user <id>\", \"User ID (default: whoami)\")\n .requiredOption(\"--token <slug>\", \"Token slug\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const userId = await resolveUser(opts, db);\n const token = await getTokenBySlug(db, opts.token);\n if (!token) {\n console.error(`Token not found: ${opts.token}`);\n process.exit(1);\n }\n\n const impact = await getCardDeletionImpact(db, token.id, userId);\n const result = await deleteCardForUser(db, token.id, userId);\n\n if (opts.json) {\n console.log(\n JSON.stringify(\n {\n token: opts.token,\n userId,\n deleted: true,\n cardId: result.card.id,\n impact: result.impact,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n console.log(`Deleted card for ${opts.token}`);\n console.log(` User: ${userId}`);\n console.log(` Card ID: ${result.card.id}`);\n console.log(` Review logs removed: ${impact.review_logs}`);\n });\n });\n","/**\n * `zam connector` — Manage external service connectors.\n */\n\nimport { input, password } from \"@inquirer/prompts\";\nimport { Command } from \"commander\";\nimport { fetchActiveWorkItems } from \"../../kernel/connectors/azure-devops.js\";\nimport {\n clearADOCredentials,\n clearTursoCredentials,\n getADOCredentials,\n getTursoCredentials,\n setADOCredentials,\n setTursoCredentials,\n} from \"../../kernel/credentials.js\";\nimport type { Database } from \"../../kernel/index.js\";\nimport { getSystemProfile, openDatabaseWithSync } from \"../../kernel/index.js\";\n\nexport const connectorCommand = new Command(\"connector\").description(\n \"Manage external service connectors\",\n);\n\n// ── zam connector setup ado ─────────────────────────────────────────────────\n\nconnectorCommand\n .command(\"setup\")\n .description(\"Configure a connector\")\n .argument(\"<type>\", \"Connector type (ado, turso)\")\n .option(\"--url <url>\", \"Turso database URL (non-interactive)\")\n .option(\"--token <token>\", \"Turso auth token (non-interactive)\")\n .option(\n \"--mode <mode>\",\n \"Turso access mode: native (libsql driver) | remote (HTTP, works on Windows ARM64)\",\n )\n .action(async (type, opts) => {\n if (type === \"turso\") {\n if (opts.mode && opts.mode !== \"native\" && opts.mode !== \"remote\") {\n console.error(`Invalid --mode: ${opts.mode}. Use native or remote.`);\n process.exit(1);\n }\n return setupTurso(opts.url, opts.token, opts.mode);\n }\n if (type !== \"ado\") {\n console.error(`Unknown connector type: ${type}. Supported: ado, turso`);\n process.exit(1);\n }\n\n try {\n const orgUrl = await input({\n message: \"Organization URL (e.g. https://dev.azure.com/myorg):\",\n });\n const project = await input({\n message: \"Project name:\",\n });\n const pat = await password({\n message: \"Personal Access Token:\",\n });\n\n if (!orgUrl || !project || !pat) {\n console.error(\"All fields are required.\");\n process.exit(1);\n }\n\n setADOCredentials(orgUrl.replace(/\\/+$/, \"\"), project, pat);\n console.log(`Azure DevOps connector configured for ${orgUrl}/${project}`);\n } catch (err) {\n if ((err as Error).name === \"ExitPromptError\") {\n console.log(\"\\nSetup cancelled.\");\n process.exit(0);\n }\n console.error(\"Error:\", (err as Error).message);\n process.exit(1);\n }\n });\n\n// ── zam connector tasks ─────────────────────────────────────────────────────\n\nconnectorCommand\n .command(\"tasks\")\n .description(\"List active tasks from connected board\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (opts) => {\n try {\n const config = getADOCredentials();\n\n if (!config) {\n console.error(\"No connector configured. Run: zam connector setup ado\");\n process.exit(1);\n }\n\n const items = await fetchActiveWorkItems({\n orgUrl: config.org_url,\n project: config.project,\n pat: config.pat,\n });\n\n if (opts.json) {\n console.log(JSON.stringify(items, null, 2));\n return;\n }\n\n if (items.length === 0) {\n console.log(\"No active work items assigned to you.\");\n return;\n }\n\n console.log(`${items.length} active work item(s):\\n`);\n console.log(\"ID Type State Title\");\n console.log(\"─\".repeat(80));\n for (const wi of items) {\n console.log(\n `${String(wi.id).padEnd(8)} ${wi.type.padEnd(13)} ${wi.state.padEnd(11)} ${wi.title.slice(0, 45)}`,\n );\n }\n } catch (err) {\n console.error(\"Error:\", (err as Error).message);\n process.exit(1);\n }\n });\n\n// ── zam connector clear ─────────────────────────────────────────────────────\n\nconnectorCommand\n .command(\"clear\")\n .description(\"Remove a connector configuration\")\n .argument(\"<type>\", \"Connector type (ado, turso)\")\n .action((type) => {\n if (type === \"turso\") {\n clearTursoCredentials();\n console.log(\"Turso cloud sync removed. Database remains local-only.\");\n return;\n }\n\n if (type !== \"ado\") {\n console.error(`Unknown connector type: ${type}. Supported: ado, turso`);\n process.exit(1);\n }\n\n clearADOCredentials();\n console.log(\"Azure DevOps connector removed.\");\n });\n\n// ── zam connector sync ──────────────────────────────────────────────────────\n\nconnectorCommand\n .command(\"sync\")\n .description(\"Verify the Turso cloud database connection\")\n .action(async () => {\n const turso = getTursoCredentials();\n if (!turso) {\n console.error(\n \"No Turso cloud database configured. Run: zam connector setup turso\",\n );\n process.exit(1);\n }\n\n let db: Database | undefined;\n try {\n db = await openDatabaseWithSync({ initialize: true });\n await db.prepare(\"SELECT 1\").get();\n console.log(`Connected to ${turso.url}`);\n await db.close();\n } catch (err) {\n await db?.close();\n console.error(\"Error:\", (err as Error).message);\n process.exit(1);\n }\n });\n\n// ── Turso setup helper ──────────────────────────────────────────────────────\n\nasync function setupTurso(\n urlArg?: string,\n tokenArg?: string,\n mode?: \"native\" | \"remote\",\n): Promise<void> {\n let db: Database | undefined;\n\n // Auto-detect Windows ARM64 and default to remote mode, since the libsql\n // native driver has no prebuilt ARM64 binaries for Windows.\n const arch = getSystemProfile().arch;\n const isWindowsArm64 = process.platform === \"win32\" && arch === \"arm64\";\n const effectiveMode = mode ?? (isWindowsArm64 ? \"remote\" : undefined);\n if (!mode && isWindowsArm64) {\n console.log(\n \"Detected Windows ARM64 — defaulting to remote (HTTP) mode.\\n\" +\n \" The native libsql driver is not available on this architecture.\\n\" +\n \" Remote mode uses the Turso HTTP API and works everywhere.\\n\",\n );\n }\n\n try {\n const url =\n urlArg ??\n (await input({\n message: \"Turso database URL (e.g. libsql://my-db-user.turso.io):\",\n }));\n const token =\n tokenArg ??\n (await password({\n message: \"Auth token:\",\n }));\n\n if (!url || !token) {\n console.error(\"Both URL and token are required.\");\n process.exit(1);\n }\n\n // Store credentials outside the db so they survive db deletion\n setTursoCredentials(url, token, undefined, effectiveMode);\n\n // Verify by opening the configured cloud database.\n db = await openDatabaseWithSync({ initialize: true });\n await db.prepare(\"SELECT 1\").get();\n await db.close();\n\n console.log(\n `Turso cloud database configured and verified: ${url}` +\n (effectiveMode ? ` (mode: ${effectiveMode})` : \"\"),\n );\n } catch (err) {\n await db?.close();\n if ((err as Error).name === \"ExitPromptError\") {\n console.log(\"\\nSetup cancelled.\");\n process.exit(0);\n }\n console.error(\"Error:\", (err as Error).message);\n process.exit(1);\n }\n}\n","/**\n * `zam doctor` — Knowledge base maintenance and repair.\n * Implements the `zam doctor` from the titles ADR.\n */\n\nimport { Command } from \"commander\";\nimport type { Database } from \"../../kernel/db/types.js\";\nimport {\n assignTokenToContext,\n getEmbeddingCoverage,\n getSetting,\n getShortSlug,\n type KnowledgeContext,\n listKnowledgeContexts,\n} from \"../../kernel/index.js\";\nimport {\n deprecateToken,\n listTokens,\n type Token,\n type UpdateTokenInput,\n updateToken,\n} from \"../../kernel/models/token.js\";\nimport { listEmbeddedTokens } from \"../../kernel/models/token-embedding.js\";\nimport { cosineSimilarity } from \"../../kernel/search/hybrid.js\";\nimport {\n generateTitleViaLLM,\n getLlmConfig,\n repairUmlautsViaLLM,\n} from \"../llm/client.js\";\nimport {\n canonicalEmbeddingModelId,\n ensureTokenEmbeddings,\n resolveDedupThreshold,\n} from \"../llm/embedder.js\";\nimport { withDb } from \"./shared/db.js\";\n\nexport interface DoctorOptions {\n fix?: boolean;\n dryRun?: boolean;\n yes?: boolean;\n noLlm?: boolean;\n timeoutMs?: number;\n knowledgeContext?: string;\n json?: boolean;\n}\n\nexport interface DoctorTask {\n name: string;\n description: string;\n run: (db: Database, opts: DoctorOptions) => Promise<void>;\n}\n\nfunction shouldApplyFixes(opts: DoctorOptions): boolean {\n return opts.fix === true && opts.dryRun !== true;\n}\n\nfunction stringifyDoctorOutput(value: unknown): string {\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nasync function captureDoctorTaskOutput(\n task: DoctorTask,\n db: Database,\n opts: DoctorOptions,\n): Promise<{ lines: string[]; error?: string }> {\n const chunks: string[] = [];\n const append = (value: string): void => {\n for (const line of value.split(/[\\r\\n]+/)) {\n const trimmed = line.trim();\n if (trimmed) chunks.push(trimmed);\n }\n };\n const capture = (...args: unknown[]): void => {\n append(args.map(stringifyDoctorOutput).join(\" \"));\n };\n const originalLog = console.log;\n const originalWarn = console.warn;\n const originalError = console.error;\n const originalWrite = process.stdout.write;\n\n console.log = capture as typeof console.log;\n console.warn = capture as typeof console.warn;\n console.error = capture as typeof console.error;\n process.stdout.write = ((chunk: string | Uint8Array) => {\n append(typeof chunk === \"string\" ? chunk : Buffer.from(chunk).toString());\n return true;\n }) as typeof process.stdout.write;\n\n try {\n await task.run(db, opts);\n return { lines: chunks };\n } catch (error) {\n return { lines: chunks, error: (error as Error).message };\n } finally {\n console.log = originalLog;\n console.warn = originalWarn;\n console.error = originalError;\n process.stdout.write = originalWrite;\n }\n}\n\nasync function confirmDeterministicChanges(\n opts: DoctorOptions,\n message: string,\n): Promise<boolean> {\n if (opts.yes) return true;\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n console.error(\n \"Cannot request confirmation in a non-interactive terminal. Re-run with --yes to apply deterministic fixes.\",\n );\n return false;\n }\n const { confirm } = await import(\"@inquirer/prompts\");\n return confirm({ message, default: false });\n}\n\nfunction canRunInteractiveChoices(\n opts: DoctorOptions,\n taskName: string,\n): boolean {\n if (opts.yes) {\n console.error(\n `--yes cannot choose how to resolve ${taskName}. Re-run without --yes in an interactive terminal.`,\n );\n return false;\n }\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n console.error(\n `${taskName} fixes require an interactive terminal because each change needs an explicit choice.`,\n );\n return false;\n }\n return true;\n}\n\nfunction getWeakTitleReason(t: Token): string | null {\n const title = (t.title || \"\").trim();\n if (!title) {\n return \"Missing or empty title\";\n }\n if (title === t.slug) {\n return \"Title is equal to technical slug\";\n }\n if (title.length < 3) {\n return \"Title is suspiciously short\";\n }\n if (title.length > 100) {\n return \"Title is too long (> 100 chars)\";\n }\n if (t.domain) {\n const domParts = t.domain.split(/[-/]/).filter((p) => p.length > 2);\n const titleLower = title.toLowerCase();\n for (const part of domParts) {\n if (titleLower.includes(part.toLowerCase())) {\n return `Domain echo (contains '${part}' from domain '${t.domain}')`;\n }\n }\n }\n const conceptClean = (t.concept || \"\").trim().toLowerCase();\n const titleLower = title.toLowerCase();\n if (\n conceptClean.startsWith(titleLower) &&\n t.concept.length > title.length + 5 &&\n !/[.!?]/.test(title)\n ) {\n const titleWords = titleLower.split(/\\s+/).length;\n if (titleWords <= 5) {\n return \"Concept-prefix copy\";\n }\n }\n if (\n title.endsWith(\"?\") ||\n /^(what|how|why|who|where|when|which|is|are|was|were|can|do|does|did|ueber|fuer|nahe)\\b/i.test(\n title,\n )\n ) {\n return \"Question stump or interrogative structure\";\n }\n if (title.length > 3 && /[a-zA-Z]/.test(title)) {\n if (title === title.toUpperCase()) {\n return \"All uppercase\";\n }\n if (title === title.toLowerCase()) {\n return \"All lowercase\";\n }\n }\n return null;\n}\n\nfunction stripLeadingDomainWords(value: string, domain: string): string {\n let result = value.trim();\n for (const word of domain.split(/[-/]/).filter(Boolean)) {\n const escaped = word.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n result = result.replace(new RegExp(`^${escaped}\\\\s+`, \"i\"), \"\");\n }\n return result.trim();\n}\n\nfunction truncateTitle(value: string): string {\n const trimmed = value.trim().replace(/^[\"']+|[\"']+$/g, \"\");\n return trimmed.length <= 80\n ? trimmed\n : `${trimmed.substring(0, 77).trimEnd()}...`;\n}\n\nfunction titleFromSlug(token: Token): string {\n return getShortSlug(token.slug, token.domain)\n .split(/[-_]+/)\n .filter(Boolean)\n .map((word) => `${word.charAt(0).toUpperCase()}${word.slice(1)}`)\n .join(\" \");\n}\n\nfunction validatedTitleProposal(token: Token, raw: string): string | null {\n const candidates = [\n raw,\n (token.concept || \"\").split(/[.;]/)[0] || \"\",\n titleFromSlug(token),\n ];\n\n for (const candidate of candidates) {\n const normalized = truncateTitle(\n stripLeadingDomainWords(candidate, token.domain || \"\"),\n );\n if (\n normalized.length > 0 &&\n getWeakTitleReason({ ...token, title: normalized }) === null\n ) {\n return normalized;\n }\n }\n return null;\n}\n\nconst LANGUAGE_MARKERS: Record<string, string[]> = {\n de: [\"der\", \"die\", \"das\", \"und\", \"ist\", \"sind\", \"für\", \"mit\", \"nicht\"],\n en: [\"the\", \"and\", \"is\", \"are\", \"for\", \"with\", \"not\", \"from\", \"that\"],\n es: [\"el\", \"la\", \"los\", \"las\", \"y\", \"es\", \"son\", \"para\", \"con\"],\n fr: [\"le\", \"la\", \"les\", \"et\", \"est\", \"sont\", \"pour\", \"avec\"],\n pt: [\"o\", \"a\", \"os\", \"as\", \"e\", \"é\", \"são\", \"para\", \"com\"],\n};\n\nfunction inferEstablishedLanguage(token: Token): string | null {\n const text = [token.title, token.concept, token.question, token.context]\n .filter(Boolean)\n .join(\" \")\n .toLowerCase();\n if (/[-ヿ]/u.test(text)) return \"ja\";\n if (/[㐀-鿿]/u.test(text)) return \"zh\";\n\n const words = new Set(text.match(/\\p{L}+/gu) ?? []);\n const scores = Object.entries(LANGUAGE_MARKERS)\n .map(([language, markers]) => ({\n language,\n score: markers.filter((marker) => words.has(marker)).length,\n }))\n .sort((a, b) => b.score - a.score);\n return scores[0].score >= 2 && scores[0].score > scores[1].score\n ? scores[0].language\n : null;\n}\n\nfunction primaryLanguage(language: string | null): string | null {\n return language?.trim().toLowerCase().split(/[-_]/)[0] || null;\n}\n\nexport const doctorTasks: DoctorTask[] = [\n {\n name: \"titles\",\n description:\n \"Backfill missing/weak human-friendly titles (no domain echoes, descriptive names).\",\n run: async (db, opts) => {\n const tokens = await listTokens(db, {});\n const needing = tokens\n .map((t) => {\n const reason = getWeakTitleReason(t);\n return reason ? { token: t, reason } : null;\n })\n .filter((x): x is { token: Token; reason: string } => x !== null);\n\n console.log(\n `Found ${needing.length} tokens needing title work (of ${tokens.length}).`,\n );\n if (needing.length === 0) return;\n\n const cfg = await getLlmConfig(db);\n const useLLM = cfg.enabled && !opts.noLlm;\n console.log(\n `Title generation mode: ${useLLM ? \"LLM\" : \"Heuristic fallback\"}${opts.timeoutMs ? ` (timeout: ${opts.timeoutMs}ms)` : \"\"}`,\n );\n\n console.log(\"Generating proposed titles...\");\n const proposals: Array<{\n token: Token;\n oldTitle: string;\n newTitle: string;\n reason: string;\n }> = [];\n let rejected = 0;\n\n for (let i = 0; i < needing.length; i++) {\n const item = needing[i];\n if (!opts.json) {\n process.stdout.write(\n `\\r [${i + 1}/${needing.length}] ${item.token.slug.slice(0, 40)}...`,\n );\n }\n let rawProposal = \"\";\n if (useLLM) {\n try {\n const gen = await generateTitleViaLLM(\n db,\n {\n slug: item.token.slug,\n concept: item.token.concept,\n domain: item.token.domain,\n question: item.token.question,\n context: item.token.context,\n },\n {\n timeoutMs: opts.timeoutMs,\n knowledgeContext: opts.knowledgeContext,\n },\n );\n rawProposal = gen.text;\n } catch (_e) {\n rawProposal =\n (item.token.concept || \"\").split(/[.;]/)[0]?.trim() ||\n item.token.slug.replace(/-/g, \" \");\n }\n } else {\n rawProposal =\n (item.token.concept || \"\").split(/[.;]/)[0]?.trim() ||\n item.token.slug.replace(/-/g, \" \");\n }\n\n const proposed = validatedTitleProposal(item.token, rawProposal);\n if (!proposed) {\n rejected++;\n continue;\n }\n\n proposals.push({\n token: item.token,\n oldTitle: item.token.title,\n newTitle: proposed,\n reason: item.reason,\n });\n }\n if (!opts.json) process.stdout.write(\"\\n\");\n if (rejected > 0) {\n console.warn(\n `Skipped ${rejected} token(s) because no proposal passed title quality validation.`,\n );\n }\n if (proposals.length === 0) return;\n\n if (!shouldApplyFixes(opts)) {\n console.log(\"\\nProposed changes (Dry run):\");\n for (const prop of proposals) {\n console.log(\n ` ${prop.token.slug}: \"${prop.oldTitle}\" -> \"${prop.newTitle}\" (Reason: ${prop.reason})`,\n );\n }\n console.log(\"\\nRun with --fix to apply these changes.\");\n return;\n }\n\n if (!opts.yes) {\n console.log(\"\\nProposed changes:\");\n for (const prop of proposals) {\n console.log(\n ` ${prop.token.slug}: \"${prop.oldTitle}\" -> \"${prop.newTitle}\" (Reason: ${prop.reason})`,\n );\n }\n }\n const confirmed = await confirmDeterministicChanges(\n opts,\n `Apply these ${proposals.length} proposed titles?`,\n );\n\n if (!confirmed) {\n console.log(\"Cancelled. No titles were updated.\");\n return;\n }\n\n let fixed = 0;\n for (const prop of proposals) {\n await updateToken(db, prop.token.slug, { title: prop.newTitle });\n fixed++;\n console.log(`Set title for ${prop.token.slug} -> ${prop.newTitle}`);\n }\n console.log(`Successfully fixed ${fixed} titles.`);\n },\n },\n {\n name: \"texts\",\n description:\n \"Repair legacy ASCII umlauts in prose fields (question/concept/context).\",\n run: async (db, opts) => {\n const tokens = await listTokens(db, {});\n const cfg = await getLlmConfig(db);\n const useLLM = cfg.enabled && !opts.noLlm;\n\n const replacements = [\n [/\\bUeber\\b/g, \"Über\"],\n [/\\bueber\\b/g, \"über\"],\n [/\\bFuer\\b/g, \"Für\"],\n [/\\bfuer\\b/g, \"für\"],\n [/\\bMuehe\\b/g, \"Mühe\"],\n [/\\bmuehe\\b/g, \"mühe\"],\n [/\\bKuer\\b/g, \"Kür\"],\n [/\\bkuer\\b/g, \"kür\"],\n [/\\bUebung\\b/g, \"Übung\"],\n [/\\buebung\\b/g, \"übung\"],\n [/\\bMoeglich\\b/g, \"Möglich\"],\n [/\\bmoeglich\\b/g, \"möglich\"],\n [/\\bMoeglichkeiten\\b/g, \"Möglichkeiten\"],\n [/\\bmoeglichkeiten\\b/g, \"möglichkeiten\"],\n [/\\bSchoen\\b/g, \"Schön\"],\n [/\\bschoen\\b/g, \"schön\"],\n [/\\bKoennen\\b/g, \"Können\"],\n [/\\bkoennen\\b/g, \"können\"],\n [/\\bMuessen\\b/g, \"Müssen\"],\n [/\\bmuessen\\b/g, \"müssen\"],\n [/\\bDuerfen\\b/g, \"Dürfen\"],\n [/\\bduerfen\\b/g, \"dürfen\"],\n [/\\bAerger\\b/g, \"Ärger\"],\n [/\\baerger\\b/g, \"ärger\"],\n [/\\bGruende\\b/g, \"Gründe\"],\n [/\\bgruende\\b/g, \"gründe\"],\n ];\n\n const toFix: Array<{\n token: Token;\n field: string;\n old: string;\n new: string;\n }> = [];\n\n console.log(\"Analyzing prose text fields for legacy umlauts...\");\n for (const t of tokens) {\n const fields = [\n { key: \"question\", val: t.question },\n { key: \"concept\", val: t.concept },\n { key: \"context\", val: t.context },\n { key: \"title\", val: t.title },\n ];\n for (const f of fields) {\n if (!f.val || typeof f.val !== \"string\") continue;\n let repaired = f.val;\n\n if (useLLM) {\n const hasPossibleUmlautFold = /[aou]e/i.test(f.val);\n if (hasPossibleUmlautFold) {\n try {\n repaired = await repairUmlautsViaLLM(\n db,\n { text: f.val },\n { timeoutMs: opts.timeoutMs },\n );\n if (repaired === f.val) {\n for (const [from, to] of replacements) {\n repaired = repaired.replace(from, to as string);\n }\n }\n } catch (_e) {\n for (const [from, to] of replacements) {\n repaired = repaired.replace(from, to as string);\n }\n }\n }\n } else {\n for (const [from, to] of replacements) {\n repaired = repaired.replace(from, to as string);\n }\n }\n\n if (repaired !== f.val) {\n toFix.push({ token: t, field: f.key, old: f.val, new: repaired });\n }\n }\n }\n\n console.log(`Found ${toFix.length} prose fields with legacy umlauts.`);\n if (toFix.length === 0) return;\n\n if (!shouldApplyFixes(opts)) {\n console.log(\"\\nProposed changes (Dry run):\");\n for (const fix of toFix) {\n console.log(` ${fix.token.slug} [${fix.field}]:`);\n console.log(` Old: \"${fix.old}\"`);\n console.log(` New: \"${fix.new}\"`);\n }\n console.log(\"\\nRun with --fix to apply these changes.\");\n return;\n }\n\n if (!opts.yes) {\n console.log(\"\\nProposed changes:\");\n for (const fix of toFix) {\n console.log(\n ` ${fix.token.slug} [${fix.field}]: \"${fix.old}\" -> \"${fix.new}\"`,\n );\n }\n }\n const confirmed = await confirmDeterministicChanges(\n opts,\n `Apply these ${toFix.length} prose fixes?`,\n );\n\n if (!confirmed) {\n console.log(\"Cancelled. No changes made.\");\n return;\n }\n\n let fixed = 0;\n for (const fix of toFix) {\n const updates: UpdateTokenInput = {};\n (updates as Record<string, unknown>)[fix.field] = fix.new;\n await updateToken(db, fix.token.slug, updates);\n fixed++;\n }\n console.log(\n `Fixed ${fixed} fields. (Re-embed will happen automatically for changed content.)`,\n );\n },\n },\n {\n name: \"duplicates\",\n description: \"List semantic duplicates for review/merge.\",\n run: async (db, opts) => {\n const applyingFixes = shouldApplyFixes(opts);\n if (applyingFixes && !canRunInteractiveChoices(opts, \"duplicate fixes\")) {\n return;\n }\n\n const modelSetting = await getSetting(db, \"llm.embedding.model\");\n if (!modelSetting) {\n console.log(\n \"No embedding model configured. Please configure an embedding model to scan duplicates.\",\n );\n return;\n }\n\n const model = canonicalEmbeddingModelId(modelSetting);\n if (model !== modelSetting.trim().toLowerCase()) {\n console.log(\n `Using canonical embedding model \"${model}\" for configured alias \"${modelSetting}\".`,\n );\n }\n\n let coverage = await getEmbeddingCoverage(db, model);\n const initiallyIncomplete = coverage.missing + coverage.stale;\n if (initiallyIncomplete > 0) {\n if (applyingFixes) {\n console.log(\n `Embedding coverage is incomplete (${coverage.missing} missing, ${coverage.stale} stale). Attempting backfill...`,\n );\n const result = await ensureTokenEmbeddings(db, {\n limit: coverage.tokens,\n });\n coverage = await getEmbeddingCoverage(db, model);\n const remaining = coverage.missing + coverage.stale;\n if (remaining > 0) {\n console.warn(\n `Warning: Duplicate scan is incomplete: ${remaining} of ${coverage.tokens} active tokens still lack a fresh \"${model}\" embedding.${result.reason ? ` ${result.reason}` : \"\"}`,\n );\n } else {\n console.log(\n `Embedding backfill complete (${result.embedded} updated).`,\n );\n }\n } else {\n console.warn(\n `Warning: Duplicate scan is incomplete: ${initiallyIncomplete} of ${coverage.tokens} active tokens lack a fresh \"${model}\" embedding. Dry-run will not backfill them; run 'zam token reembed' first for a complete scan.`,\n );\n }\n }\n\n console.log(`Listing embedded tokens for model \"${model}\"...`);\n const embedded = await listEmbeddedTokens(db, model);\n const threshold = await resolveDedupThreshold(db);\n console.log(\n `Scanning ${embedded.length} tokens for semantic duplicates (threshold: ${threshold})...`,\n );\n\n const duplicates: Array<{ a: Token; b: Token; similarity: number }> = [];\n const seenPairs = new Set<string>();\n\n for (let i = 0; i < embedded.length; i++) {\n for (let j = i + 1; j < embedded.length; j++) {\n const sim = cosineSimilarity(\n embedded[i].embedding,\n embedded[j].embedding,\n );\n if (sim >= threshold) {\n const idA = embedded[i].token.id;\n const idB = embedded[j].token.id;\n const pairKey = idA < idB ? `${idA}:${idB}` : `${idB}:${idA}`;\n if (!seenPairs.has(pairKey)) {\n seenPairs.add(pairKey);\n duplicates.push({\n a: embedded[i].token,\n b: embedded[j].token,\n similarity: sim,\n });\n }\n }\n }\n }\n\n console.log(`Found ${duplicates.length} duplicate pairs.`);\n if (duplicates.length === 0) return;\n\n if (!applyingFixes) {\n console.log(\"\\nDuplicate pairs found (Dry run):\");\n for (const pair of duplicates) {\n console.log(\n ` - \"${pair.a.slug}\" and \"${pair.b.slug}\" (similarity: ${pair.similarity.toFixed(3)})`,\n );\n }\n console.log(\"\\nRun with --fix to resolve duplicates interactively.\");\n return;\n }\n\n const { select } = await import(\"@inquirer/prompts\");\n let deprecatedCount = 0;\n for (const pair of duplicates) {\n console.log(\n `\\nDuplicate pair found (similarity: ${pair.similarity.toFixed(3)}):`,\n );\n console.log(\n ` 1. ${pair.a.slug}: \"${pair.a.concept.substring(0, 100)}...\"`,\n );\n console.log(\n ` 2. ${pair.b.slug}: \"${pair.b.concept.substring(0, 100)}...\"`,\n );\n\n const choice = await select({\n message: \"Select action:\",\n choices: [\n { name: \"Keep both\", value: \"keep\" },\n { name: `Deprecate ${pair.a.slug}`, value: \"deprecate_a\" },\n { name: `Deprecate ${pair.b.slug}`, value: \"deprecate_b\" },\n ],\n });\n\n if (choice === \"deprecate_a\") {\n await deprecateToken(db, pair.a.slug);\n console.log(` Deprecated ${pair.a.slug}`);\n deprecatedCount++;\n } else if (choice === \"deprecate_b\") {\n await deprecateToken(db, pair.b.slug);\n console.log(` Deprecated ${pair.b.slug}`);\n deprecatedCount++;\n }\n }\n console.log(\n `\\nDuplicates scan complete. Deprecated ${deprecatedCount} token(s).`,\n );\n },\n },\n {\n name: \"domains\",\n description:\n \"Help rename/unify domains into / hierarchy (slugs untouched).\",\n run: async (db, opts) => {\n const tokens = await listTokens(db, {});\n const domains = Array.from(\n new Set(tokens.map((t) => t.domain).filter(Boolean)),\n ).sort();\n console.log(`Current domains (${domains.length}):`);\n for (const d of domains) {\n const count = tokens.filter((t) => t.domain === d).length;\n const status = d.includes(\"/\") ? \"(hierarchical)\" : \"(flat, valid)\";\n console.log(` ${d} — ${count} token(s) ${status}`);\n }\n\n if (!shouldApplyFixes(opts)) {\n console.log(\"\\nUse --fix to interactively rename/unify domains.\");\n return;\n }\n\n if (!canRunInteractiveChoices(opts, \"domain renames\")) return;\n\n const { confirm, input } = await import(\"@inquirer/prompts\");\n const changes: Array<{ oldDomain: string; newDomain: string }> = [];\n for (const d of domains) {\n const count = tokens.filter((t) => t.domain === d).length;\n const wantRename = await confirm({\n message: `Rename domain \"${d}\" (${count} tokens)?`,\n default: false,\n });\n\n if (wantRename) {\n const newDomain = await input({\n message: `Enter new domain name for \"${d}\":`,\n validate: (val) =>\n val.trim().length > 0 ? true : \"Domain name cannot be empty\",\n });\n\n const trimmed = newDomain.trim();\n if (trimmed === d) {\n console.log(\" New name matches old name. Skipped.\");\n continue;\n }\n changes.push({ oldDomain: d, newDomain: trimmed });\n }\n }\n\n if (changes.length > 0) {\n await db.transaction(async (tx) => {\n const now = new Date().toISOString();\n const stmt = tx.prepare(\n \"UPDATE tokens SET domain = ?, updated_at = ? WHERE domain = ?\",\n );\n for (const change of changes) {\n const res = await stmt.run(change.newDomain, now, change.oldDomain);\n console.log(\n ` Renamed \"${change.oldDomain}\" to \"${change.newDomain}\" for ${res.changes} token(s).`,\n );\n }\n });\n }\n console.log(\n `Domains rename complete. Renamed ${changes.length} domain(s).`,\n );\n },\n },\n {\n name: \"contexts\",\n description:\n \"Backfill contexts on old/unassigned tokens using heuristic rules.\",\n run: async (db, opts) => {\n const tokensWithoutContext = (await db\n .prepare(\n `SELECT t.* FROM tokens t\n WHERE NOT EXISTS (\n SELECT 1 FROM token_contexts tc WHERE tc.token_id = t.id\n )`,\n )\n .all()) as Token[];\n\n const allContexts = await listKnowledgeContexts(db);\n const contexts = opts.knowledgeContext\n ? allContexts.filter(\n (context) => context.name === opts.knowledgeContext,\n )\n : allContexts;\n if (opts.knowledgeContext && contexts.length === 0) {\n throw new Error(\n `Knowledge context not found: ${opts.knowledgeContext}`,\n );\n }\n if (contexts.length === 0) {\n if (opts.json) {\n console.log(\n JSON.stringify({\n success: false,\n error: \"No knowledge contexts defined.\",\n }),\n );\n } else {\n console.log(\n \"No knowledge contexts defined. Run `zam kc create` first.\",\n );\n }\n return;\n }\n\n const proposals: Array<{\n token: Token;\n context: KnowledgeContext;\n highConfidence: boolean;\n }> = [];\n\n for (const t of tokensWithoutContext) {\n const domain = (t.domain || \"\").toLowerCase();\n const slug = t.slug.toLowerCase();\n const title = (t.title || \"\").toLowerCase();\n const source = (t.source_link || \"\").toLowerCase();\n const establishedLanguage = inferEstablishedLanguage(t);\n const languageMatches = establishedLanguage\n ? contexts.filter(\n (context) =>\n primaryLanguage(context.language) === establishedLanguage,\n )\n : [];\n\n for (const ctx of contexts) {\n const ctxName = ctx.name.toLowerCase();\n const ctxLabel = (ctx.label || \"\").toLowerCase();\n\n let match = false;\n let highConfidence = false;\n\n // Rule 1: Domain matching context name or label\n if (domain) {\n if (domain === ctxName) {\n match = true;\n highConfidence = true;\n } else if (ctxName.includes(domain) || domain.includes(ctxName)) {\n match = true;\n highConfidence = domain.length >= 2;\n } else if (\n ctxLabel &&\n (ctxLabel.includes(domain) || domain.includes(ctxLabel))\n ) {\n match = true;\n highConfidence = domain.length >= 2;\n }\n }\n\n // Rule 2: Substring matches in slug/title\n if (slug.includes(ctxName) || title.includes(ctxName)) {\n match = true;\n }\n\n // Rule 3: Word-by-word matches on label words\n if (ctxLabel) {\n const labelWords = ctxLabel\n .split(/\\s+/)\n .filter((w) => w.length > 3);\n for (const word of labelWords) {\n if (\n domain.includes(word) ||\n slug.includes(word) ||\n title.includes(word)\n ) {\n match = true;\n }\n }\n }\n\n // Rule 4: Source references may explicitly name their owning world.\n if (\n source &&\n (source.includes(ctxName) ||\n ctxLabel\n .split(/\\s+/)\n .filter((word) => word.length > 3)\n .some((word) => source.includes(word)))\n ) {\n match = true;\n highConfidence = true;\n }\n\n // Rule 5: Established content language is a weak signal, and only\n // useful when exactly one available context declares that language.\n if (\n languageMatches.length === 1 &&\n languageMatches[0].id === ctx.id\n ) {\n match = true;\n }\n\n if (match) {\n proposals.push({\n token: t,\n context: ctx,\n highConfidence,\n });\n }\n }\n }\n\n const applying = shouldApplyFixes(opts);\n\n if (opts.json) {\n if (!applying) {\n const formatted = proposals.map((p) => ({\n tokenSlug: p.token.slug,\n contextName: p.context.name,\n highConfidence: p.highConfidence,\n }));\n console.log(\n JSON.stringify({\n success: true,\n task: \"contexts\",\n proposals: formatted,\n totalUnassigned: tokensWithoutContext.length,\n }),\n );\n return;\n }\n } else {\n console.log(\n `Found ${proposals.length} proposed context assignments for ${tokensWithoutContext.length} unassigned tokens.`,\n );\n }\n if (proposals.length === 0) {\n if (opts.json && applying) {\n console.log(\n JSON.stringify({\n success: true,\n task: \"contexts\",\n applied: [],\n totalApplied: 0,\n }),\n );\n }\n return;\n }\n\n if (!applying) {\n console.log(\"\\nProposed context assignments (Dry run):\");\n for (const prop of proposals) {\n const confStr = prop.highConfidence ? \" [High Confidence]\" : \"\";\n console.log(\n ` - Assign token \"${prop.token.slug}\" to context \"${prop.context.name}\"${confStr}`,\n );\n }\n console.log(\"\\nRun with --fix to apply these assignments.\");\n return;\n }\n\n if (opts.yes) {\n let applied = 0;\n const appliedProposals = [];\n for (const prop of proposals) {\n if (prop.highConfidence) {\n await assignTokenToContext(db, prop.token.id, prop.context.id);\n if (!opts.json) {\n console.log(\n `Auto-assigned: \"${prop.token.slug}\" -> context \"${prop.context.name}\"`,\n );\n }\n appliedProposals.push({\n tokenSlug: prop.token.slug,\n contextName: prop.context.name,\n });\n applied++;\n }\n }\n if (opts.json) {\n console.log(\n JSON.stringify({\n success: true,\n task: \"contexts\",\n applied: appliedProposals,\n totalApplied: applied,\n }),\n );\n } else {\n console.log(`Auto-assigned ${applied} high-confidence contexts.`);\n }\n return;\n }\n\n const { confirm } = await import(\"@inquirer/prompts\");\n let assignedCount = 0;\n for (const prop of proposals) {\n const confStr = prop.highConfidence ? \" (high confidence)\" : \"\";\n const ans = await confirm({\n message: `Assign token \"${prop.token.slug}\" to context \"${prop.context.name}\"${confStr}?`,\n default: prop.highConfidence,\n });\n if (ans) {\n await assignTokenToContext(db, prop.token.id, prop.context.id);\n console.log(\n `Assigned \"${prop.token.slug}\" -> context \"${prop.context.name}\"`,\n );\n assignedCount++;\n }\n }\n console.log(\n `Completed contexts backfill. Assigned ${assignedCount} tokens.`,\n );\n },\n },\n];\n\nexport function parseDoctorTimeout(value: string): number {\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(\"--timeout must be a positive integer in milliseconds\");\n }\n return parsed;\n}\n\nexport const doctorCommand = new Command(\"doctor\")\n .description(\n \"Diagnose and repair the knowledge base (titles, legacy data, duplicates, domains).\",\n )\n .option(\"--fix\", \"Apply changes (default is dry-run)\")\n .option(\"--dry-run\", \"Explicit dry run (default)\")\n .option(\n \"--yes\",\n \"Auto-confirm deterministic title/text fixes (duplicate/domain choices remain interactive)\",\n )\n .option(\"--no-llm\", \"Skip LLM calls, use heuristic fallback only\")\n .option(\n \"--timeout <ms>\",\n \"LLM timeout in ms per call (default: 20000)\",\n \"20000\",\n )\n .option(\n \"--knowledge-context <context>\",\n \"Knowledge context to limit/guide doctor task\",\n )\n .option(\"--json\", \"Emit report in JSON format\")\n .argument(\n \"[task]\",\n \"Specific task: titles, texts, duplicates, domains, contexts\",\n )\n .action(async (taskName, opts) => {\n await withDb(async (db) => {\n const fix = !!opts.fix;\n const dryRun = !fix || !!opts.dryRun;\n const yes = !!opts.yes;\n const noLlm = opts.llm === false;\n const timeoutMs = parseDoctorTimeout(opts.timeout);\n const knowledgeContext = opts.knowledgeContext;\n const json = !!opts.json;\n\n if (!taskName) {\n const diagnosisOptions: DoctorOptions = {\n fix: false,\n dryRun: true,\n yes: false,\n noLlm: true,\n timeoutMs,\n knowledgeContext,\n json: false,\n };\n if (json) {\n const reports = [];\n for (const task of doctorTasks) {\n const report = await captureDoctorTaskOutput(\n task,\n db,\n diagnosisOptions,\n );\n reports.push({\n name: task.name,\n description: task.description,\n ...report,\n });\n }\n const success = reports.every((report) => !report.error);\n console.log(\n JSON.stringify({ success, readOnly: true, tasks: reports }),\n );\n if (!success) process.exitCode = 1;\n } else {\n console.log(\"ZAM doctor read-only diagnosis (LLM disabled):\");\n for (const task of doctorTasks) {\n console.log(`\\n[${task.name}] ${task.description}`);\n await task.run(db, diagnosisOptions);\n }\n }\n return;\n }\n\n const task = doctorTasks.find((t) => t.name === taskName);\n if (!task) {\n if (json) {\n console.log(\n JSON.stringify({\n success: false,\n error: `Unknown task: ${taskName}`,\n }),\n );\n } else {\n console.error(`Unknown task: ${taskName}`);\n }\n process.exit(1);\n }\n\n if (!json) {\n console.log(\n `Running doctor task: ${task.name} (fix=${fix}, dryRun=${dryRun}${noLlm ? \", noLlm=true\" : \"\"})`,\n );\n }\n const taskOptions: DoctorOptions = {\n fix,\n dryRun,\n yes,\n noLlm,\n timeoutMs,\n knowledgeContext,\n json,\n };\n if (json && fix && !yes) {\n console.log(\n JSON.stringify({\n success: false,\n error:\n \"--json --fix requires --yes; interactive prompts are not machine-readable\",\n }),\n );\n process.exitCode = 1;\n return;\n }\n if (\n json &&\n fix &&\n yes &&\n (task.name === \"duplicates\" || task.name === \"domains\")\n ) {\n console.log(\n JSON.stringify({\n success: false,\n error: `${task.name} fixes require interactive choices and cannot use --json --yes`,\n }),\n );\n process.exitCode = 1;\n return;\n }\n if (json) {\n const report = await captureDoctorTaskOutput(task, db, taskOptions);\n let payload: Record<string, unknown> = {\n success: report.error === undefined,\n task: task.name,\n ...report,\n };\n if (\n task.name === \"contexts\" &&\n !report.error &&\n report.lines.length === 1\n ) {\n try {\n payload = JSON.parse(report.lines[0]) as Record<string, unknown>;\n } catch {\n // Fall back to the generic captured report.\n }\n }\n console.log(JSON.stringify(payload));\n if (report.error || payload.success === false) {\n process.exitCode = 1;\n }\n return;\n }\n await task.run(db, taskOptions);\n });\n });\n","/**\n * `zam git-sync` — Git integration subcommand.\n *\n * Automatically marks cards as stale/due when their source files change in git.\n */\n\nimport { execSync } from \"node:child_process\";\nimport { chmodSync, existsSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { Command } from \"commander\";\nimport type { Token } from \"../../kernel/index.js\";\nimport { getCard, matchesFilePath } from \"../../kernel/index.js\";\nimport { resolveUser } from \"../users/identity.js\";\nimport { withDb } from \"./shared/db.js\";\n\n/**\n * Installs the Git post-commit hook.\n */\nfunction installHook(): void {\n const gitDir = join(process.cwd(), \".git\");\n if (!existsSync(gitDir)) {\n console.error(\n \"Error: Current directory is not the root of a Git repository.\",\n );\n process.exit(1);\n }\n\n const hooksDir = join(gitDir, \"hooks\");\n const hookPath = join(hooksDir, \"post-commit\");\n\n const hookContent = `#!/bin/sh\n# ZAM Spaced Repetition Auto-Stale Hook\n# Triggered automatically on git commits to decay modified concept cards.\nzam git-sync --commit HEAD --quiet\n`;\n\n try {\n writeFileSync(hookPath, hookContent, { encoding: \"utf-8\", flag: \"w\" });\n try {\n chmodSync(hookPath, \"755\");\n } catch (_e) {\n // Best-effort chmod (Windows might ignore/fail, which is fine)\n }\n console.log(\n \"Successfully installed ZAM post-commit hook at .git/hooks/post-commit\",\n );\n } catch (err) {\n console.error(\"Failed to write post-commit hook:\", (err as Error).message);\n process.exit(1);\n }\n}\n\nexport const gitSyncCommand = new Command(\"git-sync\")\n .description(\"Sync learning cards with recent Git file modifications\")\n .option(\"--commit <hash>\", \"Git commit hash to check\", \"HEAD\")\n .option(\"--user <id>\", \"User ID (default: whoami)\")\n .option(\"--install\", \"Install git post-commit hook in current repo\")\n .option(\"--quiet\", \"Suppress verbose output\")\n .action(async (opts) => {\n if (opts.install) {\n installHook();\n return;\n }\n\n await withDb(async (db) => {\n const userId = await resolveUser(opts, db);\n\n let changedFiles: string[] = [];\n try {\n const output = execSync(\n `git diff-tree --no-commit-id --name-only -r ${opts.commit}`,\n {\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n },\n );\n changedFiles = output\n .split(/\\r?\\n/)\n .map((f) => f.trim())\n .filter(Boolean);\n } catch (_err) {\n if (!opts.quiet) {\n console.warn(\n \"Notice: Failed to read git modifications. Ensure you are in a Git repo and commit hash is valid.\",\n );\n }\n return;\n }\n\n if (changedFiles.length === 0) {\n if (!opts.quiet) {\n console.log(\"No file changes detected in commit.\");\n }\n return;\n }\n\n // Fetch active tokens\n const tokens = (await db\n .prepare(`\n SELECT * FROM tokens\n WHERE source_link IS NOT NULL\n AND deprecated_at IS NULL\n `)\n .all()) as Token[];\n\n const matchedTokens: Token[] = [];\n\n for (const token of tokens) {\n const matches = changedFiles.some((cf) =>\n matchesFilePath(token.source_link, cf),\n );\n if (matches) {\n matchedTokens.push(token);\n }\n }\n\n if (matchedTokens.length === 0) {\n if (!opts.quiet) {\n console.log(\n `Scanned ${changedFiles.length} file(s), no associated learning tokens found.`,\n );\n }\n return;\n }\n\n let decayedCount = 0;\n const now = new Date().toISOString();\n\n for (const token of matchedTokens) {\n const card = await getCard(db, token.id, userId);\n if (card) {\n // Decay stability to a quarter (concept's source changed → likely stale),\n // with a 0.2-day floor so the card surfaces for review soon. Using max,\n // not min: min would collapse every card to <=0.2 regardless of prior strength.\n const newStability = Math.max(0.2, card.stability / 4.0);\n\n await db\n .prepare(`\n UPDATE cards\n SET due_at = ?,\n stability = ?,\n state = CASE WHEN state = 'new' THEN 'new' ELSE 'review' END,\n elapsed_days = 0.0,\n scheduled_days = 0.0\n WHERE id = ?\n `)\n .run(now, newStability, card.id);\n\n decayedCount++;\n if (!opts.quiet) {\n console.log(\n ` Decayed card for: ${token.slug} (Source: ${token.source_link})`,\n );\n }\n }\n }\n\n if (!opts.quiet) {\n console.log(\n `\\nZAM Auto-Stale Complete: Scanned ${changedFiles.length} file(s).`,\n );\n console.log(\n `Successfully decayed FSRS stability and scheduled reviews for ${decayedCount} concept(s).`,\n );\n }\n });\n });\n","/**\n * `zam goal` — Goal management subcommand group.\n *\n * Goals are markdown files in the personal repo's goals/ directory.\n * The directory is configured via the `personal.goals_dir` setting,\n * or defaults to `./goals` relative to the current working directory.\n */\n\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { input } from \"@inquirer/prompts\";\nimport { Command } from \"commander\";\nimport type { GoalStatus } from \"../../kernel/index.js\";\nimport {\n createGoal,\n extractTasks,\n extractTokenRefs,\n getGoal,\n getGoalTree,\n getSetting,\n listGoals,\n openDatabase,\n updateGoalStatus,\n} from \"../../kernel/index.js\";\n\nasync function resolveGoalsDir(): Promise<string> {\n let goalsDir: string | undefined;\n\n let db: Awaited<ReturnType<typeof openDatabase>> | undefined;\n try {\n db = await openDatabase();\n goalsDir = await getSetting(db, \"personal.goals_dir\");\n } catch {\n // DB not available — fall back to default\n } finally {\n await db?.close();\n }\n\n return goalsDir ? resolve(goalsDir) : resolve(\"goals\");\n}\n\nexport const goalCommand = new Command(\"goal\").description(\n \"Manage learning goals (markdown files)\",\n);\n\n// ── zam goal list ────────────────────────────────────────────────────────────\n\ngoalCommand\n .command(\"list\")\n .description(\"List all goals\")\n .option(\n \"--status <status>\",\n \"Filter by status (active, completed, paused, abandoned)\",\n )\n .option(\"--tree\", \"Show goals as a tree with parent/child relationships\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (opts) => {\n const goalsDir = await resolveGoalsDir();\n\n if (!existsSync(goalsDir)) {\n console.error(`Goals directory not found: ${goalsDir}`);\n console.error(\n \"Set it with: zam settings set personal.goals_dir /path/to/goals\",\n );\n process.exit(1);\n }\n\n if (opts.tree) {\n const tree = getGoalTree(goalsDir);\n const filtered = opts.status\n ? tree.filter((g) => g.status === opts.status)\n : tree;\n\n if (opts.json) {\n console.log(JSON.stringify(filtered, null, 2));\n return;\n }\n\n if (filtered.length === 0) {\n console.log(\"No goals found.\");\n return;\n }\n\n for (const root of filtered) {\n printGoalLine(root, 0);\n for (const child of root.children) {\n printGoalLine(child, 1);\n }\n }\n return;\n }\n\n let goals = listGoals(goalsDir);\n\n if (opts.status) {\n goals = goals.filter((g) => g.status === opts.status);\n }\n\n if (opts.json) {\n console.log(JSON.stringify(goals, null, 2));\n return;\n }\n\n if (goals.length === 0) {\n console.log(\"No goals found.\");\n return;\n }\n\n console.log(\"Goals:\");\n console.log(` ${\"─\".repeat(70)}`);\n for (const g of goals) {\n printGoalLine(g, 0);\n }\n });\n\nfunction printGoalLine(\n g: {\n slug: string;\n title: string;\n status: string;\n taskCount: number;\n tasksDone: number;\n },\n indent: number,\n): void {\n const prefix = \" \".repeat(indent + 1);\n const statusIcon: Record<string, string> = {\n active: \"[*]\",\n paused: \"[-]\",\n completed: \"[x]\",\n abandoned: \"[ ]\",\n };\n const icon = statusIcon[g.status] || \"[ ]\";\n const tasks = g.taskCount > 0 ? ` (${g.tasksDone}/${g.taskCount} tasks)` : \"\";\n console.log(`${prefix}${icon} ${g.title}${tasks} — ${g.slug}`);\n}\n\n// ── zam goal show ────────────────────────────────────────────────────────────\n\ngoalCommand\n .command(\"show <slug>\")\n .description(\"Show a goal's details\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (slug, opts) => {\n const goalsDir = await resolveGoalsDir();\n const goal = getGoal(goalsDir, slug);\n\n if (!goal) {\n console.error(`Goal not found: ${slug}`);\n process.exit(1);\n }\n\n if (opts.json) {\n const tasks = extractTasks(goal.body);\n const tokens = extractTokenRefs(goal.body);\n console.log(JSON.stringify({ ...goal, tasks, tokens }, null, 2));\n return;\n }\n\n console.log(`Title: ${goal.title}`);\n console.log(`Slug: ${goal.slug}`);\n console.log(`Status: ${goal.status}`);\n if (goal.parent) console.log(`Parent: ${goal.parent}`);\n console.log(`Created: ${goal.created}`);\n console.log(`Updated: ${goal.updated}`);\n\n const tasks = extractTasks(goal.body);\n if (tasks.length > 0) {\n console.log(\n `\\nTasks (${tasks.filter((t) => t.done).length}/${tasks.length}):`,\n );\n for (const t of tasks) {\n console.log(` [${t.done ? \"x\" : \" \"}] ${t.text}`);\n }\n }\n\n const tokens = extractTokenRefs(goal.body);\n if (tokens.length > 0) {\n console.log(`\\nTokens:`);\n for (const ref of tokens) {\n console.log(` - ${ref}`);\n }\n }\n\n if (goal.body) {\n console.log(`\\n${\"─\".repeat(50)}`);\n console.log(goal.body);\n }\n });\n\n// ── zam goal create ──────────────────────────────────────────────────────────\n\ngoalCommand\n .command(\"create\")\n .description(\"Create a new goal\")\n .option(\"--slug <slug>\", \"Goal slug (used as filename)\")\n .option(\"--title <title>\", \"Goal title\")\n .option(\"--parent <slug>\", \"Parent goal slug\")\n .option(\"--description <text>\", \"Goal description\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (opts) => {\n const goalsDir = await resolveGoalsDir();\n\n if (!existsSync(goalsDir)) {\n mkdirSync(goalsDir, { recursive: true });\n }\n\n let slug = opts.slug;\n let title = opts.title;\n const parent = opts.parent;\n const description = opts.description;\n\n // Interactive mode if slug or title not provided\n if (!slug || !title) {\n try {\n if (!title) {\n title = await input({ message: \"Goal title:\" });\n }\n if (!slug) {\n const suggested = title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n slug = await input({\n message: \"Goal slug (filename):\",\n default: suggested,\n });\n }\n } catch (err) {\n if ((err as Error).name === \"ExitPromptError\") {\n console.log(\"\\nCancelled.\");\n process.exit(0);\n }\n throw err;\n }\n }\n\n const goal = createGoal(goalsDir, { slug, title, parent, description });\n\n if (opts.json) {\n console.log(JSON.stringify(goal, null, 2));\n return;\n }\n\n console.log(`Goal created: ${goal.slug}`);\n console.log(` Title: ${goal.title}`);\n console.log(` Status: ${goal.status}`);\n console.log(` File: ${goal.filePath}`);\n });\n\n// ── zam goal status ──────────────────────────────────────────────────────────\n\ngoalCommand\n .command(\"status <slug> <status>\")\n .description(\"Update a goal's status (active, paused, completed, abandoned)\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (slug, status, opts) => {\n const validStatuses: GoalStatus[] = [\n \"active\",\n \"completed\",\n \"paused\",\n \"abandoned\",\n ];\n if (!validStatuses.includes(status)) {\n console.error(\n `Invalid status: ${status}. Must be one of: ${validStatuses.join(\", \")}`,\n );\n process.exit(1);\n }\n\n const goalsDir = await resolveGoalsDir();\n const goal = updateGoalStatus(goalsDir, slug, status);\n\n if (opts.json) {\n console.log(JSON.stringify(goal, null, 2));\n return;\n }\n\n console.log(`Goal ${slug} updated to: ${status}`);\n });\n","/**\n * `zam init` — Guided interactive onboarding wizard.\n *\n * Bootstraps a fresh ZAM installation:\n * 1. Initializes a zero-dependency \"Local Sandbox\" workspace.\n * 2. Runs hardware profiling to detect NPUs/CPUs.\n * 3. Installs and configures the hardware-optimized local LLM runtime (flm or Ollama).\n * 4. Automatically distributes global agent skill files and hooks.\n * 5. Sets up the local database and configuration.\n */\n\nimport { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport { confirm, input } from \"@inquirer/prompts\";\nimport { Command } from \"commander\";\nimport {\n deleteSetting,\n detectSystemLocale,\n distributeGlobalSkills,\n getSystemProfile,\n injectShellHooks,\n installFastFlowLM,\n installOllama,\n openDatabaseWithSync,\n prepareLocalModel,\n setActiveWorkspaceId,\n setSetting,\n upsertConfiguredWorkspace,\n} from \"../../kernel/index.js\";\nimport { parseSetupAgents, wireSkills } from \"../provisioning/index.js\";\n\nconst HOME = homedir();\n\n/**\n * Helper to print thick borders.\n */\nfunction printLine(char = \"═\", len = 60, color = \"\\x1b[36m\") {\n console.log(`${color}${char.repeat(len)}\\x1b[0m`);\n}\n\n/**\n * Bootstrap the default \"Local Sandbox\" workspace structure.\n */\nfunction bootstrapSandboxWorkspace(workspaceDir: string) {\n mkdirSync(join(workspaceDir, \"beliefs\"), { recursive: true });\n mkdirSync(join(workspaceDir, \"goals\"), { recursive: true });\n mkdirSync(join(workspaceDir, \"skills\"), { recursive: true });\n\n const worldviewFile = join(workspaceDir, \"beliefs\", \"worldview.md\");\n if (!existsSync(worldviewFile)) {\n writeFileSync(\n worldviewFile,\n `# Personal Worldview\n\nHere, I declare the core concepts and principles I want to master.\n\n- **Conceptual Autonomy**: I value deep conceptual understanding over copy-pasting rote procedures.\n- **Continuous Retention**: I use spaced repetition to prevent my professional skills from decaying.\n`,\n \"utf8\",\n );\n }\n\n const goalsFile = join(workspaceDir, \"goals\", \"goals.md\");\n if (!existsSync(goalsFile)) {\n writeFileSync(\n goalsFile,\n `# Personal Goals\n\n- **[ ] Learn Spaced Repetition Core Concepts**\n - #fsrs-stability\n - #fsrs-difficulty\n`,\n \"utf8\",\n );\n }\n}\n\nexport const initCommand = new Command(\"init\")\n .description(\"Launch the guided interactive onboarding wizard\")\n .action(async () => {\n printLine();\n console.log(\n \"\\x1b[1m\\x1b[32m ZAM — The Symbiotic Learning Agent Onboarding\\x1b[0m\",\n );\n console.log(\n \"\\x1b[2m Welcome! ZAM helps you build conceptual skills while you work.\\x1b[0m\",\n );\n printLine();\n\n // ── STEP 1: Workspace Selection ──────────────────────────────────────────\n console.log(\"\\n\\x1b[1m[1/5] Setting up Local Workspace Sandbox\\x1b[0m\");\n const defaultWorkspace = join(HOME, \"Documents\", \"zam\");\n\n const workspacePath = resolve(\n await input({\n message: \"Choose your ZAM workspace directory:\",\n default: defaultWorkspace,\n }),\n );\n\n try {\n bootstrapSandboxWorkspace(workspacePath);\n wireSkills(workspacePath, parseSetupAgents());\n upsertConfiguredWorkspace({\n id: \"personal\",\n label: \"Personal\",\n kind: \"personal\",\n path: workspacePath,\n });\n setActiveWorkspaceId(\"personal\");\n console.log(\n `\\x1b[32m✓ Local Sandbox created at: ${workspacePath}\\x1b[0m`,\n );\n } catch (err) {\n console.error(\n `\\x1b[31m✗ Failed to create workspace: ${(err as Error).message}\\x1b[0m`,\n );\n process.exit(1);\n }\n\n // ── STEP 2: Hardware Auto-Detection ──────────────────────────────────────\n console.log(\"\\n\\x1b[1m[2/5] Running Hardware Profiling...\\x1b[0m\");\n const profile = getSystemProfile();\n\n console.log(` OS Detected: \\x1b[36m${profile.os}\\x1b[0m`);\n console.log(` CPU Architecture: \\x1b[36m${profile.arch}\\x1b[0m`);\n if (profile.hasRyzenNPU) {\n console.log(\n \" NPU Detected: \\x1b[32mAMD Ryzen AI NPU detected! (Optimum Setup)\\x1b[0m\",\n );\n } else if (profile.hasAppleSilicon) {\n console.log(\n \" CPU Brand: \\x1b[32mmacOS Apple Silicon detected! (Optimum Setup)\\x1b[0m\",\n );\n } else {\n console.log(\" Hardware: \\x1b[33mStandard CPU detected.\\x1b[0m\");\n }\n\n const runnerLabel =\n profile.recommendedRunner === \"fastflowlm\"\n ? \"FastFlowLM (NPU Optimized)\"\n : \"Ollama\";\n console.log(\n `\\n \\x1b[1mRecommendation:\\x1b[0m ZAM suggests installing \\x1b[32m${runnerLabel}\\x1b[0m with \\x1b[36m${profile.recommendedModel}\\x1b[0m.`,\n );\n\n // ── STEP 3: Local LLM Runner Installation ───────────────────────────────\n console.log(\"\\n\\x1b[1m[3/5] Setting up Local LLM Runner\\x1b[0m\");\n const proceedInstall = await confirm({\n message: `Would you like ZAM to install and configure ${runnerLabel} automatically?`,\n default: true,\n });\n\n let llmReady = false;\n if (proceedInstall) {\n let result: ReturnType<typeof installFastFlowLM> | undefined;\n if (profile.recommendedRunner === \"fastflowlm\") {\n result = installFastFlowLM();\n } else {\n result = installOllama();\n }\n\n if (result.success) {\n console.log(`\\x1b[32m✓ ${result.message}\\x1b[0m`);\n const modelResult = prepareLocalModel(\n profile.recommendedRunner,\n profile.recommendedModel,\n );\n if (modelResult.success) {\n console.log(`\\x1b[32m✓ ${modelResult.message}\\x1b[0m`);\n llmReady = true;\n } else {\n console.warn(\n `\\x1b[33m⚠ Model setup incomplete: ${modelResult.message}\\x1b[0m`,\n );\n }\n } else {\n console.warn(`\\x1b[33m⚠ Installation failed: ${result.message}\\x1b[0m`);\n console.log(\n \"You can install it manually or continue with offline templates.\",\n );\n }\n }\n\n // ── STEP 4: Initialize Database & Write Local Settings ─────────────────\n console.log(\"\\n\\x1b[1m[4/5] Bootstrapping database & settings...\\x1b[0m\");\n let db: Awaited<ReturnType<typeof openDatabaseWithSync>> | undefined;\n try {\n db = await openDatabaseWithSync({ initialize: true });\n\n // Workspace selection is stored in machine-local config; clear the legacy\n // DB setting so future runs do not migrate stale paths back in.\n await deleteSetting(db, \"personal.workspace_dir\");\n\n // Auto-detect and save system locale\n const detectedLocale = detectSystemLocale();\n await setSetting(db, \"system.locale\", detectedLocale);\n console.log(\n `\\x1b[32m✓ Detected and set system language to: ${detectedLocale}\\x1b[0m`,\n );\n\n if (llmReady) {\n await setSetting(db, \"llm.enabled\", \"true\");\n if (profile.recommendedRunner === \"fastflowlm\") {\n await setSetting(db, \"llm.url\", \"http://localhost:8000/v1\");\n } else {\n await setSetting(db, \"llm.url\", \"http://localhost:11434/v1\");\n }\n await setSetting(db, \"llm.model\", profile.recommendedModel);\n console.log(\n \"\\x1b[32m✓ Configured LLM runner settings in database.\\x1b[0m\",\n );\n } else {\n await setSetting(db, \"llm.enabled\", \"false\");\n }\n await db.close();\n console.log(\"\\x1b[32m✓ Database initialized successfully.\\x1b[0m\");\n } catch (err) {\n console.error(\n `\\x1b[31m✗ Database setup failed: ${(err as Error).message}\\x1b[0m`,\n );\n await db?.close();\n }\n\n // ── STEP 5: Distribute Agent Skills & Helpers ────────────────────────────\n console.log(\n \"\\n\\x1b[1m[5/5] Wiring Developer Agents & Terminal Helpers\\x1b[0m\",\n );\n const proceedHooks = await confirm({\n message:\n \"Distribute ZAM skills and install optional monitored-session shell helpers?\",\n default: true,\n });\n\n if (proceedHooks) {\n console.log(\"Copying SKILL.md into global agent directories...\");\n const skillResults = distributeGlobalSkills();\n for (const res of skillResults) {\n if (res.success) {\n console.log(` \\x1b[32m✓ Installed ZAM Skill in ${res.name}\\x1b[0m`);\n } else {\n console.log(` \\x1b[31m✗ Failed to install in ${res.name}\\x1b[0m`);\n }\n }\n\n console.log(\"Installing monitored-session helpers in shell profiles...\");\n const hookResults = injectShellHooks();\n for (const res of hookResults) {\n if (res.success) {\n const action = res.alreadyHooked\n ? \"already up-to-date\"\n : \"installed successfully\";\n console.log(` \\x1b[32m✓ ${res.shell} helper: ${action}\\x1b[0m`);\n } else {\n console.log(\n ` \\x1b[31m✗ Failed to install helper in ${res.shell} (${res.file})\\x1b[0m`,\n );\n }\n }\n console.log(\n \" Start monitoring with zam-monitor-session <id> (bash/zsh) or Start-ZamMonitor <id> (PowerShell).\",\n );\n }\n\n printLine();\n console.log(\n \"\\x1b[1m\\x1b[32m Congratulations! ZAM Onboarding Complete!\\x1b[0m\",\n );\n console.log(\n \"\\x1b[1m You are now ready to start your symbiotic learning journey.\\x1b[0m\",\n );\n console.log(\"\\n \\x1b[1mUseful commands to get started:\\x1b[0m\");\n console.log(\n \" \\x1b[36mzam stats\\x1b[0m — Display your learning queue stats\",\n );\n console.log(\n \" \\x1b[36mzam learn\\x1b[0m — Start a standalone learning session\",\n );\n console.log(\n \" \\x1b[36mzam workspace publish\\x1b[0m — Publish your workspace sandbox to GitHub\",\n );\n printLine();\n });\n","/**\n * `zam knowledge-context` — Spaced-repetition knowledge context subcommand group.\n */\n\nimport { Command } from \"commander\";\nimport {\n assignTokenToContext,\n createKnowledgeContext,\n deleteKnowledgeContext,\n getActiveWorkspaceContext,\n getKnowledgeContextByName,\n getTokenBySlug,\n listKnowledgeContexts,\n setActiveWorkspaceContext,\n unassignTokenFromContext,\n} from \"../../kernel/index.js\";\nimport { jsonOut, withDb } from \"./shared/db.js\";\n\nexport const knowledgeContextCommand = new Command(\"knowledge-context\")\n .alias(\"kc\")\n .description(\"Manage knowledge contexts (work, school, private)\");\n\nfunction commandError(message: string, json: boolean): never {\n if (json) {\n jsonOut({ success: false, error: message });\n } else {\n console.error(message);\n }\n process.exit(1);\n}\n\n// ── zam knowledge-context list ───────────────────────────────────────────\n\nknowledgeContextCommand\n .command(\"list\")\n .description(\"List all knowledge contexts\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const contexts = await listKnowledgeContexts(db);\n\n if (opts.json) {\n jsonOut(contexts);\n return;\n }\n\n if (contexts.length === 0) {\n console.log(\"No knowledge contexts registered yet.\");\n return;\n }\n\n console.log(`Knowledge Contexts (${contexts.length})`);\n console.log(\"─\".repeat(60));\n for (const c of contexts) {\n const lang = c.language ? ` (${c.language})` : \"\";\n const label = c.label ? ` - ${c.label}` : \"\";\n console.log(` ${c.name.padEnd(20)}${label}${lang}`);\n }\n });\n });\n\n// ── zam knowledge-context create ─────────────────────────────────────────\n\nknowledgeContextCommand\n .command(\"create\")\n .description(\"Create a new knowledge context\")\n .requiredOption(\n \"--name <name>\",\n \"Unique context identifier (e.g. work-company)\",\n )\n .option(\"--label <label>\", \"Display name\")\n .option(\n \"--language <language>\",\n \"Default language (BCP-47 code, e.g. en, de)\",\n )\n .option(\"--json\", \"Output as JSON\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const context = await createKnowledgeContext(db, {\n name: opts.name,\n label: opts.label || null,\n language: opts.language || null,\n });\n\n if (opts.json) {\n jsonOut({ success: true, context });\n return;\n }\n\n console.log(`Created knowledge context: ${context.name}`);\n if (context.label) console.log(` Label: ${context.label}`);\n if (context.language) console.log(` Language: ${context.language}`);\n });\n });\n\n// ── zam knowledge-context delete ─────────────────────────────────────────\n\nknowledgeContextCommand\n .command(\"delete\")\n .description(\"Delete a knowledge context\")\n .requiredOption(\"--name <name>\", \"Context name\")\n .option(\n \"--confirm\",\n \"Confirm removal of the context and its token assignments\",\n )\n .option(\"--json\", \"Output as JSON\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const context = await getKnowledgeContextByName(db, opts.name);\n if (!context) {\n commandError(`Knowledge context not found: ${opts.name}`, !!opts.json);\n }\n\n const assignmentCount = (\n (await db\n .prepare(\n \"SELECT COUNT(*) AS n FROM token_contexts WHERE context_id = ?\",\n )\n .get(context.id)) as { n: number }\n ).n;\n\n if (!opts.confirm) {\n if (opts.json) {\n jsonOut({\n success: true,\n preview: true,\n requiresConfirmation: true,\n name: context.name,\n tokenAssignments: assignmentCount,\n });\n } else {\n console.log(\n `Deleting \"${context.name}\" removes ${assignmentCount} token assignment(s). Re-run with --confirm.`,\n );\n }\n return;\n }\n\n await deleteKnowledgeContext(db, context.id);\n if (getActiveWorkspaceContext() === context.name) {\n setActiveWorkspaceContext(undefined);\n }\n\n if (opts.json) {\n jsonOut({\n success: true,\n name: context.name,\n tokenAssignmentsRemoved: assignmentCount,\n });\n return;\n }\n\n console.log(`Deleted knowledge context: ${context.name}`);\n });\n });\n\n// ── zam knowledge-context assign ─────────────────────────────────────────\n\nknowledgeContextCommand\n .command(\"assign\")\n .description(\"Assign a token to a knowledge context\")\n .requiredOption(\"--token <slug>\", \"Token slug\")\n .requiredOption(\"--context <name>\", \"Context name\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const context = await getKnowledgeContextByName(db, opts.context);\n if (!context) {\n commandError(\n `Knowledge context not found: ${opts.context}`,\n !!opts.json,\n );\n }\n\n const token = await getTokenBySlug(db, opts.token);\n if (!token) {\n commandError(`Token not found: ${opts.token}`, !!opts.json);\n }\n\n await assignTokenToContext(db, token.id, context.id);\n\n if (opts.json) {\n jsonOut({ success: true, token: token.slug, context: context.name });\n return;\n }\n\n console.log(\n `Assigned token \"${token.slug}\" to context \"${context.name}\"`,\n );\n });\n });\n\n// ── zam knowledge-context unassign ───────────────────────────────────────\n\nknowledgeContextCommand\n .command(\"unassign\")\n .description(\"Remove a token from a knowledge context\")\n .requiredOption(\"--token <slug>\", \"Token slug\")\n .requiredOption(\"--context <name>\", \"Context name\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const context = await getKnowledgeContextByName(db, opts.context);\n if (!context) {\n commandError(\n `Knowledge context not found: ${opts.context}`,\n !!opts.json,\n );\n }\n\n const token = await getTokenBySlug(db, opts.token);\n if (!token) {\n commandError(`Token not found: ${opts.token}`, !!opts.json);\n }\n\n await unassignTokenFromContext(db, token.id, context.id);\n\n if (opts.json) {\n jsonOut({ success: true, token: token.slug, context: context.name });\n return;\n }\n\n console.log(\n `Unassigned token \"${token.slug}\" from context \"${context.name}\"`,\n );\n });\n });\n\n// ── zam knowledge-context use ────────────────────────────────────────────\n\nknowledgeContextCommand\n .command(\"use\")\n .description(\"Set the active knowledge context default for this device\")\n .argument(\"[name]\", \"Context name to use (use without argument to clear)\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (name, opts) => {\n await withDb(async (db) => {\n if (!name) {\n if (!setActiveWorkspaceContext(undefined)) {\n commandError(\"No active workspace configured\", !!opts.json);\n }\n if (opts.json) {\n jsonOut({ success: true, activeContext: null });\n return;\n }\n console.log(\"Cleared active knowledge context default.\");\n return;\n }\n\n const context = await getKnowledgeContextByName(db, name);\n if (!context) {\n commandError(`Knowledge context not found: ${name}`, !!opts.json);\n }\n\n if (!setActiveWorkspaceContext(context.name)) {\n commandError(\"No active workspace configured\", !!opts.json);\n }\n\n if (opts.json) {\n jsonOut({ success: true, activeContext: context.name });\n return;\n }\n\n console.log(`Active knowledge context set to: ${context.name}`);\n });\n });\n\n// ── zam knowledge-context show ───────────────────────────────────────────\n\nknowledgeContextCommand\n .command(\"show\")\n .description(\"Show the active knowledge context default for this device\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const configured = getActiveWorkspaceContext();\n const active = configured\n ? await getKnowledgeContextByName(db, configured)\n : undefined;\n\n if (opts.json) {\n jsonOut({\n success: true,\n activeContext: active?.name ?? null,\n staleContext: configured && !active ? configured : null,\n });\n return;\n }\n\n if (active) {\n console.log(`Active knowledge context: ${active.name}`);\n } else if (configured) {\n console.warn(\n `Configured knowledge context no longer exists: ${configured}`,\n );\n } else {\n console.log(\"No active knowledge context default set.\");\n }\n });\n });\n","/**\n * `zam learn` — Standalone, spoiler-free, in-process learning session.\n *\n * Slice 1 of the Session Harness (Increment 5), variant (a): no LLM.\n * Flow per card: show a concept-free cue → capture the learner's answer →\n * ONLY THEN reveal the stored answer (concept + context + resolved source_link)\n * → single self-rating 1–4 via the shared interactive action handler.\n *\n * Because the harness owns its own prompt and never prints the answer before\n * input is captured, no external autocomplete/ghost-text can spoil it, and\n * ratings/logs are written in-process (no per-subcommand permission prompts).\n */\n\nimport { input } from \"@inquirer/prompts\";\nimport { Command } from \"commander\";\nimport type {\n BloomLevel,\n Database,\n SupportedLocale,\n} from \"../../kernel/index.js\";\nimport {\n buildReviewQueue,\n generatePrompt,\n getSetting,\n getTokenById,\n openDatabase,\n resolveReviewContext,\n setSetting,\n t,\n} from \"../../kernel/index.js\";\nimport { formatHeader, formatReveal } from \"../learn-format.js\";\nimport {\n ensureHighQualityQuestion,\n ensureLocalLlmRunning,\n evaluateAnswerViaLLM,\n} from \"../llm/client.js\";\nimport { runInteractiveReviewAction } from \"../review-actions.js\";\nimport {\n buildShellSetupCommand,\n normalizeShell,\n openTerminalWindow,\n resolveZamInvocation,\n} from \"../terminal-open.js\";\nimport { resolveUser } from \"../users/identity.js\";\n\n/** Words the learner can type at the answer prompt to end the session. */\nconst STOP_WORDS = new Set([\"q\", \":q\", \"quit\", \"stop\"]);\n\nfunction isExitPrompt(err: unknown): boolean {\n return err instanceof Error && err.name === \"ExitPromptError\";\n}\n\nexport const learnCommand = new Command(\"learn\")\n .description(\n \"Run a spoiler-free, in-process learning session (recall → reveal → self-rate)\",\n )\n .option(\"--user <id>\", \"User ID (default: whoami)\")\n .option(\"--max-new <n>\", \"Maximum new cards\", \"10\")\n .option(\"--max-reviews <n>\", \"Maximum review cards\", \"50\")\n .option(\"--no-resolve\", \"Skip resolving source_link into the revealed answer\")\n .action(async (opts) => {\n let db: Database | undefined;\n try {\n db = await openDatabase();\n const userId = await resolveUser(opts, db);\n\n const queue = await buildReviewQueue(db, {\n userId,\n maxNew: Number(opts.maxNew),\n maxReviews: Number(opts.maxReviews),\n });\n\n const locale = ((await getSetting(db, \"system.locale\")) ||\n \"en\") as SupportedLocale;\n\n if (queue.items.length === 0) {\n console.log(t(locale, \"nothing_due\"));\n await db.close();\n return;\n }\n\n // Start the local LLM if needed and verify it is actually usable\n // (reachable AND serving the configured model). A wrong model name\n // otherwise looks like \"the AI is slow\" — instead we fall back cleanly.\n const llm = await ensureLocalLlmRunning(db);\n const isLlmEnabled = llm.usable;\n\n console.log(`\\n${t(locale, \"welcome\", { count: queue.items.length })}`);\n console.log(\n t(locale, \"new_review_relearn\", {\n newC: queue.newCount,\n reviewC: queue.reviewCount,\n relearnC: queue.relearnCount,\n }),\n );\n console.log(\n t(locale, \"domains\", { domains: queue.totalDomains.join(\", \") }),\n );\n\n // When the LLM is simply switched off, nudge the user; offline /\n // model-not-found already printed their own actionable message.\n if (!isLlmEnabled && llm.reason === \"disabled\") {\n console.log(t(locale, \"offline_warning\"));\n console.log(t(locale, \"offline_instruction\"));\n }\n\n console.log(t(locale, \"instruction\"));\n console.log(t(locale, \"quit_hint\"));\n\n let stoppedEarly = false;\n let maintenanceActions = 0;\n const results: Array<{ slug: string; rating: number }> = [];\n\n for (const [index, item] of queue.items.entries()) {\n // Dynamically generate a fresh, living active-recall question if LLM is enabled\n let resolvedQuestion = item.question;\n if (isLlmEnabled) {\n console.log(` \\x1b[2m${t(locale, \"generating_question\")}\\x1b[0m`);\n try {\n const healed = await ensureHighQualityQuestion(db, {\n id: item.tokenId,\n slug: item.slug,\n concept: item.concept,\n domain: item.domain,\n bloomLevel: item.bloomLevel as BloomLevel,\n sourceLink: item.sourceLink,\n question: item.question,\n });\n if (healed) {\n resolvedQuestion = healed.question;\n }\n } catch {\n // ignore and proceed\n }\n }\n\n const prompt = generatePrompt({\n cardId: item.cardId,\n tokenId: item.tokenId,\n slug: item.slug,\n concept: item.concept,\n domain: item.domain,\n bloomLevel: item.bloomLevel as BloomLevel,\n sourceLink: item.sourceLink,\n question: resolvedQuestion,\n });\n\n console.log(`\\n${\"─\".repeat(50)}`);\n console.log(\n `[${index + 1}/${queue.items.length}] ${formatHeader({ bloomLevel: item.bloomLevel, domain: item.domain })}`,\n );\n\n console.log(`\\n ${prompt.question}`);\n\n // Capture the learner's answer FIRST — nothing is revealed yet.\n // Typing a stop word (or Ctrl+C) ends the session gracefully.\n let answer: string;\n try {\n answer = await input({\n message: t(locale, \"prompt_answer\"),\n });\n } catch (err) {\n if (isExitPrompt(err)) {\n stoppedEarly = true;\n console.log(\"\\nStopping session.\");\n break;\n }\n throw err;\n }\n\n if (STOP_WORDS.has(answer.trim().toLowerCase())) {\n stoppedEarly = true;\n console.log(\"Stopping session.\");\n break;\n }\n\n // Now reveal the stored answer.\n let resolved = null;\n if (opts.resolve !== false && item.sourceLink) {\n resolved = await resolveReviewContext(item.sourceLink).catch(\n () => null,\n );\n }\n const token = await getTokenById(db, item.tokenId);\n\n // Perform LLM evaluation if enabled and there is a typed answer\n if (isLlmEnabled && answer.trim().length > 0) {\n console.log(`\\n ${t(locale, \"evaluating\")}`);\n try {\n const evaluation = await evaluateAnswerViaLLM(db, {\n slug: item.slug,\n concept: item.concept,\n domain: item.domain,\n bloomLevel: item.bloomLevel,\n context: token?.context,\n question: prompt.question,\n userAnswer: answer,\n sourceLinkContent: resolved?.content,\n });\n console.log(\n `\\n ${t(locale, \"feedback_title\", { line: \"─\".repeat(34) })}`,\n );\n console.log(` \\x1b[2m[${evaluation.model}]\\x1b[0m`);\n for (const line of evaluation.text.split(\"\\n\")) {\n console.log(` ${line}`);\n }\n } catch (err) {\n console.warn(\n `\\n${t(locale, \"eval_skipped\", { reason: (err as Error).message })}`,\n );\n }\n }\n\n console.log(\n `\\n ${t(locale, \"answer_title\", { line: \"─\".repeat(38) })}`,\n );\n const reveal = formatReveal({\n slug: item.slug,\n title: item.title,\n concept: item.concept,\n context: token?.context,\n resolved,\n });\n for (const line of reveal.split(\"\\n\")) {\n console.log(` ${line}`);\n }\n console.log();\n\n let action: Awaited<ReturnType<typeof runInteractiveReviewAction>>;\n try {\n action = await runInteractiveReviewAction({\n db,\n userId,\n item,\n mode: \"review\",\n });\n } catch (err) {\n if (isExitPrompt(err)) {\n stoppedEarly = true;\n console.log(\"\\nStopping session.\");\n break;\n }\n throw err;\n }\n\n if (action.action === \"stop\") {\n stoppedEarly = true;\n console.log(\"\\nStopping session.\");\n break;\n }\n if (action.action === \"rate\") {\n results.push({ slug: item.slug, rating: action.rating! });\n } else if (action.action !== \"skip\") {\n maintenanceActions++;\n }\n }\n\n console.log(`\\n${\"═\".repeat(50)}`);\n console.log(\n stoppedEarly\n ? t(locale, \"session_ended\")\n : t(locale, \"session_complete\"),\n );\n console.log(t(locale, \"cards_rated\", { count: results.length }));\n if (maintenanceActions > 0) {\n console.log(` Maintenance actions: ${maintenanceActions}`);\n }\n if (results.length > 0) {\n const avg = results.reduce((s, r) => s + r.rating, 0) / results.length;\n console.log(t(locale, \"avg_rating\", { avg: avg.toFixed(1) }));\n const forgot = results.filter((r) => r.rating === 1).length;\n if (forgot > 0) {\n console.log(t(locale, \"forgot\", { count: forgot }));\n }\n }\n\n await db.close();\n } catch (err) {\n await db?.close();\n if ((err as Error).name === \"ExitPromptError\") {\n console.log(\"\\nLearning session cancelled.\");\n process.exit(0);\n }\n console.error(\"Error:\", (err as Error).message);\n process.exit(1);\n }\n });\n\nfunction buildLearnCommand(\n shell: ReturnType<typeof normalizeShell>,\n userId: string,\n): string {\n const zamInvocation = resolveZamInvocation(shell);\n const learnArgs = userId ? ` learn --user ${userId}` : \" learn\";\n return `${zamInvocation}${learnArgs}`;\n}\n\nlearnCommand\n .command(\"open\")\n .description(\"Open a new terminal window running zam learn (Active Recall)\")\n .option(\"--user <id>\", \"User ID (default: whoami)\")\n .option(\"--dir <path>\", \"Working directory (defaults to cwd)\")\n .option(\n \"--shell <type>\",\n \"Shell type: zsh | bash | pwsh | powershell (auto-detected)\",\n )\n .action(async (opts) => {\n let shell: ReturnType<typeof normalizeShell>;\n try {\n shell = normalizeShell(opts.shell);\n } catch (err) {\n console.error(`Error: ${(err as Error).message}`);\n process.exit(1);\n }\n\n let db: Database | undefined;\n let userId = opts.user;\n try {\n db = await openDatabase();\n if (!userId) {\n userId = await resolveUser(opts, db);\n }\n\n if (!(await getSetting(db, \"review_method\"))) {\n await setSetting(db, \"review_method\", \"console\");\n }\n } catch (err) {\n console.error(`Error: ${(err as Error).message}`);\n process.exit(1);\n } finally {\n await db?.close();\n }\n\n const dir = opts.dir ?? process.cwd();\n const learnCommandLine = buildLearnCommand(shell, userId);\n const shellSetup = buildShellSetupCommand(dir, shell, learnCommandLine);\n\n openTerminalWindow({\n shellSetup,\n label: \"learn\",\n dir,\n shell,\n });\n });\n","/**\n * Pure formatting helpers for the spoiler-free learning session (`zam learn`).\n *\n * Kept free of terminal/prompt code so the presentation logic is unit-testable.\n * The up-front question is the kernel's Bloom-templated prompt (built in\n * learn.ts via generatePrompt); these helpers render the header line and the\n * answer that is revealed only AFTER the learner has committed an answer.\n */\n\nimport type { ReviewContext } from \"../kernel/index.js\";\n\nexport const BLOOM_VERBS: Record<number, string> = {\n 1: \"Remember\",\n 2: \"Understand\",\n 3: \"Apply\",\n 4: \"Analyze\",\n 5: \"Synthesize\",\n};\n\nfunction clampBloom(n: number): number {\n return Number.isFinite(n) && n >= 1 && n <= 5 ? Math.trunc(n) : 1;\n}\n\n/**\n * Build the card header, e.g. \"Understand (Bloom 2) · web\".\n * If title is provided, includes it for better usability.\n */\nexport function formatHeader(input: {\n bloomLevel: number;\n domain: string;\n title?: string;\n slug?: string;\n}): string {\n const lvl = clampBloom(input.bloomLevel);\n const parts = [`${BLOOM_VERBS[lvl]} (Bloom ${lvl})`];\n const name = input.title || input.slug; // could use getDisplayTitle but keep simple for format\n if (name) {\n parts.push(name);\n } else if (input.domain?.trim()) {\n parts.push(input.domain.trim());\n }\n return parts.join(\" · \");\n}\n\nexport interface RevealInput {\n slug: string;\n title?: string;\n concept: string;\n context?: string | null;\n resolved?: ReviewContext | null;\n}\n\n/**\n * Format the stored answer revealed AFTER the learner has committed: the\n * token slug, concept, optional context, and resolved source_link content.\n */\nexport function formatReveal(input: RevealInput): string {\n const lines: string[] = [\n `Token: ${input.title || input.slug}`,\n `Concept: ${input.concept}`,\n ];\n if (input.title) {\n lines.push(`ID: #${input.slug}`);\n }\n\n if (input.context?.trim()) {\n lines.push(\"\", `Context: ${input.context.trim()}`);\n }\n\n const resolved = input.resolved;\n if (resolved?.content.trim()) {\n lines.push(\"\");\n if (resolved.sourceType === \"dynamic_search\") {\n // content is a QUERY_DIRECTIVE — there is nothing to quote inline\n lines.push(`Source: ${resolved.content}`);\n } else {\n const label = resolved.url ?? resolved.filePath ?? resolved.sourceLink;\n lines.push(`Source (${resolved.sourceType}: ${label}):`);\n for (const line of resolved.content.trimEnd().split(\"\\n\")) {\n lines.push(` │ ${line}`);\n }\n if (resolved.truncated) {\n lines.push(\" │ … (truncated)\");\n }\n }\n }\n\n return lines.join(\"\\n\");\n}\n","import { confirm, input, select } from \"@inquirer/prompts\";\nimport type {\n BloomLevel,\n Database,\n Rating,\n ReviewActionResult,\n ReviewQueueItem,\n SymbiosisMode,\n Token,\n UpdateTokenInput,\n} from \"../kernel/index.js\";\nimport {\n executeReviewAction,\n generatePrompt,\n getCardDeletionImpact,\n getTokenById,\n getTokenDeleteImpact,\n} from \"../kernel/index.js\";\n\ntype InteractiveTerminalAction =\n | \"rate\"\n | \"skip\"\n | \"deprecate-token\"\n | \"delete-token\"\n | \"delete-card\"\n | \"stop\";\n\ntype InteractiveReviewChoice =\n | Rating\n | InteractiveTerminalAction\n | \"edit-token\";\n\ntype EditableTokenField =\n | \"concept\"\n | \"domain\"\n | \"bloom_level\"\n | \"context\"\n | \"symbiosis_mode\"\n | \"source_link\"\n | \"question\";\n\nexport interface RunInteractiveReviewActionInput {\n db: Database;\n userId: string;\n item: ReviewQueueItem;\n mode: \"review\" | \"session\";\n}\n\nexport interface RunInteractiveReviewActionResult {\n action: InteractiveTerminalAction;\n result: ReviewActionResult;\n rating?: Rating;\n}\n\nexport async function runInteractiveReviewAction(\n inputData: RunInteractiveReviewActionInput,\n): Promise<RunInteractiveReviewActionResult> {\n let currentItem = { ...inputData.item };\n\n while (true) {\n const choice = await select<InteractiveReviewChoice>({\n message: \"What next?\",\n choices: [\n { name: \"1 - Again (forgot)\", value: 1 },\n { name: \"2 - Hard\", value: 2 },\n { name: \"3 - Good\", value: 3 },\n { name: \"4 - Easy\", value: 4 },\n { name: \"Skip this card\", value: \"skip\" },\n { name: \"Edit token\", value: \"edit-token\" },\n { name: \"Deprecate token\", value: \"deprecate-token\" },\n { name: \"Delete token\", value: \"delete-token\" },\n { name: \"Delete my card\", value: \"delete-card\" },\n {\n name:\n inputData.mode === \"session\"\n ? \"Stop review and continue to task selection\"\n : \"Stop review\",\n value: \"stop\",\n },\n ],\n });\n\n if (typeof choice === \"number\") {\n const result = await executeReviewAction(inputData.db, {\n action: \"rate\",\n cardId: currentItem.cardId,\n userId: inputData.userId,\n rating: choice,\n });\n\n const ratingLabels: Record<number, string> = {\n 1: \"Again\",\n 2: \"Hard\",\n 3: \"Good\",\n 4: \"Easy\",\n };\n console.log(\n ` ${ratingLabels[choice]} — next due: ${result.evaluation?.nextDueAt}`,\n );\n\n if (result.blocked) {\n console.log(\n ` Blocked ${result.blocked.blockedSlug}. Review these prerequisites:`,\n );\n for (const prereq of result.blocked.prerequisites) {\n console.log(` - ${prereq.slug}: ${prereq.concept}`);\n }\n }\n\n console.log();\n return { action: \"rate\", result, rating: choice };\n }\n\n if (choice === \"skip\") {\n console.log(\"Skipped this card.\\n\");\n return {\n action: \"skip\",\n result: await executeReviewAction(inputData.db, {\n action: \"skip\",\n cardId: currentItem.cardId,\n userId: inputData.userId,\n }),\n };\n }\n\n if (choice === \"stop\") {\n return {\n action: \"stop\",\n result: await executeReviewAction(inputData.db, {\n action: \"stop\",\n cardId: currentItem.cardId,\n userId: inputData.userId,\n }),\n };\n }\n\n if (choice === \"edit-token\") {\n const token = await getTokenById(inputData.db, currentItem.tokenId);\n if (!token) {\n throw new Error(`Token not found: ${currentItem.tokenId}`);\n }\n\n const updates = await promptTokenEdit(token);\n if (!updates) {\n console.log(\"No token changes made.\\n\");\n continue;\n }\n\n const result = await executeReviewAction(inputData.db, {\n action: \"edit-token\",\n cardId: currentItem.cardId,\n userId: inputData.userId,\n tokenUpdates: updates,\n });\n\n const updatedToken = result.updatedToken!;\n currentItem = {\n ...currentItem,\n slug: updatedToken.slug,\n concept: updatedToken.concept,\n domain: updatedToken.domain,\n bloomLevel: updatedToken.bloom_level,\n };\n\n const refreshedPrompt = generatePrompt({\n cardId: currentItem.cardId,\n tokenId: currentItem.tokenId,\n slug: currentItem.slug,\n concept: currentItem.concept,\n domain: currentItem.domain,\n bloomLevel: currentItem.bloomLevel as BloomLevel,\n });\n\n console.log(`Updated token: ${updatedToken.slug}`);\n console.log(` Concept: ${updatedToken.concept}`);\n console.log(` Domain: ${updatedToken.domain || \"(none)\"}`);\n console.log(` Bloom: ${updatedToken.bloom_level}`);\n if (updatedToken.source_link) {\n console.log(` Source: ${updatedToken.source_link}`);\n }\n console.log(`\\n ${refreshedPrompt.question}\\n`);\n continue;\n }\n\n if (choice === \"deprecate-token\") {\n const approved = await confirm({\n message: `Deprecate ${currentItem.slug} so it stops appearing in review queues?`,\n default: false,\n });\n if (!approved) {\n console.log(\"Token deprecation cancelled.\\n\");\n continue;\n }\n\n const result = await executeReviewAction(inputData.db, {\n action: \"deprecate-token\",\n cardId: currentItem.cardId,\n userId: inputData.userId,\n });\n\n console.log(`Deprecated token: ${currentItem.slug}\\n`);\n return { action: \"deprecate-token\", result };\n }\n\n if (choice === \"delete-token\") {\n const impact = await getTokenDeleteImpact(inputData.db, currentItem.slug);\n console.log(`Delete token ${currentItem.slug}?`);\n console.log(` Cards: ${impact.cards}`);\n console.log(` Review logs: ${impact.review_logs}`);\n console.log(\n ` Prereq edges from it: ${impact.prerequisite_edges_from_token}`,\n );\n console.log(\n ` Prereq edges to it: ${impact.prerequisite_edges_to_token}`,\n );\n console.log(` Session steps: ${impact.session_steps}`);\n console.log(` Sessions touched: ${impact.sessions_touched}`);\n console.log(` Agent skills updated: ${impact.agent_skills}`);\n\n const approved = await confirm({\n message:\n \"Permanently delete this token and its dependent learning data?\",\n default: false,\n });\n if (!approved) {\n console.log(\"Token deletion cancelled.\\n\");\n continue;\n }\n\n const result = await executeReviewAction(inputData.db, {\n action: \"delete-token\",\n cardId: currentItem.cardId,\n userId: inputData.userId,\n });\n\n console.log(`Deleted token: ${currentItem.slug}\\n`);\n return { action: \"delete-token\", result };\n }\n\n if (choice === \"delete-card\") {\n const impact = await getCardDeletionImpact(\n inputData.db,\n currentItem.tokenId,\n inputData.userId,\n );\n console.log(`Delete your card for ${currentItem.slug}?`);\n console.log(` Review logs removed: ${impact.review_logs}`);\n\n const approved = await confirm({\n message: \"Delete only your card for this token?\",\n default: false,\n });\n if (!approved) {\n console.log(\"Card deletion cancelled.\\n\");\n continue;\n }\n\n const result = await executeReviewAction(inputData.db, {\n action: \"delete-card\",\n cardId: currentItem.cardId,\n userId: inputData.userId,\n });\n\n console.log(`Deleted your card for: ${currentItem.slug}\\n`);\n return { action: \"delete-card\", result };\n }\n }\n}\n\nasync function promptTokenEdit(token: Token): Promise<UpdateTokenInput | null> {\n const field = await select<EditableTokenField | \"cancel\">({\n message: `Edit which field on ${token.slug}?`,\n choices: [\n { name: \"Concept\", value: \"concept\" },\n { name: \"Domain\", value: \"domain\" },\n { name: \"Bloom level\", value: \"bloom_level\" },\n { name: \"Context\", value: \"context\" },\n { name: \"Symbiosis mode\", value: \"symbiosis_mode\" },\n { name: \"Source link\", value: \"source_link\" },\n { name: \"Question\", value: \"question\" },\n { name: \"Cancel\", value: \"cancel\" },\n ],\n });\n\n if (field === \"cancel\") {\n return null;\n }\n\n switch (field) {\n case \"concept\": {\n const concept = await input({\n message: \"Concept:\",\n default: token.concept,\n });\n return concept === token.concept ? null : { concept };\n }\n\n case \"domain\": {\n const domain = await input({\n message: \"Domain (blank allowed):\",\n default: token.domain,\n });\n return domain === token.domain ? null : { domain };\n }\n\n case \"context\": {\n const context = await input({\n message: \"Context (blank allowed):\",\n default: token.context,\n });\n return context === token.context ? null : { context };\n }\n\n case \"bloom_level\": {\n const bloom = (await select({\n message: \"Bloom level:\",\n choices: [1, 2, 3, 4, 5].map((value) => ({\n name:\n value === token.bloom_level ? `${value} (current)` : String(value),\n value,\n })),\n })) as BloomLevel;\n return bloom === token.bloom_level ? null : { bloom_level: bloom };\n }\n\n case \"symbiosis_mode\": {\n const mode = (await select({\n message: \"Symbiosis mode:\",\n choices: [\n {\n name: token.symbiosis_mode === null ? \"none (current)\" : \"none\",\n value: null,\n },\n {\n name:\n token.symbiosis_mode === \"shadowing\"\n ? \"shadowing (current)\"\n : \"shadowing\",\n value: \"shadowing\",\n },\n {\n name:\n token.symbiosis_mode === \"copilot\"\n ? \"copilot (current)\"\n : \"copilot\",\n value: \"copilot\",\n },\n {\n name:\n token.symbiosis_mode === \"autonomy\"\n ? \"autonomy (current)\"\n : \"autonomy\",\n value: \"autonomy\",\n },\n ],\n })) as SymbiosisMode | null;\n return mode === token.symbiosis_mode ? null : { symbiosis_mode: mode };\n }\n\n case \"source_link\": {\n const link = await input({\n message: \"Source link (blank allowed):\",\n default: token.source_link ?? \"\",\n });\n return link === token.source_link ? null : { source_link: link || null };\n }\n\n case \"question\": {\n const question = await input({\n message: \"Recall question (blank allowed):\",\n default: token.question ?? \"\",\n });\n return question === token.question\n ? null\n : { question: question || null };\n }\n\n default: {\n const exhaustive: never = field;\n throw new Error(`Unsupported token field: ${exhaustive}`);\n }\n }\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { Command } from \"commander\";\nimport { z } from \"zod\";\nimport type { Database, Rating, ReviewActionType } from \"../../kernel/index.js\";\nimport { getSetting, openDatabase } from \"../../kernel/index.js\";\nimport {\n addToken as handleAddToken,\n analyzeMonitor as handleAnalyzeMonitor,\n checkDue as handleCheckDue,\n endSession as handleEndSession,\n findTokens as handleFindTokens,\n getMonitor as handleGetMonitor,\n getReviewsBatch as handleGetReviewsBatch,\n linkPrereq as handleLinkPrereq,\n reviewAction as handleReviewAction,\n startSession as handleStartSession,\n submitReview as handleSubmitReview,\n suggestFoundations as handleSuggestFoundations,\n} from \"../bridge-handlers.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nlet pkgPath = join(__dirname, \"..\", \"..\", \"package.json\");\nif (!existsSync(pkgPath)) {\n pkgPath = join(__dirname, \"..\", \"..\", \"..\", \"package.json\");\n}\nconst pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as { version: string };\n\n/**\n * Creates and configures the McpServer instance with all tools mapped.\n */\nexport function createMcpServer(db: Database): McpServer {\n const server = new McpServer({\n name: \"zam\",\n version: pkg.version,\n });\n\n async function getUserId(paramUser: string | undefined) {\n if (paramUser) return paramUser;\n const stored = await getSetting(db, \"user.id\");\n if (stored) return stored;\n throw new Error(\n \"No user specified. Set a default with: zam whoami --set <id>\",\n );\n }\n\n const commonAnnotations = {\n openWorldHint: false,\n };\n\n const externalAnnotations = {\n openWorldHint: true,\n };\n\n function wrapHandler<T>(fn: (params: T) => Promise<unknown>) {\n return async (params: T) => {\n try {\n const result = await fn(params);\n const structuredContent =\n typeof result === \"object\" &&\n result !== null &&\n !Array.isArray(result)\n ? (result as Record<string, unknown>)\n : { result };\n return {\n structuredContent,\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n const errMsg = error instanceof Error ? error.message : String(error);\n return {\n isError: true,\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify({ error: errMsg }, null, 2),\n },\n ],\n };\n }\n };\n }\n\n // 1. zam_status\n server.registerTool(\n \"zam_status\",\n {\n description: \"Check due cards and review stats\",\n inputSchema: {\n user: z.string().optional().describe(\"User ID to query cards for\"),\n domain: z.string().optional().describe(\"Filter by domain prefix\"),\n knowledgeContext: z\n .string()\n .optional()\n .describe(\"Filter by knowledge context\"),\n },\n annotations: {\n ...commonAnnotations,\n readOnlyHint: true,\n },\n },\n wrapHandler(async (params) => {\n const userId = await getUserId(params.user);\n return await handleCheckDue(db, {\n user: userId,\n domain: params.domain,\n knowledgeContext: params.knowledgeContext,\n });\n }),\n );\n\n // 2. zam_session_start\n server.registerTool(\n \"zam_session_start\",\n {\n description: \"Start a learning/work session\",\n inputSchema: {\n user: z.string().optional().describe(\"User ID starting the session\"),\n task: z.string().describe(\"Task description for the session\"),\n context: z\n .enum([\"shell\", \"ui\", \"reallife\"])\n .optional()\n .describe(\"Execution context\"),\n },\n annotations: {\n ...commonAnnotations,\n destructiveHint: false,\n },\n },\n wrapHandler(async (params) => {\n const userId = await getUserId(params.user);\n return await handleStartSession(db, {\n user: userId,\n task: params.task,\n context: params.context,\n });\n }),\n );\n\n // 3. zam_session_end\n server.registerTool(\n \"zam_session_end\",\n {\n description: \"End a learning/work session\",\n inputSchema: {\n session: z.string().describe(\"Session ULID to end\"),\n synthesize: z\n .boolean()\n .optional()\n .describe(\"Return monitor-based rating candidates before ending\"),\n patterns: z\n .array(\n z.object({\n slug: z.string(),\n patterns: z.array(z.string()),\n }),\n )\n .optional()\n .describe(\"Additional token command patterns for synthesis\"),\n minConfidence: z\n .enum([\"medium\", \"high\"])\n .optional()\n .describe(\"Minimum confidence for synthesis candidates\"),\n },\n annotations: {\n ...commonAnnotations,\n destructiveHint: false,\n },\n },\n wrapHandler(async (params) => {\n return await handleEndSession(db, {\n session: params.session,\n synthesize: params.synthesize,\n patterns: params.patterns,\n minConfidence: params.minConfidence,\n });\n }),\n );\n\n // 4. zam_get_reviews\n server.registerTool(\n \"zam_get_reviews\",\n {\n description: \"Fetch a batch of review cards\",\n inputSchema: {\n user: z.string().optional().describe(\"User ID to review for\"),\n domain: z.string().optional().describe(\"Filter by domain prefix\"),\n knowledgeContext: z\n .string()\n .optional()\n .describe(\"Filter by knowledge context\"),\n includeQuestions: z\n .boolean()\n .optional()\n .describe(\"Include question contents in response\"),\n noResolve: z\n .boolean()\n .optional()\n .describe(\"Do not auto-generate missing questions\"),\n noDynamicQuestion: z\n .literal(true)\n .optional()\n .describe(\"Keep review retrieval read-only (always true over MCP)\"),\n },\n annotations: {\n ...externalAnnotations,\n readOnlyHint: true,\n },\n },\n wrapHandler(async (params) => {\n const userId = await getUserId(params.user);\n return await handleGetReviewsBatch(db, {\n user: userId,\n domain: params.domain,\n knowledgeContext: params.knowledgeContext,\n includeQuestions: params.includeQuestions,\n noResolve: params.noResolve,\n noDynamicQuestion: true,\n });\n }),\n );\n\n // 5. zam_submit_review\n server.registerTool(\n \"zam_submit_review\",\n {\n description: \"Submit a user rating or log an unrated agent step\",\n inputSchema: {\n user: z.string().optional().describe(\"User ID submitting the review\"),\n cardId: z\n .string()\n .optional()\n .describe(\"Card ULID; required for agent steps\"),\n tokenId: z\n .string()\n .optional()\n .describe(\"Token ULID for a confirmed synthesis without a card yet\"),\n rating: z.coerce\n .number()\n .int()\n .min(1)\n .max(4)\n .optional()\n .describe(\n \"User FSRS rating (1=Again, 2=Hard, 3=Good, 4=Easy); omit when doneBy is agent\",\n ),\n sessionId: z\n .string()\n .optional()\n .describe(\"Optional active session ULID to log step\"),\n doneBy: z\n .enum([\"user\", \"agent\"])\n .optional()\n .describe(\"Who performed the review step\"),\n },\n annotations: {\n ...commonAnnotations,\n destructiveHint: false,\n idempotentHint: false,\n },\n },\n wrapHandler(async (params) => {\n const userId = await getUserId(params.user);\n return await handleSubmitReview(db, {\n user: userId,\n cardId: params.cardId,\n tokenId: params.tokenId,\n rating: params.rating as Rating | undefined,\n sessionId: params.sessionId,\n doneBy: params.doneBy,\n });\n }),\n );\n\n // 6. zam_review_action\n server.registerTool(\n \"zam_review_action\",\n {\n description: \"Perform a review action (e.g. rate, edit, delete)\",\n inputSchema: {\n user: z.string().optional().describe(\"User ID performing the action\"),\n cardId: z.string().describe(\"Card ULID target\"),\n action: z\n .enum([\n \"rate\",\n \"skip\",\n \"edit-token\",\n \"deprecate-token\",\n \"delete-token\",\n \"delete-card\",\n \"stop\",\n ])\n .describe(\"The action type\"),\n rating: z.coerce\n .number()\n .int()\n .min(1)\n .max(4)\n .optional()\n .describe(\n \"Rating (1=Again, 2=Hard, 3=Good, 4=Easy; required for rate)\",\n ),\n concept: z\n .string()\n .optional()\n .describe(\"Updated concept text (for edit-token)\"),\n domain: z\n .string()\n .optional()\n .describe(\"Updated domain (for edit-token)\"),\n bloomLevel: z\n .number()\n .int()\n .min(1)\n .max(5)\n .optional()\n .describe(\"Updated Bloom level (for edit-token)\"),\n context: z\n .string()\n .optional()\n .describe(\"Updated context text (for edit-token)\"),\n symbiosisMode: z\n .string()\n .optional()\n .describe(\"Updated symbiosis mode (for edit-token)\"),\n sourceLink: z\n .string()\n .optional()\n .describe(\"Updated source link (for edit-token)\"),\n confirm: z\n .boolean()\n .optional()\n .describe(\"Confirm deletion (required for delete action)\"),\n },\n annotations: {\n ...commonAnnotations,\n destructiveHint: true,\n },\n },\n wrapHandler(async (params) => {\n const userId = await getUserId(params.user);\n return await handleReviewAction(db, {\n user: userId,\n cardId: params.cardId,\n action: params.action as ReviewActionType,\n rating: params.rating as Rating | undefined,\n concept: params.concept,\n domain: params.domain,\n bloomLevel: params.bloomLevel,\n context: params.context,\n symbiosisMode: params.symbiosisMode,\n sourceLink: params.sourceLink,\n confirm: params.confirm,\n });\n }),\n );\n\n // 7. zam_add_token\n server.registerTool(\n \"zam_add_token\",\n {\n description: \"Add a new knowledge token\",\n inputSchema: {\n user: z.string().optional().describe(\"User ID to auto-create card for\"),\n slug: z.string().describe(\"Unique slug for the token\"),\n concept: z.string().describe(\"Detailed description of the concept\"),\n title: z.string().optional().describe(\"Optional display title\"),\n domain: z.string().optional().describe(\"Domain path\"),\n bloomLevel: z\n .number()\n .int()\n .min(1)\n .max(5)\n .optional()\n .describe(\"Bloom taxonomy level (1-5)\"),\n context: z\n .string()\n .optional()\n .describe(\"Markdown content block/context\"),\n symbiosisMode: z\n .enum([\"shadowing\", \"copilot\", \"autonomy\"])\n .nullable()\n .optional()\n .describe(\"Symbiosis mode override\"),\n sourceLink: z\n .string()\n .nullable()\n .optional()\n .describe(\"Optional URL/file path source\"),\n question: z\n .string()\n .nullable()\n .optional()\n .describe(\"Pre-defined review question\"),\n knowledgeContexts: z\n .array(z.string())\n .optional()\n .describe(\"List of contexts to assign the token to\"),\n prerequisites: z\n .array(z.string())\n .optional()\n .describe(\"Existing token slugs required by the new token\"),\n },\n annotations: {\n ...externalAnnotations,\n destructiveHint: false,\n },\n },\n wrapHandler(async (params) => {\n const userId = await getUserId(params.user);\n return await handleAddToken(db, {\n user: userId,\n slug: params.slug,\n concept: params.concept,\n title: params.title,\n domain: params.domain,\n bloomLevel: params.bloomLevel,\n context: params.context,\n symbiosisMode: params.symbiosisMode,\n sourceLink: params.sourceLink,\n question: params.question,\n knowledgeContexts: params.knowledgeContexts,\n prerequisites: params.prerequisites,\n });\n }),\n );\n\n // 8. zam_find_tokens\n server.registerTool(\n \"zam_find_tokens\",\n {\n description: \"Search/find matching tokens using semantic search\",\n inputSchema: {\n user: z.string().optional().describe(\"User ID\"),\n context: z.string().describe(\"Query context to embed and match\"),\n limit: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Max number of matches to return\"),\n },\n annotations: {\n ...externalAnnotations,\n readOnlyHint: true,\n },\n },\n wrapHandler(async (params) => {\n const userId = await getUserId(params.user);\n return await handleFindTokens(db, {\n user: userId,\n context: params.context,\n limit: params.limit,\n });\n }),\n );\n\n // 9. zam_suggest_foundations\n server.registerTool(\n \"zam_suggest_foundations\",\n {\n description: \"Suggest foundational concept prerequisites\",\n inputSchema: {\n user: z.string().optional().describe(\"User ID\"),\n slug: z\n .string()\n .optional()\n .describe(\"Target token slug to find prereqs for\"),\n concept: z\n .string()\n .optional()\n .describe(\"Or concept text description for pre-registration\"),\n question: z\n .string()\n .optional()\n .describe(\"Optional question content for pre-registration\"),\n domain: z.string().optional().describe(\"Domain filter\"),\n title: z.string().optional().describe(\"Optional title\"),\n bloom_level: z\n .number()\n .int()\n .min(1)\n .max(5)\n .optional()\n .describe(\"Bloom level of target\"),\n limit: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Max number of suggestions\"),\n },\n annotations: {\n ...externalAnnotations,\n readOnlyHint: true,\n },\n },\n wrapHandler(async (params) => {\n return await handleSuggestFoundations(db, {\n user: params.user,\n slug: params.slug,\n concept: params.concept,\n question: params.question,\n domain: params.domain,\n title: params.title,\n bloom_level: params.bloom_level,\n limit: params.limit,\n });\n }),\n );\n\n // 10. zam_link_prereq\n server.registerTool(\n \"zam_link_prereq\",\n {\n description: \"Link a prerequisite dependency between two tokens\",\n inputSchema: {\n token: z.string().describe(\"Slug of dependent token\"),\n requires: z.string().describe(\"Slug of required prerequisite token\"),\n blockUser: z\n .string()\n .optional()\n .describe(\"Block card for this user until prereq is learned\"),\n },\n annotations: {\n ...commonAnnotations,\n destructiveHint: false,\n },\n },\n wrapHandler(async (params) => {\n return await handleLinkPrereq(db, {\n token: params.token,\n requires: params.requires,\n blockUser: params.blockUser,\n });\n }),\n );\n\n // 11. zam_monitor\n server.registerTool(\n \"zam_monitor\",\n {\n description: \"Get or analyze session monitor commands\",\n inputSchema: {\n session: z.string().describe(\"Session ULID to monitor\"),\n patterns: z\n .array(\n z.object({\n slug: z.string(),\n patterns: z.array(z.string()),\n }),\n )\n .optional()\n .describe(\"Patterns to match against monitor events for evaluation\"),\n },\n annotations: {\n ...commonAnnotations,\n readOnlyHint: true,\n },\n },\n wrapHandler(async (params) => {\n if (params.patterns) {\n return await handleAnalyzeMonitor(db, {\n session: params.session,\n patterns: params.patterns,\n });\n }\n return await handleGetMonitor(db, {\n session: params.session,\n });\n }),\n );\n\n return server;\n}\n\nexport const mcpCommand = new Command(\"mcp\")\n .description(\"Launch the Model Context Protocol (MCP) server over Stdio\")\n .action(async () => {\n // Rebind console.log to console.error immediately to prevent stdio transport corruption\n console.log = console.error;\n\n const db = await openDatabase();\n const server = createMcpServer(db);\n\n let dbClosed = false;\n async function cleanup() {\n if (dbClosed) return;\n dbClosed = true;\n try {\n await server.close();\n } catch {}\n try {\n await db.close();\n } catch {}\n process.exit(0);\n }\n\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n\n const transport = new StdioServerTransport();\n transport.onclose = () => {\n cleanup();\n };\n\n await server.connect(transport);\n });\n","/**\n * `zam monitor` — Shell observation for real-time task monitoring.\n *\n * Installs shell hooks (zsh/bash/PowerShell) that capture commands with timing,\n * exit codes, and working directory to a JSONL file. The agent reads\n * this log to infer ratings for knowledge tokens.\n *\n * Usage:\n * eval \"$(zam monitor start --session <id>)\" # zsh/bash\n * Invoke-Expression (& zam monitor start --session <id>) # PowerShell\n * zam monitor status --session <id> # check log stats\n */\n\nimport { Command } from \"commander\";\nimport type { Database, MonitorEvent } from \"../../kernel/index.js\";\nimport {\n ensureMonitorDir,\n generateBashHooks,\n generateBashUnhooks,\n generatePowerShellHooks,\n generatePowerShellUnhooks,\n generateZshHooks,\n generateZshUnhooks,\n getMonitorLogStats,\n getMonitorPath,\n getSetting,\n monitorLogExists,\n openDatabase,\n pairCommands,\n readMonitorLog,\n setSetting,\n writeMonitorEvent,\n} from \"../../kernel/index.js\";\nimport {\n isPowerShellShell,\n normalizeShell,\n openTerminalWindow,\n psSingleQuoted,\n resolveZamInvocation,\n selectWindowsExecutable,\n type TerminalShell,\n} from \"../terminal-open.js\";\n\nexport { selectWindowsExecutable };\n\ntype MonitorShell = TerminalShell;\n\nexport const monitorCommand = new Command(\"monitor\").description(\n \"Shell observation for real-time task monitoring\",\n);\n\n// ── zam monitor start ─────────────────────────────────────────────────────\n\nmonitorCommand\n .command(\"start\")\n .description(\"Output shell hook code to install monitoring\")\n .requiredOption(\"--session <id>\", \"Session ID to monitor\")\n .option(\n \"--shell <type>\",\n \"Shell type: zsh | bash | pwsh | powershell (auto-detected)\",\n )\n .action(async (opts) => {\n let shell: MonitorShell;\n try {\n shell = normalizeShell(opts.shell);\n } catch (err) {\n console.error(`# Error: ${(err as Error).message}`);\n process.exit(1);\n }\n\n // Validate session exists\n let db: Database | undefined;\n try {\n db = await openDatabase();\n const session = (await db\n .prepare(\"SELECT id, completed_at FROM sessions WHERE id = ?\")\n .get(opts.session)) as\n | { id: string; completed_at: string | null }\n | undefined;\n\n if (!session) {\n console.error(`# Error: Session not found: ${opts.session}`);\n process.exit(1);\n }\n if (session.completed_at) {\n console.error(`# Error: Session already completed: ${opts.session}`);\n process.exit(1);\n }\n } catch (err) {\n console.error(`# Error: ${(err as Error).message}`);\n process.exit(1);\n } finally {\n await db?.close();\n }\n\n ensureMonitorDir();\n const monitorFile = getMonitorPath(opts.session);\n\n // Write initial meta event\n const meta: MonitorEvent = {\n type: \"monitor_meta\",\n ts: new Date().toISOString(),\n event: \"start\",\n session_id: opts.session,\n shell,\n pid: process.pid,\n };\n writeMonitorEvent(opts.session, meta);\n\n // Output hook code to stdout\n if (shell === \"bash\") {\n console.log(generateBashHooks(monitorFile, opts.session));\n } else if (isPowerShellShell(shell)) {\n console.log(generatePowerShellHooks(monitorFile, opts.session));\n } else {\n console.log(generateZshHooks(monitorFile, opts.session));\n }\n });\n\n// ── zam monitor stop ──────────────────────────────────────────────────────\n\nmonitorCommand\n .command(\"stop\")\n .description(\"Output shell code to remove monitoring hooks\")\n .requiredOption(\"--session <id>\", \"Session ID\")\n .option(\n \"--shell <type>\",\n \"Shell type: zsh | bash | pwsh | powershell (auto-detected)\",\n )\n .action((opts) => {\n // Write stop meta event\n if (monitorLogExists(opts.session)) {\n const meta: MonitorEvent = {\n type: \"monitor_meta\",\n ts: new Date().toISOString(),\n event: \"stop\",\n session_id: opts.session,\n };\n writeMonitorEvent(opts.session, meta);\n }\n\n let shell: MonitorShell;\n try {\n shell = normalizeShell(opts.shell);\n } catch (err) {\n console.error(`# Error: ${(err as Error).message}`);\n process.exit(1);\n }\n\n if (shell === \"bash\") {\n console.log(generateBashUnhooks());\n } else if (isPowerShellShell(shell)) {\n console.log(generatePowerShellUnhooks());\n } else {\n console.log(generateZshUnhooks());\n }\n });\n\n// ── zam monitor status ────────────────────────────────────────────────────\n\nmonitorCommand\n .command(\"status\")\n .description(\"Show monitoring status for a session\")\n .requiredOption(\"--session <id>\", \"Session ID\")\n .option(\"--json\", \"Output as JSON\")\n .action((opts) => {\n const stats = getMonitorLogStats(opts.session);\n\n if (!stats.exists) {\n if (opts.json) {\n console.log(JSON.stringify({ exists: false }));\n } else {\n console.log(`No monitor log found for session ${opts.session}`);\n }\n return;\n }\n\n const events = readMonitorLog(opts.session);\n const commands = pairCommands(events);\n const errors = commands.filter(\n (c) => c.exitCode != null && c.exitCode !== 0,\n ).length;\n\n const meta = events.find(\n (e) => e.type === \"monitor_meta\" && e.event === \"start\",\n );\n const stopped = events.some(\n (e) => e.type === \"monitor_meta\" && e.event === \"stop\",\n );\n\n const result = {\n sessionId: opts.session,\n exists: true,\n active: !stopped,\n shell: meta?.shell ?? \"unknown\",\n totalCommands: commands.length,\n errors,\n sizeBytes: stats.sizeBytes,\n timeSpan:\n commands.length > 0\n ? {\n start: commands[0].startedAt,\n end:\n commands[commands.length - 1].endedAt ??\n commands[commands.length - 1].startedAt,\n }\n : null,\n };\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log(`Monitor: ${opts.session}`);\n console.log(` Status: ${result.active ? \"active\" : \"stopped\"}`);\n console.log(` Shell: ${result.shell}`);\n console.log(` Commands: ${result.totalCommands}`);\n console.log(` Errors: ${result.errors}`);\n if (result.timeSpan) {\n console.log(` From: ${result.timeSpan.start}`);\n console.log(` To: ${result.timeSpan.end}`);\n }\n });\n\n// ── zam monitor open ─────────────────────────────────────────────────────\n\nfunction buildMonitorSetupCommand(\n dir: string,\n sessionId: string,\n shell: MonitorShell,\n): string {\n const zamInvocation = resolveZamInvocation(shell);\n if (isPowerShellShell(shell)) {\n return [\n `Set-Location -LiteralPath ${psSingleQuoted(dir)}`,\n `$__zamHook = ${zamInvocation} monitor start --session ${psSingleQuoted(sessionId)} --shell ${shell}`,\n \"Invoke-Expression ($__zamHook -join [Environment]::NewLine)\",\n \"Remove-Variable __zamHook\",\n ].join(\"; \");\n }\n\n return `cd ${JSON.stringify(dir)} && eval \"$(${zamInvocation} monitor start --session ${sessionId} --shell ${shell})\"`;\n}\n\nmonitorCommand\n .command(\"open\")\n .description(\"Open a new monitored terminal window for a session\")\n .requiredOption(\"--session <id>\", \"Session ID to monitor\")\n .option(\"--dir <path>\", \"Working directory (defaults to cwd)\")\n .option(\n \"--shell <type>\",\n \"Shell type: zsh | bash | pwsh | powershell (auto-detected)\",\n )\n .action(async (opts) => {\n let shell: MonitorShell;\n try {\n shell = normalizeShell(opts.shell);\n } catch (err) {\n console.error(`Error: ${(err as Error).message}`);\n process.exit(1);\n }\n\n // Validate session exists\n let db: Database | undefined;\n try {\n db = await openDatabase();\n const session = (await db\n .prepare(\"SELECT id, completed_at FROM sessions WHERE id = ?\")\n .get(opts.session)) as\n | { id: string; completed_at: string | null }\n | undefined;\n\n if (!session) {\n console.error(`Error: Session not found: ${opts.session}`);\n process.exit(1);\n }\n if (session.completed_at) {\n console.error(`Error: Session already completed: ${opts.session}`);\n process.exit(1);\n }\n\n // Save monitor preference so the agent knows to default to terminal\n if (!(await getSetting(db, \"monitor_method\"))) {\n await setSetting(db, \"monitor_method\", \"terminal\");\n }\n } catch (err) {\n console.error(`Error: ${(err as Error).message}`);\n process.exit(1);\n } finally {\n await db?.close();\n }\n\n const dir = opts.dir ?? process.cwd();\n const shellSetup = buildMonitorSetupCommand(dir, opts.session, shell);\n\n openTerminalWindow({\n shellSetup,\n label: `monitor-${opts.session}`,\n dir,\n shell,\n });\n });\n","/**\n * `zam observer` — configure what the UI observer may capture (Layer 2 of the\n * two-layer consent model; see docs/adr/0001-observer-permission-model.md).\n *\n * Thin sugar over the `observer.*` settings that also keeps the native sidecar's\n * policy file in sync after every change. `grant`/`revoke` manage the allowlist\n * by process name; deny a specific app with `zam settings set observer.denylist`.\n */\n\nimport { Command } from \"commander\";\nimport {\n getSetting,\n parseObserverList,\n resolveObserverPolicy,\n setSetting,\n syncObserverSidecarPolicy,\n} from \"../../kernel/index.js\";\nimport { withDb } from \"./shared/db.js\";\n\nexport const observerCommand = new Command(\"observer\").description(\n \"Configure what the UI observer may capture (Layer 2 policy)\",\n);\n\n/**\n * Pure: add or remove an entry in a comma-separated observer list setting,\n * normalized (trimmed, lower-cased, de-duplicated) exactly like the policy\n * resolver parses it.\n */\nexport function applyObserverListChange(\n current: string | undefined,\n entry: string,\n op: \"add\" | \"remove\",\n): string {\n const normalized = entry.trim().toLowerCase();\n const list = parseObserverList(current);\n const next =\n op === \"add\"\n ? [...new Set([...list, normalized])]\n : list.filter((item) => item !== normalized);\n return next.join(\",\");\n}\n\n// ── zam observer status ────────────────────────────────────────────────────\n\nobserverCommand\n .command(\"status\")\n .description(\"Show the active observer policy\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const policy = await resolveObserverPolicy(db);\n if (opts.json) {\n console.log(JSON.stringify(policy, null, 2));\n return;\n }\n console.log(\"Observer policy:\\n\");\n console.log(` Scope: ${policy.scope}`);\n console.log(` Consent: ${policy.consent}`);\n console.log(` Retention: ${policy.retention}`);\n console.log(\n ` Allowlist: ${\n policy.allowlist.length\n ? policy.allowlist.join(\", \")\n : \"(any targeted window)\"\n }`,\n );\n console.log(\n ` Denylist: ${\n policy.denylist.length ? policy.denylist.join(\", \") : \"(none)\"\n }`,\n );\n console.log(` Redact titles: ${policy.redactWindowTitles}`);\n console.log(\n \"\\nBuilt-in sensitive surfaces (password managers, auth/UAC dialogs, \" +\n \"banking) are always refused and cannot be allowlisted.\",\n );\n });\n });\n\n// ── zam observer grant <process> ─────────────────────────────────────────────\n\nobserverCommand\n .command(\"grant <process>\")\n .description(\n \"Allow the observer to capture a process (adds it to observer.allowlist)\",\n )\n .action(async (processName: string) => {\n await withDb(async (db) => {\n const next = applyObserverListChange(\n await getSetting(db, \"observer.allowlist\"),\n processName,\n \"add\",\n );\n await setSetting(db, \"observer.allowlist\", next);\n await syncObserverSidecarPolicy(db);\n console.log(`Granted: ${processName.trim().toLowerCase()}`);\n console.log(`observer.allowlist = ${next || \"(empty)\"}`);\n });\n });\n\n// ── zam observer revoke <process> ────────────────────────────────────────────\n\nobserverCommand\n .command(\"revoke <process>\")\n .description(\"Remove a process from observer.allowlist\")\n .action(async (processName: string) => {\n await withDb(async (db) => {\n const next = applyObserverListChange(\n await getSetting(db, \"observer.allowlist\"),\n processName,\n \"remove\",\n );\n await setSetting(db, \"observer.allowlist\", next);\n await syncObserverSidecarPolicy(db);\n console.log(`Revoked: ${processName.trim().toLowerCase()}`);\n console.log(`observer.allowlist = ${next || \"(empty)\"}`);\n });\n });\n","/**\n * `zam profile` — show or change this machine's ZAM install profile.\n *\n * Surfaces where everything lives so a non-developer never has to guess:\n * - install mode (developer vs default),\n * - the personal-content folder (beliefs/goals/identity), which may sit in a\n * file-synced directory (Drive, OneDrive, Dropbox, iCloud) — no GitHub,\n * - the data directory and database path.\n *\n * (Increment 12, Phase 3.)\n */\n\nimport { dirname, resolve } from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n type Database,\n detectSyncProvider,\n getDefaultDbPath,\n getInstallMode,\n type InstallMode,\n openDatabaseWithSync,\n setInstallMode,\n} from \"../../kernel/index.js\";\nimport {\n activateWorkspacePath,\n ensureActiveWorkspace,\n} from \"../workspaces/active.js\";\n\nconst C = {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n cyan: \"\\x1b[36m\",\n dim: \"\\x1b[2m\",\n green: \"\\x1b[32m\",\n};\n\ninterface Profile {\n mode: InstallMode;\n personalDir: string;\n syncProvider: string | null;\n dataDir: string;\n dbPath: string;\n}\n\nfunction render(profile: Profile): void {\n const sync = profile.syncProvider\n ? `${C.green}${profile.syncProvider}${C.reset} ${C.dim}(good for cross-device snapshots)${C.reset}`\n : `${C.dim}local folder (use a synced folder or snapshots to move between machines)${C.reset}`;\n\n console.log(`${C.bold}ZAM install profile${C.reset}`);\n console.log(` mode: ${C.cyan}${profile.mode}${C.reset}`);\n console.log(` personal dir: ${C.cyan}${profile.personalDir}${C.reset}`);\n console.log(` sync: ${sync}`);\n console.log(` data dir: ${C.cyan}${profile.dataDir}${C.reset}`);\n console.log(` database: ${C.cyan}${profile.dbPath}${C.reset}`);\n}\n\nexport const profileCommand = new Command(\"profile\")\n .description(\"Show or change this machine's ZAM install profile\")\n .option(\"--mode <mode>\", \"Set install mode: developer | default\")\n .option(\"--dir <path>\", \"Set the personal-content folder\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (opts: { mode?: string; dir?: string; json?: boolean }) => {\n if (opts.mode && opts.mode !== \"developer\" && opts.mode !== \"default\") {\n console.error(`Invalid --mode: ${opts.mode}. Use developer or default.`);\n process.exit(1);\n }\n\n let db: Database | undefined;\n try {\n if (opts.mode) setInstallMode(opts.mode as InstallMode);\n\n db = await openDatabaseWithSync({ initialize: true });\n if (opts.dir) {\n await activateWorkspacePath(db, resolve(opts.dir), {\n kind: \"personal\",\n label: \"Personal\",\n });\n }\n const personalDir = (await ensureActiveWorkspace(db)).path;\n await db.close();\n db = undefined;\n\n const dbPath = getDefaultDbPath();\n const profile: Profile = {\n mode: getInstallMode(),\n personalDir,\n syncProvider: detectSyncProvider(personalDir),\n dataDir: dirname(dbPath),\n dbPath,\n };\n\n if (opts.json) {\n console.log(JSON.stringify(profile, null, 2));\n return;\n }\n render(profile);\n } catch (err) {\n await db?.close();\n console.error(\"Error:\", (err as Error).message);\n process.exit(1);\n }\n });\n","/**\n * `zam provider` — Configure role-based AI providers (ADR 2026-06-23).\n *\n * Providers are named endpoint records in the `llm.providers` setting, bound to\n * roles (vision/recall/text) via `llm.roles`. API keys never live in the DB or\n * the provider record: they go to `~/.zam/credentials.json` under an `apiKeyRef`\n * (see `src/kernel/credentials.ts`), so workspace exports never carry secrets.\n *\n * This command is the entry path that makes `apiKeyRef` usable — previously the\n * kernel could read a stored key but nothing could write one.\n */\n\nimport { password } from \"@inquirer/prompts\";\nimport { Command } from \"commander\";\nimport {\n clearProviderApiKey,\n getProviderApiKey,\n listProviderApiKeyRefs,\n setProviderApiKey,\n} from \"../../kernel/index.js\";\nimport { type ApiFlavor, inferApiFlavor } from \"../llm/client.js\";\nimport {\n bindRoleProviders,\n buildProviderListing,\n findOrphanKeyRefs,\n maskSecret,\n readScopedProviders,\n readScopedRoles,\n removeProviderRecord,\n rolesReferencing,\n upsertProviderRecord,\n VALID_API_FLAVORS,\n VALID_ROLES,\n withProviderScope,\n writeScopedProviders,\n writeScopedRoles,\n} from \"../providers/config.js\";\n\n// ── Command ──────────────────────────────────────────────────────────────────\n\nexport const providerCommand = new Command(\"provider\").description(\n \"Configure role-based AI providers (url/model/flavor/key, per role)\",\n);\n\n// ── zam provider list ────────────────────────────────────────────────────────\n\nproviderCommand\n .command(\"list\")\n .description(\"Show configured providers, role bindings, and key status\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--machine\", \"Read machine-local providers from ~/.zam/config.json\")\n .action(async (opts) => {\n const machine = Boolean(opts.machine);\n await withProviderScope(machine, async (db) => {\n const providers = await readScopedProviders(db, machine);\n const roles = await readScopedRoles(db, machine);\n const rows = buildProviderListing(\n providers,\n (ref) => getProviderApiKey(ref) !== null,\n );\n const orphans = findOrphanKeyRefs(listProviderApiKeyRefs(), providers);\n\n if (opts.json) {\n console.log(\n JSON.stringify(\n {\n scope: machine ? \"machine\" : \"shared\",\n providers: rows,\n roles,\n orphans,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n console.log(\n `Providers (${opts.machine ? \"~/.zam/config.json ai.providers\" : \"llm.providers\"}):\\n`,\n );\n if (rows.length === 0) {\n console.log(\n \" (none) — add one: zam provider add <name> --url <url> --model <model>\",\n );\n } else {\n for (const row of rows) {\n const key =\n row.keyState === \"set\"\n ? \"\\x1b[32mkey ✓\\x1b[0m\"\n : row.keyState === \"missing\"\n ? `\\x1b[31mkey ✗ (set: zam provider set-key ${row.apiKeyRef})\\x1b[0m`\n : \"\\x1b[90mno key\\x1b[0m\";\n console.log(` \\x1b[36m${row.name.padEnd(12)}\\x1b[0m ${key}`);\n console.log(` url: ${row.url ?? \"(inherits llm.url)\"}`);\n console.log(` model: ${row.model ?? \"(inherits llm.model)\"}`);\n console.log(` flavor: ${row.apiFlavor}`);\n if (row.label) console.log(` label: ${row.label}`);\n if (row.local !== undefined) {\n console.log(` local: ${row.local ? \"yes\" : \"no\"}`);\n }\n if (row.runner) console.log(` runner: ${row.runner}`);\n if (row.apiKeyRef) console.log(` key-ref: ${row.apiKeyRef}`);\n }\n }\n\n console.log(\"\\nRoles (llm.roles):\\n\");\n for (const role of VALID_ROLES) {\n const binding = roles[role];\n if (!binding?.primary) {\n console.log(` ${role.padEnd(7)} \\x1b[90m(unset)\\x1b[0m`);\n } else {\n const fb = binding.fallback ? ` → fallback: ${binding.fallback}` : \"\";\n console.log(` ${role.padEnd(7)} primary: ${binding.primary}${fb}`);\n }\n }\n\n if (orphans.length > 0) {\n console.log(\n `\\n\\x1b[33mOrphan keys (stored but unreferenced):\\x1b[0m ${orphans.join(\", \")}`,\n );\n }\n });\n });\n\n// ── zam provider add ─────────────────────────────────────────────────────────\n\nproviderCommand\n .command(\"add <name>\")\n .description(\"Add or update a provider record in llm.providers\")\n .option(\"--label <label>\", \"Human-readable provider label\")\n .option(\"--url <url>\", \"Endpoint base URL (e.g. https://api.deepseek.com/v1)\")\n .option(\"--model <model>\", \"Model id (e.g. deepseek-v4-flash)\")\n .option(\"--local\", \"Mark this provider as a local/on-device endpoint\")\n .option(\n \"--runner <runner>\",\n \"Local runner hint (flm, foundry-local, ollama, ...)\",\n )\n .option(\n \"--flavor <flavor>\",\n `Wire protocol: ${VALID_API_FLAVORS.join(\" | \")} (default: inferred from URL)`,\n )\n .option(\n \"--key-ref <ref>\",\n \"Credential reference for the API key (default: <name> when --key is given)\",\n )\n .option(\n \"--key <value>\",\n \"Store this API key now (prefer `set-key` to keep it out of shell history)\",\n )\n .option(\"--machine\", \"Store this provider in ~/.zam/config.json\")\n .action(async (name, opts) => {\n let apiFlavor: ApiFlavor | undefined;\n if (opts.flavor) {\n if (!VALID_API_FLAVORS.includes(opts.flavor)) {\n console.error(\n `Invalid --flavor: ${opts.flavor}. Use ${VALID_API_FLAVORS.join(\" or \")}.`,\n );\n process.exit(1);\n }\n apiFlavor = opts.flavor;\n }\n const apiKeyRef: string | undefined =\n opts.keyRef ?? (opts.key ? name : undefined);\n\n const machine = Boolean(opts.machine);\n await withProviderScope(machine, async (db) => {\n const providers = await readScopedProviders(db, machine);\n const next = upsertProviderRecord(providers, name, {\n label: opts.label,\n url: opts.url,\n model: opts.model,\n apiFlavor,\n apiKeyRef,\n local: opts.local ? true : undefined,\n runner: opts.runner,\n });\n await writeScopedProviders(db, machine, next);\n if (opts.key && apiKeyRef) setProviderApiKey(apiKeyRef, opts.key);\n\n const rec = next[name];\n console.log(\n `Provider \"${name}\" saved (${machine ? \"machine-local\" : \"shared\"}):`,\n );\n console.log(` url: ${rec.url ?? \"(inherits llm.url)\"}`);\n console.log(` model: ${rec.model ?? \"(inherits llm.model)\"}`);\n if (rec.label) console.log(` label: ${rec.label}`);\n if (rec.local !== undefined) {\n console.log(` local: ${rec.local ? \"yes\" : \"no\"}`);\n }\n if (rec.runner) console.log(` runner: ${rec.runner}`);\n console.log(\n ` flavor: ${\n rec.apiFlavor ??\n `${rec.url ? inferApiFlavor(rec.url) : \"chat-completions\"} (inferred)`\n }`,\n );\n console.log(` key-ref: ${rec.apiKeyRef ?? \"(none — uses default key)\"}`);\n if (opts.key) {\n console.log(` key: stored (${maskSecret(opts.key)})`);\n } else if (rec.apiKeyRef && getProviderApiKey(rec.apiKeyRef) === null) {\n console.log(\n `\\n ⚠ No key stored for \"${rec.apiKeyRef}\". Run: zam provider set-key ${rec.apiKeyRef}`,\n );\n }\n if (!rec.url) {\n console.log(\n \"\\n ⚠ No --url set; this provider inherits the base llm.url.\",\n );\n }\n console.log(\n `\\nBind it to a role: zam provider use recall --primary ${name}`,\n );\n });\n });\n\n// ── zam provider remove ──────────────────────────────────────────────────────\n\nproviderCommand\n .command(\"remove <name>\")\n .description(\"Remove a provider record from llm.providers\")\n .option(\"--machine\", \"Remove from ~/.zam/config.json instead of the DB\")\n .action(async (name, opts) => {\n const machine = Boolean(opts.machine);\n await withProviderScope(machine, async (db) => {\n const providers = await readScopedProviders(db, machine);\n const { providers: next, removed } = removeProviderRecord(\n providers,\n name,\n );\n if (!removed) {\n console.log(`No such provider: ${name}`);\n return;\n }\n await writeScopedProviders(db, machine, next);\n console.log(\n `Removed provider \"${name}\" (${machine ? \"machine-local\" : \"shared\"}).`,\n );\n\n const referencing = rolesReferencing(\n await readScopedRoles(db, machine),\n name,\n );\n if (referencing.length > 0) {\n console.log(\n ` ⚠ Still referenced by role(s): ${referencing.join(\", \")} — rebind with: zam provider use <role> --primary <name>`,\n );\n }\n });\n });\n\n// ── zam provider use ─────────────────────────────────────────────────────────\n\nproviderCommand\n .command(\"use <role>\")\n .description(`Bind providers to a role (${VALID_ROLES.join(\" | \")})`)\n .option(\"--primary <name>\", \"Primary provider\")\n .option(\"--fallback <name>\", \"Fallback provider (optional)\")\n .option(\"--machine\", \"Bind the role in ~/.zam/config.json\")\n .action(async (role, opts) => {\n if (!VALID_ROLES.includes(role)) {\n console.error(`Invalid role: ${role}. Use ${VALID_ROLES.join(\", \")}.`);\n process.exit(1);\n }\n if (!opts.primary) {\n console.error(\"--primary is required.\");\n process.exit(1);\n }\n const machine = Boolean(opts.machine);\n await withProviderScope(machine, async (db) => {\n const providers = await readScopedProviders(db, machine);\n await writeScopedRoles(\n db,\n machine,\n bindRoleProviders(\n await readScopedRoles(db, machine),\n role,\n opts.primary,\n opts.fallback,\n ),\n );\n const fb = opts.fallback ? `, fallback: ${opts.fallback}` : \"\";\n console.log(\n `Role \"${role}\" → primary: ${opts.primary}${fb} (${machine ? \"machine-local\" : \"shared\"})`,\n );\n\n for (const [label, ref] of [\n [\"primary\", opts.primary],\n [\"fallback\", opts.fallback],\n ] as const) {\n if (ref && !(ref in providers)) {\n console.log(\n ` ⚠ ${label} \"${ref}\" is not a defined provider yet. Add it: zam provider add ${ref} --url <url> --model <model>`,\n );\n }\n }\n });\n });\n\n// ── zam provider set-key ─────────────────────────────────────────────────────\n\nproviderCommand\n .command(\"set-key <ref>\")\n .description(\n \"Store an API key for a provider reference (in credentials.json)\",\n )\n .option(\n \"--key <value>\",\n \"The API key (omit to enter it interactively, hidden)\",\n )\n .action(async (ref, opts) => {\n try {\n const key: string =\n opts.key ?? (await password({ message: `API key for \"${ref}\":` }));\n if (!key || key.trim().length === 0) {\n console.error(\"No key provided.\");\n process.exit(1);\n }\n setProviderApiKey(ref, key.trim());\n console.log(`Stored API key for \"${ref}\" (${maskSecret(key.trim())}).`);\n } catch (err) {\n if ((err as Error).name === \"ExitPromptError\") {\n console.log(\"\\nCancelled.\");\n process.exit(0);\n }\n console.error(\"Error:\", (err as Error).message);\n process.exit(1);\n }\n });\n\n// ── zam provider clear-key ───────────────────────────────────────────────────\n\nproviderCommand\n .command(\"clear-key <ref>\")\n .description(\"Remove a stored API key\")\n .action((ref) => {\n clearProviderApiKey(ref);\n console.log(`Cleared API key for \"${ref}\".`);\n });\n","/**\n * `zam review` — Interactive review session.\n */\n\nimport { Command } from \"commander\";\nimport type { BloomLevel, Database } from \"../../kernel/index.js\";\nimport {\n buildReviewQueue,\n generatePrompt,\n getKnowledgeContextByName,\n openDatabase,\n resolveReviewContext,\n} from \"../../kernel/index.js\";\nimport { formatHeader } from \"../learn-format.js\";\nimport { runInteractiveReviewAction } from \"../review-actions.js\";\nimport { resolveUser } from \"../users/identity.js\";\n\nexport const reviewCommand = new Command(\"review\")\n .description(\"Start an interactive review session\")\n .option(\"--user <id>\", \"User ID (default: whoami)\")\n .option(\"--max-new <n>\", \"Maximum new cards\", \"10\")\n .option(\"--max-reviews <n>\", \"Maximum review cards\", \"50\")\n .option(\"--no-resolve\", \"Skip resolving source_link into inline context\")\n .option(\n \"--knowledge-context <context>\",\n \"Filter review queue by knowledge context\",\n )\n .action(async (opts) => {\n let db: Database | undefined;\n try {\n db = await openDatabase();\n const userId = await resolveUser(opts, db);\n\n // ADR Decision 4: without an explicit --knowledge-context the queue\n // stays unscoped (everything, interleaved). The device default drives\n // generation defaults only, never review eligibility.\n let resolvedContext: string | undefined;\n if (opts.knowledgeContext) {\n const context = await getKnowledgeContextByName(\n db,\n opts.knowledgeContext,\n );\n if (!context) {\n throw new Error(\n `Knowledge context not found: ${opts.knowledgeContext}`,\n );\n }\n resolvedContext = context.name;\n }\n\n const queue = await buildReviewQueue(db, {\n userId,\n maxNew: Number(opts.maxNew),\n maxReviews: Number(opts.maxReviews),\n knowledgeContext: resolvedContext,\n });\n\n if (queue.items.length === 0) {\n console.log(\"No cards due for review. You're all caught up!\");\n await db.close();\n return;\n }\n\n console.log(`\\nReview session: ${queue.items.length} card(s)`);\n if (resolvedContext) {\n console.log(` Context: ${resolvedContext}`);\n }\n console.log(\n ` New: ${queue.newCount} Review: ${queue.reviewCount} Relearn: ${queue.relearnCount}`,\n );\n console.log(` Domains: ${queue.totalDomains.join(\", \")}`);\n console.log();\n\n const _completed = 0;\n let stoppedEarly = false;\n let maintenanceActions = 0;\n const results: Array<{\n slug: string;\n rating: number;\n nextDue: string | undefined;\n }> = [];\n\n for (const [index, item] of queue.items.entries()) {\n const prompt = generatePrompt({\n cardId: item.cardId,\n tokenId: item.tokenId,\n slug: item.slug,\n concept: item.concept,\n domain: item.domain,\n bloomLevel: item.bloomLevel as BloomLevel,\n sourceLink: item.sourceLink,\n });\n\n console.log(\n `\\n[${index + 1}/${queue.items.length}] ${formatHeader({ bloomLevel: item.bloomLevel, domain: item.domain })}`,\n );\n if (prompt.sourceLink) {\n console.log(`Source: ${prompt.sourceLink}`);\n if (opts.resolve !== false) {\n const ctx = await resolveReviewContext(item.sourceLink, {\n maxChars: 1200,\n }).catch(() => null);\n if (ctx && ctx.sourceType === \"dynamic_search\") {\n console.log(` ↳ ${ctx.content}`);\n } else if (ctx?.content.trim()) {\n const indented = ctx.content\n .trimEnd()\n .split(\"\\n\")\n .map((line) => ` │ ${line}`)\n .join(\"\\n\");\n console.log(\" Context:\");\n console.log(indented);\n if (ctx.truncated) {\n console.log(\" │ … (truncated)\");\n }\n }\n }\n }\n console.log(`\\n ${prompt.question}\\n`);\n\n const action = await runInteractiveReviewAction({\n db,\n userId,\n item,\n mode: \"review\",\n });\n\n if (action.action === \"stop\") {\n stoppedEarly = true;\n console.log(\"\\nStopping review.\");\n break;\n }\n\n if (action.action === \"rate\") {\n results.push({\n slug: item.slug,\n rating: action.rating!,\n nextDue: action.result.evaluation?.nextDueAt,\n });\n } else if (action.action !== \"skip\") {\n maintenanceActions++;\n }\n }\n\n // Session summary\n console.log(`\\n${\"═\".repeat(50)}`);\n console.log(\n stoppedEarly ? \"Review session ended.\" : \"Review session complete!\",\n );\n console.log(` Cards rated: ${results.length}`);\n if (maintenanceActions > 0) {\n console.log(` Maintenance actions: ${maintenanceActions}`);\n }\n\n if (results.length > 0) {\n const avgRating =\n results.reduce((s, r) => s + r.rating, 0) / results.length;\n console.log(` Average rating: ${avgRating.toFixed(1)}`);\n\n const forgot = results.filter((r) => r.rating === 1).length;\n if (forgot > 0) {\n console.log(` Forgot: ${forgot} card(s)`);\n }\n }\n\n await db.close();\n } catch (err) {\n await db?.close();\n // User cancelled with Ctrl+C — exit gracefully\n if ((err as Error).name === \"ExitPromptError\") {\n console.log(\"\\nReview session cancelled.\");\n process.exit(0);\n }\n console.error(\"Error:\", (err as Error).message);\n process.exit(1);\n }\n });\n","/**\n * `zam session` — Session management subcommand group.\n *\n * Session start follows the two-phase flow from Increment 2:\n * Phase 1 — Repetition: review due cards (pure recall first, skippable)\n * Phase 2 — Task execution: pick a work item from ADO or enter a custom task\n */\n\nimport { readFileSync } from \"node:fs\";\nimport { input, select } from \"@inquirer/prompts\";\nimport { Command } from \"commander\";\nimport type {\n BloomLevel,\n Database,\n ExecutionContext,\n Rating,\n SynthesisConfidence,\n TokenPattern,\n} from \"../../kernel/index.js\";\nimport {\n applySessionSynthesis,\n buildReviewQueue,\n endSession,\n fetchActiveWorkItems,\n generatePrompt,\n getSessionSummary,\n getTokenBySlug,\n isObserverPolicyConfigured,\n loadADOConfig,\n logStep,\n OBSERVER_POLICY_UNSET_HINT,\n openDatabase,\n prepareSessionSynthesis,\n startSession,\n} from \"../../kernel/index.js\";\nimport { formatHeader } from \"../learn-format.js\";\nimport { runInteractiveReviewAction } from \"../review-actions.js\";\nimport { resolveUser } from \"../users/identity.js\";\nimport { withDb } from \"./shared/db.js\";\n\nexport const sessionCommand = new Command(\"session\").description(\n \"Manage learning sessions\",\n);\n\n// ── zam session start ─────────────────────────────────────────────────────\n\nsessionCommand\n .command(\"start\")\n .description(\"Start a new learning session (review → task)\")\n .option(\"--user <id>\", \"User ID (default: whoami)\")\n .option(\"--task <description>\", \"Task description (interactive if omitted)\")\n .option(\n \"--context <level>\",\n \"Execution context: shell | ui | reallife (default: shell)\",\n \"shell\",\n )\n .option(\n \"--skip-review\",\n \"Skip the repetition phase and go straight to task selection\",\n )\n .option(\n \"--review-minutes <n>\",\n \"Maximum minutes for the repetition phase (default: 20)\",\n \"20\",\n )\n .option(\"--json\", \"Output as JSON\")\n .option(\"--quiet\", \"Output only the session ID\")\n .action(async (opts) => {\n let db: Database | undefined;\n try {\n db = await openDatabase();\n\n const validContexts = [\"shell\", \"ui\", \"reallife\"];\n if (!validContexts.includes(opts.context)) {\n console.error(\n `Invalid context: ${opts.context}. Must be one of: ${validContexts.join(\", \")}`,\n );\n process.exit(1);\n }\n\n const userId = await resolveUser(opts, db);\n const reviewMinutes = Number(opts.reviewMinutes);\n\n // ── Phase 1: Repetition ────────────────────────────────────────────\n if (!opts.skipReview && !opts.quiet && !opts.json) {\n const reviewResults = await runRepetitionPhase(\n db,\n userId,\n reviewMinutes,\n );\n if (reviewResults.reviewed > 0) {\n console.log();\n }\n }\n\n // ── Phase 2: Task Selection ────────────────────────────────────────\n let task: string = opts.task;\n\n if (!task && !opts.quiet && !opts.json) {\n task = await selectTask();\n }\n\n if (!task) {\n // Fallback for --quiet/--json without --task\n console.error(\n \"Task description is required. Use --task or run interactively.\",\n );\n process.exit(1);\n }\n\n const session = await startSession(db, {\n user_id: userId,\n task,\n execution_context: opts.context as ExecutionContext,\n });\n\n const observerHint =\n opts.context === \"ui\" && !(await isObserverPolicyConfigured(db))\n ? OBSERVER_POLICY_UNSET_HINT\n : null;\n\n await db.close();\n\n if (opts.quiet) {\n console.log(session.id);\n } else if (opts.json) {\n console.log(\n JSON.stringify(\n observerHint\n ? { ...session, observerPolicyHint: observerHint }\n : session,\n null,\n 2,\n ),\n );\n } else {\n console.log(`\\nSession started: ${session.id}`);\n console.log(` User: ${session.user_id}`);\n console.log(` Task: ${session.task}`);\n console.log(` Context: ${session.execution_context}`);\n console.log(` Started: ${session.started_at}`);\n if (observerHint) {\n console.log(`\\n${observerHint}`);\n }\n }\n } catch (err) {\n await db?.close();\n if ((err as Error).name === \"ExitPromptError\") {\n console.log(\"\\nSession cancelled.\");\n process.exit(0);\n }\n console.error(\"Error:\", (err as Error).message);\n process.exit(1);\n }\n });\n\n// ── Phase 1: Repetition ─────────────────────────────────────────────────────\n\ninterface RepetitionResult {\n reviewed: number;\n maintained: number;\n skipped: boolean;\n}\n\nasync function runRepetitionPhase(\n db: Database,\n userId: string,\n maxMinutes: number,\n): Promise<RepetitionResult> {\n const queue = await buildReviewQueue(db, { userId });\n\n if (queue.items.length === 0) {\n console.log(\"No cards due for review — moving to task selection.\\n\");\n return { reviewed: 0, maintained: 0, skipped: false };\n }\n\n console.log(\"═\".repeat(50));\n console.log(\"Phase 1: Repetition\");\n console.log(\"═\".repeat(50));\n console.log(`${queue.items.length} card(s) due`);\n console.log(\n ` New: ${queue.newCount} Review: ${queue.reviewCount} Relearn: ${queue.relearnCount}`,\n );\n console.log(` Domains: ${queue.totalDomains.join(\", \")}`);\n console.log(` Time limit: ${maxMinutes} minutes (skip anytime with 's')`);\n console.log();\n\n const startTime = Date.now();\n const timeLimitMs = maxMinutes * 60 * 1000;\n let reviewed = 0;\n let maintained = 0;\n\n for (const [index, item] of queue.items.entries()) {\n // Check time limit\n if (Date.now() - startTime >= timeLimitMs) {\n console.log(\n `\\nTime limit reached (${maxMinutes} min). Moving to task selection.`,\n );\n break;\n }\n\n const prompt = generatePrompt({\n cardId: item.cardId,\n tokenId: item.tokenId,\n slug: item.slug,\n concept: item.concept,\n domain: item.domain,\n bloomLevel: item.bloomLevel as BloomLevel,\n });\n\n const elapsed = Math.round((Date.now() - startTime) / 60000);\n console.log(\n `[${index + 1}/${queue.items.length}] ${formatHeader({ bloomLevel: item.bloomLevel, domain: item.domain })} (${elapsed}/${maxMinutes} min)`,\n );\n console.log(`\\n ${prompt.question}\\n`);\n\n const action = await runInteractiveReviewAction({\n db,\n userId,\n item,\n mode: \"session\",\n });\n\n if (action.action === \"stop\") {\n console.log(\"Stopping review and moving to task selection.\");\n return { reviewed, maintained, skipped: true };\n }\n\n if (action.action === \"rate\") {\n reviewed++;\n } else if (action.action !== \"skip\") {\n maintained++;\n }\n }\n\n if (reviewed > 0 || maintained > 0) {\n console.log(\"─\".repeat(50));\n console.log(`Repetition complete — ${reviewed} card(s) rated.`);\n if (maintained > 0) {\n console.log(`Maintenance actions: ${maintained}`);\n }\n }\n\n return { reviewed, maintained, skipped: false };\n}\n\n// ── Phase 2: Task Selection ─────────────────────────────────────────────────\n\nasync function selectTask(): Promise<string> {\n console.log(\"═\".repeat(50));\n console.log(\"Phase 2: Task Selection\");\n console.log(\"═\".repeat(50));\n\n const adoConfig = loadADOConfig();\n\n if (adoConfig) {\n const items = await fetchActiveWorkItems(adoConfig);\n\n if (items.length > 0) {\n const choices = items.map((wi) => ({\n name: `[${wi.type}] ${wi.title} (${wi.state})`,\n value: `[ADO-${wi.id}] ${wi.title}`,\n }));\n choices.push({ name: \"Enter a custom task...\", value: \"__custom__\" });\n\n const picked = await select({\n message: `${items.length} active work item(s) — pick one:`,\n choices,\n });\n\n if (picked !== \"__custom__\") return picked;\n } else {\n console.log(\"No active work items found in Azure DevOps.\");\n }\n }\n\n return input({ message: \"Task description:\" });\n}\n\n// ── Session synthesis ───────────────────────────────────────────────────────\n\nconst RATING_LABELS: Record<Rating, string> = {\n 1: \"Again\",\n 2: \"Hard\",\n 3: \"Good\",\n 4: \"Easy\",\n};\n\nfunction loadPatternFile(path: string | undefined): TokenPattern[] {\n if (!path) return [];\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(readFileSync(path, \"utf-8\"));\n } catch (err) {\n throw new Error(\n `Cannot read synthesis patterns from ${path}: ${(err as Error).message}`,\n );\n }\n\n const patterns =\n typeof parsed === \"object\" &&\n parsed !== null &&\n \"patterns\" in parsed &&\n Array.isArray(parsed.patterns)\n ? parsed.patterns\n : parsed;\n\n if (!Array.isArray(patterns)) {\n throw new Error(\n \"Synthesis pattern file must contain an array or { patterns: [...] }\",\n );\n }\n\n return patterns.map((entry: unknown, index: number) => {\n if (\n typeof entry !== \"object\" ||\n entry === null ||\n !(\"slug\" in entry) ||\n typeof entry.slug !== \"string\" ||\n !(\"patterns\" in entry) ||\n !Array.isArray(entry.patterns) ||\n !entry.patterns.every((pattern) => typeof pattern === \"string\")\n ) {\n throw new Error(\n `Invalid synthesis pattern at index ${index}: expected { slug, patterns[] }`,\n );\n }\n return { slug: entry.slug, patterns: entry.patterns };\n });\n}\n\nasync function runSynthesisPhase(\n db: Database,\n sessionId: string,\n options: {\n patternFile?: string;\n minConfidence: SynthesisConfidence;\n },\n): Promise<number> {\n const preview = await prepareSessionSynthesis(db, {\n sessionId,\n explicitPatterns: loadPatternFile(options.patternFile),\n minConfidence: options.minConfidence,\n });\n\n console.log(\"\\nObservation synthesis\");\n console.log(\"─\".repeat(50));\n console.log(\n ` Commands: ${preview.commandCount} Token patterns: ${preview.patternCount}`,\n );\n if (preview.alreadyApplied > 0) {\n console.log(` Already applied: ${preview.alreadyApplied}`);\n }\n if (preview.skippedLowConfidence > 0) {\n console.log(\n ` Below ${options.minConfidence} confidence: ${preview.skippedLowConfidence}`,\n );\n }\n\n if (preview.patternCount === 0) {\n console.log(\n \" No token patterns found. Link tokens to agent skills or pass --patterns <file>.\",\n );\n return 0;\n }\n if (preview.candidates.length === 0) {\n console.log(\" No new medium/high-confidence ratings to confirm.\");\n return 0;\n }\n\n let applied = 0;\n for (const candidate of preview.candidates) {\n console.log(`\\n${candidate.tokenSlug}: ${candidate.concept}`);\n console.log(\n ` Suggested: ${candidate.inferredRating} - ${RATING_LABELS[candidate.inferredRating]} (${candidate.confidence} confidence)`,\n );\n console.log(\n ` Evidence: ${candidate.evidence.matchedCommands} command(s), ${candidate.evidence.errorCount} error(s), ${candidate.evidence.selfCorrections} correction(s)${candidate.evidence.helpSeeking ? \", help used\" : \"\"}`,\n );\n for (const command of candidate.matchedCommandTexts.slice(0, 5)) {\n console.log(` ${command}`);\n }\n\n const otherRatings = ([1, 2, 3, 4] as Rating[]).filter(\n (rating) => rating !== candidate.inferredRating,\n );\n const choice = await select<Rating | \"skip\">({\n message: `Confirm rating for ${candidate.tokenSlug}:`,\n choices: [\n {\n name: `Accept ${candidate.inferredRating} - ${RATING_LABELS[candidate.inferredRating]}`,\n value: candidate.inferredRating,\n },\n ...otherRatings.map((rating) => ({\n name: `Override with ${rating} - ${RATING_LABELS[rating]}`,\n value: rating,\n })),\n { name: \"Skip without changing learning state\", value: \"skip\" },\n ],\n });\n\n if (choice === \"skip\") {\n console.log(\" Skipped.\");\n continue;\n }\n\n const result = await applySessionSynthesis(db, {\n sessionId,\n tokenSlug: candidate.tokenSlug,\n inferredRating: candidate.inferredRating,\n confirmedRating: choice,\n confidence: candidate.confidence,\n evidence: candidate.evidence,\n matchedCommandTexts: candidate.matchedCommandTexts,\n });\n\n if (!result.applied) {\n console.log(\" Already applied; learning state unchanged.\");\n continue;\n }\n\n applied++;\n console.log(` Applied ${choice} - ${RATING_LABELS[choice]}.`);\n if (result.blocked) {\n console.log(\n ` Blocked ${result.blocked.blockedSlug}; prerequisites surfaced.`,\n );\n }\n }\n\n return applied;\n}\n\n// ── zam session log ───────────────────────────────────────────────────────\n\nsessionCommand\n .command(\"log\")\n .description(\"Log a step within a session\")\n .requiredOption(\"--session <id>\", \"Session ID\")\n .requiredOption(\"--token <slug>\", \"Token slug\")\n .requiredOption(\"--done-by <who>\", \"Who performed the step (user or agent)\")\n .option(\"--rating <n>\", \"Rating (1-4)\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--quiet\", \"Suppress output (exit code only)\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const token = await getTokenBySlug(db, opts.token);\n if (!token) {\n console.error(`Token not found: ${opts.token}`);\n process.exit(1);\n }\n\n const step = await logStep(db, {\n session_id: opts.session,\n token_id: token.id,\n done_by: opts.doneBy as \"user\" | \"agent\",\n rating: opts.rating ? Number(opts.rating) : undefined,\n });\n\n if (opts.quiet) return;\n if (opts.json) {\n console.log(JSON.stringify(step, null, 2));\n } else {\n console.log(`Step logged: ${step.id}`);\n console.log(` Token: ${opts.token}`);\n console.log(` Done by: ${step.done_by}`);\n if (step.rating != null) {\n console.log(` Rating: ${step.rating}`);\n }\n }\n });\n });\n\n// ── zam session end ───────────────────────────────────────────────────────\n\nsessionCommand\n .command(\"end\")\n .description(\"End a session and show summary\")\n .requiredOption(\"--session <id>\", \"Session ID\")\n .option(\n \"--synthesize\",\n \"Analyze monitor evidence and confirm ratings before ending\",\n )\n .option(\n \"--patterns <path>\",\n \"JSON file with additional { slug, patterns[] } mappings\",\n )\n .option(\n \"--min-confidence <level>\",\n \"Minimum synthesis confidence: medium | high\",\n \"medium\",\n )\n .option(\"--json\", \"Output as JSON\")\n .action(async (opts) => {\n await withDb(async (db) => {\n if (opts.patterns && !opts.synthesize) {\n throw new Error(\"--patterns requires --synthesize\");\n }\n if (opts.synthesize && opts.json) {\n throw new Error(\"--json cannot be combined with interactive synthesis\");\n }\n if (![\"medium\", \"high\"].includes(opts.minConfidence)) {\n throw new Error(\"--min-confidence must be medium or high\");\n }\n\n const before = await getSessionSummary(db, opts.session);\n if (opts.synthesize) {\n await runSynthesisPhase(db, opts.session, {\n patternFile: opts.patterns,\n minConfidence: opts.minConfidence as SynthesisConfidence,\n });\n }\n\n if (!before.session.completed_at) {\n await endSession(db, opts.session);\n } else if (!opts.synthesize) {\n throw new Error(`Session already completed: ${opts.session}`);\n }\n\n const summary = await getSessionSummary(db, opts.session);\n\n if (opts.json) {\n console.log(JSON.stringify(summary, null, 2));\n return;\n }\n\n console.log(`Session ${summary.session.id} completed.`);\n console.log(` Task: ${summary.session.task}`);\n console.log(` Started: ${summary.session.started_at}`);\n console.log(` Completed: ${summary.session.completed_at}`);\n console.log(` Steps: ${summary.steps.length}`);\n\n if (summary.steps.length > 0) {\n console.log(\"\\nSteps:\");\n console.log(\" Token Done by Rating Concept\");\n console.log(` ${\"─\".repeat(70)}`);\n for (const s of summary.steps) {\n console.log(\n ` ${s.slug.padEnd(21)} ${s.done_by.padEnd(8)} ${String(s.rating ?? \"-\").padEnd(7)} ${s.concept.slice(0, 30)}`,\n );\n }\n }\n });\n });\n","/**\n * `zam settings` — User settings management.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { Command } from \"commander\";\nimport {\n deleteSetting,\n getAllSettings,\n getAllSettingsDetailed,\n getRepoPaths,\n getSetting,\n setSetting,\n syncObserverSidecarPolicy,\n} from \"../../kernel/index.js\";\nimport { withDb } from \"./shared/db.js\";\n\nexport const settingsCommand = new Command(\"settings\").description(\n \"Manage user settings\",\n);\n\nconst BOOLEAN_SETTING_KEYS = new Set([\"llm.enabled\", \"llm.vision.enabled\"]);\n\nexport function normalizeSettingValue(key: string, value: string): string {\n if (!BOOLEAN_SETTING_KEYS.has(key)) return value;\n\n const lower = value.toLowerCase();\n if (\n lower === \"on\" ||\n lower === \"enable\" ||\n lower === \"enabled\" ||\n lower === \"true\"\n ) {\n return \"true\";\n }\n if (\n lower === \"off\" ||\n lower === \"disable\" ||\n lower === \"disabled\" ||\n lower === \"false\"\n ) {\n return \"false\";\n }\n return value;\n}\n\n// ── zam settings show ─────────────────────────────────────────────────────\n\nsettingsCommand\n .command(\"show\")\n .description(\"Show all settings\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (opts) => {\n await withDb(async (db) => {\n if (opts.json) {\n console.log(JSON.stringify(await getAllSettings(db), null, 2));\n return;\n }\n\n const settings = await getAllSettingsDetailed(db);\n if (settings.length === 0) {\n console.log(\"No settings configured.\");\n return;\n }\n\n console.log(\"Settings:\\n\");\n console.log(\"Key Value Updated\");\n console.log(\"─\".repeat(65));\n for (const s of settings) {\n console.log(\n `${s.key.padEnd(20)} ${s.value.padEnd(20)} ${s.updated_at}`,\n );\n }\n });\n });\n\n// ── zam settings get ──────────────────────────────────────────────────────\n\nsettingsCommand\n .command(\"get <key>\")\n .description(\"Get a single setting\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (key, opts) => {\n await withDb(async (db) => {\n const value = await getSetting(db, key);\n\n if (opts.json) {\n console.log(JSON.stringify({ key, value: value ?? null }));\n return;\n }\n\n if (value === undefined) {\n console.log(`Not set: ${key}`);\n } else {\n console.log(value);\n }\n });\n });\n\n// ── zam settings set ──────────────────────────────────────────────────────\n\nsettingsCommand\n .command(\"set <key> <value>\")\n .description(\"Set a setting\")\n .option(\"--quiet\", \"Suppress output\")\n .action(async (key, value, opts) => {\n await withDb(async (db) => {\n const parsedVal = normalizeSettingValue(key, value);\n await setSetting(db, key, parsedVal);\n if (key.startsWith(\"observer.\")) {\n // Keep the native sidecar's policy file in sync with observer.* settings.\n await syncObserverSidecarPolicy(db);\n }\n if (!opts.quiet) {\n console.log(`Set ${key} = ${parsedVal}`);\n }\n });\n });\n\n// ── zam settings delete ───────────────────────────────────────────────────\n\nsettingsCommand\n .command(\"delete <key>\")\n .description(\"Delete a setting\")\n .option(\"--quiet\", \"Suppress output\")\n .action(async (key, opts) => {\n await withDb(async (db) => {\n const deleted = await deleteSetting(db, key);\n if (key.startsWith(\"observer.\")) {\n // Regenerate the sidecar policy file after an observer.* change.\n await syncObserverSidecarPolicy(db);\n }\n if (!opts.quiet) {\n if (deleted) {\n console.log(`Deleted: ${key}`);\n } else {\n console.log(`Not found: ${key}`);\n }\n }\n });\n });\n\n// ── zam settings llm [state] ──────────────────────────────────────────────\n\nsettingsCommand\n .command(\"llm [state]\")\n .description(\n \"Quickly enable/disable or check local LLM integration (on/off/enable/disable)\",\n )\n .action(async (state) => {\n await withDb(async (db) => {\n if (!state) {\n const enabled = (await getSetting(db, \"llm.enabled\")) || \"false\";\n console.log(\n `LLM Integration is currently: ${\n enabled === \"true\"\n ? \"\\x1b[32mON (enabled)\\x1b[0m\"\n : \"\\x1b[31mOFF (disabled)\\x1b[0m\"\n }`,\n );\n return;\n }\n\n const lower = state.toLowerCase();\n let value = \"false\";\n if (\n lower === \"on\" ||\n lower === \"enable\" ||\n lower === \"enabled\" ||\n lower === \"true\"\n ) {\n value = \"true\";\n } else if (\n lower === \"off\" ||\n lower === \"disable\" ||\n lower === \"disabled\" ||\n lower === \"false\"\n ) {\n value = \"false\";\n } else {\n console.error(\n `Invalid state: ${state}. Use on, off, enable, or disable.`,\n );\n process.exit(1);\n }\n\n await setSetting(db, \"llm.enabled\", value);\n console.log(\n `LLM Integration is now: ${\n value === \"true\"\n ? \"\\x1b[32mON (enabled)\\x1b[0m\"\n : \"\\x1b[31mOFF (disabled)\\x1b[0m\"\n }`,\n );\n });\n });\n\n// ── zam settings locale [lang] ───────────────────────────────────────────\n\nsettingsCommand\n .command(\"locale [lang]\")\n .description(\n \"Quickly set or check manual ZAM language override (en/de/es/fr/pt/zh/ja)\",\n )\n .action(async (lang) => {\n await withDb(async (db) => {\n if (!lang) {\n const locale = (await getSetting(db, \"system.locale\")) || \"en\";\n console.log(`Active language (locale): \\x1b[36m${locale}\\x1b[0m`);\n return;\n }\n\n const lower = lang.toLowerCase();\n const supported = [\"en\", \"de\", \"es\", \"fr\", \"pt\", \"zh\", \"ja\"];\n if (!supported.includes(lower)) {\n console.error(\n `Invalid language code: ${lang}. Supported: ${supported.join(\", \")}`,\n );\n process.exit(1);\n }\n\n await setSetting(db, \"system.locale\", lower);\n console.log(`Language set to: \\x1b[32m${lower}\\x1b[0m`);\n });\n });\n\n// ── zam settings repos ───────────────────────────────────────────────────\n\nsettingsCommand\n .command(\"repos\")\n .description(\"Show or set Personal, Team, and Organization repository paths\")\n .option(\"--personal <path>\", \"Set the Personal Repository path\")\n .option(\"--team <path>\", \"Set the Team Repository path\")\n .option(\"--org <path>\", \"Set the Organization Repository path\")\n .action(async (opts) => {\n await withDb(async (db) => {\n let changed = false;\n\n if (opts.personal !== undefined) {\n await setSetting(db, \"repo.personal\", opts.personal);\n console.log(`Set repo.personal = ${opts.personal}`);\n changed = true;\n }\n if (opts.team !== undefined) {\n await setSetting(db, \"repo.team\", opts.team);\n console.log(`Set repo.team = ${opts.team}`);\n changed = true;\n }\n if (opts.org !== undefined) {\n await setSetting(db, \"repo.org\", opts.org);\n console.log(`Set repo.org = ${opts.org}`);\n changed = true;\n }\n\n if (changed) {\n console.log(\"\\nUpdated Repository Settings:\\n\");\n } else {\n console.log(\"Repository Settings:\\n\");\n }\n\n const paths = await getRepoPaths(db);\n console.log(\n `Personal Repo: ${\n paths.personal\n ? `\\x1b[32m${paths.personal}\\x1b[0m`\n : \"\\x1b[31mNot Configured\\x1b[0m\"\n }`,\n );\n console.log(\n `Team Repo: ${\n paths.team\n ? `\\x1b[32m${paths.team}\\x1b[0m`\n : \"\\x1b[31mNot Configured\\x1b[0m\"\n }`,\n );\n console.log(\n `Org Repo: ${\n paths.org\n ? `\\x1b[32m${paths.org}\\x1b[0m`\n : \"\\x1b[31mNot Configured\\x1b[0m\"\n }`,\n );\n\n // Check if folders exist\n console.log(\"\\nValidation:\");\n for (const [name, path] of Object.entries(paths)) {\n if (path) {\n const exists = existsSync(path);\n console.log(\n ` ${name.padEnd(9)}: ${\n exists\n ? \"\\x1b[32m✓ Valid folder\\x1b[0m\"\n : \"\\x1b[31m✗ Directory does not exist\\x1b[0m\"\n }`,\n );\n } else {\n console.log(` ${name.padEnd(9)}: \\x1b[33m- Not Set\\x1b[0m`);\n }\n }\n });\n });\n","/**\n * `zam setup` — Link skill directories from the ZAM package into the current\n * personal instance's agent skill directories, and optionally initialize the\n * ZAM database and generate agent-specific instruction files.\n *\n * Run this once after cloning a ZAM personal instance. Linked workspaces pick\n * up future ZAM updates automatically.\n */\n\nimport { resolve } from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n type Database,\n type DatabaseTargetInfo,\n getDatabaseTargetInfo,\n getMachineAiConfig,\n getSetting,\n openDatabaseWithSync,\n setSetting,\n} from \"../../kernel/index.js\";\nimport {\n parseSetupAgents,\n type SetupAgent,\n wireSkills,\n writeAgentsMd,\n writeClaudeMd,\n writeCopilotInstructions,\n} from \"../provisioning/index.js\";\n\nexport function formatDatabaseInitTarget(target: DatabaseTargetInfo): string {\n switch (target.kind) {\n case \"local\":\n return `ZAM database at ${target.location} (local SQLite)`;\n case \"turso-remote\":\n return `ZAM database via Turso remote at ${target.location}`;\n case \"turso-native\":\n return `ZAM database via Turso native driver at ${target.location}`;\n case \"turso-replica\":\n return `ZAM database replica at ${target.location} syncing from ${target.syncUrl}`;\n }\n}\n\nasync function initDatabase(skipInit: boolean): Promise<void> {\n if (skipInit) return;\n\n try {\n const target = getDatabaseTargetInfo();\n const db = await openDatabaseWithSync({ initialize: true });\n await activateMachineProviderConfig(db);\n await db.close();\n console.log(` init ${formatDatabaseInitTarget(target)}`);\n } catch (err) {\n // Database may already exist — not an error during setup.\n const msg = (err as Error).message;\n if (!msg.includes(\"already\")) {\n console.warn(` warn database init: ${msg}`);\n } else {\n console.log(` skip database already initialized`);\n }\n }\n}\n\nexport async function activateMachineProviderConfig(\n db: Database,\n): Promise<void> {\n const machineAi = getMachineAiConfig();\n const providerCount = Object.keys(machineAi.providers ?? {}).length;\n const roleCount = Object.keys(machineAi.roles ?? {}).length;\n if (providerCount === 0 && roleCount === 0) return;\n if ((await getSetting(db, \"llm.enabled\")) !== undefined) return;\n\n await setSetting(db, \"llm.enabled\", \"true\");\n console.log(\n ` activate ${providerCount} machine-local provider(s) from ~/.zam/config.json`,\n );\n}\n\nexport const setupCommand = new Command(\"setup\")\n .description(\n \"Link ZAM skill directories into this workspace and initialize the database\",\n )\n .option(\"--force\", \"replace an unmanaged existing ZAM skill directory\", false)\n .option(\"--skip-init\", \"skip database initialization\", false)\n .option(\"--skip-claude-md\", \"skip CLAUDE.md generation\", false)\n .option(\"--skip-agents-md\", \"skip AGENTS.md generation\", false)\n .option(\"--target <path>\", \"repository/workspace directory to set up\")\n .option(\n \"--agents <list>\",\n \"comma-separated agents to wire: all, claude, copilot, codex, agent\",\n )\n .option(\n \"--dry-run\",\n \"show what would be written without changing files\",\n false,\n )\n .action(\n async (opts: {\n force: boolean;\n skipInit: boolean;\n skipClaudeMd: boolean;\n skipAgentsMd: boolean;\n target?: string;\n agents?: string;\n dryRun: boolean;\n }) => {\n let agents: Set<SetupAgent>;\n try {\n agents = parseSetupAgents(opts.agents);\n } catch (err) {\n console.error(`Error: ${(err as Error).message}`);\n process.exit(1);\n }\n\n const target = resolve(opts.target ?? process.cwd());\n const updateExistingInstructions = Boolean(opts.target) || opts.force;\n console.log(\n `Setting up ZAM in ${target}${opts.dryRun ? \" (dry run)\" : \"\"}\\n`,\n );\n\n wireSkills(target, agents, {\n force: opts.force,\n dryRun: opts.dryRun,\n });\n await initDatabase(opts.skipInit || opts.dryRun);\n if (agents.has(\"claude\")) {\n writeClaudeMd(opts.skipClaudeMd, target, {\n dryRun: opts.dryRun,\n updateExisting: updateExistingInstructions,\n });\n }\n if (agents.has(\"codex\") || agents.has(\"agent\")) {\n writeAgentsMd(opts.skipAgentsMd, target, {\n dryRun: opts.dryRun,\n updateExisting: updateExistingInstructions,\n });\n }\n if (agents.has(\"copilot\") && (opts.target || opts.agents)) {\n writeCopilotInstructions(target, {\n dryRun: opts.dryRun,\n updateExisting: updateExistingInstructions,\n });\n }\n\n console.log(\n \"\\nDone. Run `zam whoami --set <your-id>` to set your identity. Start the `zam` skill with `/zam` in Claude/Copilot/Gemini-compatible clients or `$zam` (or `/skills`) in Codex.\",\n );\n },\n );\n","/**\n * `zam skill` — Manage agent skill entries (task recipes).\n */\n\nimport { Command } from \"commander\";\nimport {\n createAgentSkill,\n getAgentSkill,\n listAgentSkills,\n} from \"../../kernel/index.js\";\nimport { withDb } from \"./shared/db.js\";\n\nexport const skillCommand = new Command(\"skill\").description(\n \"Manage agent skill entries (task recipes)\",\n);\n\n// ── zam skill list ────────────────────────────────────────────────────────\n\nskillCommand\n .command(\"list\")\n .description(\"List all agent skills\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const skills = await listAgentSkills(db);\n\n if (opts.json) {\n console.log(JSON.stringify(skills, null, 2));\n return;\n }\n\n if (skills.length === 0) {\n console.log(\"No agent skills registered yet.\");\n return;\n }\n\n console.log(`Agent Skills (${skills.length})`);\n console.log(\"─\".repeat(60));\n for (const s of skills) {\n console.log(\n ` ${s.slug.padEnd(30)} [${s.source}] ${s.description.slice(0, 40)}`,\n );\n console.log(\n ` ${s.steps.length} step(s) tokens: ${s.token_slugs.join(\", \") || \"none\"}`,\n );\n }\n });\n });\n\n// ── zam skill show ────────────────────────────────────────────────────────\n\nskillCommand\n .command(\"show\")\n .description(\"Show a specific agent skill\")\n .requiredOption(\"--slug <slug>\", \"Skill slug\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const skill = await getAgentSkill(db, opts.slug);\n if (!skill) {\n console.error(`Skill not found: ${opts.slug}`);\n process.exit(1);\n }\n\n if (opts.json) {\n console.log(JSON.stringify(skill, null, 2));\n return;\n }\n\n console.log(`Skill: ${skill.slug}`);\n console.log(` Description: ${skill.description}`);\n console.log(` Source: ${skill.source}`);\n console.log(` Tokens: ${skill.token_slugs.join(\", \") || \"none\"}`);\n console.log(` Created: ${skill.created_at}`);\n console.log(`\\nSteps:`);\n skill.steps.forEach((step, i) => {\n console.log(` ${i + 1}. ${step}`);\n });\n });\n });\n\n// ── zam skill add ─────────────────────────────────────────────────────────\n\nskillCommand\n .command(\"add\")\n .description(\"Register a new agent skill\")\n .requiredOption(\"--slug <slug>\", \"Unique skill identifier\")\n .requiredOption(\"--description <text>\", \"One-sentence description\")\n .requiredOption(\"--steps <json>\", \"JSON array of step strings\")\n .option(\n \"--tokens <slugs>\",\n \"Comma-separated token slugs related to this skill\",\n )\n .option(\n \"--source <type>\",\n \"Source: learned | builtin (default: learned)\",\n \"learned\",\n )\n .option(\"--json\", \"Output as JSON\")\n .action(async (opts) => {\n await withDb(async (db) => {\n let steps: string[];\n try {\n steps = JSON.parse(opts.steps) as string[];\n if (!Array.isArray(steps))\n throw new Error(\"steps must be a JSON array\");\n } catch {\n console.error(\"Invalid --steps: must be a valid JSON array of strings\");\n process.exit(1);\n }\n\n const tokenSlugs = opts.tokens\n ? opts.tokens\n .split(\",\")\n .map((s: string) => s.trim())\n .filter(Boolean)\n : [];\n\n const skill = await createAgentSkill(db, {\n slug: opts.slug,\n description: opts.description,\n steps,\n token_slugs: tokenSlugs,\n source: opts.source as \"learned\" | \"builtin\",\n });\n\n if (opts.json) {\n console.log(JSON.stringify(skill, null, 2));\n } else {\n console.log(`Skill registered: ${skill.slug}`);\n console.log(` ${skill.steps.length} step(s) saved`);\n }\n });\n });\n","/**\n * `zam snapshot` — export / import / verify a portable SQL-text snapshot of the\n * learning database. (Increment 12, Phase 4.)\n *\n * Snapshots are safe to keep in a file-sync folder (Drive, OneDrive, iCloud):\n * unlike the live `~/.zam/zam.db` WAL database, a snapshot is plain SQL text and\n * is never written while half-applied. Export on one machine, import on another.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n exportSnapshot,\n importSnapshot,\n openDatabaseWithSync,\n verifySnapshot,\n} from \"../../kernel/index.js\";\nimport { ensureActiveWorkspace } from \"../workspaces/active.js\";\n\n/** `zam-snapshot-2026-06-13T09-41-22.sql` — sorts chronologically. */\nfunction defaultOutName(): string {\n const stamp = new Date()\n .toISOString()\n .replace(/\\.\\d+Z$/, \"\")\n .replace(/:/g, \"-\");\n return `zam-snapshot-${stamp}.sql`;\n}\n\nfunction summarize(tables: Record<string, number>): {\n total: number;\n nonEmpty: string[];\n} {\n let total = 0;\n const nonEmpty: string[] = [];\n for (const [name, count] of Object.entries(tables)) {\n total += count;\n if (count > 0) nonEmpty.push(`${name}: ${count}`);\n }\n return { total, nonEmpty };\n}\n\nconst exportCmd = new Command(\"export\")\n .description(\"Write a portable SQL-text snapshot of the database\")\n .option(\"--out <file>\", \"Output file (use - for stdout)\")\n .action(async (opts: { out?: string }) => {\n let db: Awaited<ReturnType<typeof openDatabaseWithSync>> | undefined;\n try {\n db = await openDatabaseWithSync({ initialize: true });\n const snapshot = await exportSnapshot(db);\n // Default snapshots into the personal folder (which may be file-synced),\n // so cross-device moves work without copying the live database.\n const personalDir = (await ensureActiveWorkspace(db)).path;\n await db.close();\n db = undefined;\n\n const manifest = verifySnapshot(snapshot);\n const { total, nonEmpty } = summarize(manifest.tables);\n\n if (opts.out === \"-\") {\n process.stdout.write(snapshot);\n return;\n }\n\n const out = opts.out ?? join(personalDir, \"snapshots\", defaultOutName());\n const dir = dirname(out);\n if (dir && dir !== \".\" && !existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(out, snapshot, \"utf-8\");\n\n console.log(`Snapshot written: ${out}`);\n console.log(\n ` ${total} row(s)${nonEmpty.length ? ` — ${nonEmpty.join(\", \")}` : \"\"}`,\n );\n } catch (err) {\n await db?.close();\n console.error(\"Error:\", (err as Error).message);\n process.exit(1);\n }\n });\n\nconst importCmd = new Command(\"import\")\n .description(\"Restore a snapshot into the database\")\n .argument(\"<file>\", \"Snapshot file to restore\")\n .option(\"--force\", \"Overwrite a non-empty database\", false)\n .action(async (file: string, opts: { force: boolean }) => {\n let db: Awaited<ReturnType<typeof openDatabaseWithSync>> | undefined;\n try {\n if (!existsSync(file)) {\n console.error(`Error: Snapshot file not found: ${file}`);\n process.exit(1);\n }\n const snapshot = readFileSync(file, \"utf-8\");\n\n db = await openDatabaseWithSync({ initialize: true });\n const result = await importSnapshot(db, snapshot, { force: opts.force });\n await db.close();\n db = undefined;\n\n const { nonEmpty } = summarize(result.tables);\n console.log(`Snapshot restored from ${file}`);\n console.log(\n ` ${result.total} row(s)${nonEmpty.length ? ` — ${nonEmpty.join(\", \")}` : \"\"}`,\n );\n } catch (err) {\n await db?.close();\n console.error(\"Error:\", (err as Error).message);\n process.exit(1);\n }\n });\n\nconst verifyCmd = new Command(\"verify\")\n .description(\"Check a snapshot's manifest and checksum without importing\")\n .argument(\"<file>\", \"Snapshot file to verify\")\n .action((file: string) => {\n try {\n if (!existsSync(file)) {\n console.error(`Error: Snapshot file not found: ${file}`);\n process.exit(1);\n }\n const manifest = verifySnapshot(readFileSync(file, \"utf-8\"));\n const { total, nonEmpty } = summarize(manifest.tables);\n console.log(`Valid snapshot (format v${manifest.version})`);\n console.log(` created: ${manifest.createdAt}`);\n console.log(\n ` ${total} row(s)${nonEmpty.length ? ` — ${nonEmpty.join(\", \")}` : \"\"}`,\n );\n } catch (err) {\n console.error(\"Error:\", (err as Error).message);\n process.exit(1);\n }\n });\n\nexport const snapshotCommand = new Command(\"snapshot\")\n .description(\"Export, import, or verify a portable database snapshot\")\n .addCommand(exportCmd)\n .addCommand(importCmd)\n .addCommand(verifyCmd);\n","/**\n * `zam stats` — Learning dashboard.\n */\n\nimport { Command } from \"commander\";\nimport { getDomainCompetence, getUserStats } from \"../../kernel/index.js\";\nimport { resolveUser } from \"../users/identity.js\";\nimport { withDb } from \"./shared/db.js\";\n\nexport const statsCommand = new Command(\"stats\")\n .description(\"Show learning dashboard for a user\")\n .option(\"--user <id>\", \"User ID (default: whoami)\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const userId = await resolveUser(opts, db);\n const stats = await getUserStats(db, userId);\n const domains = await getDomainCompetence(db, userId);\n\n if (opts.json) {\n console.log(JSON.stringify({ stats, domains }, null, 2));\n return;\n }\n\n console.log(`Learning Dashboard — ${stats.userId}`);\n console.log(\"═\".repeat(50));\n console.log(` Total tokens: ${stats.totalTokens}`);\n console.log(` Cards in deck: ${stats.cardsInDeck}`);\n console.log(` Due today: ${stats.dueToday}`);\n console.log(` Blocked: ${stats.blocked}`);\n console.log(` Mature: ${stats.mature}`);\n console.log(` Avg stability: ${stats.avgStability ?? \"N/A\"}`);\n console.log(` Total sessions: ${stats.totalSessions}`);\n console.log(` Last session: ${stats.lastSession ?? \"N/A\"}`);\n\n if (domains.length > 0) {\n console.log(\"\\nDomain Competence:\");\n console.log(\"─\".repeat(80));\n console.log(\n \" Domain Cards Mature Stability Retention Suggested Mode\",\n );\n console.log(` ${\"─\".repeat(74)}`);\n for (const d of domains) {\n console.log(\n ` ${d.domain.padEnd(17)} ${String(d.totalCards).padEnd(6)} ${String(d.matureCards).padEnd(7)} ${String(d.avgStability).padEnd(10)} ${(d.retentionRate * 100).toFixed(1).padStart(5)}% ${d.suggestedMode}`,\n );\n }\n }\n });\n });\n","/**\n * `zam token` — Token management subcommand group.\n */\n\nimport { Command } from \"commander\";\nimport type {\n BloomLevel,\n ListTokensOptions,\n SymbiosisMode,\n} from \"../../kernel/index.js\";\nimport {\n addPrerequisite,\n assignTokenToContext,\n createToken,\n deleteToken,\n deprecateToken,\n embeddingContentForToken,\n ensureCard,\n generateConceptFreeCue,\n getCard,\n getDependents,\n getDisplayTitle,\n getEmbeddingCoverage,\n getPrerequisites,\n getSetting,\n getTokenBySlug,\n getTokenDeleteImpact,\n listTokens,\n searchTokensHybrid,\n suggestFoundations,\n updateToken,\n} from \"../../kernel/index.js\";\nimport { resolveOperationKnowledgeContexts } from \"../knowledge-contexts.js\";\nimport {\n embedQuery,\n ensureTokenEmbeddings,\n findPossibleDuplicates,\n resolveDedupThreshold,\n resolveSuggestMinSimilarity,\n} from \"../llm/embedder.js\";\nimport { resolveUser } from \"../users/identity.js\";\nimport { jsonOut, withDb } from \"./shared/db.js\";\n\nexport const tokenCommand = new Command(\"token\").description(\n \"Manage knowledge tokens\",\n);\n\n// ── zam token register ────────────────────────────────────────────────────\n\ntokenCommand\n .command(\"register\")\n .description(\"Register a new knowledge token\")\n .requiredOption(\"--slug <slug>\", \"Unique token slug\")\n .requiredOption(\"--concept <concept>\", \"Concept description\")\n .option(\"--domain <domain>\", \"Knowledge domain\", \"\")\n .option(\"--bloom <level>\", \"Bloom taxonomy level (1-5)\", \"1\")\n .option(\"--source-link <link>\", \"Source file path or reference URL\", \"\")\n .option(\"--question <question>\", \"Specific question prompt for recall\", \"\")\n .option(\n \"--knowledge-context <context>\",\n \"Assign token to a knowledge context (repeatable)\",\n (val, memo: string[]) => {\n memo.push(val);\n return memo;\n },\n [],\n )\n .option(\"--user <id>\", \"Owner of the personal card (default: whoami)\")\n .option(\"--no-card\", \"Register the token only; do not create a personal card\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--quiet\", \"Suppress output (exit code only)\")\n .action(async (opts) => {\n await withDb(async (db) => {\n // Token creation is the frontier model's job: the agent (Claude Code,\n // Copilot / Antigravity CLI, …) decomposes the concept into atomic units\n // and may pass an explicit --question. The local LLM is deliberately NOT\n // called here — it is reserved for REVIEW time, where it rephrases the\n // question freshly each session so the learner never memorizes a fixed\n // \"exact input → exact output\" pair (see ensureHighQualityQuestion()).\n let question: string | null = opts.question || null;\n if (!question) {\n question = generateConceptFreeCue(\n Number(opts.bloom) as BloomLevel,\n opts.slug,\n opts.domain,\n );\n }\n\n const assignedContexts = await resolveOperationKnowledgeContexts(\n db,\n opts.knowledgeContext || [],\n );\n\n const possibleDuplicates = await findPossibleDuplicates(db, {\n concept: opts.concept,\n question,\n domain: opts.domain,\n });\n\n const token = await createToken(db, {\n slug: opts.slug,\n concept: opts.concept,\n domain: opts.domain,\n bloom_level: Number(opts.bloom) as BloomLevel,\n source_link: opts.sourceLink || null,\n question,\n });\n\n for (const context of assignedContexts) {\n await assignTokenToContext(db, token.id, context.id);\n }\n\n // A token with no card never surfaces — not in the deck, not in the\n // content editor (which lists cards). In the single-user (default)\n // scenario the learner's card is created alongside the token so it is\n // immediately visible and reviewable. --no-card opts out for pure\n // knowledge-graph scaffolding in shared, multi-user libraries.\n let cardUserId: string | null = null;\n if (opts.card !== false) {\n cardUserId = opts.user ?? (await getSetting(db, \"user.id\"));\n if (cardUserId) {\n await ensureCard(db, token.id, cardUserId);\n }\n }\n\n // Best effort embedding top-up so this token is immediately search-ready.\n try {\n await ensureTokenEmbeddings(db, { limit: 8 });\n } catch {\n // ignore\n }\n\n if (opts.quiet) return;\n\n if (opts.json) {\n console.log(\n JSON.stringify(\n {\n ...token,\n card: cardUserId ? { userId: cardUserId } : null,\n possible_duplicates: possibleDuplicates,\n knowledgeContexts: assignedContexts.map((c) => ({\n name: c.name,\n label: c.label,\n language: c.language,\n })),\n },\n null,\n 2,\n ),\n );\n } else {\n console.log(`Registered token: ${token.title || token.slug}`);\n if (token.slug !== (token.title || token.slug)) {\n console.log(` Slug: ${token.slug}`);\n }\n console.log(` ID: ${token.id}`);\n console.log(` Concept: ${token.concept}`);\n console.log(` Domain: ${token.domain || \"(none)\"}`);\n console.log(` Bloom: ${token.bloom_level}`);\n console.log(` Question: ${token.question}`);\n if (assignedContexts.length > 0) {\n console.log(\n ` Contexts: ${assignedContexts.map((c) => c.name).join(\", \")}`,\n );\n }\n if (token.source_link) {\n console.log(` Source: ${token.source_link}`);\n }\n if (cardUserId) {\n console.log(` Card: created for ${cardUserId}`);\n } else if (opts.card === false) {\n console.log(` Card: skipped (--no-card)`);\n } else {\n console.log(` Card: skipped (no default user set)`);\n }\n if (possibleDuplicates.length > 0) {\n console.log(`\\nWARNING: Possible duplicate tokens found:`);\n for (const dup of possibleDuplicates) {\n const name = dup.title || dup.slug;\n console.log(\n ` - ${name} (slug: ${dup.slug}, similarity: ${dup.similarity.toFixed(2)})`,\n );\n }\n }\n\n try {\n const queryText = embeddingContentForToken({\n concept: opts.concept,\n question: question ?? null,\n domain: opts.domain ?? \"\",\n title: opts.title ?? null,\n });\n const q = await embedQuery(db, queryText);\n if (q) {\n const maxSimilarity = await resolveDedupThreshold(db);\n const minSimilarity = await resolveSuggestMinSimilarity(db);\n\n const suggestions = await suggestFoundations(db, {\n queryEmbedding: q.vector,\n model: q.model,\n targetTokenId: token.id,\n targetBloomLevel: Number(opts.bloom) as BloomLevel,\n limit: 3,\n minSimilarity,\n maxSimilarity,\n });\n\n const filtered = suggestions.filter(\n (s) => !s.wouldCreateCycle && !s.alreadyPrerequisite,\n );\n\n if (filtered.length > 0) {\n console.log(\n `\\nRelated existing tokens as potential foundations:`,\n );\n for (const s of filtered) {\n const note = s.bloomAboveTarget\n ? \" (higher bloom than target)\"\n : \"\";\n console.log(\n ` - ${s.token.slug} (similarity: ${s.similarity.toFixed(2)})${note}`,\n );\n }\n console.log(\n `Link with: zam token prereq --token <slug> --requires <slug> (see zam token prereq --help)`,\n );\n }\n }\n } catch {\n // ignore\n }\n }\n });\n });\n\n// ── zam token find ────────────────────────────────────────────────────────\n\ntokenCommand\n .command(\"find\")\n .description(\"Fuzzy search for tokens\")\n .requiredOption(\"--query <query>\", \"Search query\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--quiet\", \"Suppress output (exit code only)\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const q = await embedQuery(db, opts.query);\n const embRes = await ensureTokenEmbeddings(db, {\n limit: 32,\n dims: q?.vector.length,\n });\n if (embRes.status === \"unavailable\" && !opts.json && !opts.quiet) {\n console.error(\n `Note: semantic search unavailable (${embRes.reason}) — lexical matches only.`,\n );\n }\n\n const results = await searchTokensHybrid(db, opts.query, {\n queryEmbedding: q?.vector,\n model: q?.model,\n });\n\n if (opts.quiet) return;\n\n if (opts.json) {\n console.log(JSON.stringify(results, null, 2));\n return;\n }\n\n if (results.length === 0) {\n console.log(\"No tokens found.\");\n return;\n }\n\n console.log(`Found ${results.length} token(s):\\n`);\n console.log(\n \"Score Sim Title Concept Domain Bloom\",\n );\n console.log(\"─\".repeat(95));\n for (const t of results) {\n const scoreStr = t.score.toFixed(3).padEnd(6);\n const simStr = (t.similarity?.toFixed(2) ?? \"-\").padEnd(4);\n const display = getDisplayTitle(t);\n console.log(\n `${scoreStr} ${simStr} ${display.padEnd(28)} ${t.concept.slice(0, 31).padEnd(31)} ${(t.domain || \"-\").padEnd(11)} ${t.bloom_level}`,\n );\n }\n console.log(\"\\n(Use slug for CLI commands -- slugs are technical IDs)\");\n });\n });\n\n// ── zam token list ────────────────────────────────────────────────────────\n\ntokenCommand\n .command(\"list\")\n .description(\"List all tokens\")\n .option(\"--domain <domain>\", \"Filter by domain\")\n .option(\"--knowledge-context <context>\", \"Filter by knowledge context\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--quiet\", \"Suppress output (exit code only)\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const filterOpts: ListTokensOptions = {};\n if (opts.domain) filterOpts.domain = opts.domain;\n if (opts.knowledgeContext)\n filterOpts.knowledgeContext = opts.knowledgeContext;\n\n const tokens = await listTokens(\n db,\n Object.keys(filterOpts).length ? filterOpts : undefined,\n );\n\n if (opts.quiet) return;\n\n if (opts.json) {\n console.log(JSON.stringify(tokens, null, 2));\n return;\n }\n\n if (tokens.length === 0) {\n console.log(\"No tokens registered.\");\n return;\n }\n\n console.log(\n \"Title Concept Domain Bloom\",\n );\n console.log(\"─\".repeat(85));\n for (const t of tokens) {\n const display = getDisplayTitle(t);\n console.log(\n `${display.padEnd(28)} ${t.concept.slice(0, 31).padEnd(31)} ${(t.domain || \"-\").padEnd(11)} ${t.bloom_level}`,\n );\n }\n console.log(`\\n${tokens.length} token(s) total.`);\n console.log(\n \"(Use --slug <slug> for commands; slugs are technical identifiers)\",\n );\n });\n });\n\n// ── zam token edit ────────────────────────────────────────────────────────\n\ntokenCommand\n .command(\"edit\")\n .description(\"Edit a token's mutable fields\")\n .requiredOption(\"--slug <slug>\", \"Token slug\")\n .option(\"--concept <concept>\", \"Updated concept text\")\n .option(\"--domain <domain>\", \"Updated domain (blank allowed)\")\n .option(\"--bloom <level>\", \"Updated Bloom taxonomy level (1-5)\")\n .option(\"--context <context>\", \"Updated context (blank allowed)\")\n .option(\n \"--mode <mode>\",\n \"Updated symbiosis mode: shadowing | copilot | autonomy | none\",\n )\n .option(\n \"--source-link <link>\",\n \"Updated source file path or reference URL (blank allowed)\",\n )\n .option(\"--question <question>\", \"Updated question text (blank allowed)\")\n .option(\n \"--title <title>\",\n \"Updated human-friendly title for graph display (blank allowed)\",\n )\n .option(\"--json\", \"Output as JSON\")\n .option(\"--quiet\", \"Suppress output (exit code only)\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const updates: {\n title?: string | null;\n concept?: string;\n domain?: string;\n bloom_level?: BloomLevel;\n context?: string;\n symbiosis_mode?: SymbiosisMode | null;\n source_link?: string | null;\n question?: string | null;\n } = {};\n\n if (opts.concept !== undefined) updates.concept = opts.concept;\n if (opts.domain !== undefined) updates.domain = opts.domain;\n if (opts.bloom !== undefined)\n updates.bloom_level = Number(opts.bloom) as BloomLevel;\n if (opts.context !== undefined) updates.context = opts.context;\n if (opts.sourceLink !== undefined) {\n updates.source_link = opts.sourceLink === \"\" ? null : opts.sourceLink;\n }\n if (opts.question !== undefined) {\n updates.question = opts.question === \"\" ? null : opts.question;\n }\n if (opts.title !== undefined) {\n updates.title = opts.title === \"\" ? \"\" : opts.title;\n }\n if (opts.mode !== undefined) {\n const validModes = [\"shadowing\", \"copilot\", \"autonomy\", \"none\"];\n if (!validModes.includes(opts.mode)) {\n console.error(`Invalid --mode: ${opts.mode}`);\n process.exit(1);\n }\n updates.symbiosis_mode =\n opts.mode === \"none\" ? null : (opts.mode as SymbiosisMode);\n }\n\n const token = await updateToken(db, opts.slug, updates);\n\n if (opts.quiet) return;\n\n if (opts.json) {\n jsonOut(token);\n return;\n }\n\n console.log(`Updated token: ${token.title || token.slug}`);\n if (token.slug !== (token.title || token.slug)) {\n console.log(` Slug: ${token.slug}`);\n }\n console.log(` Concept: ${token.concept}`);\n console.log(` Domain: ${token.domain || \"(none)\"}`);\n console.log(` Bloom: ${token.bloom_level}`);\n console.log(` Question: ${token.question || \"(none)\"}`);\n console.log(` Title: ${token.title || \"(none)\"}`);\n console.log(` Context: ${token.context || \"(none)\"}`);\n console.log(` Mode: ${token.symbiosis_mode ?? \"none\"}`);\n console.log(` Source: ${token.source_link || \"(none)\"}`);\n });\n });\n\n// ── zam token prereq ─────────────────────────────────────────────────────\n\ntokenCommand\n .command(\"prereq\")\n .description(\"Add a prerequisite edge between tokens\")\n .requiredOption(\"--token <slug>\", \"Token that requires a prerequisite\")\n .requiredOption(\"--requires <slug>\", \"Required prerequisite token\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--quiet\", \"Suppress output (exit code only)\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const token = await getTokenBySlug(db, opts.token);\n if (!token) {\n console.error(`Token not found: ${opts.token}`);\n process.exit(1);\n }\n\n const requires = await getTokenBySlug(db, opts.requires);\n if (!requires) {\n console.error(`Prerequisite token not found: ${opts.requires}`);\n process.exit(1);\n }\n\n await addPrerequisite(db, token.id, requires.id);\n\n if (opts.quiet) return;\n\n if (opts.json) {\n console.log(\n JSON.stringify(\n { token: opts.token, requires: opts.requires },\n null,\n 2,\n ),\n );\n } else {\n console.log(\n `Added prerequisite: ${opts.token} requires ${opts.requires}`,\n );\n }\n });\n });\n\n// ── zam token deprecate ───────────────────────────────────────────────────\n\ntokenCommand\n .command(\"deprecate\")\n .description(\n \"Mark a token as deprecated (excluded from reviews, not deleted)\",\n )\n .requiredOption(\"--slug <slug>\", \"Token slug to deprecate\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--quiet\", \"Suppress output (exit code only)\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const token = await deprecateToken(db, opts.slug);\n\n if (opts.quiet) return;\n\n if (opts.json) {\n console.log(JSON.stringify(token, null, 2));\n } else {\n console.log(`Deprecated: ${token.slug}`);\n console.log(` Concept: ${token.concept}`);\n console.log(` At: ${token.deprecated_at}`);\n }\n });\n });\n\n// ── zam token delete ──────────────────────────────────────────────────────\n\ntokenCommand\n .command(\"delete\")\n .description(\"Hard-delete a token and its dependent learning data\")\n .requiredOption(\"--slug <slug>\", \"Token slug to delete\")\n .option(\"--force\", \"Actually delete the token\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--quiet\", \"Suppress output (exit code only)\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const impact = await getTokenDeleteImpact(db, opts.slug);\n\n if (!opts.force) {\n const preview = {\n slug: opts.slug,\n deleted: false,\n requiresForce: true,\n impact,\n };\n\n if (opts.quiet) return;\n\n if (opts.json) {\n jsonOut(preview);\n return;\n }\n\n console.log(`Delete preview for ${opts.slug}:`);\n console.log(` Cards: ${impact.cards}`);\n console.log(` Review logs: ${impact.review_logs}`);\n console.log(\n ` Prereq edges from it: ${impact.prerequisite_edges_from_token}`,\n );\n console.log(\n ` Prereq edges to it: ${impact.prerequisite_edges_to_token}`,\n );\n console.log(` Session steps: ${impact.session_steps}`);\n console.log(` Sessions touched: ${impact.sessions_touched}`);\n console.log(` Agent skills updated: ${impact.agent_skills}`);\n console.log(\"\\nRe-run with --force to delete.\");\n return;\n }\n\n const result = await deleteToken(db, opts.slug);\n\n if (opts.quiet) return;\n\n if (opts.json) {\n jsonOut({\n slug: result.token.slug,\n deleted: true,\n impact: result.impact,\n });\n return;\n }\n\n console.log(`Deleted token: ${result.token.slug}`);\n console.log(` Cards removed: ${result.impact.cards}`);\n console.log(` Review logs removed: ${result.impact.review_logs}`);\n console.log(` Session steps removed: ${result.impact.session_steps}`);\n console.log(` Agent skills updated: ${result.impact.agent_skills}`);\n });\n });\n\n// ── zam token status ─────────────────────────────────────────────────────\n\ntokenCommand\n .command(\"status\")\n .description(\"Show full status of a token for a user\")\n .requiredOption(\"--token <slug>\", \"Token slug\")\n .option(\"--user <id>\", \"User ID (default: whoami)\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--quiet\", \"Suppress output (exit code only)\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const userId = await resolveUser(opts, db);\n const token = await getTokenBySlug(db, opts.token);\n if (!token) {\n console.error(`Token not found: ${opts.token}`);\n process.exit(1);\n }\n\n const card = await getCard(db, token.id, userId);\n const prereqs = await getPrerequisites(db, token.id);\n const dependents = await getDependents(db, token.id);\n\n const status = {\n token,\n card: card ?? null,\n prerequisites: prereqs,\n dependents,\n };\n\n if (opts.quiet) return;\n\n if (opts.json) {\n console.log(JSON.stringify(status, null, 2));\n return;\n }\n\n console.log(`Token: ${token.title || token.slug}`);\n if (token.slug !== (token.title || token.slug)) {\n console.log(` Slug: ${token.slug}`);\n }\n console.log(` ID: ${token.id}`);\n console.log(` Concept: ${token.concept}`);\n console.log(` Question: ${token.question || \"(none)\"}`);\n console.log(` Domain: ${token.domain || \"(none)\"}`);\n console.log(` Bloom: ${token.bloom_level}`);\n if (token.source_link) {\n console.log(` Source: ${token.source_link}`);\n }\n console.log();\n\n if (card) {\n console.log(\"Card status:\");\n console.log(` State: ${card.state}`);\n console.log(` Due at: ${card.due_at}`);\n console.log(` Stability: ${card.stability}`);\n console.log(` Difficulty: ${card.difficulty}`);\n console.log(` Reps: ${card.reps}`);\n console.log(` Lapses: ${card.lapses}`);\n console.log(` Blocked: ${card.blocked ? \"Yes\" : \"No\"}`);\n } else {\n console.log(\"No card exists for this user yet.\");\n }\n\n console.log();\n if (prereqs.length > 0) {\n console.log(\"Prerequisites:\");\n for (const p of prereqs) {\n console.log(\n ` - ${p.title || p.slug}: ${p.concept} (bloom ${p.bloom_level})`,\n );\n }\n } else {\n console.log(\"No prerequisites.\");\n }\n\n if (dependents.length > 0) {\n console.log(\"\\nDependents:\");\n for (const d of dependents) {\n console.log(\n ` - ${d.title || d.slug}: ${d.concept} (bloom ${d.bloom_level})`,\n );\n }\n }\n });\n });\n\n// ── zam token reembed ─────────────────────────────────────────────────────\n\ntokenCommand\n .command(\"reembed\")\n .description(\"Backfill or refresh semantic-search embeddings for tokens\")\n .option(\"--all\", \"Force re-embed every token, including already-fresh ones\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--quiet\", \"Suppress output (exit code only)\")\n .action(async (opts) => {\n await withDb(async (db) => {\n const probe = await embedQuery(db, \"ZAM embedding dimension probe\");\n const model = probe?.model ?? null;\n const dims = probe?.vector.length;\n const before = model\n ? await getEmbeddingCoverage(db, model, { dims })\n : { tokens: 0, embedded: 0, missing: 0, stale: 0 };\n\n let embedded = 0;\n let reason: string | undefined;\n // --all runs as a single UNBOUNDED forced pass: force with the default\n // per-call cap would re-select the same leading batch forever (freshness\n // is ignored, so nothing ever drops out of the selection), while forcing\n // only a capped first pass would leave every fresh token beyond the cap\n // untouched. Unbounded, one forced pass covers the whole token base\n // (batched per-request internally); follow-up passes run without force\n // and only mop up genuinely missing/stale rows.\n let force = Boolean(opts.all);\n while (true) {\n const result = await ensureTokenEmbeddings(\n db,\n force\n ? { force: true, limit: Number.MAX_SAFE_INTEGER, dims }\n : { dims },\n );\n force = false;\n embedded += result.embedded;\n if (result.status === \"unavailable\") {\n reason = result.reason;\n break;\n }\n if (result.remaining === 0 || result.embedded === 0) break;\n }\n\n if (reason !== undefined) {\n if (opts.quiet) {\n process.exit(1);\n }\n if (opts.json) {\n jsonOut({ error: reason, embedded });\n } else {\n console.error(`Error: ${reason}`);\n if (embedded > 0) {\n console.error(\n `(${embedded} token(s) were embedded before the failure)`,\n );\n }\n }\n process.exit(1);\n }\n\n // model is guaranteed non-null here: reason undefined means at least\n // one ensureTokenEmbeddings call above resolved a usable endpoint.\n const after = await getEmbeddingCoverage(db, model as string, { dims });\n\n if (opts.quiet) return;\n\n const staleBefore = before.missing + before.stale;\n if (opts.json) {\n jsonOut({ embedded, model, before, after });\n return;\n }\n\n console.log(\n `Embedded ${embedded} tokens (${after.tokens} total, ${staleBefore} stale before) with ${model}`,\n );\n });\n });\n","/**\n * `zam ui` — one-word launcher for the ZAM Desktop GUI (Tauri Studio).\n *\n * The desktop app is a Tauri shell that re-uses the compiled CLI bridge\n * (dist/cli/index.js), so it needs:\n * - a built CLI (npm run build at the repo root), and\n * - either a previously built native binary, or the Rust toolchain to\n * compile one.\n *\n * Usage:\n * zam ui launch the GUI (built binary if present, else guide)\n * zam ui --dev run in hot-reload dev mode (needs Rust)\n * zam ui --build build the native installer (needs Rust, one-time)\n * zam ui --shortcut create Desktop + Start-menu shortcuts to the GUI\n */\n\nimport { type SpawnSyncOptions, spawn, spawnSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { Command } from \"commander\";\nimport { hasCommand } from \"../../kernel/index.js\";\n\nconst C = {\n reset: \"\\x1b[0m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n cyan: \"\\x1b[36m\",\n dim: \"\\x1b[2m\",\n};\n\n/** Walk up from cwd and from this module to find the repo's `desktop/` dir. */\nfunction findDesktopDir(): string | null {\n const starts = [process.cwd(), dirname(fileURLToPath(import.meta.url))];\n for (const start of starts) {\n let dir = start;\n for (let i = 0; i < 10; i++) {\n if (existsSync(join(dir, \"desktop\", \"src-tauri\", \"tauri.conf.json\"))) {\n return join(dir, \"desktop\");\n }\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n }\n return null;\n}\n\n/** Locate a previously built native binary, if any. */\nfunction findBuiltApp(desktopDir: string): string | null {\n const releaseDir = join(desktopDir, \"src-tauri\", \"target\", \"release\");\n if (process.platform === \"win32\") {\n for (const name of [\"ZAM.exe\", \"zam.exe\", \"zam-desktop.exe\"]) {\n const p = join(releaseDir, name);\n if (existsSync(p)) return p;\n }\n } else if (process.platform === \"darwin\") {\n const app = join(releaseDir, \"bundle\", \"macos\", \"ZAM.app\");\n if (existsSync(app)) return app;\n } else {\n for (const name of [\"zam\", \"ZAM\", \"zam-desktop\"]) {\n const p = join(releaseDir, name);\n if (existsSync(p)) return p;\n }\n }\n return null;\n}\n\n/** Locate an app installed by a released ZAM desktop installer. */\nfunction findInstalledApp(): string | null {\n const candidates =\n process.platform === \"win32\"\n ? [\n process.env.LOCALAPPDATA &&\n join(process.env.LOCALAPPDATA, \"Programs\", \"ZAM\", \"ZAM.exe\"),\n process.env.ProgramFiles &&\n join(process.env.ProgramFiles, \"ZAM\", \"ZAM.exe\"),\n process.env[\"ProgramFiles(x86)\"] &&\n join(process.env[\"ProgramFiles(x86)\"], \"ZAM\", \"ZAM.exe\"),\n ]\n : process.platform === \"darwin\"\n ? [\"/Applications/ZAM.app\", join(homedir(), \"Applications\", \"ZAM.app\")]\n : [\"/opt/ZAM/zam\", \"/usr/bin/zam-desktop\"];\n\n return (\n candidates.find((candidate) => candidate && existsSync(candidate)) || null\n );\n}\n\n/** npm is npm.cmd on Windows, so child processes need a shell there. */\nfunction runNpm(args: string[], opts: SpawnSyncOptions): number {\n const res = spawnSync(\"npm\", args, {\n stdio: \"inherit\",\n shell: process.platform === \"win32\",\n ...opts,\n });\n return res.status ?? 1;\n}\n\nfunction ensureDesktopDeps(desktopDir: string): boolean {\n if (existsSync(join(desktopDir, \"node_modules\"))) return true;\n console.log(\n `${C.cyan}Installing desktop dependencies (one-time)...${C.reset}`,\n );\n return runNpm([\"install\"], { cwd: desktopDir }) === 0;\n}\n\nfunction prepareDesktopBridge(repoRoot: string): boolean {\n console.log(`${C.cyan}Preparing self-contained desktop bridge...${C.reset}`);\n return (\n runNpm([\"run\", \"desktop:prepare\", \"--\", \"--bundle-node\"], {\n cwd: repoRoot,\n }) === 0\n );\n}\n\nfunction requireRust(): boolean {\n if (hasCommand(\"cargo\")) return true;\n console.error(\n `${C.red}✗ The desktop GUI needs the Rust toolchain to compile.${C.reset}`,\n );\n console.error(\" Install it once, then re-run this command:\");\n console.error(\n ` ${C.cyan}winget install Rustlang.Rustup${C.reset} (or https://rustup.rs)`,\n );\n return false;\n}\n\n/**\n * On Windows the default MSVC Rust target needs the Visual Studio C++ linker\n * (link.exe), which rustup does NOT install. Detect it via vswhere so we fail\n * with guidance up front instead of after minutes of compiling.\n */\nfunction hasMsvcBuildTools(): boolean {\n if (process.platform !== \"win32\") return true;\n const pf86 = process.env[\"ProgramFiles(x86)\"] || \"C:\\\\Program Files (x86)\";\n const vswhere = join(\n pf86,\n \"Microsoft Visual Studio\",\n \"Installer\",\n \"vswhere.exe\",\n );\n if (!existsSync(vswhere)) return false;\n const res = spawnSync(\n vswhere,\n [\n \"-latest\",\n \"-products\",\n \"*\",\n \"-requires\",\n \"Microsoft.VisualStudio.Component.VC.Tools.x86.x64\",\n \"-property\",\n \"installationPath\",\n ],\n { encoding: \"utf8\" },\n );\n return (res.stdout ?? \"\").trim().length > 0;\n}\n\nfunction requireMsvcOnWindows(): boolean {\n if (hasMsvcBuildTools()) return true;\n console.error(\n `${C.red}✗ The MSVC C++ linker (link.exe) is missing.${C.reset}`,\n );\n console.error(\n \" Rust on Windows needs the Visual Studio Build Tools with the C++ workload\",\n );\n console.error(\" (rustup does not include it). Install it once (~a few GB),\");\n console.error(\" then open a NEW terminal and retry:\");\n console.error(\n ` ${C.cyan}winget install --id Microsoft.VisualStudio.2022.BuildTools -e --override \"--quiet --wait --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended\"${C.reset}`,\n );\n return false;\n}\n\nfunction warnIfCliMissing(repoRoot: string): void {\n if (!existsSync(join(repoRoot, \"dist\", \"cli\", \"index.js\"))) {\n console.warn(\n `${C.yellow}⚠ CLI build not found (dist/cli/index.js). The GUI bridge needs it — run 'npm run build' at the repo root.${C.reset}`,\n );\n }\n}\n\nfunction launchApp(appPath: string, workingDir: string): void {\n console.log(`${C.green}✓ Launching ZAM Desktop...${C.reset}`);\n if (process.platform === \"darwin\" && appPath.endsWith(\".app\")) {\n spawn(\"open\", [appPath], {\n cwd: workingDir,\n detached: true,\n stdio: \"ignore\",\n }).unref();\n } else {\n spawn(appPath, [], {\n cwd: workingDir,\n detached: true,\n stdio: \"ignore\",\n windowsHide: true,\n }).unref();\n }\n}\n\nfunction createShortcuts(appPath: string, repoRoot: string): void {\n if (process.platform !== \"win32\") {\n console.error(\n `${C.red}✗ --shortcut is currently implemented for Windows only.${C.reset}`,\n );\n console.error(\n \" On macOS drag ZAM.app to the Dock; on Linux create a .desktop entry.\",\n );\n return;\n }\n // WScript.Shell creates a .lnk on the Desktop and in the Start menu.\n const ps = [\n \"$ws = New-Object -ComObject WScript.Shell\",\n \"foreach ($dir in @([Environment]::GetFolderPath('Desktop'), [Environment]::GetFolderPath('Programs'))) {\",\n \" $lnk = $ws.CreateShortcut((Join-Path $dir 'ZAM.lnk'))\",\n ` $lnk.TargetPath = '${appPath}'`,\n ` $lnk.WorkingDirectory = '${repoRoot}'`,\n ` $lnk.IconLocation = '${appPath},0'`,\n \" $lnk.Description = 'ZAM Active-Recall Studio'\",\n \" $lnk.Save()\",\n \"}\",\n ].join(\"\\n\");\n const res = spawnSync(\n \"powershell\",\n [\"-NoProfile\", \"-ExecutionPolicy\", \"Bypass\", \"-Command\", ps],\n { stdio: \"inherit\" },\n );\n if (res.status === 0) {\n console.log(\n `${C.green}✓ Created 'ZAM' shortcuts on your Desktop and in the Start menu.${C.reset}`,\n );\n } else {\n console.error(`${C.red}✗ Could not create shortcuts.${C.reset}`);\n }\n}\n\nexport const uiCommand = new Command(\"ui\")\n .description(\"Launch the ZAM Desktop GUI (Active-Recall Studio)\")\n .option(\"--dev\", \"Run in hot-reload development mode (needs Rust)\")\n .option(\n \"--build\",\n \"Build the native installer for your OS (needs Rust, one-time)\",\n )\n .option(\"--shortcut\", \"Create Desktop + Start-menu shortcuts to the GUI\")\n .action((opts) => {\n const installedApp = findInstalledApp();\n if (!opts.dev && !opts.build && !opts.shortcut && installedApp) {\n launchApp(installedApp, homedir());\n return;\n }\n\n const desktopDir = findDesktopDir();\n if (!desktopDir) {\n console.error(\n `${C.red}✗ Could not find the desktop/ app. Run 'zam ui' from inside the ZAM repository.${C.reset}`,\n );\n process.exit(1);\n }\n const repoRoot = dirname(desktopDir);\n\n // --build: compile the native installer.\n if (opts.build) {\n if (!requireRust()) process.exit(1);\n if (!requireMsvcOnWindows()) process.exit(1);\n if (!ensureDesktopDeps(desktopDir)) process.exit(1);\n if (!prepareDesktopBridge(repoRoot)) process.exit(1);\n console.log(\n `${C.cyan}Building the native ZAM installer (this takes a few minutes)...${C.reset}`,\n );\n const code = runNpm([\"run\", \"tauri\", \"build\"], { cwd: desktopDir });\n if (code === 0) {\n const bundle = join(\n desktopDir,\n \"src-tauri\",\n \"target\",\n \"release\",\n \"bundle\",\n );\n console.log(\n `\\n${C.green}✓ Done. Installer is in:${C.reset}\\n ${bundle}`,\n );\n console.log(\n `${C.dim}Run that installer once — it adds ZAM to the Start menu and Desktop automatically.${C.reset}`,\n );\n console.log(\n `${C.dim}The installer includes the CLI bridge and Node runtime.${C.reset}`,\n );\n }\n process.exit(code);\n }\n\n // --dev: hot-reload development mode.\n if (opts.dev) {\n if (!requireRust()) process.exit(1);\n if (!requireMsvcOnWindows()) process.exit(1);\n if (!ensureDesktopDeps(desktopDir)) process.exit(1);\n warnIfCliMissing(repoRoot);\n console.log(\n `${C.cyan}Starting ZAM Desktop in dev mode (Ctrl+C to stop)...${C.reset}`,\n );\n process.exit(runNpm([\"run\", \"tauri\", \"dev\"], { cwd: desktopDir }));\n }\n\n const builtApp = findBuiltApp(desktopDir);\n\n // --shortcut: needs a built binary to point at.\n if (opts.shortcut) {\n const shortcutTarget = installedApp || builtApp;\n if (!shortcutTarget) {\n console.error(\n `${C.red}✗ No built app yet. Build it first:${C.reset} ${C.cyan}zam ui --build${C.reset}`,\n );\n process.exit(1);\n }\n createShortcuts(shortcutTarget, dirname(shortcutTarget));\n return;\n }\n\n // Default: launch the built app, or guide the user to get one.\n if (builtApp) {\n launchApp(builtApp, repoRoot);\n return;\n }\n\n console.log(\n `${C.yellow}The ZAM Desktop GUI hasn't been built yet.${C.reset}\\n`,\n );\n if (hasCommand(\"cargo\")) {\n console.log(\"Pick one:\");\n console.log(\n ` ${C.cyan}zam ui --build${C.reset} Build a native installer (Start-menu + Desktop entry)`,\n );\n console.log(\n ` ${C.cyan}zam ui --dev${C.reset} Just run it now in dev mode`,\n );\n } else {\n console.log(\"To get a clickable Start-menu app, do this once:\");\n console.log(\n ` 1. Install Rust: ${C.cyan}winget install Rustlang.Rustup${C.reset}`,\n );\n console.log(` 2. Build the app: ${C.cyan}zam ui --build${C.reset}`);\n console.log(\n ` 3. Run the installer it prints — ZAM then lives in your Start menu.`,\n );\n console.log(\n `\\n${C.dim}After that, 'zam ui' launches it directly.${C.reset}`,\n );\n }\n });\n","/**\n * `zam update` — apply the latest ZAM release; `zam update check` — only report\n * whether one is available. (Increment 12, Phase 5.)\n *\n * The decision (self-update vs defer to a package manager vs update a developer\n * checkout) lives in the kernel (`decideUpdate`/`planUpdate`, pure and\n * unit-tested); this command supplies the current version, the latest version\n * (fetched from GitHub releases unless `--latest` is given), the detected\n * install channel, and the side effects that carry the plan out.\n */\n\nimport { spawnSync } from \"node:child_process\";\nimport { existsSync, readFileSync, realpathSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { confirm } from \"@inquirer/prompts\";\nimport { Command } from \"commander\";\nimport {\n decideUpdate,\n getInstallChannel,\n hasCommand,\n type InstallChannel,\n planUpdate,\n type UpdateDecision,\n} from \"../../kernel/index.js\";\n\nconst GITHUB_REPO = \"zam-os/zam\";\nconst CHANNELS: InstallChannel[] = [\n \"developer\",\n \"direct\",\n \"winget\",\n \"homebrew\",\n];\n\nconst C = {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n cyan: \"\\x1b[36m\",\n dim: \"\\x1b[2m\",\n green: \"\\x1b[32m\",\n red: \"\\x1b[31m\",\n yellow: \"\\x1b[33m\",\n};\n\n/** Read this build's version from the nearest package.json. */\nfunction currentVersion(): string {\n const here = dirname(fileURLToPath(import.meta.url));\n for (const up of [\"..\", \"../..\", \"../../..\"]) {\n try {\n const pkg = JSON.parse(\n readFileSync(join(here, up, \"package.json\"), \"utf-8\"),\n ) as { version?: string };\n if (pkg.version) return pkg.version;\n } catch {\n // try the next candidate\n }\n }\n return \"0.0.0\";\n}\n\n/** Read the version recorded in a specific checkout's package.json. */\nfunction versionAt(dir: string): string {\n try {\n const pkg = JSON.parse(\n readFileSync(join(dir, \"package.json\"), \"utf-8\"),\n ) as { version?: string };\n return pkg.version ?? \"unknown\";\n } catch {\n return \"unknown\";\n }\n}\n\nasync function fetchLatestVersion(repo: string): Promise<string> {\n const res = await fetch(\n `https://api.github.com/repos/${repo}/releases/latest`,\n {\n headers: {\n Accept: \"application/vnd.github+json\",\n \"User-Agent\": \"zam-cli\",\n },\n },\n );\n if (!res.ok) {\n throw new Error(\n `Could not reach the release server (HTTP ${res.status}). ` +\n \"Pass --latest <version> to check offline.\",\n );\n }\n const data = (await res.json()) as { tag_name?: string };\n if (!data.tag_name) throw new Error(\"No published release found yet.\");\n return data.tag_name;\n}\n\nfunction render(decision: UpdateDecision): void {\n if (!decision.updateAvailable) {\n console.log(\n `${C.green}✓${C.reset} ZAM is up to date (${C.cyan}${decision.currentVersion}${C.reset}).`,\n );\n return;\n }\n\n console.log(\n `${C.yellow}↑${C.reset} ${C.bold}Update available${C.reset}: ` +\n `${C.dim}${decision.currentVersion}${C.reset} → ${C.cyan}${decision.latestVersion}${C.reset}`,\n );\n console.log(` ${decision.reason}`);\n if (decision.action === \"run-command\" || decision.action === \"inform\") {\n console.log(` Run: ${C.cyan}${decision.command}${C.reset}`);\n } else if (decision.action === \"self-update\") {\n console.log(\n ` ${C.dim}The desktop app can apply this update for you.${C.reset}`,\n );\n }\n}\n\nconst checkCmd = new Command(\"check\")\n .description(\"Check whether a newer ZAM has been released\")\n .option(\n \"--latest <version>\",\n \"Compare against this version instead of fetching\",\n )\n .option(\"--channel <channel>\", \"Override the detected install channel\")\n .option(\"--json\", \"Output as JSON\")\n .action(\n async (opts: { latest?: string; channel?: string; json?: boolean }) => {\n try {\n if (\n opts.channel &&\n !CHANNELS.includes(opts.channel as InstallChannel)\n ) {\n console.error(\n `Invalid --channel: ${opts.channel}. Use ${CHANNELS.join(\", \")}.`,\n );\n process.exit(1);\n }\n\n const current = currentVersion();\n const latest = opts.latest ?? (await fetchLatestVersion(GITHUB_REPO));\n const channel = (opts.channel as InstallChannel) ?? getInstallChannel();\n\n const decision = decideUpdate({\n currentVersion: current,\n latestVersion: latest,\n channel,\n });\n\n if (opts.json) {\n console.log(JSON.stringify(decision, null, 2));\n return;\n }\n render(decision);\n } catch (err) {\n console.error(\"Error:\", (err as Error).message);\n process.exit(1);\n }\n },\n );\n\n/** Locate the ZAM source checkout by walking up from this module to a .git. */\nfunction findSourceRepo(): string | null {\n let dir = realpathSync(dirname(fileURLToPath(import.meta.url)));\n let parent = dirname(dir);\n while (parent !== dir) {\n if (existsSync(join(dir, \".git\"))) return dir;\n dir = parent;\n parent = dirname(dir);\n }\n return existsSync(join(dir, \".git\")) ? dir : null;\n}\n\nfunction runGit(\n cwd: string,\n args: string[],\n capture: boolean,\n): { ok: boolean; out: string } {\n const res = spawnSync(\"git\", args, {\n cwd,\n stdio: capture ? [\"ignore\", \"pipe\", \"pipe\"] : \"inherit\",\n encoding: \"utf8\",\n });\n return { ok: res.status === 0, out: (res.stdout ?? \"\").trim() };\n}\n\n/** npm is npm.cmd on Windows, so child processes need a shell there. */\nfunction runNpm(args: string[], cwd: string): number {\n const res = spawnSync(\"npm\", args, {\n cwd,\n stdio: \"inherit\",\n shell: process.platform === \"win32\",\n });\n return res.status ?? 1;\n}\n\n/** Run a package-manager command (winget/brew) through the shell. */\nfunction runShell(command: string): boolean {\n const res = spawnSync(command, { stdio: \"inherit\", shell: true });\n return res.status === 0;\n}\n\n/**\n * Developer channel: pull, install, and rebuild the linked source checkout,\n * then refresh this instance's skill files with the freshly built CLI so the\n * new /zam skill lands in .claude/.agent/.agents.\n */\nfunction applyDeveloperUpdate(force: boolean): void {\n if (!hasCommand(\"git\")) {\n console.error(`${C.red}✗${C.reset} git was not found on PATH.`);\n process.exit(1);\n }\n\n const src = findSourceRepo();\n if (!src) {\n console.error(\n `${C.red}✗${C.reset} Could not locate the ZAM source checkout to update.`,\n );\n process.exit(1);\n }\n\n // Never clobber uncommitted work in the source checkout.\n const status = runGit(src, [\"status\", \"--porcelain\"], true);\n if (status.ok && status.out && !force) {\n console.error(\n `${C.red}✗${C.reset} The source checkout has uncommitted changes:\\n${status.out}\\n` +\n `Commit or stash them, or re-run with ${C.cyan}--force${C.reset}.`,\n );\n process.exit(1);\n }\n\n console.log(\n `${C.dim}→ git pull --ff-only${C.reset} ${C.dim}(${src})${C.reset}`,\n );\n if (!runGit(src, [\"pull\", \"--ff-only\"], false).ok) {\n console.error(\n `${C.red}✗${C.reset} git pull failed — the branch may have diverged or you are offline. Resolve it manually, then retry.`,\n );\n process.exit(1);\n }\n\n console.log(`${C.dim}→ npm install${C.reset}`);\n if (runNpm([\"install\"], src) !== 0) {\n console.error(`${C.red}✗${C.reset} npm install failed.`);\n process.exit(1);\n }\n\n console.log(`${C.dim}→ npm run build${C.reset}`);\n if (runNpm([\"run\", \"build\"], src) !== 0) {\n console.error(`${C.red}✗${C.reset} Build failed.`);\n process.exit(1);\n }\n\n console.log(`${C.dim}→ zam setup --force${C.reset}`);\n const setup = spawnSync(\n process.execPath,\n [join(src, \"dist\", \"cli\", \"index.js\"), \"setup\", \"--force\"],\n { cwd: process.cwd(), stdio: \"inherit\" },\n );\n if (setup.status !== 0) {\n console.warn(\n `${C.yellow}⚠${C.reset} Skill refresh reported a problem — run '${C.cyan}zam setup --force${C.reset}' here manually.`,\n );\n }\n\n console.log(\n `\\n${C.green}✓${C.reset} Updated to ${C.cyan}${versionAt(src)}${C.reset}. ` +\n `Restart your agent client (e.g. Claude Code) to load the refreshed ${C.cyan}/zam${C.reset} skill.`,\n );\n}\n\nasync function applyUpdate(opts: {\n yes?: boolean;\n force?: boolean;\n}): Promise<void> {\n try {\n const current = currentVersion();\n const latest = await fetchLatestVersion(GITHUB_REPO);\n const channel = getInstallChannel();\n const decision = decideUpdate({\n currentVersion: current,\n latestVersion: latest,\n channel,\n });\n\n if (!decision.updateAvailable) {\n console.log(\n `${C.green}✓${C.reset} ZAM is up to date (${C.cyan}${current}${C.reset}).`,\n );\n return;\n }\n\n console.log(\n `${C.yellow}↑${C.reset} ${C.bold}Update available${C.reset}: ` +\n `${C.dim}${current}${C.reset} → ${C.cyan}${latest}${C.reset} ${C.dim}(${channel} install)${C.reset}`,\n );\n for (const step of planUpdate(decision)) {\n console.log(` ${C.dim}•${C.reset} ${step.label}`);\n }\n\n // The CLI cannot apply a signed in-place update; that is the desktop app.\n if (channel === \"direct\") {\n console.log(\n `\\n${C.dim}This install updates through the desktop app's signed updater — open ZAM Desktop to install ${latest}.${C.reset}`,\n );\n return;\n }\n\n if (!opts.yes) {\n const ok = await confirm({\n message: \"Apply this update?\",\n default: true,\n });\n if (!ok) {\n console.log(\"Aborted.\");\n return;\n }\n }\n\n console.log();\n\n if (channel === \"winget\" || channel === \"homebrew\") {\n if (!decision.command || !runShell(decision.command)) process.exit(1);\n return;\n }\n\n applyDeveloperUpdate(opts.force ?? false);\n } catch (err) {\n console.error(\"Error:\", (err as Error).message);\n process.exit(1);\n }\n}\n\nexport const updateCommand = new Command(\"update\")\n .description(\n \"Update ZAM to the latest release (use `update check` to only check)\",\n )\n .option(\"-y, --yes\", \"Apply without confirmation\")\n .option(\n \"--force\",\n \"Update even if the source checkout has uncommitted changes\",\n )\n .action(async (opts: { yes?: boolean; force?: boolean }) => {\n await applyUpdate(opts);\n })\n .addCommand(checkCmd);\n","/**\n * `zam whoami` — Manage default user identity.\n */\n\nimport { Command } from \"commander\";\nimport { deleteSetting, getSetting, setSetting } from \"../../kernel/index.js\";\nimport { withDb } from \"./shared/db.js\";\n\nexport const whoamiCommand = new Command(\"whoami\")\n .description(\"Show or set the default user identity\")\n .option(\"--set <id>\", \"Set the default user ID\")\n .option(\"--clear\", \"Remove the default user ID\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (opts) => {\n await withDb(async (db) => {\n if (opts.set) {\n await setSetting(db, \"user.id\", opts.set);\n if (opts.json) {\n console.log(JSON.stringify({ userId: opts.set }));\n } else {\n console.log(`Default user set to: ${opts.set}`);\n }\n return;\n }\n\n if (opts.clear) {\n const deleted = await deleteSetting(db, \"user.id\");\n if (opts.json) {\n console.log(JSON.stringify({ userId: null, cleared: deleted }));\n } else if (deleted) {\n console.log(\"Default user cleared.\");\n } else {\n console.log(\"No default user was set.\");\n }\n return;\n }\n\n const userId = await getSetting(db, \"user.id\");\n if (opts.json) {\n console.log(JSON.stringify({ userId: userId ?? null }));\n return;\n }\n\n if (userId) {\n console.log(userId);\n } else {\n console.log(\"No default user set. Use: zam whoami --set <id>\");\n }\n });\n });\n","/**\n * `zam workspace` — Workspace management commands.\n *\n * `zam workspace publish` initializes a Git repository inside the local sandbox\n * workspace and pushes it to GitHub, establishing a secure version-controlled backup\n * and change-managed team workflow.\n */\n\nimport { execFileSync } from \"node:child_process\";\nimport { existsSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport { confirm, input } from \"@inquirer/prompts\";\nimport { Command } from \"commander\";\nimport type { Database } from \"../../kernel/index.js\";\nimport {\n getConfiguredWorkspaces,\n getDatabaseTargetInfo,\n hasCommand,\n openDatabase,\n removeConfiguredWorkspace,\n upsertConfiguredWorkspace,\n type WorkspaceConfig,\n type WorkspaceKind,\n type WorkspaceSourceControl,\n} from \"../../kernel/index.js\";\nimport {\n inspectSkillLinks,\n parseSetupAgents,\n type SkillLinkHealth,\n summarizeSkillLinkHealth,\n wireSkills,\n writeAgentsMd,\n writeClaudeMd,\n writeCopilotInstructions,\n} from \"../provisioning/index.js\";\nimport { ensureActiveWorkspace } from \"../workspaces/active.js\";\nimport { backupDatabaseTo } from \"../workspaces/backup.js\";\n\n/**\n * Execute a shell command inside a specific directory.\n */\nfunction runGit(cwd: string, args: string[]): string {\n try {\n return execFileSync(\"git\", args, {\n cwd,\n stdio: \"pipe\",\n encoding: \"utf8\",\n }).trim();\n } catch (err) {\n throw new Error(`Git command failed: ${(err as Error).message}`);\n }\n}\n\nexport function ghRepoCreateArgs(\n repoName: string,\n repoVisibility: \"--private\" | \"--public\",\n): string[] {\n return [\"repo\", \"create\", repoName, repoVisibility, \"--source=.\", \"--push\"];\n}\n\nexport function gitRemoteArgs(githubUrl: string, hasOrigin: boolean): string[] {\n return hasOrigin\n ? [\"remote\", \"set-url\", \"origin\", githubUrl]\n : [\"remote\", \"add\", \"origin\", githubUrl];\n}\n\nexport const workspaceCommand = new Command(\"workspace\").description(\n \"Manage your ZAM learning workspace\",\n);\n\nconst WORKSPACE_KINDS: WorkspaceKind[] = [\n \"personal\",\n \"team\",\n \"family\",\n \"community\",\n \"organization\",\n \"custom\",\n];\nconst WORKSPACE_SOURCE_CONTROLS: WorkspaceSourceControl[] = [\n \"github\",\n \"azure-devops\",\n \"git\",\n \"none\",\n];\n\nfunction parseWorkspaceKind(value?: string): WorkspaceKind {\n const kind = (value ?? \"custom\").toLowerCase();\n if (WORKSPACE_KINDS.includes(kind as WorkspaceKind)) {\n return kind as WorkspaceKind;\n }\n throw new Error(\n `Invalid workspace kind: ${value}. Use ${WORKSPACE_KINDS.join(\", \")}.`,\n );\n}\n\nfunction parseWorkspaceSourceControl(\n value?: string,\n): WorkspaceSourceControl | undefined {\n if (!value) return undefined;\n const source = value.toLowerCase();\n if (WORKSPACE_SOURCE_CONTROLS.includes(source as WorkspaceSourceControl)) {\n return source as WorkspaceSourceControl;\n }\n throw new Error(\n `Invalid source control: ${value}. Use ${WORKSPACE_SOURCE_CONTROLS.join(\", \")}.`,\n );\n}\n\nfunction parseScopes(value?: string): string[] | undefined {\n if (!value) return undefined;\n const scopes = value\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n return scopes.length > 0 ? scopes : undefined;\n}\n\nfunction requireWorkspace(id: string): WorkspaceConfig {\n const workspace = getConfiguredWorkspaces().find((item) => item.id === id);\n if (!workspace) {\n throw new Error(\n `Workspace \"${id}\" is not configured. Add it with: zam workspace add ${id} --path <dir>`,\n );\n }\n return workspace;\n}\n\nfunction formatLinkHealth(id: string, health: SkillLinkHealth): string {\n switch (health) {\n case \"healthy\":\n return \"ok\";\n case \"needs-repair\":\n return `needs repair — run: zam workspace setup ${id}`;\n case \"unmanaged\":\n return `unmanaged skill dir — run: zam workspace setup ${id} --force`;\n }\n}\n\nworkspaceCommand\n .command(\"list\")\n .description(\"List configured ZAM workspaces\")\n .option(\"--json\", \"Output as JSON\")\n .action((opts: { json?: boolean }) => {\n const workspaces = getConfiguredWorkspaces();\n const agents = parseSetupAgents();\n const linkHealth: Record<string, SkillLinkHealth> = Object.fromEntries(\n workspaces\n .filter((workspace) => existsSync(workspace.path))\n .map((workspace) => [\n workspace.id,\n summarizeSkillLinkHealth(inspectSkillLinks(workspace.path, agents)),\n ]),\n );\n if (opts.json) {\n console.log(JSON.stringify({ workspaces, linkHealth }, null, 2));\n return;\n }\n\n console.log(\"Configured ZAM workspaces:\\n\");\n if (workspaces.length === 0) {\n console.log(\n \" (none) — add one: zam workspace add personal --path <dir>\",\n );\n return;\n }\n\n for (const workspace of workspaces) {\n const label = workspace.label ? ` (${workspace.label})` : \"\";\n console.log(` ${workspace.id}${label}`);\n console.log(` kind: ${workspace.kind}`);\n console.log(` path: ${workspace.path}`);\n if (workspace.sourceControl) {\n console.log(` source: ${workspace.sourceControl}`);\n }\n if (workspace.knowledgeScopes?.length) {\n console.log(` scopes: ${workspace.knowledgeScopes.join(\", \")}`);\n }\n const health = linkHealth[workspace.id];\n if (health) {\n console.log(` links: ${formatLinkHealth(workspace.id, health)}`);\n }\n }\n });\n\nworkspaceCommand\n .command(\"add <id>\")\n .description(\"Register an existing directory as a ZAM workspace\")\n .requiredOption(\"--path <dir>\", \"Existing workspace/repository directory\")\n .option(\n \"--kind <kind>\",\n `Workspace kind (${WORKSPACE_KINDS.join(\" | \")})`,\n \"custom\",\n )\n .option(\"--label <label>\", \"Human-readable label\")\n .option(\n \"--source-control <provider>\",\n `Source-control provider (${WORKSPACE_SOURCE_CONTROLS.join(\" | \")})`,\n )\n .option(\"--scopes <list>\", \"Comma-separated knowledge scopes\")\n .option(\"--default-agent <id>\", \"Default agent harness for this workspace\")\n .action((id, opts) => {\n try {\n const path = resolve(String(opts.path));\n if (!existsSync(path)) {\n console.error(`Workspace path does not exist: ${path}`);\n process.exit(1);\n }\n const workspace: WorkspaceConfig = {\n id,\n kind: parseWorkspaceKind(opts.kind),\n path,\n ...(opts.label ? { label: opts.label } : {}),\n ...(opts.sourceControl\n ? { sourceControl: parseWorkspaceSourceControl(opts.sourceControl) }\n : {}),\n ...(parseScopes(opts.scopes)\n ? { knowledgeScopes: parseScopes(opts.scopes) }\n : {}),\n ...(opts.defaultAgent ? { defaultAgent: opts.defaultAgent } : {}),\n };\n // Provision the skill junctions first; only record the workspace once\n // linking succeeds, so a junction failure never leaves an orphaned entry.\n wireSkills(path, parseSetupAgents());\n upsertConfiguredWorkspace(workspace);\n console.log(`Registered and linked workspace \"${id}\" at ${path}.`);\n } catch (err) {\n console.error(`Error: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\nworkspaceCommand\n .command(\"remove <id>\")\n .description(\"Unregister a ZAM workspace without deleting its files\")\n .action((id) => {\n const existing = getConfiguredWorkspaces().find((item) => item.id === id);\n if (!existing) {\n console.error(`Workspace \"${id}\" is not configured.`);\n process.exit(1);\n }\n removeConfiguredWorkspace(id);\n console.log(\n `Unregistered workspace \"${id}\". Files in ${existing.path} were not changed.`,\n );\n });\n\nworkspaceCommand\n .command(\"setup <id>\")\n .description(\"Install ZAM skills into a configured workspace\")\n .option(\n \"--agents <list>\",\n \"comma-separated agents to wire: all, claude, copilot, codex, agent\",\n )\n .option(\n \"--force\",\n \"overwrite existing skill files and refresh ZAM blocks\",\n false,\n )\n .option(\n \"--dry-run\",\n \"show what would be written without changing files\",\n false,\n )\n .action((id, opts) => {\n try {\n const workspace = requireWorkspace(id);\n const agents = parseSetupAgents(opts.agents);\n console.log(\n `Setting up workspace \"${workspace.id}\" in ${workspace.path}${opts.dryRun ? \" (dry run)\" : \"\"}\\n`,\n );\n\n wireSkills(workspace.path, agents, {\n force: Boolean(opts.force),\n dryRun: Boolean(opts.dryRun),\n });\n if (agents.has(\"claude\")) {\n writeClaudeMd(false, workspace.path, {\n dryRun: Boolean(opts.dryRun),\n updateExisting: true,\n });\n }\n if (agents.has(\"codex\") || agents.has(\"agent\")) {\n writeAgentsMd(false, workspace.path, {\n dryRun: Boolean(opts.dryRun),\n updateExisting: true,\n });\n }\n if (agents.has(\"copilot\")) {\n writeCopilotInstructions(workspace.path, {\n dryRun: Boolean(opts.dryRun),\n updateExisting: true,\n });\n }\n } catch (err) {\n console.error(`Error: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\nworkspaceCommand\n .command(\"publish\")\n .description(\"Publish your local workspace sandbox to GitHub\")\n .action(async () => {\n let db: Awaited<ReturnType<typeof openDatabase>> | undefined;\n let workspaceDir = \"\";\n\n try {\n db = await openDatabase();\n workspaceDir = (await ensureActiveWorkspace(db)).path;\n await db.close();\n } catch {\n // Fallback if DB doesn't exist\n await db?.close();\n }\n\n if (!workspaceDir) {\n console.error(\n \"\\x1b[31m✗ No active workspace configured. Please run `zam init` first.\\x1b[0m\",\n );\n process.exit(1);\n }\n\n if (!existsSync(workspaceDir)) {\n console.error(\n `\\x1b[31m✗ Workspace directory does not exist: ${workspaceDir}\\x1b[0m`,\n );\n process.exit(1);\n }\n\n console.log(`\\nActive workspace: \\x1b[36m${workspaceDir}\\x1b[0m`);\n\n // ── Check Git command ────────────────────────────────────────────────────\n if (!hasCommand(\"git\")) {\n console.error(\n \"\\x1b[31m✗ Git command was not found on this system. Please install Git first.\\x1b[0m\",\n );\n process.exit(1);\n }\n\n // ── Setup .gitignore ─────────────────────────────────────────────────────\n const gitignorePath = join(workspaceDir, \".gitignore\");\n if (!existsSync(gitignorePath)) {\n writeFileSync(\n gitignorePath,\n \"node_modules/\\n.agent/\\n.agents/\\n.claude/\\n.gemini/\\n.goose/\\n*.log\\n\",\n \"utf8\",\n );\n }\n\n // ── Initialize Local Git Repo ────────────────────────────────────────────\n const hasGitRepo = existsSync(join(workspaceDir, \".git\"));\n if (!hasGitRepo) {\n console.log(\"Initializing local Git repository...\");\n runGit(workspaceDir, [\"init\", \"-b\", \"main\"]);\n runGit(workspaceDir, [\"add\", \".\"]);\n runGit(workspaceDir, [\n \"commit\",\n \"-m\",\n \"chore: initial workspace sandbox bootstrap\",\n ]);\n console.log(\"\\x1b[32m✓ Local Git repository initialized.\\x1b[0m\");\n } else {\n console.log(\"Git repository is already initialized.\");\n }\n\n // ── GitHub Publishing options ────────────────────────────────────────────\n const repoName = await input({\n message: \"Choose a name for your GitHub repository:\",\n default: \"zam-personal\",\n });\n\n const isPrivate = await confirm({\n message: \"Should the repository be private?\",\n default: true,\n });\n\n const repoVisibility = isPrivate ? \"--private\" : \"--public\";\n\n // ── Method A: Using GitHub CLI (gh) ──────────────────────────────────────\n if (hasCommand(\"gh\")) {\n console.log(\"GitHub CLI detected! Automating repository creation...\");\n const proceedGh = await confirm({\n message:\n \"Would you like ZAM to create the repository using the GitHub CLI?\",\n default: true,\n });\n\n if (proceedGh) {\n try {\n console.log(`Creating GitHub repository ${repoName}...`);\n execFileSync(\"gh\", ghRepoCreateArgs(repoName, repoVisibility), {\n cwd: workspaceDir,\n stdio: \"inherit\",\n });\n console.log(\n \"\\n\\x1b[32m✓ Successfully published workspace to GitHub!\\x1b[0m\",\n );\n process.exit(0);\n } catch (err) {\n console.warn(\n `\\x1b[33m⚠ GitHub CLI creation failed: ${(err as Error).message}\\x1b[0m`,\n );\n }\n }\n }\n\n // ── Method B: Manual Git setup instructions ──────────────────────────────\n console.log(\n \"\\n\\x1b[1mPlease create the repository manually on GitHub:\\x1b[0m\",\n );\n console.log(\" 1. Go to https://github.com/new\");\n console.log(` 2. Name it exactly: \\x1b[36m${repoName}\\x1b[0m`);\n console.log(\n ` 3. Choose \\x1b[36m${isPrivate ? \"Private\" : \"Public\"}\\x1b[0m`,\n );\n console.log(\n \" 4. Do NOT initialize it with README, .gitignore, or license\",\n );\n console.log(\" 5. Click 'Create repository'\\n\");\n\n const githubUrl = await input({\n message:\n \"Paste the repository Git URL (e.g. git@github.com:user/repo.git):\",\n });\n\n if (githubUrl) {\n try {\n console.log(\"Linking remote repository and pushing...\");\n // Check if origin already exists\n let hasOrigin = false;\n try {\n runGit(workspaceDir, [\"remote\", \"get-url\", \"origin\"]);\n hasOrigin = true;\n } catch {}\n\n runGit(workspaceDir, gitRemoteArgs(githubUrl, hasOrigin));\n\n runGit(workspaceDir, [\"push\", \"-u\", \"origin\", \"main\"]);\n console.log(\n \"\\x1b[32m✓ Successfully linked and pushed to GitHub!\\x1b[0m\",\n );\n } catch (err) {\n console.error(\n `\\x1b[31m✗ Push failed: ${(err as Error).message}\\x1b[0m`,\n );\n console.log(\n \"You can push manually later using: git push -u origin main\",\n );\n }\n }\n });\n\nworkspaceCommand\n .command(\"data-dir\")\n .description(\"Print the ZAM data directory (database, credentials, config)\")\n .option(\"--json\", \"Output as JSON\")\n .action((opts: { json?: boolean }) => {\n const dir = join(homedir(), \".zam\");\n console.log(opts.json ? JSON.stringify({ dataDir: dir }) : dir);\n });\n\nworkspaceCommand\n .command(\"backup\")\n .description(\"Back up the local ZAM database into your workspace\")\n .option(\n \"--dir <path>\",\n \"Target directory (default: workspace dir, else ~/Documents/zam)\",\n )\n .option(\"--json\", \"Output as JSON\")\n .action(async (opts: { dir?: string; json?: boolean }) => {\n const target = getDatabaseTargetInfo();\n if (target.kind !== \"local\") {\n const reason = `The database is ${target.kind} (${target.location}); file backup applies only to a local database — your Turso remote is already the cloud backup.`;\n if (opts.json) {\n console.log(JSON.stringify({ ok: false, reason }));\n return;\n }\n console.error(`\\x1b[33m⚠ ${reason}\\x1b[0m`);\n process.exit(1);\n }\n\n let db: Database | undefined;\n try {\n db = await openDatabase();\n const workspaceDir = opts.dir || (await ensureActiveWorkspace(db)).path;\n const dest = await backupDatabaseTo(db, workspaceDir);\n if (opts.json) {\n console.log(JSON.stringify({ ok: true, path: dest }));\n } else {\n console.log(`\\x1b[32m✓ Database backed up to ${dest}\\x1b[0m`);\n }\n } catch (err) {\n const reason = (err as Error).message;\n if (opts.json) {\n console.log(JSON.stringify({ ok: false, reason }));\n } else {\n console.error(`\\x1b[31m✗ Backup failed: ${reason}\\x1b[0m`);\n }\n process.exit(1);\n } finally {\n await db?.close();\n }\n });\n"],"mappings":"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","names":["readFileSync","dirname","join","fileURLToPath","Command","existsSync","writeFileSync","homedir","join","existsSync","join","join","existsSync","existsSync","join","homedir","writeFileSync","execFileSync","randomBytes","existsSync","readFileSync","rmSync","homedir","tmpdir","join","resolve","Command","spawn","existsSync","readFileSync","input","existsSync","readFileSync","resolve","spawn","confirm","t","BLOOM_VERBS","t","suggestFoundations","startSession","endSession","t","t","cleanHtmlText","normalizeForComparison","t","cleanHtmlText","normalizeForComparison","t","cleanHtmlText","normalizeForComparison","t","cleanHtmlText","normalizeForComparison","t","cleanHtmlText","normalizeForComparison","t","cleanHtmlText","normalizeForComparison","t","cleanHtmlText","normalizeForComparison","t","cleanHtmlText","normalizeForComparison","t","cleanHtmlText","normalizeForComparison","t","cleanHtmlText","normalizeForComparison","cleanHtmlText","t","normalizeForComparison","t","cleanHtmlText","normalizeForComparison","t","cleanHtmlText","normalizeForComparison","t","cleanHtmlText","normalizeForComparison","readFileSync","tmpdir","basename","join","LANGUAGE_NAMES","input","mkdirSync","readdirSync","rmSync","execSync","join","tmpdir","readFileSync","basename","existsSync","mkdirSync","readFileSync","writeFileSync","basename","dirname","join","existsSync","mkdirSync","homedir","basename","join","join","homedir","basename","mkdirSync","existsSync","mkdirSync","join","jsonOut","parseKnowledgeContextNames","resolveKnowledgeContexts","withDb","Command","withDb","jsonOut","join","homedir","existsSync","resolve","startSession","endSession","suggestFoundations","execFileSync","tmpdir","randomBytes","rmSync","readFileSync","writeFileSync","spawn","execSync","t","parseKnowledgeContextNames","resolveKnowledgeContexts","Command","Command","Command","Command","Command","confirm","t","titleLower","select","input","Command","task","execSync","existsSync","writeFileSync","join","Command","join","existsSync","writeFileSync","Command","execSync","existsSync","mkdirSync","resolve","input","Command","resolve","Command","existsSync","tasks","tokens","t","mkdirSync","input","existsSync","mkdirSync","writeFileSync","homedir","join","resolve","input","Command","homedir","mkdirSync","join","existsSync","writeFileSync","Command","resolve","input","Command","Command","input","Command","BLOOM_VERBS","input","confirm","input","confirm","input","Command","input","existsSync","readFileSync","dirname","join","fileURLToPath","Command","dirname","fileURLToPath","join","existsSync","readFileSync","startSession","endSession","suggestFoundations","Command","Command","Command","Command","Command","dirname","resolve","Command","C","Command","resolve","dirname","password","Command","Command","password","Command","Command","readFileSync","input","select","Command","Command","select","input","readFileSync","existsSync","Command","Command","existsSync","resolve","Command","Command","resolve","Command","Command","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","join","Command","Command","join","dirname","existsSync","mkdirSync","writeFileSync","readFileSync","Command","Command","Command","Command","t","spawn","existsSync","homedir","dirname","join","fileURLToPath","Command","C","dirname","fileURLToPath","existsSync","join","homedir","spawn","Command","spawnSync","existsSync","readFileSync","realpathSync","dirname","join","fileURLToPath","confirm","Command","C","dirname","fileURLToPath","pkg","readFileSync","join","render","Command","realpathSync","existsSync","spawnSync","runNpm","confirm","Command","Command","execFileSync","existsSync","writeFileSync","homedir","join","resolve","confirm","input","Command","runGit","execFileSync","Command","existsSync","resolve","join","writeFileSync","input","confirm","homedir","__dirname","dirname","fileURLToPath","pkg","readFileSync","join","Command"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/index.ts","../../src/cli/bootstrap/logic.ts"],"sourcesContent":["/**\n * CLI entry — a bootstrap that stays loadable even when node_modules or the\n * build is broken (ADR 2026-07-07). The real program lives in ./app.js; this\n * bundle depends only on Node builtins. Load failures are classified and, on\n * a developer checkout, healed automatically (opt out: ZAM_NO_AUTO_HEAL=1).\n */\nimport { spawnSync } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n classifyLoadError,\n planRecovery,\n readInstallChannel,\n} from \"./bootstrap/logic.js\";\n\n/** Nearest ancestor holding package.json — the checkout or bundle root. */\nfunction findRepoRoot(): string | null {\n let dir = dirname(fileURLToPath(import.meta.url));\n for (;;) {\n if (existsSync(join(dir, \"package.json\"))) return dir;\n const parent = dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\nfunction runHealCommand(cmd: string[], cwd: string): boolean {\n const res = spawnSync(cmd[0], cmd.slice(1), {\n cwd,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n // npm is npm.cmd on Windows, so child processes need a shell there.\n shell: process.platform === \"win32\",\n });\n // Heal output belongs on stderr: `zam mcp` must keep stdout protocol-clean.\n if (res.stdout) process.stderr.write(res.stdout);\n if (res.stderr) process.stderr.write(res.stderr);\n return res.status === 0;\n}\n\ntry {\n await import(\"./app.js\");\n} catch (err) {\n const classified = classifyLoadError(err);\n const repoRoot = findRepoRoot();\n const plan = planRecovery(classified, {\n channel: readInstallChannel(\n // Honor the repo-standard config override, mirroring the kernel's\n // defaultConfigPath() (install-config.ts) so bootstrap and kernel can\n // never disagree about the install channel.\n process.env.ZAM_CONFIG_PATH || join(homedir(), \".zam\", \"config.json\"),\n (p) => readFileSync(p, \"utf-8\"),\n ),\n repoRoot,\n hasGit: repoRoot !== null && existsSync(join(repoRoot, \".git\")),\n healedFlag: process.env.ZAM_BOOTSTRAP_HEALED === \"1\",\n noAutoHeal: process.env.ZAM_NO_AUTO_HEAL === \"1\",\n });\n\n // Ordinary command errors surface through the same import() promise —\n // never mislabel them as install problems.\n if (plan.mode === \"passthrough\") throw err;\n\n process.stderr.write(`${plan.message}\\n`);\n\n if (plan.mode === \"auto-heal\" && repoRoot) {\n const healed = plan.commands.every((cmd) => runHealCommand(cmd, repoRoot));\n if (healed) {\n const rerun = spawnSync(process.execPath, process.argv.slice(1), {\n stdio: \"inherit\",\n env: { ...process.env, ZAM_BOOTSTRAP_HEALED: \"1\" },\n });\n process.exit(rerun.status ?? 1);\n }\n process.stderr.write(\n \"zam: self-heal failed — try `npm ci && npm run build` in the checkout, and check your Node version.\\n\",\n );\n }\n process.exit(1);\n}\n","/**\n * Pure decision logic for the CLI bootstrap (src/cli/index.ts): classify a\n * load-time failure and plan the recovery. No side effects and no imports —\n * this module is compiled into the bootstrap bundle, which must stay loadable\n * when node_modules is broken (ADR 2026-07-07).\n */\n\nexport type LoadErrorKind =\n | \"missing-package\"\n | \"stale-build\"\n | \"native-abi\"\n | \"unknown\";\n\nexport interface LoadErrorClassification {\n kind: LoadErrorKind;\n /** The missing package, missing module path, or native module, if known. */\n subject?: string;\n}\n\nexport function classifyLoadError(err: unknown): LoadErrorClassification {\n const code = (err as { code?: string } | null | undefined)?.code;\n const message = err instanceof Error ? err.message : String(err ?? \"\");\n\n if (code === \"ERR_MODULE_NOT_FOUND\") {\n // Node phrases a bare-specifier miss as \"Cannot find package 'x'\" and a\n // path miss (stale/partial dist) as \"Cannot find module '/path/to/x.js'\".\n const pkg = message.match(/Cannot find package '([^']+)'/);\n if (pkg) return { kind: \"missing-package\", subject: pkg[1] };\n const mod = message.match(/Cannot find module '([^']+)'/);\n if (mod) return { kind: \"stale-build\", subject: mod[1] };\n return { kind: \"missing-package\" };\n }\n if (code === \"ERR_DLOPEN_FAILED\") {\n const native = message.match(/([\\w-]+)\\.node/);\n return { kind: \"native-abi\", subject: native?.[1] };\n }\n return { kind: \"unknown\" };\n}\n\nexport interface RecoveryContext {\n /** Install channel from ~/.zam/config.json; only \"developer\" may heal. */\n channel: string;\n /** Nearest ancestor of the bootstrap holding package.json, if any. */\n repoRoot: string | null;\n /** Whether repoRoot also holds .git (false for packaged bundles). */\n hasGit: boolean;\n /** ZAM_BOOTSTRAP_HEALED=1 — a self-heal already ran in a parent process. */\n healedFlag: boolean;\n /** ZAM_NO_AUTO_HEAL=1 — explicit opt-out. */\n noAutoHeal: boolean;\n}\n\nexport interface RecoveryPlan {\n mode: \"auto-heal\" | \"instruct\" | \"passthrough\";\n /** Commands to run in repoRoot (auto-heal) or to surface (instruct). */\n commands: string[][];\n /** stderr copy: heal banner or instruction text. Empty for passthrough. */\n message: string;\n}\n\nfunction remedyCommands(c: LoadErrorClassification): string[][] {\n switch (c.kind) {\n case \"missing-package\":\n return [\n [\"npm\", \"install\"],\n [\"npm\", \"run\", \"build\"],\n ];\n case \"stale-build\":\n return [[\"npm\", \"run\", \"build\"]];\n case \"native-abi\":\n return [[\"npm\", \"rebuild\", c.subject ?? \"\"].filter(Boolean)];\n default:\n return [];\n }\n}\n\nfunction describeFailure(c: LoadErrorClassification): string {\n switch (c.kind) {\n case \"missing-package\":\n return c.subject\n ? `the dependency \"${c.subject}\" is not installed (node_modules is out of sync with package.json)`\n : \"a dependency is not installed (node_modules is out of sync with package.json)\";\n case \"stale-build\":\n return `the build output is stale or incomplete (${c.subject ?? \"missing module\"})`;\n case \"native-abi\":\n return `a native module failed to load (Node ABI mismatch${c.subject ? `: ${c.subject}` : \"\"})`;\n default:\n return \"an unexpected error\";\n }\n}\n\nexport function planRecovery(\n c: LoadErrorClassification,\n ctx: RecoveryContext,\n): RecoveryPlan {\n if (c.kind === \"unknown\") {\n return { mode: \"passthrough\", commands: [], message: \"\" };\n }\n\n const commands = remedyCommands(c);\n const rendered = commands.map((cmd) => cmd.join(\" \")).join(\" && \");\n const where = ctx.repoRoot ?? \"your ZAM source checkout\";\n\n const healable =\n ctx.channel === \"developer\" &&\n ctx.repoRoot !== null &&\n ctx.hasGit &&\n !ctx.healedFlag &&\n !ctx.noAutoHeal;\n\n if (healable) {\n return {\n mode: \"auto-heal\",\n commands,\n message: `zam: ${describeFailure(c)} — self-healing (${rendered}) in ${where}`,\n };\n }\n return {\n mode: \"instruct\",\n commands,\n message:\n `zam cannot start: ${describeFailure(c)}.\\n` +\n `Fix: run \\`${rendered}\\` in ${where}` +\n (ctx.healedFlag\n ? \"\\n(an automatic self-heal already ran and did not resolve it — try `npm ci && npm run build`, and check your Node version)\"\n : \"\"),\n };\n}\n\n/**\n * Read the install channel from ~/.zam/config.json without importing kernel\n * code. Mirrors kernel/system/install-config.ts getInstallChannel(): explicit\n * channel wins; otherwise mode \"developer\" (or absent/unreadable) → developer,\n * any other mode → direct.\n */\nexport function readInstallChannel(\n configPath: string,\n readFile: (p: string) => string,\n): string {\n try {\n const parsed = JSON.parse(readFile(configPath)) as {\n mode?: string;\n channel?: string;\n };\n if (parsed.channel) return parsed.channel;\n return (parsed.mode ?? \"developer\") === \"developer\"\n ? \"developer\"\n : \"direct\";\n } catch {\n return \"developer\";\n }\n}\n"],"mappings":"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","names":[]}
|