@edihasaj/recall 0.5.7 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-K5FZ47NN.js → chunk-7XCLKPJ3.js} +6 -8
- package/dist/{chunk-K5FZ47NN.js.map → chunk-7XCLKPJ3.js.map} +1 -1
- package/dist/{chunk-A5UIRZU6.js → chunk-A6XEULA4.js} +3 -2
- package/dist/chunk-A6XEULA4.js.map +1 -0
- package/dist/{chunk-F56Y3SHS.js → chunk-E4HJDGCW.js} +7 -9
- package/dist/{chunk-F56Y3SHS.js.map → chunk-E4HJDGCW.js.map} +1 -1
- package/dist/{chunk-IILLSHLM.js → chunk-KAGIAOD7.js} +2583 -84
- package/dist/chunk-KAGIAOD7.js.map +1 -0
- package/dist/{chunk-FHKV6ELT.js → chunk-MJ4GGBTL.js} +11 -13
- package/dist/{chunk-FHKV6ELT.js.map → chunk-MJ4GGBTL.js.map} +1 -1
- package/dist/{chunk-LVQW6WHK.js → chunk-XUM7JEJU.js} +2 -2
- package/dist/{cleanup-TVOX2S2S.js → cleanup-MYSQ44EP.js} +4 -4
- package/dist/cli.js +206 -33
- package/dist/cli.js.map +1 -1
- package/dist/daemon.js +60 -49
- package/dist/daemon.js.map +1 -1
- package/dist/dispatcher-SUUX5AX6.js +16 -0
- package/dist/mcp.js +5 -5
- package/dist/{quality-Z7LPMMBC.js → quality-YTQKAEY6.js} +3 -3
- package/dist/{tasks-UOLSPXJQ.js → tasks-GSQUHD4F.js} +6 -3
- package/dist/{usage-CY3V72YN.js → usage-DU4TKVJH.js} +2 -2
- package/package.json +1 -1
- package/dist/chunk-A5UIRZU6.js.map +0 -1
- package/dist/chunk-GC5XMBG4.js +0 -551
- package/dist/chunk-GC5XMBG4.js.map +0 -1
- package/dist/chunk-IILLSHLM.js.map +0 -1
- package/dist/chunk-VEPXEHRZ.js +0 -1763
- package/dist/chunk-VEPXEHRZ.js.map +0 -1
- package/dist/dispatcher-UGMU6THT.js +0 -15
- /package/dist/{chunk-LVQW6WHK.js.map → chunk-XUM7JEJU.js.map} +0 -0
- /package/dist/{cleanup-TVOX2S2S.js.map → cleanup-MYSQ44EP.js.map} +0 -0
- /package/dist/{dispatcher-UGMU6THT.js.map → dispatcher-SUUX5AX6.js.map} +0 -0
- /package/dist/{quality-Z7LPMMBC.js.map → quality-YTQKAEY6.js.map} +0 -0
- /package/dist/{tasks-UOLSPXJQ.js.map → tasks-GSQUHD4F.js.map} +0 -0
- /package/dist/{usage-CY3V72YN.js.map → usage-DU4TKVJH.js.map} +0 -0
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/sync/client.ts","../src/setup/local.ts","../src/agents/claude-code.ts","../src/agents/utils.ts","../src/agents/codex.ts","../src/doctor/report.ts","../src/daemon/launchd.ts","../src/daemon/systemd.ts","../src/daemon/service.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { resolve } from \"node:path\";\nimport { writeFileSync, readFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { initDb, getDbPath, resetDb } from \"./db/client.js\";\nimport {\n listMemories,\n listRepos,\n getMemory,\n confirmMemory,\n rejectMemory,\n queryMemories,\n recordFeedback,\n} from \"./models/memory.js\";\nimport { scanAndStore } from \"./scanner/repo.js\";\nimport { compileContext, compileContextHybrid } from \"./compiler/context.js\";\nimport { processCorrection, processReviewFeedback } from \"./capture/correction.js\";\nimport { exportClaude, exportCodex, exportMarkdown } from \"./adapters/markdown.js\";\nimport { writeRepoContextArtifact } from \"./artifacts/context.js\";\nimport { inferRepoSlugFromPath } from \"./repo/discovery.js\";\nimport { sync, createTeam, joinTeam } from \"./sync/client.js\";\nimport { computeMetrics, formatMetricsReport, startEvalSession, endEvalSession } from \"./eval/harness.js\";\nimport { formatRetrievalEvalReport, loadRetrievalEvalFile, runRetrievalEval } from \"./eval/retrieval.js\";\nimport {\n bootstrapEmbeddings,\n ensureEmbeddingProviderReady,\n getEmbeddingModelInfo,\n hybridSearch,\n loadEmbeddingConfigFromEnv,\n rebuildEmbeddingIndex,\n verifyEmbeddings,\n} from \"./embeddings/embeddings.js\";\nimport { recordSignal, getSignalStats } from \"./feedback/implicit.js\";\nimport { inferScope, analyzeScopePatterns } from \"./capture/scope.js\";\nimport { createPolicy, listPolicies, togglePolicy, deletePolicy, evaluatePolicy, requestApproval, resolveApproval, listPendingApprovals } from \"./policy/engine.js\";\nimport { computeHealthScore, computeAllHealthScores, formatHealthReport } from \"./health/scoring.js\";\nimport { detectContradictions, resolveContradiction, autoResolveContradictions, listContradictions } from \"./contradictions/detector.js\";\nimport { pruneMemories, formatPruneReport } from \"./pruning/pruner.js\";\nimport { getAuditTrail, getRecentAudit, formatAuditTrail, rollbackMemory } from \"./audit/trail.js\";\nimport { getRepoQualityProfile } from \"./repo/quality.js\";\nimport { createActivityEvent, listActivityEvents, listActivitySessions } from \"./models/activity.js\";\nimport { runLocalSetup } from \"./setup/local.js\";\nimport { runRecallSetup } from \"./setup/local.js\";\nimport type { SyncConfig, EmbeddingConfig } from \"./types.js\";\nimport { createRequire } from \"node:module\";\nimport { pathToFileURL } from \"node:url\";\nimport { listHistorySnippets } from \"./history/snippets.js\";\nimport { searchHistorySnippets } from \"./history/retrieval.js\";\nimport { formatDoctorReport, getDoctorReport } from \"./doctor/report.js\";\nimport { ensureDailyBackup, listBackups, restoreBackup } from \"./backups/snapshot.js\";\nimport { getHookCallStats } from \"./hooks/calls.js\";\nimport {\n defaultServiceLabel,\n getServiceInfo,\n installService,\n startService,\n stopService,\n uninstallService,\n} from \"./daemon/service.js\";\nimport {\n dispatchCodexNotify,\n executePromptHook,\n executeSessionEndHook,\n executeSessionStartHook,\n executeToolHook,\n formatInjectionContext,\n formatMaintenanceBacklogContext,\n formatPendingConfirmationsContext,\n parseInteger,\n parseRecentToolCallsOption,\n readClaudeCodePromptInputFromStdin,\n readClaudeCodeSessionEndInputFromStdin,\n readClaudeCodeSessionStartInputFromStdin,\n readClaudeCodeToolInputFromStdin,\n readCodexPromptInputFromStdin,\n readCodexSessionEndInputFromStdin,\n readCodexSessionStartInputFromStdin,\n readCodexToolInputFromStdin,\n} from \"./cli/hook.js\";\n\nconst require = createRequire(import.meta.url);\nconst pkg = require(\"../package.json\");\n\nconst program = new Command();\n\nprogram\n .name(\"recall\")\n .description(\"Cross-tool coding memory and instruction compiler\")\n .version(pkg.version);\n\n// --- init ---\n\nprogram\n .command(\"init\")\n .description(\"Initialize Recall database\")\n .action(() => {\n initDb();\n console.log(\"Recall initialized. Database ready.\");\n });\n\nprogram\n .command(\"doctor\")\n .description(\"Show local Recall runtime, DB, embedding, and agent-install health\")\n .option(\"--json\", \"Emit raw JSON report\")\n .option(\"--fix\", \"Install missing hooks/MCP for detected agents\")\n .action((opts) => {\n const report = getDoctorReport();\n if (opts.fix) {\n const detectedAgents = report.agents\n .filter((a) => a.detected && (!a.mcp || !a.hooks))\n .map((a) => a.agent);\n if (detectedAgents.length === 0) {\n if (!opts.json) console.log(\"Nothing to fix — all detected agents are wired.\");\n } else {\n const fixResult = runRecallSetup({\n agent: detectedAgents,\n });\n if (!opts.json) {\n console.log(`Applied fix for: ${detectedAgents.join(\", \")}`);\n for (const agent of fixResult.agents) {\n console.log(`${formatAgentName(agent.agent)} MCP: ${formatSetupStep(agent.mcp)}`);\n console.log(`${formatAgentName(agent.agent)} hooks: ${formatSetupStep(agent.hooks)}`);\n }\n console.log(\"\");\n }\n }\n }\n\n const finalReport = opts.fix ? getDoctorReport() : report;\n if (opts.json) {\n console.log(JSON.stringify(finalReport, null, 2));\n return;\n }\n console.log(formatDoctorReport(finalReport));\n });\n\nconst dbCmd = program\n .command(\"db\")\n .description(\"Manage the local Recall database\");\n\ndbCmd\n .command(\"reset\")\n .description(\"Reset the local Recall database and reinitialize the clean schema\")\n .option(\"--yes\", \"Confirm destructive reset\")\n .option(\"--yes-i-know\", \"Confirm destructive reset\")\n .option(\"--purge-models\", \"Also remove the local embedding model cache\")\n .action((opts) => {\n if (!opts.yes && !opts.yesIKnow) {\n console.error(\"Refusing to reset without --yes or --yes-i-know.\");\n process.exit(1);\n }\n\n const dbPath = getDbPath();\n resetDb(dbPath, { purgeModels: opts.purgeModels });\n initDb(dbPath);\n console.log(`Reset ${dbPath}`);\n if (opts.purgeModels) {\n console.log(\"Purged local embedding model cache.\");\n }\n });\n\ndbCmd\n .command(\"backup\")\n .description(\"Create a dated snapshot of the local database (idempotent per day)\")\n .option(\"--retention <n>\", \"Number of snapshots to retain\", (v) => Number.parseInt(v, 10))\n .action((opts) => {\n initDb();\n const result = ensureDailyBackup({\n retention: Number.isFinite(opts.retention) ? opts.retention : undefined,\n });\n if (result.created) console.log(`Created ${result.created}`);\n else console.log(\"Today's backup already exists.\");\n console.log(`Retained: ${result.retained.length}`);\n for (const p of result.retained) console.log(` ${p}`);\n if (result.removed.length) {\n console.log(`Removed: ${result.removed.length}`);\n for (const p of result.removed) console.log(` ${p}`);\n }\n });\n\ndbCmd\n .command(\"backups\")\n .description(\"List available database snapshots\")\n .action(() => {\n const backups = listBackups();\n if (backups.length === 0) {\n console.log(\"No backups yet.\");\n return;\n }\n for (const b of backups) {\n const mb = (b.size_bytes / 1024 / 1024).toFixed(2);\n console.log(`${b.date} ${mb} MB ${b.path}`);\n }\n });\n\ndbCmd\n .command(\"restore <date>\")\n .description(\"Restore the local database from a dated snapshot (YYYY-MM-DD)\")\n .option(\"--yes\", \"Confirm overwrite\")\n .action((date: string, opts) => {\n if (!opts.yes) {\n console.error(\"Refusing to restore without --yes.\");\n process.exit(1);\n }\n const result = restoreBackup(date);\n if (!result.restored) {\n console.error(`No backup found at ${result.from}`);\n process.exit(1);\n }\n console.log(`Restored ${result.from} -> ${result.to}`);\n });\n\nconst setupCmd = program\n .command(\"setup\")\n .description(\"Setup Recall for local use\");\n\nsetupCmd\n .option(\"--app-path <path>\", \"Override Recall.app path\", \"/Applications/Recall.app\")\n .option(\"--hooks-only\", \"Install hooks only\")\n .option(\"--mcp-only\", \"Install MCP wiring only\")\n .option(\"--agent <agent>\", \"Restrict setup to a single agent (repeatable)\", collectAgents, [])\n .option(\"--uninstall-hooks\", \"Remove Recall-managed hooks while leaving MCP configured\")\n .option(\"--dry-run\", \"Show planned setup changes without writing\")\n .option(\"--scope <scope>\", \"Hook config scope: global or project\", \"global\")\n .option(\"--no-prompt-injection\", \"Opt out of per-prompt memory injection (writes RECALL_HOOK_INJECT_PROMPT=false inline into the agent hook command)\")\n .option(\"--yes\", \"Skip confirmation prompt\")\n .action(async (opts) => {\n if (!opts.yes && !opts.dryRun) {\n const confirmed = await confirmSetupWrite(opts.scope);\n if (!confirmed) {\n console.error(\"Aborted setup.\");\n process.exit(1);\n }\n }\n\n const result = runRecallSetup({\n appPath: opts.appPath,\n agent: opts.agent.length > 0 ? opts.agent : undefined,\n dryRun: opts.dryRun,\n hooksOnly: opts.hooksOnly,\n mcpOnly: opts.mcpOnly,\n scope: opts.scope,\n uninstallHooks: opts.uninstallHooks,\n promptInjection: opts.promptInjection,\n });\n\n console.log(`Recall app: ${result.appPath}`);\n console.log(`Bundled node: ${result.runtimeNodePath}`);\n console.log(`Bundled CLI: ${result.runtimeCliPath}`);\n console.log(`Bundled MCP: ${result.runtimeMcpPath}`);\n console.log(`Scope: ${result.scope}${result.dry_run ? \" (dry-run)\" : \"\"}`);\n console.log(\"\");\n if (result.agents.length === 0) {\n console.log(\"No installed agents detected.\");\n return;\n }\n for (const agent of result.agents) {\n console.log(`${formatAgentName(agent.agent)}:`);\n console.log(` detected: ${agent.detected ? \"yes\" : \"no\"}`);\n console.log(` mcp: ${formatSetupStep(agent.mcp)}`);\n console.log(` hooks: ${formatSetupStep(agent.hooks)}`);\n if (agent.hook_config_path) {\n console.log(` config: ${agent.hook_config_path}`);\n }\n }\n });\n\nsetupCmd\n .command(\"local\")\n .description(\"Configure local agent MCP + hooks against the installed Recall.app\")\n .option(\"--app-path <path>\", \"Override Recall.app path\", \"/Applications/Recall.app\")\n .option(\"--codex-only\", \"Configure only Codex\")\n .option(\"--claude-only\", \"Configure only Claude\")\n .option(\"--no-prompt-injection\", \"Opt out of per-prompt memory injection (writes RECALL_HOOK_INJECT_PROMPT=false inline into the agent hook command)\")\n .action((opts) => {\n const result = runLocalSetup({\n appPath: opts.appPath,\n codex: opts.claudeOnly ? false : true,\n claude: opts.codexOnly ? false : true,\n promptInjection: opts.promptInjection,\n });\n\n console.log(`Recall app: ${result.appPath}`);\n console.log(`Bundled node: ${result.runtimeNodePath}`);\n console.log(`Bundled CLI: ${result.runtimeCliPath}`);\n console.log(`Bundled MCP: ${result.runtimeMcpPath}`);\n console.log(\"\");\n console.log(`Codex MCP: ${formatSetupStep(result.codex)}`);\n console.log(`Codex hooks: ${formatSetupStep(result.codex_hooks)}`);\n console.log(`Claude MCP: ${formatSetupStep(result.claude)}`);\n console.log(`Claude hooks: ${formatSetupStep(result.claude_hooks)}`);\n });\n\n// --- hook ---\n\nconst hookCmd = program\n .command(\"hook\")\n .description(\"Run lifecycle hook handlers for agent integrations\");\n\n// Self-healing wrapper: lifecycle hooks must never break the host agent.\n// Failures are appended to ~/.recall/logs/hook-errors.log and the process\n// exits 0 silently so Claude Code / Codex don't surface a non-blocking error\n// during transient daemon restarts, schema upgrades, or first-run init.\nfunction safeHookAction<Args extends unknown[], R>(\n event: string,\n action: (...args: Args) => Promise<R>,\n): (...args: Args) => Promise<R | void> {\n return async (...args: Args) => {\n try {\n return await action(...args);\n } catch (error) {\n let logPath = \"~/.recall/logs/hook-errors.log\";\n try {\n const { appendFileSync, mkdirSync, statSync, renameSync, rmSync } = await import(\"node:fs\");\n const { homedir } = await import(\"node:os\");\n const dir = join(homedir(), \".recall\", \"logs\");\n mkdirSync(dir, { recursive: true });\n logPath = join(dir, \"hook-errors.log\");\n try {\n const maxBytes = parseInt(process.env.RECALL_HOOK_LOG_MAX_BYTES ?? String(1024 * 1024), 10);\n if (maxBytes > 0 && statSync(logPath).size >= maxBytes) {\n const rotated = `${logPath}.1`;\n try { rmSync(rotated, { force: true }); } catch {}\n renameSync(logPath, rotated);\n }\n } catch {\n // file missing is fine\n }\n const message = error instanceof Error\n ? error.stack ?? error.message\n : String(error);\n appendFileSync(\n logPath,\n `${new Date().toISOString()} ${event} ${message}\\n`,\n );\n } catch {\n // Logging best-effort only — never throw from the safety net.\n }\n // Single-line heads-up so the host TUI doesn't get flooded by stack\n // traces if it surfaces stderr. Full detail lives in the log file.\n process.stderr.write(\n `Recall: ${event} hook hit a snag — see ${logPath}\\n`,\n );\n process.exit(0);\n }\n };\n}\n\nhookCmd\n .command(\"prompt\")\n .description(\"Record a submitted prompt\")\n .option(\"--text <text>\", \"Prompt text\")\n .option(\"--repo <repo>\", \"Repository slug\")\n .option(\"--repo-path <path>\", \"Repository path\")\n .option(\"--session <id>\", \"Session ID\")\n .option(\"--path <path>\", \"File path context\")\n .option(\"--agent <agent>\", \"Agent name\")\n .option(\"--prev-assistant <text>\", \"Previous assistant turn\")\n .option(\"--recent-tools <json>\", \"Recent tool calls as a JSON array\")\n .option(\"--claude-code-stdin\", \"Read Claude Code hook JSON from stdin\")\n .option(\"--codex-stdin\", \"Read Codex hook JSON from stdin\")\n .action(safeHookAction(\"prompt\", async (opts) => {\n const stdinAgent = opts.claudeCodeStdin ? \"claude-code\" : opts.codexStdin ? \"codex\" : null;\n const input = stdinAgent === \"claude-code\"\n ? await readClaudeCodePromptInputFromStdin()\n : stdinAgent === \"codex\"\n ? await readCodexPromptInputFromStdin()\n : {\n text: opts.text,\n repo: opts.repo,\n repo_path: opts.repoPath,\n session_id: opts.session,\n path: opts.path,\n agent: opts.agent,\n prev_assistant_turn: opts.prevAssistant,\n recent_tool_calls: parseRecentToolCallsOption(opts.recentTools),\n };\n const result = await executePromptHook(input);\n if (stdinAgent && result.injection) {\n const output = {\n hookSpecificOutput: {\n hookEventName: \"UserPromptSubmit\",\n additionalContext: formatInjectionContext(result.injection),\n },\n };\n process.stdout.write(`${JSON.stringify(output)}\\n`);\n }\n }));\n\nhookCmd\n .command(\"tool\")\n .description(\"Record a completed tool invocation\")\n .option(\"--name <name>\", \"Tool name\")\n .option(\"--exit <code>\", \"Tool exit code\")\n .option(\"--repo <repo>\", \"Repository slug\")\n .option(\"--repo-path <path>\", \"Repository path\")\n .option(\"--session <id>\", \"Session ID\")\n .option(\"--path <path>\", \"File path context\")\n .option(\"--agent <agent>\", \"Agent name\")\n .option(\"--input-summary <text>\", \"Tool input summary\")\n .option(\"--claude-code-stdin\", \"Read Claude Code hook JSON from stdin\")\n .option(\"--codex-stdin\", \"Read Codex hook JSON from stdin\")\n .action(safeHookAction(\"tool\", async (opts) => {\n const input = opts.claudeCodeStdin\n ? await readClaudeCodeToolInputFromStdin()\n : opts.codexStdin\n ? await readCodexToolInputFromStdin()\n : {\n name: opts.name,\n exit_code: parseInteger(opts.exit, \"exit\"),\n repo: opts.repo,\n repo_path: opts.repoPath,\n session_id: opts.session,\n path: opts.path,\n agent: opts.agent,\n input_summary: opts.inputSummary,\n };\n await executeToolHook(input);\n }));\n\nhookCmd\n .command(\"session-start\")\n .description(\"Record session start\")\n .option(\"--session <id>\", \"Session ID\")\n .option(\"--agent <agent>\", \"Agent name\")\n .option(\"--repo <repo>\", \"Repository slug\")\n .option(\"--repo-path <path>\", \"Repository path\")\n .option(\"--path <path>\", \"File path context\")\n .option(\"--claude-code-stdin\", \"Read Claude Code hook JSON from stdin\")\n .option(\"--codex-stdin\", \"Read Codex hook JSON from stdin\")\n .action(safeHookAction(\"session-start\", async (opts) => {\n const stdinAgent = opts.claudeCodeStdin ? \"claude-code\" : opts.codexStdin ? \"codex\" : null;\n const input = stdinAgent === \"claude-code\"\n ? await readClaudeCodeSessionStartInputFromStdin()\n : stdinAgent === \"codex\"\n ? await readCodexSessionStartInputFromStdin()\n : {\n session_id: opts.session,\n agent: opts.agent,\n repo: opts.repo,\n repo_path: opts.repoPath,\n path: opts.path,\n };\n const result = await executeSessionStartHook(input);\n if (stdinAgent) {\n const parts: string[] = [];\n if (result.injection) parts.push(formatInjectionContext(result.injection));\n if (result.maintenance_backlog) {\n parts.push(formatMaintenanceBacklogContext(result.maintenance_backlog));\n }\n if (result.pending_confirmations) {\n parts.push(formatPendingConfirmationsContext(result.pending_confirmations));\n }\n if (parts.length > 0) {\n const output = {\n hookSpecificOutput: {\n hookEventName: \"SessionStart\",\n additionalContext: parts.join(\"\\n\\n\"),\n },\n };\n process.stdout.write(`${JSON.stringify(output)}\\n`);\n }\n }\n }));\n\nhookCmd\n .command(\"session-end\")\n .description(\"Record session end\")\n .option(\"--session <id>\", \"Session ID\")\n .option(\"--repo <repo>\", \"Repository slug\")\n .option(\"--repo-path <path>\", \"Repository path\")\n .option(\"--path <path>\", \"File path context\")\n .option(\"--agent <agent>\", \"Agent name\")\n .option(\"--turn-count <count>\", \"Turn count\")\n .option(\"--claude-code-stdin\", \"Read Claude Code hook JSON from stdin\")\n .option(\"--codex-stdin\", \"Read Codex hook JSON from stdin\")\n .action(safeHookAction(\"session-end\", async (opts) => {\n const input = opts.claudeCodeStdin\n ? await readClaudeCodeSessionEndInputFromStdin()\n : opts.codexStdin\n ? await readCodexSessionEndInputFromStdin()\n : {\n session_id: opts.session,\n repo: opts.repo,\n repo_path: opts.repoPath,\n path: opts.path,\n agent: opts.agent,\n turn_count: opts.turnCount ? parseInteger(opts.turnCount, \"turn-count\") : undefined,\n };\n await executeSessionEndHook(input);\n }));\n\nhookCmd\n .command(\"codex-notify\")\n .description(\"Bridge a Codex notify payload into Recall hook handlers\")\n .argument(\"[payload]\", \"Codex notify payload JSON\")\n .action(safeHookAction(\"codex-notify\", async (payload?: string) => {\n await dispatchCodexNotify(payload);\n }));\n\nhookCmd\n .command(\"stats\")\n .description(\"Inspect local hook call telemetry\")\n .option(\"--agent <agent>\", \"Filter by agent\")\n .option(\"--event <event>\", \"Filter by event\")\n .option(\"--limit <n>\", \"Limit rows\")\n .option(\"--json\", \"Emit raw JSON\")\n .action((opts) => {\n const db = initDb();\n const stats = getHookCallStats(db, {\n agent: opts.agent,\n event: opts.event,\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined,\n });\n\n if (opts.json) {\n console.log(JSON.stringify(stats, null, 2));\n return;\n }\n\n if (stats.length === 0) {\n console.log(\"No hook calls recorded.\");\n return;\n }\n\n for (const row of stats) {\n console.log(\n `${row.agent.padEnd(12)} ${row.event.padEnd(16)} total=${row.total_calls} ok=${row.ok_calls} err=${row.error_calls} avg=${row.avg_duration_ms.toFixed(1)}ms max=${row.max_duration_ms}ms last=${row.last_called_at}`,\n );\n }\n });\n\n// --- scan ---\n\nprogram\n .command(\"scan\")\n .description(\"Scan a repository and bootstrap memories\")\n .argument(\"[path]\", \"Repository path\", \".\")\n .option(\"-s, --session <id>\", \"Session ID\")\n .action((path: string, opts) => {\n const db = initDb();\n const repoPath = resolve(path);\n const ids = scanAndStore(db, repoPath);\n const artifact = writeRepoContextArtifact(db, {\n repo: inferRepoSlugFromPath(repoPath),\n repo_path: repoPath,\n });\n const scanned = ids\n .map((id) => getMemory(db, id))\n .filter((mem) => mem != null);\n const activeCount = scanned.filter((mem) => mem.status === \"active\").length;\n const candidateCount = scanned.filter((mem) => mem.status === \"candidate\").length;\n console.log(`Scanned ${repoPath}`);\n console.log(`Created ${ids.length} memories (${activeCount} active, ${candidateCount} candidate).`);\n if (artifact.output_path) {\n console.log(`Updated ${artifact.output_path}`);\n }\n createActivityEvent(db, {\n session_id: opts.session ?? null,\n repo: scanned[0]?.repo ?? null,\n source: \"cli\",\n event_type: \"scan\",\n memory_ids: ids,\n request: { repo_path: repoPath },\n result: { created: ids.length, active: activeCount, candidate: candidateCount },\n });\n\n if (ids.length > 0) {\n console.log(\"\\nMemories:\");\n for (const id of ids) {\n const mem = getMemory(db, id);\n if (mem) {\n console.log(\n ` [${mem.status}] (${mem.confidence.toFixed(2)}) ${mem.type}: ${mem.text}`,\n );\n }\n }\n console.log(\n \"\\nUse `recall confirm <id>` to promote candidates, or `recall reject <id>` to discard.\",\n );\n }\n });\n\n// --- list ---\n\nprogram\n .command(\"repos\")\n .description(\"List repositories known to Recall\")\n .action(() => {\n const db = initDb();\n const repos = listRepos(db);\n if (repos.length === 0) {\n console.log(\"No repositories found.\");\n return;\n }\n for (const repo of repos) {\n console.log(repo);\n }\n console.log(`\\n${repos.length} repos total.`);\n });\n\nprogram\n .command(\"list\")\n .description(\"List memories\")\n .option(\"-r, --repo <repo>\", \"Filter by repository\")\n .option(\n \"-s, --status <status>\",\n \"Filter by status (transient|candidate|active|rejected)\",\n )\n .option(\"-t, --type <type>\", \"Filter by type\")\n .option(\"-n, --limit <n>\", \"Limit results\")\n .option(\"--offset <n>\", \"Skip first N results\", \"0\")\n .action((opts) => {\n const db = initDb();\n const items = queryMemories(db, {\n repo: opts.repo,\n status: opts.status,\n type: opts.type,\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined,\n offset: opts.offset ? parseInt(opts.offset, 10) : undefined,\n });\n\n if (items.length === 0) {\n console.log(\"No memories found.\");\n return;\n }\n\n for (const m of items) {\n const prefix = m.id.slice(0, 8);\n console.log(\n `${prefix} [${m.status.padEnd(9)}] (${m.confidence.toFixed(2)}) ${m.type.padEnd(14)} ${m.text}`,\n );\n }\n console.log(`\\n${items.length} memories total.`);\n });\n\n// --- show ---\n\nprogram\n .command(\"show\")\n .description(\"Show memory details\")\n .argument(\"<id>\", \"Memory ID (full or prefix)\")\n .action((idPrefix: string) => {\n const db = initDb();\n const mem = findByPrefix(db, idPrefix);\n if (!mem) {\n console.error(`Memory not found: ${idPrefix}`);\n process.exit(1);\n }\n console.log(JSON.stringify(mem, null, 2));\n });\n\n// --- confirm ---\n\nprogram\n .command(\"confirm\")\n .description(\"Confirm a memory (promote to active)\")\n .argument(\"<id>\", \"Memory ID (full or prefix)\")\n .action((idPrefix: string) => {\n const db = initDb();\n const mem = findByPrefix(db, idPrefix);\n if (!mem) {\n console.error(`Memory not found: ${idPrefix}`);\n process.exit(1);\n }\n const ok = confirmMemory(db, mem.id);\n if (ok) {\n console.log(`Confirmed: ${mem.id.slice(0, 8)} → active`);\n } else {\n console.error(\"Could not confirm (may be rejected).\");\n }\n });\n\n// --- reject ---\n\nprogram\n .command(\"reject\")\n .description(\"Reject a memory (never inject again)\")\n .argument(\"<id>\", \"Memory ID (full or prefix)\")\n .action((idPrefix: string) => {\n const db = initDb();\n const mem = findByPrefix(db, idPrefix);\n if (!mem) {\n console.error(`Memory not found: ${idPrefix}`);\n process.exit(1);\n }\n rejectMemory(db, mem.id);\n console.log(`Rejected: ${mem.id.slice(0, 8)}`);\n });\n\n// --- compile ---\n\nprogram\n .command(\"compile\")\n .description(\"Compile active memories into injection pack\")\n .requiredOption(\"-r, --repo <repo>\", \"Repository name\")\n .option(\"-p, --path <path>\", \"File path for scoping\")\n .option(\"-q, --query <text>\", \"Optional query text for hybrid reranking\")\n .option(\"--include-candidates\", \"Allow strong candidate memories into hybrid ranking\")\n .option(\"-s, --session <id>\", \"Session ID\")\n .option(\"--threshold <n>\", \"Confidence threshold (default: dynamic from quality profile)\")\n .action(async (opts) => {\n const db = initDb();\n const result = opts.query || opts.includeCandidates\n ? await compileContextHybrid(db, {\n repo: opts.repo,\n path: opts.path,\n query_text: opts.query,\n config: {\n ...(opts.threshold ? { confidence_threshold: parseFloat(opts.threshold) } : {}),\n include_candidates: opts.includeCandidates ?? false,\n },\n })\n : compileContext(db, {\n repo: opts.repo,\n path: opts.path,\n config: opts.threshold ? { confidence_threshold: parseFloat(opts.threshold) } : {},\n });\n createActivityEvent(db, {\n session_id: opts.session ?? null,\n repo: opts.repo,\n path: opts.path ?? null,\n source: \"cli\",\n event_type: \"compile\",\n memory_ids: result.memories_included,\n request: {\n threshold: opts.threshold ? parseFloat(opts.threshold) : null,\n query_text: opts.query ?? null,\n include_candidates: opts.includeCandidates ?? false,\n },\n result: {\n included: result.memories_included,\n dropped: result.memories_dropped,\n history_included: result.history_included,\n token_estimate: result.token_estimate,\n },\n });\n\n if (!result.text) {\n console.log(\"No context above threshold. Nothing to inject.\");\n return;\n }\n\n console.log(result.text);\n console.log(`---`);\n console.log(\n `${result.memories_included.length} memories included, ${result.history_included.length} history snippets included, ${result.memories_dropped.length} dropped, ~${result.token_estimate} tokens`,\n );\n });\n\n// --- correct ---\n\nprogram\n .command(\"correct\")\n .description(\"Report a correction to learn from\")\n .argument(\"<text>\", \"Correction text\")\n .option(\"-r, --repo <repo>\", \"Repository name\")\n .option(\"-p, --path <path>\", \"File path context\")\n .option(\"-s, --session <id>\", \"Session ID\", \"cli\")\n .action(async (text: string, opts) => {\n const db = initDb();\n const ids = await processCorrection(db, text, {\n sessionId: opts.session,\n repo: opts.repo,\n path: opts.path,\n });\n createActivityEvent(db, {\n session_id: opts.session,\n repo: opts.repo ?? null,\n path: opts.path ?? null,\n source: \"cli\",\n event_type: \"correction\",\n memory_ids: ids,\n request: { text },\n result: { created: ids },\n });\n\n if (ids.length === 0) {\n console.log(\"No correction pattern detected.\");\n console.log(\n 'Try: \"don\\'t use X, use Y\", \"always do Z\", \"let\\'s use editorconfig defaults\", or \"review said to use W\"',\n );\n return;\n }\n\n console.log(`Created ${ids.length} candidate(s):`);\n for (const id of ids) {\n const mem = getMemory(db, id);\n if (mem)\n console.log(` ${id.slice(0, 8)}: ${mem.text}`);\n }\n });\n\n// --- review ---\n\nprogram\n .command(\"review\")\n .description(\"Report review feedback\")\n .argument(\"<feedback>\", \"Review feedback text\")\n .option(\"-r, --repo <repo>\", \"Repository name\")\n .option(\"-p, --path <path>\", \"File path context\")\n .option(\"-s, --session <id>\", \"Session ID\", \"cli-review\")\n .option(\"--reviewer <name>\", \"Reviewer name\")\n .action(async (feedback: string, opts) => {\n const db = initDb();\n const ids = await processReviewFeedback(db, feedback, {\n sessionId: opts.session,\n repo: opts.repo,\n path: opts.path,\n reviewer: opts.reviewer,\n });\n createActivityEvent(db, {\n session_id: opts.session,\n repo: opts.repo ?? null,\n path: opts.path ?? null,\n source: \"cli\",\n event_type: \"review\",\n memory_ids: ids,\n request: { feedback, reviewer: opts.reviewer ?? null },\n result: { created: ids },\n });\n\n console.log(`Created ${ids.length} candidate(s) from review feedback.`);\n for (const id of ids) {\n const mem = getMemory(db, id);\n if (mem) console.log(` ${id.slice(0, 8)}: ${mem.text}`);\n }\n });\n\n// --- export ---\n\nprogram\n .command(\"export\")\n .description(\"Export memories as markdown instruction files\")\n .requiredOption(\"-r, --repo <repo>\", \"Repository name\")\n .option(\n \"-f, --format <format>\",\n \"Export format: claude | codex | markdown | context\",\n \"markdown\",\n )\n .option(\"-o, --output <path>\", \"Output file path\")\n .action((opts) => {\n const db = initDb();\n let content: string;\n\n switch (opts.format) {\n case \"claude\":\n content = exportClaude(db, opts.repo);\n break;\n case \"codex\":\n content = exportCodex(db, opts.repo);\n break;\n case \"context\": {\n const artifact = writeRepoContextArtifact(db, { repo: opts.repo });\n if (!artifact.output_path) {\n console.error(`Could not resolve local repo path for ${opts.repo}`);\n process.exit(1);\n }\n content = readFileSync(artifact.output_path, \"utf-8\");\n if (!opts.output) {\n console.log(content);\n return;\n }\n break;\n }\n default:\n content = exportMarkdown(db, opts.repo);\n }\n\n if (opts.output) {\n writeFileSync(opts.output, content);\n console.log(`Exported to ${opts.output}`);\n } else {\n console.log(content);\n }\n });\n\nprogram\n .command(\"publish\")\n .description(\"Write repo-local .recall/context.md for the current repo\")\n .argument(\"[path]\", \"Repository path\", \".\")\n .action((path: string) => {\n const db = initDb();\n const repoPath = resolve(path);\n const artifact = writeRepoContextArtifact(db, {\n repo: inferRepoSlugFromPath(repoPath),\n repo_path: repoPath,\n });\n if (!artifact.output_path) {\n console.error(`Could not write repo-local context for ${repoPath}`);\n process.exit(1);\n }\n console.log(`Wrote ${artifact.output_path}`);\n });\n\nconst historyCmd = program\n .command(\"history\")\n .description(\"Inspect rolled-up history snippets\");\n\nhistoryCmd\n .command(\"list\")\n .description(\"List history snippets\")\n .option(\"-r, --repo <repo>\", \"Filter by repository\")\n .option(\"-s, --session <id>\", \"Filter by session id\")\n .option(\"-k, --kind <kind>\", \"Filter by kind\")\n .option(\"-n, --limit <n>\", \"Limit results\", \"20\")\n .action((opts) => {\n const db = initDb();\n const items = listHistorySnippets(db, {\n repo: opts.repo,\n session_id: opts.session,\n kind: opts.kind,\n limit: parseInt(opts.limit, 10),\n });\n\n if (items.length === 0) {\n console.log(\"No history snippets found.\");\n return;\n }\n\n for (const item of items) {\n console.log(`${item.id.slice(0, 8)} [${item.kind}] repo=${item.repo ?? \"-\"} session=${item.session_id ?? \"-\"} ${item.text.split(\"\\n\")[0]}`);\n }\n });\n\nhistoryCmd\n .command(\"search\")\n .description(\"Search history snippets with hybrid lexical/vector retrieval\")\n .argument(\"<query>\", \"Search query\")\n .option(\"-r, --repo <repo>\", \"Filter by repository\")\n .option(\"-n, --limit <n>\", \"Limit results\", \"10\")\n .action(async (query: string, opts) => {\n const db = initDb();\n const results = await searchHistorySnippets(db, query, {\n repo: opts.repo,\n limit: parseInt(opts.limit, 10),\n });\n\n if (results.length === 0) {\n console.log(\"No matching history snippets found.\");\n return;\n }\n\n for (const result of results) {\n console.log(\n `${result.snippet.id.slice(0, 8)} (score=${result.score.toFixed(3)} vec=${result.similarity.toFixed(3)} lex=${result.lexical_score.toFixed(3)}) [${result.snippet.kind}] ${result.snippet.text.split(\"\\n\")[0]}`,\n );\n }\n });\n\n// --- serve (MCP) ---\n\nprogram\n .command(\"serve\")\n .description(\"Start the MCP server (stdio transport)\")\n .action(async () => {\n // Dynamic import to avoid loading MCP deps for other commands\n await import(\"./mcp/server.js\");\n });\n\n// --- Phase 2: sync ---\n\nconst syncCmd = program\n .command(\"sync\")\n .description(\"Sync memories with remote server\");\n\nsyncCmd\n .command(\"push\")\n .description(\"Push local memories to remote\")\n .action(async () => {\n const db = initDb();\n const config = loadSyncConfig();\n if (!config) {\n console.error(\"No sync config. Set RECALL_SYNC_URL and RECALL_SYNC_KEY.\");\n process.exit(1);\n }\n const result = await sync(db, config);\n console.log(`Pushed: ${result.pushed}, Pulled: ${result.pulled}, Conflicts: ${result.conflicts}`);\n if (result.errors.length > 0) {\n console.error(\"Errors:\", result.errors.join(\"; \"));\n }\n });\n\nsyncCmd\n .command(\"pull\")\n .description(\"Pull team memories from remote\")\n .action(async () => {\n const db = initDb();\n const config = loadSyncConfig();\n if (!config) {\n console.error(\"No sync config. Set RECALL_SYNC_URL and RECALL_SYNC_KEY.\");\n process.exit(1);\n }\n const result = await sync(db, config);\n console.log(`Pulled: ${result.pulled}, Conflicts: ${result.conflicts}`);\n });\n\n// --- Phase 2: team ---\n\nconst teamCmd = program\n .command(\"team\")\n .description(\"Manage teams\");\n\nteamCmd\n .command(\"create\")\n .description(\"Create a new team\")\n .argument(\"<name>\", \"Team name\")\n .action(async (name: string) => {\n const config = loadSyncConfig();\n if (!config) {\n console.error(\"No sync config.\");\n process.exit(1);\n }\n const teamId = await createTeam(config, name);\n console.log(`Team created: ${teamId}`);\n console.log(`Set RECALL_TEAM_ID=${teamId} to use this team.`);\n });\n\nteamCmd\n .command(\"join\")\n .description(\"Join an existing team\")\n .argument(\"<team-id>\", \"Team ID\")\n .action(async (teamId: string) => {\n const config = loadSyncConfig();\n if (!config) {\n console.error(\"No sync config.\");\n process.exit(1);\n }\n await joinTeam(config, teamId);\n console.log(`Joined team: ${teamId}`);\n });\n\n// --- Phase 2: eval ---\n\nconst evalCmd = program\n .command(\"eval\")\n .description(\"Evaluation metrics\");\n\nevalCmd\n .command(\"report\")\n .description(\"Show evaluation metrics report\")\n .option(\"-r, --repo <repo>\", \"Filter by repo\")\n .option(\"--since <date>\", \"Since date (ISO)\")\n .action((opts) => {\n const db = initDb();\n const metrics = computeMetrics(db, { repo: opts.repo, since: opts.since });\n console.log(formatMetricsReport(metrics));\n });\n\nevalCmd\n .command(\"start\")\n .description(\"Start an eval session\")\n .requiredOption(\"-r, --repo <repo>\", \"Repository name\")\n .action((opts) => {\n const db = initDb();\n const id = startEvalSession(db, opts.repo);\n console.log(`Eval session started: ${id}`);\n });\n\nevalCmd\n .command(\"end\")\n .description(\"End an eval session\")\n .argument(\"<session-id>\", \"Session ID\")\n .action((sessionId: string) => {\n const db = initDb();\n endEvalSession(db, sessionId);\n console.log(`Eval session ended: ${sessionId}`);\n });\n\nevalCmd\n .command(\"retrieval\")\n .description(\"Run retrieval eval fixtures against baseline vs hybrid retrieval\")\n .requiredOption(\"-f, --file <path>\", \"Fixture file path\")\n .option(\"-p, --provider <providers>\", \"Providers to compare (comma-separated: current,nomic,multilingual-e5,bge-small-en-v1.5)\", \"current\")\n .option(\"--json\", \"Emit raw JSON report\")\n .action(async (opts) => {\n const db = initDb();\n const input = loadRetrievalEvalFile(opts.file);\n const providers = String(opts.provider)\n .split(\",\")\n .map((value) => value.trim())\n .filter(Boolean) as Array<\"current\" | \"nomic\" | \"multilingual-e5\" | \"bge-small-en-v1.5\">;\n const report = await runRetrievalEval(db, input, { providers });\n\n if (opts.json) {\n console.log(JSON.stringify(report, null, 2));\n return;\n }\n\n console.log(formatRetrievalEvalReport(report));\n });\n\n// --- Phase 1: embeddings ---\n\nconst embeddingsCmd = program\n .command(\"embeddings\")\n .description(\"Manage canonical embedding state\");\n\nembeddingsCmd\n .command(\"setup\")\n .description(\"Pre-fetch the active embedding model into the local cache\")\n .action(async () => {\n const config = loadEmbeddingConfigFromEnv();\n if (!config) {\n console.error(\"Embeddings are disabled. Unset RECALL_EMBEDDINGS_DISABLED=true to enable local embeddings.\");\n process.exit(1);\n }\n\n const before = getEmbeddingModelInfo(config)!;\n if (!before.cached) {\n const approx = before.estimated_size_mb ? `~${before.estimated_size_mb}MB` : \"download\";\n console.log(`Fetching embedding model (one-time, ${approx}) -> ${before.cache_path}`);\n }\n\n const info = await ensureEmbeddingProviderReady(config);\n if (!info) {\n console.error(\"Failed to initialize embedding provider.\");\n process.exit(1);\n }\n\n console.log(`Provider: ${info.provider}`);\n console.log(`Model: ${info.model}`);\n console.log(`Cache: ${info.cache_path}`);\n console.log(`Size: ${info.size_label}`);\n });\n\nembeddingsCmd\n .command(\"info\")\n .description(\"Show active embedding provider and cache details\")\n .action(() => {\n const info = getEmbeddingModelInfo();\n if (!info) {\n console.error(\"Embeddings are disabled. Unset RECALL_EMBEDDINGS_DISABLED=true to enable local embeddings.\");\n process.exit(1);\n }\n\n console.log(`Provider: ${info.provider}`);\n console.log(`Model: ${info.model}`);\n console.log(`Dims: index=${info.index_dimensions} canonical=${info.canonical_dimensions}`);\n console.log(`Version: ${info.version}`);\n console.log(`Cached: ${info.cached ? \"yes\" : \"no\"}`);\n console.log(`Size: ${info.size_label}`);\n console.log(`Cache: ${info.cache_path}`);\n if (info.task_prefix) {\n console.log(`Prefix: ${info.task_prefix}`);\n }\n });\n\nembeddingsCmd\n .command(\"bootstrap\")\n .description(\"Generate or refresh embeddings for eligible memories\")\n .option(\"-r, --repo <repo>\", \"Limit bootstrap to one repo\")\n .action(async (opts) => {\n const db = initDb();\n const config = loadEmbeddingConfigFromEnv();\n if (!config) {\n console.error(\"Embeddings are disabled. Unset RECALL_EMBEDDINGS_DISABLED=true to enable local embeddings.\");\n process.exit(1);\n }\n\n const count = await bootstrapEmbeddings(db, config, {\n repo: opts.repo,\n });\n console.log(`Bootstrapped ${count} embeddings.`);\n });\n\nembeddingsCmd\n .command(\"verify\")\n .description(\"Verify embedding coverage and stale content hashes\")\n .option(\"-r, --repo <repo>\", \"Limit verification to one repo\")\n .action((opts) => {\n const db = initDb();\n const config = loadEmbeddingConfigFromEnv();\n if (!config) {\n console.error(\"Embeddings are disabled. Unset RECALL_EMBEDDINGS_DISABLED=true to enable local embeddings.\");\n process.exit(1);\n }\n\n const result = verifyEmbeddings(db, config, {\n repo: opts.repo,\n });\n console.log(`Eligible: ${result.eligible}`);\n console.log(`Stored: ${result.stored}`);\n console.log(`Stale: ${result.stale}`);\n console.log(`Indexed: ${result.indexed}`);\n console.log(`Drift: ${result.index_drift}`);\n console.log(`Lexical: ${result.lexical_indexed}`);\n console.log(`LexDrift: ${result.lexical_drift}`);\n });\n\nembeddingsCmd\n .command(\"rebuild-index\")\n .description(\"Rebuild derived retrieval indexes from canonical memories\")\n .option(\"-r, --repo <repo>\", \"Limit rebuild to one repo\")\n .action((opts) => {\n const db = initDb();\n const config = loadEmbeddingConfigFromEnv();\n const result = rebuildEmbeddingIndex(db, config, {\n repo: opts.repo,\n });\n console.log(`Rebuilt sqlite-vec index with ${result.vector_rows} rows.`);\n console.log(`Rebuilt FTS5 index with ${result.lexical_rows} rows.`);\n });\n\nprogram\n .command(\"search\")\n .description(\"Hybrid lexical + vector search across memories\")\n .argument(\"<query>\", \"Search query\")\n .option(\"-r, --repo <repo>\", \"Filter by repo\")\n .option(\"-n, --limit <n>\", \"Max results\", \"10\")\n .action(async (query: string, opts) => {\n const db = initDb();\n const config = loadEmbeddingConfigFromEnv();\n const results = await hybridSearch(db, query, config, {\n repo: opts.repo,\n limit: parseInt(opts.limit),\n });\n\n if (results.length === 0) {\n console.log(\"No matching memories found.\");\n return;\n }\n\n for (const r of results) {\n console.log(\n `${r.memory.id.slice(0, 8)} (score=${r.score.toFixed(3)} vec=${r.similarity.toFixed(3)} lex=${r.lexical_score.toFixed(3)}) [${r.memory.status}] ${r.memory.text}`,\n );\n }\n });\n\n// --- Phase 2: signals ---\n\nprogram\n .command(\"signal\")\n .description(\"Record an implicit feedback signal\")\n .argument(\"<memory-id>\", \"Memory ID\")\n .argument(\"<signal>\", \"Signal type: test_pass|test_fail|file_unchanged|file_rewritten|task_accepted|task_rejected\")\n .option(\"-s, --session <id>\", \"Session ID\", \"cli\")\n .action((memoryIdPrefix: string, signal: string, opts) => {\n const db = initDb();\n const mem = findByPrefix(db, memoryIdPrefix);\n if (!mem) {\n console.error(`Memory not found: ${memoryIdPrefix}`);\n process.exit(1);\n }\n const validSignals = [\"test_pass\", \"test_fail\", \"file_unchanged\", \"file_rewritten\", \"task_accepted\", \"task_rejected\"];\n if (!validSignals.includes(signal)) {\n console.error(`Invalid signal. Use: ${validSignals.join(\", \")}`);\n process.exit(1);\n }\n const id = recordSignal(db, mem.id, opts.session, signal as any);\n createActivityEvent(db, {\n session_id: opts.session,\n repo: mem.repo,\n path: mem.path_scope,\n source: \"cli\",\n event_type: \"signal\",\n memory_ids: [mem.id],\n request: { signal },\n result: { signal_id: id },\n });\n console.log(`Signal recorded: ${id.slice(0, 8)}`);\n\n const stats = getSignalStats(db, mem.id);\n console.log(\"Stats:\", JSON.stringify(stats));\n });\n\n// --- Phase 2: scope analysis ---\n\nprogram\n .command(\"scope\")\n .description(\"Analyze scope of a correction text\")\n .argument(\"<text>\", \"Correction text\")\n .option(\"-p, --path <path>\", \"Context file path\")\n .action((text: string, opts) => {\n const result = inferScope(text, opts.path);\n console.log(`Scope: ${result.scope}`);\n console.log(`Path scope: ${result.path_scope ?? \"(none)\"}`);\n console.log(`Confidence: ${result.confidence_modifier > 0 ? \"+\" : \"\"}${result.confidence_modifier}`);\n console.log(`Reason: ${result.reason}`);\n });\n\n// --- Phase 3: policy ---\n\nconst policyCmd = program\n .command(\"policy\")\n .description(\"Org-level policy management\");\n\npolicyCmd\n .command(\"create\")\n .description(\"Create a policy rule\")\n .requiredOption(\"--org <id>\", \"Organization ID\")\n .requiredOption(\"--type <type>\", \"Rule type: min_confidence|require_approval|allowed_sources|blocked_scopes|max_active_per_repo|require_evidence_count|auto_approve_pattern\")\n .requiredOption(\"--config <json>\", \"Rule config as JSON\")\n .action((opts) => {\n const db = initDb();\n const config = JSON.parse(opts.config);\n const id = createPolicy(db, opts.org, opts.type, config);\n console.log(`Policy created: ${id.slice(0, 8)}`);\n });\n\npolicyCmd\n .command(\"list\")\n .description(\"List policies for an org\")\n .requiredOption(\"--org <id>\", \"Organization ID\")\n .action((opts) => {\n const db = initDb();\n const rules = listPolicies(db, opts.org);\n if (rules.length === 0) {\n console.log(\"No policies.\");\n return;\n }\n for (const r of rules) {\n console.log(`${r.id.slice(0, 8)} [${r.enabled ? \"on\" : \"off\"}] ${r.rule_type} ${JSON.stringify(r.config)}`);\n }\n });\n\npolicyCmd\n .command(\"toggle\")\n .description(\"Enable/disable a policy\")\n .argument(\"<id>\", \"Policy ID\")\n .argument(\"<state>\", \"on or off\")\n .action((id: string, state: string) => {\n const db = initDb();\n togglePolicy(db, id, state === \"on\");\n console.log(`Policy ${id.slice(0, 8)} ${state === \"on\" ? \"enabled\" : \"disabled\"}.`);\n });\n\npolicyCmd\n .command(\"delete\")\n .description(\"Delete a policy\")\n .argument(\"<id>\", \"Policy ID\")\n .action((id: string) => {\n const db = initDb();\n deletePolicy(db, id);\n console.log(`Policy ${id.slice(0, 8)} deleted.`);\n });\n\npolicyCmd\n .command(\"check\")\n .description(\"Check a memory against org policies\")\n .requiredOption(\"--org <id>\", \"Organization ID\")\n .argument(\"<memory-id>\", \"Memory ID\")\n .action((memoryId: string, opts) => {\n const db = initDb();\n const mem = findByPrefix(db, memoryId);\n if (!mem) {\n console.error(`Memory not found: ${memoryId}`);\n process.exit(1);\n }\n const violations = evaluatePolicy(db, opts.org, mem);\n if (violations.length === 0) {\n console.log(\"No policy violations.\");\n } else {\n for (const v of violations) {\n console.log(`[${v.blocking ? \"BLOCK\" : \"WARN\"}] ${v.rule_type}: ${v.message}`);\n }\n }\n });\n\n// --- Phase 3: approval ---\n\nconst approvalCmd = program\n .command(\"approval\")\n .description(\"Approval queue management\");\n\napprovalCmd\n .command(\"request\")\n .description(\"Request approval for a memory\")\n .argument(\"<memory-id>\", \"Memory ID\")\n .requiredOption(\"--org <id>\", \"Organization ID\")\n .option(\"--by <name>\", \"Requested by\", \"cli\")\n .action((memoryId: string, opts) => {\n const db = initDb();\n const mem = findByPrefix(db, memoryId);\n if (!mem) {\n console.error(`Memory not found: ${memoryId}`);\n process.exit(1);\n }\n const id = requestApproval(db, mem.id, opts.org, opts.by);\n console.log(`Approval requested: ${id.slice(0, 8)}`);\n });\n\napprovalCmd\n .command(\"list\")\n .description(\"List pending approvals\")\n .requiredOption(\"--org <id>\", \"Organization ID\")\n .action((opts) => {\n const db = initDb();\n const pending = listPendingApprovals(db, opts.org);\n if (pending.length === 0) {\n console.log(\"No pending approvals.\");\n return;\n }\n for (const a of pending) {\n console.log(`${a.id.slice(0, 8)} memory:${a.memory_id.slice(0, 8)} by:${a.requested_by} ${a.created_at}`);\n }\n });\n\napprovalCmd\n .command(\"resolve\")\n .description(\"Approve or deny a request\")\n .argument(\"<approval-id>\", \"Approval ID\")\n .argument(\"<decision>\", \"approved or denied\")\n .option(\"--by <name>\", \"Reviewed by\", \"cli\")\n .option(\"--reason <reason>\", \"Reason\")\n .action((approvalId: string, decision: string, opts) => {\n const db = initDb();\n const ok = resolveApproval(db, approvalId, decision as any, opts.by, opts.reason);\n if (ok) {\n console.log(`Approval ${approvalId.slice(0, 8)} → ${decision}`);\n } else {\n console.error(\"Approval not found.\");\n }\n });\n\n// --- Phase 3: health ---\n\nprogram\n .command(\"health\")\n .description(\"Memory health scoring report\")\n .option(\"-r, --repo <repo>\", \"Filter by repo\")\n .option(\"--id <id>\", \"Score a single memory\")\n .action((opts) => {\n const db = initDb();\n if (opts.id) {\n const mem = findByPrefix(db, opts.id);\n if (!mem) {\n console.error(`Memory not found: ${opts.id}`);\n process.exit(1);\n }\n const score = computeHealthScore(db, mem.id);\n if (score) {\n console.log(`Score: ${(score.score * 100).toFixed(0)}%`);\n console.log(`Confidence: ${(score.confidence_component * 100).toFixed(0)}%`);\n console.log(`Freshness: ${(score.freshness_component * 100).toFixed(0)}%`);\n console.log(`Follow: ${(score.follow_rate_component * 100).toFixed(0)}%`);\n console.log(`Signal: ${(score.signal_ratio_component * 100).toFixed(0)}%`);\n }\n return;\n }\n const scores = computeAllHealthScores(db, opts.repo);\n console.log(formatHealthReport(scores));\n });\n\n// --- Phase 3: contradictions ---\n\nconst contradictCmd = program\n .command(\"contradictions\")\n .description(\"Detect and resolve contradictions\");\n\ncontradictCmd\n .command(\"detect\")\n .description(\"Scan for contradictions\")\n .option(\"-r, --repo <repo>\", \"Filter by repo\")\n .action((opts) => {\n const db = initDb();\n const found = detectContradictions(db, opts.repo);\n if (found.length === 0) {\n console.log(\"No new contradictions detected.\");\n return;\n }\n for (const c of found) {\n console.log(`${c.id.slice(0, 8)} [${c.severity}] ${c.contradiction_type}: ${c.description}`);\n }\n console.log(`\\n${found.length} contradiction(s) found.`);\n });\n\ncontradictCmd\n .command(\"list\")\n .description(\"List contradictions\")\n .option(\"--resolved\", \"Show resolved only\")\n .option(\"--unresolved\", \"Show unresolved only\")\n .action((opts) => {\n const db = initDb();\n const resolved = opts.resolved ? true : opts.unresolved ? false : undefined;\n const items = listContradictions(db, { resolved });\n if (items.length === 0) {\n console.log(\"No contradictions.\");\n return;\n }\n for (const c of items) {\n const status = c.resolved ? \"resolved\" : \"open\";\n console.log(`${c.id.slice(0, 8)} [${status}] ${c.severity} ${c.contradiction_type}: ${c.description}`);\n }\n });\n\ncontradictCmd\n .command(\"resolve\")\n .description(\"Resolve a contradiction by keeping one memory\")\n .argument(\"<contradiction-id>\", \"Contradiction ID\")\n .argument(\"<keep-memory-id>\", \"Memory ID to keep\")\n .option(\"--actor <name>\", \"Who resolved\", \"cli\")\n .option(\"--reason <reason>\", \"Resolution reason\")\n .action((cId: string, keepId: string, opts) => {\n const db = initDb();\n const ok = resolveContradiction(db, cId, keepId, opts.actor, opts.reason);\n if (ok) {\n console.log(`Contradiction ${cId.slice(0, 8)} resolved. Kept ${keepId.slice(0, 8)}.`);\n } else {\n console.error(\"Contradiction not found.\");\n }\n });\n\ncontradictCmd\n .command(\"auto-resolve\")\n .description(\"Auto-resolve contradictions (higher confidence wins)\")\n .option(\"-r, --repo <repo>\", \"Filter by repo\")\n .action((opts) => {\n const db = initDb();\n const count = autoResolveContradictions(db, opts.repo);\n console.log(`Auto-resolved ${count} contradiction(s).`);\n });\n\n// --- Phase 3: prune ---\n\nprogram\n .command(\"prune\")\n .description(\"Auto-prune stale and unhealthy memories\")\n .option(\"-r, --repo <repo>\", \"Limit pruning to one repo\")\n .option(\"--stale-days <n>\", \"Days before rejecting stale memories\", \"90\")\n .option(\"--rejected-days <n>\", \"Days before deleting rejected memories\", \"30\")\n .option(\"--transient-days <n>\", \"Days before deleting transient memories\", \"7\")\n .option(\"--min-health <n>\", \"Min health score for active memories\", \"0.2\")\n .option(\"--dry-run\", \"Preview without making changes\")\n .action((opts) => {\n const db = initDb();\n const result = pruneMemories(db, {\n repo: opts.repo,\n stale_days: parseInt(opts.staleDays),\n rejected_retention_days: parseInt(opts.rejectedDays),\n transient_retention_days: parseInt(opts.transientDays),\n min_health_score: parseFloat(opts.minHealth),\n dry_run: opts.dryRun ?? false,\n });\n console.log(formatPruneReport(result, opts.dryRun ?? false));\n });\n\n// --- Phase 3: audit ---\n\nconst auditCmd = program\n .command(\"audit\")\n .description(\"View audit trail and rollback\");\n\nauditCmd\n .command(\"show\")\n .description(\"Show audit trail for a memory\")\n .argument(\"<memory-id>\", \"Memory ID\")\n .action((memoryId: string) => {\n const db = initDb();\n const mem = findByPrefix(db, memoryId);\n if (!mem) {\n console.error(`Memory not found: ${memoryId}`);\n process.exit(1);\n }\n const entries = getAuditTrail(db, mem.id);\n console.log(formatAuditTrail(entries));\n });\n\nauditCmd\n .command(\"recent\")\n .description(\"Show recent audit entries\")\n .option(\"-n, --limit <n>\", \"Max entries\", \"50\")\n .action((opts) => {\n const db = initDb();\n const entries = getRecentAudit(db, parseInt(opts.limit));\n console.log(formatAuditTrail(entries));\n });\n\nauditCmd\n .command(\"rollback\")\n .description(\"Rollback a memory to a previous state\")\n .argument(\"<memory-id>\", \"Memory ID\")\n .argument(\"<audit-entry-id>\", \"Audit entry ID to rollback to\")\n .option(\"--actor <name>\", \"Who performed rollback\", \"cli\")\n .action((memoryId: string, auditEntryId: string, opts) => {\n const db = initDb();\n const mem = findByPrefix(db, memoryId);\n if (!mem) {\n console.error(`Memory not found: ${memoryId}`);\n process.exit(1);\n }\n const ok = rollbackMemory(db, mem.id, auditEntryId, opts.actor);\n if (ok) {\n console.log(`Memory ${mem.id.slice(0, 8)} rolled back.`);\n } else {\n console.error(\"Rollback failed. Audit entry not found or no snapshot.\");\n }\n });\n\n// --- Quality profile ---\n\nprogram\n .command(\"quality\")\n .description(\"Show repo quality profile and dynamic thresholds\")\n .option(\"-r, --repo <repo>\", \"Repository name\")\n .action((opts) => {\n const db = initDb();\n const profile = getRepoQualityProfile(db, opts.repo);\n console.log(`Stage: ${profile.stage}`);\n console.log(`Quality score: ${(profile.score * 100).toFixed(0)}%`);\n console.log(`Active memories: ${profile.active_count}`);\n console.log(`Total memories: ${profile.total_count}`);\n console.log(`Avg health: ${(profile.avg_health * 100).toFixed(0)}%`);\n console.log(`Override rate: ${(profile.override_rate * 100).toFixed(0)}%`);\n console.log(`Contradiction rate: ${(profile.contradiction_rate * 100).toFixed(0)}%`);\n console.log(`---`);\n console.log(`Repeat sessions needed: ${profile.repeat_sessions_required}`);\n console.log(`Compile threshold: ${profile.compile_confidence_threshold.toFixed(2)}`);\n console.log(`Dedup similarity: ${profile.dedup_similarity_threshold.toFixed(2)}`);\n });\n\n// --- Activity ---\n\nprogram\n .command(\"activity\")\n .description(\"List recent activity events\")\n .option(\"-r, --repo <repo>\", \"Filter by repo\")\n .option(\"-s, --session <id>\", \"Filter by session ID\")\n .option(\"--source <source>\", \"Filter by source: cli|daemon|mcp|system\")\n .option(\"--type <type>\", \"Filter by event type: compile|query|scan|correction|review|feedback|signal|session_start|session_event|session_end\")\n .option(\"--since <iso>\", \"Filter by created_at >= ISO timestamp\")\n .option(\"-n, --limit <n>\", \"Max events\", \"20\")\n .action((opts) => {\n const db = initDb();\n const events = listActivityEvents(db, {\n repo: opts.repo,\n session_id: opts.session,\n source: opts.source,\n event_type: opts.type,\n since: opts.since,\n limit: parseInt(opts.limit, 10),\n });\n if (events.length === 0) {\n console.log(\"No activity found.\");\n return;\n }\n for (const event of events) {\n console.log(\n `${event.created_at} ${event.source}/${event.event_type} session:${event.session_id ?? \"-\"} repo:${event.repo ?? \"-\"} memories:${event.memory_ids.length}`,\n );\n }\n console.log(`\\n${events.length} activity events total.`);\n });\n\nprogram\n .command(\"sessions\")\n .description(\"List recent activity sessions\")\n .option(\"-r, --repo <repo>\", \"Filter by repo\")\n .option(\"--source <source>\", \"Filter by source: cli|daemon|mcp|system\")\n .option(\"--type <type>\", \"Filter by event type: compile|query|scan|correction|review|feedback|signal|session_start|session_event|session_end\")\n .option(\"--since <iso>\", \"Filter by created_at >= ISO timestamp\")\n .option(\"-n, --limit <n>\", \"Max sessions\", \"20\")\n .action((opts) => {\n const db = initDb();\n const sessions = listActivitySessions(db, {\n repo: opts.repo,\n source: opts.source,\n event_type: opts.type,\n since: opts.since,\n limit: parseInt(opts.limit, 10),\n });\n if (sessions.length === 0) {\n console.log(\"No sessions found.\");\n return;\n }\n for (const session of sessions) {\n console.log(\n `${session.last_at} ${session.session_id} repo:${session.repo ?? \"-\"} events:${session.event_count} types:${session.event_types.join(\",\")}`,\n );\n }\n console.log(`\\n${sessions.length} sessions total.`);\n });\n\n// --- daemon ---\n\nconst defaultLabel = defaultServiceLabel();\nconst daemonCmd = program\n .command(\"daemon\")\n .description(\"Manage the local Recall HTTP daemon (launchd on macOS, systemd --user on Linux)\");\n\ndaemonCmd\n .command(\"install\")\n .description(\"Install and start the user service\")\n .option(\"--port <port>\", \"Daemon port\", \"7890\")\n .option(\"--data-dir <dir>\", \"Recall data dir\")\n .option(\"--label <label>\", \"Service label\", defaultLabel)\n .option(\"--node-path <path>\", \"Node executable path override\")\n .option(\"--daemon-script <path>\", \"Daemon script path override\")\n .action((opts) => {\n const status = installService({\n label: opts.label,\n port: parseInt(opts.port, 10),\n dataDir: opts.dataDir,\n nodePath: opts.nodePath,\n daemonScript: opts.daemonScript,\n });\n console.log(getServiceInfo(status.label));\n });\n\ndaemonCmd\n .command(\"start\")\n .description(\"Start the installed service\")\n .option(\"--label <label>\", \"Service label\", defaultLabel)\n .action((opts) => {\n const status = startService(opts.label);\n console.log(getServiceInfo(status.label));\n });\n\ndaemonCmd\n .command(\"stop\")\n .description(\"Stop the service\")\n .option(\"--label <label>\", \"Service label\", defaultLabel)\n .action((opts) => {\n const status = stopService(opts.label);\n console.log(getServiceInfo(status.label));\n });\n\ndaemonCmd\n .command(\"restart\")\n .description(\"Restart the service\")\n .option(\"--label <label>\", \"Service label\", defaultLabel)\n .action((opts) => {\n stopService(opts.label);\n const status = startService(opts.label);\n console.log(getServiceInfo(status.label));\n });\n\ndaemonCmd\n .command(\"status\")\n .description(\"Show service status\")\n .option(\"--label <label>\", \"Service label\", defaultLabel)\n .action((opts) => {\n console.log(getServiceInfo(opts.label));\n });\n\ndaemonCmd\n .command(\"uninstall\")\n .description(\"Remove the service\")\n .option(\"--label <label>\", \"Service label\", defaultLabel)\n .action((opts) => {\n const status = uninstallService(opts.label);\n console.log(getServiceInfo(status.label));\n });\n\n// --- Tier-2 maintenance tasks ---\n\nconst maintenanceCmd = program\n .command(\"maintenance\")\n .description(\"Inspect and manage the delegated maintenance task queue\");\n\nmaintenanceCmd\n .command(\"stats\")\n .description(\"Show backlog counts, completion stats, and mean latency\")\n .action(async () => {\n const { getTaskStats } = await import(\"./maintenance/tasks.js\");\n const db = initDb();\n const stats = getTaskStats(db);\n console.log(`Total tasks: ${stats.total}`);\n console.log(`---`);\n console.log(`Pending: ${stats.by_status.pending}`);\n console.log(`Claimed: ${stats.by_status.claimed}`);\n console.log(`Completed: ${stats.by_status.completed}`);\n console.log(`Abandoned: ${stats.by_status.abandoned}`);\n console.log(`---`);\n console.log(`Last 24h completed: ${stats.completed_last_24h}`);\n console.log(`Last 24h abandoned: ${stats.abandoned_last_24h}`);\n if (stats.mean_completion_ms != null) {\n console.log(`Mean completion: ${(stats.mean_completion_ms / 1000).toFixed(1)}s`);\n }\n if (stats.pending_oldest_created_at) {\n console.log(`Oldest pending: ${stats.pending_oldest_created_at}`);\n }\n console.log(`---`);\n console.log(`By kind:`);\n for (const [kind, count] of Object.entries(stats.by_kind)) {\n if (count === 0) continue;\n console.log(` ${kind.padEnd(22)} ${count}`);\n }\n });\n\nmaintenanceCmd\n .command(\"list\")\n .description(\"List tasks (default: pending)\")\n .option(\"-s, --status <status>\", \"pending|claimed|completed|abandoned\", \"pending\")\n .option(\"-k, --kind <kind>\", \"Filter by kind\")\n .option(\"-r, --repo <repo>\", \"Filter by repo\")\n .option(\"-n, --limit <n>\", \"Max entries\", \"20\")\n .action(async (opts) => {\n const { listTasks } = await import(\"./maintenance/tasks.js\");\n const db = initDb();\n const tasks = listTasks(db, {\n status: opts.status,\n kinds: opts.kind ? [opts.kind] : undefined,\n repo: opts.repo,\n limit: parseInt(opts.limit, 10),\n });\n if (tasks.length === 0) {\n console.log(`No ${opts.status} tasks.`);\n return;\n }\n for (const t of tasks) {\n const age = t.created_at.slice(0, 19);\n const prefix = t.id.slice(0, 8);\n const repo = t.repo ?? \"-\";\n const attempts = t.attempts > 0 ? ` attempts=${t.attempts}` : \"\";\n const reason = t.failure_reason ? ` (${t.failure_reason.slice(0, 60)})` : \"\";\n console.log(`${prefix} p${t.priority} ${t.kind.padEnd(20)} ${t.status.padEnd(10)} ${repo.padEnd(30)} ${age}${attempts}${reason}`);\n }\n });\n\nmaintenanceCmd\n .command(\"drop\")\n .description(\"Delete a task by id (or id prefix)\")\n .argument(\"<task-id>\", \"Task id or prefix\")\n .action(async (taskIdArg: string) => {\n const { deleteTask, listTasks } = await import(\"./maintenance/tasks.js\");\n const db = initDb();\n const all = listTasks(db, { limit: 10_000 });\n const matches = all.filter((t) => t.id === taskIdArg || t.id.startsWith(taskIdArg));\n if (matches.length === 0) {\n console.error(`No task matching \"${taskIdArg}\".`);\n process.exit(1);\n }\n if (matches.length > 1) {\n console.error(`Ambiguous prefix \"${taskIdArg}\". Matches:`);\n for (const t of matches) console.error(` ${t.id} ${t.kind} ${t.status}`);\n process.exit(1);\n }\n const ok = deleteTask(db, matches[0].id);\n if (ok) console.log(`Dropped task ${matches[0].id}.`);\n else console.error(\"Drop failed.\");\n });\n\nconst credentialsCmd = maintenanceCmd\n .command(\"credentials\")\n .description(\"Manage LLM provider API keys in macOS Keychain (env fallback on other platforms)\");\n\ncredentialsCmd\n .command(\"list\", { isDefault: true })\n .description(\"Show which providers have credentials available\")\n .action(async () => {\n const { listCredentials } = await import(\"./credentials/keychain.js\");\n const creds = listCredentials();\n if (creds.length === 0) {\n console.log(\"No API keys configured. Set one with:\");\n console.log(\" recall maintenance credentials set openai <key>\");\n console.log(\" recall maintenance credentials set anthropic <key>\");\n return;\n }\n for (const cred of creds) {\n const detail = cred.detail ? ` ${cred.detail}` : \"\";\n console.log(`${cred.provider.padEnd(14)} ${cred.source.padEnd(8)} ${cred.preview}${detail}`);\n }\n });\n\ncredentialsCmd\n .command(\"set\")\n .description(\"Store credentials for an LLM provider in the macOS Keychain\")\n .argument(\"<provider>\", \"openai|anthropic|azure\")\n .argument(\"[key]\", \"API key (prompts via stdin if omitted; required for openai/anthropic and for azure unless --stdin-json is used)\")\n .option(\"--endpoint <url>\", \"Azure OpenAI resource endpoint (e.g. https://myresource.openai.azure.com)\")\n .option(\"--deployment <name>\", \"Azure OpenAI deployment name\")\n .option(\"--api-version <version>\", \"Azure OpenAI api-version (e.g. 2024-10-21)\")\n .option(\"--stdin-json\", \"Read the azure config (endpoint/deployment/api_version/key) as a JSON object from stdin\")\n .action(async (providerArg: string, keyArg: string | undefined, opts) => {\n const { setApiKey, setAzureConfig } = await import(\"./credentials/keychain.js\");\n const provider = providerArg === \"azure\" ? \"azure-openai\" : providerArg;\n\n if (provider === \"openai\" || provider === \"anthropic\") {\n const key = keyArg ?? await readStdinKey();\n if (!key) {\n console.error(\"No API key provided (pass as argument or pipe via stdin).\");\n process.exit(1);\n }\n try {\n setApiKey(provider, key);\n console.log(`Stored ${provider} API key in Keychain (service com.recall.llm).`);\n } catch (err) {\n console.error(`Failed to store key: ${(err as Error).message}`);\n process.exit(1);\n }\n return;\n }\n\n if (provider === \"azure-openai\") {\n let azureConfig;\n if (opts.stdinJson) {\n const body = await readStdinText();\n if (!body) {\n console.error(\"No JSON payload received on stdin.\");\n process.exit(1);\n }\n try {\n azureConfig = JSON.parse(body) as {\n endpoint: string;\n deployment: string;\n api_version: string;\n key: string;\n };\n } catch (err) {\n console.error(`Failed to parse stdin JSON: ${(err as Error).message}`);\n process.exit(1);\n }\n } else {\n const key = keyArg ?? await readStdinKey();\n if (!opts.endpoint || !opts.deployment || !opts.apiVersion || !key) {\n console.error(\n \"Azure setup requires --endpoint, --deployment, --api-version, and a key.\\n\" +\n \"Example: recall maintenance credentials set azure \\\\\\n\" +\n \" --endpoint https://myresource.openai.azure.com \\\\\\n\" +\n \" --deployment gpt-4o-mini \\\\\\n\" +\n \" --api-version 2024-10-21 \\\\\\n\" +\n \" <key>\",\n );\n process.exit(1);\n }\n azureConfig = {\n endpoint: opts.endpoint,\n deployment: opts.deployment,\n api_version: opts.apiVersion,\n key,\n };\n }\n try {\n setAzureConfig(azureConfig);\n console.log(`Stored azure-openai config in Keychain (service com.recall.llm).`);\n console.log(` endpoint: ${azureConfig.endpoint}`);\n console.log(` deployment: ${azureConfig.deployment}`);\n console.log(` api_version: ${azureConfig.api_version}`);\n } catch (err) {\n console.error(`Failed to store azure config: ${(err as Error).message}`);\n process.exit(1);\n }\n return;\n }\n\n console.error(`Provider must be \"openai\", \"anthropic\", or \"azure\", got \"${providerArg}\".`);\n process.exit(1);\n });\n\ncredentialsCmd\n .command(\"clear\")\n .description(\"Remove provider credentials from the macOS Keychain\")\n .argument(\"<provider>\", \"openai|anthropic|azure\")\n .action(async (providerArg: string) => {\n const { deleteApiKey } = await import(\"./credentials/keychain.js\");\n const provider = providerArg === \"azure\" ? \"azure-openai\" : providerArg;\n if (provider !== \"openai\" && provider !== \"anthropic\" && provider !== \"azure-openai\") {\n console.error(`Provider must be \"openai\", \"anthropic\", or \"azure\", got \"${providerArg}\".`);\n process.exit(1);\n }\n const removed = deleteApiKey(provider);\n if (removed) console.log(`Removed ${provider} credentials from Keychain.`);\n else console.log(`No ${provider} credentials found in Keychain.`);\n });\n\nmaintenanceCmd\n .command(\"dispatch\")\n .description(\"Run the daemon-owned dispatcher once against pending maintenance tasks (requires a configured LLM provider)\")\n .option(\"--provider <provider>\", \"openai|anthropic|azure-openai (defaults to whichever is configured)\")\n .option(\"--model <model>\", \"Model override\")\n .option(\"--kind <kind>\", \"Restrict to a single task kind (repeatable)\", (value: string, acc: string[] = []) => [...acc, value], [] as string[])\n .option(\"--repo <repo>\", \"Restrict to a single repo\")\n .option(\"--max <n>\", \"Max tasks to run this round\", \"5\")\n .option(\"--dry-run\", \"Show which tasks would be dispatched; do not call the LLM\")\n .option(\"--preview\", \"Show the actual prompts that would be sent (no provider needed; no LLM call)\")\n .option(\"--json\", \"Emit the raw JSON report\")\n .action(async (opts) => {\n const { dispatchPendingTasks, formatDispatchReport, buildPrompt } = await import(\"./maintenance/dispatcher.js\");\n const { listTasks } = await import(\"./maintenance/tasks.js\");\n const db = initDb();\n\n if (opts.preview) {\n const pending = listTasks(db, {\n status: \"pending\",\n kinds: opts.kind.length > 0 ? opts.kind : undefined,\n repo: opts.repo,\n limit: parseInt(opts.max, 10),\n });\n const previews = pending.map((task) => ({\n task_id: task.id,\n kind: task.kind,\n repo: task.repo,\n prompt: buildPrompt(task),\n }));\n if (opts.json) {\n console.log(JSON.stringify(previews, null, 2));\n return;\n }\n if (previews.length === 0) {\n console.log(\"No pending tasks to preview.\");\n return;\n }\n for (const p of previews) {\n console.log(`# ${p.task_id.slice(0, 8)} ${p.kind} ${p.repo ?? \"-\"}`);\n if (!p.prompt) {\n console.log(\" (no prompt builder for this kind)\\n\");\n continue;\n }\n console.log(`## system\\n${p.prompt.system}\\n`);\n console.log(`## user\\n${p.prompt.user}\\n`);\n if (p.prompt.max_output_tokens) console.log(`## max_output_tokens\\n${p.prompt.max_output_tokens}\\n`);\n console.log(\"---\");\n }\n return;\n }\n\n const report = await dispatchPendingTasks(db, {\n provider: opts.provider,\n model: opts.model,\n kinds: opts.kind.length > 0 ? opts.kind : undefined,\n repo: opts.repo,\n maxTasks: parseInt(opts.max, 10),\n dryRun: Boolean(opts.dryRun),\n });\n if (opts.json) {\n console.log(JSON.stringify(report, null, 2));\n return;\n }\n console.log(formatDispatchReport(report));\n });\n\nmaintenanceCmd\n .command(\"cleanup\")\n .description(\"Run deterministic, LLM-free cleanup: exact-text dedupe, fragment rejection, repeat-correction promotion\")\n .option(\"--apply\", \"Persist changes (default is dry-run)\")\n .option(\"--only <action>\", \"Restrict to one action: dedupe_exact_merge|reject_fragment_candidate|promote_repeat_correction\")\n .option(\"--revert <run-id>\", \"Revert a previous cleanup run (id or 8-char prefix)\")\n .option(\"--list\", \"List recent cleanup runs\")\n .option(\"--json\", \"Emit the raw JSON report\")\n .action(async (opts) => {\n const { runDeterministicCleanup, formatCleanupReport, revertCleanupRun, listCleanupRuns } = await import(\"./maintenance/cleanup.js\");\n const db = initDb();\n\n if (opts.list) {\n const runs = listCleanupRuns(db);\n if (opts.json) {\n console.log(JSON.stringify(runs, null, 2));\n return;\n }\n if (runs.length === 0) {\n console.log(\"No cleanup runs recorded.\");\n return;\n }\n for (const r of runs) {\n const flag = r.reverted === r.total && r.total > 0 ? \" [reverted]\" : r.reverted > 0 ? ` [partial-revert ${r.reverted}/${r.total}]` : \"\";\n const actions = Object.entries(r.by_action).map(([k, v]) => `${k}=${v}`).join(\" \");\n console.log(`${r.run_id.slice(0, 8)} ${r.finished_at.slice(0, 19)} total=${r.total} ${actions}${flag}`);\n }\n return;\n }\n\n if (opts.revert) {\n const all = listCleanupRuns(db, 10_000);\n const match = all.find((r) => r.run_id === opts.revert || r.run_id.startsWith(opts.revert));\n if (!match) {\n console.error(`No cleanup run matching \"${opts.revert}\".`);\n process.exit(1);\n }\n const result = revertCleanupRun(db, match.run_id);\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n console.log(`Reverted ${result.reverted} entries from run ${result.run_id.slice(0, 8)}; skipped ${result.skipped}.`);\n for (const [reason, count] of Object.entries(result.reasons)) {\n console.log(` ${reason}: ${count}`);\n }\n return;\n }\n\n const report = runDeterministicCleanup(db, {\n dryRun: !opts.apply,\n only: opts.only,\n });\n if (opts.json) {\n console.log(JSON.stringify(report, null, 2));\n return;\n }\n console.log(formatCleanupReport(report));\n });\n\nmaintenanceCmd\n .command(\"quality\")\n .description(\"Show injection outcome distribution and followed-rate over a window\")\n .option(\"--since <iso>\", \"Window start (default: last 14 days)\")\n .option(\"--snapshot\", \"Persist this report as a baseline for later comparison\")\n .option(\"--note <text>\", \"Optional note attached to a snapshot\")\n .option(\"--history\", \"List recent snapshots and the diff against the latest one\")\n .option(\"--json\", \"Emit raw JSON\")\n .action(async (opts) => {\n const {\n computeQualityReport,\n formatQualityReport,\n recordQualitySnapshot,\n listQualitySnapshots,\n diffQualitySnapshots,\n } = await import(\"./maintenance/quality.js\");\n const db = initDb();\n\n if (opts.history) {\n const snaps = listQualitySnapshots(db);\n if (opts.json) {\n console.log(JSON.stringify(snaps, null, 2));\n return;\n }\n if (snaps.length === 0) {\n console.log(\"No quality snapshots recorded.\");\n return;\n }\n for (const s of snaps) {\n const rate = s.followed_rate_resolved != null ? `${(s.followed_rate_resolved * 100).toFixed(1)}%` : \"n/a\";\n console.log(`${s.taken_at.slice(0, 19)} followed=${rate} resolved=${s.injections_resolved} history=${s.history_injections_total} rules=${s.active_rule_count} cand=${s.candidate_correction_count}${s.notes ? ` (${s.notes})` : \"\"}`);\n }\n if (snaps.length >= 2) {\n const diff = diffQualitySnapshots(snaps[snaps.length - 1], snaps[0]);\n console.log(\"\");\n console.log(`Δ since first snapshot (${diff.days_apart.toFixed(1)}d):`);\n console.log(` followed rate: ${diff.followed_rate_delta_pp >= 0 ? \"+\" : \"\"}${diff.followed_rate_delta_pp.toFixed(1)}pp`);\n console.log(` resolved: ${diff.resolved_delta >= 0 ? \"+\" : \"\"}${diff.resolved_delta}`);\n console.log(` followed: ${diff.followed_delta >= 0 ? \"+\" : \"\"}${diff.followed_delta}`);\n console.log(` contradicted: ${diff.contradicted_delta >= 0 ? \"+\" : \"\"}${diff.contradicted_delta}`);\n console.log(` active rules: ${diff.active_rule_delta >= 0 ? \"+\" : \"\"}${diff.active_rule_delta}`);\n console.log(` candidates: ${diff.candidate_delta >= 0 ? \"+\" : \"\"}${diff.candidate_delta}`);\n console.log(` history injects: ${diff.history_injections_delta >= 0 ? \"+\" : \"\"}${diff.history_injections_delta}`);\n console.log(` history snippets:${diff.history_snippets_delta >= 0 ? \"+\" : \"\"}${diff.history_snippets_delta}`);\n }\n return;\n }\n\n const report = computeQualityReport(db, { sinceIso: opts.since });\n\n if (opts.snapshot) {\n const row = recordQualitySnapshot(db, report, opts.note);\n if (opts.json) {\n console.log(JSON.stringify({ snapshot: row, report }, null, 2));\n return;\n }\n console.log(formatQualityReport(report));\n console.log(\"\");\n console.log(`Recorded snapshot ${row.id.slice(0, 8)} at ${row.taken_at.slice(0, 19)}`);\n return;\n }\n\n if (opts.json) {\n console.log(JSON.stringify(report, null, 2));\n return;\n }\n console.log(formatQualityReport(report));\n });\n\nmaintenanceCmd\n .command(\"usage\")\n .description(\"Summarize LLM API usage (tokens, cost) across recent maintenance runs\")\n .option(\"--since <iso>\", \"Window start (default: last 30 days)\")\n .option(\"--limit <n>\", \"Recent-call rows to show\", \"10\")\n .option(\"--json\", \"Emit raw JSON summary\")\n .action(async (opts) => {\n const { summarizeUsage, formatUsageReport } = await import(\"./llm/usage.js\");\n const db = initDb();\n const summary = summarizeUsage(db, {\n sinceIso: opts.since,\n recentLimit: parseInt(opts.limit, 10),\n });\n if (opts.json) {\n console.log(JSON.stringify(summary, null, 2));\n return;\n }\n console.log(formatUsageReport(summary));\n });\n\nasync function readStdinKey(): Promise<string | null> {\n const raw = await readStdinText();\n if (!raw) return null;\n const trimmed = raw.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nasync function readStdinText(): Promise<string | null> {\n if (process.stdin.isTTY) return null;\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(Buffer.from(chunk));\n }\n const text = Buffer.concat(chunks).toString(\"utf-8\");\n return text.length > 0 ? text : null;\n}\n\n// --- Helpers ---\n\nfunction loadSyncConfig(): SyncConfig | null {\n const url = process.env.RECALL_SYNC_URL;\n const key = process.env.RECALL_SYNC_KEY;\n if (!url || !key) return null;\n return {\n remote_url: url,\n api_key: key,\n team_id: process.env.RECALL_TEAM_ID,\n auto_sync: false,\n sync_interval_seconds: 300,\n };\n}\n\nfunction formatSetupStep(step: { enabled: boolean; ok: boolean; message: string }) {\n if (!step.enabled) return `skipped (${step.message})`;\n return step.ok ? `ok (${step.message})` : `error (${step.message})`;\n}\n\nfunction formatAgentName(agent: string) {\n return agent === \"claude-code\" ? \"Claude Code\" : \"Codex\";\n}\n\nfunction collectAgents(value: string, previous: string[]) {\n return [...previous, value];\n}\n\nasync function confirmSetupWrite(scope: string): Promise<boolean> {\n const { createInterface } = await import(\"node:readline/promises\");\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n try {\n const answer = await rl.question(`Update ${scope} agent config files for Recall? [y/N] `);\n return /^(y|yes)$/i.test(answer.trim());\n } finally {\n rl.close();\n }\n}\n\nfunction findByPrefix(db: ReturnType<typeof initDb>, prefix: string) {\n // Try exact match first\n const exact = getMemory(db, prefix);\n if (exact) return exact;\n\n // Try prefix match\n const all = listMemories(db);\n const matches = all.filter((m) => m.id.startsWith(prefix));\n if (matches.length === 1) return matches[0];\n if (matches.length > 1) {\n console.error(`Ambiguous prefix \"${prefix}\". Matches:`);\n for (const m of matches) console.error(` ${m.id}`);\n process.exit(1);\n }\n return undefined;\n}\n\nexport { program };\n\nif (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {\n await program.parseAsync(process.argv);\n}\n","/**\n * Sync client — pushes/pulls memories to/from a remote sync server.\n * Handles conflict resolution (last-write-wins by updated_at).\n */\n\nimport { eq, gt } from \"drizzle-orm\";\nimport { randomUUID } from \"node:crypto\";\nimport type { RecallDb } from \"../db/client.js\";\nimport { memories, syncState } from \"../db/schema.js\";\nimport { queueMemoryEmbeddingSync } from \"../embeddings/embeddings.js\";\nimport type { SyncConfig, SyncResult, MemoryItem } from \"../types.js\";\n\n// --- Sync state helpers ---\n\ninterface SyncStateRow {\n id: string;\n remote_url: string | null;\n team_id: string | null;\n last_push_at: string | null;\n last_pull_at: string | null;\n last_push_version: number;\n last_pull_version: number;\n}\n\nfunction getSyncState(db: RecallDb): SyncStateRow {\n const row = db.select().from(syncState).where(eq(syncState.id, \"local\")).get();\n if (row) return row;\n // Initialize\n db.insert(syncState)\n .values({\n id: \"local\",\n remote_url: null,\n team_id: null,\n last_push_at: null,\n last_pull_at: null,\n last_push_version: 0,\n last_pull_version: 0,\n })\n .run();\n return db.select().from(syncState).where(eq(syncState.id, \"local\")).get()!;\n}\n\nfunction updateSyncState(\n db: RecallDb,\n updates: Partial<Omit<SyncStateRow, \"id\">>,\n) {\n db.update(syncState)\n .set(updates)\n .where(eq(syncState.id, \"local\"))\n .run();\n}\n\n// --- Push ---\n\nexport async function pushMemories(\n db: RecallDb,\n config: SyncConfig,\n): Promise<{ pushed: number; version: number }> {\n const state = getSyncState(db);\n\n // Get locally modified memories since last push\n const localMemories = db\n .select()\n .from(memories)\n .where(gt(memories.sync_version, state.last_push_version))\n .all();\n\n if (localMemories.length === 0) {\n return { pushed: 0, version: state.last_push_version };\n }\n\n const payload = localMemories.map((m) => ({\n ...m,\n origin_id: m.id,\n evidence: typeof m.evidence === \"string\" ? JSON.parse(m.evidence as string) : m.evidence,\n }));\n\n const resp = await fetch(`${config.remote_url}/api/push`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.api_key}`,\n },\n body: JSON.stringify({\n team_id: config.team_id,\n memories: payload,\n }),\n });\n\n if (!resp.ok) {\n const err = await resp.json().catch(() => ({ error: resp.statusText }));\n throw new Error(`Push failed: ${(err as any).error ?? resp.statusText}`);\n }\n\n const result = (await resp.json()) as { pushed: number; version: number };\n\n updateSyncState(db, {\n remote_url: config.remote_url,\n team_id: config.team_id,\n last_push_at: new Date().toISOString(),\n last_push_version: Math.max(\n ...localMemories.map((m) => m.sync_version),\n ),\n });\n\n return result;\n}\n\n// --- Pull ---\n\nexport async function pullMemories(\n db: RecallDb,\n config: SyncConfig,\n): Promise<{ pulled: number; conflicts: number }> {\n const state = getSyncState(db);\n\n const resp = await fetch(`${config.remote_url}/api/pull`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.api_key}`,\n },\n body: JSON.stringify({\n team_id: config.team_id,\n since_version: state.last_pull_version,\n }),\n });\n\n if (!resp.ok) {\n const err = await resp.json().catch(() => ({ error: resp.statusText }));\n throw new Error(`Pull failed: ${(err as any).error ?? resp.statusText}`);\n }\n\n const data = (await resp.json()) as {\n memories: any[];\n version: number;\n };\n\n let pulled = 0;\n let conflicts = 0;\n\n for (const remote of data.memories) {\n const localMem = db\n .select()\n .from(memories)\n .where(eq(memories.id, remote.origin_id))\n .get();\n\n if (localMem) {\n // Conflict resolution: last-write-wins by updated_at\n if (remote.updated_at > localMem.updated_at) {\n db.update(memories)\n .set({\n text: remote.text,\n status: remote.status,\n confidence: remote.confidence,\n evidence: remote.evidence,\n updated_at: remote.updated_at,\n team_id: config.team_id,\n })\n .where(eq(memories.id, localMem.id))\n .run();\n queueMemoryEmbeddingSync(db, localMem.id);\n pulled++;\n conflicts++;\n }\n } else {\n // New memory from team\n const memoryId = remote.origin_id ?? randomUUID();\n db.insert(memories)\n .values({\n id: memoryId,\n type: remote.type,\n text: remote.text,\n scope: remote.scope,\n path_scope: remote.path_scope,\n repo: remote.repo,\n status: remote.status,\n confidence: remote.confidence,\n source: remote.source,\n evidence: remote.evidence,\n supersedes: remote.supersedes,\n created_at: remote.created_at,\n updated_at: remote.updated_at,\n team_id: config.team_id,\n sync_version: 0,\n })\n .run();\n queueMemoryEmbeddingSync(db, memoryId);\n pulled++;\n }\n }\n\n updateSyncState(db, {\n last_pull_at: new Date().toISOString(),\n last_pull_version: data.version,\n });\n\n return { pulled, conflicts };\n}\n\n// --- Full sync ---\n\nexport async function sync(\n db: RecallDb,\n config: SyncConfig,\n): Promise<SyncResult> {\n const errors: string[] = [];\n let pushed = 0;\n let pulled = 0;\n let conflicts = 0;\n\n try {\n const pushResult = await pushMemories(db, config);\n pushed = pushResult.pushed;\n } catch (err: any) {\n errors.push(`push: ${err.message}`);\n }\n\n try {\n const pullResult = await pullMemories(db, config);\n pulled = pullResult.pulled;\n conflicts = pullResult.conflicts;\n } catch (err: any) {\n errors.push(`pull: ${err.message}`);\n }\n\n return { pushed, pulled, conflicts, errors };\n}\n\n// --- Team helpers ---\n\nexport async function createTeam(\n config: Pick<SyncConfig, \"remote_url\" | \"api_key\">,\n name: string,\n): Promise<string> {\n const resp = await fetch(`${config.remote_url}/api/team`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.api_key}`,\n },\n body: JSON.stringify({ name }),\n });\n\n if (!resp.ok) throw new Error(`Failed to create team: ${resp.statusText}`);\n const data = (await resp.json()) as { team_id: string };\n return data.team_id;\n}\n\nexport async function joinTeam(\n config: Pick<SyncConfig, \"remote_url\" | \"api_key\">,\n teamId: string,\n): Promise<void> {\n const resp = await fetch(`${config.remote_url}/api/team/${teamId}/join`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.api_key}`,\n },\n });\n\n if (!resp.ok) throw new Error(`Failed to join team: ${resp.statusText}`);\n}\n\n// --- Bump sync version on local changes ---\n\nexport function bumpSyncVersion(db: RecallDb, memoryId: string) {\n const mem = db.select().from(memories).where(eq(memories.id, memoryId)).get();\n if (!mem) return;\n db.update(memories)\n .set({ sync_version: mem.sync_version + 1 })\n .where(eq(memories.id, memoryId))\n .run();\n}\n","import { existsSync } from \"node:fs\";\nimport { execFileSync } from \"node:child_process\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { installClaudeCodeHooks, uninstallClaudeCodeHooks } from \"../agents/claude-code.js\";\nimport { installCodexHooks, uninstallCodexHooks } from \"../agents/codex.js\";\nimport type { AgentName } from \"../agents/types.js\";\nimport { hasCommand, resolveUserHomeDir } from \"../agents/utils.js\";\n\nexport interface LocalSetupOptions {\n appPath?: string;\n codex?: boolean;\n claude?: boolean;\n promptInjection?: boolean;\n}\n\nexport interface LocalSetupResult {\n appPath: string;\n runtimeNodePath: string;\n runtimeCliPath: string;\n runtimeMcpPath: string;\n codex: SetupStepResult;\n claude: SetupStepResult;\n codex_hooks: SetupStepResult;\n claude_hooks: SetupStepResult;\n}\n\nexport interface SetupStepResult {\n enabled: boolean;\n ok: boolean;\n message: string;\n}\n\nexport type SetupScope = \"global\" | \"project\";\n\nexport interface AgentSetupResult {\n agent: AgentName;\n detected: boolean;\n mcp: SetupStepResult;\n hooks: SetupStepResult;\n hook_config_path: string | null;\n}\n\nexport interface RecallSetupOptions {\n agent?: AgentName[];\n appPath?: string;\n cwd?: string;\n dryRun?: boolean;\n hooksOnly?: boolean;\n mcpOnly?: boolean;\n scope?: SetupScope;\n uninstallHooks?: boolean;\n runner?: CommandRunner;\n promptInjection?: boolean;\n}\n\nexport interface RecallSetupResult {\n appPath: string;\n runtimeNodePath: string;\n runtimeCliPath: string;\n runtimeMcpPath: string;\n scope: SetupScope;\n dry_run: boolean;\n hooks_only: boolean;\n mcp_only: boolean;\n uninstall_hooks: boolean;\n agents: AgentSetupResult[];\n}\n\ntype CommandRunner = (command: string, args: string[]) => void;\n\nexport function resolveRuntimePaths(appPath?: string) {\n // macOS bundled-app layout: /Applications/Recall.app/Contents/Resources/Runtime\n if (appPath || (process.platform === \"darwin\" && existsSync(\"/Applications/Recall.app\"))) {\n const resolvedAppPath = appPath ?? \"/Applications/Recall.app\";\n const runtimeRoot = join(resolvedAppPath, \"Contents\", \"Resources\", \"Runtime\");\n return {\n appPath: resolvedAppPath,\n runtimeNodePath: join(runtimeRoot, \"bin\", \"node\"),\n runtimeCliPath: join(runtimeRoot, \"dist\", \"cli.js\"),\n runtimeMcpPath: join(runtimeRoot, \"dist\", \"mcp.js\"),\n };\n }\n\n // Plain npm/global install: use system node + dist next to this module.\n const distDir = dirname(fileURLToPath(import.meta.url));\n return {\n appPath: distDir,\n runtimeNodePath: process.execPath,\n runtimeCliPath: join(distDir, \"cli.js\"),\n runtimeMcpPath: join(distDir, \"mcp.js\"),\n };\n}\n\nexport function runLocalSetup(opts: LocalSetupOptions = {}): LocalSetupResult {\n const targetCodex = opts.codex ?? true;\n const targetClaude = opts.claude ?? true;\n const result = runRecallSetup({\n appPath: opts.appPath,\n agent: [\n ...(targetCodex ? [\"codex\" as const] : []),\n ...(targetClaude ? [\"claude-code\" as const] : []),\n ],\n hooksOnly: false,\n mcpOnly: false,\n scope: \"global\",\n promptInjection: opts.promptInjection,\n });\n\n const codex = result.agents.find((agent) => agent.agent === \"codex\");\n const claude = result.agents.find((agent) => agent.agent === \"claude-code\");\n\n return {\n appPath: result.appPath,\n runtimeNodePath: result.runtimeNodePath,\n runtimeCliPath: result.runtimeCliPath,\n runtimeMcpPath: result.runtimeMcpPath,\n codex: codex?.mcp ?? skipped(\"skipped\"),\n claude: claude?.mcp ?? skipped(\"skipped\"),\n codex_hooks: codex?.hooks ?? skipped(\"skipped\"),\n claude_hooks: claude?.hooks ?? skipped(\"skipped\"),\n };\n}\n\nexport function runRecallSetup(opts: RecallSetupOptions = {}): RecallSetupResult {\n const scope = opts.scope ?? \"global\";\n const dryRun = opts.dryRun ?? false;\n const hooksOnly = opts.hooksOnly ?? false;\n const mcpOnly = opts.mcpOnly ?? false;\n const uninstallHooks = opts.uninstallHooks ?? false;\n const runner = opts.runner ?? defaultRunner;\n const paths = resolveRuntimePaths(opts.appPath);\n\n if (!existsSync(paths.runtimeNodePath)) {\n throw new Error(`Node runtime not found at ${paths.runtimeNodePath}`);\n }\n if (!existsSync(paths.runtimeCliPath)) {\n throw new Error(`Recall CLI entry not found at ${paths.runtimeCliPath}`);\n }\n if (!existsSync(paths.runtimeMcpPath)) {\n throw new Error(`Recall MCP entry not found at ${paths.runtimeMcpPath}`);\n }\n\n const targetAgents = resolveTargetAgents(opts.agent);\n const cwd = resolve(opts.cwd ?? process.cwd());\n const agents = targetAgents.map((agent) =>\n setupAgent(agent, {\n cwd,\n dryRun,\n hooksOnly,\n mcpOnly,\n paths,\n runner,\n scope,\n uninstallHooks,\n promptInjection: opts.promptInjection,\n }),\n );\n\n return {\n ...paths,\n scope,\n dry_run: dryRun,\n hooks_only: hooksOnly,\n mcp_only: mcpOnly,\n uninstall_hooks: uninstallHooks,\n agents,\n };\n}\n\nfunction setupAgent(\n agent: AgentName,\n options: {\n cwd: string;\n dryRun: boolean;\n hooksOnly: boolean;\n mcpOnly: boolean;\n paths: ReturnType<typeof resolveRuntimePaths>;\n runner: CommandRunner;\n scope: SetupScope;\n uninstallHooks: boolean;\n promptInjection?: boolean;\n },\n): AgentSetupResult {\n const detected = detectAgent(agent);\n const hookConfigPath = resolveHookConfigPath(agent, options.scope, options.cwd);\n\n const mcp = options.hooksOnly\n ? skipped(\"hooks-only\")\n : configureMcp(agent, options);\n const hooks = options.mcpOnly\n ? skipped(\"mcp-only\")\n : configureHooks(agent, {\n configPath: hookConfigPath,\n dryRun: options.dryRun,\n paths: options.paths,\n uninstallHooks: options.uninstallHooks,\n promptInjection: options.promptInjection,\n });\n\n return {\n agent,\n detected,\n mcp,\n hooks,\n hook_config_path: options.mcpOnly ? null : hookConfigPath,\n };\n}\n\nfunction configureMcp(\n agent: AgentName,\n options: {\n dryRun: boolean;\n paths: ReturnType<typeof resolveRuntimePaths>;\n runner: CommandRunner;\n scope: SetupScope;\n },\n): SetupStepResult {\n if (agent === \"codex\") {\n if (!hasCommand(\"codex\")) return skipped(\"codex not found on PATH\");\n if (options.scope === \"project\") {\n return skipped(\"project-scoped Codex MCP not supported by Codex CLI\");\n }\n if (options.dryRun) {\n return ok(\"would configure global Codex MCP server\");\n }\n tryRun(options.runner, \"codex\", [\"mcp\", \"remove\", \"recall\"]);\n options.runner(\"codex\", [\"mcp\", \"add\", \"recall\", \"--\", options.paths.runtimeNodePath, options.paths.runtimeMcpPath]);\n return ok(\"configured global Codex MCP server\");\n }\n\n if (!hasCommand(\"claude\")) return skipped(\"claude not found on PATH\");\n const claudeScope = options.scope === \"project\" ? \"project\" : \"user\";\n if (options.dryRun) {\n return ok(`would configure ${claudeScope} Claude MCP server`);\n }\n tryRun(options.runner, \"claude\", [\"mcp\", \"remove\", \"recall\", \"-s\", claudeScope]);\n options.runner(\"claude\", [\"mcp\", \"add\", \"-s\", claudeScope, \"recall\", options.paths.runtimeNodePath, options.paths.runtimeMcpPath]);\n return ok(`configured ${claudeScope} Claude MCP server`);\n}\n\nfunction configureHooks(\n agent: AgentName,\n options: {\n configPath: string;\n dryRun: boolean;\n paths: ReturnType<typeof resolveRuntimePaths>;\n uninstallHooks: boolean;\n promptInjection?: boolean;\n },\n): SetupStepResult {\n if (options.dryRun) {\n return ok(\n options.uninstallHooks\n ? `would remove hooks from ${options.configPath}`\n : `would install hooks into ${options.configPath}${options.promptInjection === false ? \" (prompt injection opt-out)\" : \"\"}`,\n );\n }\n\n const codexHooksPath = agent === \"codex\"\n ? join(dirname(options.configPath), \"hooks.json\")\n : undefined;\n\n const result = agent === \"claude-code\"\n ? (options.uninstallHooks\n ? uninstallClaudeCodeHooks({ configPath: options.configPath })\n : installClaudeCodeHooks({\n configPath: options.configPath,\n cliPath: options.paths.runtimeCliPath,\n nodePath: options.paths.runtimeNodePath,\n promptInjection: options.promptInjection,\n }))\n : (options.uninstallHooks\n ? uninstallCodexHooks({ configPath: options.configPath, hooksPath: codexHooksPath })\n : installCodexHooks({\n configPath: options.configPath,\n hooksPath: codexHooksPath,\n cliPath: options.paths.runtimeCliPath,\n nodePath: options.paths.runtimeNodePath,\n promptInjection: options.promptInjection,\n }));\n\n return {\n enabled: true,\n ok: result.ok,\n message: result.message,\n };\n}\n\nfunction resolveTargetAgents(target?: AgentName[]): AgentName[] {\n if (target && target.length > 0) {\n return [...new Set(target)];\n }\n\n const detected: AgentName[] = [];\n if (detectAgent(\"codex\")) detected.push(\"codex\");\n if (detectAgent(\"claude-code\")) detected.push(\"claude-code\");\n return detected;\n}\n\nfunction detectAgent(agent: AgentName): boolean {\n if (agent === \"codex\") {\n return hasCommand(\"codex\") || existsSync(join(resolveUserHomeDir(), \".codex\", \"config.toml\"));\n }\n return hasCommand(\"claude\") || existsSync(join(resolveUserHomeDir(), \".claude\", \"settings.json\"));\n}\n\nfunction resolveHookConfigPath(agent: AgentName, scope: SetupScope, cwd: string): string {\n if (scope === \"project\") {\n return agent === \"codex\"\n ? join(cwd, \".codex\", \"config.toml\")\n : join(cwd, \".claude\", \"settings.json\");\n }\n\n return agent === \"codex\"\n ? join(resolveUserHomeDir(), \".codex\", \"config.toml\")\n : join(resolveUserHomeDir(), \".claude\", \"settings.json\");\n}\n\nfunction defaultRunner(command: string, args: string[]) {\n execFileSync(command, args, stdioOpts());\n}\n\nfunction tryRun(runner: CommandRunner, command: string, args: string[]) {\n try {\n runner(command, args);\n } catch {\n return;\n }\n}\n\nfunction stdioOpts() {\n return {\n stdio: \"ignore\" as const,\n };\n}\n\nfunction ok(message: string): SetupStepResult {\n return { enabled: true, ok: true, message };\n}\n\nfunction skipped(message: string): SetupStepResult {\n return { enabled: false, ok: false, message };\n}\n","import {\n existsSync,\n mkdirSync,\n readFileSync,\n renameSync,\n writeFileSync,\n} from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { hasCommand, resolveUserHomeDir } from \"./utils.js\";\nimport type {\n AgentAdapter,\n HookProfile,\n InstallResult,\n} from \"./types.js\";\n\nconst CLAUDE_CONFIG_RELATIVE_PATH = [\".claude\", \"settings.json\"] as const;\nconst MANAGED_TAG = \"recall:managed:claude-code\";\nconst SESSION_START_MATCHER = \"startup|resume|clear|compact\";\nconst SESSION_END_MATCHER =\n \"clear|resume|logout|prompt_input_exit|bypass_permissions_disabled|other\";\n\ninterface ClaudeSettings {\n hooks?: Record<string, ClaudeHookMatcherGroup[]>;\n [key: string]: unknown;\n}\n\ninterface ClaudeHookMatcherGroup {\n matcher?: string;\n hooks?: ClaudeCommandHook[];\n [key: string]: unknown;\n}\n\ninterface ClaudeCommandHook {\n type: \"command\";\n command: string;\n [key: string]: unknown;\n}\n\nexport interface ClaudeCodeHookInstallOptions {\n configPath?: string;\n cliPath?: string;\n nodePath?: string;\n profile?: HookProfile;\n /** When false, prepends RECALL_HOOK_INJECT_PROMPT=false to the prompt-hook command so per-prompt injection stays off without requiring a shell rc edit. */\n promptInjection?: boolean;\n}\n\nconst configPath = () => join(resolveUserHomeDir(), ...CLAUDE_CONFIG_RELATIVE_PATH);\n\nexport const claudeCodeAdapter: AgentAdapter = {\n name: \"claude-code\",\n configPath,\n detect() {\n return existsSync(configPath()) || hasCommand(\"claude\") ? \"installed\" : \"not-installed\";\n },\n capabilities() {\n return {\n supports: [\"session_started\", \"prompt_submitted\", \"tool_invoked\", \"session_ended\"],\n supports_hook_install: true,\n supports_mcp_fallback: true,\n };\n },\n installHooks(profile: HookProfile): InstallResult {\n return installClaudeCodeHooks({ profile });\n },\n uninstallHooks(): InstallResult {\n return uninstallClaudeCodeHooks();\n },\n envMapping: {\n prompt_submitted: {\n prompt: \"text\",\n session_id: \"session_id\",\n cwd: \"repo_path\",\n },\n tool_invoked: {\n tool_name: \"name\",\n tool_input: \"input_summary\",\n session_id: \"session_id\",\n cwd: \"repo_path\",\n },\n session_started: {\n session_id: \"session_id\",\n cwd: \"repo_path\",\n source: \"matcher\",\n },\n session_ended: {\n session_id: \"session_id\",\n cwd: \"repo_path\",\n reason: \"matcher\",\n },\n },\n writeMcpFallback(): InstallResult {\n throw new Error(\"Claude Code MCP fallback wiring not implemented yet.\");\n },\n};\n\nexport function installClaudeCodeHooks(\n options: ClaudeCodeHookInstallOptions = {},\n): InstallResult {\n const targetPath = options.configPath ?? configPath();\n const current = readSettingsFile(targetPath);\n const managedGroups = buildManagedGroups({\n cliPath: options.cliPath,\n nodePath: options.nodePath,\n profile: options.profile,\n promptInjection: options.promptInjection,\n });\n const next = cloneSettings(current.settings);\n const hooks = ensureHooksObject(next);\n\n let changed = false;\n for (const [eventName, groups] of Object.entries(managedGroups)) {\n const existing = hooks[eventName] ?? [];\n const preserved = existing.filter((group) => !isManagedGroup(group));\n const merged = [...preserved, ...groups];\n if (!sameJson(existing, merged)) {\n hooks[eventName] = merged;\n changed = true;\n }\n }\n\n if (!changed) {\n return {\n ok: true,\n changed: false,\n config_path: targetPath,\n message: \"Claude Code hooks already installed\",\n };\n }\n\n writeSettingsFile(targetPath, current.raw, next);\n return {\n ok: true,\n changed: true,\n config_path: targetPath,\n message: \"Installed Claude Code Recall hooks\",\n };\n}\n\nexport function uninstallClaudeCodeHooks(\n options: Pick<ClaudeCodeHookInstallOptions, \"configPath\"> = {},\n): InstallResult {\n const targetPath = options.configPath ?? configPath();\n if (!existsSync(targetPath)) {\n return {\n ok: true,\n changed: false,\n config_path: targetPath,\n message: \"Claude Code settings file not found\",\n };\n }\n\n const current = readSettingsFile(targetPath);\n const next = cloneSettings(current.settings);\n const hooks = next.hooks;\n\n if (!hooks || typeof hooks !== \"object\") {\n return {\n ok: true,\n changed: false,\n config_path: targetPath,\n message: \"No Claude Code hooks configured\",\n };\n }\n\n let changed = false;\n for (const eventName of Object.keys(hooks)) {\n const existing = hooks[eventName] ?? [];\n const preserved = existing.filter((group) => !isManagedGroup(group));\n if (!sameJson(existing, preserved)) {\n changed = true;\n if (preserved.length > 0) {\n hooks[eventName] = preserved;\n } else {\n delete hooks[eventName];\n }\n }\n }\n\n if (Object.keys(hooks).length === 0) {\n delete next.hooks;\n }\n\n if (!changed) {\n return {\n ok: true,\n changed: false,\n config_path: targetPath,\n message: \"No Recall-managed Claude Code hooks found\",\n };\n }\n\n writeSettingsFile(targetPath, current.raw, next);\n return {\n ok: true,\n changed: true,\n config_path: targetPath,\n message: \"Removed Claude Code Recall hooks\",\n };\n}\n\nfunction buildManagedGroups(\n options: ClaudeCodeHookInstallOptions,\n): Record<string, ClaudeHookMatcherGroup[]> {\n const installedEvents = new Set(options.profile ?? []);\n const commandPrefix = resolveHookCommandPrefix(options);\n const groups: Record<string, ClaudeHookMatcherGroup[]> = {};\n\n groups.SessionStart = [\n {\n matcher: SESSION_START_MATCHER,\n hooks: [commandHook(`${commandPrefix} hook session-start --agent claude-code --claude-code-stdin`, \"session-start\")],\n },\n ];\n\n if (installedEvents.size === 0 || installedEvents.has(\"prompt_submitted\")) {\n const envPrefix = options.promptInjection === false ? \"RECALL_HOOK_INJECT_PROMPT=false \" : \"\";\n groups.UserPromptSubmit = [\n {\n hooks: [commandHook(`${envPrefix}${commandPrefix} hook prompt --agent claude-code --claude-code-stdin`, \"prompt\")],\n },\n ];\n }\n\n if (installedEvents.size === 0 || installedEvents.has(\"tool_invoked\")) {\n groups.PostToolUse = [\n {\n matcher: \"Edit|Write|Bash\",\n hooks: [commandHook(`${commandPrefix} hook tool --agent claude-code --claude-code-stdin`, \"tool\")],\n },\n ];\n }\n\n if (installedEvents.size === 0 || installedEvents.has(\"session_ended\")) {\n groups.SessionEnd = [\n {\n matcher: SESSION_END_MATCHER,\n hooks: [commandHook(`${commandPrefix} hook session-end --agent claude-code --claude-code-stdin`, \"session-end\")],\n },\n ];\n }\n\n return groups;\n}\n\nfunction commandHook(command: string, tag: string): ClaudeCommandHook {\n return {\n type: \"command\",\n command: `${command} # ${MANAGED_TAG}:${tag}`,\n };\n}\n\nfunction resolveHookCommandPrefix(options: ClaudeCodeHookInstallOptions): string {\n const nodePath = options.nodePath ?? process.env.RECALL_NODE_PATH ?? process.execPath;\n const cliPath = options.cliPath ?? resolveCliPath();\n return `${shellQuote(nodePath)} ${shellQuote(cliPath)}`;\n}\n\nfunction resolveCliPath(): string {\n const fromEnv = process.env.RECALL_CLI_PATH;\n if (fromEnv && existsSync(fromEnv)) {\n return resolve(fromEnv);\n }\n\n const fromArgv = process.argv[1];\n if (fromArgv && /(?:^|\\/)cli\\.[cm]?js$/.test(fromArgv) && existsSync(fromArgv)) {\n return resolve(fromArgv);\n }\n\n const sibling = resolve(dirname(fileURLToPath(import.meta.url)), \"..\", \"cli.js\");\n if (existsSync(sibling)) {\n return sibling;\n }\n\n const distCli = resolve(process.cwd(), \"dist\", \"cli.js\");\n if (existsSync(distCli)) {\n return distCli;\n }\n\n throw new Error(\"Unable to resolve Recall CLI path for Claude Code hooks\");\n}\n\nfunction readSettingsFile(configPath: string): { raw: string | null; settings: ClaudeSettings } {\n if (!existsSync(configPath)) {\n return { raw: null, settings: {} };\n }\n\n const raw = readFileSync(configPath, \"utf-8\");\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(`Invalid Claude Code settings at ${configPath}`);\n }\n\n return { raw, settings: parsed as ClaudeSettings };\n}\n\nfunction writeSettingsFile(\n configPath: string,\n previousRaw: string | null,\n settings: ClaudeSettings,\n) {\n const parentDir = dirname(configPath);\n mkdirSync(parentDir, { recursive: true });\n\n if (previousRaw != null) {\n const backupPath = `${configPath}.recall.bak.${Date.now()}`;\n writeFileSync(backupPath, previousRaw);\n }\n\n const tmpPath = `${configPath}.tmp.${process.pid}`;\n writeFileSync(tmpPath, `${JSON.stringify(settings, null, 2)}\\n`);\n renameSync(tmpPath, configPath);\n}\n\nfunction ensureHooksObject(settings: ClaudeSettings): Record<string, ClaudeHookMatcherGroup[]> {\n if (!settings.hooks) {\n settings.hooks = {};\n }\n if (typeof settings.hooks !== \"object\" || Array.isArray(settings.hooks)) {\n throw new Error(\"Claude Code hooks config must be an object\");\n }\n return settings.hooks;\n}\n\nfunction isManagedGroup(group: ClaudeHookMatcherGroup): boolean {\n return (group.hooks ?? []).some((hook) => typeof hook.command === \"string\" && hook.command.includes(MANAGED_TAG));\n}\n\nfunction cloneSettings(settings: ClaudeSettings): ClaudeSettings {\n return JSON.parse(JSON.stringify(settings)) as ClaudeSettings;\n}\n\nfunction sameJson(left: unknown, right: unknown): boolean {\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n","import { execFileSync } from \"node:child_process\";\nimport { homedir } from \"node:os\";\n\nexport function resolveUserHomeDir(): string {\n return process.env.HOME ?? process.env.USERPROFILE ?? homedir();\n}\n\nexport function hasCommand(name: string): boolean {\n try {\n execFileSync(\"which\", [name], { stdio: \"ignore\" });\n return true;\n } catch {\n return false;\n }\n}\n","import {\n existsSync,\n mkdirSync,\n readFileSync,\n renameSync,\n writeFileSync,\n} from \"node:fs\";\nimport { execFileSync } from \"node:child_process\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { hasCommand, resolveUserHomeDir } from \"./utils.js\";\nimport type {\n AgentAdapter,\n HookProfile,\n InstallResult,\n} from \"./types.js\";\n\nconst CODEX_CONFIG_RELATIVE_PATH = [\".codex\", \"config.toml\"] as const;\nconst CODEX_HOOKS_RELATIVE_PATH = [\".codex\", \"hooks.json\"] as const;\nconst MANAGED_START = \"# recall:managed:codex:start\";\nconst MANAGED_END = \"# recall:managed:codex:end\";\nconst MANAGED_FEATURE_FLAG = \"# recall:managed:codex:feature\";\nconst MANAGED_HOOK_TAG = \"recall:managed:codex\";\n\n// Minimum Codex CLI version that supports the hooks.json + [features].codex_hooks\n// flow we target in installCodexHooks. Below this we fall back to the legacy\n// notify bridge so memory capture still works on older CLIs.\n//\n// Override at call time by passing options.minCodexHooksVersion, or at runtime\n// via RECALL_CODEX_HOOKS_MIN_VERSION for users who have forked/patched their CLI.\nconst DEFAULT_MIN_CODEX_HOOKS_VERSION = \"0.115.0\";\n\nexport interface CodexCapability {\n hooks_json: boolean;\n detected_version: string | null;\n required_version: string;\n reason?: string;\n}\n\nexport interface CodexHookInstallOptions {\n configPath?: string;\n hooksPath?: string;\n cliPath?: string;\n nodePath?: string;\n profile?: HookProfile;\n /** Override the minimum Codex CLI version that is eligible for hooks.json install. */\n minCodexHooksVersion?: string;\n /** Skip the version probe and install hooks.json regardless of detected version. */\n forceHooks?: boolean;\n /** Skip hooks.json entirely and use the legacy notify bridge. */\n forceNotifyBridge?: boolean;\n /** When false, prepends RECALL_HOOK_INJECT_PROMPT=false to the prompt-hook command so per-prompt injection stays off without requiring a shell rc edit. */\n promptInjection?: boolean;\n}\n\nconst configPath = () => join(resolveUserHomeDir(), ...CODEX_CONFIG_RELATIVE_PATH);\nconst hooksJsonPath = () => join(resolveUserHomeDir(), ...CODEX_HOOKS_RELATIVE_PATH);\n\nexport const codexAdapter: AgentAdapter = {\n name: \"codex\",\n configPath,\n detect() {\n return existsSync(configPath()) || hasCommand(\"codex\") ? \"installed\" : \"not-installed\";\n },\n capabilities() {\n return {\n supports: [\"prompt_submitted\", \"tool_invoked\", \"session_ended\"],\n supports_hook_install: true,\n supports_mcp_fallback: true,\n };\n },\n installHooks(profile: HookProfile): InstallResult {\n return installCodexHooks({ profile });\n },\n uninstallHooks(): InstallResult {\n return uninstallCodexHooks();\n },\n envMapping: {\n prompt_submitted: {\n prompt: \"text\",\n session_id: \"session_id\",\n cwd: \"repo_path\",\n },\n tool_invoked: {\n tool_name: \"name\",\n cwd: \"repo_path\",\n tool_input: \"input_summary\",\n },\n session_ended: {\n session_id: \"session_id\",\n cwd: \"repo_path\",\n reason: \"event\",\n },\n },\n writeMcpFallback(): InstallResult {\n throw new Error(\"Codex MCP fallback wiring not implemented yet.\");\n },\n};\n\nexport function installCodexNotifyBridge(\n options: CodexHookInstallOptions = {},\n): InstallResult {\n const targetPath = options.configPath ?? configPath();\n const existing = existsSync(targetPath)\n ? readFileSync(targetPath, \"utf-8\")\n : \"\";\n const stripped = stripManagedBlock(existing);\n\n if (hasUnmanagedNotify(stripped)) {\n return {\n ok: false,\n changed: false,\n config_path: targetPath,\n message: \"Codex notify is already configured outside Recall-managed block\",\n };\n }\n\n const managedBlock = buildManagedNotifyBlock(options);\n const next = appendManagedBlock(stripped, managedBlock);\n\n if (next === existing) {\n return {\n ok: true,\n changed: false,\n config_path: targetPath,\n message: \"Codex notify bridge already installed\",\n };\n }\n\n writeConfigFile(targetPath, existing || null, next);\n return {\n ok: true,\n changed: true,\n config_path: targetPath,\n message: \"Installed Codex Recall notify bridge\",\n };\n}\n\nexport function uninstallCodexNotifyBridge(\n options: Pick<CodexHookInstallOptions, \"configPath\"> = {},\n): InstallResult {\n const targetPath = options.configPath ?? configPath();\n if (!existsSync(targetPath)) {\n return {\n ok: true,\n changed: false,\n config_path: targetPath,\n message: \"Codex config.toml not found\",\n };\n }\n\n const existing = readFileSync(targetPath, \"utf-8\");\n const next = stripManagedBlock(existing);\n if (next === existing) {\n return {\n ok: true,\n changed: false,\n config_path: targetPath,\n message: \"No Recall-managed Codex notify bridge found\",\n };\n }\n\n writeConfigFile(targetPath, existing, next);\n return {\n ok: true,\n changed: true,\n config_path: targetPath,\n message: \"Removed Codex Recall notify bridge\",\n };\n}\n\ninterface CodexHooksFile {\n hooks?: Record<string, CodexHookMatcherGroup[]>;\n [key: string]: unknown;\n}\n\ninterface CodexHookMatcherGroup {\n matcher?: string;\n hooks?: CodexCommandHook[];\n [key: string]: unknown;\n}\n\ninterface CodexCommandHook {\n type: \"command\";\n command: string;\n [key: string]: unknown;\n}\n\nexport function detectCodexCapability(\n options: Pick<CodexHookInstallOptions, \"minCodexHooksVersion\"> = {},\n): CodexCapability {\n const required = options.minCodexHooksVersion\n ?? process.env.RECALL_CODEX_HOOKS_MIN_VERSION\n ?? DEFAULT_MIN_CODEX_HOOKS_VERSION;\n const detected = probeCodexVersion();\n if (!detected) {\n return {\n hooks_json: false,\n detected_version: null,\n required_version: required,\n reason: \"codex CLI not found on PATH — cannot verify hook support\",\n };\n }\n if (compareSemver(detected, required) < 0) {\n return {\n hooks_json: false,\n detected_version: detected,\n required_version: required,\n reason: `codex ${detected} < ${required} (hooks.json unsupported)`,\n };\n }\n return {\n hooks_json: true,\n detected_version: detected,\n required_version: required,\n };\n}\n\nexport function installCodexHooks(\n options: CodexHookInstallOptions = {},\n): InstallResult {\n const targetConfig = options.configPath ?? configPath();\n const targetHooks = options.hooksPath ?? hooksJsonPath();\n\n const capability = options.forceNotifyBridge\n ? { hooks_json: false, detected_version: null, required_version: \"n/a\", reason: \"forced notify bridge\" }\n : options.forceHooks\n ? { hooks_json: true, detected_version: null, required_version: \"n/a\" }\n : detectCodexCapability(options);\n\n if (!capability.hooks_json) {\n const bridge = installCodexNotifyBridge(options);\n const reason = capability.reason ?? \"codex hooks unsupported\";\n return {\n ok: bridge.ok,\n changed: bridge.changed,\n config_path: bridge.config_path,\n message: `${bridge.message} (fell back to notify bridge: ${reason})`,\n };\n }\n\n // Migration: legacy notify bridge would double-fire on every prompt. Remove first.\n uninstallCodexNotifyBridge({ configPath: targetConfig });\n\n const flagResult = ensureCodexHooksFeatureFlag(targetConfig);\n const hooksResult = writeCodexHooksJson(targetHooks, options);\n\n const changed = flagResult.changed || hooksResult.changed;\n const ok = flagResult.ok && hooksResult.ok;\n const versionNote = capability.detected_version\n ? ` (codex ${capability.detected_version})`\n : \"\";\n const messages = [flagResult.message, hooksResult.message].filter(Boolean).join(\"; \");\n\n return {\n ok,\n changed,\n config_path: targetHooks,\n message: (messages || (changed ? \"Installed Codex hooks.json\" : \"Codex hooks already installed\")) + versionNote,\n };\n}\n\nfunction probeCodexVersion(): string | null {\n if (!hasCommand(\"codex\")) return null;\n try {\n const raw = execFileSync(\"codex\", [\"--version\"], {\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n timeout: 5_000,\n });\n return extractSemverFromVersionString(raw);\n } catch {\n return null;\n }\n}\n\nexport function extractSemverFromVersionString(raw: string): string | null {\n const match = raw.match(/(\\d+)\\.(\\d+)\\.(\\d+)(?:[-+][A-Za-z0-9.-]+)?/);\n return match ? `${match[1]}.${match[2]}.${match[3]}` : null;\n}\n\nexport function compareSemver(a: string, b: string): number {\n const pa = a.split(\".\").map((n) => parseInt(n, 10));\n const pb = b.split(\".\").map((n) => parseInt(n, 10));\n for (let i = 0; i < 3; i++) {\n const av = pa[i] ?? 0;\n const bv = pb[i] ?? 0;\n if (av !== bv) return av < bv ? -1 : 1;\n }\n return 0;\n}\n\nexport function uninstallCodexHooks(\n options: Pick<CodexHookInstallOptions, \"configPath\" | \"hooksPath\"> = {},\n): InstallResult {\n const targetConfig = options.configPath ?? configPath();\n const targetHooks = options.hooksPath ?? hooksJsonPath();\n\n const flagResult = removeCodexHooksFeatureFlag(targetConfig);\n const hooksResult = removeCodexHooksJson(targetHooks);\n const legacyResult = uninstallCodexNotifyBridge({ configPath: targetConfig });\n\n const changed = flagResult.changed || hooksResult.changed || legacyResult.changed;\n const ok = flagResult.ok && hooksResult.ok && legacyResult.ok;\n\n return {\n ok,\n changed,\n config_path: targetHooks,\n message: changed ? \"Removed Codex Recall hooks\" : \"No Recall-managed Codex hooks found\",\n };\n}\n\nfunction writeCodexHooksJson(\n targetPath: string,\n options: CodexHookInstallOptions,\n): InstallResult {\n const existing = readCodexHooksJson(targetPath);\n const next = cloneCodexHooks(existing.parsed);\n const hooks = ensureCodexHooksObject(next);\n const managed = buildCodexManagedGroups(options);\n\n let changed = false;\n for (const [eventName, groups] of Object.entries(managed)) {\n const current = hooks[eventName] ?? [];\n const preserved = current.filter((group) => !isCodexManagedGroup(group));\n const merged = [...preserved, ...groups];\n if (JSON.stringify(current) !== JSON.stringify(merged)) {\n hooks[eventName] = merged;\n changed = true;\n }\n }\n\n if (!changed) {\n return {\n ok: true,\n changed: false,\n config_path: targetPath,\n message: \"\",\n };\n }\n\n writeJsonFile(targetPath, existing.raw, next);\n return {\n ok: true,\n changed: true,\n config_path: targetPath,\n message: \"wrote hooks.json\",\n };\n}\n\nfunction removeCodexHooksJson(targetPath: string): InstallResult {\n if (!existsSync(targetPath)) {\n return { ok: true, changed: false, config_path: targetPath, message: \"\" };\n }\n\n const existing = readCodexHooksJson(targetPath);\n const next = cloneCodexHooks(existing.parsed);\n const hooks = next.hooks;\n if (!hooks || typeof hooks !== \"object\") {\n return { ok: true, changed: false, config_path: targetPath, message: \"\" };\n }\n\n let changed = false;\n for (const eventName of Object.keys(hooks)) {\n const current = hooks[eventName] ?? [];\n const preserved = current.filter((group) => !isCodexManagedGroup(group));\n if (preserved.length !== current.length) {\n changed = true;\n if (preserved.length > 0) {\n hooks[eventName] = preserved;\n } else {\n delete hooks[eventName];\n }\n }\n }\n\n if (Object.keys(hooks).length === 0) delete next.hooks;\n\n if (!changed) {\n return { ok: true, changed: false, config_path: targetPath, message: \"\" };\n }\n\n writeJsonFile(targetPath, existing.raw, next);\n return { ok: true, changed: true, config_path: targetPath, message: \"cleaned hooks.json\" };\n}\n\nfunction buildCodexManagedGroups(\n options: CodexHookInstallOptions,\n): Record<string, CodexHookMatcherGroup[]> {\n const installedEvents = new Set(options.profile ?? []);\n const commandPrefix = resolveHookCommandPrefix(options);\n const groups: Record<string, CodexHookMatcherGroup[]> = {};\n\n groups.SessionStart = [\n {\n matcher: \"startup|resume\",\n hooks: [commandHook(`${commandPrefix} hook session-start --agent codex --codex-stdin`, \"session-start\")],\n },\n ];\n\n if (installedEvents.size === 0 || installedEvents.has(\"prompt_submitted\")) {\n const envPrefix = options.promptInjection === false ? \"RECALL_HOOK_INJECT_PROMPT=false \" : \"\";\n groups.UserPromptSubmit = [\n {\n hooks: [commandHook(`${envPrefix}${commandPrefix} hook prompt --agent codex --codex-stdin`, \"prompt\")],\n },\n ];\n }\n\n if (installedEvents.size === 0 || installedEvents.has(\"tool_invoked\")) {\n groups.PostToolUse = [\n {\n matcher: \"Bash\",\n hooks: [commandHook(`${commandPrefix} hook tool --agent codex --codex-stdin`, \"tool\")],\n },\n ];\n }\n\n return groups;\n}\n\nfunction commandHook(command: string, tag: string): CodexCommandHook {\n return {\n type: \"command\",\n command: `${command} # ${MANAGED_HOOK_TAG}:${tag}`,\n };\n}\n\nfunction resolveHookCommandPrefix(options: CodexHookInstallOptions): string {\n const nodePath = options.nodePath ?? process.env.RECALL_NODE_PATH ?? process.execPath;\n const cliPath = options.cliPath ?? resolveCliPath();\n return `${shellQuote(nodePath)} ${shellQuote(cliPath)}`;\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nfunction readCodexHooksJson(targetPath: string): { raw: string | null; parsed: CodexHooksFile } {\n if (!existsSync(targetPath)) return { raw: null, parsed: {} };\n const raw = readFileSync(targetPath, \"utf-8\");\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(`Invalid Codex hooks.json at ${targetPath}`);\n }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(`Codex hooks.json must be an object at ${targetPath}`);\n }\n return { raw, parsed: parsed as CodexHooksFile };\n}\n\nfunction writeJsonFile(targetPath: string, previousRaw: string | null, value: unknown) {\n const parentDir = dirname(targetPath);\n mkdirSync(parentDir, { recursive: true });\n if (previousRaw != null) {\n writeFileSync(`${targetPath}.recall.bak.${Date.now()}`, previousRaw);\n }\n const tmpPath = `${targetPath}.tmp.${process.pid}`;\n writeFileSync(tmpPath, `${JSON.stringify(value, null, 2)}\\n`);\n renameSync(tmpPath, targetPath);\n}\n\nfunction ensureCodexHooksObject(file: CodexHooksFile): Record<string, CodexHookMatcherGroup[]> {\n if (!file.hooks) file.hooks = {};\n if (typeof file.hooks !== \"object\" || Array.isArray(file.hooks)) {\n throw new Error(\"Codex hooks.json hooks must be an object\");\n }\n return file.hooks;\n}\n\nfunction isCodexManagedGroup(group: CodexHookMatcherGroup): boolean {\n return (group.hooks ?? []).some(\n (hook) => typeof hook.command === \"string\" && hook.command.includes(MANAGED_HOOK_TAG),\n );\n}\n\nfunction cloneCodexHooks(file: CodexHooksFile): CodexHooksFile {\n return JSON.parse(JSON.stringify(file)) as CodexHooksFile;\n}\n\nfunction ensureCodexHooksFeatureFlag(targetConfigPath: string): InstallResult {\n const existing = existsSync(targetConfigPath) ? readFileSync(targetConfigPath, \"utf-8\") : \"\";\n\n if (/^\\s*codex_hooks\\s*=\\s*true\\b/m.test(existing)) {\n return { ok: true, changed: false, config_path: targetConfigPath, message: \"\" };\n }\n\n const featureHeader = /^\\[features\\]\\s*$/m;\n let next: string;\n if (featureHeader.test(existing)) {\n next = existing.replace(\n featureHeader,\n `[features]\\ncodex_hooks = true ${MANAGED_FEATURE_FLAG}`,\n );\n } else {\n const separator = existing.length === 0 || existing.endsWith(\"\\n\") ? \"\" : \"\\n\";\n next = `${existing}${separator}\\n[features]\\ncodex_hooks = true ${MANAGED_FEATURE_FLAG}\\n`;\n }\n\n writeConfigFile(targetConfigPath, existing || null, next);\n return { ok: true, changed: true, config_path: targetConfigPath, message: \"enabled codex_hooks feature flag\" };\n}\n\nfunction removeCodexHooksFeatureFlag(targetConfigPath: string): InstallResult {\n if (!existsSync(targetConfigPath)) {\n return { ok: true, changed: false, config_path: targetConfigPath, message: \"\" };\n }\n const existing = readFileSync(targetConfigPath, \"utf-8\");\n const managedLine = new RegExp(\n `^\\\\s*codex_hooks\\\\s*=\\\\s*true\\\\s*${escapeRegExp(MANAGED_FEATURE_FLAG)}\\\\s*$\\\\n?`,\n \"m\",\n );\n if (!managedLine.test(existing)) {\n return { ok: true, changed: false, config_path: targetConfigPath, message: \"\" };\n }\n const next = existing.replace(managedLine, \"\");\n writeConfigFile(targetConfigPath, existing, next);\n return { ok: true, changed: true, config_path: targetConfigPath, message: \"removed codex_hooks flag\" };\n}\n\nfunction buildManagedNotifyBlock(options: CodexHookInstallOptions): string {\n const command = [\n options.nodePath ?? process.env.RECALL_NODE_PATH ?? process.execPath,\n options.cliPath ?? resolveCliPath(),\n \"hook\",\n \"codex-notify\",\n ];\n return `${MANAGED_START}\nnotify = ${renderTomlStringArray(command)}\n${MANAGED_END}\n`;\n}\n\nfunction resolveCliPath(): string {\n const fromEnv = process.env.RECALL_CLI_PATH;\n if (fromEnv && existsSync(fromEnv)) {\n return resolve(fromEnv);\n }\n\n const fromArgv = process.argv[1];\n if (fromArgv && /(?:^|\\/)cli\\.[cm]?js$/.test(fromArgv) && existsSync(fromArgv)) {\n return resolve(fromArgv);\n }\n\n const sibling = resolve(dirname(fileURLToPath(import.meta.url)), \"..\", \"cli.js\");\n if (existsSync(sibling)) {\n return sibling;\n }\n\n const distCli = resolve(process.cwd(), \"dist\", \"cli.js\");\n if (existsSync(distCli)) {\n return distCli;\n }\n\n throw new Error(\"Unable to resolve Recall CLI path for Codex notify bridge\");\n}\n\nfunction stripManagedBlock(content: string): string {\n if (!content.includes(MANAGED_START)) {\n return content;\n }\n\n return content\n .replace(new RegExp(`${escapeRegExp(MANAGED_START)}[\\\\s\\\\S]*?${escapeRegExp(MANAGED_END)}\\\\n?`, \"g\"), \"\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .replace(/^\\n+/, \"\")\n .replace(/\\s+$/, \"\");\n}\n\nfunction appendManagedBlock(content: string, block: string): string {\n const trimmed = content.trim();\n if (trimmed.length === 0) {\n return block;\n }\n return `${trimmed}\\n\\n${block}`;\n}\n\nfunction hasUnmanagedNotify(content: string): boolean {\n return /^\\s*notify\\s*=.*$/m.test(content);\n}\n\nfunction renderTomlStringArray(values: readonly string[]): string {\n return `[${values.map((value) => JSON.stringify(value)).join(\", \")}]`;\n}\n\nfunction writeConfigFile(\n configPathValue: string,\n previousRaw: string | null,\n nextRaw: string,\n) {\n const parentDir = dirname(configPathValue);\n mkdirSync(parentDir, { recursive: true });\n\n if (previousRaw != null) {\n writeFileSync(`${configPathValue}.recall.bak.${Date.now()}`, previousRaw);\n }\n\n const tmpPath = `${configPathValue}.tmp.${process.pid}`;\n writeFileSync(tmpPath, normalizeTrailingNewline(nextRaw));\n renameSync(tmpPath, configPathValue);\n}\n\nfunction normalizeTrailingNewline(content: string): string {\n return content.trim().length === 0 ? \"\" : `${content.trimEnd()}\\n`;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport Database from \"better-sqlite3\";\nimport { getDbPath, getDbUserVersion, RECALL_DB_USER_VERSION } from \"../db/client.js\";\nimport { getEmbeddingModelInfo } from \"../embeddings/embeddings.js\";\nimport { getLaunchAgentStatus } from \"../daemon/launchd.js\";\nimport { getSystemdStatus } from \"../daemon/systemd.js\";\nimport { hasCommand, resolveUserHomeDir } from \"../agents/utils.js\";\n\nexport interface AgentDoctorEntry {\n agent: \"claude-code\" | \"codex\";\n detected: boolean;\n mcp: boolean;\n hooks: boolean;\n legacy_notify_bridge?: boolean;\n config_path: string;\n hook_path?: string;\n notes: string[];\n}\n\nexport interface UpgradeSignal {\n available: boolean;\n reasons: string[];\n}\n\nexport interface CleanupHealth {\n last_run_id: string | null;\n last_run_at: string | null;\n last_run_actions: Record<string, number>;\n total_runs: number;\n pending_candidate_corrections: number;\n followed_rate_resolved: number | null;\n resolved_injections: number;\n}\n\nexport interface DispatcherHealth {\n providers_configured: string[];\n pending_tasks: Record<string, number>;\n last_dispatch_at: string | null;\n last_dispatch_outcome: \"ok\" | \"error\" | null;\n}\n\nexport interface DoctorReport {\n db_path: string;\n db_user_version: number;\n db_target_version: number;\n embeddings: ReturnType<typeof getEmbeddingModelInfo>;\n launchd: {\n installed: boolean;\n loaded: boolean;\n state?: string;\n } | null;\n systemd: {\n installed: boolean;\n loaded: boolean;\n state?: string;\n } | null;\n agents: AgentDoctorEntry[];\n upgrade: UpgradeSignal;\n cleanup: CleanupHealth | null;\n dispatcher: DispatcherHealth | null;\n}\n\nexport function getDoctorReport(): DoctorReport {\n const dbPath = getDbPath();\n const launchd = process.platform === \"darwin\"\n ? (() => {\n try {\n const status = getLaunchAgentStatus();\n return {\n installed: status.installed,\n loaded: status.loaded,\n state: status.state,\n };\n } catch {\n return null;\n }\n })()\n : null;\n\n const systemd = process.platform === \"linux\"\n ? (() => {\n try {\n const status = getSystemdStatus();\n return {\n installed: status.installed,\n loaded: status.loaded,\n state: status.state,\n };\n } catch {\n return null;\n }\n })()\n : null;\n\n const agents = inspectAgentInstalls();\n return {\n db_path: dbPath,\n db_user_version: getDbUserVersion(dbPath),\n db_target_version: RECALL_DB_USER_VERSION,\n embeddings: getEmbeddingModelInfo(),\n launchd,\n systemd,\n agents,\n upgrade: computeUpgradeSignal(agents),\n cleanup: readCleanupHealth(dbPath),\n dispatcher: readDispatcherHealth(dbPath),\n };\n}\n\nfunction readDispatcherHealth(dbPath: string): DispatcherHealth | null {\n if (!existsSync(dbPath)) return null;\n let sqlite: Database.Database | null = null;\n try {\n sqlite = new Database(dbPath, { readonly: true, fileMustExist: true });\n const tables = sqlite.prepare(\n \"SELECT name FROM sqlite_master WHERE type='table' AND name IN ('memory_maintenance_tasks','llm_usage')\",\n ).all() as Array<{ name: string }>;\n const names = new Set(tables.map((t) => t.name));\n\n let providers: string[] = [];\n try {\n // Probe synchronously without importing the keychain module (which would\n // pull node-keychain into the read-only doctor path).\n const { hasProviderConfigured } = require(\"../credentials/keychain.js\");\n providers = [\"anthropic\", \"azure-openai\", \"openai\"].filter((p) =>\n hasProviderConfigured(p),\n );\n } catch {\n providers = [];\n }\n\n const pending: Record<string, number> = {};\n if (names.has(\"memory_maintenance_tasks\")) {\n const rows = sqlite.prepare(\n \"SELECT kind, COUNT(*) AS n FROM memory_maintenance_tasks WHERE status='pending' GROUP BY kind\",\n ).all() as Array<{ kind: string; n: number }>;\n for (const r of rows) pending[r.kind] = r.n;\n }\n\n let lastAt: string | null = null;\n let lastOk: \"ok\" | \"error\" | null = null;\n if (names.has(\"llm_usage\")) {\n const row = sqlite.prepare(\n \"SELECT created_at, ok FROM llm_usage ORDER BY created_at DESC LIMIT 1\",\n ).get() as { created_at: string; ok: number } | undefined;\n if (row) {\n lastAt = row.created_at;\n lastOk = row.ok ? \"ok\" : \"error\";\n }\n }\n\n return {\n providers_configured: providers,\n pending_tasks: pending,\n last_dispatch_at: lastAt,\n last_dispatch_outcome: lastOk,\n };\n } catch {\n return null;\n } finally {\n sqlite?.close();\n }\n}\n\nfunction readCleanupHealth(dbPath: string): CleanupHealth | null {\n if (!existsSync(dbPath)) return null;\n let sqlite: Database.Database | null = null;\n try {\n sqlite = new Database(dbPath, { readonly: true, fileMustExist: true });\n\n const tables = sqlite.prepare(\n \"SELECT name FROM sqlite_master WHERE type='table' AND name IN ('maintenance_cleanup_log','memories','memory_injections')\",\n ).all() as Array<{ name: string }>;\n const names = new Set(tables.map((t) => t.name));\n if (!names.has(\"maintenance_cleanup_log\")) return null;\n\n const totals = sqlite.prepare(\n \"SELECT COUNT(DISTINCT run_id) AS runs, MAX(created_at) AS last_at FROM maintenance_cleanup_log\",\n ).get() as { runs: number; last_at: string | null };\n\n let lastRunId: string | null = null;\n const actions: Record<string, number> = {};\n if (totals.last_at) {\n const lastRow = sqlite.prepare(\n \"SELECT run_id FROM maintenance_cleanup_log WHERE created_at = ? LIMIT 1\",\n ).get(totals.last_at) as { run_id: string } | undefined;\n lastRunId = lastRow?.run_id ?? null;\n if (lastRunId) {\n const rows = sqlite.prepare(\n \"SELECT action, COUNT(*) as c FROM maintenance_cleanup_log WHERE run_id = ? GROUP BY action\",\n ).all(lastRunId) as Array<{ action: string; c: number }>;\n for (const r of rows) actions[r.action] = r.c;\n }\n }\n\n let pending = 0;\n if (names.has(\"memories\")) {\n const row = sqlite.prepare(\n \"SELECT COUNT(*) AS n FROM memories WHERE status='candidate' AND source='user_correction'\",\n ).get() as { n: number };\n pending = row.n;\n }\n\n let followedRate: number | null = null;\n let resolvedInjections = 0;\n if (names.has(\"memory_injections\")) {\n const since = new Date(Date.now() - 14 * 86_400_000).toISOString();\n const rows = sqlite.prepare(\n \"SELECT outcome, COUNT(*) as c FROM memory_injections WHERE injected_at >= ? GROUP BY outcome\",\n ).all(since) as Array<{ outcome: string | null; c: number }>;\n let followed = 0;\n for (const r of rows) {\n if (!r.outcome) continue;\n resolvedInjections += r.c;\n if (r.outcome === \"followed\") followed += r.c;\n }\n followedRate = resolvedInjections > 0 ? followed / resolvedInjections : null;\n }\n\n return {\n last_run_id: lastRunId,\n last_run_at: totals.last_at,\n last_run_actions: actions,\n total_runs: totals.runs,\n pending_candidate_corrections: pending,\n followed_rate_resolved: followedRate,\n resolved_injections: resolvedInjections,\n };\n } catch {\n return null;\n } finally {\n sqlite?.close();\n }\n}\n\nfunction computeUpgradeSignal(agents: AgentDoctorEntry[]): UpgradeSignal {\n const reasons: string[] = [];\n for (const agent of agents) {\n if (!agent.detected) continue;\n if (agent.legacy_notify_bridge) {\n reasons.push(\n `${agent.agent}: legacy notify bridge detected — upgrade to hooks.json for per-turn memory injection`,\n );\n continue;\n }\n if (agent.mcp && !agent.hooks) {\n reasons.push(\n `${agent.agent}: MCP configured but lifecycle hooks missing — memory injection depends on the model calling query`,\n );\n }\n }\n return { available: reasons.length > 0, reasons };\n}\n\nexport function inspectAgentInstalls(homeDir?: string): AgentDoctorEntry[] {\n const home = homeDir ?? resolveUserHomeDir();\n return [\n inspectClaudeCodeInstall(home),\n inspectCodexInstall(home),\n ];\n}\n\nfunction inspectClaudeCodeInstall(home: string): AgentDoctorEntry {\n const configPath = join(home, \".claude\", \"settings.json\");\n const detected = existsSync(configPath) || hasCommand(\"claude\");\n const notes: string[] = [];\n\n let mcp = false;\n let hooks = false;\n\n if (existsSync(configPath)) {\n try {\n const parsed = JSON.parse(readFileSync(configPath, \"utf-8\"));\n mcp = Boolean(parsed?.mcpServers?.recall);\n const hookGroups = parsed?.hooks ?? {};\n hooks = Object.values(hookGroups).some((groups) =>\n Array.isArray(groups) &&\n groups.some((group: unknown) =>\n isHookGroupManagedBy(group, \"recall:managed:claude-code\"),\n ),\n );\n if (!mcp) notes.push(\"MCP server 'recall' not registered in mcpServers\");\n if (!hooks) notes.push(\"No Recall-managed hooks found in settings.json\");\n } catch (err) {\n notes.push(`Could not parse ${configPath}: ${(err as Error).message}`);\n }\n } else if (detected) {\n notes.push(\"Claude CLI detected but settings.json missing\");\n }\n\n return {\n agent: \"claude-code\",\n detected,\n mcp,\n hooks,\n config_path: configPath,\n notes,\n };\n}\n\nfunction inspectCodexInstall(home: string): AgentDoctorEntry {\n const configPath = join(home, \".codex\", \"config.toml\");\n const hooksPath = join(home, \".codex\", \"hooks.json\");\n const detected = existsSync(configPath) || hasCommand(\"codex\");\n const notes: string[] = [];\n\n let mcp = false;\n let hooks = false;\n let legacy_notify_bridge = false;\n\n if (existsSync(configPath)) {\n const raw = readFileSync(configPath, \"utf-8\");\n mcp = /\\[mcp_servers\\.recall\\]/.test(raw);\n const featureFlagSet = /^\\s*codex_hooks\\s*=\\s*true\\b/m.test(raw);\n const managedHooksJson =\n existsSync(hooksPath) && readFileSync(hooksPath, \"utf-8\").includes(\"recall:managed:codex\");\n hooks = featureFlagSet && managedHooksJson;\n legacy_notify_bridge =\n raw.includes(\"# recall:managed:codex:start\") &&\n raw.includes(\"codex-notify\");\n\n if (!mcp) notes.push(\"MCP block [mcp_servers.recall] not in config.toml\");\n if (legacy_notify_bridge) {\n notes.push(\n \"Legacy notify bridge present — install the new hooks.json path to enable per-turn memory injection\",\n );\n }\n if (!featureFlagSet) notes.push(\"codex_hooks = true missing from [features]\");\n if (!managedHooksJson) notes.push(\"No Recall-managed entries in ~/.codex/hooks.json\");\n } else if (detected) {\n notes.push(\"Codex CLI detected but config.toml missing\");\n }\n\n return {\n agent: \"codex\",\n detected,\n mcp,\n hooks,\n legacy_notify_bridge,\n config_path: configPath,\n hook_path: hooksPath,\n notes,\n };\n}\n\nfunction isHookGroupManagedBy(group: unknown, tag: string): boolean {\n if (!group || typeof group !== \"object\") return false;\n const hooks = (group as { hooks?: unknown[] }).hooks;\n if (!Array.isArray(hooks)) return false;\n return hooks.some(\n (hook) =>\n hook &&\n typeof hook === \"object\" &&\n typeof (hook as { command?: unknown }).command === \"string\" &&\n (hook as { command: string }).command.includes(tag),\n );\n}\n\nexport function formatDoctorReport(report: DoctorReport): string {\n const lines = [\n \"# Recall Doctor\",\n \"\",\n `DB: ${report.db_path}`,\n `DB ver: ${report.db_user_version}/${report.db_target_version}`,\n ];\n\n if (report.embeddings) {\n lines.push(`Embed: ${report.embeddings.provider}`);\n lines.push(`Model: ${report.embeddings.model}`);\n lines.push(`Dims: index=${report.embeddings.index_dimensions} canonical=${report.embeddings.canonical_dimensions}`);\n lines.push(`Cache: ${report.embeddings.size_label} @ ${report.embeddings.cache_path}`);\n } else {\n lines.push(\"Embed: disabled\");\n }\n\n if (report.launchd) {\n lines.push(`Launchd: ${report.launchd.installed ? \"installed\" : \"missing\"} / ${report.launchd.loaded ? \"loaded\" : \"not loaded\"}${report.launchd.state ? ` (${report.launchd.state})` : \"\"}`);\n }\n if (report.systemd) {\n lines.push(`Systemd: ${report.systemd.installed ? \"installed\" : \"missing\"} / ${report.systemd.loaded ? \"loaded\" : \"not loaded\"}${report.systemd.state ? ` (${report.systemd.state})` : \"\"}`);\n }\n\n lines.push(\"\", \"## Agents\");\n for (const agent of report.agents) {\n const label = agent.agent.padEnd(12);\n if (!agent.detected) {\n lines.push(`${label} not detected`);\n continue;\n }\n const mcp = agent.mcp ? \"ok\" : \"MISSING\";\n const hooks = agent.hooks ? \"ok\" : \"MISSING\";\n const legacy = agent.legacy_notify_bridge ? \" (legacy notify bridge)\" : \"\";\n lines.push(`${label} mcp:${mcp} hooks:${hooks}${legacy}`);\n for (const note of agent.notes) {\n lines.push(` - ${note}`);\n }\n }\n\n if (report.cleanup) {\n lines.push(\"\", \"## Cleanup\");\n if (report.cleanup.last_run_at) {\n const actions = Object.entries(report.cleanup.last_run_actions)\n .map(([k, v]) => `${k}=${v}`)\n .join(\" \");\n lines.push(`Last run: ${report.cleanup.last_run_id?.slice(0, 8)} at ${report.cleanup.last_run_at.slice(0, 19)}`);\n lines.push(`Actions: ${actions || \"(none)\"}`);\n } else {\n lines.push(\"Last run: never\");\n }\n lines.push(`Total runs: ${report.cleanup.total_runs}`);\n lines.push(`Pending correction candidates: ${report.cleanup.pending_candidate_corrections}`);\n if (report.cleanup.followed_rate_resolved != null) {\n const pct = (report.cleanup.followed_rate_resolved * 100).toFixed(1);\n lines.push(`Followed rate (last 14d, of ${report.cleanup.resolved_injections} resolved): ${pct}%`);\n } else {\n lines.push(`Followed rate (last 14d): n/a (no resolved injections)`);\n }\n }\n\n if (report.dispatcher) {\n lines.push(\"\", \"## Dispatcher (LLM refinement)\");\n const provs = report.dispatcher.providers_configured;\n lines.push(`Providers: ${provs.length === 0 ? \"none configured (LLM tier dormant)\" : provs.join(\", \")}`);\n const pendingEntries = Object.entries(report.dispatcher.pending_tasks);\n if (pendingEntries.length === 0) {\n lines.push(\"Pending tasks: 0\");\n } else {\n const total = pendingEntries.reduce((s, [, n]) => s + n, 0);\n lines.push(`Pending tasks: ${total} (${pendingEntries.map(([k, n]) => `${k}=${n}`).join(\", \")})`);\n }\n if (report.dispatcher.last_dispatch_at) {\n lines.push(`Last dispatch: ${report.dispatcher.last_dispatch_at.slice(0, 19)} (${report.dispatcher.last_dispatch_outcome ?? \"unknown\"})`);\n } else {\n lines.push(\"Last dispatch: never\");\n }\n if (provs.length === 0 && pendingEntries.length > 0) {\n lines.push(\"Tasks are queued but no provider is configured. Run `recall maintenance dispatch --preview` to inspect prompts, or `recall maintenance credentials set <provider> <key>` to enable.\");\n }\n }\n\n if (report.upgrade.available) {\n lines.push(\"\", \"## Upgrade available\");\n for (const reason of report.upgrade.reasons) {\n lines.push(`- ${reason}`);\n }\n lines.push(\"Run `recall doctor --fix` or `recall setup --yes` to apply.\");\n }\n\n return lines.join(\"\\n\");\n}\n","import { existsSync, mkdirSync, rmSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { execFileSync } from \"node:child_process\";\n\nconst DEFAULT_LABEL = \"com.recall.daemon\";\n\nexport interface LaunchdOptions {\n label?: string;\n port?: number;\n dataDir?: string;\n nodePath?: string;\n daemonScript?: string;\n maintenanceIntervalSeconds?: number;\n repoRoots?: string;\n embeddingProvider?: string;\n embeddingDims?: string;\n embeddingsDisabled?: string;\n}\n\nexport interface LaunchdStatus {\n label: string;\n plistPath: string;\n installed: boolean;\n loaded: boolean;\n state?: string;\n}\n\nexport function installLaunchAgent(opts: LaunchdOptions = {}): LaunchdStatus {\n assertDarwin();\n\n const cfg = resolveConfig(opts);\n mkdirSync(dirname(cfg.plistPath), { recursive: true });\n mkdirSync(dirname(cfg.stdoutPath), { recursive: true });\n\n writeFileSync(cfg.plistPath, renderPlist(cfg));\n\n tryRun(\"launchctl\", [\"bootout\", domainTarget(), cfg.plistPath]);\n execFileSync(\"launchctl\", [\"bootstrap\", domainTarget(), cfg.plistPath], stdioOpts());\n execFileSync(\"launchctl\", [\"enable\", `${domainTarget()}/${cfg.label}`], stdioOpts());\n execFileSync(\"launchctl\", [\"kickstart\", \"-k\", `${domainTarget()}/${cfg.label}`], stdioOpts());\n\n return getLaunchAgentStatus(cfg.label);\n}\n\nexport function uninstallLaunchAgent(label = DEFAULT_LABEL): LaunchdStatus {\n assertDarwin();\n\n const cfg = resolveConfig({ label });\n tryRun(\"launchctl\", [\"bootout\", domainTarget(), cfg.plistPath]);\n tryRun(\"launchctl\", [\"disable\", `${domainTarget()}/${cfg.label}`]);\n rmSync(cfg.plistPath, { force: true });\n\n return getLaunchAgentStatus(cfg.label);\n}\n\nexport function startLaunchAgent(label = DEFAULT_LABEL): LaunchdStatus {\n assertDarwin();\n const cfg = resolveConfig({ label });\n if (!exists(cfg.plistPath)) {\n throw new Error(`LaunchAgent not installed: ${cfg.plistPath}`);\n }\n execFileSync(\"launchctl\", [\"enable\", `${domainTarget()}/${cfg.label}`], stdioOpts());\n tryRun(\"launchctl\", [\"bootstrap\", domainTarget(), cfg.plistPath]);\n execFileSync(\"launchctl\", [\"kickstart\", \"-k\", `${domainTarget()}/${cfg.label}`], stdioOpts());\n return getLaunchAgentStatus(cfg.label);\n}\n\nexport function stopLaunchAgent(label = DEFAULT_LABEL): LaunchdStatus {\n assertDarwin();\n const cfg = resolveConfig({ label });\n if (exists(cfg.plistPath)) {\n tryRun(\"launchctl\", [\"bootout\", domainTarget(), cfg.plistPath]);\n }\n return getLaunchAgentStatus(cfg.label);\n}\n\nexport function getLaunchAgentStatus(label = DEFAULT_LABEL): LaunchdStatus {\n assertDarwin();\n\n const cfg = resolveConfig({ label });\n const installed = exists(cfg.plistPath);\n const output = tryOutput(\"launchctl\", [\"print\", `${domainTarget()}/${cfg.label}`]);\n\n return {\n label: cfg.label,\n plistPath: cfg.plistPath,\n installed,\n loaded: output.ok,\n state: output.ok ? extractState(output.output) : undefined,\n };\n}\n\nexport function getLaunchAgentInfo(label = DEFAULT_LABEL): string {\n assertDarwin();\n\n const cfg = resolveConfig({ label });\n const status = getLaunchAgentStatus(label);\n const installed = readInstalledConfig(cfg.plistPath);\n const lines = [\n `Label: ${status.label}`,\n `Plist: ${cfg.plistPath}`,\n `Installed: ${status.installed ? \"yes\" : \"no\"}`,\n `Loaded: ${status.loaded ? \"yes\" : \"no\"}`,\n ];\n\n if (status.state) {\n lines.push(`State: ${status.state}`);\n }\n\n lines.push(`Port: ${installed?.port ?? cfg.port}`);\n lines.push(`Data dir: ${installed?.dataDir ?? cfg.dataDir}`);\n if (installed?.repoRoots ?? cfg.repoRoots) {\n lines.push(`Repos: ${installed?.repoRoots ?? cfg.repoRoots}`);\n }\n if (installed?.embeddingProvider ?? cfg.embeddingProvider) {\n lines.push(`EmbedProv: ${installed?.embeddingProvider ?? cfg.embeddingProvider}`);\n }\n if (installed?.embeddingDims ?? cfg.embeddingDims) {\n lines.push(`EmbedDims: ${installed?.embeddingDims ?? cfg.embeddingDims}`);\n }\n if (installed?.embeddingsDisabled ?? cfg.embeddingsDisabled) {\n lines.push(`EmbedOff: ${installed?.embeddingsDisabled ?? cfg.embeddingsDisabled}`);\n }\n lines.push(`Node: ${installed?.nodePath ?? cfg.nodePath}`);\n lines.push(`Script: ${installed?.daemonScript ?? cfg.daemonScript}`);\n lines.push(`Maintain: ${installed?.maintenanceIntervalSeconds ?? cfg.maintenanceIntervalSeconds}s`);\n lines.push(`Stdout: ${installed?.stdoutPath ?? cfg.stdoutPath}`);\n lines.push(`Stderr: ${installed?.stderrPath ?? cfg.stderrPath}`);\n\n return lines.join(\"\\n\");\n}\n\nfunction resolveConfig(opts: LaunchdOptions) {\n const label = opts.label ?? DEFAULT_LABEL;\n const home = homedir();\n const port = opts.port ?? parseInt(process.env.RECALL_PORT ?? \"7890\", 10);\n const maintenanceIntervalSeconds =\n opts.maintenanceIntervalSeconds ??\n parseInt(process.env.RECALL_MAINTENANCE_INTERVAL_SECONDS ?? \"300\", 10);\n const dataDir = resolve(\n opts.dataDir ??\n process.env.RECALL_DATA_DIR ??\n join(home, \".recall\"),\n );\n const nodePath = resolve(opts.nodePath ?? process.execPath);\n const daemonScript = resolve(\n opts.daemonScript ?? join(process.cwd(), \"dist\", \"daemon.js\"),\n );\n const plistPath = join(home, \"Library\", \"LaunchAgents\", `${label}.plist`);\n const logDir = join(dataDir, \"logs\");\n\n return {\n label,\n port,\n maintenanceIntervalSeconds,\n dataDir,\n nodePath,\n daemonScript,\n plistPath,\n stdoutPath: join(logDir, \"daemon.stdout.log\"),\n stderrPath: join(logDir, \"daemon.stderr.log\"),\n repoRoots: opts.repoRoots ?? process.env.RECALL_REPO_ROOTS,\n embeddingProvider: opts.embeddingProvider ?? process.env.RECALL_EMBEDDING_PROVIDER,\n embeddingDims: opts.embeddingDims ?? process.env.RECALL_EMBEDDING_DIMS,\n embeddingsDisabled: opts.embeddingsDisabled ?? process.env.RECALL_EMBEDDINGS_DISABLED,\n };\n}\n\nfunction renderPlist(cfg: ReturnType<typeof resolveConfig>): string {\n const env = {\n RECALL_PORT: String(cfg.port),\n RECALL_MAINTENANCE_INTERVAL_SECONDS: String(cfg.maintenanceIntervalSeconds),\n RECALL_DATA_DIR: cfg.dataDir,\n PATH: process.env.PATH ?? \"/usr/bin:/bin:/usr/sbin:/sbin\",\n ...(cfg.repoRoots ? { RECALL_REPO_ROOTS: cfg.repoRoots } : {}),\n ...(cfg.embeddingProvider ? { RECALL_EMBEDDING_PROVIDER: cfg.embeddingProvider } : {}),\n ...(cfg.embeddingDims ? { RECALL_EMBEDDING_DIMS: cfg.embeddingDims } : {}),\n ...(cfg.embeddingsDisabled ? { RECALL_EMBEDDINGS_DISABLED: cfg.embeddingsDisabled } : {}),\n };\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>${escapeXml(cfg.label)}</string>\n <key>ProgramArguments</key>\n <array>\n <string>${escapeXml(cfg.nodePath)}</string>\n <string>${escapeXml(cfg.daemonScript)}</string>\n </array>\n <key>EnvironmentVariables</key>\n <dict>\n <key>PATH</key>\n <string>${escapeXml(env.PATH)}</string>\n <key>RECALL_PORT</key>\n <string>${escapeXml(env.RECALL_PORT)}</string>\n <key>RECALL_MAINTENANCE_INTERVAL_SECONDS</key>\n <string>${escapeXml(env.RECALL_MAINTENANCE_INTERVAL_SECONDS)}</string>\n <key>RECALL_DATA_DIR</key>\n <string>${escapeXml(env.RECALL_DATA_DIR)}</string>\n${env.RECALL_REPO_ROOTS ? ` <key>RECALL_REPO_ROOTS</key>\n <string>${escapeXml(env.RECALL_REPO_ROOTS)}</string>\n` : \"\"}${env.RECALL_EMBEDDING_PROVIDER ? ` <key>RECALL_EMBEDDING_PROVIDER</key>\n <string>${escapeXml(env.RECALL_EMBEDDING_PROVIDER)}</string>\n` : \"\"}${env.RECALL_EMBEDDING_DIMS ? ` <key>RECALL_EMBEDDING_DIMS</key>\n <string>${escapeXml(env.RECALL_EMBEDDING_DIMS)}</string>\n` : \"\"}${env.RECALL_EMBEDDINGS_DISABLED ? ` <key>RECALL_EMBEDDINGS_DISABLED</key>\n <string>${escapeXml(env.RECALL_EMBEDDINGS_DISABLED)}</string>\n` : \"\"} </dict>\n <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <true/>\n <key>WorkingDirectory</key>\n <string>${escapeXml(process.cwd())}</string>\n <key>StandardOutPath</key>\n <string>${escapeXml(cfg.stdoutPath)}</string>\n <key>StandardErrorPath</key>\n <string>${escapeXml(cfg.stderrPath)}</string>\n</dict>\n</plist>\n`;\n}\n\nfunction domainTarget(): string {\n const uid = process.getuid?.();\n if (uid == null) {\n throw new Error(\"Could not determine current macOS user id\");\n }\n return `gui/${uid}`;\n}\n\nfunction extractState(output: string): string | undefined {\n const line = output.split(\"\\n\").find((item) => item.trim().startsWith(\"state = \"));\n if (!line) return undefined;\n return line.split(\"=\").slice(1).join(\"=\").trim();\n}\n\nfunction tryRun(cmd: string, args: string[]) {\n try {\n execFileSync(cmd, args, stdioOpts());\n } catch {\n return;\n }\n}\n\nfunction tryOutput(cmd: string, args: string[]) {\n try {\n const output = execFileSync(cmd, args, {\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n return { ok: true, output };\n } catch (error: any) {\n return {\n ok: false,\n output: String(error?.stdout ?? error?.stderr ?? error?.message ?? \"\"),\n };\n }\n}\n\nfunction readInstalledConfig(plistPath: string): {\n nodePath?: string;\n daemonScript?: string;\n port?: string;\n maintenanceIntervalSeconds?: string;\n dataDir?: string;\n repoRoots?: string;\n embeddingProvider?: string;\n embeddingDims?: string;\n embeddingsDisabled?: string;\n stdoutPath?: string;\n stderrPath?: string;\n} | null {\n if (!exists(plistPath)) return null;\n\n try {\n const raw = execFileSync(\"plutil\", [\"-convert\", \"json\", \"-o\", \"-\", plistPath], {\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n const parsed = JSON.parse(raw);\n return {\n nodePath: parsed?.ProgramArguments?.[0],\n daemonScript: parsed?.ProgramArguments?.[1],\n port: parsed?.EnvironmentVariables?.RECALL_PORT,\n maintenanceIntervalSeconds: parsed?.EnvironmentVariables?.RECALL_MAINTENANCE_INTERVAL_SECONDS,\n dataDir: parsed?.EnvironmentVariables?.RECALL_DATA_DIR,\n repoRoots: parsed?.EnvironmentVariables?.RECALL_REPO_ROOTS,\n embeddingProvider: parsed?.EnvironmentVariables?.RECALL_EMBEDDING_PROVIDER,\n embeddingDims: parsed?.EnvironmentVariables?.RECALL_EMBEDDING_DIMS,\n embeddingsDisabled: parsed?.EnvironmentVariables?.RECALL_EMBEDDINGS_DISABLED,\n stdoutPath: parsed?.StandardOutPath,\n stderrPath: parsed?.StandardErrorPath,\n };\n } catch {\n return null;\n }\n}\n\nfunction stdioOpts() {\n return {\n stdio: \"pipe\" as const,\n };\n}\n\nfunction exists(path: string): boolean {\n return existsSync(path);\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll('\"', \""\")\n .replaceAll(\"'\", \"'\");\n}\n\nfunction assertDarwin() {\n if (process.platform !== \"darwin\") {\n throw new Error(\"launchd daemon install is only supported on macOS\");\n }\n}\n","import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { execFileSync } from \"node:child_process\";\n\nconst DEFAULT_LABEL = \"recall-daemon\";\n\nexport interface SystemdOptions {\n label?: string;\n port?: number;\n dataDir?: string;\n nodePath?: string;\n daemonScript?: string;\n maintenanceIntervalSeconds?: number;\n repoRoots?: string;\n embeddingProvider?: string;\n embeddingDims?: string;\n embeddingsDisabled?: string;\n}\n\nexport interface SystemdStatus {\n label: string;\n unitPath: string;\n installed: boolean;\n loaded: boolean;\n state?: string;\n}\n\nexport function installSystemdUnit(opts: SystemdOptions = {}): SystemdStatus {\n assertLinux();\n\n const cfg = resolveConfig(opts);\n mkdirSync(dirname(cfg.unitPath), { recursive: true });\n mkdirSync(cfg.logDir, { recursive: true });\n\n writeFileSync(cfg.unitPath, renderUnit(cfg));\n\n systemctl([\"--user\", \"daemon-reload\"]);\n systemctl([\"--user\", \"enable\", \"--now\", `${cfg.label}.service`]);\n\n return getSystemdStatus(cfg.label);\n}\n\nexport function uninstallSystemdUnit(label = DEFAULT_LABEL): SystemdStatus {\n assertLinux();\n\n const cfg = resolveConfig({ label });\n trySystemctl([\"--user\", \"disable\", \"--now\", `${cfg.label}.service`]);\n rmSync(cfg.unitPath, { force: true });\n trySystemctl([\"--user\", \"daemon-reload\"]);\n\n return getSystemdStatus(cfg.label);\n}\n\nexport function startSystemdUnit(label = DEFAULT_LABEL): SystemdStatus {\n assertLinux();\n const cfg = resolveConfig({ label });\n if (!existsSync(cfg.unitPath)) {\n throw new Error(`systemd unit not installed: ${cfg.unitPath}`);\n }\n systemctl([\"--user\", \"start\", `${cfg.label}.service`]);\n return getSystemdStatus(cfg.label);\n}\n\nexport function stopSystemdUnit(label = DEFAULT_LABEL): SystemdStatus {\n assertLinux();\n const cfg = resolveConfig({ label });\n if (existsSync(cfg.unitPath)) {\n trySystemctl([\"--user\", \"stop\", `${cfg.label}.service`]);\n }\n return getSystemdStatus(cfg.label);\n}\n\nexport function getSystemdStatus(label = DEFAULT_LABEL): SystemdStatus {\n assertLinux();\n\n const cfg = resolveConfig({ label });\n const installed = existsSync(cfg.unitPath);\n const active = trySystemctlOutput([\"--user\", \"is-active\", `${cfg.label}.service`]);\n const loaded = active.ok && active.output.trim() === \"active\";\n const state = active.output.trim() || undefined;\n\n return {\n label: cfg.label,\n unitPath: cfg.unitPath,\n installed,\n loaded,\n state,\n };\n}\n\nexport function getSystemdInfo(label = DEFAULT_LABEL): string {\n assertLinux();\n\n const cfg = resolveConfig({ label });\n const status = getSystemdStatus(label);\n const installed = readInstalledConfig(cfg.unitPath);\n const lines = [\n `Label: ${status.label}`,\n `Unit: ${cfg.unitPath}`,\n `Installed: ${status.installed ? \"yes\" : \"no\"}`,\n `Loaded: ${status.loaded ? \"yes\" : \"no\"}`,\n ];\n if (status.state) lines.push(`State: ${status.state}`);\n lines.push(`Port: ${installed?.port ?? cfg.port}`);\n lines.push(`Data dir: ${installed?.dataDir ?? cfg.dataDir}`);\n if (installed?.repoRoots ?? cfg.repoRoots) {\n lines.push(`Repos: ${installed?.repoRoots ?? cfg.repoRoots}`);\n }\n if (installed?.embeddingProvider ?? cfg.embeddingProvider) {\n lines.push(`EmbedProv: ${installed?.embeddingProvider ?? cfg.embeddingProvider}`);\n }\n if (installed?.embeddingDims ?? cfg.embeddingDims) {\n lines.push(`EmbedDims: ${installed?.embeddingDims ?? cfg.embeddingDims}`);\n }\n if (installed?.embeddingsDisabled ?? cfg.embeddingsDisabled) {\n lines.push(`EmbedOff: ${installed?.embeddingsDisabled ?? cfg.embeddingsDisabled}`);\n }\n lines.push(`Node: ${installed?.nodePath ?? cfg.nodePath}`);\n lines.push(`Script: ${installed?.daemonScript ?? cfg.daemonScript}`);\n lines.push(`Maintain: ${installed?.maintenanceIntervalSeconds ?? cfg.maintenanceIntervalSeconds}s`);\n lines.push(`Logs: journalctl --user -u ${cfg.label}.service`);\n\n return lines.join(\"\\n\");\n}\n\nfunction resolveConfig(opts: SystemdOptions) {\n const label = opts.label ?? DEFAULT_LABEL;\n const home = homedir();\n const port = opts.port ?? parseInt(process.env.RECALL_PORT ?? \"7890\", 10);\n const maintenanceIntervalSeconds =\n opts.maintenanceIntervalSeconds ??\n parseInt(process.env.RECALL_MAINTENANCE_INTERVAL_SECONDS ?? \"300\", 10);\n const dataDir = resolve(\n opts.dataDir ?? process.env.RECALL_DATA_DIR ?? join(home, \".recall\"),\n );\n const nodePath = resolve(opts.nodePath ?? process.execPath);\n const daemonScript = resolve(\n opts.daemonScript ?? defaultDaemonScript(),\n );\n const configHome = process.env.XDG_CONFIG_HOME ?? join(home, \".config\");\n const unitPath = join(configHome, \"systemd\", \"user\", `${label}.service`);\n const logDir = join(dataDir, \"logs\");\n\n return {\n label,\n port,\n maintenanceIntervalSeconds,\n dataDir,\n nodePath,\n daemonScript,\n unitPath,\n logDir,\n repoRoots: opts.repoRoots ?? process.env.RECALL_REPO_ROOTS,\n embeddingProvider: opts.embeddingProvider ?? process.env.RECALL_EMBEDDING_PROVIDER,\n embeddingDims: opts.embeddingDims ?? process.env.RECALL_EMBEDDING_DIMS,\n embeddingsDisabled: opts.embeddingsDisabled ?? process.env.RECALL_EMBEDDINGS_DISABLED,\n };\n}\n\nfunction defaultDaemonScript(): string {\n // Co-located with this module under dist/\n const here = dirname(fileURLToPath(import.meta.url));\n return join(here, \"daemon.js\");\n}\n\nfunction renderUnit(cfg: ReturnType<typeof resolveConfig>): string {\n const envLines = [\n `Environment=PATH=${process.env.PATH ?? \"/usr/bin:/bin:/usr/local/bin\"}`,\n `Environment=RECALL_PORT=${cfg.port}`,\n `Environment=RECALL_MAINTENANCE_INTERVAL_SECONDS=${cfg.maintenanceIntervalSeconds}`,\n `Environment=RECALL_DATA_DIR=${cfg.dataDir}`,\n ];\n if (cfg.repoRoots) envLines.push(`Environment=RECALL_REPO_ROOTS=${cfg.repoRoots}`);\n if (cfg.embeddingProvider) envLines.push(`Environment=RECALL_EMBEDDING_PROVIDER=${cfg.embeddingProvider}`);\n if (cfg.embeddingDims) envLines.push(`Environment=RECALL_EMBEDDING_DIMS=${cfg.embeddingDims}`);\n if (cfg.embeddingsDisabled) envLines.push(`Environment=RECALL_EMBEDDINGS_DISABLED=${cfg.embeddingsDisabled}`);\n\n return `[Unit]\nDescription=Recall local daemon\nAfter=network.target\n\n[Service]\nType=simple\nExecStart=${cfg.nodePath} ${cfg.daemonScript}\nRestart=always\nRestartSec=2\n${envLines.join(\"\\n\")}\n\n[Install]\nWantedBy=default.target\n`;\n}\n\nfunction readInstalledConfig(unitPath: string): {\n nodePath?: string;\n daemonScript?: string;\n port?: string;\n maintenanceIntervalSeconds?: string;\n dataDir?: string;\n repoRoots?: string;\n embeddingProvider?: string;\n embeddingDims?: string;\n embeddingsDisabled?: string;\n} | null {\n if (!existsSync(unitPath)) return null;\n try {\n const raw = readFileSync(unitPath, \"utf8\");\n const exec = raw.match(/^ExecStart=(.+)$/m)?.[1]?.trim().split(/\\s+/);\n const env: Record<string, string> = {};\n for (const m of raw.matchAll(/^Environment=([^=]+)=(.+)$/gm)) {\n env[m[1]] = m[2];\n }\n return {\n nodePath: exec?.[0],\n daemonScript: exec?.[1],\n port: env.RECALL_PORT,\n maintenanceIntervalSeconds: env.RECALL_MAINTENANCE_INTERVAL_SECONDS,\n dataDir: env.RECALL_DATA_DIR,\n repoRoots: env.RECALL_REPO_ROOTS,\n embeddingProvider: env.RECALL_EMBEDDING_PROVIDER,\n embeddingDims: env.RECALL_EMBEDDING_DIMS,\n embeddingsDisabled: env.RECALL_EMBEDDINGS_DISABLED,\n };\n } catch {\n return null;\n }\n}\n\nfunction systemctl(args: string[]) {\n execFileSync(\"systemctl\", args, { stdio: \"pipe\" });\n}\n\nfunction trySystemctl(args: string[]) {\n try {\n execFileSync(\"systemctl\", args, { stdio: \"pipe\" });\n } catch {\n return;\n }\n}\n\nfunction trySystemctlOutput(args: string[]) {\n try {\n const output = execFileSync(\"systemctl\", args, {\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n return { ok: true, output };\n } catch (error: any) {\n return {\n ok: false,\n output: String(error?.stdout ?? error?.stderr ?? error?.message ?? \"\"),\n };\n }\n}\n\nfunction assertLinux() {\n if (process.platform !== \"linux\") {\n throw new Error(\"systemd daemon install is only supported on Linux\");\n }\n}\n","import {\n installLaunchAgent,\n uninstallLaunchAgent,\n startLaunchAgent,\n stopLaunchAgent,\n getLaunchAgentStatus,\n getLaunchAgentInfo,\n type LaunchdOptions,\n} from \"./launchd.js\";\nimport {\n installSystemdUnit,\n uninstallSystemdUnit,\n startSystemdUnit,\n stopSystemdUnit,\n getSystemdStatus,\n getSystemdInfo,\n type SystemdOptions,\n} from \"./systemd.js\";\n\nexport type ServiceOptions = LaunchdOptions & SystemdOptions;\n\nexport interface ServiceStatus {\n label: string;\n installed: boolean;\n loaded: boolean;\n state?: string;\n}\n\nconst isLinux = process.platform === \"linux\";\nconst isDarwin = process.platform === \"darwin\";\n\nfunction unsupported(): never {\n throw new Error(\n `Recall daemon service is only supported on macOS (launchd) and Linux (systemd). Current platform: ${process.platform}`,\n );\n}\n\nexport function installService(opts: ServiceOptions = {}): ServiceStatus {\n if (isDarwin) return installLaunchAgent(opts);\n if (isLinux) return installSystemdUnit(opts);\n unsupported();\n}\n\nexport function uninstallService(label?: string): ServiceStatus {\n if (isDarwin) return uninstallLaunchAgent(label);\n if (isLinux) return uninstallSystemdUnit(label);\n unsupported();\n}\n\nexport function startService(label?: string): ServiceStatus {\n if (isDarwin) return startLaunchAgent(label);\n if (isLinux) return startSystemdUnit(label);\n unsupported();\n}\n\nexport function stopService(label?: string): ServiceStatus {\n if (isDarwin) return stopLaunchAgent(label);\n if (isLinux) return stopSystemdUnit(label);\n unsupported();\n}\n\nexport function getServiceStatus(label?: string): ServiceStatus {\n if (isDarwin) return getLaunchAgentStatus(label);\n if (isLinux) return getSystemdStatus(label);\n unsupported();\n}\n\nexport function getServiceInfo(label?: string): string {\n if (isDarwin) return getLaunchAgentInfo(label);\n if (isLinux) return getSystemdInfo(label);\n unsupported();\n}\n\nexport function defaultServiceLabel(): string {\n return isLinux ? \"recall-daemon\" : \"com.recall.daemon\";\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,eAAe;AACxB,SAAS,WAAAA,gBAAe;AACxB,SAAS,iBAAAC,gBAAe,gBAAAC,qBAAgC;AACxD,SAAS,QAAAC,aAAY;;;ACErB,SAAS,IAAI,UAAU;AACvB,SAAS,kBAAkB;AAkB3B,SAAS,aAAa,IAA4B;AAChD,QAAM,MAAM,GAAG,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,GAAG,UAAU,IAAI,OAAO,CAAC,EAAE,IAAI;AAC7E,MAAI,IAAK,QAAO;AAEhB,KAAG,OAAO,SAAS,EAChB,OAAO;AAAA,IACN,IAAI;AAAA,IACJ,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,cAAc;AAAA,IACd,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,EACrB,CAAC,EACA,IAAI;AACP,SAAO,GAAG,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,GAAG,UAAU,IAAI,OAAO,CAAC,EAAE,IAAI;AAC1E;AAEA,SAAS,gBACP,IACA,SACA;AACA,KAAG,OAAO,SAAS,EAChB,IAAI,OAAO,EACX,MAAM,GAAG,UAAU,IAAI,OAAO,CAAC,EAC/B,IAAI;AACT;AAIA,eAAsB,aACpB,IACA,QAC8C;AAC9C,QAAM,QAAQ,aAAa,EAAE;AAG7B,QAAM,gBAAgB,GACnB,OAAO,EACP,KAAK,QAAQ,EACb,MAAM,GAAG,SAAS,cAAc,MAAM,iBAAiB,CAAC,EACxD,IAAI;AAEP,MAAI,cAAc,WAAW,GAAG;AAC9B,WAAO,EAAE,QAAQ,GAAG,SAAS,MAAM,kBAAkB;AAAA,EACvD;AAEA,QAAM,UAAU,cAAc,IAAI,CAAC,OAAO;AAAA,IACxC,GAAG;AAAA,IACH,WAAW,EAAE;AAAA,IACb,UAAU,OAAO,EAAE,aAAa,WAAW,KAAK,MAAM,EAAE,QAAkB,IAAI,EAAE;AAAA,EAClF,EAAE;AAEF,QAAM,OAAO,MAAM,MAAM,GAAG,OAAO,UAAU,aAAa;AAAA,IACxD,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,eAAe,UAAU,OAAO,OAAO;AAAA,IACzC;AAAA,IACA,MAAM,KAAK,UAAU;AAAA,MACnB,SAAS,OAAO;AAAA,MAChB,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,CAAC;AAED,MAAI,CAAC,KAAK,IAAI;AACZ,UAAM,MAAM,MAAM,KAAK,KAAK,EAAE,MAAM,OAAO,EAAE,OAAO,KAAK,WAAW,EAAE;AACtE,UAAM,IAAI,MAAM,gBAAiB,IAAY,SAAS,KAAK,UAAU,EAAE;AAAA,EACzE;AAEA,QAAM,SAAU,MAAM,KAAK,KAAK;AAEhC,kBAAgB,IAAI;AAAA,IAClB,YAAY,OAAO;AAAA,IACnB,SAAS,OAAO;AAAA,IAChB,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,IACrC,mBAAmB,KAAK;AAAA,MACtB,GAAG,cAAc,IAAI,CAAC,MAAM,EAAE,YAAY;AAAA,IAC5C;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAIA,eAAsB,aACpB,IACA,QACgD;AAChD,QAAM,QAAQ,aAAa,EAAE;AAE7B,QAAM,OAAO,MAAM,MAAM,GAAG,OAAO,UAAU,aAAa;AAAA,IACxD,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,eAAe,UAAU,OAAO,OAAO;AAAA,IACzC;AAAA,IACA,MAAM,KAAK,UAAU;AAAA,MACnB,SAAS,OAAO;AAAA,MAChB,eAAe,MAAM;AAAA,IACvB,CAAC;AAAA,EACH,CAAC;AAED,MAAI,CAAC,KAAK,IAAI;AACZ,UAAM,MAAM,MAAM,KAAK,KAAK,EAAE,MAAM,OAAO,EAAE,OAAO,KAAK,WAAW,EAAE;AACtE,UAAM,IAAI,MAAM,gBAAiB,IAAY,SAAS,KAAK,UAAU,EAAE;AAAA,EACzE;AAEA,QAAM,OAAQ,MAAM,KAAK,KAAK;AAK9B,MAAI,SAAS;AACb,MAAI,YAAY;AAEhB,aAAW,UAAU,KAAK,UAAU;AAClC,UAAM,WAAW,GACd,OAAO,EACP,KAAK,QAAQ,EACb,MAAM,GAAG,SAAS,IAAI,OAAO,SAAS,CAAC,EACvC,IAAI;AAEP,QAAI,UAAU;AAEZ,UAAI,OAAO,aAAa,SAAS,YAAY;AAC3C,WAAG,OAAO,QAAQ,EACf,IAAI;AAAA,UACH,MAAM,OAAO;AAAA,UACb,QAAQ,OAAO;AAAA,UACf,YAAY,OAAO;AAAA,UACnB,UAAU,OAAO;AAAA,UACjB,YAAY,OAAO;AAAA,UACnB,SAAS,OAAO;AAAA,QAClB,CAAC,EACA,MAAM,GAAG,SAAS,IAAI,SAAS,EAAE,CAAC,EAClC,IAAI;AACP,iCAAyB,IAAI,SAAS,EAAE;AACxC;AACA;AAAA,MACF;AAAA,IACF,OAAO;AAEL,YAAM,WAAW,OAAO,aAAa,WAAW;AAChD,SAAG,OAAO,QAAQ,EACf,OAAO;AAAA,QACN,IAAI;AAAA,QACJ,MAAM,OAAO;AAAA,QACb,MAAM,OAAO;AAAA,QACb,OAAO,OAAO;AAAA,QACd,YAAY,OAAO;AAAA,QACnB,MAAM,OAAO;AAAA,QACb,QAAQ,OAAO;AAAA,QACf,YAAY,OAAO;AAAA,QACnB,QAAQ,OAAO;AAAA,QACf,UAAU,OAAO;AAAA,QACjB,YAAY,OAAO;AAAA,QACnB,YAAY,OAAO;AAAA,QACnB,YAAY,OAAO;AAAA,QACnB,SAAS,OAAO;AAAA,QAChB,cAAc;AAAA,MAChB,CAAC,EACA,IAAI;AACP,+BAAyB,IAAI,QAAQ;AACrC;AAAA,IACF;AAAA,EACF;AAEA,kBAAgB,IAAI;AAAA,IAClB,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,IACrC,mBAAmB,KAAK;AAAA,EAC1B,CAAC;AAED,SAAO,EAAE,QAAQ,UAAU;AAC7B;AAIA,eAAsB,KACpB,IACA,QACqB;AACrB,QAAM,SAAmB,CAAC;AAC1B,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,YAAY;AAEhB,MAAI;AACF,UAAM,aAAa,MAAM,aAAa,IAAI,MAAM;AAChD,aAAS,WAAW;AAAA,EACtB,SAAS,KAAU;AACjB,WAAO,KAAK,SAAS,IAAI,OAAO,EAAE;AAAA,EACpC;AAEA,MAAI;AACF,UAAM,aAAa,MAAM,aAAa,IAAI,MAAM;AAChD,aAAS,WAAW;AACpB,gBAAY,WAAW;AAAA,EACzB,SAAS,KAAU;AACjB,WAAO,KAAK,SAAS,IAAI,OAAO,EAAE;AAAA,EACpC;AAEA,SAAO,EAAE,QAAQ,QAAQ,WAAW,OAAO;AAC7C;AAIA,eAAsB,WACpB,QACA,MACiB;AACjB,QAAM,OAAO,MAAM,MAAM,GAAG,OAAO,UAAU,aAAa;AAAA,IACxD,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,eAAe,UAAU,OAAO,OAAO;AAAA,IACzC;AAAA,IACA,MAAM,KAAK,UAAU,EAAE,KAAK,CAAC;AAAA,EAC/B,CAAC;AAED,MAAI,CAAC,KAAK,GAAI,OAAM,IAAI,MAAM,0BAA0B,KAAK,UAAU,EAAE;AACzE,QAAM,OAAQ,MAAM,KAAK,KAAK;AAC9B,SAAO,KAAK;AACd;AAEA,eAAsB,SACpB,QACA,QACe;AACf,QAAM,OAAO,MAAM,MAAM,GAAG,OAAO,UAAU,aAAa,MAAM,SAAS;AAAA,IACvE,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,eAAe,UAAU,OAAO,OAAO;AAAA,IACzC;AAAA,EACF,CAAC;AAED,MAAI,CAAC,KAAK,GAAI,OAAM,IAAI,MAAM,wBAAwB,KAAK,UAAU,EAAE;AACzE;;;ACvQA,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,WAAAC,UAAS,QAAAC,OAAM,WAAAC,gBAAe;AACvC,SAAS,iBAAAC,sBAAqB;;;ACH9B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,SAAS,MAAM,eAAe;AACvC,SAAS,qBAAqB;;;ACR9B,SAAS,oBAAoB;AAC7B,SAAS,eAAe;AAEjB,SAAS,qBAA6B;AAC3C,SAAO,QAAQ,IAAI,QAAQ,QAAQ,IAAI,eAAe,QAAQ;AAChE;AAEO,SAAS,WAAW,MAAuB;AAChD,MAAI;AACF,iBAAa,SAAS,CAAC,IAAI,GAAG,EAAE,OAAO,SAAS,CAAC;AACjD,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ADEA,IAAM,8BAA8B,CAAC,WAAW,eAAe;AAC/D,IAAM,cAAc;AACpB,IAAM,wBAAwB;AAC9B,IAAM,sBACJ;AA4BF,IAAM,aAAa,MAAM,KAAK,mBAAmB,GAAG,GAAG,2BAA2B;AAiD3E,SAAS,uBACd,UAAwC,CAAC,GAC1B;AACf,QAAM,aAAa,QAAQ,cAAc,WAAW;AACpD,QAAM,UAAU,iBAAiB,UAAU;AAC3C,QAAM,gBAAgB,mBAAmB;AAAA,IACvC,SAAS,QAAQ;AAAA,IACjB,UAAU,QAAQ;AAAA,IAClB,SAAS,QAAQ;AAAA,IACjB,iBAAiB,QAAQ;AAAA,EAC3B,CAAC;AACD,QAAM,OAAO,cAAc,QAAQ,QAAQ;AAC3C,QAAM,QAAQ,kBAAkB,IAAI;AAEpC,MAAI,UAAU;AACd,aAAW,CAAC,WAAW,MAAM,KAAK,OAAO,QAAQ,aAAa,GAAG;AAC/D,UAAM,WAAW,MAAM,SAAS,KAAK,CAAC;AACtC,UAAM,YAAY,SAAS,OAAO,CAAC,UAAU,CAAC,eAAe,KAAK,CAAC;AACnE,UAAM,SAAS,CAAC,GAAG,WAAW,GAAG,MAAM;AACvC,QAAI,CAAC,SAAS,UAAU,MAAM,GAAG;AAC/B,YAAM,SAAS,IAAI;AACnB,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,SAAS;AAAA,MACT,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAEA,oBAAkB,YAAY,QAAQ,KAAK,IAAI;AAC/C,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AACF;AAEO,SAAS,yBACd,UAA4D,CAAC,GAC9C;AACf,QAAM,aAAa,QAAQ,cAAc,WAAW;AACpD,MAAI,CAAC,WAAW,UAAU,GAAG;AAC3B,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,SAAS;AAAA,MACT,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,UAAU,iBAAiB,UAAU;AAC3C,QAAM,OAAO,cAAc,QAAQ,QAAQ;AAC3C,QAAM,QAAQ,KAAK;AAEnB,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,SAAS;AAAA,MACT,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,UAAU;AACd,aAAW,aAAa,OAAO,KAAK,KAAK,GAAG;AAC1C,UAAM,WAAW,MAAM,SAAS,KAAK,CAAC;AACtC,UAAM,YAAY,SAAS,OAAO,CAAC,UAAU,CAAC,eAAe,KAAK,CAAC;AACnE,QAAI,CAAC,SAAS,UAAU,SAAS,GAAG;AAClC,gBAAU;AACV,UAAI,UAAU,SAAS,GAAG;AACxB,cAAM,SAAS,IAAI;AAAA,MACrB,OAAO;AACL,eAAO,MAAM,SAAS;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,KAAK,KAAK,EAAE,WAAW,GAAG;AACnC,WAAO,KAAK;AAAA,EACd;AAEA,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,SAAS;AAAA,MACT,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAEA,oBAAkB,YAAY,QAAQ,KAAK,IAAI;AAC/C,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AACF;AAEA,SAAS,mBACP,SAC0C;AAC1C,QAAM,kBAAkB,IAAI,IAAI,QAAQ,WAAW,CAAC,CAAC;AACrD,QAAM,gBAAgB,yBAAyB,OAAO;AACtD,QAAM,SAAmD,CAAC;AAE1D,SAAO,eAAe;AAAA,IACpB;AAAA,MACE,SAAS;AAAA,MACT,OAAO,CAAC,YAAY,GAAG,aAAa,+DAA+D,eAAe,CAAC;AAAA,IACrH;AAAA,EACF;AAEA,MAAI,gBAAgB,SAAS,KAAK,gBAAgB,IAAI,kBAAkB,GAAG;AACzE,UAAM,YAAY,QAAQ,oBAAoB,QAAQ,qCAAqC;AAC3F,WAAO,mBAAmB;AAAA,MACxB;AAAA,QACE,OAAO,CAAC,YAAY,GAAG,SAAS,GAAG,aAAa,wDAAwD,QAAQ,CAAC;AAAA,MACnH;AAAA,IACF;AAAA,EACF;AAEA,MAAI,gBAAgB,SAAS,KAAK,gBAAgB,IAAI,cAAc,GAAG;AACrE,WAAO,cAAc;AAAA,MACnB;AAAA,QACE,SAAS;AAAA,QACT,OAAO,CAAC,YAAY,GAAG,aAAa,sDAAsD,MAAM,CAAC;AAAA,MACnG;AAAA,IACF;AAAA,EACF;AAEA,MAAI,gBAAgB,SAAS,KAAK,gBAAgB,IAAI,eAAe,GAAG;AACtE,WAAO,aAAa;AAAA,MAClB;AAAA,QACE,SAAS;AAAA,QACT,OAAO,CAAC,YAAY,GAAG,aAAa,6DAA6D,aAAa,CAAC;AAAA,MACjH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,YAAY,SAAiB,KAAgC;AACpE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,GAAG,OAAO,MAAM,WAAW,IAAI,GAAG;AAAA,EAC7C;AACF;AAEA,SAAS,yBAAyB,SAA+C;AAC/E,QAAM,WAAW,QAAQ,YAAY,QAAQ,IAAI,oBAAoB,QAAQ;AAC7E,QAAM,UAAU,QAAQ,WAAW,eAAe;AAClD,SAAO,GAAG,WAAW,QAAQ,CAAC,IAAI,WAAW,OAAO,CAAC;AACvD;AAEA,SAAS,iBAAyB;AAChC,QAAM,UAAU,QAAQ,IAAI;AAC5B,MAAI,WAAW,WAAW,OAAO,GAAG;AAClC,WAAO,QAAQ,OAAO;AAAA,EACxB;AAEA,QAAM,WAAW,QAAQ,KAAK,CAAC;AAC/B,MAAI,YAAY,wBAAwB,KAAK,QAAQ,KAAK,WAAW,QAAQ,GAAG;AAC9E,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAEA,QAAM,UAAU,QAAQ,QAAQ,cAAc,YAAY,GAAG,CAAC,GAAG,MAAM,QAAQ;AAC/E,MAAI,WAAW,OAAO,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,QAAQ,QAAQ,IAAI,GAAG,QAAQ,QAAQ;AACvD,MAAI,WAAW,OAAO,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,IAAI,MAAM,yDAAyD;AAC3E;AAEA,SAAS,iBAAiBC,aAAsE;AAC9F,MAAI,CAAC,WAAWA,WAAU,GAAG;AAC3B,WAAO,EAAE,KAAK,MAAM,UAAU,CAAC,EAAE;AAAA,EACnC;AAEA,QAAM,MAAM,aAAaA,aAAY,OAAO;AAC5C,QAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,MAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AAClE,UAAM,IAAI,MAAM,mCAAmCA,WAAU,EAAE;AAAA,EACjE;AAEA,SAAO,EAAE,KAAK,UAAU,OAAyB;AACnD;AAEA,SAAS,kBACPA,aACA,aACA,UACA;AACA,QAAM,YAAY,QAAQA,WAAU;AACpC,YAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAExC,MAAI,eAAe,MAAM;AACvB,UAAM,aAAa,GAAGA,WAAU,eAAe,KAAK,IAAI,CAAC;AACzD,kBAAc,YAAY,WAAW;AAAA,EACvC;AAEA,QAAM,UAAU,GAAGA,WAAU,QAAQ,QAAQ,GAAG;AAChD,gBAAc,SAAS,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,CAAI;AAC/D,aAAW,SAASA,WAAU;AAChC;AAEA,SAAS,kBAAkB,UAAoE;AAC7F,MAAI,CAAC,SAAS,OAAO;AACnB,aAAS,QAAQ,CAAC;AAAA,EACpB;AACA,MAAI,OAAO,SAAS,UAAU,YAAY,MAAM,QAAQ,SAAS,KAAK,GAAG;AACvE,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AACA,SAAO,SAAS;AAClB;AAEA,SAAS,eAAe,OAAwC;AAC9D,UAAQ,MAAM,SAAS,CAAC,GAAG,KAAK,CAAC,SAAS,OAAO,KAAK,YAAY,YAAY,KAAK,QAAQ,SAAS,WAAW,CAAC;AAClH;AAEA,SAAS,cAAc,UAA0C;AAC/D,SAAO,KAAK,MAAM,KAAK,UAAU,QAAQ,CAAC;AAC5C;AAEA,SAAS,SAAS,MAAe,OAAyB;AACxD,SAAO,KAAK,UAAU,IAAI,MAAM,KAAK,UAAU,KAAK;AACtD;AAEA,SAAS,WAAW,OAAuB;AACzC,SAAO,IAAI,MAAM,QAAQ,MAAM,OAAO,CAAC;AACzC;;;AEnVA;AAAA,EACE,cAAAC;AAAA,EACA,aAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,cAAAC;AAAA,EACA,iBAAAC;AAAA,OACK;AACP,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,WAAAC,UAAS,QAAAC,OAAM,WAAAC,gBAAe;AACvC,SAAS,iBAAAC,sBAAqB;AAQ9B,IAAM,6BAA6B,CAAC,UAAU,aAAa;AAC3D,IAAM,4BAA4B,CAAC,UAAU,YAAY;AACzD,IAAM,gBAAgB;AACtB,IAAM,cAAc;AACpB,IAAM,uBAAuB;AAC7B,IAAM,mBAAmB;AAQzB,IAAM,kCAAkC;AAyBxC,IAAMC,cAAa,MAAMC,MAAK,mBAAmB,GAAG,GAAG,0BAA0B;AACjF,IAAM,gBAAgB,MAAMA,MAAK,mBAAmB,GAAG,GAAG,yBAAyB;AA2C5E,SAAS,yBACd,UAAmC,CAAC,GACrB;AACf,QAAM,aAAa,QAAQ,cAAcC,YAAW;AACpD,QAAM,WAAWC,YAAW,UAAU,IAClCC,cAAa,YAAY,OAAO,IAChC;AACJ,QAAM,WAAW,kBAAkB,QAAQ;AAE3C,MAAI,mBAAmB,QAAQ,GAAG;AAChC,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,SAAS;AAAA,MACT,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,eAAe,wBAAwB,OAAO;AACpD,QAAM,OAAO,mBAAmB,UAAU,YAAY;AAEtD,MAAI,SAAS,UAAU;AACrB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,SAAS;AAAA,MACT,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAEA,kBAAgB,YAAY,YAAY,MAAM,IAAI;AAClD,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AACF;AAEO,SAAS,2BACd,UAAuD,CAAC,GACzC;AACf,QAAM,aAAa,QAAQ,cAAcF,YAAW;AACpD,MAAI,CAACC,YAAW,UAAU,GAAG;AAC3B,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,SAAS;AAAA,MACT,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,WAAWC,cAAa,YAAY,OAAO;AACjD,QAAM,OAAO,kBAAkB,QAAQ;AACvC,MAAI,SAAS,UAAU;AACrB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,SAAS;AAAA,MACT,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAEA,kBAAgB,YAAY,UAAU,IAAI;AAC1C,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AACF;AAmBO,SAAS,sBACd,UAAiE,CAAC,GACjD;AACjB,QAAM,WAAW,QAAQ,wBACpB,QAAQ,IAAI,kCACZ;AACL,QAAM,WAAW,kBAAkB;AACnC,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,QAAQ;AAAA,IACV;AAAA,EACF;AACA,MAAI,cAAc,UAAU,QAAQ,IAAI,GAAG;AACzC,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,QAAQ,SAAS,QAAQ,MAAM,QAAQ;AAAA,IACzC;AAAA,EACF;AACA,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,EACpB;AACF;AAEO,SAAS,kBACd,UAAmC,CAAC,GACrB;AACf,QAAM,eAAe,QAAQ,cAAcF,YAAW;AACtD,QAAM,cAAc,QAAQ,aAAa,cAAc;AAEvD,QAAM,aAAa,QAAQ,oBACvB,EAAE,YAAY,OAAO,kBAAkB,MAAM,kBAAkB,OAAO,QAAQ,uBAAuB,IACrG,QAAQ,aACN,EAAE,YAAY,MAAM,kBAAkB,MAAM,kBAAkB,MAAM,IACpE,sBAAsB,OAAO;AAEnC,MAAI,CAAC,WAAW,YAAY;AAC1B,UAAM,SAAS,yBAAyB,OAAO;AAC/C,UAAM,SAAS,WAAW,UAAU;AACpC,WAAO;AAAA,MACL,IAAI,OAAO;AAAA,MACX,SAAS,OAAO;AAAA,MAChB,aAAa,OAAO;AAAA,MACpB,SAAS,GAAG,OAAO,OAAO,iCAAiC,MAAM;AAAA,IACnE;AAAA,EACF;AAGA,6BAA2B,EAAE,YAAY,aAAa,CAAC;AAEvD,QAAM,aAAa,4BAA4B,YAAY;AAC3D,QAAM,cAAc,oBAAoB,aAAa,OAAO;AAE5D,QAAM,UAAU,WAAW,WAAW,YAAY;AAClD,QAAMG,MAAK,WAAW,MAAM,YAAY;AACxC,QAAM,cAAc,WAAW,mBAC3B,WAAW,WAAW,gBAAgB,MACtC;AACJ,QAAM,WAAW,CAAC,WAAW,SAAS,YAAY,OAAO,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AAEpF,SAAO;AAAA,IACL,IAAAA;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb,UAAU,aAAa,UAAU,+BAA+B,oCAAoC;AAAA,EACtG;AACF;AAEA,SAAS,oBAAmC;AAC1C,MAAI,CAAC,WAAW,OAAO,EAAG,QAAO;AACjC,MAAI;AACF,UAAM,MAAMC,cAAa,SAAS,CAAC,WAAW,GAAG;AAAA,MAC/C,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,QAAQ,QAAQ;AAAA,MAClC,SAAS;AAAA,IACX,CAAC;AACD,WAAO,+BAA+B,GAAG;AAAA,EAC3C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,+BAA+B,KAA4B;AACzE,QAAM,QAAQ,IAAI,MAAM,4CAA4C;AACpE,SAAO,QAAQ,GAAG,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,KAAK;AACzD;AAEO,SAAS,cAAc,GAAW,GAAmB;AAC1D,QAAM,KAAK,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC;AAClD,QAAM,KAAK,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC;AAClD,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,KAAK,GAAG,CAAC,KAAK;AACpB,UAAM,KAAK,GAAG,CAAC,KAAK;AACpB,QAAI,OAAO,GAAI,QAAO,KAAK,KAAK,KAAK;AAAA,EACvC;AACA,SAAO;AACT;AAEO,SAAS,oBACd,UAAqE,CAAC,GACvD;AACf,QAAM,eAAe,QAAQ,cAAcJ,YAAW;AACtD,QAAM,cAAc,QAAQ,aAAa,cAAc;AAEvD,QAAM,aAAa,4BAA4B,YAAY;AAC3D,QAAM,cAAc,qBAAqB,WAAW;AACpD,QAAM,eAAe,2BAA2B,EAAE,YAAY,aAAa,CAAC;AAE5E,QAAM,UAAU,WAAW,WAAW,YAAY,WAAW,aAAa;AAC1E,QAAMG,MAAK,WAAW,MAAM,YAAY,MAAM,aAAa;AAE3D,SAAO;AAAA,IACL,IAAAA;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb,SAAS,UAAU,+BAA+B;AAAA,EACpD;AACF;AAEA,SAAS,oBACP,YACA,SACe;AACf,QAAM,WAAW,mBAAmB,UAAU;AAC9C,QAAM,OAAO,gBAAgB,SAAS,MAAM;AAC5C,QAAM,QAAQ,uBAAuB,IAAI;AACzC,QAAM,UAAU,wBAAwB,OAAO;AAE/C,MAAI,UAAU;AACd,aAAW,CAAC,WAAW,MAAM,KAAK,OAAO,QAAQ,OAAO,GAAG;AACzD,UAAM,UAAU,MAAM,SAAS,KAAK,CAAC;AACrC,UAAM,YAAY,QAAQ,OAAO,CAAC,UAAU,CAAC,oBAAoB,KAAK,CAAC;AACvE,UAAM,SAAS,CAAC,GAAG,WAAW,GAAG,MAAM;AACvC,QAAI,KAAK,UAAU,OAAO,MAAM,KAAK,UAAU,MAAM,GAAG;AACtD,YAAM,SAAS,IAAI;AACnB,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,SAAS;AAAA,MACT,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAEA,gBAAc,YAAY,SAAS,KAAK,IAAI;AAC5C,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AACF;AAEA,SAAS,qBAAqB,YAAmC;AAC/D,MAAI,CAACF,YAAW,UAAU,GAAG;AAC3B,WAAO,EAAE,IAAI,MAAM,SAAS,OAAO,aAAa,YAAY,SAAS,GAAG;AAAA,EAC1E;AAEA,QAAM,WAAW,mBAAmB,UAAU;AAC9C,QAAM,OAAO,gBAAgB,SAAS,MAAM;AAC5C,QAAM,QAAQ,KAAK;AACnB,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO,EAAE,IAAI,MAAM,SAAS,OAAO,aAAa,YAAY,SAAS,GAAG;AAAA,EAC1E;AAEA,MAAI,UAAU;AACd,aAAW,aAAa,OAAO,KAAK,KAAK,GAAG;AAC1C,UAAM,UAAU,MAAM,SAAS,KAAK,CAAC;AACrC,UAAM,YAAY,QAAQ,OAAO,CAAC,UAAU,CAAC,oBAAoB,KAAK,CAAC;AACvE,QAAI,UAAU,WAAW,QAAQ,QAAQ;AACvC,gBAAU;AACV,UAAI,UAAU,SAAS,GAAG;AACxB,cAAM,SAAS,IAAI;AAAA,MACrB,OAAO;AACL,eAAO,MAAM,SAAS;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,KAAK,KAAK,EAAE,WAAW,EAAG,QAAO,KAAK;AAEjD,MAAI,CAAC,SAAS;AACZ,WAAO,EAAE,IAAI,MAAM,SAAS,OAAO,aAAa,YAAY,SAAS,GAAG;AAAA,EAC1E;AAEA,gBAAc,YAAY,SAAS,KAAK,IAAI;AAC5C,SAAO,EAAE,IAAI,MAAM,SAAS,MAAM,aAAa,YAAY,SAAS,qBAAqB;AAC3F;AAEA,SAAS,wBACP,SACyC;AACzC,QAAM,kBAAkB,IAAI,IAAI,QAAQ,WAAW,CAAC,CAAC;AACrD,QAAM,gBAAgBI,0BAAyB,OAAO;AACtD,QAAM,SAAkD,CAAC;AAEzD,SAAO,eAAe;AAAA,IACpB;AAAA,MACE,SAAS;AAAA,MACT,OAAO,CAACC,aAAY,GAAG,aAAa,mDAAmD,eAAe,CAAC;AAAA,IACzG;AAAA,EACF;AAEA,MAAI,gBAAgB,SAAS,KAAK,gBAAgB,IAAI,kBAAkB,GAAG;AACzE,UAAM,YAAY,QAAQ,oBAAoB,QAAQ,qCAAqC;AAC3F,WAAO,mBAAmB;AAAA,MACxB;AAAA,QACE,OAAO,CAACA,aAAY,GAAG,SAAS,GAAG,aAAa,4CAA4C,QAAQ,CAAC;AAAA,MACvG;AAAA,IACF;AAAA,EACF;AAEA,MAAI,gBAAgB,SAAS,KAAK,gBAAgB,IAAI,cAAc,GAAG;AACrE,WAAO,cAAc;AAAA,MACnB;AAAA,QACE,SAAS;AAAA,QACT,OAAO,CAACA,aAAY,GAAG,aAAa,0CAA0C,MAAM,CAAC;AAAA,MACvF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAASA,aAAY,SAAiB,KAA+B;AACnE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,GAAG,OAAO,MAAM,gBAAgB,IAAI,GAAG;AAAA,EAClD;AACF;AAEA,SAASD,0BAAyB,SAA0C;AAC1E,QAAM,WAAW,QAAQ,YAAY,QAAQ,IAAI,oBAAoB,QAAQ;AAC7E,QAAM,UAAU,QAAQ,WAAWE,gBAAe;AAClD,SAAO,GAAGC,YAAW,QAAQ,CAAC,IAAIA,YAAW,OAAO,CAAC;AACvD;AAEA,SAASA,YAAW,OAAuB;AACzC,SAAO,IAAI,MAAM,QAAQ,MAAM,OAAO,CAAC;AACzC;AAEA,SAAS,mBAAmB,YAAoE;AAC9F,MAAI,CAACP,YAAW,UAAU,EAAG,QAAO,EAAE,KAAK,MAAM,QAAQ,CAAC,EAAE;AAC5D,QAAM,MAAMC,cAAa,YAAY,OAAO;AAC5C,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,GAAG;AAAA,EACzB,QAAQ;AACN,UAAM,IAAI,MAAM,+BAA+B,UAAU,EAAE;AAAA,EAC7D;AACA,MAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AAClE,UAAM,IAAI,MAAM,yCAAyC,UAAU,EAAE;AAAA,EACvE;AACA,SAAO,EAAE,KAAK,OAAiC;AACjD;AAEA,SAAS,cAAc,YAAoB,aAA4B,OAAgB;AACrF,QAAM,YAAYO,SAAQ,UAAU;AACpC,EAAAC,WAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AACxC,MAAI,eAAe,MAAM;AACvB,IAAAC,eAAc,GAAG,UAAU,eAAe,KAAK,IAAI,CAAC,IAAI,WAAW;AAAA,EACrE;AACA,QAAM,UAAU,GAAG,UAAU,QAAQ,QAAQ,GAAG;AAChD,EAAAA,eAAc,SAAS,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,CAAI;AAC5D,EAAAC,YAAW,SAAS,UAAU;AAChC;AAEA,SAAS,uBAAuB,MAA+D;AAC7F,MAAI,CAAC,KAAK,MAAO,MAAK,QAAQ,CAAC;AAC/B,MAAI,OAAO,KAAK,UAAU,YAAY,MAAM,QAAQ,KAAK,KAAK,GAAG;AAC/D,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC5D;AACA,SAAO,KAAK;AACd;AAEA,SAAS,oBAAoB,OAAuC;AAClE,UAAQ,MAAM,SAAS,CAAC,GAAG;AAAA,IACzB,CAAC,SAAS,OAAO,KAAK,YAAY,YAAY,KAAK,QAAQ,SAAS,gBAAgB;AAAA,EACtF;AACF;AAEA,SAAS,gBAAgB,MAAsC;AAC7D,SAAO,KAAK,MAAM,KAAK,UAAU,IAAI,CAAC;AACxC;AAEA,SAAS,4BAA4B,kBAAyC;AAC5E,QAAM,WAAWX,YAAW,gBAAgB,IAAIC,cAAa,kBAAkB,OAAO,IAAI;AAE1F,MAAI,gCAAgC,KAAK,QAAQ,GAAG;AAClD,WAAO,EAAE,IAAI,MAAM,SAAS,OAAO,aAAa,kBAAkB,SAAS,GAAG;AAAA,EAChF;AAEA,QAAM,gBAAgB;AACtB,MAAI;AACJ,MAAI,cAAc,KAAK,QAAQ,GAAG;AAChC,WAAO,SAAS;AAAA,MACd;AAAA,MACA;AAAA,qBAAkC,oBAAoB;AAAA,IACxD;AAAA,EACF,OAAO;AACL,UAAM,YAAY,SAAS,WAAW,KAAK,SAAS,SAAS,IAAI,IAAI,KAAK;AAC1E,WAAO,GAAG,QAAQ,GAAG,SAAS;AAAA;AAAA,qBAAoC,oBAAoB;AAAA;AAAA,EACxF;AAEA,kBAAgB,kBAAkB,YAAY,MAAM,IAAI;AACxD,SAAO,EAAE,IAAI,MAAM,SAAS,MAAM,aAAa,kBAAkB,SAAS,mCAAmC;AAC/G;AAEA,SAAS,4BAA4B,kBAAyC;AAC5E,MAAI,CAACD,YAAW,gBAAgB,GAAG;AACjC,WAAO,EAAE,IAAI,MAAM,SAAS,OAAO,aAAa,kBAAkB,SAAS,GAAG;AAAA,EAChF;AACA,QAAM,WAAWC,cAAa,kBAAkB,OAAO;AACvD,QAAM,cAAc,IAAI;AAAA,IACtB,oCAAoC,aAAa,oBAAoB,CAAC;AAAA,IACtE;AAAA,EACF;AACA,MAAI,CAAC,YAAY,KAAK,QAAQ,GAAG;AAC/B,WAAO,EAAE,IAAI,MAAM,SAAS,OAAO,aAAa,kBAAkB,SAAS,GAAG;AAAA,EAChF;AACA,QAAM,OAAO,SAAS,QAAQ,aAAa,EAAE;AAC7C,kBAAgB,kBAAkB,UAAU,IAAI;AAChD,SAAO,EAAE,IAAI,MAAM,SAAS,MAAM,aAAa,kBAAkB,SAAS,2BAA2B;AACvG;AAEA,SAAS,wBAAwB,SAA0C;AACzE,QAAM,UAAU;AAAA,IACd,QAAQ,YAAY,QAAQ,IAAI,oBAAoB,QAAQ;AAAA,IAC5D,QAAQ,WAAWK,gBAAe;AAAA,IAClC;AAAA,IACA;AAAA,EACF;AACA,SAAO,GAAG,aAAa;AAAA,WACd,sBAAsB,OAAO,CAAC;AAAA,EACvC,WAAW;AAAA;AAEb;AAEA,SAASA,kBAAyB;AAChC,QAAM,UAAU,QAAQ,IAAI;AAC5B,MAAI,WAAWN,YAAW,OAAO,GAAG;AAClC,WAAOY,SAAQ,OAAO;AAAA,EACxB;AAEA,QAAM,WAAW,QAAQ,KAAK,CAAC;AAC/B,MAAI,YAAY,wBAAwB,KAAK,QAAQ,KAAKZ,YAAW,QAAQ,GAAG;AAC9E,WAAOY,SAAQ,QAAQ;AAAA,EACzB;AAEA,QAAM,UAAUA,SAAQJ,SAAQK,eAAc,YAAY,GAAG,CAAC,GAAG,MAAM,QAAQ;AAC/E,MAAIb,YAAW,OAAO,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,UAAUY,SAAQ,QAAQ,IAAI,GAAG,QAAQ,QAAQ;AACvD,MAAIZ,YAAW,OAAO,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,IAAI,MAAM,2DAA2D;AAC7E;AAEA,SAAS,kBAAkB,SAAyB;AAClD,MAAI,CAAC,QAAQ,SAAS,aAAa,GAAG;AACpC,WAAO;AAAA,EACT;AAEA,SAAO,QACJ,QAAQ,IAAI,OAAO,GAAG,aAAa,aAAa,CAAC,aAAa,aAAa,WAAW,CAAC,QAAQ,GAAG,GAAG,EAAE,EACvG,QAAQ,WAAW,MAAM,EACzB,QAAQ,QAAQ,EAAE,EAClB,QAAQ,QAAQ,EAAE;AACvB;AAEA,SAAS,mBAAmB,SAAiB,OAAuB;AAClE,QAAM,UAAU,QAAQ,KAAK;AAC7B,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AACA,SAAO,GAAG,OAAO;AAAA;AAAA,EAAO,KAAK;AAC/B;AAEA,SAAS,mBAAmB,SAA0B;AACpD,SAAO,qBAAqB,KAAK,OAAO;AAC1C;AAEA,SAAS,sBAAsB,QAAmC;AAChE,SAAO,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,UAAU,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC;AACpE;AAEA,SAAS,gBACP,iBACA,aACA,SACA;AACA,QAAM,YAAYQ,SAAQ,eAAe;AACzC,EAAAC,WAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAExC,MAAI,eAAe,MAAM;AACvB,IAAAC,eAAc,GAAG,eAAe,eAAe,KAAK,IAAI,CAAC,IAAI,WAAW;AAAA,EAC1E;AAEA,QAAM,UAAU,GAAG,eAAe,QAAQ,QAAQ,GAAG;AACrD,EAAAA,eAAc,SAAS,yBAAyB,OAAO,CAAC;AACxD,EAAAC,YAAW,SAAS,eAAe;AACrC;AAEA,SAAS,yBAAyB,SAAyB;AACzD,SAAO,QAAQ,KAAK,EAAE,WAAW,IAAI,KAAK,GAAG,QAAQ,QAAQ,CAAC;AAAA;AAChE;AAEA,SAAS,aAAa,OAAuB;AAC3C,SAAO,MAAM,QAAQ,uBAAuB,MAAM;AACpD;;;AH5hBO,SAAS,oBAAoB,SAAkB;AAEpD,MAAI,WAAY,QAAQ,aAAa,YAAYG,YAAW,0BAA0B,GAAI;AACxF,UAAM,kBAAkB,WAAW;AACnC,UAAM,cAAcC,MAAK,iBAAiB,YAAY,aAAa,SAAS;AAC5E,WAAO;AAAA,MACL,SAAS;AAAA,MACT,iBAAiBA,MAAK,aAAa,OAAO,MAAM;AAAA,MAChD,gBAAgBA,MAAK,aAAa,QAAQ,QAAQ;AAAA,MAClD,gBAAgBA,MAAK,aAAa,QAAQ,QAAQ;AAAA,IACpD;AAAA,EACF;AAGA,QAAM,UAAUC,SAAQC,eAAc,YAAY,GAAG,CAAC;AACtD,SAAO;AAAA,IACL,SAAS;AAAA,IACT,iBAAiB,QAAQ;AAAA,IACzB,gBAAgBF,MAAK,SAAS,QAAQ;AAAA,IACtC,gBAAgBA,MAAK,SAAS,QAAQ;AAAA,EACxC;AACF;AAEO,SAAS,cAAc,OAA0B,CAAC,GAAqB;AAC5E,QAAM,cAAc,KAAK,SAAS;AAClC,QAAM,eAAe,KAAK,UAAU;AACpC,QAAM,SAAS,eAAe;AAAA,IAC5B,SAAS,KAAK;AAAA,IACd,OAAO;AAAA,MACL,GAAI,cAAc,CAAC,OAAgB,IAAI,CAAC;AAAA,MACxC,GAAI,eAAe,CAAC,aAAsB,IAAI,CAAC;AAAA,IACjD;AAAA,IACA,WAAW;AAAA,IACX,SAAS;AAAA,IACT,OAAO;AAAA,IACP,iBAAiB,KAAK;AAAA,EACxB,CAAC;AAED,QAAM,QAAQ,OAAO,OAAO,KAAK,CAAC,UAAU,MAAM,UAAU,OAAO;AACnE,QAAM,SAAS,OAAO,OAAO,KAAK,CAAC,UAAU,MAAM,UAAU,aAAa;AAE1E,SAAO;AAAA,IACL,SAAS,OAAO;AAAA,IAChB,iBAAiB,OAAO;AAAA,IACxB,gBAAgB,OAAO;AAAA,IACvB,gBAAgB,OAAO;AAAA,IACvB,OAAO,OAAO,OAAO,QAAQ,SAAS;AAAA,IACtC,QAAQ,QAAQ,OAAO,QAAQ,SAAS;AAAA,IACxC,aAAa,OAAO,SAAS,QAAQ,SAAS;AAAA,IAC9C,cAAc,QAAQ,SAAS,QAAQ,SAAS;AAAA,EAClD;AACF;AAEO,SAAS,eAAe,OAA2B,CAAC,GAAsB;AAC/E,QAAM,QAAQ,KAAK,SAAS;AAC5B,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,YAAY,KAAK,aAAa;AACpC,QAAM,UAAU,KAAK,WAAW;AAChC,QAAM,iBAAiB,KAAK,kBAAkB;AAC9C,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,QAAQ,oBAAoB,KAAK,OAAO;AAE9C,MAAI,CAACD,YAAW,MAAM,eAAe,GAAG;AACtC,UAAM,IAAI,MAAM,6BAA6B,MAAM,eAAe,EAAE;AAAA,EACtE;AACA,MAAI,CAACA,YAAW,MAAM,cAAc,GAAG;AACrC,UAAM,IAAI,MAAM,iCAAiC,MAAM,cAAc,EAAE;AAAA,EACzE;AACA,MAAI,CAACA,YAAW,MAAM,cAAc,GAAG;AACrC,UAAM,IAAI,MAAM,iCAAiC,MAAM,cAAc,EAAE;AAAA,EACzE;AAEA,QAAM,eAAe,oBAAoB,KAAK,KAAK;AACnD,QAAM,MAAMI,SAAQ,KAAK,OAAO,QAAQ,IAAI,CAAC;AAC7C,QAAM,SAAS,aAAa;AAAA,IAAI,CAAC,UAC/B,WAAW,OAAO;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB,KAAK;AAAA,IACxB,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,iBAAiB;AAAA,IACjB;AAAA,EACF;AACF;AAEA,SAAS,WACP,OACA,SAWkB;AAClB,QAAM,WAAW,YAAY,KAAK;AAClC,QAAM,iBAAiB,sBAAsB,OAAO,QAAQ,OAAO,QAAQ,GAAG;AAE9E,QAAM,MAAM,QAAQ,YAChB,QAAQ,YAAY,IACpB,aAAa,OAAO,OAAO;AAC/B,QAAM,QAAQ,QAAQ,UAClB,QAAQ,UAAU,IAClB,eAAe,OAAO;AAAA,IACpB,YAAY;AAAA,IACZ,QAAQ,QAAQ;AAAA,IAChB,OAAO,QAAQ;AAAA,IACf,gBAAgB,QAAQ;AAAA,IACxB,iBAAiB,QAAQ;AAAA,EAC3B,CAAC;AAEL,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB,QAAQ,UAAU,OAAO;AAAA,EAC7C;AACF;AAEA,SAAS,aACP,OACA,SAMiB;AACjB,MAAI,UAAU,SAAS;AACrB,QAAI,CAAC,WAAW,OAAO,EAAG,QAAO,QAAQ,yBAAyB;AAClE,QAAI,QAAQ,UAAU,WAAW;AAC/B,aAAO,QAAQ,qDAAqD;AAAA,IACtE;AACA,QAAI,QAAQ,QAAQ;AAClB,aAAO,GAAG,yCAAyC;AAAA,IACrD;AACA,WAAO,QAAQ,QAAQ,SAAS,CAAC,OAAO,UAAU,QAAQ,CAAC;AAC3D,YAAQ,OAAO,SAAS,CAAC,OAAO,OAAO,UAAU,MAAM,QAAQ,MAAM,iBAAiB,QAAQ,MAAM,cAAc,CAAC;AACnH,WAAO,GAAG,oCAAoC;AAAA,EAChD;AAEA,MAAI,CAAC,WAAW,QAAQ,EAAG,QAAO,QAAQ,0BAA0B;AACpE,QAAM,cAAc,QAAQ,UAAU,YAAY,YAAY;AAC9D,MAAI,QAAQ,QAAQ;AAClB,WAAO,GAAG,mBAAmB,WAAW,oBAAoB;AAAA,EAC9D;AACA,SAAO,QAAQ,QAAQ,UAAU,CAAC,OAAO,UAAU,UAAU,MAAM,WAAW,CAAC;AAC/E,UAAQ,OAAO,UAAU,CAAC,OAAO,OAAO,MAAM,aAAa,UAAU,QAAQ,MAAM,iBAAiB,QAAQ,MAAM,cAAc,CAAC;AACjI,SAAO,GAAG,cAAc,WAAW,oBAAoB;AACzD;AAEA,SAAS,eACP,OACA,SAOiB;AACjB,MAAI,QAAQ,QAAQ;AAClB,WAAO;AAAA,MACL,QAAQ,iBACJ,2BAA2B,QAAQ,UAAU,KAC7C,4BAA4B,QAAQ,UAAU,GAAG,QAAQ,oBAAoB,QAAQ,gCAAgC,EAAE;AAAA,IAC7H;AAAA,EACF;AAEA,QAAM,iBAAiB,UAAU,UAC7BH,MAAKC,SAAQ,QAAQ,UAAU,GAAG,YAAY,IAC9C;AAEJ,QAAM,SAAS,UAAU,gBACpB,QAAQ,iBACL,yBAAyB,EAAE,YAAY,QAAQ,WAAW,CAAC,IAC3D,uBAAuB;AAAA,IACrB,YAAY,QAAQ;AAAA,IACpB,SAAS,QAAQ,MAAM;AAAA,IACvB,UAAU,QAAQ,MAAM;AAAA,IACxB,iBAAiB,QAAQ;AAAA,EAC3B,CAAC,IACJ,QAAQ,iBACL,oBAAoB,EAAE,YAAY,QAAQ,YAAY,WAAW,eAAe,CAAC,IACjF,kBAAkB;AAAA,IAChB,YAAY,QAAQ;AAAA,IACpB,WAAW;AAAA,IACX,SAAS,QAAQ,MAAM;AAAA,IACvB,UAAU,QAAQ,MAAM;AAAA,IACxB,iBAAiB,QAAQ;AAAA,EAC3B,CAAC;AAET,SAAO;AAAA,IACL,SAAS;AAAA,IACT,IAAI,OAAO;AAAA,IACX,SAAS,OAAO;AAAA,EAClB;AACF;AAEA,SAAS,oBAAoB,QAAmC;AAC9D,MAAI,UAAU,OAAO,SAAS,GAAG;AAC/B,WAAO,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC;AAAA,EAC5B;AAEA,QAAM,WAAwB,CAAC;AAC/B,MAAI,YAAY,OAAO,EAAG,UAAS,KAAK,OAAO;AAC/C,MAAI,YAAY,aAAa,EAAG,UAAS,KAAK,aAAa;AAC3D,SAAO;AACT;AAEA,SAAS,YAAY,OAA2B;AAC9C,MAAI,UAAU,SAAS;AACrB,WAAO,WAAW,OAAO,KAAKF,YAAWC,MAAK,mBAAmB,GAAG,UAAU,aAAa,CAAC;AAAA,EAC9F;AACA,SAAO,WAAW,QAAQ,KAAKD,YAAWC,MAAK,mBAAmB,GAAG,WAAW,eAAe,CAAC;AAClG;AAEA,SAAS,sBAAsB,OAAkB,OAAmB,KAAqB;AACvF,MAAI,UAAU,WAAW;AACvB,WAAO,UAAU,UACbA,MAAK,KAAK,UAAU,aAAa,IACjCA,MAAK,KAAK,WAAW,eAAe;AAAA,EAC1C;AAEA,SAAO,UAAU,UACbA,MAAK,mBAAmB,GAAG,UAAU,aAAa,IAClDA,MAAK,mBAAmB,GAAG,WAAW,eAAe;AAC3D;AAEA,SAAS,cAAc,SAAiB,MAAgB;AACtD,EAAAI,cAAa,SAAS,MAAM,UAAU,CAAC;AACzC;AAEA,SAAS,OAAO,QAAuB,SAAiB,MAAgB;AACtE,MAAI;AACF,WAAO,SAAS,IAAI;AAAA,EACtB,QAAQ;AACN;AAAA,EACF;AACF;AAEA,SAAS,YAAY;AACnB,SAAO;AAAA,IACL,OAAO;AAAA,EACT;AACF;AAEA,SAAS,GAAG,SAAkC;AAC5C,SAAO,EAAE,SAAS,MAAM,IAAI,MAAM,QAAQ;AAC5C;AAEA,SAAS,QAAQ,SAAkC;AACjD,SAAO,EAAE,SAAS,OAAO,IAAI,OAAO,QAAQ;AAC9C;;;AF3SA,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;;;AM7C9B,SAAS,cAAAC,aAAY,gBAAAC,qBAAoB;AACzC,SAAS,QAAAC,aAAY;AACrB,OAAO,cAAc;;;ACFrB,SAAS,cAAAC,aAAY,aAAAC,YAAW,QAAQ,iBAAAC,sBAAqB;AAC7D,SAAS,WAAAC,gBAAe;AACxB,SAAS,WAAAC,UAAS,QAAAC,OAAM,WAAAC,gBAAe;AACvC,SAAS,gBAAAC,qBAAoB;AAE7B,IAAM,gBAAgB;AAuBf,SAAS,mBAAmB,OAAuB,CAAC,GAAkB;AAC3E,eAAa;AAEb,QAAM,MAAM,cAAc,IAAI;AAC9B,EAAAN,WAAUG,SAAQ,IAAI,SAAS,GAAG,EAAE,WAAW,KAAK,CAAC;AACrD,EAAAH,WAAUG,SAAQ,IAAI,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAEtD,EAAAF,eAAc,IAAI,WAAW,YAAY,GAAG,CAAC;AAE7C,EAAAM,QAAO,aAAa,CAAC,WAAW,aAAa,GAAG,IAAI,SAAS,CAAC;AAC9D,EAAAD,cAAa,aAAa,CAAC,aAAa,aAAa,GAAG,IAAI,SAAS,GAAGE,WAAU,CAAC;AACnF,EAAAF,cAAa,aAAa,CAAC,UAAU,GAAG,aAAa,CAAC,IAAI,IAAI,KAAK,EAAE,GAAGE,WAAU,CAAC;AACnF,EAAAF,cAAa,aAAa,CAAC,aAAa,MAAM,GAAG,aAAa,CAAC,IAAI,IAAI,KAAK,EAAE,GAAGE,WAAU,CAAC;AAE5F,SAAO,qBAAqB,IAAI,KAAK;AACvC;AAEO,SAAS,qBAAqB,QAAQ,eAA8B;AACzE,eAAa;AAEb,QAAM,MAAM,cAAc,EAAE,MAAM,CAAC;AACnC,EAAAD,QAAO,aAAa,CAAC,WAAW,aAAa,GAAG,IAAI,SAAS,CAAC;AAC9D,EAAAA,QAAO,aAAa,CAAC,WAAW,GAAG,aAAa,CAAC,IAAI,IAAI,KAAK,EAAE,CAAC;AACjE,SAAO,IAAI,WAAW,EAAE,OAAO,KAAK,CAAC;AAErC,SAAO,qBAAqB,IAAI,KAAK;AACvC;AAEO,SAAS,iBAAiB,QAAQ,eAA8B;AACrE,eAAa;AACb,QAAM,MAAM,cAAc,EAAE,MAAM,CAAC;AACnC,MAAI,CAAC,OAAO,IAAI,SAAS,GAAG;AAC1B,UAAM,IAAI,MAAM,8BAA8B,IAAI,SAAS,EAAE;AAAA,EAC/D;AACA,EAAAD,cAAa,aAAa,CAAC,UAAU,GAAG,aAAa,CAAC,IAAI,IAAI,KAAK,EAAE,GAAGE,WAAU,CAAC;AACnF,EAAAD,QAAO,aAAa,CAAC,aAAa,aAAa,GAAG,IAAI,SAAS,CAAC;AAChE,EAAAD,cAAa,aAAa,CAAC,aAAa,MAAM,GAAG,aAAa,CAAC,IAAI,IAAI,KAAK,EAAE,GAAGE,WAAU,CAAC;AAC5F,SAAO,qBAAqB,IAAI,KAAK;AACvC;AAEO,SAAS,gBAAgB,QAAQ,eAA8B;AACpE,eAAa;AACb,QAAM,MAAM,cAAc,EAAE,MAAM,CAAC;AACnC,MAAI,OAAO,IAAI,SAAS,GAAG;AACzB,IAAAD,QAAO,aAAa,CAAC,WAAW,aAAa,GAAG,IAAI,SAAS,CAAC;AAAA,EAChE;AACA,SAAO,qBAAqB,IAAI,KAAK;AACvC;AAEO,SAAS,qBAAqB,QAAQ,eAA8B;AACzE,eAAa;AAEb,QAAM,MAAM,cAAc,EAAE,MAAM,CAAC;AACnC,QAAM,YAAY,OAAO,IAAI,SAAS;AACtC,QAAM,SAAS,UAAU,aAAa,CAAC,SAAS,GAAG,aAAa,CAAC,IAAI,IAAI,KAAK,EAAE,CAAC;AAEjF,SAAO;AAAA,IACL,OAAO,IAAI;AAAA,IACX,WAAW,IAAI;AAAA,IACf;AAAA,IACA,QAAQ,OAAO;AAAA,IACf,OAAO,OAAO,KAAK,aAAa,OAAO,MAAM,IAAI;AAAA,EACnD;AACF;AAEO,SAAS,mBAAmB,QAAQ,eAAuB;AAChE,eAAa;AAEb,QAAM,MAAM,cAAc,EAAE,MAAM,CAAC;AACnC,QAAM,SAAS,qBAAqB,KAAK;AACzC,QAAM,YAAY,oBAAoB,IAAI,SAAS;AACnD,QAAM,QAAQ;AAAA,IACZ,eAAe,OAAO,KAAK;AAAA,IAC3B,eAAe,IAAI,SAAS;AAAA,IAC5B,eAAe,OAAO,YAAY,QAAQ,IAAI;AAAA,IAC9C,eAAe,OAAO,SAAS,QAAQ,IAAI;AAAA,EAC7C;AAEA,MAAI,OAAO,OAAO;AAChB,UAAM,KAAK,eAAe,OAAO,KAAK,EAAE;AAAA,EAC1C;AAEA,QAAM,KAAK,eAAe,WAAW,QAAQ,IAAI,IAAI,EAAE;AACvD,QAAM,KAAK,eAAe,WAAW,WAAW,IAAI,OAAO,EAAE;AAC7D,MAAI,WAAW,aAAa,IAAI,WAAW;AACzC,UAAM,KAAK,eAAe,WAAW,aAAa,IAAI,SAAS,EAAE;AAAA,EACnE;AACA,MAAI,WAAW,qBAAqB,IAAI,mBAAmB;AACzD,UAAM,KAAK,eAAe,WAAW,qBAAqB,IAAI,iBAAiB,EAAE;AAAA,EACnF;AACA,MAAI,WAAW,iBAAiB,IAAI,eAAe;AACjD,UAAM,KAAK,eAAe,WAAW,iBAAiB,IAAI,aAAa,EAAE;AAAA,EAC3E;AACA,MAAI,WAAW,sBAAsB,IAAI,oBAAoB;AAC3D,UAAM,KAAK,eAAe,WAAW,sBAAsB,IAAI,kBAAkB,EAAE;AAAA,EACrF;AACA,QAAM,KAAK,eAAe,WAAW,YAAY,IAAI,QAAQ,EAAE;AAC/D,QAAM,KAAK,eAAe,WAAW,gBAAgB,IAAI,YAAY,EAAE;AACvE,QAAM,KAAK,eAAe,WAAW,8BAA8B,IAAI,0BAA0B,GAAG;AACpG,QAAM,KAAK,eAAe,WAAW,cAAc,IAAI,UAAU,EAAE;AACnE,QAAM,KAAK,eAAe,WAAW,cAAc,IAAI,UAAU,EAAE;AAEnE,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,cAAc,MAAsB;AAC3C,QAAM,QAAQ,KAAK,SAAS;AAC5B,QAAM,OAAOL,SAAQ;AACrB,QAAM,OAAO,KAAK,QAAQ,SAAS,QAAQ,IAAI,eAAe,QAAQ,EAAE;AACxE,QAAM,6BACJ,KAAK,8BACL,SAAS,QAAQ,IAAI,uCAAuC,OAAO,EAAE;AACvE,QAAM,UAAUG;AAAA,IACd,KAAK,WACH,QAAQ,IAAI,mBACZD,MAAK,MAAM,SAAS;AAAA,EACxB;AACA,QAAM,WAAWC,SAAQ,KAAK,YAAY,QAAQ,QAAQ;AAC1D,QAAM,eAAeA;AAAA,IACnB,KAAK,gBAAgBD,MAAK,QAAQ,IAAI,GAAG,QAAQ,WAAW;AAAA,EAC9D;AACA,QAAM,YAAYA,MAAK,MAAM,WAAW,gBAAgB,GAAG,KAAK,QAAQ;AACxE,QAAM,SAASA,MAAK,SAAS,MAAM;AAEnC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAYA,MAAK,QAAQ,mBAAmB;AAAA,IAC5C,YAAYA,MAAK,QAAQ,mBAAmB;AAAA,IAC5C,WAAW,KAAK,aAAa,QAAQ,IAAI;AAAA,IACzC,mBAAmB,KAAK,qBAAqB,QAAQ,IAAI;AAAA,IACzD,eAAe,KAAK,iBAAiB,QAAQ,IAAI;AAAA,IACjD,oBAAoB,KAAK,sBAAsB,QAAQ,IAAI;AAAA,EAC7D;AACF;AAEA,SAAS,YAAY,KAA+C;AAClE,QAAM,MAAM;AAAA,IACV,aAAa,OAAO,IAAI,IAAI;AAAA,IAC5B,qCAAqC,OAAO,IAAI,0BAA0B;AAAA,IAC1E,iBAAiB,IAAI;AAAA,IACrB,MAAM,QAAQ,IAAI,QAAQ;AAAA,IAC1B,GAAI,IAAI,YAAY,EAAE,mBAAmB,IAAI,UAAU,IAAI,CAAC;AAAA,IAC5D,GAAI,IAAI,oBAAoB,EAAE,2BAA2B,IAAI,kBAAkB,IAAI,CAAC;AAAA,IACpF,GAAI,IAAI,gBAAgB,EAAE,uBAAuB,IAAI,cAAc,IAAI,CAAC;AAAA,IACxE,GAAI,IAAI,qBAAqB,EAAE,4BAA4B,IAAI,mBAAmB,IAAI,CAAC;AAAA,EACzF;AAEA,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA,YAKG,UAAU,IAAI,KAAK,CAAC;AAAA;AAAA;AAAA,cAGlB,UAAU,IAAI,QAAQ,CAAC;AAAA,cACvB,UAAU,IAAI,YAAY,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,cAK3B,UAAU,IAAI,IAAI,CAAC;AAAA;AAAA,cAEnB,UAAU,IAAI,WAAW,CAAC;AAAA;AAAA,cAE1B,UAAU,IAAI,mCAAmC,CAAC;AAAA;AAAA,cAElD,UAAU,IAAI,eAAe,CAAC;AAAA,EAC1C,IAAI,oBAAoB;AAAA,cACZ,UAAU,IAAI,iBAAiB,CAAC;AAAA,IAC1C,EAAE,GAAG,IAAI,4BAA4B;AAAA,cAC3B,UAAU,IAAI,yBAAyB,CAAC;AAAA,IAClD,EAAE,GAAG,IAAI,wBAAwB;AAAA,cACvB,UAAU,IAAI,qBAAqB,CAAC;AAAA,IAC9C,EAAE,GAAG,IAAI,6BAA6B;AAAA,cAC5B,UAAU,IAAI,0BAA0B,CAAC;AAAA,IACnD,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAMM,UAAU,QAAQ,IAAI,CAAC,CAAC;AAAA;AAAA,YAExB,UAAU,IAAI,UAAU,CAAC;AAAA;AAAA,YAEzB,UAAU,IAAI,UAAU,CAAC;AAAA;AAAA;AAAA;AAIrC;AAEA,SAAS,eAAuB;AAC9B,QAAM,MAAM,QAAQ,SAAS;AAC7B,MAAI,OAAO,MAAM;AACf,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AACA,SAAO,OAAO,GAAG;AACnB;AAEA,SAAS,aAAa,QAAoC;AACxD,QAAM,OAAO,OAAO,MAAM,IAAI,EAAE,KAAK,CAAC,SAAS,KAAK,KAAK,EAAE,WAAW,UAAU,CAAC;AACjF,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,KAAK,MAAM,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,EAAE,KAAK;AACjD;AAEA,SAASG,QAAO,KAAa,MAAgB;AAC3C,MAAI;AACF,IAAAD,cAAa,KAAK,MAAME,WAAU,CAAC;AAAA,EACrC,QAAQ;AACN;AAAA,EACF;AACF;AAEA,SAAS,UAAU,KAAa,MAAgB;AAC9C,MAAI;AACF,UAAM,SAASF,cAAa,KAAK,MAAM;AAAA,MACrC,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,IAClC,CAAC;AACD,WAAO,EAAE,IAAI,MAAM,OAAO;AAAA,EAC5B,SAAS,OAAY;AACnB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QAAQ,OAAO,OAAO,UAAU,OAAO,UAAU,OAAO,WAAW,EAAE;AAAA,IACvE;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,WAYpB;AACP,MAAI,CAAC,OAAO,SAAS,EAAG,QAAO;AAE/B,MAAI;AACF,UAAM,MAAMA,cAAa,UAAU,CAAC,YAAY,QAAQ,MAAM,KAAK,SAAS,GAAG;AAAA,MAC7E,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,IAClC,CAAC;AACD,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,WAAO;AAAA,MACL,UAAU,QAAQ,mBAAmB,CAAC;AAAA,MACtC,cAAc,QAAQ,mBAAmB,CAAC;AAAA,MAC1C,MAAM,QAAQ,sBAAsB;AAAA,MACpC,4BAA4B,QAAQ,sBAAsB;AAAA,MAC1D,SAAS,QAAQ,sBAAsB;AAAA,MACvC,WAAW,QAAQ,sBAAsB;AAAA,MACzC,mBAAmB,QAAQ,sBAAsB;AAAA,MACjD,eAAe,QAAQ,sBAAsB;AAAA,MAC7C,oBAAoB,QAAQ,sBAAsB;AAAA,MAClD,YAAY,QAAQ;AAAA,MACpB,YAAY,QAAQ;AAAA,IACtB;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAASE,aAAY;AACnB,SAAO;AAAA,IACL,OAAO;AAAA,EACT;AACF;AAEA,SAAS,OAAO,MAAuB;AACrC,SAAOT,YAAW,IAAI;AACxB;AAEA,SAAS,UAAU,OAAuB;AACxC,SAAO,MACJ,WAAW,KAAK,OAAO,EACvB,WAAW,KAAK,MAAM,EACtB,WAAW,KAAK,MAAM,EACtB,WAAW,KAAK,QAAQ,EACxB,WAAW,KAAK,QAAQ;AAC7B;AAEA,SAAS,eAAe;AACtB,MAAI,QAAQ,aAAa,UAAU;AACjC,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AACF;;;ACrUA,SAAS,cAAAU,aAAY,aAAAC,YAAW,gBAAAC,eAAc,UAAAC,SAAQ,iBAAAC,sBAAqB;AAC3E,SAAS,WAAAC,gBAAe;AACxB,SAAS,WAAAC,UAAS,QAAAC,OAAM,WAAAC,gBAAe;AACvC,SAAS,iBAAAC,sBAAqB;AAC9B,SAAS,gBAAAC,qBAAoB;AAE7B,IAAMC,iBAAgB;AAuBf,SAAS,mBAAmB,OAAuB,CAAC,GAAkB;AAC3E,cAAY;AAEZ,QAAM,MAAMC,eAAc,IAAI;AAC9B,EAAAX,WAAUK,SAAQ,IAAI,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AACpD,EAAAL,WAAU,IAAI,QAAQ,EAAE,WAAW,KAAK,CAAC;AAEzC,EAAAG,eAAc,IAAI,UAAU,WAAW,GAAG,CAAC;AAE3C,YAAU,CAAC,UAAU,eAAe,CAAC;AACrC,YAAU,CAAC,UAAU,UAAU,SAAS,GAAG,IAAI,KAAK,UAAU,CAAC;AAE/D,SAAO,iBAAiB,IAAI,KAAK;AACnC;AAEO,SAAS,qBAAqB,QAAQO,gBAA8B;AACzE,cAAY;AAEZ,QAAM,MAAMC,eAAc,EAAE,MAAM,CAAC;AACnC,eAAa,CAAC,UAAU,WAAW,SAAS,GAAG,IAAI,KAAK,UAAU,CAAC;AACnE,EAAAT,QAAO,IAAI,UAAU,EAAE,OAAO,KAAK,CAAC;AACpC,eAAa,CAAC,UAAU,eAAe,CAAC;AAExC,SAAO,iBAAiB,IAAI,KAAK;AACnC;AAEO,SAAS,iBAAiB,QAAQQ,gBAA8B;AACrE,cAAY;AACZ,QAAM,MAAMC,eAAc,EAAE,MAAM,CAAC;AACnC,MAAI,CAACZ,YAAW,IAAI,QAAQ,GAAG;AAC7B,UAAM,IAAI,MAAM,+BAA+B,IAAI,QAAQ,EAAE;AAAA,EAC/D;AACA,YAAU,CAAC,UAAU,SAAS,GAAG,IAAI,KAAK,UAAU,CAAC;AACrD,SAAO,iBAAiB,IAAI,KAAK;AACnC;AAEO,SAAS,gBAAgB,QAAQW,gBAA8B;AACpE,cAAY;AACZ,QAAM,MAAMC,eAAc,EAAE,MAAM,CAAC;AACnC,MAAIZ,YAAW,IAAI,QAAQ,GAAG;AAC5B,iBAAa,CAAC,UAAU,QAAQ,GAAG,IAAI,KAAK,UAAU,CAAC;AAAA,EACzD;AACA,SAAO,iBAAiB,IAAI,KAAK;AACnC;AAEO,SAAS,iBAAiB,QAAQW,gBAA8B;AACrE,cAAY;AAEZ,QAAM,MAAMC,eAAc,EAAE,MAAM,CAAC;AACnC,QAAM,YAAYZ,YAAW,IAAI,QAAQ;AACzC,QAAM,SAAS,mBAAmB,CAAC,UAAU,aAAa,GAAG,IAAI,KAAK,UAAU,CAAC;AACjF,QAAM,SAAS,OAAO,MAAM,OAAO,OAAO,KAAK,MAAM;AACrD,QAAM,QAAQ,OAAO,OAAO,KAAK,KAAK;AAEtC,SAAO;AAAA,IACL,OAAO,IAAI;AAAA,IACX,UAAU,IAAI;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,eAAe,QAAQW,gBAAuB;AAC5D,cAAY;AAEZ,QAAM,MAAMC,eAAc,EAAE,MAAM,CAAC;AACnC,QAAM,SAAS,iBAAiB,KAAK;AACrC,QAAM,YAAYC,qBAAoB,IAAI,QAAQ;AAClD,QAAM,QAAQ;AAAA,IACZ,eAAe,OAAO,KAAK;AAAA,IAC3B,eAAe,IAAI,QAAQ;AAAA,IAC3B,eAAe,OAAO,YAAY,QAAQ,IAAI;AAAA,IAC9C,eAAe,OAAO,SAAS,QAAQ,IAAI;AAAA,EAC7C;AACA,MAAI,OAAO,MAAO,OAAM,KAAK,eAAe,OAAO,KAAK,EAAE;AAC1D,QAAM,KAAK,eAAe,WAAW,QAAQ,IAAI,IAAI,EAAE;AACvD,QAAM,KAAK,eAAe,WAAW,WAAW,IAAI,OAAO,EAAE;AAC7D,MAAI,WAAW,aAAa,IAAI,WAAW;AACzC,UAAM,KAAK,eAAe,WAAW,aAAa,IAAI,SAAS,EAAE;AAAA,EACnE;AACA,MAAI,WAAW,qBAAqB,IAAI,mBAAmB;AACzD,UAAM,KAAK,eAAe,WAAW,qBAAqB,IAAI,iBAAiB,EAAE;AAAA,EACnF;AACA,MAAI,WAAW,iBAAiB,IAAI,eAAe;AACjD,UAAM,KAAK,eAAe,WAAW,iBAAiB,IAAI,aAAa,EAAE;AAAA,EAC3E;AACA,MAAI,WAAW,sBAAsB,IAAI,oBAAoB;AAC3D,UAAM,KAAK,eAAe,WAAW,sBAAsB,IAAI,kBAAkB,EAAE;AAAA,EACrF;AACA,QAAM,KAAK,eAAe,WAAW,YAAY,IAAI,QAAQ,EAAE;AAC/D,QAAM,KAAK,eAAe,WAAW,gBAAgB,IAAI,YAAY,EAAE;AACvE,QAAM,KAAK,eAAe,WAAW,8BAA8B,IAAI,0BAA0B,GAAG;AACpG,QAAM,KAAK,oCAAoC,IAAI,KAAK,UAAU;AAElE,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAASD,eAAc,MAAsB;AAC3C,QAAM,QAAQ,KAAK,SAASD;AAC5B,QAAM,OAAON,SAAQ;AACrB,QAAM,OAAO,KAAK,QAAQ,SAAS,QAAQ,IAAI,eAAe,QAAQ,EAAE;AACxE,QAAM,6BACJ,KAAK,8BACL,SAAS,QAAQ,IAAI,uCAAuC,OAAO,EAAE;AACvE,QAAM,UAAUG;AAAA,IACd,KAAK,WAAW,QAAQ,IAAI,mBAAmBD,MAAK,MAAM,SAAS;AAAA,EACrE;AACA,QAAM,WAAWC,SAAQ,KAAK,YAAY,QAAQ,QAAQ;AAC1D,QAAM,eAAeA;AAAA,IACnB,KAAK,gBAAgB,oBAAoB;AAAA,EAC3C;AACA,QAAM,aAAa,QAAQ,IAAI,mBAAmBD,MAAK,MAAM,SAAS;AACtE,QAAM,WAAWA,MAAK,YAAY,WAAW,QAAQ,GAAG,KAAK,UAAU;AACvE,QAAM,SAASA,MAAK,SAAS,MAAM;AAEnC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,KAAK,aAAa,QAAQ,IAAI;AAAA,IACzC,mBAAmB,KAAK,qBAAqB,QAAQ,IAAI;AAAA,IACzD,eAAe,KAAK,iBAAiB,QAAQ,IAAI;AAAA,IACjD,oBAAoB,KAAK,sBAAsB,QAAQ,IAAI;AAAA,EAC7D;AACF;AAEA,SAAS,sBAA8B;AAErC,QAAM,OAAOD,SAAQG,eAAc,YAAY,GAAG,CAAC;AACnD,SAAOF,MAAK,MAAM,WAAW;AAC/B;AAEA,SAAS,WAAW,KAA+C;AACjE,QAAM,WAAW;AAAA,IACf,oBAAoB,QAAQ,IAAI,QAAQ,8BAA8B;AAAA,IACtE,2BAA2B,IAAI,IAAI;AAAA,IACnC,mDAAmD,IAAI,0BAA0B;AAAA,IACjF,+BAA+B,IAAI,OAAO;AAAA,EAC5C;AACA,MAAI,IAAI,UAAW,UAAS,KAAK,iCAAiC,IAAI,SAAS,EAAE;AACjF,MAAI,IAAI,kBAAmB,UAAS,KAAK,yCAAyC,IAAI,iBAAiB,EAAE;AACzG,MAAI,IAAI,cAAe,UAAS,KAAK,qCAAqC,IAAI,aAAa,EAAE;AAC7F,MAAI,IAAI,mBAAoB,UAAS,KAAK,0CAA0C,IAAI,kBAAkB,EAAE;AAE5G,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAMG,IAAI,QAAQ,IAAI,IAAI,YAAY;AAAA;AAAA;AAAA,EAG1C,SAAS,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAKrB;AAEA,SAASM,qBAAoB,UAUpB;AACP,MAAI,CAACb,YAAW,QAAQ,EAAG,QAAO;AAClC,MAAI;AACF,UAAM,MAAME,cAAa,UAAU,MAAM;AACzC,UAAM,OAAO,IAAI,MAAM,mBAAmB,IAAI,CAAC,GAAG,KAAK,EAAE,MAAM,KAAK;AACpE,UAAM,MAA8B,CAAC;AACrC,eAAW,KAAK,IAAI,SAAS,8BAA8B,GAAG;AAC5D,UAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAAA,IACjB;AACA,WAAO;AAAA,MACL,UAAU,OAAO,CAAC;AAAA,MAClB,cAAc,OAAO,CAAC;AAAA,MACtB,MAAM,IAAI;AAAA,MACV,4BAA4B,IAAI;AAAA,MAChC,SAAS,IAAI;AAAA,MACb,WAAW,IAAI;AAAA,MACf,mBAAmB,IAAI;AAAA,MACvB,eAAe,IAAI;AAAA,MACnB,oBAAoB,IAAI;AAAA,IAC1B;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,UAAU,MAAgB;AACjC,EAAAQ,cAAa,aAAa,MAAM,EAAE,OAAO,OAAO,CAAC;AACnD;AAEA,SAAS,aAAa,MAAgB;AACpC,MAAI;AACF,IAAAA,cAAa,aAAa,MAAM,EAAE,OAAO,OAAO,CAAC;AAAA,EACnD,QAAQ;AACN;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,MAAgB;AAC1C,MAAI;AACF,UAAM,SAASA,cAAa,aAAa,MAAM;AAAA,MAC7C,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,IAClC,CAAC;AACD,WAAO,EAAE,IAAI,MAAM,OAAO;AAAA,EAC5B,SAAS,OAAY;AACnB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QAAQ,OAAO,OAAO,UAAU,OAAO,UAAU,OAAO,WAAW,EAAE;AAAA,IACvE;AAAA,EACF;AACF;AAEA,SAAS,cAAc;AACrB,MAAI,QAAQ,aAAa,SAAS;AAChC,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AACF;;;AFtMO,SAAS,kBAAgC;AAC9C,QAAM,SAAS,UAAU;AACzB,QAAM,UAAU,QAAQ,aAAa,YAChC,MAAM;AACL,QAAI;AACF,YAAM,SAAS,qBAAqB;AACpC,aAAO;AAAA,QACL,WAAW,OAAO;AAAA,QAClB,QAAQ,OAAO;AAAA,QACf,OAAO,OAAO;AAAA,MAChB;AAAA,IACF,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,GAAG,IACH;AAEJ,QAAM,UAAU,QAAQ,aAAa,WAChC,MAAM;AACL,QAAI;AACF,YAAM,SAAS,iBAAiB;AAChC,aAAO;AAAA,QACL,WAAW,OAAO;AAAA,QAClB,QAAQ,OAAO;AAAA,QACf,OAAO,OAAO;AAAA,MAChB;AAAA,IACF,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,GAAG,IACH;AAEJ,QAAM,SAAS,qBAAqB;AACpC,SAAO;AAAA,IACL,SAAS;AAAA,IACT,iBAAiB,iBAAiB,MAAM;AAAA,IACxC,mBAAmB;AAAA,IACnB,YAAY,sBAAsB;AAAA,IAClC;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,qBAAqB,MAAM;AAAA,IACpC,SAAS,kBAAkB,MAAM;AAAA,IACjC,YAAY,qBAAqB,MAAM;AAAA,EACzC;AACF;AAEA,SAAS,qBAAqB,QAAyC;AACrE,MAAI,CAACI,YAAW,MAAM,EAAG,QAAO;AAChC,MAAI,SAAmC;AACvC,MAAI;AACF,aAAS,IAAI,SAAS,QAAQ,EAAE,UAAU,MAAM,eAAe,KAAK,CAAC;AACrE,UAAM,SAAS,OAAO;AAAA,MACpB;AAAA,IACF,EAAE,IAAI;AACN,UAAM,QAAQ,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAE/C,QAAI,YAAsB,CAAC;AAC3B,QAAI;AAGF,YAAM,EAAE,sBAAsB,IAAI;AAClC,kBAAY,CAAC,aAAa,gBAAgB,QAAQ,EAAE;AAAA,QAAO,CAAC,MAC1D,sBAAsB,CAAC;AAAA,MACzB;AAAA,IACF,QAAQ;AACN,kBAAY,CAAC;AAAA,IACf;AAEA,UAAM,UAAkC,CAAC;AACzC,QAAI,MAAM,IAAI,0BAA0B,GAAG;AACzC,YAAM,OAAO,OAAO;AAAA,QAClB;AAAA,MACF,EAAE,IAAI;AACN,iBAAW,KAAK,KAAM,SAAQ,EAAE,IAAI,IAAI,EAAE;AAAA,IAC5C;AAEA,QAAI,SAAwB;AAC5B,QAAI,SAAgC;AACpC,QAAI,MAAM,IAAI,WAAW,GAAG;AAC1B,YAAM,MAAM,OAAO;AAAA,QACjB;AAAA,MACF,EAAE,IAAI;AACN,UAAI,KAAK;AACP,iBAAS,IAAI;AACb,iBAAS,IAAI,KAAK,OAAO;AAAA,MAC3B;AAAA,IACF;AAEA,WAAO;AAAA,MACL,sBAAsB;AAAA,MACtB,eAAe;AAAA,MACf,kBAAkB;AAAA,MAClB,uBAAuB;AAAA,IACzB;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT,UAAE;AACA,YAAQ,MAAM;AAAA,EAChB;AACF;AAEA,SAAS,kBAAkB,QAAsC;AAC/D,MAAI,CAACA,YAAW,MAAM,EAAG,QAAO;AAChC,MAAI,SAAmC;AACvC,MAAI;AACF,aAAS,IAAI,SAAS,QAAQ,EAAE,UAAU,MAAM,eAAe,KAAK,CAAC;AAErE,UAAM,SAAS,OAAO;AAAA,MACpB;AAAA,IACF,EAAE,IAAI;AACN,UAAM,QAAQ,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAC/C,QAAI,CAAC,MAAM,IAAI,yBAAyB,EAAG,QAAO;AAElD,UAAM,SAAS,OAAO;AAAA,MACpB;AAAA,IACF,EAAE,IAAI;AAEN,QAAI,YAA2B;AAC/B,UAAM,UAAkC,CAAC;AACzC,QAAI,OAAO,SAAS;AAClB,YAAM,UAAU,OAAO;AAAA,QACrB;AAAA,MACF,EAAE,IAAI,OAAO,OAAO;AACpB,kBAAY,SAAS,UAAU;AAC/B,UAAI,WAAW;AACb,cAAM,OAAO,OAAO;AAAA,UAClB;AAAA,QACF,EAAE,IAAI,SAAS;AACf,mBAAW,KAAK,KAAM,SAAQ,EAAE,MAAM,IAAI,EAAE;AAAA,MAC9C;AAAA,IACF;AAEA,QAAI,UAAU;AACd,QAAI,MAAM,IAAI,UAAU,GAAG;AACzB,YAAM,MAAM,OAAO;AAAA,QACjB;AAAA,MACF,EAAE,IAAI;AACN,gBAAU,IAAI;AAAA,IAChB;AAEA,QAAI,eAA8B;AAClC,QAAI,qBAAqB;AACzB,QAAI,MAAM,IAAI,mBAAmB,GAAG;AAClC,YAAM,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAU,EAAE,YAAY;AACjE,YAAM,OAAO,OAAO;AAAA,QAClB;AAAA,MACF,EAAE,IAAI,KAAK;AACX,UAAI,WAAW;AACf,iBAAW,KAAK,MAAM;AACpB,YAAI,CAAC,EAAE,QAAS;AAChB,8BAAsB,EAAE;AACxB,YAAI,EAAE,YAAY,WAAY,aAAY,EAAE;AAAA,MAC9C;AACA,qBAAe,qBAAqB,IAAI,WAAW,qBAAqB;AAAA,IAC1E;AAEA,WAAO;AAAA,MACL,aAAa;AAAA,MACb,aAAa,OAAO;AAAA,MACpB,kBAAkB;AAAA,MAClB,YAAY,OAAO;AAAA,MACnB,+BAA+B;AAAA,MAC/B,wBAAwB;AAAA,MACxB,qBAAqB;AAAA,IACvB;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT,UAAE;AACA,YAAQ,MAAM;AAAA,EAChB;AACF;AAEA,SAAS,qBAAqB,QAA2C;AACvE,QAAM,UAAoB,CAAC;AAC3B,aAAW,SAAS,QAAQ;AAC1B,QAAI,CAAC,MAAM,SAAU;AACrB,QAAI,MAAM,sBAAsB;AAC9B,cAAQ;AAAA,QACN,GAAG,MAAM,KAAK;AAAA,MAChB;AACA;AAAA,IACF;AACA,QAAI,MAAM,OAAO,CAAC,MAAM,OAAO;AAC7B,cAAQ;AAAA,QACN,GAAG,MAAM,KAAK;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,WAAW,QAAQ,SAAS,GAAG,QAAQ;AAClD;AAEO,SAAS,qBAAqB,SAAsC;AACzE,QAAM,OAAO,WAAW,mBAAmB;AAC3C,SAAO;AAAA,IACL,yBAAyB,IAAI;AAAA,IAC7B,oBAAoB,IAAI;AAAA,EAC1B;AACF;AAEA,SAAS,yBAAyB,MAAgC;AAChE,QAAMC,cAAaC,MAAK,MAAM,WAAW,eAAe;AACxD,QAAM,WAAWF,YAAWC,WAAU,KAAK,WAAW,QAAQ;AAC9D,QAAM,QAAkB,CAAC;AAEzB,MAAI,MAAM;AACV,MAAI,QAAQ;AAEZ,MAAID,YAAWC,WAAU,GAAG;AAC1B,QAAI;AACF,YAAM,SAAS,KAAK,MAAME,cAAaF,aAAY,OAAO,CAAC;AAC3D,YAAM,QAAQ,QAAQ,YAAY,MAAM;AACxC,YAAM,aAAa,QAAQ,SAAS,CAAC;AACrC,cAAQ,OAAO,OAAO,UAAU,EAAE;AAAA,QAAK,CAAC,WACtC,MAAM,QAAQ,MAAM,KACpB,OAAO;AAAA,UAAK,CAAC,UACX,qBAAqB,OAAO,4BAA4B;AAAA,QAC1D;AAAA,MACF;AACA,UAAI,CAAC,IAAK,OAAM,KAAK,kDAAkD;AACvE,UAAI,CAAC,MAAO,OAAM,KAAK,gDAAgD;AAAA,IACzE,SAAS,KAAK;AACZ,YAAM,KAAK,mBAAmBA,WAAU,KAAM,IAAc,OAAO,EAAE;AAAA,IACvE;AAAA,EACF,WAAW,UAAU;AACnB,UAAM,KAAK,+CAA+C;AAAA,EAC5D;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAaA;AAAA,IACb;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,MAAgC;AAC3D,QAAMA,cAAaC,MAAK,MAAM,UAAU,aAAa;AACrD,QAAM,YAAYA,MAAK,MAAM,UAAU,YAAY;AACnD,QAAM,WAAWF,YAAWC,WAAU,KAAK,WAAW,OAAO;AAC7D,QAAM,QAAkB,CAAC;AAEzB,MAAI,MAAM;AACV,MAAI,QAAQ;AACZ,MAAI,uBAAuB;AAE3B,MAAID,YAAWC,WAAU,GAAG;AAC1B,UAAM,MAAME,cAAaF,aAAY,OAAO;AAC5C,UAAM,0BAA0B,KAAK,GAAG;AACxC,UAAM,iBAAiB,gCAAgC,KAAK,GAAG;AAC/D,UAAM,mBACJD,YAAW,SAAS,KAAKG,cAAa,WAAW,OAAO,EAAE,SAAS,sBAAsB;AAC3F,YAAQ,kBAAkB;AAC1B,2BACE,IAAI,SAAS,8BAA8B,KAC3C,IAAI,SAAS,cAAc;AAE7B,QAAI,CAAC,IAAK,OAAM,KAAK,mDAAmD;AACxE,QAAI,sBAAsB;AACxB,YAAM;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,eAAgB,OAAM,KAAK,4CAA4C;AAC5E,QAAI,CAAC,iBAAkB,OAAM,KAAK,kDAAkD;AAAA,EACtF,WAAW,UAAU;AACnB,UAAM,KAAK,4CAA4C;AAAA,EACzD;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAaF;AAAA,IACb,WAAW;AAAA,IACX;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,OAAgB,KAAsB;AAClE,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,QAAS,MAAgC;AAC/C,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO;AAClC,SAAO,MAAM;AAAA,IACX,CAAC,SACC,QACA,OAAO,SAAS,YAChB,OAAQ,KAA+B,YAAY,YAClD,KAA6B,QAAQ,SAAS,GAAG;AAAA,EACtD;AACF;AAEO,SAAS,mBAAmB,QAA8B;AAC/D,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA,cAAc,OAAO,OAAO;AAAA,IAC5B,cAAc,OAAO,eAAe,IAAI,OAAO,iBAAiB;AAAA,EAClE;AAEA,MAAI,OAAO,YAAY;AACrB,UAAM,KAAK,cAAc,OAAO,WAAW,QAAQ,EAAE;AACrD,UAAM,KAAK,cAAc,OAAO,WAAW,KAAK,EAAE;AAClD,UAAM,KAAK,oBAAoB,OAAO,WAAW,gBAAgB,cAAc,OAAO,WAAW,oBAAoB,EAAE;AACvH,UAAM,KAAK,cAAc,OAAO,WAAW,UAAU,MAAM,OAAO,WAAW,UAAU,EAAE;AAAA,EAC3F,OAAO;AACL,UAAM,KAAK,qBAAqB;AAAA,EAClC;AAEA,MAAI,OAAO,SAAS;AAClB,UAAM,KAAK,cAAc,OAAO,QAAQ,YAAY,cAAc,SAAS,MAAM,OAAO,QAAQ,SAAS,WAAW,YAAY,GAAG,OAAO,QAAQ,QAAQ,KAAK,OAAO,QAAQ,KAAK,MAAM,EAAE,EAAE;AAAA,EAC/L;AACA,MAAI,OAAO,SAAS;AAClB,UAAM,KAAK,cAAc,OAAO,QAAQ,YAAY,cAAc,SAAS,MAAM,OAAO,QAAQ,SAAS,WAAW,YAAY,GAAG,OAAO,QAAQ,QAAQ,KAAK,OAAO,QAAQ,KAAK,MAAM,EAAE,EAAE;AAAA,EAC/L;AAEA,QAAM,KAAK,IAAI,WAAW;AAC1B,aAAW,SAAS,OAAO,QAAQ;AACjC,UAAM,QAAQ,MAAM,MAAM,OAAO,EAAE;AACnC,QAAI,CAAC,MAAM,UAAU;AACnB,YAAM,KAAK,GAAG,KAAK,eAAe;AAClC;AAAA,IACF;AACA,UAAM,MAAM,MAAM,MAAM,OAAO;AAC/B,UAAM,QAAQ,MAAM,QAAQ,OAAO;AACnC,UAAM,SAAS,MAAM,uBAAuB,4BAA4B;AACxE,UAAM,KAAK,GAAG,KAAK,QAAQ,GAAG,UAAU,KAAK,GAAG,MAAM,EAAE;AACxD,eAAW,QAAQ,MAAM,OAAO;AAC9B,YAAM,KAAK,kBAAkB,IAAI,EAAE;AAAA,IACrC;AAAA,EACF;AAEA,MAAI,OAAO,SAAS;AAClB,UAAM,KAAK,IAAI,YAAY;AAC3B,QAAI,OAAO,QAAQ,aAAa;AAC9B,YAAM,UAAU,OAAO,QAAQ,OAAO,QAAQ,gBAAgB,EAC3D,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,EAC3B,KAAK,GAAG;AACX,YAAM,KAAK,cAAc,OAAO,QAAQ,aAAa,MAAM,GAAG,CAAC,CAAC,OAAO,OAAO,QAAQ,YAAY,MAAM,GAAG,EAAE,CAAC,EAAE;AAChH,YAAM,KAAK,cAAc,WAAW,QAAQ,EAAE;AAAA,IAChD,OAAO;AACL,YAAM,KAAK,kBAAkB;AAAA,IAC/B;AACA,UAAM,KAAK,eAAe,OAAO,QAAQ,UAAU,EAAE;AACrD,UAAM,KAAK,kCAAkC,OAAO,QAAQ,6BAA6B,EAAE;AAC3F,QAAI,OAAO,QAAQ,0BAA0B,MAAM;AACjD,YAAM,OAAO,OAAO,QAAQ,yBAAyB,KAAK,QAAQ,CAAC;AACnE,YAAM,KAAK,+BAA+B,OAAO,QAAQ,mBAAmB,eAAe,GAAG,GAAG;AAAA,IACnG,OAAO;AACL,YAAM,KAAK,wDAAwD;AAAA,IACrE;AAAA,EACF;AAEA,MAAI,OAAO,YAAY;AACrB,UAAM,KAAK,IAAI,gCAAgC;AAC/C,UAAM,QAAQ,OAAO,WAAW;AAChC,UAAM,KAAK,cAAc,MAAM,WAAW,IAAI,uCAAuC,MAAM,KAAK,IAAI,CAAC,EAAE;AACvG,UAAM,iBAAiB,OAAO,QAAQ,OAAO,WAAW,aAAa;AACrE,QAAI,eAAe,WAAW,GAAG;AAC/B,YAAM,KAAK,kBAAkB;AAAA,IAC/B,OAAO;AACL,YAAM,QAAQ,eAAe,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,IAAI,GAAG,CAAC;AAC1D,YAAM,KAAK,kBAAkB,KAAK,KAAK,eAAe,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC,GAAG;AAAA,IAClG;AACA,QAAI,OAAO,WAAW,kBAAkB;AACtC,YAAM,KAAK,kBAAkB,OAAO,WAAW,iBAAiB,MAAM,GAAG,EAAE,CAAC,KAAK,OAAO,WAAW,yBAAyB,SAAS,GAAG;AAAA,IAC1I,OAAO;AACL,YAAM,KAAK,sBAAsB;AAAA,IACnC;AACA,QAAI,MAAM,WAAW,KAAK,eAAe,SAAS,GAAG;AACnD,YAAM,KAAK,qLAAqL;AAAA,IAClM;AAAA,EACF;AAEA,MAAI,OAAO,QAAQ,WAAW;AAC5B,UAAM,KAAK,IAAI,sBAAsB;AACrC,eAAW,UAAU,OAAO,QAAQ,SAAS;AAC3C,YAAM,KAAK,KAAK,MAAM,EAAE;AAAA,IAC1B;AACA,UAAM,KAAK,6DAA6D;AAAA,EAC1E;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;;;AGtaA,IAAM,UAAU,QAAQ,aAAa;AACrC,IAAM,WAAW,QAAQ,aAAa;AAEtC,SAAS,cAAqB;AAC5B,QAAM,IAAI;AAAA,IACR,qGAAqG,QAAQ,QAAQ;AAAA,EACvH;AACF;AAEO,SAAS,eAAe,OAAuB,CAAC,GAAkB;AACvE,MAAI,SAAU,QAAO,mBAAmB,IAAI;AAC5C,MAAI,QAAS,QAAO,mBAAmB,IAAI;AAC3C,cAAY;AACd;AAEO,SAAS,iBAAiB,OAA+B;AAC9D,MAAI,SAAU,QAAO,qBAAqB,KAAK;AAC/C,MAAI,QAAS,QAAO,qBAAqB,KAAK;AAC9C,cAAY;AACd;AAEO,SAAS,aAAa,OAA+B;AAC1D,MAAI,SAAU,QAAO,iBAAiB,KAAK;AAC3C,MAAI,QAAS,QAAO,iBAAiB,KAAK;AAC1C,cAAY;AACd;AAEO,SAAS,YAAY,OAA+B;AACzD,MAAI,SAAU,QAAO,gBAAgB,KAAK;AAC1C,MAAI,QAAS,QAAO,gBAAgB,KAAK;AACzC,cAAY;AACd;AAQO,SAAS,eAAe,OAAwB;AACrD,MAAI,SAAU,QAAO,mBAAmB,KAAK;AAC7C,MAAI,QAAS,QAAO,eAAe,KAAK;AACxC,cAAY;AACd;AAEO,SAAS,sBAA8B;AAC5C,SAAO,UAAU,kBAAkB;AACrC;;;ATKA,IAAMG,WAAU,cAAc,YAAY,GAAG;AAC7C,IAAM,MAAMA,SAAQ,iBAAiB;AAErC,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,QAAQ,EACb,YAAY,mDAAmD,EAC/D,QAAQ,IAAI,OAAO;AAItB,QACG,QAAQ,MAAM,EACd,YAAY,4BAA4B,EACxC,OAAO,MAAM;AACZ,SAAO;AACP,UAAQ,IAAI,qCAAqC;AACnD,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,oEAAoE,EAChF,OAAO,UAAU,sBAAsB,EACvC,OAAO,SAAS,+CAA+C,EAC/D,OAAO,CAAC,SAAS;AAChB,QAAM,SAAS,gBAAgB;AAC/B,MAAI,KAAK,KAAK;AACZ,UAAM,iBAAiB,OAAO,OAC3B,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,EAChD,IAAI,CAAC,MAAM,EAAE,KAAK;AACrB,QAAI,eAAe,WAAW,GAAG;AAC/B,UAAI,CAAC,KAAK,KAAM,SAAQ,IAAI,sDAAiD;AAAA,IAC/E,OAAO;AACL,YAAM,YAAY,eAAe;AAAA,QAC/B,OAAO;AAAA,MACT,CAAC;AACD,UAAI,CAAC,KAAK,MAAM;AACd,gBAAQ,IAAI,oBAAoB,eAAe,KAAK,IAAI,CAAC,EAAE;AAC3D,mBAAW,SAAS,UAAU,QAAQ;AACpC,kBAAQ,IAAI,GAAG,gBAAgB,MAAM,KAAK,CAAC,WAAW,gBAAgB,MAAM,GAAG,CAAC,EAAE;AAClF,kBAAQ,IAAI,GAAG,gBAAgB,MAAM,KAAK,CAAC,WAAW,gBAAgB,MAAM,KAAK,CAAC,EAAE;AAAA,QACtF;AACA,gBAAQ,IAAI,EAAE;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc,KAAK,MAAM,gBAAgB,IAAI;AACnD,MAAI,KAAK,MAAM;AACb,YAAQ,IAAI,KAAK,UAAU,aAAa,MAAM,CAAC,CAAC;AAChD;AAAA,EACF;AACA,UAAQ,IAAI,mBAAmB,WAAW,CAAC;AAC7C,CAAC;AAEH,IAAM,QAAQ,QACX,QAAQ,IAAI,EACZ,YAAY,kCAAkC;AAEjD,MACG,QAAQ,OAAO,EACf,YAAY,mEAAmE,EAC/E,OAAO,SAAS,2BAA2B,EAC3C,OAAO,gBAAgB,2BAA2B,EAClD,OAAO,kBAAkB,6CAA6C,EACtE,OAAO,CAAC,SAAS;AAChB,MAAI,CAAC,KAAK,OAAO,CAAC,KAAK,UAAU;AAC/B,YAAQ,MAAM,kDAAkD;AAChE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,UAAU;AACzB,UAAQ,QAAQ,EAAE,aAAa,KAAK,YAAY,CAAC;AACjD,SAAO,MAAM;AACb,UAAQ,IAAI,SAAS,MAAM,EAAE;AAC7B,MAAI,KAAK,aAAa;AACpB,YAAQ,IAAI,qCAAqC;AAAA,EACnD;AACF,CAAC;AAEH,MACG,QAAQ,QAAQ,EAChB,YAAY,oEAAoE,EAChF,OAAO,mBAAmB,iCAAiC,CAAC,MAAM,OAAO,SAAS,GAAG,EAAE,CAAC,EACxF,OAAO,CAAC,SAAS;AAChB,SAAO;AACP,QAAM,SAAS,kBAAkB;AAAA,IAC/B,WAAW,OAAO,SAAS,KAAK,SAAS,IAAI,KAAK,YAAY;AAAA,EAChE,CAAC;AACD,MAAI,OAAO,QAAS,SAAQ,IAAI,WAAW,OAAO,OAAO,EAAE;AAAA,MACtD,SAAQ,IAAI,gCAAgC;AACjD,UAAQ,IAAI,aAAa,OAAO,SAAS,MAAM,EAAE;AACjD,aAAW,KAAK,OAAO,SAAU,SAAQ,IAAI,KAAK,CAAC,EAAE;AACrD,MAAI,OAAO,QAAQ,QAAQ;AACzB,YAAQ,IAAI,YAAY,OAAO,QAAQ,MAAM,EAAE;AAC/C,eAAW,KAAK,OAAO,QAAS,SAAQ,IAAI,KAAK,CAAC,EAAE;AAAA,EACtD;AACF,CAAC;AAEH,MACG,QAAQ,SAAS,EACjB,YAAY,mCAAmC,EAC/C,OAAO,MAAM;AACZ,QAAM,UAAU,YAAY;AAC5B,MAAI,QAAQ,WAAW,GAAG;AACxB,YAAQ,IAAI,iBAAiB;AAC7B;AAAA,EACF;AACA,aAAW,KAAK,SAAS;AACvB,UAAM,MAAM,EAAE,aAAa,OAAO,MAAM,QAAQ,CAAC;AACjD,YAAQ,IAAI,GAAG,EAAE,IAAI,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE;AAAA,EAC9C;AACF,CAAC;AAEH,MACG,QAAQ,gBAAgB,EACxB,YAAY,+DAA+D,EAC3E,OAAO,SAAS,mBAAmB,EACnC,OAAO,CAAC,MAAc,SAAS;AAC9B,MAAI,CAAC,KAAK,KAAK;AACb,YAAQ,MAAM,oCAAoC;AAClD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,SAAS,cAAc,IAAI;AACjC,MAAI,CAAC,OAAO,UAAU;AACpB,YAAQ,MAAM,sBAAsB,OAAO,IAAI,EAAE;AACjD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,UAAQ,IAAI,YAAY,OAAO,IAAI,OAAO,OAAO,EAAE,EAAE;AACvD,CAAC;AAEH,IAAM,WAAW,QACd,QAAQ,OAAO,EACf,YAAY,4BAA4B;AAE3C,SACG,OAAO,qBAAqB,4BAA4B,0BAA0B,EAClF,OAAO,gBAAgB,oBAAoB,EAC3C,OAAO,cAAc,yBAAyB,EAC9C,OAAO,mBAAmB,iDAAiD,eAAe,CAAC,CAAC,EAC5F,OAAO,qBAAqB,0DAA0D,EACtF,OAAO,aAAa,4CAA4C,EAChE,OAAO,mBAAmB,wCAAwC,QAAQ,EAC1E,OAAO,yBAAyB,oHAAoH,EACpJ,OAAO,SAAS,0BAA0B,EAC1C,OAAO,OAAO,SAAS;AACtB,MAAI,CAAC,KAAK,OAAO,CAAC,KAAK,QAAQ;AAC7B,UAAM,YAAY,MAAM,kBAAkB,KAAK,KAAK;AACpD,QAAI,CAAC,WAAW;AACd,cAAQ,MAAM,gBAAgB;AAC9B,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,SAAS,eAAe;AAAA,IAC5B,SAAS,KAAK;AAAA,IACd,OAAO,KAAK,MAAM,SAAS,IAAI,KAAK,QAAQ;AAAA,IAC5C,QAAQ,KAAK;AAAA,IACb,WAAW,KAAK;AAAA,IAChB,SAAS,KAAK;AAAA,IACd,OAAO,KAAK;AAAA,IACZ,gBAAgB,KAAK;AAAA,IACrB,iBAAiB,KAAK;AAAA,EACxB,CAAC;AAED,UAAQ,IAAI,eAAe,OAAO,OAAO,EAAE;AAC3C,UAAQ,IAAI,iBAAiB,OAAO,eAAe,EAAE;AACrD,UAAQ,IAAI,iBAAiB,OAAO,cAAc,EAAE;AACpD,UAAQ,IAAI,iBAAiB,OAAO,cAAc,EAAE;AACpD,UAAQ,IAAI,iBAAiB,OAAO,KAAK,GAAG,OAAO,UAAU,eAAe,EAAE,EAAE;AAChF,UAAQ,IAAI,EAAE;AACd,MAAI,OAAO,OAAO,WAAW,GAAG;AAC9B,YAAQ,IAAI,+BAA+B;AAC3C;AAAA,EACF;AACA,aAAW,SAAS,OAAO,QAAQ;AACjC,YAAQ,IAAI,GAAG,gBAAgB,MAAM,KAAK,CAAC,GAAG;AAC9C,YAAQ,IAAI,eAAe,MAAM,WAAW,QAAQ,IAAI,EAAE;AAC1D,YAAQ,IAAI,eAAe,gBAAgB,MAAM,GAAG,CAAC,EAAE;AACvD,YAAQ,IAAI,eAAe,gBAAgB,MAAM,KAAK,CAAC,EAAE;AACzD,QAAI,MAAM,kBAAkB;AAC1B,cAAQ,IAAI,eAAe,MAAM,gBAAgB,EAAE;AAAA,IACrD;AAAA,EACF;AACF,CAAC;AAEH,SACG,QAAQ,OAAO,EACf,YAAY,oEAAoE,EAChF,OAAO,qBAAqB,4BAA4B,0BAA0B,EAClF,OAAO,gBAAgB,sBAAsB,EAC7C,OAAO,iBAAiB,uBAAuB,EAC/C,OAAO,yBAAyB,oHAAoH,EACpJ,OAAO,CAAC,SAAS;AAChB,QAAM,SAAS,cAAc;AAAA,IAC3B,SAAS,KAAK;AAAA,IACd,OAAO,KAAK,aAAa,QAAQ;AAAA,IACjC,QAAQ,KAAK,YAAY,QAAQ;AAAA,IACjC,iBAAiB,KAAK;AAAA,EACxB,CAAC;AAED,UAAQ,IAAI,eAAe,OAAO,OAAO,EAAE;AAC3C,UAAQ,IAAI,iBAAiB,OAAO,eAAe,EAAE;AACrD,UAAQ,IAAI,iBAAiB,OAAO,cAAc,EAAE;AACpD,UAAQ,IAAI,iBAAiB,OAAO,cAAc,EAAE;AACpD,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,iBAAiB,gBAAgB,OAAO,KAAK,CAAC,EAAE;AAC5D,UAAQ,IAAI,iBAAiB,gBAAgB,OAAO,WAAW,CAAC,EAAE;AAClE,UAAQ,IAAI,iBAAiB,gBAAgB,OAAO,MAAM,CAAC,EAAE;AAC7D,UAAQ,IAAI,iBAAiB,gBAAgB,OAAO,YAAY,CAAC,EAAE;AACrE,CAAC;AAIH,IAAM,UAAU,QACb,QAAQ,MAAM,EACd,YAAY,oDAAoD;AAMnE,SAAS,eACP,OACA,QACsC;AACtC,SAAO,UAAU,SAAe;AAC9B,QAAI;AACF,aAAO,MAAM,OAAO,GAAG,IAAI;AAAA,IAC7B,SAAS,OAAO;AACd,UAAI,UAAU;AACd,UAAI;AACF,cAAM,EAAE,gBAAgB,WAAAC,YAAW,UAAU,YAAAC,aAAY,QAAAC,QAAO,IAAI,MAAM,OAAO,IAAS;AAC1F,cAAM,EAAE,SAAAC,SAAQ,IAAI,MAAM,OAAO,IAAS;AAC1C,cAAM,MAAMC,MAAKD,SAAQ,GAAG,WAAW,MAAM;AAC7C,QAAAH,WAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAClC,kBAAUI,MAAK,KAAK,iBAAiB;AACrC,YAAI;AACF,gBAAM,WAAW,SAAS,QAAQ,IAAI,6BAA6B,OAAO,OAAO,IAAI,GAAG,EAAE;AAC1F,cAAI,WAAW,KAAK,SAAS,OAAO,EAAE,QAAQ,UAAU;AACtD,kBAAM,UAAU,GAAG,OAAO;AAC1B,gBAAI;AAAE,cAAAF,QAAO,SAAS,EAAE,OAAO,KAAK,CAAC;AAAA,YAAG,QAAQ;AAAA,YAAC;AACjD,YAAAD,YAAW,SAAS,OAAO;AAAA,UAC7B;AAAA,QACF,QAAQ;AAAA,QAER;AACA,cAAM,UAAU,iBAAiB,QAC7B,MAAM,SAAS,MAAM,UACrB,OAAO,KAAK;AAChB;AAAA,UACE;AAAA,UACA,IAAG,oBAAI,KAAK,GAAE,YAAY,CAAC,IAAI,KAAK,IAAI,OAAO;AAAA;AAAA,QACjD;AAAA,MACF,QAAQ;AAAA,MAER;AAGA,cAAQ,OAAO;AAAA,QACb,WAAW,KAAK,+BAA0B,OAAO;AAAA;AAAA,MACnD;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF;AAEA,QACG,QAAQ,QAAQ,EAChB,YAAY,2BAA2B,EACvC,OAAO,iBAAiB,aAAa,EACrC,OAAO,iBAAiB,iBAAiB,EACzC,OAAO,sBAAsB,iBAAiB,EAC9C,OAAO,kBAAkB,YAAY,EACrC,OAAO,iBAAiB,mBAAmB,EAC3C,OAAO,mBAAmB,YAAY,EACtC,OAAO,2BAA2B,yBAAyB,EAC3D,OAAO,yBAAyB,mCAAmC,EACnE,OAAO,uBAAuB,uCAAuC,EACrE,OAAO,iBAAiB,iCAAiC,EACzD,OAAO,eAAe,UAAU,OAAO,SAAS;AAC/C,QAAM,aAAa,KAAK,kBAAkB,gBAAgB,KAAK,aAAa,UAAU;AACtF,QAAM,QAAQ,eAAe,gBACzB,MAAM,mCAAmC,IACzC,eAAe,UACb,MAAM,8BAA8B,IACpC;AAAA,IACE,MAAM,KAAK;AAAA,IACX,MAAM,KAAK;AAAA,IACX,WAAW,KAAK;AAAA,IAChB,YAAY,KAAK;AAAA,IACjB,MAAM,KAAK;AAAA,IACX,OAAO,KAAK;AAAA,IACZ,qBAAqB,KAAK;AAAA,IAC1B,mBAAmB,2BAA2B,KAAK,WAAW;AAAA,EAChE;AACN,QAAM,SAAS,MAAM,kBAAkB,KAAK;AAC5C,MAAI,cAAc,OAAO,WAAW;AAClC,UAAM,SAAS;AAAA,MACb,oBAAoB;AAAA,QAClB,eAAe;AAAA,QACf,mBAAmB,uBAAuB,OAAO,SAAS;AAAA,MAC5D;AAAA,IACF;AACA,YAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,MAAM,CAAC;AAAA,CAAI;AAAA,EACpD;AACF,CAAC,CAAC;AAEJ,QACG,QAAQ,MAAM,EACd,YAAY,oCAAoC,EAChD,OAAO,iBAAiB,WAAW,EACnC,OAAO,iBAAiB,gBAAgB,EACxC,OAAO,iBAAiB,iBAAiB,EACzC,OAAO,sBAAsB,iBAAiB,EAC9C,OAAO,kBAAkB,YAAY,EACrC,OAAO,iBAAiB,mBAAmB,EAC3C,OAAO,mBAAmB,YAAY,EACtC,OAAO,0BAA0B,oBAAoB,EACrD,OAAO,uBAAuB,uCAAuC,EACrE,OAAO,iBAAiB,iCAAiC,EACzD,OAAO,eAAe,QAAQ,OAAO,SAAS;AAC7C,QAAM,QAAQ,KAAK,kBACf,MAAM,iCAAiC,IACvC,KAAK,aACH,MAAM,4BAA4B,IAClC;AAAA,IACE,MAAM,KAAK;AAAA,IACX,WAAW,aAAa,KAAK,MAAM,MAAM;AAAA,IACzC,MAAM,KAAK;AAAA,IACX,WAAW,KAAK;AAAA,IAChB,YAAY,KAAK;AAAA,IACjB,MAAM,KAAK;AAAA,IACX,OAAO,KAAK;AAAA,IACZ,eAAe,KAAK;AAAA,EACtB;AACN,QAAM,gBAAgB,KAAK;AAC7B,CAAC,CAAC;AAEJ,QACG,QAAQ,eAAe,EACvB,YAAY,sBAAsB,EAClC,OAAO,kBAAkB,YAAY,EACrC,OAAO,mBAAmB,YAAY,EACtC,OAAO,iBAAiB,iBAAiB,EACzC,OAAO,sBAAsB,iBAAiB,EAC9C,OAAO,iBAAiB,mBAAmB,EAC3C,OAAO,uBAAuB,uCAAuC,EACrE,OAAO,iBAAiB,iCAAiC,EACzD,OAAO,eAAe,iBAAiB,OAAO,SAAS;AACtD,QAAM,aAAa,KAAK,kBAAkB,gBAAgB,KAAK,aAAa,UAAU;AACtF,QAAM,QAAQ,eAAe,gBACzB,MAAM,yCAAyC,IAC/C,eAAe,UACb,MAAM,oCAAoC,IAC1C;AAAA,IACE,YAAY,KAAK;AAAA,IACjB,OAAO,KAAK;AAAA,IACZ,MAAM,KAAK;AAAA,IACX,WAAW,KAAK;AAAA,IAChB,MAAM,KAAK;AAAA,EACb;AACN,QAAM,SAAS,MAAM,wBAAwB,KAAK;AAClD,MAAI,YAAY;AACd,UAAM,QAAkB,CAAC;AACzB,QAAI,OAAO,UAAW,OAAM,KAAK,uBAAuB,OAAO,SAAS,CAAC;AACzE,QAAI,OAAO,qBAAqB;AAC9B,YAAM,KAAK,gCAAgC,OAAO,mBAAmB,CAAC;AAAA,IACxE;AACA,QAAI,OAAO,uBAAuB;AAChC,YAAM,KAAK,kCAAkC,OAAO,qBAAqB,CAAC;AAAA,IAC5E;AACA,QAAI,MAAM,SAAS,GAAG;AACpB,YAAM,SAAS;AAAA,QACb,oBAAoB;AAAA,UAClB,eAAe;AAAA,UACf,mBAAmB,MAAM,KAAK,MAAM;AAAA,QACtC;AAAA,MACF;AACA,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,MAAM,CAAC;AAAA,CAAI;AAAA,IACpD;AAAA,EACF;AACF,CAAC,CAAC;AAEJ,QACG,QAAQ,aAAa,EACrB,YAAY,oBAAoB,EAChC,OAAO,kBAAkB,YAAY,EACrC,OAAO,iBAAiB,iBAAiB,EACzC,OAAO,sBAAsB,iBAAiB,EAC9C,OAAO,iBAAiB,mBAAmB,EAC3C,OAAO,mBAAmB,YAAY,EACtC,OAAO,wBAAwB,YAAY,EAC3C,OAAO,uBAAuB,uCAAuC,EACrE,OAAO,iBAAiB,iCAAiC,EACzD,OAAO,eAAe,eAAe,OAAO,SAAS;AACpD,QAAM,QAAQ,KAAK,kBACf,MAAM,uCAAuC,IAC7C,KAAK,aACH,MAAM,kCAAkC,IACxC;AAAA,IACE,YAAY,KAAK;AAAA,IACjB,MAAM,KAAK;AAAA,IACX,WAAW,KAAK;AAAA,IAChB,MAAM,KAAK;AAAA,IACX,OAAO,KAAK;AAAA,IACZ,YAAY,KAAK,YAAY,aAAa,KAAK,WAAW,YAAY,IAAI;AAAA,EAC5E;AACN,QAAM,sBAAsB,KAAK;AACnC,CAAC,CAAC;AAEJ,QACG,QAAQ,cAAc,EACtB,YAAY,yDAAyD,EACrE,SAAS,aAAa,2BAA2B,EACjD,OAAO,eAAe,gBAAgB,OAAO,YAAqB;AACjE,QAAM,oBAAoB,OAAO;AACnC,CAAC,CAAC;AAEJ,QACG,QAAQ,OAAO,EACf,YAAY,mCAAmC,EAC/C,OAAO,mBAAmB,iBAAiB,EAC3C,OAAO,mBAAmB,iBAAiB,EAC3C,OAAO,eAAe,YAAY,EAClC,OAAO,UAAU,eAAe,EAChC,OAAO,CAAC,SAAS;AAChB,QAAM,KAAK,OAAO;AAClB,QAAM,QAAQ,iBAAiB,IAAI;AAAA,IACjC,OAAO,KAAK;AAAA,IACZ,OAAO,KAAK;AAAA,IACZ,OAAO,KAAK,QAAQ,SAAS,KAAK,OAAO,EAAE,IAAI;AAAA,EACjD,CAAC;AAED,MAAI,KAAK,MAAM;AACb,YAAQ,IAAI,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAC1C;AAAA,EACF;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,YAAQ,IAAI,yBAAyB;AACrC;AAAA,EACF;AAEA,aAAW,OAAO,OAAO;AACvB,YAAQ;AAAA,MACN,GAAG,IAAI,MAAM,OAAO,EAAE,CAAC,IAAI,IAAI,MAAM,OAAO,EAAE,CAAC,UAAU,IAAI,WAAW,OAAO,IAAI,QAAQ,QAAQ,IAAI,WAAW,QAAQ,IAAI,gBAAgB,QAAQ,CAAC,CAAC,UAAU,IAAI,eAAe,WAAW,IAAI,cAAc;AAAA,IACpN;AAAA,EACF;AACF,CAAC;AAIH,QACG,QAAQ,MAAM,EACd,YAAY,0CAA0C,EACtD,SAAS,UAAU,mBAAmB,GAAG,EACzC,OAAO,sBAAsB,YAAY,EACzC,OAAO,CAAC,MAAc,SAAS;AAC9B,QAAM,KAAK,OAAO;AAClB,QAAM,WAAWI,SAAQ,IAAI;AAC7B,QAAM,MAAM,aAAa,IAAI,QAAQ;AACrC,QAAM,WAAW,yBAAyB,IAAI;AAAA,IAC5C,MAAM,sBAAsB,QAAQ;AAAA,IACpC,WAAW;AAAA,EACb,CAAC;AACD,QAAM,UAAU,IACb,IAAI,CAAC,OAAO,UAAU,IAAI,EAAE,CAAC,EAC7B,OAAO,CAAC,QAAQ,OAAO,IAAI;AAC9B,QAAM,cAAc,QAAQ,OAAO,CAAC,QAAQ,IAAI,WAAW,QAAQ,EAAE;AACrE,QAAM,iBAAiB,QAAQ,OAAO,CAAC,QAAQ,IAAI,WAAW,WAAW,EAAE;AAC3E,UAAQ,IAAI,WAAW,QAAQ,EAAE;AACjC,UAAQ,IAAI,WAAW,IAAI,MAAM,cAAc,WAAW,YAAY,cAAc,cAAc;AAClG,MAAI,SAAS,aAAa;AACxB,YAAQ,IAAI,WAAW,SAAS,WAAW,EAAE;AAAA,EAC/C;AACA,sBAAoB,IAAI;AAAA,IACtB,YAAY,KAAK,WAAW;AAAA,IAC5B,MAAM,QAAQ,CAAC,GAAG,QAAQ;AAAA,IAC1B,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,SAAS,EAAE,WAAW,SAAS;AAAA,IAC/B,QAAQ,EAAE,SAAS,IAAI,QAAQ,QAAQ,aAAa,WAAW,eAAe;AAAA,EAChF,CAAC;AAED,MAAI,IAAI,SAAS,GAAG;AAClB,YAAQ,IAAI,aAAa;AACzB,eAAW,MAAM,KAAK;AACpB,YAAM,MAAM,UAAU,IAAI,EAAE;AAC5B,UAAI,KAAK;AACP,gBAAQ;AAAA,UACN,MAAM,IAAI,MAAM,MAAM,IAAI,WAAW,QAAQ,CAAC,CAAC,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI;AAAA,QAC3E;AAAA,MACF;AAAA,IACF;AACA,YAAQ;AAAA,MACN;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAIH,QACG,QAAQ,OAAO,EACf,YAAY,mCAAmC,EAC/C,OAAO,MAAM;AACZ,QAAM,KAAK,OAAO;AAClB,QAAM,QAAQ,UAAU,EAAE;AAC1B,MAAI,MAAM,WAAW,GAAG;AACtB,YAAQ,IAAI,wBAAwB;AACpC;AAAA,EACF;AACA,aAAW,QAAQ,OAAO;AACxB,YAAQ,IAAI,IAAI;AAAA,EAClB;AACA,UAAQ,IAAI;AAAA,EAAK,MAAM,MAAM,eAAe;AAC9C,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,eAAe,EAC3B,OAAO,qBAAqB,sBAAsB,EAClD;AAAA,EACC;AAAA,EACA;AACF,EACC,OAAO,qBAAqB,gBAAgB,EAC5C,OAAO,mBAAmB,eAAe,EACzC,OAAO,gBAAgB,wBAAwB,GAAG,EAClD,OAAO,CAAC,SAAS;AAChB,QAAM,KAAK,OAAO;AAClB,QAAM,QAAQ,cAAc,IAAI;AAAA,IAC9B,MAAM,KAAK;AAAA,IACX,QAAQ,KAAK;AAAA,IACb,MAAM,KAAK;AAAA,IACX,OAAO,KAAK,QAAQ,SAAS,KAAK,OAAO,EAAE,IAAI;AAAA,IAC/C,QAAQ,KAAK,SAAS,SAAS,KAAK,QAAQ,EAAE,IAAI;AAAA,EACpD,CAAC;AAED,MAAI,MAAM,WAAW,GAAG;AACtB,YAAQ,IAAI,oBAAoB;AAChC;AAAA,EACF;AAEA,aAAW,KAAK,OAAO;AACrB,UAAM,SAAS,EAAE,GAAG,MAAM,GAAG,CAAC;AAC9B,YAAQ;AAAA,MACN,GAAG,MAAM,MAAM,EAAE,OAAO,OAAO,CAAC,CAAC,MAAM,EAAE,WAAW,QAAQ,CAAC,CAAC,KAAK,EAAE,KAAK,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI;AAAA,IAChG;AAAA,EACF;AACA,UAAQ,IAAI;AAAA,EAAK,MAAM,MAAM,kBAAkB;AACjD,CAAC;AAIH,QACG,QAAQ,MAAM,EACd,YAAY,qBAAqB,EACjC,SAAS,QAAQ,4BAA4B,EAC7C,OAAO,CAAC,aAAqB;AAC5B,QAAM,KAAK,OAAO;AAClB,QAAM,MAAM,aAAa,IAAI,QAAQ;AACrC,MAAI,CAAC,KAAK;AACR,YAAQ,MAAM,qBAAqB,QAAQ,EAAE;AAC7C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,UAAQ,IAAI,KAAK,UAAU,KAAK,MAAM,CAAC,CAAC;AAC1C,CAAC;AAIH,QACG,QAAQ,SAAS,EACjB,YAAY,sCAAsC,EAClD,SAAS,QAAQ,4BAA4B,EAC7C,OAAO,CAAC,aAAqB;AAC5B,QAAM,KAAK,OAAO;AAClB,QAAM,MAAM,aAAa,IAAI,QAAQ;AACrC,MAAI,CAAC,KAAK;AACR,YAAQ,MAAM,qBAAqB,QAAQ,EAAE;AAC7C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAMC,MAAK,cAAc,IAAI,IAAI,EAAE;AACnC,MAAIA,KAAI;AACN,YAAQ,IAAI,cAAc,IAAI,GAAG,MAAM,GAAG,CAAC,CAAC,gBAAW;AAAA,EACzD,OAAO;AACL,YAAQ,MAAM,sCAAsC;AAAA,EACtD;AACF,CAAC;AAIH,QACG,QAAQ,QAAQ,EAChB,YAAY,sCAAsC,EAClD,SAAS,QAAQ,4BAA4B,EAC7C,OAAO,CAAC,aAAqB;AAC5B,QAAM,KAAK,OAAO;AAClB,QAAM,MAAM,aAAa,IAAI,QAAQ;AACrC,MAAI,CAAC,KAAK;AACR,YAAQ,MAAM,qBAAqB,QAAQ,EAAE;AAC7C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,eAAa,IAAI,IAAI,EAAE;AACvB,UAAQ,IAAI,aAAa,IAAI,GAAG,MAAM,GAAG,CAAC,CAAC,EAAE;AAC/C,CAAC;AAIH,QACG,QAAQ,SAAS,EACjB,YAAY,6CAA6C,EACzD,eAAe,qBAAqB,iBAAiB,EACrD,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,sBAAsB,0CAA0C,EACvE,OAAO,wBAAwB,qDAAqD,EACpF,OAAO,sBAAsB,YAAY,EACzC,OAAO,mBAAmB,8DAA8D,EACxF,OAAO,OAAO,SAAS;AACtB,QAAM,KAAK,OAAO;AAClB,QAAM,SAAS,KAAK,SAAS,KAAK,oBAC9B,MAAM,qBAAqB,IAAI;AAAA,IAC7B,MAAM,KAAK;AAAA,IACX,MAAM,KAAK;AAAA,IACX,YAAY,KAAK;AAAA,IACjB,QAAQ;AAAA,MACN,GAAI,KAAK,YAAY,EAAE,sBAAsB,WAAW,KAAK,SAAS,EAAE,IAAI,CAAC;AAAA,MAC7E,oBAAoB,KAAK,qBAAqB;AAAA,IAChD;AAAA,EACF,CAAC,IACD,eAAe,IAAI;AAAA,IACjB,MAAM,KAAK;AAAA,IACX,MAAM,KAAK;AAAA,IACX,QAAQ,KAAK,YAAY,EAAE,sBAAsB,WAAW,KAAK,SAAS,EAAE,IAAI,CAAC;AAAA,EACnF,CAAC;AACL,sBAAoB,IAAI;AAAA,IACtB,YAAY,KAAK,WAAW;AAAA,IAC5B,MAAM,KAAK;AAAA,IACX,MAAM,KAAK,QAAQ;AAAA,IACnB,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,YAAY,OAAO;AAAA,IACnB,SAAS;AAAA,MACP,WAAW,KAAK,YAAY,WAAW,KAAK,SAAS,IAAI;AAAA,MACzD,YAAY,KAAK,SAAS;AAAA,MAC1B,oBAAoB,KAAK,qBAAqB;AAAA,IAChD;AAAA,IACA,QAAQ;AAAA,MACN,UAAU,OAAO;AAAA,MACjB,SAAS,OAAO;AAAA,MAChB,kBAAkB,OAAO;AAAA,MACzB,gBAAgB,OAAO;AAAA,IACzB;AAAA,EACF,CAAC;AAED,MAAI,CAAC,OAAO,MAAM;AAChB,YAAQ,IAAI,gDAAgD;AAC5D;AAAA,EACF;AAEA,UAAQ,IAAI,OAAO,IAAI;AACvB,UAAQ,IAAI,KAAK;AACjB,UAAQ;AAAA,IACN,GAAG,OAAO,kBAAkB,MAAM,uBAAuB,OAAO,iBAAiB,MAAM,+BAA+B,OAAO,iBAAiB,MAAM,cAAc,OAAO,cAAc;AAAA,EACzL;AACF,CAAC;AAIH,QACG,QAAQ,SAAS,EACjB,YAAY,mCAAmC,EAC/C,SAAS,UAAU,iBAAiB,EACpC,OAAO,qBAAqB,iBAAiB,EAC7C,OAAO,qBAAqB,mBAAmB,EAC/C,OAAO,sBAAsB,cAAc,KAAK,EAChD,OAAO,OAAO,MAAc,SAAS;AACpC,QAAM,KAAK,OAAO;AAClB,QAAM,MAAM,MAAM,kBAAkB,IAAI,MAAM;AAAA,IAC5C,WAAW,KAAK;AAAA,IAChB,MAAM,KAAK;AAAA,IACX,MAAM,KAAK;AAAA,EACb,CAAC;AACD,sBAAoB,IAAI;AAAA,IACtB,YAAY,KAAK;AAAA,IACjB,MAAM,KAAK,QAAQ;AAAA,IACnB,MAAM,KAAK,QAAQ;AAAA,IACnB,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,SAAS,EAAE,KAAK;AAAA,IAChB,QAAQ,EAAE,SAAS,IAAI;AAAA,EACzB,CAAC;AAED,MAAI,IAAI,WAAW,GAAG;AACpB,YAAQ,IAAI,iCAAiC;AAC7C,YAAQ;AAAA,MACN;AAAA,IACF;AACA;AAAA,EACF;AAEA,UAAQ,IAAI,WAAW,IAAI,MAAM,gBAAgB;AACjD,aAAW,MAAM,KAAK;AACpB,UAAM,MAAM,UAAU,IAAI,EAAE;AAC5B,QAAI;AACF,cAAQ,IAAI,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI,IAAI,EAAE;AAAA,EAClD;AACF,CAAC;AAIH,QACG,QAAQ,QAAQ,EAChB,YAAY,wBAAwB,EACpC,SAAS,cAAc,sBAAsB,EAC7C,OAAO,qBAAqB,iBAAiB,EAC7C,OAAO,qBAAqB,mBAAmB,EAC/C,OAAO,sBAAsB,cAAc,YAAY,EACvD,OAAO,qBAAqB,eAAe,EAC3C,OAAO,OAAO,UAAkB,SAAS;AACxC,QAAM,KAAK,OAAO;AAClB,QAAM,MAAM,MAAM,sBAAsB,IAAI,UAAU;AAAA,IACpD,WAAW,KAAK;AAAA,IAChB,MAAM,KAAK;AAAA,IACX,MAAM,KAAK;AAAA,IACX,UAAU,KAAK;AAAA,EACjB,CAAC;AACD,sBAAoB,IAAI;AAAA,IACtB,YAAY,KAAK;AAAA,IACjB,MAAM,KAAK,QAAQ;AAAA,IACnB,MAAM,KAAK,QAAQ;AAAA,IACnB,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,SAAS,EAAE,UAAU,UAAU,KAAK,YAAY,KAAK;AAAA,IACrD,QAAQ,EAAE,SAAS,IAAI;AAAA,EACzB,CAAC;AAED,UAAQ,IAAI,WAAW,IAAI,MAAM,qCAAqC;AACtE,aAAW,MAAM,KAAK;AACpB,UAAM,MAAM,UAAU,IAAI,EAAE;AAC5B,QAAI,IAAK,SAAQ,IAAI,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI,IAAI,EAAE;AAAA,EACzD;AACF,CAAC;AAIH,QACG,QAAQ,QAAQ,EAChB,YAAY,+CAA+C,EAC3D,eAAe,qBAAqB,iBAAiB,EACrD;AAAA,EACC;AAAA,EACA;AAAA,EACA;AACF,EACC,OAAO,uBAAuB,kBAAkB,EAChD,OAAO,CAAC,SAAS;AAChB,QAAM,KAAK,OAAO;AAClB,MAAI;AAEJ,UAAQ,KAAK,QAAQ;AAAA,IACnB,KAAK;AACH,gBAAU,aAAa,IAAI,KAAK,IAAI;AACpC;AAAA,IACF,KAAK;AACH,gBAAU,YAAY,IAAI,KAAK,IAAI;AACnC;AAAA,IACF,KAAK,WAAW;AACd,YAAM,WAAW,yBAAyB,IAAI,EAAE,MAAM,KAAK,KAAK,CAAC;AACjE,UAAI,CAAC,SAAS,aAAa;AACzB,gBAAQ,MAAM,yCAAyC,KAAK,IAAI,EAAE;AAClE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,gBAAUC,cAAa,SAAS,aAAa,OAAO;AACpD,UAAI,CAAC,KAAK,QAAQ;AAChB,gBAAQ,IAAI,OAAO;AACnB;AAAA,MACF;AACA;AAAA,IACF;AAAA,IACA;AACE,gBAAU,eAAe,IAAI,KAAK,IAAI;AAAA,EAC1C;AAEA,MAAI,KAAK,QAAQ;AACf,IAAAC,eAAc,KAAK,QAAQ,OAAO;AAClC,YAAQ,IAAI,eAAe,KAAK,MAAM,EAAE;AAAA,EAC1C,OAAO;AACL,YAAQ,IAAI,OAAO;AAAA,EACrB;AACF,CAAC;AAEH,QACG,QAAQ,SAAS,EACjB,YAAY,0DAA0D,EACtE,SAAS,UAAU,mBAAmB,GAAG,EACzC,OAAO,CAAC,SAAiB;AACxB,QAAM,KAAK,OAAO;AAClB,QAAM,WAAWH,SAAQ,IAAI;AAC7B,QAAM,WAAW,yBAAyB,IAAI;AAAA,IAC5C,MAAM,sBAAsB,QAAQ;AAAA,IACpC,WAAW;AAAA,EACb,CAAC;AACD,MAAI,CAAC,SAAS,aAAa;AACzB,YAAQ,MAAM,0CAA0C,QAAQ,EAAE;AAClE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,UAAQ,IAAI,SAAS,SAAS,WAAW,EAAE;AAC7C,CAAC;AAEH,IAAM,aAAa,QAChB,QAAQ,SAAS,EACjB,YAAY,oCAAoC;AAEnD,WACG,QAAQ,MAAM,EACd,YAAY,uBAAuB,EACnC,OAAO,qBAAqB,sBAAsB,EAClD,OAAO,sBAAsB,sBAAsB,EACnD,OAAO,qBAAqB,gBAAgB,EAC5C,OAAO,mBAAmB,iBAAiB,IAAI,EAC/C,OAAO,CAAC,SAAS;AAChB,QAAM,KAAK,OAAO;AAClB,QAAM,QAAQ,oBAAoB,IAAI;AAAA,IACpC,MAAM,KAAK;AAAA,IACX,YAAY,KAAK;AAAA,IACjB,MAAM,KAAK;AAAA,IACX,OAAO,SAAS,KAAK,OAAO,EAAE;AAAA,EAChC,CAAC;AAED,MAAI,MAAM,WAAW,GAAG;AACtB,YAAQ,IAAI,4BAA4B;AACxC;AAAA,EACF;AAEA,aAAW,QAAQ,OAAO;AACxB,YAAQ,IAAI,GAAG,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC,MAAM,KAAK,IAAI,UAAU,KAAK,QAAQ,GAAG,YAAY,KAAK,cAAc,GAAG,IAAI,KAAK,KAAK,MAAM,IAAI,EAAE,CAAC,CAAC,EAAE;AAAA,EAC7I;AACF,CAAC;AAEH,WACG,QAAQ,QAAQ,EAChB,YAAY,8DAA8D,EAC1E,SAAS,WAAW,cAAc,EAClC,OAAO,qBAAqB,sBAAsB,EAClD,OAAO,mBAAmB,iBAAiB,IAAI,EAC/C,OAAO,OAAO,OAAe,SAAS;AACrC,QAAM,KAAK,OAAO;AAClB,QAAM,UAAU,MAAM,sBAAsB,IAAI,OAAO;AAAA,IACrD,MAAM,KAAK;AAAA,IACX,OAAO,SAAS,KAAK,OAAO,EAAE;AAAA,EAChC,CAAC;AAED,MAAI,QAAQ,WAAW,GAAG;AACxB,YAAQ,IAAI,qCAAqC;AACjD;AAAA,EACF;AAEA,aAAW,UAAU,SAAS;AAC5B,YAAQ;AAAA,MACN,GAAG,OAAO,QAAQ,GAAG,MAAM,GAAG,CAAC,CAAC,YAAY,OAAO,MAAM,QAAQ,CAAC,CAAC,QAAQ,OAAO,WAAW,QAAQ,CAAC,CAAC,QAAQ,OAAO,cAAc,QAAQ,CAAC,CAAC,MAAM,OAAO,QAAQ,IAAI,KAAK,OAAO,QAAQ,KAAK,MAAM,IAAI,EAAE,CAAC,CAAC;AAAA,IAChN;AAAA,EACF;AACF,CAAC;AAIH,QACG,QAAQ,OAAO,EACf,YAAY,wCAAwC,EACpD,OAAO,YAAY;AAElB,QAAM,OAAO,UAAiB;AAChC,CAAC;AAIH,IAAM,UAAU,QACb,QAAQ,MAAM,EACd,YAAY,kCAAkC;AAEjD,QACG,QAAQ,MAAM,EACd,YAAY,+BAA+B,EAC3C,OAAO,YAAY;AAClB,QAAM,KAAK,OAAO;AAClB,QAAM,SAAS,eAAe;AAC9B,MAAI,CAAC,QAAQ;AACX,YAAQ,MAAM,0DAA0D;AACxE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,SAAS,MAAM,KAAK,IAAI,MAAM;AACpC,UAAQ,IAAI,WAAW,OAAO,MAAM,aAAa,OAAO,MAAM,gBAAgB,OAAO,SAAS,EAAE;AAChG,MAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,YAAQ,MAAM,WAAW,OAAO,OAAO,KAAK,IAAI,CAAC;AAAA,EACnD;AACF,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,gCAAgC,EAC5C,OAAO,YAAY;AAClB,QAAM,KAAK,OAAO;AAClB,QAAM,SAAS,eAAe;AAC9B,MAAI,CAAC,QAAQ;AACX,YAAQ,MAAM,0DAA0D;AACxE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,SAAS,MAAM,KAAK,IAAI,MAAM;AACpC,UAAQ,IAAI,WAAW,OAAO,MAAM,gBAAgB,OAAO,SAAS,EAAE;AACxE,CAAC;AAIH,IAAM,UAAU,QACb,QAAQ,MAAM,EACd,YAAY,cAAc;AAE7B,QACG,QAAQ,QAAQ,EAChB,YAAY,mBAAmB,EAC/B,SAAS,UAAU,WAAW,EAC9B,OAAO,OAAO,SAAiB;AAC9B,QAAM,SAAS,eAAe;AAC9B,MAAI,CAAC,QAAQ;AACX,YAAQ,MAAM,iBAAiB;AAC/B,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,SAAS,MAAM,WAAW,QAAQ,IAAI;AAC5C,UAAQ,IAAI,iBAAiB,MAAM,EAAE;AACrC,UAAQ,IAAI,sBAAsB,MAAM,oBAAoB;AAC9D,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,uBAAuB,EACnC,SAAS,aAAa,SAAS,EAC/B,OAAO,OAAO,WAAmB;AAChC,QAAM,SAAS,eAAe;AAC9B,MAAI,CAAC,QAAQ;AACX,YAAQ,MAAM,iBAAiB;AAC/B,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,SAAS,QAAQ,MAAM;AAC7B,UAAQ,IAAI,gBAAgB,MAAM,EAAE;AACtC,CAAC;AAIH,IAAM,UAAU,QACb,QAAQ,MAAM,EACd,YAAY,oBAAoB;AAEnC,QACG,QAAQ,QAAQ,EAChB,YAAY,gCAAgC,EAC5C,OAAO,qBAAqB,gBAAgB,EAC5C,OAAO,kBAAkB,kBAAkB,EAC3C,OAAO,CAAC,SAAS;AAChB,QAAM,KAAK,OAAO;AAClB,QAAM,UAAU,eAAe,IAAI,EAAE,MAAM,KAAK,MAAM,OAAO,KAAK,MAAM,CAAC;AACzE,UAAQ,IAAI,oBAAoB,OAAO,CAAC;AAC1C,CAAC;AAEH,QACG,QAAQ,OAAO,EACf,YAAY,uBAAuB,EACnC,eAAe,qBAAqB,iBAAiB,EACrD,OAAO,CAAC,SAAS;AAChB,QAAM,KAAK,OAAO;AAClB,QAAM,KAAK,iBAAiB,IAAI,KAAK,IAAI;AACzC,UAAQ,IAAI,yBAAyB,EAAE,EAAE;AAC3C,CAAC;AAEH,QACG,QAAQ,KAAK,EACb,YAAY,qBAAqB,EACjC,SAAS,gBAAgB,YAAY,EACrC,OAAO,CAAC,cAAsB;AAC7B,QAAM,KAAK,OAAO;AAClB,iBAAe,IAAI,SAAS;AAC5B,UAAQ,IAAI,uBAAuB,SAAS,EAAE;AAChD,CAAC;AAEH,QACG,QAAQ,WAAW,EACnB,YAAY,kEAAkE,EAC9E,eAAe,qBAAqB,mBAAmB,EACvD,OAAO,8BAA8B,2FAA2F,SAAS,EACzI,OAAO,UAAU,sBAAsB,EACvC,OAAO,OAAO,SAAS;AACtB,QAAM,KAAK,OAAO;AAClB,QAAM,QAAQ,sBAAsB,KAAK,IAAI;AAC7C,QAAM,YAAY,OAAO,KAAK,QAAQ,EACnC,MAAM,GAAG,EACT,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAC3B,OAAO,OAAO;AACjB,QAAM,SAAS,MAAM,iBAAiB,IAAI,OAAO,EAAE,UAAU,CAAC;AAE9D,MAAI,KAAK,MAAM;AACb,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C;AAAA,EACF;AAEA,UAAQ,IAAI,0BAA0B,MAAM,CAAC;AAC/C,CAAC;AAIH,IAAM,gBAAgB,QACnB,QAAQ,YAAY,EACpB,YAAY,kCAAkC;AAEjD,cACG,QAAQ,OAAO,EACf,YAAY,2DAA2D,EACvE,OAAO,YAAY;AAClB,QAAM,SAAS,2BAA2B;AAC1C,MAAI,CAAC,QAAQ;AACX,YAAQ,MAAM,4FAA4F;AAC1G,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,sBAAsB,MAAM;AAC3C,MAAI,CAAC,OAAO,QAAQ;AAClB,UAAM,SAAS,OAAO,oBAAoB,IAAI,OAAO,iBAAiB,OAAO;AAC7E,YAAQ,IAAI,uCAAuC,MAAM,QAAQ,OAAO,UAAU,EAAE;AAAA,EACtF;AAEA,QAAM,OAAO,MAAM,6BAA6B,MAAM;AACtD,MAAI,CAAC,MAAM;AACT,YAAQ,MAAM,0CAA0C;AACxD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,IAAI,aAAa,KAAK,QAAQ,EAAE;AACxC,UAAQ,IAAI,aAAa,KAAK,KAAK,EAAE;AACrC,UAAQ,IAAI,aAAa,KAAK,UAAU,EAAE;AAC1C,UAAQ,IAAI,aAAa,KAAK,UAAU,EAAE;AAC5C,CAAC;AAEH,cACG,QAAQ,MAAM,EACd,YAAY,kDAAkD,EAC9D,OAAO,MAAM;AACZ,QAAM,OAAO,sBAAsB;AACnC,MAAI,CAAC,MAAM;AACT,YAAQ,MAAM,4FAA4F;AAC1G,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,IAAI,aAAa,KAAK,QAAQ,EAAE;AACxC,UAAQ,IAAI,aAAa,KAAK,KAAK,EAAE;AACrC,UAAQ,IAAI,mBAAmB,KAAK,gBAAgB,cAAc,KAAK,oBAAoB,EAAE;AAC7F,UAAQ,IAAI,aAAa,KAAK,OAAO,EAAE;AACvC,UAAQ,IAAI,aAAa,KAAK,SAAS,QAAQ,IAAI,EAAE;AACrD,UAAQ,IAAI,aAAa,KAAK,UAAU,EAAE;AAC1C,UAAQ,IAAI,aAAa,KAAK,UAAU,EAAE;AAC1C,MAAI,KAAK,aAAa;AACpB,YAAQ,IAAI,aAAa,KAAK,WAAW,EAAE;AAAA,EAC7C;AACF,CAAC;AAEH,cACG,QAAQ,WAAW,EACnB,YAAY,sDAAsD,EAClE,OAAO,qBAAqB,6BAA6B,EACzD,OAAO,OAAO,SAAS;AACtB,QAAM,KAAK,OAAO;AAClB,QAAM,SAAS,2BAA2B;AAC1C,MAAI,CAAC,QAAQ;AACX,YAAQ,MAAM,4FAA4F;AAC1G,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,QAAQ,MAAM,oBAAoB,IAAI,QAAQ;AAAA,IAClD,MAAM,KAAK;AAAA,EACb,CAAC;AACD,UAAQ,IAAI,gBAAgB,KAAK,cAAc;AACjD,CAAC;AAEH,cACG,QAAQ,QAAQ,EAChB,YAAY,oDAAoD,EAChE,OAAO,qBAAqB,gCAAgC,EAC5D,OAAO,CAAC,SAAS;AAChB,QAAM,KAAK,OAAO;AAClB,QAAM,SAAS,2BAA2B;AAC1C,MAAI,CAAC,QAAQ;AACX,YAAQ,MAAM,4FAA4F;AAC1G,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,iBAAiB,IAAI,QAAQ;AAAA,IAC1C,MAAM,KAAK;AAAA,EACb,CAAC;AACD,UAAQ,IAAI,aAAa,OAAO,QAAQ,EAAE;AAC1C,UAAQ,IAAI,aAAa,OAAO,MAAM,EAAE;AACxC,UAAQ,IAAI,aAAa,OAAO,KAAK,EAAE;AACvC,UAAQ,IAAI,aAAa,OAAO,OAAO,EAAE;AACzC,UAAQ,IAAI,aAAa,OAAO,WAAW,EAAE;AAC7C,UAAQ,IAAI,aAAa,OAAO,eAAe,EAAE;AACjD,UAAQ,IAAI,aAAa,OAAO,aAAa,EAAE;AACjD,CAAC;AAEH,cACG,QAAQ,eAAe,EACvB,YAAY,2DAA2D,EACvE,OAAO,qBAAqB,2BAA2B,EACvD,OAAO,CAAC,SAAS;AAChB,QAAM,KAAK,OAAO;AAClB,QAAM,SAAS,2BAA2B;AAC1C,QAAM,SAAS,sBAAsB,IAAI,QAAQ;AAAA,IAC/C,MAAM,KAAK;AAAA,EACb,CAAC;AACD,UAAQ,IAAI,iCAAiC,OAAO,WAAW,QAAQ;AACvE,UAAQ,IAAI,2BAA2B,OAAO,YAAY,QAAQ;AACpE,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,gDAAgD,EAC5D,SAAS,WAAW,cAAc,EAClC,OAAO,qBAAqB,gBAAgB,EAC5C,OAAO,mBAAmB,eAAe,IAAI,EAC7C,OAAO,OAAO,OAAe,SAAS;AACrC,QAAM,KAAK,OAAO;AAClB,QAAM,SAAS,2BAA2B;AAC1C,QAAM,UAAU,MAAM,aAAa,IAAI,OAAO,QAAQ;AAAA,IACpD,MAAM,KAAK;AAAA,IACX,OAAO,SAAS,KAAK,KAAK;AAAA,EAC5B,CAAC;AAED,MAAI,QAAQ,WAAW,GAAG;AACxB,YAAQ,IAAI,6BAA6B;AACzC;AAAA,EACF;AAEA,aAAW,KAAK,SAAS;AACvB,YAAQ;AAAA,MACN,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,CAAC,CAAC,YAAY,EAAE,MAAM,QAAQ,CAAC,CAAC,QAAQ,EAAE,WAAW,QAAQ,CAAC,CAAC,QAAQ,EAAE,cAAc,QAAQ,CAAC,CAAC,MAAM,EAAE,OAAO,MAAM,KAAK,EAAE,OAAO,IAAI;AAAA,IAClK;AAAA,EACF;AACF,CAAC;AAIH,QACG,QAAQ,QAAQ,EAChB,YAAY,oCAAoC,EAChD,SAAS,eAAe,WAAW,EACnC,SAAS,YAAY,4FAA4F,EACjH,OAAO,sBAAsB,cAAc,KAAK,EAChD,OAAO,CAAC,gBAAwB,QAAgB,SAAS;AACxD,QAAM,KAAK,OAAO;AAClB,QAAM,MAAM,aAAa,IAAI,cAAc;AAC3C,MAAI,CAAC,KAAK;AACR,YAAQ,MAAM,qBAAqB,cAAc,EAAE;AACnD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,eAAe,CAAC,aAAa,aAAa,kBAAkB,kBAAkB,iBAAiB,eAAe;AACpH,MAAI,CAAC,aAAa,SAAS,MAAM,GAAG;AAClC,YAAQ,MAAM,wBAAwB,aAAa,KAAK,IAAI,CAAC,EAAE;AAC/D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,KAAK,aAAa,IAAI,IAAI,IAAI,KAAK,SAAS,MAAa;AAC/D,sBAAoB,IAAI;AAAA,IACtB,YAAY,KAAK;AAAA,IACjB,MAAM,IAAI;AAAA,IACV,MAAM,IAAI;AAAA,IACV,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,YAAY,CAAC,IAAI,EAAE;AAAA,IACnB,SAAS,EAAE,OAAO;AAAA,IAClB,QAAQ,EAAE,WAAW,GAAG;AAAA,EAC1B,CAAC;AACD,UAAQ,IAAI,oBAAoB,GAAG,MAAM,GAAG,CAAC,CAAC,EAAE;AAEhD,QAAM,QAAQ,eAAe,IAAI,IAAI,EAAE;AACvC,UAAQ,IAAI,UAAU,KAAK,UAAU,KAAK,CAAC;AAC7C,CAAC;AAIH,QACG,QAAQ,OAAO,EACf,YAAY,oCAAoC,EAChD,SAAS,UAAU,iBAAiB,EACpC,OAAO,qBAAqB,mBAAmB,EAC/C,OAAO,CAAC,MAAc,SAAS;AAC9B,QAAM,SAAS,WAAW,MAAM,KAAK,IAAI;AACzC,UAAQ,IAAI,gBAAgB,OAAO,KAAK,EAAE;AAC1C,UAAQ,IAAI,gBAAgB,OAAO,cAAc,QAAQ,EAAE;AAC3D,UAAQ,IAAI,gBAAgB,OAAO,sBAAsB,IAAI,MAAM,EAAE,GAAG,OAAO,mBAAmB,EAAE;AACpG,UAAQ,IAAI,gBAAgB,OAAO,MAAM,EAAE;AAC7C,CAAC;AAIH,IAAM,YAAY,QACf,QAAQ,QAAQ,EAChB,YAAY,6BAA6B;AAE5C,UACG,QAAQ,QAAQ,EAChB,YAAY,sBAAsB,EAClC,eAAe,cAAc,iBAAiB,EAC9C,eAAe,iBAAiB,2IAA2I,EAC3K,eAAe,mBAAmB,qBAAqB,EACvD,OAAO,CAAC,SAAS;AAChB,QAAM,KAAK,OAAO;AAClB,QAAM,SAAS,KAAK,MAAM,KAAK,MAAM;AACrC,QAAM,KAAK,aAAa,IAAI,KAAK,KAAK,KAAK,MAAM,MAAM;AACvD,UAAQ,IAAI,mBAAmB,GAAG,MAAM,GAAG,CAAC,CAAC,EAAE;AACjD,CAAC;AAEH,UACG,QAAQ,MAAM,EACd,YAAY,0BAA0B,EACtC,eAAe,cAAc,iBAAiB,EAC9C,OAAO,CAAC,SAAS;AAChB,QAAM,KAAK,OAAO;AAClB,QAAM,QAAQ,aAAa,IAAI,KAAK,GAAG;AACvC,MAAI,MAAM,WAAW,GAAG;AACtB,YAAQ,IAAI,cAAc;AAC1B;AAAA,EACF;AACA,aAAW,KAAK,OAAO;AACrB,YAAQ,IAAI,GAAG,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,UAAU,OAAO,KAAK,KAAK,EAAE,SAAS,KAAK,KAAK,UAAU,EAAE,MAAM,CAAC,EAAE;AAAA,EAC9G;AACF,CAAC;AAEH,UACG,QAAQ,QAAQ,EAChB,YAAY,yBAAyB,EACrC,SAAS,QAAQ,WAAW,EAC5B,SAAS,WAAW,WAAW,EAC/B,OAAO,CAAC,IAAY,UAAkB;AACrC,QAAM,KAAK,OAAO;AAClB,eAAa,IAAI,IAAI,UAAU,IAAI;AACnC,UAAQ,IAAI,UAAU,GAAG,MAAM,GAAG,CAAC,CAAC,IAAI,UAAU,OAAO,YAAY,UAAU,GAAG;AACpF,CAAC;AAEH,UACG,QAAQ,QAAQ,EAChB,YAAY,iBAAiB,EAC7B,SAAS,QAAQ,WAAW,EAC5B,OAAO,CAAC,OAAe;AACtB,QAAM,KAAK,OAAO;AAClB,eAAa,IAAI,EAAE;AACnB,UAAQ,IAAI,UAAU,GAAG,MAAM,GAAG,CAAC,CAAC,WAAW;AACjD,CAAC;AAEH,UACG,QAAQ,OAAO,EACf,YAAY,qCAAqC,EACjD,eAAe,cAAc,iBAAiB,EAC9C,SAAS,eAAe,WAAW,EACnC,OAAO,CAAC,UAAkB,SAAS;AAClC,QAAM,KAAK,OAAO;AAClB,QAAM,MAAM,aAAa,IAAI,QAAQ;AACrC,MAAI,CAAC,KAAK;AACR,YAAQ,MAAM,qBAAqB,QAAQ,EAAE;AAC7C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,aAAa,eAAe,IAAI,KAAK,KAAK,GAAG;AACnD,MAAI,WAAW,WAAW,GAAG;AAC3B,YAAQ,IAAI,uBAAuB;AAAA,EACrC,OAAO;AACL,eAAW,KAAK,YAAY;AAC1B,cAAQ,IAAI,IAAI,EAAE,WAAW,UAAU,MAAM,KAAK,EAAE,SAAS,KAAK,EAAE,OAAO,EAAE;AAAA,IAC/E;AAAA,EACF;AACF,CAAC;AAIH,IAAM,cAAc,QACjB,QAAQ,UAAU,EAClB,YAAY,2BAA2B;AAE1C,YACG,QAAQ,SAAS,EACjB,YAAY,+BAA+B,EAC3C,SAAS,eAAe,WAAW,EACnC,eAAe,cAAc,iBAAiB,EAC9C,OAAO,eAAe,gBAAgB,KAAK,EAC3C,OAAO,CAAC,UAAkB,SAAS;AAClC,QAAM,KAAK,OAAO;AAClB,QAAM,MAAM,aAAa,IAAI,QAAQ;AACrC,MAAI,CAAC,KAAK;AACR,YAAQ,MAAM,qBAAqB,QAAQ,EAAE;AAC7C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,KAAK,gBAAgB,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,EAAE;AACxD,UAAQ,IAAI,uBAAuB,GAAG,MAAM,GAAG,CAAC,CAAC,EAAE;AACrD,CAAC;AAEH,YACG,QAAQ,MAAM,EACd,YAAY,wBAAwB,EACpC,eAAe,cAAc,iBAAiB,EAC9C,OAAO,CAAC,SAAS;AAChB,QAAM,KAAK,OAAO;AAClB,QAAM,UAAU,qBAAqB,IAAI,KAAK,GAAG;AACjD,MAAI,QAAQ,WAAW,GAAG;AACxB,YAAQ,IAAI,uBAAuB;AACnC;AAAA,EACF;AACA,aAAW,KAAK,SAAS;AACvB,YAAQ,IAAI,GAAG,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,YAAY,EAAE,UAAU,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,YAAY,KAAK,EAAE,UAAU,EAAE;AAAA,EAC7G;AACF,CAAC;AAEH,YACG,QAAQ,SAAS,EACjB,YAAY,2BAA2B,EACvC,SAAS,iBAAiB,aAAa,EACvC,SAAS,cAAc,oBAAoB,EAC3C,OAAO,eAAe,eAAe,KAAK,EAC1C,OAAO,qBAAqB,QAAQ,EACpC,OAAO,CAAC,YAAoB,UAAkB,SAAS;AACtD,QAAM,KAAK,OAAO;AAClB,QAAMC,MAAK,gBAAgB,IAAI,YAAY,UAAiB,KAAK,IAAI,KAAK,MAAM;AAChF,MAAIA,KAAI;AACN,YAAQ,IAAI,YAAY,WAAW,MAAM,GAAG,CAAC,CAAC,WAAM,QAAQ,EAAE;AAAA,EAChE,OAAO;AACL,YAAQ,MAAM,qBAAqB;AAAA,EACrC;AACF,CAAC;AAIH,QACG,QAAQ,QAAQ,EAChB,YAAY,8BAA8B,EAC1C,OAAO,qBAAqB,gBAAgB,EAC5C,OAAO,aAAa,uBAAuB,EAC3C,OAAO,CAAC,SAAS;AAChB,QAAM,KAAK,OAAO;AAClB,MAAI,KAAK,IAAI;AACX,UAAM,MAAM,aAAa,IAAI,KAAK,EAAE;AACpC,QAAI,CAAC,KAAK;AACR,cAAQ,MAAM,qBAAqB,KAAK,EAAE,EAAE;AAC5C,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,QAAQ,mBAAmB,IAAI,IAAI,EAAE;AAC3C,QAAI,OAAO;AACT,cAAQ,IAAI,gBAAgB,MAAM,QAAQ,KAAK,QAAQ,CAAC,CAAC,GAAG;AAC5D,cAAQ,IAAI,gBAAgB,MAAM,uBAAuB,KAAK,QAAQ,CAAC,CAAC,GAAG;AAC3E,cAAQ,IAAI,gBAAgB,MAAM,sBAAsB,KAAK,QAAQ,CAAC,CAAC,GAAG;AAC1E,cAAQ,IAAI,gBAAgB,MAAM,wBAAwB,KAAK,QAAQ,CAAC,CAAC,GAAG;AAC5E,cAAQ,IAAI,gBAAgB,MAAM,yBAAyB,KAAK,QAAQ,CAAC,CAAC,GAAG;AAAA,IAC/E;AACA;AAAA,EACF;AACA,QAAM,SAAS,uBAAuB,IAAI,KAAK,IAAI;AACnD,UAAQ,IAAI,mBAAmB,MAAM,CAAC;AACxC,CAAC;AAIH,IAAM,gBAAgB,QACnB,QAAQ,gBAAgB,EACxB,YAAY,mCAAmC;AAElD,cACG,QAAQ,QAAQ,EAChB,YAAY,yBAAyB,EACrC,OAAO,qBAAqB,gBAAgB,EAC5C,OAAO,CAAC,SAAS;AAChB,QAAM,KAAK,OAAO;AAClB,QAAM,QAAQ,qBAAqB,IAAI,KAAK,IAAI;AAChD,MAAI,MAAM,WAAW,GAAG;AACtB,YAAQ,IAAI,iCAAiC;AAC7C;AAAA,EACF;AACA,aAAW,KAAK,OAAO;AACrB,YAAQ,IAAI,GAAG,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,KAAK,EAAE,kBAAkB,KAAK,EAAE,WAAW,EAAE;AAAA,EAC9F;AACA,UAAQ,IAAI;AAAA,EAAK,MAAM,MAAM,0BAA0B;AACzD,CAAC;AAEH,cACG,QAAQ,MAAM,EACd,YAAY,qBAAqB,EACjC,OAAO,cAAc,oBAAoB,EACzC,OAAO,gBAAgB,sBAAsB,EAC7C,OAAO,CAAC,SAAS;AAChB,QAAM,KAAK,OAAO;AAClB,QAAM,WAAW,KAAK,WAAW,OAAO,KAAK,aAAa,QAAQ;AAClE,QAAM,QAAQ,mBAAmB,IAAI,EAAE,SAAS,CAAC;AACjD,MAAI,MAAM,WAAW,GAAG;AACtB,YAAQ,IAAI,oBAAoB;AAChC;AAAA,EACF;AACA,aAAW,KAAK,OAAO;AACrB,UAAM,SAAS,EAAE,WAAW,aAAa;AACzC,YAAQ,IAAI,GAAG,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,MAAM,MAAM,KAAK,EAAE,QAAQ,IAAI,EAAE,kBAAkB,KAAK,EAAE,WAAW,EAAE;AAAA,EACxG;AACF,CAAC;AAEH,cACG,QAAQ,SAAS,EACjB,YAAY,+CAA+C,EAC3D,SAAS,sBAAsB,kBAAkB,EACjD,SAAS,oBAAoB,mBAAmB,EAChD,OAAO,kBAAkB,gBAAgB,KAAK,EAC9C,OAAO,qBAAqB,mBAAmB,EAC/C,OAAO,CAAC,KAAa,QAAgB,SAAS;AAC7C,QAAM,KAAK,OAAO;AAClB,QAAMA,MAAK,qBAAqB,IAAI,KAAK,QAAQ,KAAK,OAAO,KAAK,MAAM;AACxE,MAAIA,KAAI;AACN,YAAQ,IAAI,iBAAiB,IAAI,MAAM,GAAG,CAAC,CAAC,mBAAmB,OAAO,MAAM,GAAG,CAAC,CAAC,GAAG;AAAA,EACtF,OAAO;AACL,YAAQ,MAAM,0BAA0B;AAAA,EAC1C;AACF,CAAC;AAEH,cACG,QAAQ,cAAc,EACtB,YAAY,sDAAsD,EAClE,OAAO,qBAAqB,gBAAgB,EAC5C,OAAO,CAAC,SAAS;AAChB,QAAM,KAAK,OAAO;AAClB,QAAM,QAAQ,0BAA0B,IAAI,KAAK,IAAI;AACrD,UAAQ,IAAI,iBAAiB,KAAK,oBAAoB;AACxD,CAAC;AAIH,QACG,QAAQ,OAAO,EACf,YAAY,yCAAyC,EACrD,OAAO,qBAAqB,2BAA2B,EACvD,OAAO,oBAAoB,wCAAwC,IAAI,EACvE,OAAO,uBAAuB,0CAA0C,IAAI,EAC5E,OAAO,wBAAwB,2CAA2C,GAAG,EAC7E,OAAO,oBAAoB,wCAAwC,KAAK,EACxE,OAAO,aAAa,gCAAgC,EACpD,OAAO,CAAC,SAAS;AAChB,QAAM,KAAK,OAAO;AAClB,QAAM,SAAS,cAAc,IAAI;AAAA,IAC/B,MAAM,KAAK;AAAA,IACX,YAAY,SAAS,KAAK,SAAS;AAAA,IACnC,yBAAyB,SAAS,KAAK,YAAY;AAAA,IACnD,0BAA0B,SAAS,KAAK,aAAa;AAAA,IACrD,kBAAkB,WAAW,KAAK,SAAS;AAAA,IAC3C,SAAS,KAAK,UAAU;AAAA,EAC1B,CAAC;AACD,UAAQ,IAAI,kBAAkB,QAAQ,KAAK,UAAU,KAAK,CAAC;AAC7D,CAAC;AAIH,IAAM,WAAW,QACd,QAAQ,OAAO,EACf,YAAY,+BAA+B;AAE9C,SACG,QAAQ,MAAM,EACd,YAAY,+BAA+B,EAC3C,SAAS,eAAe,WAAW,EACnC,OAAO,CAAC,aAAqB;AAC5B,QAAM,KAAK,OAAO;AAClB,QAAM,MAAM,aAAa,IAAI,QAAQ;AACrC,MAAI,CAAC,KAAK;AACR,YAAQ,MAAM,qBAAqB,QAAQ,EAAE;AAC7C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,UAAU,cAAc,IAAI,IAAI,EAAE;AACxC,UAAQ,IAAI,iBAAiB,OAAO,CAAC;AACvC,CAAC;AAEH,SACG,QAAQ,QAAQ,EAChB,YAAY,2BAA2B,EACvC,OAAO,mBAAmB,eAAe,IAAI,EAC7C,OAAO,CAAC,SAAS;AAChB,QAAM,KAAK,OAAO;AAClB,QAAM,UAAU,eAAe,IAAI,SAAS,KAAK,KAAK,CAAC;AACvD,UAAQ,IAAI,iBAAiB,OAAO,CAAC;AACvC,CAAC;AAEH,SACG,QAAQ,UAAU,EAClB,YAAY,uCAAuC,EACnD,SAAS,eAAe,WAAW,EACnC,SAAS,oBAAoB,+BAA+B,EAC5D,OAAO,kBAAkB,0BAA0B,KAAK,EACxD,OAAO,CAAC,UAAkB,cAAsB,SAAS;AACxD,QAAM,KAAK,OAAO;AAClB,QAAM,MAAM,aAAa,IAAI,QAAQ;AACrC,MAAI,CAAC,KAAK;AACR,YAAQ,MAAM,qBAAqB,QAAQ,EAAE;AAC7C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAMA,MAAK,eAAe,IAAI,IAAI,IAAI,cAAc,KAAK,KAAK;AAC9D,MAAIA,KAAI;AACN,YAAQ,IAAI,UAAU,IAAI,GAAG,MAAM,GAAG,CAAC,CAAC,eAAe;AAAA,EACzD,OAAO;AACL,YAAQ,MAAM,wDAAwD;AAAA,EACxE;AACF,CAAC;AAIH,QACG,QAAQ,SAAS,EACjB,YAAY,kDAAkD,EAC9D,OAAO,qBAAqB,iBAAiB,EAC7C,OAAO,CAAC,SAAS;AAChB,QAAM,KAAK,OAAO;AAClB,QAAM,UAAU,sBAAsB,IAAI,KAAK,IAAI;AACnD,UAAQ,IAAI,2BAA2B,QAAQ,KAAK,EAAE;AACtD,UAAQ,IAAI,4BAA4B,QAAQ,QAAQ,KAAK,QAAQ,CAAC,CAAC,GAAG;AAC1E,UAAQ,IAAI,2BAA2B,QAAQ,YAAY,EAAE;AAC7D,UAAQ,IAAI,2BAA2B,QAAQ,WAAW,EAAE;AAC5D,UAAQ,IAAI,4BAA4B,QAAQ,aAAa,KAAK,QAAQ,CAAC,CAAC,GAAG;AAC/E,UAAQ,IAAI,4BAA4B,QAAQ,gBAAgB,KAAK,QAAQ,CAAC,CAAC,GAAG;AAClF,UAAQ,IAAI,4BAA4B,QAAQ,qBAAqB,KAAK,QAAQ,CAAC,CAAC,GAAG;AACvF,UAAQ,IAAI,KAAK;AACjB,UAAQ,IAAI,2BAA2B,QAAQ,wBAAwB,EAAE;AACzE,UAAQ,IAAI,2BAA2B,QAAQ,6BAA6B,QAAQ,CAAC,CAAC,EAAE;AACxF,UAAQ,IAAI,2BAA2B,QAAQ,2BAA2B,QAAQ,CAAC,CAAC,EAAE;AACxF,CAAC;AAIH,QACG,QAAQ,UAAU,EAClB,YAAY,6BAA6B,EACzC,OAAO,qBAAqB,gBAAgB,EAC5C,OAAO,sBAAsB,sBAAsB,EACnD,OAAO,qBAAqB,yCAAyC,EACrE,OAAO,iBAAiB,oHAAoH,EAC5I,OAAO,iBAAiB,uCAAuC,EAC/D,OAAO,mBAAmB,cAAc,IAAI,EAC5C,OAAO,CAAC,SAAS;AAChB,QAAM,KAAK,OAAO;AAClB,QAAM,SAAS,mBAAmB,IAAI;AAAA,IACpC,MAAM,KAAK;AAAA,IACX,YAAY,KAAK;AAAA,IACjB,QAAQ,KAAK;AAAA,IACb,YAAY,KAAK;AAAA,IACjB,OAAO,KAAK;AAAA,IACZ,OAAO,SAAS,KAAK,OAAO,EAAE;AAAA,EAChC,CAAC;AACD,MAAI,OAAO,WAAW,GAAG;AACvB,YAAQ,IAAI,oBAAoB;AAChC;AAAA,EACF;AACA,aAAW,SAAS,QAAQ;AAC1B,YAAQ;AAAA,MACN,GAAG,MAAM,UAAU,KAAK,MAAM,MAAM,IAAI,MAAM,UAAU,aAAa,MAAM,cAAc,GAAG,UAAU,MAAM,QAAQ,GAAG,cAAc,MAAM,WAAW,MAAM;AAAA,IAC9J;AAAA,EACF;AACA,UAAQ,IAAI;AAAA,EAAK,OAAO,MAAM,yBAAyB;AACzD,CAAC;AAEH,QACG,QAAQ,UAAU,EAClB,YAAY,+BAA+B,EAC3C,OAAO,qBAAqB,gBAAgB,EAC5C,OAAO,qBAAqB,yCAAyC,EACrE,OAAO,iBAAiB,oHAAoH,EAC5I,OAAO,iBAAiB,uCAAuC,EAC/D,OAAO,mBAAmB,gBAAgB,IAAI,EAC9C,OAAO,CAAC,SAAS;AAChB,QAAM,KAAK,OAAO;AAClB,QAAM,WAAW,qBAAqB,IAAI;AAAA,IACxC,MAAM,KAAK;AAAA,IACX,QAAQ,KAAK;AAAA,IACb,YAAY,KAAK;AAAA,IACjB,OAAO,KAAK;AAAA,IACZ,OAAO,SAAS,KAAK,OAAO,EAAE;AAAA,EAChC,CAAC;AACD,MAAI,SAAS,WAAW,GAAG;AACzB,YAAQ,IAAI,oBAAoB;AAChC;AAAA,EACF;AACA,aAAW,WAAW,UAAU;AAC9B,YAAQ;AAAA,MACN,GAAG,QAAQ,OAAO,KAAK,QAAQ,UAAU,UAAU,QAAQ,QAAQ,GAAG,YAAY,QAAQ,WAAW,WAAW,QAAQ,YAAY,KAAK,GAAG,CAAC;AAAA,IAC/I;AAAA,EACF;AACA,UAAQ,IAAI;AAAA,EAAK,SAAS,MAAM,kBAAkB;AACpD,CAAC;AAIH,IAAM,eAAe,oBAAoB;AACzC,IAAM,YAAY,QACf,QAAQ,QAAQ,EAChB,YAAY,iFAAiF;AAEhG,UACG,QAAQ,SAAS,EACjB,YAAY,oCAAoC,EAChD,OAAO,iBAAiB,eAAe,MAAM,EAC7C,OAAO,oBAAoB,iBAAiB,EAC5C,OAAO,mBAAmB,iBAAiB,YAAY,EACvD,OAAO,sBAAsB,+BAA+B,EAC5D,OAAO,0BAA0B,6BAA6B,EAC9D,OAAO,CAAC,SAAS;AAChB,QAAM,SAAS,eAAe;AAAA,IAC5B,OAAO,KAAK;AAAA,IACZ,MAAM,SAAS,KAAK,MAAM,EAAE;AAAA,IAC5B,SAAS,KAAK;AAAA,IACd,UAAU,KAAK;AAAA,IACf,cAAc,KAAK;AAAA,EACrB,CAAC;AACD,UAAQ,IAAI,eAAe,OAAO,KAAK,CAAC;AAC1C,CAAC;AAEH,UACG,QAAQ,OAAO,EACf,YAAY,6BAA6B,EACzC,OAAO,mBAAmB,iBAAiB,YAAY,EACvD,OAAO,CAAC,SAAS;AAChB,QAAM,SAAS,aAAa,KAAK,KAAK;AACtC,UAAQ,IAAI,eAAe,OAAO,KAAK,CAAC;AAC1C,CAAC;AAEH,UACG,QAAQ,MAAM,EACd,YAAY,kBAAkB,EAC9B,OAAO,mBAAmB,iBAAiB,YAAY,EACvD,OAAO,CAAC,SAAS;AAChB,QAAM,SAAS,YAAY,KAAK,KAAK;AACrC,UAAQ,IAAI,eAAe,OAAO,KAAK,CAAC;AAC1C,CAAC;AAEH,UACG,QAAQ,SAAS,EACjB,YAAY,qBAAqB,EACjC,OAAO,mBAAmB,iBAAiB,YAAY,EACvD,OAAO,CAAC,SAAS;AAChB,cAAY,KAAK,KAAK;AACtB,QAAM,SAAS,aAAa,KAAK,KAAK;AACtC,UAAQ,IAAI,eAAe,OAAO,KAAK,CAAC;AAC1C,CAAC;AAEH,UACG,QAAQ,QAAQ,EAChB,YAAY,qBAAqB,EACjC,OAAO,mBAAmB,iBAAiB,YAAY,EACvD,OAAO,CAAC,SAAS;AAChB,UAAQ,IAAI,eAAe,KAAK,KAAK,CAAC;AACxC,CAAC;AAEH,UACG,QAAQ,WAAW,EACnB,YAAY,oBAAoB,EAChC,OAAO,mBAAmB,iBAAiB,YAAY,EACvD,OAAO,CAAC,SAAS;AAChB,QAAM,SAAS,iBAAiB,KAAK,KAAK;AAC1C,UAAQ,IAAI,eAAe,OAAO,KAAK,CAAC;AAC1C,CAAC;AAIH,IAAM,iBAAiB,QACpB,QAAQ,aAAa,EACrB,YAAY,yDAAyD;AAExE,eACG,QAAQ,OAAO,EACf,YAAY,yDAAyD,EACrE,OAAO,YAAY;AAClB,QAAM,EAAE,aAAa,IAAI,MAAM,OAAO,qBAAwB;AAC9D,QAAM,KAAK,OAAO;AAClB,QAAM,QAAQ,aAAa,EAAE;AAC7B,UAAQ,IAAI,2BAA2B,MAAM,KAAK,EAAE;AACpD,UAAQ,IAAI,KAAK;AACjB,UAAQ,IAAI,2BAA2B,MAAM,UAAU,OAAO,EAAE;AAChE,UAAQ,IAAI,2BAA2B,MAAM,UAAU,OAAO,EAAE;AAChE,UAAQ,IAAI,2BAA2B,MAAM,UAAU,SAAS,EAAE;AAClE,UAAQ,IAAI,2BAA2B,MAAM,UAAU,SAAS,EAAE;AAClE,UAAQ,IAAI,KAAK;AACjB,UAAQ,IAAI,2BAA2B,MAAM,kBAAkB,EAAE;AACjE,UAAQ,IAAI,2BAA2B,MAAM,kBAAkB,EAAE;AACjE,MAAI,MAAM,sBAAsB,MAAM;AACpC,YAAQ,IAAI,4BAA4B,MAAM,qBAAqB,KAAM,QAAQ,CAAC,CAAC,GAAG;AAAA,EACxF;AACA,MAAI,MAAM,2BAA2B;AACnC,YAAQ,IAAI,2BAA2B,MAAM,yBAAyB,EAAE;AAAA,EAC1E;AACA,UAAQ,IAAI,KAAK;AACjB,UAAQ,IAAI,UAAU;AACtB,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,MAAM,OAAO,GAAG;AACzD,QAAI,UAAU,EAAG;AACjB,YAAQ,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC,IAAI,KAAK,EAAE;AAAA,EAC7C;AACF,CAAC;AAEH,eACG,QAAQ,MAAM,EACd,YAAY,+BAA+B,EAC3C,OAAO,yBAAyB,uCAAuC,SAAS,EAChF,OAAO,qBAAqB,gBAAgB,EAC5C,OAAO,qBAAqB,gBAAgB,EAC5C,OAAO,mBAAmB,eAAe,IAAI,EAC7C,OAAO,OAAO,SAAS;AACtB,QAAM,EAAE,UAAU,IAAI,MAAM,OAAO,qBAAwB;AAC3D,QAAM,KAAK,OAAO;AAClB,QAAM,QAAQ,UAAU,IAAI;AAAA,IAC1B,QAAQ,KAAK;AAAA,IACb,OAAO,KAAK,OAAO,CAAC,KAAK,IAAI,IAAI;AAAA,IACjC,MAAM,KAAK;AAAA,IACX,OAAO,SAAS,KAAK,OAAO,EAAE;AAAA,EAChC,CAAC;AACD,MAAI,MAAM,WAAW,GAAG;AACtB,YAAQ,IAAI,MAAM,KAAK,MAAM,SAAS;AACtC;AAAA,EACF;AACA,aAAW,KAAK,OAAO;AACrB,UAAM,MAAM,EAAE,WAAW,MAAM,GAAG,EAAE;AACpC,UAAM,SAAS,EAAE,GAAG,MAAM,GAAG,CAAC;AAC9B,UAAM,OAAO,EAAE,QAAQ;AACvB,UAAM,WAAW,EAAE,WAAW,IAAI,aAAa,EAAE,QAAQ,KAAK;AAC9D,UAAM,SAAS,EAAE,iBAAiB,KAAK,EAAE,eAAe,MAAM,GAAG,EAAE,CAAC,MAAM;AAC1E,YAAQ,IAAI,GAAG,MAAM,MAAM,EAAE,QAAQ,KAAK,EAAE,KAAK,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,OAAO,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC,IAAI,GAAG,GAAG,QAAQ,GAAG,MAAM,EAAE;AAAA,EACpI;AACF,CAAC;AAEH,eACG,QAAQ,MAAM,EACd,YAAY,oCAAoC,EAChD,SAAS,aAAa,mBAAmB,EACzC,OAAO,OAAO,cAAsB;AACnC,QAAM,EAAE,YAAY,UAAU,IAAI,MAAM,OAAO,qBAAwB;AACvE,QAAM,KAAK,OAAO;AAClB,QAAM,MAAM,UAAU,IAAI,EAAE,OAAO,IAAO,CAAC;AAC3C,QAAM,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,aAAa,EAAE,GAAG,WAAW,SAAS,CAAC;AAClF,MAAI,QAAQ,WAAW,GAAG;AACxB,YAAQ,MAAM,qBAAqB,SAAS,IAAI;AAChD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,MAAI,QAAQ,SAAS,GAAG;AACtB,YAAQ,MAAM,qBAAqB,SAAS,aAAa;AACzD,eAAW,KAAK,QAAS,SAAQ,MAAM,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,KAAK,EAAE,MAAM,EAAE;AAC1E,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAMA,MAAK,WAAW,IAAI,QAAQ,CAAC,EAAE,EAAE;AACvC,MAAIA,IAAI,SAAQ,IAAI,gBAAgB,QAAQ,CAAC,EAAE,EAAE,GAAG;AAAA,MAC/C,SAAQ,MAAM,cAAc;AACnC,CAAC;AAEH,IAAM,iBAAiB,eACpB,QAAQ,aAAa,EACrB,YAAY,kFAAkF;AAEjG,eACG,QAAQ,QAAQ,EAAE,WAAW,KAAK,CAAC,EACnC,YAAY,iDAAiD,EAC7D,OAAO,YAAY;AAClB,QAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,wBAA2B;AACpE,QAAM,QAAQ,gBAAgB;AAC9B,MAAI,MAAM,WAAW,GAAG;AACtB,YAAQ,IAAI,uCAAuC;AACnD,YAAQ,IAAI,mDAAmD;AAC/D,YAAQ,IAAI,sDAAsD;AAClE;AAAA,EACF;AACA,aAAW,QAAQ,OAAO;AACxB,UAAM,SAAS,KAAK,SAAS,KAAK,KAAK,MAAM,KAAK;AAClD,YAAQ,IAAI,GAAG,KAAK,SAAS,OAAO,EAAE,CAAC,IAAI,KAAK,OAAO,OAAO,CAAC,CAAC,IAAI,KAAK,OAAO,GAAG,MAAM,EAAE;AAAA,EAC7F;AACF,CAAC;AAEH,eACG,QAAQ,KAAK,EACb,YAAY,6DAA6D,EACzE,SAAS,cAAc,wBAAwB,EAC/C,SAAS,SAAS,iHAAiH,EACnI,OAAO,oBAAoB,2EAA2E,EACtG,OAAO,uBAAuB,8BAA8B,EAC5D,OAAO,2BAA2B,4CAA4C,EAC9E,OAAO,gBAAgB,yFAAyF,EAChH,OAAO,OAAO,aAAqB,QAA4B,SAAS;AACvE,QAAM,EAAE,WAAW,eAAe,IAAI,MAAM,OAAO,wBAA2B;AAC9E,QAAM,WAAW,gBAAgB,UAAU,iBAAiB;AAE5D,MAAI,aAAa,YAAY,aAAa,aAAa;AACrD,UAAM,MAAM,UAAU,MAAM,aAAa;AACzC,QAAI,CAAC,KAAK;AACR,cAAQ,MAAM,2DAA2D;AACzE,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,QAAI;AACF,gBAAU,UAAU,GAAG;AACvB,cAAQ,IAAI,UAAU,QAAQ,gDAAgD;AAAA,IAChF,SAAS,KAAK;AACZ,cAAQ,MAAM,wBAAyB,IAAc,OAAO,EAAE;AAC9D,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA;AAAA,EACF;AAEA,MAAI,aAAa,gBAAgB;AAC/B,QAAI;AACJ,QAAI,KAAK,WAAW;AAClB,YAAM,OAAO,MAAM,cAAc;AACjC,UAAI,CAAC,MAAM;AACT,gBAAQ,MAAM,oCAAoC;AAClD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,UAAI;AACF,sBAAc,KAAK,MAAM,IAAI;AAAA,MAM/B,SAAS,KAAK;AACZ,gBAAQ,MAAM,+BAAgC,IAAc,OAAO,EAAE;AACrE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF,OAAO;AACL,YAAM,MAAM,UAAU,MAAM,aAAa;AACzC,UAAI,CAAC,KAAK,YAAY,CAAC,KAAK,cAAc,CAAC,KAAK,cAAc,CAAC,KAAK;AAClE,gBAAQ;AAAA,UACN;AAAA,QAMF;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,oBAAc;AAAA,QACZ,UAAU,KAAK;AAAA,QACf,YAAY,KAAK;AAAA,QACjB,aAAa,KAAK;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AACA,QAAI;AACF,qBAAe,WAAW;AAC1B,cAAQ,IAAI,kEAAkE;AAC9E,cAAQ,IAAI,kBAAkB,YAAY,QAAQ,EAAE;AACpD,cAAQ,IAAI,kBAAkB,YAAY,UAAU,EAAE;AACtD,cAAQ,IAAI,kBAAkB,YAAY,WAAW,EAAE;AAAA,IACzD,SAAS,KAAK;AACZ,cAAQ,MAAM,iCAAkC,IAAc,OAAO,EAAE;AACvE,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA;AAAA,EACF;AAEA,UAAQ,MAAM,4DAA4D,WAAW,IAAI;AACzF,UAAQ,KAAK,CAAC;AAChB,CAAC;AAEH,eACG,QAAQ,OAAO,EACf,YAAY,qDAAqD,EACjE,SAAS,cAAc,wBAAwB,EAC/C,OAAO,OAAO,gBAAwB;AACrC,QAAM,EAAE,aAAa,IAAI,MAAM,OAAO,wBAA2B;AACjE,QAAM,WAAW,gBAAgB,UAAU,iBAAiB;AAC5D,MAAI,aAAa,YAAY,aAAa,eAAe,aAAa,gBAAgB;AACpF,YAAQ,MAAM,4DAA4D,WAAW,IAAI;AACzF,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,UAAU,aAAa,QAAQ;AACrC,MAAI,QAAS,SAAQ,IAAI,WAAW,QAAQ,6BAA6B;AAAA,MACpE,SAAQ,IAAI,MAAM,QAAQ,iCAAiC;AAClE,CAAC;AAEH,eACG,QAAQ,UAAU,EAClB,YAAY,6GAA6G,EACzH,OAAO,yBAAyB,qEAAqE,EACrG,OAAO,mBAAmB,gBAAgB,EAC1C,OAAO,iBAAiB,+CAA+C,CAAC,OAAe,MAAgB,CAAC,MAAM,CAAC,GAAG,KAAK,KAAK,GAAG,CAAC,CAAa,EAC7I,OAAO,iBAAiB,2BAA2B,EACnD,OAAO,aAAa,+BAA+B,GAAG,EACtD,OAAO,aAAa,2DAA2D,EAC/E,OAAO,aAAa,8EAA8E,EAClG,OAAO,UAAU,0BAA0B,EAC3C,OAAO,OAAO,SAAS;AACtB,QAAM,EAAE,sBAAsB,sBAAsB,YAAY,IAAI,MAAM,OAAO,0BAA6B;AAC9G,QAAM,EAAE,UAAU,IAAI,MAAM,OAAO,qBAAwB;AAC3D,QAAM,KAAK,OAAO;AAElB,MAAI,KAAK,SAAS;AAChB,UAAM,UAAU,UAAU,IAAI;AAAA,MAC5B,QAAQ;AAAA,MACR,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,OAAO;AAAA,MAC1C,MAAM,KAAK;AAAA,MACX,OAAO,SAAS,KAAK,KAAK,EAAE;AAAA,IAC9B,CAAC;AACD,UAAM,WAAW,QAAQ,IAAI,CAAC,UAAU;AAAA,MACtC,SAAS,KAAK;AAAA,MACd,MAAM,KAAK;AAAA,MACX,MAAM,KAAK;AAAA,MACX,QAAQ,YAAY,IAAI;AAAA,IAC1B,EAAE;AACF,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAC7C;AAAA,IACF;AACA,QAAI,SAAS,WAAW,GAAG;AACzB,cAAQ,IAAI,8BAA8B;AAC1C;AAAA,IACF;AACA,eAAW,KAAK,UAAU;AACxB,cAAQ,IAAI,KAAK,EAAE,QAAQ,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,KAAK,EAAE,QAAQ,GAAG,EAAE;AACrE,UAAI,CAAC,EAAE,QAAQ;AACb,gBAAQ,IAAI,uCAAuC;AACnD;AAAA,MACF;AACA,cAAQ,IAAI;AAAA,EAAc,EAAE,OAAO,MAAM;AAAA,CAAI;AAC7C,cAAQ,IAAI;AAAA,EAAY,EAAE,OAAO,IAAI;AAAA,CAAI;AACzC,UAAI,EAAE,OAAO,kBAAmB,SAAQ,IAAI;AAAA,EAAyB,EAAE,OAAO,iBAAiB;AAAA,CAAI;AACnG,cAAQ,IAAI,KAAK;AAAA,IACnB;AACA;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,qBAAqB,IAAI;AAAA,IAC5C,UAAU,KAAK;AAAA,IACf,OAAO,KAAK;AAAA,IACZ,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,OAAO;AAAA,IAC1C,MAAM,KAAK;AAAA,IACX,UAAU,SAAS,KAAK,KAAK,EAAE;AAAA,IAC/B,QAAQ,QAAQ,KAAK,MAAM;AAAA,EAC7B,CAAC;AACD,MAAI,KAAK,MAAM;AACb,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C;AAAA,EACF;AACA,UAAQ,IAAI,qBAAqB,MAAM,CAAC;AAC1C,CAAC;AAEH,eACG,QAAQ,SAAS,EACjB,YAAY,yGAAyG,EACrH,OAAO,WAAW,sCAAsC,EACxD,OAAO,mBAAmB,gGAAgG,EAC1H,OAAO,qBAAqB,qDAAqD,EACjF,OAAO,UAAU,0BAA0B,EAC3C,OAAO,UAAU,0BAA0B,EAC3C,OAAO,OAAO,SAAS;AACtB,QAAM,EAAE,yBAAyB,qBAAqB,kBAAkB,gBAAgB,IAAI,MAAM,OAAO,uBAA0B;AACnI,QAAM,KAAK,OAAO;AAElB,MAAI,KAAK,MAAM;AACb,UAAM,OAAO,gBAAgB,EAAE;AAC/B,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AACzC;AAAA,IACF;AACA,QAAI,KAAK,WAAW,GAAG;AACrB,cAAQ,IAAI,2BAA2B;AACvC;AAAA,IACF;AACA,eAAW,KAAK,MAAM;AACpB,YAAM,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,IAAI,gBAAgB,EAAE,WAAW,IAAI,oBAAoB,EAAE,QAAQ,IAAI,EAAE,KAAK,MAAM;AACrI,YAAM,UAAU,OAAO,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,GAAG;AACjF,cAAQ,IAAI,GAAG,EAAE,OAAO,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,YAAY,MAAM,GAAG,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK,OAAO,GAAG,IAAI,EAAE;AAAA,IAC3G;AACA;AAAA,EACF;AAEA,MAAI,KAAK,QAAQ;AACf,UAAM,MAAM,gBAAgB,IAAI,GAAM;AACtC,UAAM,QAAQ,IAAI,KAAK,CAAC,MAAM,EAAE,WAAW,KAAK,UAAU,EAAE,OAAO,WAAW,KAAK,MAAM,CAAC;AAC1F,QAAI,CAAC,OAAO;AACV,cAAQ,MAAM,4BAA4B,KAAK,MAAM,IAAI;AACzD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,SAAS,iBAAiB,IAAI,MAAM,MAAM;AAChD,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C;AAAA,IACF;AACA,YAAQ,IAAI,YAAY,OAAO,QAAQ,qBAAqB,OAAO,OAAO,MAAM,GAAG,CAAC,CAAC,aAAa,OAAO,OAAO,GAAG;AACnH,eAAW,CAAC,QAAQ,KAAK,KAAK,OAAO,QAAQ,OAAO,OAAO,GAAG;AAC5D,cAAQ,IAAI,KAAK,MAAM,KAAK,KAAK,EAAE;AAAA,IACrC;AACA;AAAA,EACF;AAEA,QAAM,SAAS,wBAAwB,IAAI;AAAA,IACzC,QAAQ,CAAC,KAAK;AAAA,IACd,MAAM,KAAK;AAAA,EACb,CAAC;AACD,MAAI,KAAK,MAAM;AACb,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C;AAAA,EACF;AACA,UAAQ,IAAI,oBAAoB,MAAM,CAAC;AACzC,CAAC;AAEH,eACG,QAAQ,SAAS,EACjB,YAAY,qEAAqE,EACjF,OAAO,iBAAiB,sCAAsC,EAC9D,OAAO,cAAc,wDAAwD,EAC7E,OAAO,iBAAiB,sCAAsC,EAC9D,OAAO,aAAa,2DAA2D,EAC/E,OAAO,UAAU,eAAe,EAChC,OAAO,OAAO,SAAS;AACtB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,MAAM,OAAO,uBAA0B;AAC3C,QAAM,KAAK,OAAO;AAElB,MAAI,KAAK,SAAS;AAChB,UAAM,QAAQ,qBAAqB,EAAE;AACrC,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAC1C;AAAA,IACF;AACA,QAAI,MAAM,WAAW,GAAG;AACtB,cAAQ,IAAI,gCAAgC;AAC5C;AAAA,IACF;AACA,eAAW,KAAK,OAAO;AACrB,YAAM,OAAO,EAAE,0BAA0B,OAAO,IAAI,EAAE,yBAAyB,KAAK,QAAQ,CAAC,CAAC,MAAM;AACpG,cAAQ,IAAI,GAAG,EAAE,SAAS,MAAM,GAAG,EAAE,CAAC,cAAc,IAAI,cAAc,EAAE,mBAAmB,aAAa,EAAE,wBAAwB,WAAW,EAAE,iBAAiB,UAAU,EAAE,0BAA0B,GAAG,EAAE,QAAQ,MAAM,EAAE,KAAK,MAAM,EAAE,EAAE;AAAA,IAC5O;AACA,QAAI,MAAM,UAAU,GAAG;AACrB,YAAM,OAAO,qBAAqB,MAAM,MAAM,SAAS,CAAC,GAAG,MAAM,CAAC,CAAC;AACnE,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,gCAA2B,KAAK,WAAW,QAAQ,CAAC,CAAC,KAAK;AACtE,cAAQ,IAAI,sBAAsB,KAAK,0BAA0B,IAAI,MAAM,EAAE,GAAG,KAAK,uBAAuB,QAAQ,CAAC,CAAC,IAAI;AAC1H,cAAQ,IAAI,sBAAsB,KAAK,kBAAkB,IAAI,MAAM,EAAE,GAAG,KAAK,cAAc,EAAE;AAC7F,cAAQ,IAAI,sBAAsB,KAAK,kBAAkB,IAAI,MAAM,EAAE,GAAG,KAAK,cAAc,EAAE;AAC7F,cAAQ,IAAI,sBAAsB,KAAK,sBAAsB,IAAI,MAAM,EAAE,GAAG,KAAK,kBAAkB,EAAE;AACrG,cAAQ,IAAI,sBAAsB,KAAK,qBAAqB,IAAI,MAAM,EAAE,GAAG,KAAK,iBAAiB,EAAE;AACnG,cAAQ,IAAI,sBAAsB,KAAK,mBAAmB,IAAI,MAAM,EAAE,GAAG,KAAK,eAAe,EAAE;AAC/F,cAAQ,IAAI,sBAAsB,KAAK,4BAA4B,IAAI,MAAM,EAAE,GAAG,KAAK,wBAAwB,EAAE;AACjH,cAAQ,IAAI,sBAAsB,KAAK,0BAA0B,IAAI,MAAM,EAAE,GAAG,KAAK,sBAAsB,EAAE;AAAA,IAC/G;AACA;AAAA,EACF;AAEA,QAAM,SAAS,qBAAqB,IAAI,EAAE,UAAU,KAAK,MAAM,CAAC;AAEhE,MAAI,KAAK,UAAU;AACjB,UAAM,MAAM,sBAAsB,IAAI,QAAQ,KAAK,IAAI;AACvD,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,UAAU,EAAE,UAAU,KAAK,OAAO,GAAG,MAAM,CAAC,CAAC;AAC9D;AAAA,IACF;AACA,YAAQ,IAAI,oBAAoB,MAAM,CAAC;AACvC,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,qBAAqB,IAAI,GAAG,MAAM,GAAG,CAAC,CAAC,OAAO,IAAI,SAAS,MAAM,GAAG,EAAE,CAAC,EAAE;AACrF;AAAA,EACF;AAEA,MAAI,KAAK,MAAM;AACb,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C;AAAA,EACF;AACA,UAAQ,IAAI,oBAAoB,MAAM,CAAC;AACzC,CAAC;AAEH,eACG,QAAQ,OAAO,EACf,YAAY,uEAAuE,EACnF,OAAO,iBAAiB,sCAAsC,EAC9D,OAAO,eAAe,4BAA4B,IAAI,EACtD,OAAO,UAAU,uBAAuB,EACxC,OAAO,OAAO,SAAS;AACtB,QAAM,EAAE,gBAAgB,kBAAkB,IAAI,MAAM,OAAO,qBAAgB;AAC3E,QAAM,KAAK,OAAO;AAClB,QAAM,UAAU,eAAe,IAAI;AAAA,IACjC,UAAU,KAAK;AAAA,IACf,aAAa,SAAS,KAAK,OAAO,EAAE;AAAA,EACtC,CAAC;AACD,MAAI,KAAK,MAAM;AACb,YAAQ,IAAI,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAC5C;AAAA,EACF;AACA,UAAQ,IAAI,kBAAkB,OAAO,CAAC;AACxC,CAAC;AAEH,eAAe,eAAuC;AACpD,QAAM,MAAM,MAAM,cAAc;AAChC,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,UAAU,IAAI,KAAK;AACzB,SAAO,QAAQ,SAAS,IAAI,UAAU;AACxC;AAEA,eAAe,gBAAwC;AACrD,MAAI,QAAQ,MAAM,MAAO,QAAO;AAChC,QAAM,SAAmB,CAAC;AAC1B,mBAAiB,SAAS,QAAQ,OAAO;AACvC,WAAO,KAAK,OAAO,KAAK,KAAK,CAAC;AAAA,EAChC;AACA,QAAM,OAAO,OAAO,OAAO,MAAM,EAAE,SAAS,OAAO;AACnD,SAAO,KAAK,SAAS,IAAI,OAAO;AAClC;AAIA,SAAS,iBAAoC;AAC3C,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,MAAM,QAAQ,IAAI;AACxB,MAAI,CAAC,OAAO,CAAC,IAAK,QAAO;AACzB,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,SAAS,QAAQ,IAAI;AAAA,IACrB,WAAW;AAAA,IACX,uBAAuB;AAAA,EACzB;AACF;AAEA,SAAS,gBAAgB,MAA0D;AACjF,MAAI,CAAC,KAAK,QAAS,QAAO,YAAY,KAAK,OAAO;AAClD,SAAO,KAAK,KAAK,OAAO,KAAK,OAAO,MAAM,UAAU,KAAK,OAAO;AAClE;AAEA,SAAS,gBAAgB,OAAe;AACtC,SAAO,UAAU,gBAAgB,gBAAgB;AACnD;AAEA,SAAS,cAAc,OAAe,UAAoB;AACxD,SAAO,CAAC,GAAG,UAAU,KAAK;AAC5B;AAEA,eAAe,kBAAkB,OAAiC;AAChE,QAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,mBAAwB;AACjE,QAAM,KAAK,gBAAgB;AAAA,IACzB,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,EAClB,CAAC;AACD,MAAI;AACF,UAAM,SAAS,MAAM,GAAG,SAAS,UAAU,KAAK,wCAAwC;AACxF,WAAO,aAAa,KAAK,OAAO,KAAK,CAAC;AAAA,EACxC,UAAE;AACA,OAAG,MAAM;AAAA,EACX;AACF;AAEA,SAAS,aAAa,IAA+B,QAAgB;AAEnE,QAAM,QAAQ,UAAU,IAAI,MAAM;AAClC,MAAI,MAAO,QAAO;AAGlB,QAAM,MAAM,aAAa,EAAE;AAC3B,QAAM,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,GAAG,WAAW,MAAM,CAAC;AACzD,MAAI,QAAQ,WAAW,EAAG,QAAO,QAAQ,CAAC;AAC1C,MAAI,QAAQ,SAAS,GAAG;AACtB,YAAQ,MAAM,qBAAqB,MAAM,aAAa;AACtD,eAAW,KAAK,QAAS,SAAQ,MAAM,KAAK,EAAE,EAAE,EAAE;AAClD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,SAAO;AACT;AAIA,IAAI,QAAQ,KAAK,CAAC,KAAK,YAAY,QAAQ,cAAc,QAAQ,KAAK,CAAC,CAAC,EAAE,MAAM;AAC9E,QAAM,QAAQ,WAAW,QAAQ,IAAI;AACvC;","names":["resolve","writeFileSync","readFileSync","join","existsSync","execFileSync","dirname","join","resolve","fileURLToPath","configPath","existsSync","mkdirSync","readFileSync","renameSync","writeFileSync","execFileSync","dirname","join","resolve","fileURLToPath","configPath","join","configPath","existsSync","readFileSync","ok","execFileSync","resolveHookCommandPrefix","commandHook","resolveCliPath","shellQuote","dirname","mkdirSync","writeFileSync","renameSync","resolve","fileURLToPath","existsSync","join","dirname","fileURLToPath","resolve","execFileSync","existsSync","readFileSync","join","existsSync","mkdirSync","writeFileSync","homedir","dirname","join","resolve","execFileSync","tryRun","stdioOpts","existsSync","mkdirSync","readFileSync","rmSync","writeFileSync","homedir","dirname","join","resolve","fileURLToPath","execFileSync","DEFAULT_LABEL","resolveConfig","readInstalledConfig","existsSync","configPath","join","readFileSync","require","mkdirSync","renameSync","rmSync","homedir","join","resolve","ok","readFileSync","writeFileSync"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/sync/client.ts","../src/setup/local.ts","../src/agents/claude-code.ts","../src/agents/utils.ts","../src/agents/codex.ts","../src/doctor/report.ts","../src/daemon/launchd.ts","../src/daemon/systemd.ts","../src/daemon/service.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { resolve } from \"node:path\";\nimport { writeFileSync, readFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { initDb, getDbPath, resetDb } from \"./db/client.js\";\nimport {\n listMemories,\n listRepos,\n getMemory,\n confirmMemory,\n rejectMemory,\n queryMemories,\n recordFeedback,\n} from \"./models/memory.js\";\nimport { scanAndStore } from \"./scanner/repo.js\";\nimport { compileContext, compileContextHybrid } from \"./compiler/context.js\";\nimport { processCorrection, processReviewFeedback } from \"./capture/correction.js\";\nimport { exportClaude, exportCodex, exportMarkdown } from \"./adapters/markdown.js\";\nimport { writeRepoContextArtifact } from \"./artifacts/context.js\";\nimport { inferRepoSlugFromPath } from \"./repo/discovery.js\";\nimport { sync, createTeam, joinTeam } from \"./sync/client.js\";\nimport { computeMetrics, formatMetricsReport, startEvalSession, endEvalSession } from \"./eval/harness.js\";\nimport { formatRetrievalEvalReport, loadRetrievalEvalFile, runRetrievalEval } from \"./eval/retrieval.js\";\nimport {\n bootstrapEmbeddings,\n ensureEmbeddingProviderReady,\n getEmbeddingModelInfo,\n hybridSearch,\n loadEmbeddingConfigFromEnv,\n rebuildEmbeddingIndex,\n verifyEmbeddings,\n} from \"./embeddings/embeddings.js\";\nimport { recordSignal, getSignalStats } from \"./feedback/implicit.js\";\nimport { inferScope, analyzeScopePatterns } from \"./capture/scope.js\";\nimport { createPolicy, listPolicies, togglePolicy, deletePolicy, evaluatePolicy, requestApproval, resolveApproval, listPendingApprovals } from \"./policy/engine.js\";\nimport { computeHealthScore, computeAllHealthScores, formatHealthReport } from \"./health/scoring.js\";\nimport { detectContradictions, resolveContradiction, autoResolveContradictions, listContradictions } from \"./contradictions/detector.js\";\nimport { pruneMemories, formatPruneReport } from \"./pruning/pruner.js\";\nimport { getAuditTrail, getRecentAudit, formatAuditTrail, rollbackMemory } from \"./audit/trail.js\";\nimport { getRepoQualityProfile } from \"./repo/quality.js\";\nimport { createActivityEvent, listActivityEvents, listActivitySessions } from \"./models/activity.js\";\nimport { runLocalSetup } from \"./setup/local.js\";\nimport { runRecallSetup } from \"./setup/local.js\";\nimport type { SyncConfig, EmbeddingConfig } from \"./types.js\";\nimport { createRequire } from \"node:module\";\nimport { pathToFileURL } from \"node:url\";\nimport { listHistorySnippets } from \"./history/snippets.js\";\nimport { searchHistorySnippets } from \"./history/retrieval.js\";\nimport { formatDoctorReport, getDoctorReport } from \"./doctor/report.js\";\nimport { ensureDailyBackup, listBackups, restoreBackup } from \"./backups/snapshot.js\";\nimport { getHookCallStats } from \"./hooks/calls.js\";\nimport {\n defaultServiceLabel,\n getServiceInfo,\n installService,\n startService,\n stopService,\n uninstallService,\n} from \"./daemon/service.js\";\nimport {\n dispatchCodexNotify,\n executePromptHook,\n executeSessionEndHook,\n executeSessionStartHook,\n executeToolHook,\n formatInjectionContext,\n formatMaintenanceBacklogContext,\n formatPendingConfirmationsContext,\n parseInteger,\n parseRecentToolCallsOption,\n readClaudeCodePromptInputFromStdin,\n readClaudeCodeSessionEndInputFromStdin,\n readClaudeCodeSessionStartInputFromStdin,\n readClaudeCodeToolInputFromStdin,\n readCodexPromptInputFromStdin,\n readCodexSessionEndInputFromStdin,\n readCodexSessionStartInputFromStdin,\n readCodexToolInputFromStdin,\n} from \"./cli/hook.js\";\n\nconst require = createRequire(import.meta.url);\nconst pkg = require(\"../package.json\");\n\nconst program = new Command();\n\nprogram\n .name(\"recall\")\n .description(\"Cross-tool coding memory and instruction compiler\")\n .version(pkg.version);\n\n// --- init ---\n\nprogram\n .command(\"init\")\n .description(\"Initialize Recall database\")\n .action(() => {\n initDb();\n console.log(\"Recall initialized. Database ready.\");\n });\n\nprogram\n .command(\"doctor\")\n .description(\"Show local Recall runtime, DB, embedding, and agent-install health\")\n .option(\"--json\", \"Emit raw JSON report\")\n .option(\"--fix\", \"Install missing hooks/MCP for detected agents\")\n .action((opts) => {\n const report = getDoctorReport();\n if (opts.fix) {\n const detectedAgents = report.agents\n .filter((a) => {\n if (!a.detected) return false;\n if (!a.mcp || !a.hooks) return true;\n // Claude Code: also fix if the CLAUDE.md memory-override block is\n // missing or stale, even when hooks + MCP are already wired.\n if (a.agent === \"claude-code\" && a.claude_md && a.claude_md !== \"current\") return true;\n return false;\n })\n .map((a) => a.agent);\n if (detectedAgents.length === 0) {\n if (!opts.json) console.log(\"Nothing to fix — all detected agents are wired.\");\n } else {\n const fixResult = runRecallSetup({\n agent: detectedAgents,\n });\n if (!opts.json) {\n console.log(`Applied fix for: ${detectedAgents.join(\", \")}`);\n for (const agent of fixResult.agents) {\n console.log(`${formatAgentName(agent.agent)} MCP: ${formatSetupStep(agent.mcp)}`);\n console.log(`${formatAgentName(agent.agent)} hooks: ${formatSetupStep(agent.hooks)}`);\n if (agent.claude_md) {\n console.log(`${formatAgentName(agent.agent)} CLAUDE.md: ${formatSetupStep(agent.claude_md)}`);\n }\n }\n console.log(\"\");\n }\n }\n }\n\n const finalReport = opts.fix ? getDoctorReport() : report;\n if (opts.json) {\n console.log(JSON.stringify(finalReport, null, 2));\n return;\n }\n console.log(formatDoctorReport(finalReport));\n });\n\nconst dbCmd = program\n .command(\"db\")\n .description(\"Manage the local Recall database\");\n\ndbCmd\n .command(\"reset\")\n .description(\"Reset the local Recall database and reinitialize the clean schema\")\n .option(\"--yes\", \"Confirm destructive reset\")\n .option(\"--yes-i-know\", \"Confirm destructive reset\")\n .option(\"--purge-models\", \"Also remove the local embedding model cache\")\n .action((opts) => {\n if (!opts.yes && !opts.yesIKnow) {\n console.error(\"Refusing to reset without --yes or --yes-i-know.\");\n process.exit(1);\n }\n\n const dbPath = getDbPath();\n resetDb(dbPath, { purgeModels: opts.purgeModels });\n initDb(dbPath);\n console.log(`Reset ${dbPath}`);\n if (opts.purgeModels) {\n console.log(\"Purged local embedding model cache.\");\n }\n });\n\ndbCmd\n .command(\"backup\")\n .description(\"Create a dated snapshot of the local database (idempotent per day)\")\n .option(\"--retention <n>\", \"Number of snapshots to retain\", (v) => Number.parseInt(v, 10))\n .action((opts) => {\n initDb();\n const result = ensureDailyBackup({\n retention: Number.isFinite(opts.retention) ? opts.retention : undefined,\n });\n if (result.created) console.log(`Created ${result.created}`);\n else console.log(\"Today's backup already exists.\");\n console.log(`Retained: ${result.retained.length}`);\n for (const p of result.retained) console.log(` ${p}`);\n if (result.removed.length) {\n console.log(`Removed: ${result.removed.length}`);\n for (const p of result.removed) console.log(` ${p}`);\n }\n });\n\ndbCmd\n .command(\"backups\")\n .description(\"List available database snapshots\")\n .action(() => {\n const backups = listBackups();\n if (backups.length === 0) {\n console.log(\"No backups yet.\");\n return;\n }\n for (const b of backups) {\n const mb = (b.size_bytes / 1024 / 1024).toFixed(2);\n console.log(`${b.date} ${mb} MB ${b.path}`);\n }\n });\n\ndbCmd\n .command(\"restore <date>\")\n .description(\"Restore the local database from a dated snapshot (YYYY-MM-DD)\")\n .option(\"--yes\", \"Confirm overwrite\")\n .action((date: string, opts) => {\n if (!opts.yes) {\n console.error(\"Refusing to restore without --yes.\");\n process.exit(1);\n }\n const result = restoreBackup(date);\n if (!result.restored) {\n console.error(`No backup found at ${result.from}`);\n process.exit(1);\n }\n console.log(`Restored ${result.from} -> ${result.to}`);\n });\n\nconst setupCmd = program\n .command(\"setup\")\n .description(\"Setup Recall for local use\");\n\nsetupCmd\n .option(\"--app-path <path>\", \"Override Recall.app path\", \"/Applications/Recall.app\")\n .option(\"--hooks-only\", \"Install hooks only\")\n .option(\"--mcp-only\", \"Install MCP wiring only\")\n .option(\"--agent <agent>\", \"Restrict setup to a single agent (repeatable)\", collectAgents, [])\n .option(\"--uninstall-hooks\", \"Remove Recall-managed hooks while leaving MCP configured\")\n .option(\"--dry-run\", \"Show planned setup changes without writing\")\n .option(\"--scope <scope>\", \"Hook config scope: global or project\", \"global\")\n .option(\"--no-prompt-injection\", \"Opt out of per-prompt memory injection (writes RECALL_HOOK_INJECT_PROMPT=false inline into the agent hook command)\")\n .option(\"--no-claude-md\", \"Skip installing the managed CLAUDE.md memory-override block for Claude Code (the block stops Claude's built-in auto-memory from racing Recall)\")\n .option(\"--yes\", \"Skip confirmation prompt\")\n .action(async (opts) => {\n if (!opts.yes && !opts.dryRun) {\n const confirmed = await confirmSetupWrite(opts.scope);\n if (!confirmed) {\n console.error(\"Aborted setup.\");\n process.exit(1);\n }\n }\n\n const result = runRecallSetup({\n appPath: opts.appPath,\n agent: opts.agent.length > 0 ? opts.agent : undefined,\n dryRun: opts.dryRun,\n hooksOnly: opts.hooksOnly,\n mcpOnly: opts.mcpOnly,\n scope: opts.scope,\n uninstallHooks: opts.uninstallHooks,\n promptInjection: opts.promptInjection,\n claudeMd: opts.claudeMd,\n });\n\n console.log(`Recall app: ${result.appPath}`);\n console.log(`Bundled node: ${result.runtimeNodePath}`);\n console.log(`Bundled CLI: ${result.runtimeCliPath}`);\n console.log(`Bundled MCP: ${result.runtimeMcpPath}`);\n console.log(`Scope: ${result.scope}${result.dry_run ? \" (dry-run)\" : \"\"}`);\n console.log(\"\");\n if (result.agents.length === 0) {\n console.log(\"No installed agents detected.\");\n return;\n }\n for (const agent of result.agents) {\n console.log(`${formatAgentName(agent.agent)}:`);\n console.log(` detected: ${agent.detected ? \"yes\" : \"no\"}`);\n console.log(` mcp: ${formatSetupStep(agent.mcp)}`);\n console.log(` hooks: ${formatSetupStep(agent.hooks)}`);\n if (agent.hook_config_path) {\n console.log(` config: ${agent.hook_config_path}`);\n }\n if (agent.claude_md) {\n console.log(` CLAUDE.md: ${formatSetupStep(agent.claude_md)}`);\n if (agent.claude_md_path) {\n console.log(` file: ${agent.claude_md_path}`);\n }\n }\n }\n });\n\nsetupCmd\n .command(\"local\")\n .description(\"Configure local agent MCP + hooks against the installed Recall.app\")\n .option(\"--app-path <path>\", \"Override Recall.app path\", \"/Applications/Recall.app\")\n .option(\"--codex-only\", \"Configure only Codex\")\n .option(\"--claude-only\", \"Configure only Claude\")\n .option(\"--no-prompt-injection\", \"Opt out of per-prompt memory injection (writes RECALL_HOOK_INJECT_PROMPT=false inline into the agent hook command)\")\n .option(\"--no-claude-md\", \"Skip installing the managed CLAUDE.md memory-override block for Claude Code\")\n .action((opts) => {\n const result = runLocalSetup({\n appPath: opts.appPath,\n codex: opts.claudeOnly ? false : true,\n claude: opts.codexOnly ? false : true,\n promptInjection: opts.promptInjection,\n claudeMd: opts.claudeMd,\n });\n\n console.log(`Recall app: ${result.appPath}`);\n console.log(`Bundled node: ${result.runtimeNodePath}`);\n console.log(`Bundled CLI: ${result.runtimeCliPath}`);\n console.log(`Bundled MCP: ${result.runtimeMcpPath}`);\n console.log(\"\");\n console.log(`Codex MCP: ${formatSetupStep(result.codex)}`);\n console.log(`Codex hooks: ${formatSetupStep(result.codex_hooks)}`);\n console.log(`Claude MCP: ${formatSetupStep(result.claude)}`);\n console.log(`Claude hooks: ${formatSetupStep(result.claude_hooks)}`);\n console.log(`Claude.md: ${formatSetupStep(result.claude_md)}`);\n });\n\n// --- hook ---\n\nconst hookCmd = program\n .command(\"hook\")\n .description(\"Run lifecycle hook handlers for agent integrations\");\n\n// Self-healing wrapper: lifecycle hooks must never break the host agent.\n// Failures are appended to ~/.recall/logs/hook-errors.log and the process\n// exits 0 silently so Claude Code / Codex don't surface a non-blocking error\n// during transient daemon restarts, schema upgrades, or first-run init.\nfunction safeHookAction<Args extends unknown[], R>(\n event: string,\n action: (...args: Args) => Promise<R>,\n): (...args: Args) => Promise<R | void> {\n return async (...args: Args) => {\n try {\n return await action(...args);\n } catch (error) {\n let logPath = \"~/.recall/logs/hook-errors.log\";\n try {\n const { appendFileSync, mkdirSync, statSync, renameSync, rmSync } = await import(\"node:fs\");\n const { homedir } = await import(\"node:os\");\n const dir = join(homedir(), \".recall\", \"logs\");\n mkdirSync(dir, { recursive: true });\n logPath = join(dir, \"hook-errors.log\");\n try {\n const maxBytes = parseInt(process.env.RECALL_HOOK_LOG_MAX_BYTES ?? String(1024 * 1024), 10);\n if (maxBytes > 0 && statSync(logPath).size >= maxBytes) {\n const rotated = `${logPath}.1`;\n try { rmSync(rotated, { force: true }); } catch {}\n renameSync(logPath, rotated);\n }\n } catch {\n // file missing is fine\n }\n const message = error instanceof Error\n ? error.stack ?? error.message\n : String(error);\n appendFileSync(\n logPath,\n `${new Date().toISOString()} ${event} ${message}\\n`,\n );\n } catch {\n // Logging best-effort only — never throw from the safety net.\n }\n // Single-line heads-up so the host TUI doesn't get flooded by stack\n // traces if it surfaces stderr. Full detail lives in the log file.\n process.stderr.write(\n `Recall: ${event} hook hit a snag — see ${logPath}\\n`,\n );\n process.exit(0);\n }\n };\n}\n\nhookCmd\n .command(\"prompt\")\n .description(\"Record a submitted prompt\")\n .option(\"--text <text>\", \"Prompt text\")\n .option(\"--repo <repo>\", \"Repository slug\")\n .option(\"--repo-path <path>\", \"Repository path\")\n .option(\"--session <id>\", \"Session ID\")\n .option(\"--path <path>\", \"File path context\")\n .option(\"--agent <agent>\", \"Agent name\")\n .option(\"--prev-assistant <text>\", \"Previous assistant turn\")\n .option(\"--recent-tools <json>\", \"Recent tool calls as a JSON array\")\n .option(\"--claude-code-stdin\", \"Read Claude Code hook JSON from stdin\")\n .option(\"--codex-stdin\", \"Read Codex hook JSON from stdin\")\n .action(safeHookAction(\"prompt\", async (opts) => {\n const stdinAgent = opts.claudeCodeStdin ? \"claude-code\" : opts.codexStdin ? \"codex\" : null;\n const input = stdinAgent === \"claude-code\"\n ? await readClaudeCodePromptInputFromStdin()\n : stdinAgent === \"codex\"\n ? await readCodexPromptInputFromStdin()\n : {\n text: opts.text,\n repo: opts.repo,\n repo_path: opts.repoPath,\n session_id: opts.session,\n path: opts.path,\n agent: opts.agent,\n prev_assistant_turn: opts.prevAssistant,\n recent_tool_calls: parseRecentToolCallsOption(opts.recentTools),\n };\n const result = await executePromptHook(input);\n if (stdinAgent && result.injection) {\n const output = {\n hookSpecificOutput: {\n hookEventName: \"UserPromptSubmit\",\n additionalContext: formatInjectionContext(result.injection),\n },\n };\n process.stdout.write(`${JSON.stringify(output)}\\n`);\n }\n }));\n\nhookCmd\n .command(\"tool\")\n .description(\"Record a completed tool invocation\")\n .option(\"--name <name>\", \"Tool name\")\n .option(\"--exit <code>\", \"Tool exit code\")\n .option(\"--repo <repo>\", \"Repository slug\")\n .option(\"--repo-path <path>\", \"Repository path\")\n .option(\"--session <id>\", \"Session ID\")\n .option(\"--path <path>\", \"File path context\")\n .option(\"--agent <agent>\", \"Agent name\")\n .option(\"--input-summary <text>\", \"Tool input summary\")\n .option(\"--claude-code-stdin\", \"Read Claude Code hook JSON from stdin\")\n .option(\"--codex-stdin\", \"Read Codex hook JSON from stdin\")\n .action(safeHookAction(\"tool\", async (opts) => {\n const input = opts.claudeCodeStdin\n ? await readClaudeCodeToolInputFromStdin()\n : opts.codexStdin\n ? await readCodexToolInputFromStdin()\n : {\n name: opts.name,\n exit_code: parseInteger(opts.exit, \"exit\"),\n repo: opts.repo,\n repo_path: opts.repoPath,\n session_id: opts.session,\n path: opts.path,\n agent: opts.agent,\n input_summary: opts.inputSummary,\n };\n await executeToolHook(input);\n }));\n\nhookCmd\n .command(\"session-start\")\n .description(\"Record session start\")\n .option(\"--session <id>\", \"Session ID\")\n .option(\"--agent <agent>\", \"Agent name\")\n .option(\"--repo <repo>\", \"Repository slug\")\n .option(\"--repo-path <path>\", \"Repository path\")\n .option(\"--path <path>\", \"File path context\")\n .option(\"--claude-code-stdin\", \"Read Claude Code hook JSON from stdin\")\n .option(\"--codex-stdin\", \"Read Codex hook JSON from stdin\")\n .action(safeHookAction(\"session-start\", async (opts) => {\n const stdinAgent = opts.claudeCodeStdin ? \"claude-code\" : opts.codexStdin ? \"codex\" : null;\n const input = stdinAgent === \"claude-code\"\n ? await readClaudeCodeSessionStartInputFromStdin()\n : stdinAgent === \"codex\"\n ? await readCodexSessionStartInputFromStdin()\n : {\n session_id: opts.session,\n agent: opts.agent,\n repo: opts.repo,\n repo_path: opts.repoPath,\n path: opts.path,\n };\n const result = await executeSessionStartHook(input);\n if (stdinAgent) {\n const parts: string[] = [];\n if (result.injection) parts.push(formatInjectionContext(result.injection));\n if (result.maintenance_backlog) {\n parts.push(formatMaintenanceBacklogContext(result.maintenance_backlog));\n }\n if (result.pending_confirmations) {\n parts.push(formatPendingConfirmationsContext(result.pending_confirmations));\n }\n if (parts.length > 0) {\n const output = {\n hookSpecificOutput: {\n hookEventName: \"SessionStart\",\n additionalContext: parts.join(\"\\n\\n\"),\n },\n };\n process.stdout.write(`${JSON.stringify(output)}\\n`);\n }\n }\n }));\n\nhookCmd\n .command(\"session-end\")\n .description(\"Record session end\")\n .option(\"--session <id>\", \"Session ID\")\n .option(\"--repo <repo>\", \"Repository slug\")\n .option(\"--repo-path <path>\", \"Repository path\")\n .option(\"--path <path>\", \"File path context\")\n .option(\"--agent <agent>\", \"Agent name\")\n .option(\"--turn-count <count>\", \"Turn count\")\n .option(\"--claude-code-stdin\", \"Read Claude Code hook JSON from stdin\")\n .option(\"--codex-stdin\", \"Read Codex hook JSON from stdin\")\n .action(safeHookAction(\"session-end\", async (opts) => {\n const input = opts.claudeCodeStdin\n ? await readClaudeCodeSessionEndInputFromStdin()\n : opts.codexStdin\n ? await readCodexSessionEndInputFromStdin()\n : {\n session_id: opts.session,\n repo: opts.repo,\n repo_path: opts.repoPath,\n path: opts.path,\n agent: opts.agent,\n turn_count: opts.turnCount ? parseInteger(opts.turnCount, \"turn-count\") : undefined,\n };\n await executeSessionEndHook(input);\n }));\n\nhookCmd\n .command(\"codex-notify\")\n .description(\"Bridge a Codex notify payload into Recall hook handlers\")\n .argument(\"[payload]\", \"Codex notify payload JSON\")\n .action(safeHookAction(\"codex-notify\", async (payload?: string) => {\n await dispatchCodexNotify(payload);\n }));\n\nhookCmd\n .command(\"stats\")\n .description(\"Inspect local hook call telemetry\")\n .option(\"--agent <agent>\", \"Filter by agent\")\n .option(\"--event <event>\", \"Filter by event\")\n .option(\"--limit <n>\", \"Limit rows\")\n .option(\"--json\", \"Emit raw JSON\")\n .action((opts) => {\n const db = initDb();\n const stats = getHookCallStats(db, {\n agent: opts.agent,\n event: opts.event,\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined,\n });\n\n if (opts.json) {\n console.log(JSON.stringify(stats, null, 2));\n return;\n }\n\n if (stats.length === 0) {\n console.log(\"No hook calls recorded.\");\n return;\n }\n\n for (const row of stats) {\n console.log(\n `${row.agent.padEnd(12)} ${row.event.padEnd(16)} total=${row.total_calls} ok=${row.ok_calls} err=${row.error_calls} avg=${row.avg_duration_ms.toFixed(1)}ms max=${row.max_duration_ms}ms last=${row.last_called_at}`,\n );\n }\n });\n\n// --- scan ---\n\nprogram\n .command(\"scan\")\n .description(\"Scan a repository and bootstrap memories\")\n .argument(\"[path]\", \"Repository path\", \".\")\n .option(\"-s, --session <id>\", \"Session ID\")\n .action((path: string, opts) => {\n const db = initDb();\n const repoPath = resolve(path);\n const ids = scanAndStore(db, repoPath);\n const artifact = writeRepoContextArtifact(db, {\n repo: inferRepoSlugFromPath(repoPath),\n repo_path: repoPath,\n });\n const scanned = ids\n .map((id) => getMemory(db, id))\n .filter((mem) => mem != null);\n const activeCount = scanned.filter((mem) => mem.status === \"active\").length;\n const candidateCount = scanned.filter((mem) => mem.status === \"candidate\").length;\n console.log(`Scanned ${repoPath}`);\n console.log(`Created ${ids.length} memories (${activeCount} active, ${candidateCount} candidate).`);\n if (artifact.output_path) {\n console.log(`Updated ${artifact.output_path}`);\n }\n createActivityEvent(db, {\n session_id: opts.session ?? null,\n repo: scanned[0]?.repo ?? null,\n source: \"cli\",\n event_type: \"scan\",\n memory_ids: ids,\n request: { repo_path: repoPath },\n result: { created: ids.length, active: activeCount, candidate: candidateCount },\n });\n\n if (ids.length > 0) {\n console.log(\"\\nMemories:\");\n for (const id of ids) {\n const mem = getMemory(db, id);\n if (mem) {\n console.log(\n ` [${mem.status}] (${mem.confidence.toFixed(2)}) ${mem.type}: ${mem.text}`,\n );\n }\n }\n console.log(\n \"\\nUse `recall confirm <id>` to promote candidates, or `recall reject <id>` to discard.\",\n );\n }\n });\n\n// --- list ---\n\nprogram\n .command(\"repos\")\n .description(\"List repositories known to Recall\")\n .action(() => {\n const db = initDb();\n const repos = listRepos(db);\n if (repos.length === 0) {\n console.log(\"No repositories found.\");\n return;\n }\n for (const repo of repos) {\n console.log(repo);\n }\n console.log(`\\n${repos.length} repos total.`);\n });\n\nprogram\n .command(\"list\")\n .description(\"List memories\")\n .option(\"-r, --repo <repo>\", \"Filter by repository\")\n .option(\n \"-s, --status <status>\",\n \"Filter by status (transient|candidate|active|rejected)\",\n )\n .option(\"-t, --type <type>\", \"Filter by type\")\n .option(\"-n, --limit <n>\", \"Limit results\")\n .option(\"--offset <n>\", \"Skip first N results\", \"0\")\n .action((opts) => {\n const db = initDb();\n const items = queryMemories(db, {\n repo: opts.repo,\n status: opts.status,\n type: opts.type,\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined,\n offset: opts.offset ? parseInt(opts.offset, 10) : undefined,\n });\n\n if (items.length === 0) {\n console.log(\"No memories found.\");\n return;\n }\n\n for (const m of items) {\n const prefix = m.id.slice(0, 8);\n console.log(\n `${prefix} [${m.status.padEnd(9)}] (${m.confidence.toFixed(2)}) ${m.type.padEnd(14)} ${m.text}`,\n );\n }\n console.log(`\\n${items.length} memories total.`);\n });\n\n// --- show ---\n\nprogram\n .command(\"show\")\n .description(\"Show memory details\")\n .argument(\"<id>\", \"Memory ID (full or prefix)\")\n .action((idPrefix: string) => {\n const db = initDb();\n const mem = findByPrefix(db, idPrefix);\n if (!mem) {\n console.error(`Memory not found: ${idPrefix}`);\n process.exit(1);\n }\n console.log(JSON.stringify(mem, null, 2));\n });\n\n// --- confirm ---\n\nprogram\n .command(\"confirm\")\n .description(\"Confirm a memory (promote to active)\")\n .argument(\"<id>\", \"Memory ID (full or prefix)\")\n .action((idPrefix: string) => {\n const db = initDb();\n const mem = findByPrefix(db, idPrefix);\n if (!mem) {\n console.error(`Memory not found: ${idPrefix}`);\n process.exit(1);\n }\n const ok = confirmMemory(db, mem.id);\n if (ok) {\n console.log(`Confirmed: ${mem.id.slice(0, 8)} → active`);\n } else {\n console.error(\"Could not confirm (may be rejected).\");\n }\n });\n\n// --- reject ---\n\nprogram\n .command(\"reject\")\n .description(\"Reject a memory (never inject again)\")\n .argument(\"<id>\", \"Memory ID (full or prefix)\")\n .action((idPrefix: string) => {\n const db = initDb();\n const mem = findByPrefix(db, idPrefix);\n if (!mem) {\n console.error(`Memory not found: ${idPrefix}`);\n process.exit(1);\n }\n rejectMemory(db, mem.id);\n console.log(`Rejected: ${mem.id.slice(0, 8)}`);\n });\n\n// --- compile ---\n\nprogram\n .command(\"compile\")\n .description(\"Compile active memories into injection pack\")\n .requiredOption(\"-r, --repo <repo>\", \"Repository name\")\n .option(\"-p, --path <path>\", \"File path for scoping\")\n .option(\"-q, --query <text>\", \"Optional query text for hybrid reranking\")\n .option(\"--include-candidates\", \"Allow strong candidate memories into hybrid ranking\")\n .option(\"-s, --session <id>\", \"Session ID\")\n .option(\"--threshold <n>\", \"Confidence threshold (default: dynamic from quality profile)\")\n .action(async (opts) => {\n const db = initDb();\n const result = opts.query || opts.includeCandidates\n ? await compileContextHybrid(db, {\n repo: opts.repo,\n path: opts.path,\n query_text: opts.query,\n config: {\n ...(opts.threshold ? { confidence_threshold: parseFloat(opts.threshold) } : {}),\n include_candidates: opts.includeCandidates ?? false,\n },\n })\n : compileContext(db, {\n repo: opts.repo,\n path: opts.path,\n config: opts.threshold ? { confidence_threshold: parseFloat(opts.threshold) } : {},\n });\n createActivityEvent(db, {\n session_id: opts.session ?? null,\n repo: opts.repo,\n path: opts.path ?? null,\n source: \"cli\",\n event_type: \"compile\",\n memory_ids: result.memories_included,\n request: {\n threshold: opts.threshold ? parseFloat(opts.threshold) : null,\n query_text: opts.query ?? null,\n include_candidates: opts.includeCandidates ?? false,\n },\n result: {\n included: result.memories_included,\n dropped: result.memories_dropped,\n history_included: result.history_included,\n token_estimate: result.token_estimate,\n },\n });\n\n if (!result.text) {\n console.log(\"No context above threshold. Nothing to inject.\");\n return;\n }\n\n console.log(result.text);\n console.log(`---`);\n console.log(\n `${result.memories_included.length} memories included, ${result.history_included.length} history snippets included, ${result.memories_dropped.length} dropped, ~${result.token_estimate} tokens`,\n );\n });\n\n// --- correct ---\n\nprogram\n .command(\"correct\")\n .description(\"Report a correction to learn from\")\n .argument(\"<text>\", \"Correction text\")\n .option(\"-r, --repo <repo>\", \"Repository name\")\n .option(\"-p, --path <path>\", \"File path context\")\n .option(\"-s, --session <id>\", \"Session ID\", \"cli\")\n .action(async (text: string, opts) => {\n const db = initDb();\n const ids = await processCorrection(db, text, {\n sessionId: opts.session,\n repo: opts.repo,\n path: opts.path,\n });\n createActivityEvent(db, {\n session_id: opts.session,\n repo: opts.repo ?? null,\n path: opts.path ?? null,\n source: \"cli\",\n event_type: \"correction\",\n memory_ids: ids,\n request: { text },\n result: { created: ids },\n });\n\n if (ids.length === 0) {\n console.log(\"No correction pattern detected.\");\n console.log(\n 'Try: \"don\\'t use X, use Y\", \"always do Z\", \"let\\'s use editorconfig defaults\", or \"review said to use W\"',\n );\n return;\n }\n\n console.log(`Created ${ids.length} candidate(s):`);\n for (const id of ids) {\n const mem = getMemory(db, id);\n if (mem)\n console.log(` ${id.slice(0, 8)}: ${mem.text}`);\n }\n });\n\n// --- review ---\n\nprogram\n .command(\"review\")\n .description(\"Report review feedback\")\n .argument(\"<feedback>\", \"Review feedback text\")\n .option(\"-r, --repo <repo>\", \"Repository name\")\n .option(\"-p, --path <path>\", \"File path context\")\n .option(\"-s, --session <id>\", \"Session ID\", \"cli-review\")\n .option(\"--reviewer <name>\", \"Reviewer name\")\n .action(async (feedback: string, opts) => {\n const db = initDb();\n const ids = await processReviewFeedback(db, feedback, {\n sessionId: opts.session,\n repo: opts.repo,\n path: opts.path,\n reviewer: opts.reviewer,\n });\n createActivityEvent(db, {\n session_id: opts.session,\n repo: opts.repo ?? null,\n path: opts.path ?? null,\n source: \"cli\",\n event_type: \"review\",\n memory_ids: ids,\n request: { feedback, reviewer: opts.reviewer ?? null },\n result: { created: ids },\n });\n\n console.log(`Created ${ids.length} candidate(s) from review feedback.`);\n for (const id of ids) {\n const mem = getMemory(db, id);\n if (mem) console.log(` ${id.slice(0, 8)}: ${mem.text}`);\n }\n });\n\n// --- export ---\n\nprogram\n .command(\"export\")\n .description(\"Export memories as markdown instruction files\")\n .requiredOption(\"-r, --repo <repo>\", \"Repository name\")\n .option(\n \"-f, --format <format>\",\n \"Export format: claude | codex | markdown | context\",\n \"markdown\",\n )\n .option(\"-o, --output <path>\", \"Output file path\")\n .action((opts) => {\n const db = initDb();\n let content: string;\n\n switch (opts.format) {\n case \"claude\":\n content = exportClaude(db, opts.repo);\n break;\n case \"codex\":\n content = exportCodex(db, opts.repo);\n break;\n case \"context\": {\n const artifact = writeRepoContextArtifact(db, { repo: opts.repo });\n if (!artifact.output_path) {\n console.error(`Could not resolve local repo path for ${opts.repo}`);\n process.exit(1);\n }\n content = readFileSync(artifact.output_path, \"utf-8\");\n if (!opts.output) {\n console.log(content);\n return;\n }\n break;\n }\n default:\n content = exportMarkdown(db, opts.repo);\n }\n\n if (opts.output) {\n writeFileSync(opts.output, content);\n console.log(`Exported to ${opts.output}`);\n } else {\n console.log(content);\n }\n });\n\nprogram\n .command(\"publish\")\n .description(\"Write repo-local .recall/context.md for the current repo\")\n .argument(\"[path]\", \"Repository path\", \".\")\n .action((path: string) => {\n const db = initDb();\n const repoPath = resolve(path);\n const artifact = writeRepoContextArtifact(db, {\n repo: inferRepoSlugFromPath(repoPath),\n repo_path: repoPath,\n });\n if (!artifact.output_path) {\n console.error(`Could not write repo-local context for ${repoPath}`);\n process.exit(1);\n }\n console.log(`Wrote ${artifact.output_path}`);\n });\n\nconst historyCmd = program\n .command(\"history\")\n .description(\"Inspect rolled-up history snippets\");\n\nhistoryCmd\n .command(\"list\")\n .description(\"List history snippets\")\n .option(\"-r, --repo <repo>\", \"Filter by repository\")\n .option(\"-s, --session <id>\", \"Filter by session id\")\n .option(\"-k, --kind <kind>\", \"Filter by kind\")\n .option(\"-n, --limit <n>\", \"Limit results\", \"20\")\n .action((opts) => {\n const db = initDb();\n const items = listHistorySnippets(db, {\n repo: opts.repo,\n session_id: opts.session,\n kind: opts.kind,\n limit: parseInt(opts.limit, 10),\n });\n\n if (items.length === 0) {\n console.log(\"No history snippets found.\");\n return;\n }\n\n for (const item of items) {\n console.log(`${item.id.slice(0, 8)} [${item.kind}] repo=${item.repo ?? \"-\"} session=${item.session_id ?? \"-\"} ${item.text.split(\"\\n\")[0]}`);\n }\n });\n\nhistoryCmd\n .command(\"search\")\n .description(\"Search history snippets with hybrid lexical/vector retrieval\")\n .argument(\"<query>\", \"Search query\")\n .option(\"-r, --repo <repo>\", \"Filter by repository\")\n .option(\"-n, --limit <n>\", \"Limit results\", \"10\")\n .action(async (query: string, opts) => {\n const db = initDb();\n const results = await searchHistorySnippets(db, query, {\n repo: opts.repo,\n limit: parseInt(opts.limit, 10),\n });\n\n if (results.length === 0) {\n console.log(\"No matching history snippets found.\");\n return;\n }\n\n for (const result of results) {\n console.log(\n `${result.snippet.id.slice(0, 8)} (score=${result.score.toFixed(3)} vec=${result.similarity.toFixed(3)} lex=${result.lexical_score.toFixed(3)}) [${result.snippet.kind}] ${result.snippet.text.split(\"\\n\")[0]}`,\n );\n }\n });\n\n// --- serve (MCP) ---\n\nprogram\n .command(\"serve\")\n .description(\"Start the MCP server (stdio transport)\")\n .action(async () => {\n // Dynamic import to avoid loading MCP deps for other commands\n await import(\"./mcp/server.js\");\n });\n\n// --- Phase 2: sync ---\n\nconst syncCmd = program\n .command(\"sync\")\n .description(\"Sync memories with remote server\");\n\nsyncCmd\n .command(\"push\")\n .description(\"Push local memories to remote\")\n .action(async () => {\n const db = initDb();\n const config = loadSyncConfig();\n if (!config) {\n console.error(\"No sync config. Set RECALL_SYNC_URL and RECALL_SYNC_KEY.\");\n process.exit(1);\n }\n const result = await sync(db, config);\n console.log(`Pushed: ${result.pushed}, Pulled: ${result.pulled}, Conflicts: ${result.conflicts}`);\n if (result.errors.length > 0) {\n console.error(\"Errors:\", result.errors.join(\"; \"));\n }\n });\n\nsyncCmd\n .command(\"pull\")\n .description(\"Pull team memories from remote\")\n .action(async () => {\n const db = initDb();\n const config = loadSyncConfig();\n if (!config) {\n console.error(\"No sync config. Set RECALL_SYNC_URL and RECALL_SYNC_KEY.\");\n process.exit(1);\n }\n const result = await sync(db, config);\n console.log(`Pulled: ${result.pulled}, Conflicts: ${result.conflicts}`);\n });\n\n// --- Phase 2: team ---\n\nconst teamCmd = program\n .command(\"team\")\n .description(\"Manage teams\");\n\nteamCmd\n .command(\"create\")\n .description(\"Create a new team\")\n .argument(\"<name>\", \"Team name\")\n .action(async (name: string) => {\n const config = loadSyncConfig();\n if (!config) {\n console.error(\"No sync config.\");\n process.exit(1);\n }\n const teamId = await createTeam(config, name);\n console.log(`Team created: ${teamId}`);\n console.log(`Set RECALL_TEAM_ID=${teamId} to use this team.`);\n });\n\nteamCmd\n .command(\"join\")\n .description(\"Join an existing team\")\n .argument(\"<team-id>\", \"Team ID\")\n .action(async (teamId: string) => {\n const config = loadSyncConfig();\n if (!config) {\n console.error(\"No sync config.\");\n process.exit(1);\n }\n await joinTeam(config, teamId);\n console.log(`Joined team: ${teamId}`);\n });\n\n// --- Phase 2: eval ---\n\nconst evalCmd = program\n .command(\"eval\")\n .description(\"Evaluation metrics\");\n\nevalCmd\n .command(\"report\")\n .description(\"Show evaluation metrics report\")\n .option(\"-r, --repo <repo>\", \"Filter by repo\")\n .option(\"--since <date>\", \"Since date (ISO)\")\n .action((opts) => {\n const db = initDb();\n const metrics = computeMetrics(db, { repo: opts.repo, since: opts.since });\n console.log(formatMetricsReport(metrics));\n });\n\nevalCmd\n .command(\"start\")\n .description(\"Start an eval session\")\n .requiredOption(\"-r, --repo <repo>\", \"Repository name\")\n .action((opts) => {\n const db = initDb();\n const id = startEvalSession(db, opts.repo);\n console.log(`Eval session started: ${id}`);\n });\n\nevalCmd\n .command(\"end\")\n .description(\"End an eval session\")\n .argument(\"<session-id>\", \"Session ID\")\n .action((sessionId: string) => {\n const db = initDb();\n endEvalSession(db, sessionId);\n console.log(`Eval session ended: ${sessionId}`);\n });\n\nevalCmd\n .command(\"retrieval\")\n .description(\"Run retrieval eval fixtures against baseline vs hybrid retrieval\")\n .requiredOption(\"-f, --file <path>\", \"Fixture file path\")\n .option(\"-p, --provider <providers>\", \"Providers to compare (comma-separated: current,nomic,multilingual-e5,bge-small-en-v1.5)\", \"current\")\n .option(\"--json\", \"Emit raw JSON report\")\n .action(async (opts) => {\n const db = initDb();\n const input = loadRetrievalEvalFile(opts.file);\n const providers = String(opts.provider)\n .split(\",\")\n .map((value) => value.trim())\n .filter(Boolean) as Array<\"current\" | \"nomic\" | \"multilingual-e5\" | \"bge-small-en-v1.5\">;\n const report = await runRetrievalEval(db, input, { providers });\n\n if (opts.json) {\n console.log(JSON.stringify(report, null, 2));\n return;\n }\n\n console.log(formatRetrievalEvalReport(report));\n });\n\n// --- Phase 1: embeddings ---\n\nconst embeddingsCmd = program\n .command(\"embeddings\")\n .description(\"Manage canonical embedding state\");\n\nembeddingsCmd\n .command(\"setup\")\n .description(\"Pre-fetch the active embedding model into the local cache\")\n .action(async () => {\n const config = loadEmbeddingConfigFromEnv();\n if (!config) {\n console.error(\"Embeddings are disabled. Unset RECALL_EMBEDDINGS_DISABLED=true to enable local embeddings.\");\n process.exit(1);\n }\n\n const before = getEmbeddingModelInfo(config)!;\n if (!before.cached) {\n const approx = before.estimated_size_mb ? `~${before.estimated_size_mb}MB` : \"download\";\n console.log(`Fetching embedding model (one-time, ${approx}) -> ${before.cache_path}`);\n }\n\n const info = await ensureEmbeddingProviderReady(config);\n if (!info) {\n console.error(\"Failed to initialize embedding provider.\");\n process.exit(1);\n }\n\n console.log(`Provider: ${info.provider}`);\n console.log(`Model: ${info.model}`);\n console.log(`Cache: ${info.cache_path}`);\n console.log(`Size: ${info.size_label}`);\n });\n\nembeddingsCmd\n .command(\"info\")\n .description(\"Show active embedding provider and cache details\")\n .action(() => {\n const info = getEmbeddingModelInfo();\n if (!info) {\n console.error(\"Embeddings are disabled. Unset RECALL_EMBEDDINGS_DISABLED=true to enable local embeddings.\");\n process.exit(1);\n }\n\n console.log(`Provider: ${info.provider}`);\n console.log(`Model: ${info.model}`);\n console.log(`Dims: index=${info.index_dimensions} canonical=${info.canonical_dimensions}`);\n console.log(`Version: ${info.version}`);\n console.log(`Cached: ${info.cached ? \"yes\" : \"no\"}`);\n console.log(`Size: ${info.size_label}`);\n console.log(`Cache: ${info.cache_path}`);\n if (info.task_prefix) {\n console.log(`Prefix: ${info.task_prefix}`);\n }\n });\n\nembeddingsCmd\n .command(\"bootstrap\")\n .description(\"Generate or refresh embeddings for eligible memories\")\n .option(\"-r, --repo <repo>\", \"Limit bootstrap to one repo\")\n .action(async (opts) => {\n const db = initDb();\n const config = loadEmbeddingConfigFromEnv();\n if (!config) {\n console.error(\"Embeddings are disabled. Unset RECALL_EMBEDDINGS_DISABLED=true to enable local embeddings.\");\n process.exit(1);\n }\n\n const count = await bootstrapEmbeddings(db, config, {\n repo: opts.repo,\n });\n console.log(`Bootstrapped ${count} embeddings.`);\n });\n\nembeddingsCmd\n .command(\"verify\")\n .description(\"Verify embedding coverage and stale content hashes\")\n .option(\"-r, --repo <repo>\", \"Limit verification to one repo\")\n .action((opts) => {\n const db = initDb();\n const config = loadEmbeddingConfigFromEnv();\n if (!config) {\n console.error(\"Embeddings are disabled. Unset RECALL_EMBEDDINGS_DISABLED=true to enable local embeddings.\");\n process.exit(1);\n }\n\n const result = verifyEmbeddings(db, config, {\n repo: opts.repo,\n });\n console.log(`Eligible: ${result.eligible}`);\n console.log(`Stored: ${result.stored}`);\n console.log(`Stale: ${result.stale}`);\n console.log(`Indexed: ${result.indexed}`);\n console.log(`Drift: ${result.index_drift}`);\n console.log(`Lexical: ${result.lexical_indexed}`);\n console.log(`LexDrift: ${result.lexical_drift}`);\n });\n\nembeddingsCmd\n .command(\"rebuild-index\")\n .description(\"Rebuild derived retrieval indexes from canonical memories\")\n .option(\"-r, --repo <repo>\", \"Limit rebuild to one repo\")\n .action((opts) => {\n const db = initDb();\n const config = loadEmbeddingConfigFromEnv();\n const result = rebuildEmbeddingIndex(db, config, {\n repo: opts.repo,\n });\n console.log(`Rebuilt sqlite-vec index with ${result.vector_rows} rows.`);\n console.log(`Rebuilt FTS5 index with ${result.lexical_rows} rows.`);\n });\n\nprogram\n .command(\"search\")\n .description(\"Hybrid lexical + vector search across memories\")\n .argument(\"<query>\", \"Search query\")\n .option(\"-r, --repo <repo>\", \"Filter by repo\")\n .option(\"-n, --limit <n>\", \"Max results\", \"10\")\n .action(async (query: string, opts) => {\n const db = initDb();\n const config = loadEmbeddingConfigFromEnv();\n const results = await hybridSearch(db, query, config, {\n repo: opts.repo,\n limit: parseInt(opts.limit),\n });\n\n if (results.length === 0) {\n console.log(\"No matching memories found.\");\n return;\n }\n\n for (const r of results) {\n console.log(\n `${r.memory.id.slice(0, 8)} (score=${r.score.toFixed(3)} vec=${r.similarity.toFixed(3)} lex=${r.lexical_score.toFixed(3)}) [${r.memory.status}] ${r.memory.text}`,\n );\n }\n });\n\n// --- Phase 2: signals ---\n\nprogram\n .command(\"signal\")\n .description(\"Record an implicit feedback signal\")\n .argument(\"<memory-id>\", \"Memory ID\")\n .argument(\"<signal>\", \"Signal type: test_pass|test_fail|file_unchanged|file_rewritten|task_accepted|task_rejected\")\n .option(\"-s, --session <id>\", \"Session ID\", \"cli\")\n .action((memoryIdPrefix: string, signal: string, opts) => {\n const db = initDb();\n const mem = findByPrefix(db, memoryIdPrefix);\n if (!mem) {\n console.error(`Memory not found: ${memoryIdPrefix}`);\n process.exit(1);\n }\n const validSignals = [\"test_pass\", \"test_fail\", \"file_unchanged\", \"file_rewritten\", \"task_accepted\", \"task_rejected\"];\n if (!validSignals.includes(signal)) {\n console.error(`Invalid signal. Use: ${validSignals.join(\", \")}`);\n process.exit(1);\n }\n const id = recordSignal(db, mem.id, opts.session, signal as any);\n createActivityEvent(db, {\n session_id: opts.session,\n repo: mem.repo,\n path: mem.path_scope,\n source: \"cli\",\n event_type: \"signal\",\n memory_ids: [mem.id],\n request: { signal },\n result: { signal_id: id },\n });\n console.log(`Signal recorded: ${id.slice(0, 8)}`);\n\n const stats = getSignalStats(db, mem.id);\n console.log(\"Stats:\", JSON.stringify(stats));\n });\n\n// --- Phase 2: scope analysis ---\n\nprogram\n .command(\"scope\")\n .description(\"Analyze scope of a correction text\")\n .argument(\"<text>\", \"Correction text\")\n .option(\"-p, --path <path>\", \"Context file path\")\n .action((text: string, opts) => {\n const result = inferScope(text, opts.path);\n console.log(`Scope: ${result.scope}`);\n console.log(`Path scope: ${result.path_scope ?? \"(none)\"}`);\n console.log(`Confidence: ${result.confidence_modifier > 0 ? \"+\" : \"\"}${result.confidence_modifier}`);\n console.log(`Reason: ${result.reason}`);\n });\n\n// --- Phase 3: policy ---\n\nconst policyCmd = program\n .command(\"policy\")\n .description(\"Org-level policy management\");\n\npolicyCmd\n .command(\"create\")\n .description(\"Create a policy rule\")\n .requiredOption(\"--org <id>\", \"Organization ID\")\n .requiredOption(\"--type <type>\", \"Rule type: min_confidence|require_approval|allowed_sources|blocked_scopes|max_active_per_repo|require_evidence_count|auto_approve_pattern\")\n .requiredOption(\"--config <json>\", \"Rule config as JSON\")\n .action((opts) => {\n const db = initDb();\n const config = JSON.parse(opts.config);\n const id = createPolicy(db, opts.org, opts.type, config);\n console.log(`Policy created: ${id.slice(0, 8)}`);\n });\n\npolicyCmd\n .command(\"list\")\n .description(\"List policies for an org\")\n .requiredOption(\"--org <id>\", \"Organization ID\")\n .action((opts) => {\n const db = initDb();\n const rules = listPolicies(db, opts.org);\n if (rules.length === 0) {\n console.log(\"No policies.\");\n return;\n }\n for (const r of rules) {\n console.log(`${r.id.slice(0, 8)} [${r.enabled ? \"on\" : \"off\"}] ${r.rule_type} ${JSON.stringify(r.config)}`);\n }\n });\n\npolicyCmd\n .command(\"toggle\")\n .description(\"Enable/disable a policy\")\n .argument(\"<id>\", \"Policy ID\")\n .argument(\"<state>\", \"on or off\")\n .action((id: string, state: string) => {\n const db = initDb();\n togglePolicy(db, id, state === \"on\");\n console.log(`Policy ${id.slice(0, 8)} ${state === \"on\" ? \"enabled\" : \"disabled\"}.`);\n });\n\npolicyCmd\n .command(\"delete\")\n .description(\"Delete a policy\")\n .argument(\"<id>\", \"Policy ID\")\n .action((id: string) => {\n const db = initDb();\n deletePolicy(db, id);\n console.log(`Policy ${id.slice(0, 8)} deleted.`);\n });\n\npolicyCmd\n .command(\"check\")\n .description(\"Check a memory against org policies\")\n .requiredOption(\"--org <id>\", \"Organization ID\")\n .argument(\"<memory-id>\", \"Memory ID\")\n .action((memoryId: string, opts) => {\n const db = initDb();\n const mem = findByPrefix(db, memoryId);\n if (!mem) {\n console.error(`Memory not found: ${memoryId}`);\n process.exit(1);\n }\n const violations = evaluatePolicy(db, opts.org, mem);\n if (violations.length === 0) {\n console.log(\"No policy violations.\");\n } else {\n for (const v of violations) {\n console.log(`[${v.blocking ? \"BLOCK\" : \"WARN\"}] ${v.rule_type}: ${v.message}`);\n }\n }\n });\n\n// --- Phase 3: approval ---\n\nconst approvalCmd = program\n .command(\"approval\")\n .description(\"Approval queue management\");\n\napprovalCmd\n .command(\"request\")\n .description(\"Request approval for a memory\")\n .argument(\"<memory-id>\", \"Memory ID\")\n .requiredOption(\"--org <id>\", \"Organization ID\")\n .option(\"--by <name>\", \"Requested by\", \"cli\")\n .action((memoryId: string, opts) => {\n const db = initDb();\n const mem = findByPrefix(db, memoryId);\n if (!mem) {\n console.error(`Memory not found: ${memoryId}`);\n process.exit(1);\n }\n const id = requestApproval(db, mem.id, opts.org, opts.by);\n console.log(`Approval requested: ${id.slice(0, 8)}`);\n });\n\napprovalCmd\n .command(\"list\")\n .description(\"List pending approvals\")\n .requiredOption(\"--org <id>\", \"Organization ID\")\n .action((opts) => {\n const db = initDb();\n const pending = listPendingApprovals(db, opts.org);\n if (pending.length === 0) {\n console.log(\"No pending approvals.\");\n return;\n }\n for (const a of pending) {\n console.log(`${a.id.slice(0, 8)} memory:${a.memory_id.slice(0, 8)} by:${a.requested_by} ${a.created_at}`);\n }\n });\n\napprovalCmd\n .command(\"resolve\")\n .description(\"Approve or deny a request\")\n .argument(\"<approval-id>\", \"Approval ID\")\n .argument(\"<decision>\", \"approved or denied\")\n .option(\"--by <name>\", \"Reviewed by\", \"cli\")\n .option(\"--reason <reason>\", \"Reason\")\n .action((approvalId: string, decision: string, opts) => {\n const db = initDb();\n const ok = resolveApproval(db, approvalId, decision as any, opts.by, opts.reason);\n if (ok) {\n console.log(`Approval ${approvalId.slice(0, 8)} → ${decision}`);\n } else {\n console.error(\"Approval not found.\");\n }\n });\n\n// --- Phase 3: health ---\n\nprogram\n .command(\"health\")\n .description(\"Memory health scoring report\")\n .option(\"-r, --repo <repo>\", \"Filter by repo\")\n .option(\"--id <id>\", \"Score a single memory\")\n .action((opts) => {\n const db = initDb();\n if (opts.id) {\n const mem = findByPrefix(db, opts.id);\n if (!mem) {\n console.error(`Memory not found: ${opts.id}`);\n process.exit(1);\n }\n const score = computeHealthScore(db, mem.id);\n if (score) {\n console.log(`Score: ${(score.score * 100).toFixed(0)}%`);\n console.log(`Confidence: ${(score.confidence_component * 100).toFixed(0)}%`);\n console.log(`Freshness: ${(score.freshness_component * 100).toFixed(0)}%`);\n console.log(`Follow: ${(score.follow_rate_component * 100).toFixed(0)}%`);\n console.log(`Signal: ${(score.signal_ratio_component * 100).toFixed(0)}%`);\n }\n return;\n }\n const scores = computeAllHealthScores(db, opts.repo);\n console.log(formatHealthReport(scores));\n });\n\n// --- Phase 3: contradictions ---\n\nconst contradictCmd = program\n .command(\"contradictions\")\n .description(\"Detect and resolve contradictions\");\n\ncontradictCmd\n .command(\"detect\")\n .description(\"Scan for contradictions\")\n .option(\"-r, --repo <repo>\", \"Filter by repo\")\n .action((opts) => {\n const db = initDb();\n const found = detectContradictions(db, opts.repo);\n if (found.length === 0) {\n console.log(\"No new contradictions detected.\");\n return;\n }\n for (const c of found) {\n console.log(`${c.id.slice(0, 8)} [${c.severity}] ${c.contradiction_type}: ${c.description}`);\n }\n console.log(`\\n${found.length} contradiction(s) found.`);\n });\n\ncontradictCmd\n .command(\"list\")\n .description(\"List contradictions\")\n .option(\"--resolved\", \"Show resolved only\")\n .option(\"--unresolved\", \"Show unresolved only\")\n .action((opts) => {\n const db = initDb();\n const resolved = opts.resolved ? true : opts.unresolved ? false : undefined;\n const items = listContradictions(db, { resolved });\n if (items.length === 0) {\n console.log(\"No contradictions.\");\n return;\n }\n for (const c of items) {\n const status = c.resolved ? \"resolved\" : \"open\";\n console.log(`${c.id.slice(0, 8)} [${status}] ${c.severity} ${c.contradiction_type}: ${c.description}`);\n }\n });\n\ncontradictCmd\n .command(\"resolve\")\n .description(\"Resolve a contradiction by keeping one memory\")\n .argument(\"<contradiction-id>\", \"Contradiction ID\")\n .argument(\"<keep-memory-id>\", \"Memory ID to keep\")\n .option(\"--actor <name>\", \"Who resolved\", \"cli\")\n .option(\"--reason <reason>\", \"Resolution reason\")\n .action((cId: string, keepId: string, opts) => {\n const db = initDb();\n const ok = resolveContradiction(db, cId, keepId, opts.actor, opts.reason);\n if (ok) {\n console.log(`Contradiction ${cId.slice(0, 8)} resolved. Kept ${keepId.slice(0, 8)}.`);\n } else {\n console.error(\"Contradiction not found.\");\n }\n });\n\ncontradictCmd\n .command(\"auto-resolve\")\n .description(\"Auto-resolve contradictions (higher confidence wins)\")\n .option(\"-r, --repo <repo>\", \"Filter by repo\")\n .action((opts) => {\n const db = initDb();\n const count = autoResolveContradictions(db, opts.repo);\n console.log(`Auto-resolved ${count} contradiction(s).`);\n });\n\n// --- Phase 3: prune ---\n\nprogram\n .command(\"prune\")\n .description(\"Auto-prune stale and unhealthy memories\")\n .option(\"-r, --repo <repo>\", \"Limit pruning to one repo\")\n .option(\"--stale-days <n>\", \"Days before rejecting stale memories\", \"90\")\n .option(\"--rejected-days <n>\", \"Days before deleting rejected memories\", \"30\")\n .option(\"--transient-days <n>\", \"Days before deleting transient memories\", \"7\")\n .option(\"--min-health <n>\", \"Min health score for active memories\", \"0.2\")\n .option(\"--dry-run\", \"Preview without making changes\")\n .action((opts) => {\n const db = initDb();\n const result = pruneMemories(db, {\n repo: opts.repo,\n stale_days: parseInt(opts.staleDays),\n rejected_retention_days: parseInt(opts.rejectedDays),\n transient_retention_days: parseInt(opts.transientDays),\n min_health_score: parseFloat(opts.minHealth),\n dry_run: opts.dryRun ?? false,\n });\n console.log(formatPruneReport(result, opts.dryRun ?? false));\n });\n\n// --- Phase 3: audit ---\n\nconst auditCmd = program\n .command(\"audit\")\n .description(\"View audit trail and rollback\");\n\nauditCmd\n .command(\"show\")\n .description(\"Show audit trail for a memory\")\n .argument(\"<memory-id>\", \"Memory ID\")\n .action((memoryId: string) => {\n const db = initDb();\n const mem = findByPrefix(db, memoryId);\n if (!mem) {\n console.error(`Memory not found: ${memoryId}`);\n process.exit(1);\n }\n const entries = getAuditTrail(db, mem.id);\n console.log(formatAuditTrail(entries));\n });\n\nauditCmd\n .command(\"recent\")\n .description(\"Show recent audit entries\")\n .option(\"-n, --limit <n>\", \"Max entries\", \"50\")\n .action((opts) => {\n const db = initDb();\n const entries = getRecentAudit(db, parseInt(opts.limit));\n console.log(formatAuditTrail(entries));\n });\n\nauditCmd\n .command(\"rollback\")\n .description(\"Rollback a memory to a previous state\")\n .argument(\"<memory-id>\", \"Memory ID\")\n .argument(\"<audit-entry-id>\", \"Audit entry ID to rollback to\")\n .option(\"--actor <name>\", \"Who performed rollback\", \"cli\")\n .action((memoryId: string, auditEntryId: string, opts) => {\n const db = initDb();\n const mem = findByPrefix(db, memoryId);\n if (!mem) {\n console.error(`Memory not found: ${memoryId}`);\n process.exit(1);\n }\n const ok = rollbackMemory(db, mem.id, auditEntryId, opts.actor);\n if (ok) {\n console.log(`Memory ${mem.id.slice(0, 8)} rolled back.`);\n } else {\n console.error(\"Rollback failed. Audit entry not found or no snapshot.\");\n }\n });\n\n// --- Quality profile ---\n\nprogram\n .command(\"quality\")\n .description(\"Show repo quality profile and dynamic thresholds\")\n .option(\"-r, --repo <repo>\", \"Repository name\")\n .action((opts) => {\n const db = initDb();\n const profile = getRepoQualityProfile(db, opts.repo);\n console.log(`Stage: ${profile.stage}`);\n console.log(`Quality score: ${(profile.score * 100).toFixed(0)}%`);\n console.log(`Active memories: ${profile.active_count}`);\n console.log(`Total memories: ${profile.total_count}`);\n console.log(`Avg health: ${(profile.avg_health * 100).toFixed(0)}%`);\n console.log(`Override rate: ${(profile.override_rate * 100).toFixed(0)}%`);\n console.log(`Contradiction rate: ${(profile.contradiction_rate * 100).toFixed(0)}%`);\n console.log(`---`);\n console.log(`Repeat sessions needed: ${profile.repeat_sessions_required}`);\n console.log(`Compile threshold: ${profile.compile_confidence_threshold.toFixed(2)}`);\n console.log(`Dedup similarity: ${profile.dedup_similarity_threshold.toFixed(2)}`);\n });\n\n// --- Activity ---\n\nprogram\n .command(\"activity\")\n .description(\"List recent activity events\")\n .option(\"-r, --repo <repo>\", \"Filter by repo\")\n .option(\"-s, --session <id>\", \"Filter by session ID\")\n .option(\"--source <source>\", \"Filter by source: cli|daemon|mcp|system\")\n .option(\"--type <type>\", \"Filter by event type: compile|query|scan|correction|review|feedback|signal|session_start|session_event|session_end\")\n .option(\"--since <iso>\", \"Filter by created_at >= ISO timestamp\")\n .option(\"-n, --limit <n>\", \"Max events\", \"20\")\n .action((opts) => {\n const db = initDb();\n const events = listActivityEvents(db, {\n repo: opts.repo,\n session_id: opts.session,\n source: opts.source,\n event_type: opts.type,\n since: opts.since,\n limit: parseInt(opts.limit, 10),\n });\n if (events.length === 0) {\n console.log(\"No activity found.\");\n return;\n }\n for (const event of events) {\n console.log(\n `${event.created_at} ${event.source}/${event.event_type} session:${event.session_id ?? \"-\"} repo:${event.repo ?? \"-\"} memories:${event.memory_ids.length}`,\n );\n }\n console.log(`\\n${events.length} activity events total.`);\n });\n\nprogram\n .command(\"sessions\")\n .description(\"List recent activity sessions\")\n .option(\"-r, --repo <repo>\", \"Filter by repo\")\n .option(\"--source <source>\", \"Filter by source: cli|daemon|mcp|system\")\n .option(\"--type <type>\", \"Filter by event type: compile|query|scan|correction|review|feedback|signal|session_start|session_event|session_end\")\n .option(\"--since <iso>\", \"Filter by created_at >= ISO timestamp\")\n .option(\"-n, --limit <n>\", \"Max sessions\", \"20\")\n .action((opts) => {\n const db = initDb();\n const sessions = listActivitySessions(db, {\n repo: opts.repo,\n source: opts.source,\n event_type: opts.type,\n since: opts.since,\n limit: parseInt(opts.limit, 10),\n });\n if (sessions.length === 0) {\n console.log(\"No sessions found.\");\n return;\n }\n for (const session of sessions) {\n console.log(\n `${session.last_at} ${session.session_id} repo:${session.repo ?? \"-\"} events:${session.event_count} types:${session.event_types.join(\",\")}`,\n );\n }\n console.log(`\\n${sessions.length} sessions total.`);\n });\n\n// --- daemon ---\n\nconst defaultLabel = defaultServiceLabel();\nconst daemonCmd = program\n .command(\"daemon\")\n .description(\"Manage the local Recall HTTP daemon (launchd on macOS, systemd --user on Linux)\");\n\ndaemonCmd\n .command(\"install\")\n .description(\"Install and start the user service\")\n .option(\"--port <port>\", \"Daemon port\", \"7890\")\n .option(\"--data-dir <dir>\", \"Recall data dir\")\n .option(\"--label <label>\", \"Service label\", defaultLabel)\n .option(\"--node-path <path>\", \"Node executable path override\")\n .option(\"--daemon-script <path>\", \"Daemon script path override\")\n .action((opts) => {\n const status = installService({\n label: opts.label,\n port: parseInt(opts.port, 10),\n dataDir: opts.dataDir,\n nodePath: opts.nodePath,\n daemonScript: opts.daemonScript,\n });\n console.log(getServiceInfo(status.label));\n });\n\ndaemonCmd\n .command(\"start\")\n .description(\"Start the installed service\")\n .option(\"--label <label>\", \"Service label\", defaultLabel)\n .action((opts) => {\n const status = startService(opts.label);\n console.log(getServiceInfo(status.label));\n });\n\ndaemonCmd\n .command(\"stop\")\n .description(\"Stop the service\")\n .option(\"--label <label>\", \"Service label\", defaultLabel)\n .action((opts) => {\n const status = stopService(opts.label);\n console.log(getServiceInfo(status.label));\n });\n\ndaemonCmd\n .command(\"restart\")\n .description(\"Restart the service\")\n .option(\"--label <label>\", \"Service label\", defaultLabel)\n .action((opts) => {\n stopService(opts.label);\n const status = startService(opts.label);\n console.log(getServiceInfo(status.label));\n });\n\ndaemonCmd\n .command(\"status\")\n .description(\"Show service status\")\n .option(\"--label <label>\", \"Service label\", defaultLabel)\n .action((opts) => {\n console.log(getServiceInfo(opts.label));\n });\n\ndaemonCmd\n .command(\"uninstall\")\n .description(\"Remove the service\")\n .option(\"--label <label>\", \"Service label\", defaultLabel)\n .action((opts) => {\n const status = uninstallService(opts.label);\n console.log(getServiceInfo(status.label));\n });\n\n// --- Tier-2 maintenance tasks ---\n\nconst maintenanceCmd = program\n .command(\"maintenance\")\n .description(\"Inspect and manage the delegated maintenance task queue\");\n\nmaintenanceCmd\n .command(\"stats\")\n .description(\"Show backlog counts, completion stats, and mean latency\")\n .action(async () => {\n const { getTaskStats } = await import(\"./maintenance/tasks.js\");\n const db = initDb();\n const stats = getTaskStats(db);\n console.log(`Total tasks: ${stats.total}`);\n console.log(`---`);\n console.log(`Pending: ${stats.by_status.pending}`);\n console.log(`Claimed: ${stats.by_status.claimed}`);\n console.log(`Completed: ${stats.by_status.completed}`);\n console.log(`Abandoned: ${stats.by_status.abandoned}`);\n console.log(`---`);\n console.log(`Last 24h completed: ${stats.completed_last_24h}`);\n console.log(`Last 24h abandoned: ${stats.abandoned_last_24h}`);\n if (stats.mean_completion_ms != null) {\n console.log(`Mean completion: ${(stats.mean_completion_ms / 1000).toFixed(1)}s`);\n }\n if (stats.pending_oldest_created_at) {\n console.log(`Oldest pending: ${stats.pending_oldest_created_at}`);\n }\n console.log(`---`);\n console.log(`By kind:`);\n for (const [kind, count] of Object.entries(stats.by_kind)) {\n if (count === 0) continue;\n console.log(` ${kind.padEnd(22)} ${count}`);\n }\n });\n\nmaintenanceCmd\n .command(\"list\")\n .description(\"List tasks (default: pending)\")\n .option(\"-s, --status <status>\", \"pending|claimed|completed|abandoned\", \"pending\")\n .option(\"-k, --kind <kind>\", \"Filter by kind\")\n .option(\"-r, --repo <repo>\", \"Filter by repo\")\n .option(\"-n, --limit <n>\", \"Max entries\", \"20\")\n .action(async (opts) => {\n const { listTasks } = await import(\"./maintenance/tasks.js\");\n const db = initDb();\n const tasks = listTasks(db, {\n status: opts.status,\n kinds: opts.kind ? [opts.kind] : undefined,\n repo: opts.repo,\n limit: parseInt(opts.limit, 10),\n });\n if (tasks.length === 0) {\n console.log(`No ${opts.status} tasks.`);\n return;\n }\n for (const t of tasks) {\n const age = t.created_at.slice(0, 19);\n const prefix = t.id.slice(0, 8);\n const repo = t.repo ?? \"-\";\n const attempts = t.attempts > 0 ? ` attempts=${t.attempts}` : \"\";\n const reason = t.failure_reason ? ` (${t.failure_reason.slice(0, 60)})` : \"\";\n console.log(`${prefix} p${t.priority} ${t.kind.padEnd(20)} ${t.status.padEnd(10)} ${repo.padEnd(30)} ${age}${attempts}${reason}`);\n }\n });\n\nmaintenanceCmd\n .command(\"drop\")\n .description(\"Delete a task by id (or id prefix)\")\n .argument(\"<task-id>\", \"Task id or prefix\")\n .action(async (taskIdArg: string) => {\n const { deleteTask, listTasks } = await import(\"./maintenance/tasks.js\");\n const db = initDb();\n const all = listTasks(db, { limit: 10_000 });\n const matches = all.filter((t) => t.id === taskIdArg || t.id.startsWith(taskIdArg));\n if (matches.length === 0) {\n console.error(`No task matching \"${taskIdArg}\".`);\n process.exit(1);\n }\n if (matches.length > 1) {\n console.error(`Ambiguous prefix \"${taskIdArg}\". Matches:`);\n for (const t of matches) console.error(` ${t.id} ${t.kind} ${t.status}`);\n process.exit(1);\n }\n const ok = deleteTask(db, matches[0].id);\n if (ok) console.log(`Dropped task ${matches[0].id}.`);\n else console.error(\"Drop failed.\");\n });\n\nconst credentialsCmd = maintenanceCmd\n .command(\"credentials\")\n .description(\"Manage LLM provider API keys in macOS Keychain (env fallback on other platforms)\");\n\ncredentialsCmd\n .command(\"list\", { isDefault: true })\n .description(\"Show which providers have credentials available\")\n .action(async () => {\n const { listCredentials } = await import(\"./credentials/keychain.js\");\n const creds = listCredentials();\n if (creds.length === 0) {\n console.log(\"No API keys configured. Set one with:\");\n console.log(\" recall maintenance credentials set openai <key>\");\n console.log(\" recall maintenance credentials set anthropic <key>\");\n return;\n }\n for (const cred of creds) {\n const detail = cred.detail ? ` ${cred.detail}` : \"\";\n console.log(`${cred.provider.padEnd(14)} ${cred.source.padEnd(8)} ${cred.preview}${detail}`);\n }\n });\n\ncredentialsCmd\n .command(\"set\")\n .description(\"Store credentials for an LLM provider in the macOS Keychain\")\n .argument(\"<provider>\", \"openai|anthropic|azure\")\n .argument(\"[key]\", \"API key (prompts via stdin if omitted; required for openai/anthropic and for azure unless --stdin-json is used)\")\n .option(\"--endpoint <url>\", \"Azure OpenAI resource endpoint (e.g. https://myresource.openai.azure.com)\")\n .option(\"--deployment <name>\", \"Azure OpenAI deployment name\")\n .option(\"--api-version <version>\", \"Azure OpenAI api-version (e.g. 2024-10-21)\")\n .option(\"--stdin-json\", \"Read the azure config (endpoint/deployment/api_version/key) as a JSON object from stdin\")\n .action(async (providerArg: string, keyArg: string | undefined, opts) => {\n const { setApiKey, setAzureConfig } = await import(\"./credentials/keychain.js\");\n const provider = providerArg === \"azure\" ? \"azure-openai\" : providerArg;\n\n if (provider === \"openai\" || provider === \"anthropic\") {\n const key = keyArg ?? await readStdinKey();\n if (!key) {\n console.error(\"No API key provided (pass as argument or pipe via stdin).\");\n process.exit(1);\n }\n try {\n setApiKey(provider, key);\n console.log(`Stored ${provider} API key in Keychain (service com.recall.llm).`);\n } catch (err) {\n console.error(`Failed to store key: ${(err as Error).message}`);\n process.exit(1);\n }\n return;\n }\n\n if (provider === \"azure-openai\") {\n let azureConfig;\n if (opts.stdinJson) {\n const body = await readStdinText();\n if (!body) {\n console.error(\"No JSON payload received on stdin.\");\n process.exit(1);\n }\n try {\n azureConfig = JSON.parse(body) as {\n endpoint: string;\n deployment: string;\n api_version: string;\n key: string;\n };\n } catch (err) {\n console.error(`Failed to parse stdin JSON: ${(err as Error).message}`);\n process.exit(1);\n }\n } else {\n const key = keyArg ?? await readStdinKey();\n if (!opts.endpoint || !opts.deployment || !opts.apiVersion || !key) {\n console.error(\n \"Azure setup requires --endpoint, --deployment, --api-version, and a key.\\n\" +\n \"Example: recall maintenance credentials set azure \\\\\\n\" +\n \" --endpoint https://myresource.openai.azure.com \\\\\\n\" +\n \" --deployment gpt-4o-mini \\\\\\n\" +\n \" --api-version 2024-10-21 \\\\\\n\" +\n \" <key>\",\n );\n process.exit(1);\n }\n azureConfig = {\n endpoint: opts.endpoint,\n deployment: opts.deployment,\n api_version: opts.apiVersion,\n key,\n };\n }\n try {\n setAzureConfig(azureConfig);\n console.log(`Stored azure-openai config in Keychain (service com.recall.llm).`);\n console.log(` endpoint: ${azureConfig.endpoint}`);\n console.log(` deployment: ${azureConfig.deployment}`);\n console.log(` api_version: ${azureConfig.api_version}`);\n } catch (err) {\n console.error(`Failed to store azure config: ${(err as Error).message}`);\n process.exit(1);\n }\n return;\n }\n\n console.error(`Provider must be \"openai\", \"anthropic\", or \"azure\", got \"${providerArg}\".`);\n process.exit(1);\n });\n\ncredentialsCmd\n .command(\"clear\")\n .description(\"Remove provider credentials from the macOS Keychain\")\n .argument(\"<provider>\", \"openai|anthropic|azure\")\n .action(async (providerArg: string) => {\n const { deleteApiKey } = await import(\"./credentials/keychain.js\");\n const provider = providerArg === \"azure\" ? \"azure-openai\" : providerArg;\n if (provider !== \"openai\" && provider !== \"anthropic\" && provider !== \"azure-openai\") {\n console.error(`Provider must be \"openai\", \"anthropic\", or \"azure\", got \"${providerArg}\".`);\n process.exit(1);\n }\n const removed = deleteApiKey(provider);\n if (removed) console.log(`Removed ${provider} credentials from Keychain.`);\n else console.log(`No ${provider} credentials found in Keychain.`);\n });\n\nmaintenanceCmd\n .command(\"dispatch\")\n .description(\"Run the daemon-owned dispatcher once against pending maintenance tasks (requires a configured LLM provider)\")\n .option(\"--provider <provider>\", \"openai|anthropic|azure-openai (defaults to whichever is configured)\")\n .option(\"--model <model>\", \"Model override\")\n .option(\"--kind <kind>\", \"Restrict to a single task kind (repeatable)\", (value: string, acc: string[] = []) => [...acc, value], [] as string[])\n .option(\"--repo <repo>\", \"Restrict to a single repo\")\n .option(\"--max <n>\", \"Max tasks to run this round\", \"5\")\n .option(\"--dry-run\", \"Show which tasks would be dispatched; do not call the LLM\")\n .option(\"--preview\", \"Show the actual prompts that would be sent (no provider needed; no LLM call)\")\n .option(\"--json\", \"Emit the raw JSON report\")\n .action(async (opts) => {\n const { dispatchPendingTasks, formatDispatchReport, buildPrompt } = await import(\"./maintenance/dispatcher.js\");\n const { listTasks } = await import(\"./maintenance/tasks.js\");\n const db = initDb();\n\n if (opts.preview) {\n const pending = listTasks(db, {\n status: \"pending\",\n kinds: opts.kind.length > 0 ? opts.kind : undefined,\n repo: opts.repo,\n limit: parseInt(opts.max, 10),\n });\n const previews = pending.map((task) => ({\n task_id: task.id,\n kind: task.kind,\n repo: task.repo,\n prompt: buildPrompt(task),\n }));\n if (opts.json) {\n console.log(JSON.stringify(previews, null, 2));\n return;\n }\n if (previews.length === 0) {\n console.log(\"No pending tasks to preview.\");\n return;\n }\n for (const p of previews) {\n console.log(`# ${p.task_id.slice(0, 8)} ${p.kind} ${p.repo ?? \"-\"}`);\n if (!p.prompt) {\n console.log(\" (no prompt builder for this kind)\\n\");\n continue;\n }\n console.log(`## system\\n${p.prompt.system}\\n`);\n console.log(`## user\\n${p.prompt.user}\\n`);\n if (p.prompt.max_output_tokens) console.log(`## max_output_tokens\\n${p.prompt.max_output_tokens}\\n`);\n console.log(\"---\");\n }\n return;\n }\n\n const report = await dispatchPendingTasks(db, {\n provider: opts.provider,\n model: opts.model,\n kinds: opts.kind.length > 0 ? opts.kind : undefined,\n repo: opts.repo,\n maxTasks: parseInt(opts.max, 10),\n dryRun: Boolean(opts.dryRun),\n });\n if (opts.json) {\n console.log(JSON.stringify(report, null, 2));\n return;\n }\n console.log(formatDispatchReport(report));\n });\n\nmaintenanceCmd\n .command(\"cleanup\")\n .description(\"Run deterministic, LLM-free cleanup: exact-text dedupe, fragment rejection, repeat-correction promotion\")\n .option(\"--apply\", \"Persist changes (default is dry-run)\")\n .option(\"--only <action>\", \"Restrict to one action: dedupe_exact_merge|reject_fragment_candidate|promote_repeat_correction\")\n .option(\"--revert <run-id>\", \"Revert a previous cleanup run (id or 8-char prefix)\")\n .option(\"--list\", \"List recent cleanup runs\")\n .option(\"--json\", \"Emit the raw JSON report\")\n .action(async (opts) => {\n const { runDeterministicCleanup, formatCleanupReport, revertCleanupRun, listCleanupRuns } = await import(\"./maintenance/cleanup.js\");\n const db = initDb();\n\n if (opts.list) {\n const runs = listCleanupRuns(db);\n if (opts.json) {\n console.log(JSON.stringify(runs, null, 2));\n return;\n }\n if (runs.length === 0) {\n console.log(\"No cleanup runs recorded.\");\n return;\n }\n for (const r of runs) {\n const flag = r.reverted === r.total && r.total > 0 ? \" [reverted]\" : r.reverted > 0 ? ` [partial-revert ${r.reverted}/${r.total}]` : \"\";\n const actions = Object.entries(r.by_action).map(([k, v]) => `${k}=${v}`).join(\" \");\n console.log(`${r.run_id.slice(0, 8)} ${r.finished_at.slice(0, 19)} total=${r.total} ${actions}${flag}`);\n }\n return;\n }\n\n if (opts.revert) {\n const all = listCleanupRuns(db, 10_000);\n const match = all.find((r) => r.run_id === opts.revert || r.run_id.startsWith(opts.revert));\n if (!match) {\n console.error(`No cleanup run matching \"${opts.revert}\".`);\n process.exit(1);\n }\n const result = revertCleanupRun(db, match.run_id);\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n console.log(`Reverted ${result.reverted} entries from run ${result.run_id.slice(0, 8)}; skipped ${result.skipped}.`);\n for (const [reason, count] of Object.entries(result.reasons)) {\n console.log(` ${reason}: ${count}`);\n }\n return;\n }\n\n const report = runDeterministicCleanup(db, {\n dryRun: !opts.apply,\n only: opts.only,\n });\n if (opts.json) {\n console.log(JSON.stringify(report, null, 2));\n return;\n }\n console.log(formatCleanupReport(report));\n });\n\nmaintenanceCmd\n .command(\"quality\")\n .description(\"Show injection outcome distribution and followed-rate over a window\")\n .option(\"--since <iso>\", \"Window start (default: last 14 days)\")\n .option(\"--snapshot\", \"Persist this report as a baseline for later comparison\")\n .option(\"--note <text>\", \"Optional note attached to a snapshot\")\n .option(\"--history\", \"List recent snapshots and the diff against the latest one\")\n .option(\"--json\", \"Emit raw JSON\")\n .action(async (opts) => {\n const {\n computeQualityReport,\n formatQualityReport,\n recordQualitySnapshot,\n listQualitySnapshots,\n diffQualitySnapshots,\n } = await import(\"./maintenance/quality.js\");\n const db = initDb();\n\n if (opts.history) {\n const snaps = listQualitySnapshots(db);\n if (opts.json) {\n console.log(JSON.stringify(snaps, null, 2));\n return;\n }\n if (snaps.length === 0) {\n console.log(\"No quality snapshots recorded.\");\n return;\n }\n for (const s of snaps) {\n const rate = s.followed_rate_resolved != null ? `${(s.followed_rate_resolved * 100).toFixed(1)}%` : \"n/a\";\n console.log(`${s.taken_at.slice(0, 19)} followed=${rate} resolved=${s.injections_resolved} history=${s.history_injections_total} rules=${s.active_rule_count} cand=${s.candidate_correction_count}${s.notes ? ` (${s.notes})` : \"\"}`);\n }\n if (snaps.length >= 2) {\n const diff = diffQualitySnapshots(snaps[snaps.length - 1], snaps[0]);\n console.log(\"\");\n console.log(`Δ since first snapshot (${diff.days_apart.toFixed(1)}d):`);\n console.log(` followed rate: ${diff.followed_rate_delta_pp >= 0 ? \"+\" : \"\"}${diff.followed_rate_delta_pp.toFixed(1)}pp`);\n console.log(` resolved: ${diff.resolved_delta >= 0 ? \"+\" : \"\"}${diff.resolved_delta}`);\n console.log(` followed: ${diff.followed_delta >= 0 ? \"+\" : \"\"}${diff.followed_delta}`);\n console.log(` contradicted: ${diff.contradicted_delta >= 0 ? \"+\" : \"\"}${diff.contradicted_delta}`);\n console.log(` active rules: ${diff.active_rule_delta >= 0 ? \"+\" : \"\"}${diff.active_rule_delta}`);\n console.log(` candidates: ${diff.candidate_delta >= 0 ? \"+\" : \"\"}${diff.candidate_delta}`);\n console.log(` history injects: ${diff.history_injections_delta >= 0 ? \"+\" : \"\"}${diff.history_injections_delta}`);\n console.log(` history snippets:${diff.history_snippets_delta >= 0 ? \"+\" : \"\"}${diff.history_snippets_delta}`);\n }\n return;\n }\n\n const report = computeQualityReport(db, { sinceIso: opts.since });\n\n if (opts.snapshot) {\n const row = recordQualitySnapshot(db, report, opts.note);\n if (opts.json) {\n console.log(JSON.stringify({ snapshot: row, report }, null, 2));\n return;\n }\n console.log(formatQualityReport(report));\n console.log(\"\");\n console.log(`Recorded snapshot ${row.id.slice(0, 8)} at ${row.taken_at.slice(0, 19)}`);\n return;\n }\n\n if (opts.json) {\n console.log(JSON.stringify(report, null, 2));\n return;\n }\n console.log(formatQualityReport(report));\n });\n\nmaintenanceCmd\n .command(\"usage\")\n .description(\"Summarize LLM API usage (tokens, cost) across recent maintenance runs\")\n .option(\"--since <iso>\", \"Window start (default: last 30 days)\")\n .option(\"--limit <n>\", \"Recent-call rows to show\", \"10\")\n .option(\"--json\", \"Emit raw JSON summary\")\n .action(async (opts) => {\n const { summarizeUsage, formatUsageReport } = await import(\"./llm/usage.js\");\n const db = initDb();\n const summary = summarizeUsage(db, {\n sinceIso: opts.since,\n recentLimit: parseInt(opts.limit, 10),\n });\n if (opts.json) {\n console.log(JSON.stringify(summary, null, 2));\n return;\n }\n console.log(formatUsageReport(summary));\n });\n\nasync function readStdinKey(): Promise<string | null> {\n const raw = await readStdinText();\n if (!raw) return null;\n const trimmed = raw.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nasync function readStdinText(): Promise<string | null> {\n if (process.stdin.isTTY) return null;\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(Buffer.from(chunk));\n }\n const text = Buffer.concat(chunks).toString(\"utf-8\");\n return text.length > 0 ? text : null;\n}\n\n// --- Helpers ---\n\nfunction loadSyncConfig(): SyncConfig | null {\n const url = process.env.RECALL_SYNC_URL;\n const key = process.env.RECALL_SYNC_KEY;\n if (!url || !key) return null;\n return {\n remote_url: url,\n api_key: key,\n team_id: process.env.RECALL_TEAM_ID,\n auto_sync: false,\n sync_interval_seconds: 300,\n };\n}\n\nfunction formatSetupStep(step: { enabled: boolean; ok: boolean; message: string }) {\n if (!step.enabled) return `skipped (${step.message})`;\n return step.ok ? `ok (${step.message})` : `error (${step.message})`;\n}\n\nfunction formatAgentName(agent: string) {\n return agent === \"claude-code\" ? \"Claude Code\" : \"Codex\";\n}\n\nfunction collectAgents(value: string, previous: string[]) {\n return [...previous, value];\n}\n\nasync function confirmSetupWrite(scope: string): Promise<boolean> {\n const { createInterface } = await import(\"node:readline/promises\");\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n try {\n const answer = await rl.question(`Update ${scope} agent config files for Recall? [y/N] `);\n return /^(y|yes)$/i.test(answer.trim());\n } finally {\n rl.close();\n }\n}\n\nfunction findByPrefix(db: ReturnType<typeof initDb>, prefix: string) {\n // Try exact match first\n const exact = getMemory(db, prefix);\n if (exact) return exact;\n\n // Try prefix match\n const all = listMemories(db);\n const matches = all.filter((m) => m.id.startsWith(prefix));\n if (matches.length === 1) return matches[0];\n if (matches.length > 1) {\n console.error(`Ambiguous prefix \"${prefix}\". Matches:`);\n for (const m of matches) console.error(` ${m.id}`);\n process.exit(1);\n }\n return undefined;\n}\n\nexport { program };\n\nif (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {\n await program.parseAsync(process.argv);\n}\n","/**\n * Sync client — pushes/pulls memories to/from a remote sync server.\n * Handles conflict resolution (last-write-wins by updated_at).\n */\n\nimport { eq, gt } from \"drizzle-orm\";\nimport { randomUUID } from \"node:crypto\";\nimport type { RecallDb } from \"../db/client.js\";\nimport { memories, syncState } from \"../db/schema.js\";\nimport { queueMemoryEmbeddingSync } from \"../embeddings/embeddings.js\";\nimport type { SyncConfig, SyncResult, MemoryItem } from \"../types.js\";\n\n// --- Sync state helpers ---\n\ninterface SyncStateRow {\n id: string;\n remote_url: string | null;\n team_id: string | null;\n last_push_at: string | null;\n last_pull_at: string | null;\n last_push_version: number;\n last_pull_version: number;\n}\n\nfunction getSyncState(db: RecallDb): SyncStateRow {\n const row = db.select().from(syncState).where(eq(syncState.id, \"local\")).get();\n if (row) return row;\n // Initialize\n db.insert(syncState)\n .values({\n id: \"local\",\n remote_url: null,\n team_id: null,\n last_push_at: null,\n last_pull_at: null,\n last_push_version: 0,\n last_pull_version: 0,\n })\n .run();\n return db.select().from(syncState).where(eq(syncState.id, \"local\")).get()!;\n}\n\nfunction updateSyncState(\n db: RecallDb,\n updates: Partial<Omit<SyncStateRow, \"id\">>,\n) {\n db.update(syncState)\n .set(updates)\n .where(eq(syncState.id, \"local\"))\n .run();\n}\n\n// --- Push ---\n\nexport async function pushMemories(\n db: RecallDb,\n config: SyncConfig,\n): Promise<{ pushed: number; version: number }> {\n const state = getSyncState(db);\n\n // Get locally modified memories since last push\n const localMemories = db\n .select()\n .from(memories)\n .where(gt(memories.sync_version, state.last_push_version))\n .all();\n\n if (localMemories.length === 0) {\n return { pushed: 0, version: state.last_push_version };\n }\n\n const payload = localMemories.map((m) => ({\n ...m,\n origin_id: m.id,\n evidence: typeof m.evidence === \"string\" ? JSON.parse(m.evidence as string) : m.evidence,\n }));\n\n const resp = await fetch(`${config.remote_url}/api/push`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.api_key}`,\n },\n body: JSON.stringify({\n team_id: config.team_id,\n memories: payload,\n }),\n });\n\n if (!resp.ok) {\n const err = await resp.json().catch(() => ({ error: resp.statusText }));\n throw new Error(`Push failed: ${(err as any).error ?? resp.statusText}`);\n }\n\n const result = (await resp.json()) as { pushed: number; version: number };\n\n updateSyncState(db, {\n remote_url: config.remote_url,\n team_id: config.team_id,\n last_push_at: new Date().toISOString(),\n last_push_version: Math.max(\n ...localMemories.map((m) => m.sync_version),\n ),\n });\n\n return result;\n}\n\n// --- Pull ---\n\nexport async function pullMemories(\n db: RecallDb,\n config: SyncConfig,\n): Promise<{ pulled: number; conflicts: number }> {\n const state = getSyncState(db);\n\n const resp = await fetch(`${config.remote_url}/api/pull`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.api_key}`,\n },\n body: JSON.stringify({\n team_id: config.team_id,\n since_version: state.last_pull_version,\n }),\n });\n\n if (!resp.ok) {\n const err = await resp.json().catch(() => ({ error: resp.statusText }));\n throw new Error(`Pull failed: ${(err as any).error ?? resp.statusText}`);\n }\n\n const data = (await resp.json()) as {\n memories: any[];\n version: number;\n };\n\n let pulled = 0;\n let conflicts = 0;\n\n for (const remote of data.memories) {\n const localMem = db\n .select()\n .from(memories)\n .where(eq(memories.id, remote.origin_id))\n .get();\n\n if (localMem) {\n // Conflict resolution: last-write-wins by updated_at\n if (remote.updated_at > localMem.updated_at) {\n db.update(memories)\n .set({\n text: remote.text,\n status: remote.status,\n confidence: remote.confidence,\n evidence: remote.evidence,\n updated_at: remote.updated_at,\n team_id: config.team_id,\n })\n .where(eq(memories.id, localMem.id))\n .run();\n queueMemoryEmbeddingSync(db, localMem.id);\n pulled++;\n conflicts++;\n }\n } else {\n // New memory from team\n const memoryId = remote.origin_id ?? randomUUID();\n db.insert(memories)\n .values({\n id: memoryId,\n type: remote.type,\n text: remote.text,\n scope: remote.scope,\n path_scope: remote.path_scope,\n repo: remote.repo,\n status: remote.status,\n confidence: remote.confidence,\n source: remote.source,\n evidence: remote.evidence,\n supersedes: remote.supersedes,\n created_at: remote.created_at,\n updated_at: remote.updated_at,\n team_id: config.team_id,\n sync_version: 0,\n })\n .run();\n queueMemoryEmbeddingSync(db, memoryId);\n pulled++;\n }\n }\n\n updateSyncState(db, {\n last_pull_at: new Date().toISOString(),\n last_pull_version: data.version,\n });\n\n return { pulled, conflicts };\n}\n\n// --- Full sync ---\n\nexport async function sync(\n db: RecallDb,\n config: SyncConfig,\n): Promise<SyncResult> {\n const errors: string[] = [];\n let pushed = 0;\n let pulled = 0;\n let conflicts = 0;\n\n try {\n const pushResult = await pushMemories(db, config);\n pushed = pushResult.pushed;\n } catch (err: any) {\n errors.push(`push: ${err.message}`);\n }\n\n try {\n const pullResult = await pullMemories(db, config);\n pulled = pullResult.pulled;\n conflicts = pullResult.conflicts;\n } catch (err: any) {\n errors.push(`pull: ${err.message}`);\n }\n\n return { pushed, pulled, conflicts, errors };\n}\n\n// --- Team helpers ---\n\nexport async function createTeam(\n config: Pick<SyncConfig, \"remote_url\" | \"api_key\">,\n name: string,\n): Promise<string> {\n const resp = await fetch(`${config.remote_url}/api/team`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.api_key}`,\n },\n body: JSON.stringify({ name }),\n });\n\n if (!resp.ok) throw new Error(`Failed to create team: ${resp.statusText}`);\n const data = (await resp.json()) as { team_id: string };\n return data.team_id;\n}\n\nexport async function joinTeam(\n config: Pick<SyncConfig, \"remote_url\" | \"api_key\">,\n teamId: string,\n): Promise<void> {\n const resp = await fetch(`${config.remote_url}/api/team/${teamId}/join`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.api_key}`,\n },\n });\n\n if (!resp.ok) throw new Error(`Failed to join team: ${resp.statusText}`);\n}\n\n// --- Bump sync version on local changes ---\n\nexport function bumpSyncVersion(db: RecallDb, memoryId: string) {\n const mem = db.select().from(memories).where(eq(memories.id, memoryId)).get();\n if (!mem) return;\n db.update(memories)\n .set({ sync_version: mem.sync_version + 1 })\n .where(eq(memories.id, memoryId))\n .run();\n}\n","import { existsSync } from \"node:fs\";\nimport { execFileSync } from \"node:child_process\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n installClaudeCodeHooks,\n installClaudeCodeMemoryOverride,\n uninstallClaudeCodeHooks,\n uninstallClaudeCodeMemoryOverride,\n} from \"../agents/claude-code.js\";\nimport { installCodexHooks, uninstallCodexHooks } from \"../agents/codex.js\";\nimport type { AgentName } from \"../agents/types.js\";\nimport { hasCommand, resolveUserHomeDir } from \"../agents/utils.js\";\n\nexport interface LocalSetupOptions {\n appPath?: string;\n codex?: boolean;\n claude?: boolean;\n promptInjection?: boolean;\n /** Install the managed CLAUDE.md memory-override block. Default true; opt out with --no-claude-md / RECALL_SETUP_SKIP_CLAUDE_MD=1. */\n claudeMd?: boolean;\n}\n\nexport interface LocalSetupResult {\n appPath: string;\n runtimeNodePath: string;\n runtimeCliPath: string;\n runtimeMcpPath: string;\n codex: SetupStepResult;\n claude: SetupStepResult;\n codex_hooks: SetupStepResult;\n claude_hooks: SetupStepResult;\n claude_md: SetupStepResult;\n}\n\nexport interface SetupStepResult {\n enabled: boolean;\n ok: boolean;\n message: string;\n}\n\nexport type SetupScope = \"global\" | \"project\";\n\nexport interface AgentSetupResult {\n agent: AgentName;\n detected: boolean;\n mcp: SetupStepResult;\n hooks: SetupStepResult;\n hook_config_path: string | null;\n /** Only set for Claude Code — managed CLAUDE.md override status. */\n claude_md?: SetupStepResult;\n claude_md_path?: string | null;\n}\n\nexport interface RecallSetupOptions {\n agent?: AgentName[];\n appPath?: string;\n cwd?: string;\n dryRun?: boolean;\n hooksOnly?: boolean;\n mcpOnly?: boolean;\n scope?: SetupScope;\n uninstallHooks?: boolean;\n runner?: CommandRunner;\n promptInjection?: boolean;\n /** Install the managed CLAUDE.md memory-override block. Default true. */\n claudeMd?: boolean;\n}\n\nexport interface RecallSetupResult {\n appPath: string;\n runtimeNodePath: string;\n runtimeCliPath: string;\n runtimeMcpPath: string;\n scope: SetupScope;\n dry_run: boolean;\n hooks_only: boolean;\n mcp_only: boolean;\n uninstall_hooks: boolean;\n agents: AgentSetupResult[];\n}\n\ntype CommandRunner = (command: string, args: string[]) => void;\n\nexport function resolveRuntimePaths(appPath?: string) {\n // macOS bundled-app layout: /Applications/Recall.app/Contents/Resources/Runtime\n if (appPath || (process.platform === \"darwin\" && existsSync(\"/Applications/Recall.app\"))) {\n const resolvedAppPath = appPath ?? \"/Applications/Recall.app\";\n const runtimeRoot = join(resolvedAppPath, \"Contents\", \"Resources\", \"Runtime\");\n return {\n appPath: resolvedAppPath,\n runtimeNodePath: join(runtimeRoot, \"bin\", \"node\"),\n runtimeCliPath: join(runtimeRoot, \"dist\", \"cli.js\"),\n runtimeMcpPath: join(runtimeRoot, \"dist\", \"mcp.js\"),\n };\n }\n\n // Plain npm/global install: use system node + dist next to this module.\n const distDir = dirname(fileURLToPath(import.meta.url));\n return {\n appPath: distDir,\n runtimeNodePath: process.execPath,\n runtimeCliPath: join(distDir, \"cli.js\"),\n runtimeMcpPath: join(distDir, \"mcp.js\"),\n };\n}\n\nexport function runLocalSetup(opts: LocalSetupOptions = {}): LocalSetupResult {\n const targetCodex = opts.codex ?? true;\n const targetClaude = opts.claude ?? true;\n const result = runRecallSetup({\n appPath: opts.appPath,\n agent: [\n ...(targetCodex ? [\"codex\" as const] : []),\n ...(targetClaude ? [\"claude-code\" as const] : []),\n ],\n hooksOnly: false,\n mcpOnly: false,\n scope: \"global\",\n promptInjection: opts.promptInjection,\n claudeMd: opts.claudeMd,\n });\n\n const codex = result.agents.find((agent) => agent.agent === \"codex\");\n const claude = result.agents.find((agent) => agent.agent === \"claude-code\");\n\n return {\n appPath: result.appPath,\n runtimeNodePath: result.runtimeNodePath,\n runtimeCliPath: result.runtimeCliPath,\n runtimeMcpPath: result.runtimeMcpPath,\n codex: codex?.mcp ?? skipped(\"skipped\"),\n claude: claude?.mcp ?? skipped(\"skipped\"),\n codex_hooks: codex?.hooks ?? skipped(\"skipped\"),\n claude_hooks: claude?.hooks ?? skipped(\"skipped\"),\n claude_md: claude?.claude_md ?? skipped(\"skipped\"),\n };\n}\n\nexport function runRecallSetup(opts: RecallSetupOptions = {}): RecallSetupResult {\n const scope = opts.scope ?? \"global\";\n const dryRun = opts.dryRun ?? false;\n const hooksOnly = opts.hooksOnly ?? false;\n const mcpOnly = opts.mcpOnly ?? false;\n const uninstallHooks = opts.uninstallHooks ?? false;\n const runner = opts.runner ?? defaultRunner;\n const paths = resolveRuntimePaths(opts.appPath);\n\n if (!existsSync(paths.runtimeNodePath)) {\n throw new Error(`Node runtime not found at ${paths.runtimeNodePath}`);\n }\n if (!existsSync(paths.runtimeCliPath)) {\n throw new Error(`Recall CLI entry not found at ${paths.runtimeCliPath}`);\n }\n if (!existsSync(paths.runtimeMcpPath)) {\n throw new Error(`Recall MCP entry not found at ${paths.runtimeMcpPath}`);\n }\n\n const targetAgents = resolveTargetAgents(opts.agent);\n const cwd = resolve(opts.cwd ?? process.cwd());\n const claudeMdEnabled = opts.claudeMd ?? true;\n const agents = targetAgents.map((agent) =>\n setupAgent(agent, {\n cwd,\n dryRun,\n hooksOnly,\n mcpOnly,\n paths,\n runner,\n scope,\n uninstallHooks,\n promptInjection: opts.promptInjection,\n claudeMd: claudeMdEnabled,\n }),\n );\n\n return {\n ...paths,\n scope,\n dry_run: dryRun,\n hooks_only: hooksOnly,\n mcp_only: mcpOnly,\n uninstall_hooks: uninstallHooks,\n agents,\n };\n}\n\nfunction setupAgent(\n agent: AgentName,\n options: {\n cwd: string;\n dryRun: boolean;\n hooksOnly: boolean;\n mcpOnly: boolean;\n paths: ReturnType<typeof resolveRuntimePaths>;\n runner: CommandRunner;\n scope: SetupScope;\n uninstallHooks: boolean;\n promptInjection?: boolean;\n claudeMd?: boolean;\n },\n): AgentSetupResult {\n const detected = detectAgent(agent);\n const hookConfigPath = resolveHookConfigPath(agent, options.scope, options.cwd);\n\n const mcp = options.hooksOnly\n ? skipped(\"hooks-only\")\n : configureMcp(agent, options);\n const hooks = options.mcpOnly\n ? skipped(\"mcp-only\")\n : configureHooks(agent, {\n configPath: hookConfigPath,\n dryRun: options.dryRun,\n paths: options.paths,\n uninstallHooks: options.uninstallHooks,\n promptInjection: options.promptInjection,\n });\n\n // Claude Code only: install the managed CLAUDE.md memory-override block.\n // Skipped on mcp-only (it's a memory-routing concern, not an MCP concern),\n // and when the caller opts out via --no-claude-md.\n let claudeMd: SetupStepResult | undefined;\n let claudeMdPath: string | null = null;\n if (agent === \"claude-code\" && !options.mcpOnly && options.claudeMd !== false) {\n if (options.dryRun) {\n claudeMd = ok(\n options.uninstallHooks\n ? \"would remove Recall block from CLAUDE.md\"\n : \"would install Recall block into CLAUDE.md\",\n );\n } else {\n const result = options.uninstallHooks\n ? uninstallClaudeCodeMemoryOverride()\n : installClaudeCodeMemoryOverride();\n claudeMd = { enabled: true, ok: result.ok, message: result.message };\n claudeMdPath = result.config_path;\n }\n } else if (agent === \"claude-code\" && options.claudeMd === false) {\n claudeMd = skipped(\"--no-claude-md\");\n }\n\n return {\n agent,\n detected,\n mcp,\n hooks,\n hook_config_path: options.mcpOnly ? null : hookConfigPath,\n claude_md: claudeMd,\n claude_md_path: claudeMdPath,\n };\n}\n\nfunction configureMcp(\n agent: AgentName,\n options: {\n dryRun: boolean;\n paths: ReturnType<typeof resolveRuntimePaths>;\n runner: CommandRunner;\n scope: SetupScope;\n },\n): SetupStepResult {\n if (agent === \"codex\") {\n if (!hasCommand(\"codex\")) return skipped(\"codex not found on PATH\");\n if (options.scope === \"project\") {\n return skipped(\"project-scoped Codex MCP not supported by Codex CLI\");\n }\n if (options.dryRun) {\n return ok(\"would configure global Codex MCP server\");\n }\n tryRun(options.runner, \"codex\", [\"mcp\", \"remove\", \"recall\"]);\n options.runner(\"codex\", [\"mcp\", \"add\", \"recall\", \"--\", options.paths.runtimeNodePath, options.paths.runtimeMcpPath]);\n return ok(\"configured global Codex MCP server\");\n }\n\n if (!hasCommand(\"claude\")) return skipped(\"claude not found on PATH\");\n const claudeScope = options.scope === \"project\" ? \"project\" : \"user\";\n if (options.dryRun) {\n return ok(`would configure ${claudeScope} Claude MCP server`);\n }\n tryRun(options.runner, \"claude\", [\"mcp\", \"remove\", \"recall\", \"-s\", claudeScope]);\n options.runner(\"claude\", [\"mcp\", \"add\", \"-s\", claudeScope, \"recall\", options.paths.runtimeNodePath, options.paths.runtimeMcpPath]);\n return ok(`configured ${claudeScope} Claude MCP server`);\n}\n\nfunction configureHooks(\n agent: AgentName,\n options: {\n configPath: string;\n dryRun: boolean;\n paths: ReturnType<typeof resolveRuntimePaths>;\n uninstallHooks: boolean;\n promptInjection?: boolean;\n },\n): SetupStepResult {\n if (options.dryRun) {\n return ok(\n options.uninstallHooks\n ? `would remove hooks from ${options.configPath}`\n : `would install hooks into ${options.configPath}${options.promptInjection === false ? \" (prompt injection opt-out)\" : \"\"}`,\n );\n }\n\n const codexHooksPath = agent === \"codex\"\n ? join(dirname(options.configPath), \"hooks.json\")\n : undefined;\n\n const result = agent === \"claude-code\"\n ? (options.uninstallHooks\n ? uninstallClaudeCodeHooks({ configPath: options.configPath })\n : installClaudeCodeHooks({\n configPath: options.configPath,\n cliPath: options.paths.runtimeCliPath,\n nodePath: options.paths.runtimeNodePath,\n promptInjection: options.promptInjection,\n }))\n : (options.uninstallHooks\n ? uninstallCodexHooks({ configPath: options.configPath, hooksPath: codexHooksPath })\n : installCodexHooks({\n configPath: options.configPath,\n hooksPath: codexHooksPath,\n cliPath: options.paths.runtimeCliPath,\n nodePath: options.paths.runtimeNodePath,\n promptInjection: options.promptInjection,\n }));\n\n return {\n enabled: true,\n ok: result.ok,\n message: result.message,\n };\n}\n\nfunction resolveTargetAgents(target?: AgentName[]): AgentName[] {\n if (target && target.length > 0) {\n return [...new Set(target)];\n }\n\n const detected: AgentName[] = [];\n if (detectAgent(\"codex\")) detected.push(\"codex\");\n if (detectAgent(\"claude-code\")) detected.push(\"claude-code\");\n return detected;\n}\n\nfunction detectAgent(agent: AgentName): boolean {\n if (agent === \"codex\") {\n return hasCommand(\"codex\") || existsSync(join(resolveUserHomeDir(), \".codex\", \"config.toml\"));\n }\n return hasCommand(\"claude\") || existsSync(join(resolveUserHomeDir(), \".claude\", \"settings.json\"));\n}\n\nfunction resolveHookConfigPath(agent: AgentName, scope: SetupScope, cwd: string): string {\n if (scope === \"project\") {\n return agent === \"codex\"\n ? join(cwd, \".codex\", \"config.toml\")\n : join(cwd, \".claude\", \"settings.json\");\n }\n\n return agent === \"codex\"\n ? join(resolveUserHomeDir(), \".codex\", \"config.toml\")\n : join(resolveUserHomeDir(), \".claude\", \"settings.json\");\n}\n\nfunction defaultRunner(command: string, args: string[]) {\n execFileSync(command, args, stdioOpts());\n}\n\nfunction tryRun(runner: CommandRunner, command: string, args: string[]) {\n try {\n runner(command, args);\n } catch {\n return;\n }\n}\n\nfunction stdioOpts() {\n return {\n stdio: \"ignore\" as const,\n };\n}\n\nfunction ok(message: string): SetupStepResult {\n return { enabled: true, ok: true, message };\n}\n\nfunction skipped(message: string): SetupStepResult {\n return { enabled: false, ok: false, message };\n}\n","import {\n existsSync,\n mkdirSync,\n readFileSync,\n renameSync,\n writeFileSync,\n} from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { hasCommand, resolveUserHomeDir } from \"./utils.js\";\nimport type {\n AgentAdapter,\n HookProfile,\n InstallResult,\n} from \"./types.js\";\n\nconst CLAUDE_CONFIG_RELATIVE_PATH = [\".claude\", \"settings.json\"] as const;\nconst CLAUDE_MD_RELATIVE_PATH = [\".claude\", \"CLAUDE.md\"] as const;\nconst MANAGED_TAG = \"recall:managed:claude-code\";\n\n// Bumped whenever the managed CLAUDE.md block content changes. recall doctor\n// uses this to detect stale blocks and report them as \"out of date\".\nconst CLAUDE_MD_BLOCK_VERSION = 1;\nconst CLAUDE_MD_BEGIN = `<!-- recall:managed:claude-md:begin v${CLAUDE_MD_BLOCK_VERSION} -->`;\nconst CLAUDE_MD_END = \"<!-- recall:managed:claude-md:end -->\";\n// Matches any version of the begin marker so we can replace older blocks\n// in place without leaving stale copies behind.\nconst CLAUDE_MD_BLOCK_RE =\n /<!--\\s*recall:managed:claude-md:begin(?:\\s+v\\d+)?\\s*-->[\\s\\S]*?<!--\\s*recall:managed:claude-md:end\\s*-->\\n?/g;\nconst SESSION_START_MATCHER = \"startup|resume|clear|compact\";\nconst SESSION_END_MATCHER =\n \"clear|resume|logout|prompt_input_exit|bypass_permissions_disabled|other\";\n\ninterface ClaudeSettings {\n hooks?: Record<string, ClaudeHookMatcherGroup[]>;\n [key: string]: unknown;\n}\n\ninterface ClaudeHookMatcherGroup {\n matcher?: string;\n hooks?: ClaudeCommandHook[];\n [key: string]: unknown;\n}\n\ninterface ClaudeCommandHook {\n type: \"command\";\n command: string;\n [key: string]: unknown;\n}\n\nexport interface ClaudeCodeHookInstallOptions {\n configPath?: string;\n cliPath?: string;\n nodePath?: string;\n profile?: HookProfile;\n /** When false, prepends RECALL_HOOK_INJECT_PROMPT=false to the prompt-hook command so per-prompt injection stays off without requiring a shell rc edit. */\n promptInjection?: boolean;\n}\n\nconst configPath = () => join(resolveUserHomeDir(), ...CLAUDE_CONFIG_RELATIVE_PATH);\n\nexport const claudeCodeAdapter: AgentAdapter = {\n name: \"claude-code\",\n configPath,\n detect() {\n return existsSync(configPath()) || hasCommand(\"claude\") ? \"installed\" : \"not-installed\";\n },\n capabilities() {\n return {\n supports: [\"session_started\", \"prompt_submitted\", \"tool_invoked\", \"session_ended\"],\n supports_hook_install: true,\n supports_mcp_fallback: true,\n };\n },\n installHooks(profile: HookProfile): InstallResult {\n return installClaudeCodeHooks({ profile });\n },\n uninstallHooks(): InstallResult {\n return uninstallClaudeCodeHooks();\n },\n envMapping: {\n prompt_submitted: {\n prompt: \"text\",\n session_id: \"session_id\",\n cwd: \"repo_path\",\n },\n tool_invoked: {\n tool_name: \"name\",\n tool_input: \"input_summary\",\n session_id: \"session_id\",\n cwd: \"repo_path\",\n },\n session_started: {\n session_id: \"session_id\",\n cwd: \"repo_path\",\n source: \"matcher\",\n },\n session_ended: {\n session_id: \"session_id\",\n cwd: \"repo_path\",\n reason: \"matcher\",\n },\n },\n writeMcpFallback(): InstallResult {\n throw new Error(\"Claude Code MCP fallback wiring not implemented yet.\");\n },\n};\n\nexport function installClaudeCodeHooks(\n options: ClaudeCodeHookInstallOptions = {},\n): InstallResult {\n const targetPath = options.configPath ?? configPath();\n const current = readSettingsFile(targetPath);\n const managedGroups = buildManagedGroups({\n cliPath: options.cliPath,\n nodePath: options.nodePath,\n profile: options.profile,\n promptInjection: options.promptInjection,\n });\n const next = cloneSettings(current.settings);\n const hooks = ensureHooksObject(next);\n\n let changed = false;\n for (const [eventName, groups] of Object.entries(managedGroups)) {\n const existing = hooks[eventName] ?? [];\n const preserved = existing.filter((group) => !isManagedGroup(group));\n const merged = [...preserved, ...groups];\n if (!sameJson(existing, merged)) {\n hooks[eventName] = merged;\n changed = true;\n }\n }\n\n if (!changed) {\n return {\n ok: true,\n changed: false,\n config_path: targetPath,\n message: \"Claude Code hooks already installed\",\n };\n }\n\n writeSettingsFile(targetPath, current.raw, next);\n return {\n ok: true,\n changed: true,\n config_path: targetPath,\n message: \"Installed Claude Code Recall hooks\",\n };\n}\n\nexport function uninstallClaudeCodeHooks(\n options: Pick<ClaudeCodeHookInstallOptions, \"configPath\"> = {},\n): InstallResult {\n const targetPath = options.configPath ?? configPath();\n if (!existsSync(targetPath)) {\n return {\n ok: true,\n changed: false,\n config_path: targetPath,\n message: \"Claude Code settings file not found\",\n };\n }\n\n const current = readSettingsFile(targetPath);\n const next = cloneSettings(current.settings);\n const hooks = next.hooks;\n\n if (!hooks || typeof hooks !== \"object\") {\n return {\n ok: true,\n changed: false,\n config_path: targetPath,\n message: \"No Claude Code hooks configured\",\n };\n }\n\n let changed = false;\n for (const eventName of Object.keys(hooks)) {\n const existing = hooks[eventName] ?? [];\n const preserved = existing.filter((group) => !isManagedGroup(group));\n if (!sameJson(existing, preserved)) {\n changed = true;\n if (preserved.length > 0) {\n hooks[eventName] = preserved;\n } else {\n delete hooks[eventName];\n }\n }\n }\n\n if (Object.keys(hooks).length === 0) {\n delete next.hooks;\n }\n\n if (!changed) {\n return {\n ok: true,\n changed: false,\n config_path: targetPath,\n message: \"No Recall-managed Claude Code hooks found\",\n };\n }\n\n writeSettingsFile(targetPath, current.raw, next);\n return {\n ok: true,\n changed: true,\n config_path: targetPath,\n message: \"Removed Claude Code Recall hooks\",\n };\n}\n\nfunction buildManagedGroups(\n options: ClaudeCodeHookInstallOptions,\n): Record<string, ClaudeHookMatcherGroup[]> {\n const installedEvents = new Set(options.profile ?? []);\n const commandPrefix = resolveHookCommandPrefix(options);\n const groups: Record<string, ClaudeHookMatcherGroup[]> = {};\n\n groups.SessionStart = [\n {\n matcher: SESSION_START_MATCHER,\n hooks: [commandHook(`${commandPrefix} hook session-start --agent claude-code --claude-code-stdin`, \"session-start\")],\n },\n ];\n\n if (installedEvents.size === 0 || installedEvents.has(\"prompt_submitted\")) {\n const envPrefix = options.promptInjection === false ? \"RECALL_HOOK_INJECT_PROMPT=false \" : \"\";\n groups.UserPromptSubmit = [\n {\n hooks: [commandHook(`${envPrefix}${commandPrefix} hook prompt --agent claude-code --claude-code-stdin`, \"prompt\")],\n },\n ];\n }\n\n if (installedEvents.size === 0 || installedEvents.has(\"tool_invoked\")) {\n groups.PostToolUse = [\n {\n matcher: \"Edit|Write|Bash\",\n hooks: [commandHook(`${commandPrefix} hook tool --agent claude-code --claude-code-stdin`, \"tool\")],\n },\n ];\n }\n\n if (installedEvents.size === 0 || installedEvents.has(\"session_ended\")) {\n groups.SessionEnd = [\n {\n matcher: SESSION_END_MATCHER,\n hooks: [commandHook(`${commandPrefix} hook session-end --agent claude-code --claude-code-stdin`, \"session-end\")],\n },\n ];\n }\n\n return groups;\n}\n\nfunction commandHook(command: string, tag: string): ClaudeCommandHook {\n return {\n type: \"command\",\n command: `${command} # ${MANAGED_TAG}:${tag}`,\n };\n}\n\nfunction resolveHookCommandPrefix(options: ClaudeCodeHookInstallOptions): string {\n const nodePath = options.nodePath ?? process.env.RECALL_NODE_PATH ?? process.execPath;\n const cliPath = options.cliPath ?? resolveCliPath();\n return `${shellQuote(nodePath)} ${shellQuote(cliPath)}`;\n}\n\nfunction resolveCliPath(): string {\n const fromEnv = process.env.RECALL_CLI_PATH;\n if (fromEnv && existsSync(fromEnv)) {\n return resolve(fromEnv);\n }\n\n const fromArgv = process.argv[1];\n if (fromArgv && /(?:^|\\/)cli\\.[cm]?js$/.test(fromArgv) && existsSync(fromArgv)) {\n return resolve(fromArgv);\n }\n\n const sibling = resolve(dirname(fileURLToPath(import.meta.url)), \"..\", \"cli.js\");\n if (existsSync(sibling)) {\n return sibling;\n }\n\n const distCli = resolve(process.cwd(), \"dist\", \"cli.js\");\n if (existsSync(distCli)) {\n return distCli;\n }\n\n throw new Error(\"Unable to resolve Recall CLI path for Claude Code hooks\");\n}\n\nfunction readSettingsFile(configPath: string): { raw: string | null; settings: ClaudeSettings } {\n if (!existsSync(configPath)) {\n return { raw: null, settings: {} };\n }\n\n const raw = readFileSync(configPath, \"utf-8\");\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(`Invalid Claude Code settings at ${configPath}`);\n }\n\n return { raw, settings: parsed as ClaudeSettings };\n}\n\nfunction writeSettingsFile(\n configPath: string,\n previousRaw: string | null,\n settings: ClaudeSettings,\n) {\n const parentDir = dirname(configPath);\n mkdirSync(parentDir, { recursive: true });\n\n if (previousRaw != null) {\n const backupPath = `${configPath}.recall.bak.${Date.now()}`;\n writeFileSync(backupPath, previousRaw);\n }\n\n const tmpPath = `${configPath}.tmp.${process.pid}`;\n writeFileSync(tmpPath, `${JSON.stringify(settings, null, 2)}\\n`);\n renameSync(tmpPath, configPath);\n}\n\nfunction ensureHooksObject(settings: ClaudeSettings): Record<string, ClaudeHookMatcherGroup[]> {\n if (!settings.hooks) {\n settings.hooks = {};\n }\n if (typeof settings.hooks !== \"object\" || Array.isArray(settings.hooks)) {\n throw new Error(\"Claude Code hooks config must be an object\");\n }\n return settings.hooks;\n}\n\nfunction isManagedGroup(group: ClaudeHookMatcherGroup): boolean {\n return (group.hooks ?? []).some((hook) => typeof hook.command === \"string\" && hook.command.includes(MANAGED_TAG));\n}\n\nfunction cloneSettings(settings: ClaudeSettings): ClaudeSettings {\n return JSON.parse(JSON.stringify(settings)) as ClaudeSettings;\n}\n\nfunction sameJson(left: unknown, right: unknown): boolean {\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\n// --- Managed CLAUDE.md block ---------------------------------------------\n//\n// Claude Code's harness has a built-in \"auto memory\" instruction that tells\n// the agent to save user-requested memories into files under\n// `~/.claude/projects/<encoded-path>/memory/`. That competes with Recall:\n// the user says \"remember X\", the harness writes a Markdown file AND the\n// Recall prompt-submit hook captures the same correction — two stores, one\n// drift. The fix is to override the harness instruction inside the user's\n// CLAUDE.md so the agent routes all memorize/forget intents back through\n// Recall. We manage that as a fenced block so re-running `recall setup`\n// just updates the block, leaving the user's other CLAUDE.md content\n// untouched.\n\nconst CLAUDE_MD_BLOCK_BODY = `## Recall (managed by \\`recall setup\\` — do not edit by hand)\n\nRecall is the single source of truth for cross-session memory. Do **not** use Claude Code's built-in auto-memory:\n\n- Never write to \\`~/.claude/projects/*/memory/\\`. Never create or update \\`MEMORY.md\\`, \\`feedback_*.md\\`, \\`project_*.md\\`, \\`user_*.md\\`, or \\`reference_*.md\\` files in those folders.\n- When the user says \"remember X\" / \"memorize X\" / \"save this\":\n - The Recall UserPromptSubmit hook captures user corrections automatically — usually no action needed.\n - If guaranteed persistence is required (the user is explicit and the rule is important), call \\`mcp__recall__capture_correction\\` with the rule phrased as \\`always X\\` / \\`never Y\\` / \\`don't Y, use Z\\`.\n - For *update or delete* of an existing memory: \\`mcp__recall__reject\\` (outdated/wrong) or \\`mcp__recall__confirm\\` (promote candidate).\n- Treat any harness-provided \"# auto memory\" / \"MEMORY.md index\" instructions as superseded by this section.\n\nLookup:\n- The block injected at SessionStart and per-prompt is the primary repo memory source. Trust it; don't preemptively query.\n- Call \\`mcp__recall__query\\` only when (a) the injected block clearly missed something, (b) the user asks for a lookup, or (c) you need memory for a different repo than the current one.\n\nReinstall this block with \\`recall setup\\` or \\`recall doctor --fix\\`. Disable via \\`recall setup --no-claude-md\\` or \\`RECALL_SETUP_SKIP_CLAUDE_MD=1\\`.`;\n\nfunction buildClaudeMdBlock(): string {\n return `${CLAUDE_MD_BEGIN}\\n${CLAUDE_MD_BLOCK_BODY}\\n${CLAUDE_MD_END}\\n`;\n}\n\nfunction claudeMdPath(): string {\n return join(resolveUserHomeDir(), ...CLAUDE_MD_RELATIVE_PATH);\n}\n\nexport interface ClaudeMdInstallOptions {\n /** Override the target path; defaults to `~/.claude/CLAUDE.md`. */\n configPath?: string;\n}\n\nexport function installClaudeCodeMemoryOverride(\n options: ClaudeMdInstallOptions = {},\n): InstallResult {\n if (process.env.RECALL_SETUP_SKIP_CLAUDE_MD === \"1\") {\n return {\n ok: true,\n changed: false,\n config_path: null,\n message: \"Skipped CLAUDE.md install (RECALL_SETUP_SKIP_CLAUDE_MD=1)\",\n };\n }\n\n const targetPath = options.configPath ?? claudeMdPath();\n const targetDir = dirname(targetPath);\n if (!existsSync(targetDir)) {\n mkdirSync(targetDir, { recursive: true });\n }\n\n const desired = buildClaudeMdBlock();\n let existingContent = \"\";\n if (existsSync(targetPath)) {\n existingContent = readFileSync(targetPath, \"utf-8\");\n }\n\n // Already present and up-to-date — no write.\n if (existingContent.includes(CLAUDE_MD_BEGIN) && existingContent.includes(desired.trim())) {\n return {\n ok: true,\n changed: false,\n config_path: targetPath,\n message: \"Claude Code CLAUDE.md override already installed\",\n };\n }\n\n let nextContent: string;\n if (CLAUDE_MD_BLOCK_RE.test(existingContent)) {\n // Older managed block present — replace it in place. Reset regex\n // lastIndex first since /g RegExps are stateful.\n CLAUDE_MD_BLOCK_RE.lastIndex = 0;\n nextContent = existingContent.replace(CLAUDE_MD_BLOCK_RE, desired);\n } else if (existingContent.length === 0) {\n // Brand-new file.\n nextContent = desired;\n } else {\n // Append to existing content. Ensure a blank line separator.\n const separator = existingContent.endsWith(\"\\n\\n\") ? \"\" : existingContent.endsWith(\"\\n\") ? \"\\n\" : \"\\n\\n\";\n nextContent = `${existingContent}${separator}${desired}`;\n }\n\n writeFileSync(targetPath, nextContent);\n return {\n ok: true,\n changed: true,\n config_path: targetPath,\n message: existingContent.length === 0\n ? \"Created CLAUDE.md with Recall memory override\"\n : \"Updated Recall memory override in CLAUDE.md\",\n };\n}\n\nexport function uninstallClaudeCodeMemoryOverride(\n options: ClaudeMdInstallOptions = {},\n): InstallResult {\n const targetPath = options.configPath ?? claudeMdPath();\n if (!existsSync(targetPath)) {\n return {\n ok: true,\n changed: false,\n config_path: targetPath,\n message: \"CLAUDE.md not present\",\n };\n }\n const existingContent = readFileSync(targetPath, \"utf-8\");\n CLAUDE_MD_BLOCK_RE.lastIndex = 0;\n if (!CLAUDE_MD_BLOCK_RE.test(existingContent)) {\n return {\n ok: true,\n changed: false,\n config_path: targetPath,\n message: \"No Recall-managed block in CLAUDE.md\",\n };\n }\n CLAUDE_MD_BLOCK_RE.lastIndex = 0;\n const stripped = existingContent.replace(CLAUDE_MD_BLOCK_RE, \"\").replace(/\\n{3,}/g, \"\\n\\n\");\n if (stripped.trim().length === 0) {\n // File was nothing but our block — leave the file in place but empty\n // to avoid surprising the user, who can delete it themselves if they\n // want.\n writeFileSync(targetPath, \"\");\n } else {\n writeFileSync(targetPath, stripped.endsWith(\"\\n\") ? stripped : `${stripped}\\n`);\n }\n return {\n ok: true,\n changed: true,\n config_path: targetPath,\n message: \"Removed Recall-managed block from CLAUDE.md\",\n };\n}\n\nexport type ClaudeMdStatus = \"missing\" | \"current\" | \"stale\" | \"absent_no_file\";\n\nexport function checkClaudeCodeMemoryOverride(\n options: ClaudeMdInstallOptions = {},\n): { status: ClaudeMdStatus; config_path: string } {\n const targetPath = options.configPath ?? claudeMdPath();\n if (!existsSync(targetPath)) {\n return { status: \"absent_no_file\", config_path: targetPath };\n }\n const content = readFileSync(targetPath, \"utf-8\");\n if (!content.includes(\"recall:managed:claude-md:begin\")) {\n return { status: \"missing\", config_path: targetPath };\n }\n return {\n status: content.includes(CLAUDE_MD_BEGIN) && content.includes(CLAUDE_MD_BLOCK_BODY)\n ? \"current\"\n : \"stale\",\n config_path: targetPath,\n };\n}\n","import { execFileSync } from \"node:child_process\";\nimport { homedir } from \"node:os\";\n\nexport function resolveUserHomeDir(): string {\n return process.env.HOME ?? process.env.USERPROFILE ?? homedir();\n}\n\nexport function hasCommand(name: string): boolean {\n try {\n execFileSync(\"which\", [name], { stdio: \"ignore\" });\n return true;\n } catch {\n return false;\n }\n}\n","import {\n existsSync,\n mkdirSync,\n readFileSync,\n renameSync,\n writeFileSync,\n} from \"node:fs\";\nimport { execFileSync } from \"node:child_process\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { hasCommand, resolveUserHomeDir } from \"./utils.js\";\nimport type {\n AgentAdapter,\n HookProfile,\n InstallResult,\n} from \"./types.js\";\n\nconst CODEX_CONFIG_RELATIVE_PATH = [\".codex\", \"config.toml\"] as const;\nconst CODEX_HOOKS_RELATIVE_PATH = [\".codex\", \"hooks.json\"] as const;\nconst MANAGED_START = \"# recall:managed:codex:start\";\nconst MANAGED_END = \"# recall:managed:codex:end\";\nconst MANAGED_FEATURE_FLAG = \"# recall:managed:codex:feature\";\nconst MANAGED_HOOK_TAG = \"recall:managed:codex\";\n\n// Minimum Codex CLI version that supports the hooks.json + [features].codex_hooks\n// flow we target in installCodexHooks. Below this we fall back to the legacy\n// notify bridge so memory capture still works on older CLIs.\n//\n// Override at call time by passing options.minCodexHooksVersion, or at runtime\n// via RECALL_CODEX_HOOKS_MIN_VERSION for users who have forked/patched their CLI.\nconst DEFAULT_MIN_CODEX_HOOKS_VERSION = \"0.115.0\";\n\nexport interface CodexCapability {\n hooks_json: boolean;\n detected_version: string | null;\n required_version: string;\n reason?: string;\n}\n\nexport interface CodexHookInstallOptions {\n configPath?: string;\n hooksPath?: string;\n cliPath?: string;\n nodePath?: string;\n profile?: HookProfile;\n /** Override the minimum Codex CLI version that is eligible for hooks.json install. */\n minCodexHooksVersion?: string;\n /** Skip the version probe and install hooks.json regardless of detected version. */\n forceHooks?: boolean;\n /** Skip hooks.json entirely and use the legacy notify bridge. */\n forceNotifyBridge?: boolean;\n /** When false, prepends RECALL_HOOK_INJECT_PROMPT=false to the prompt-hook command so per-prompt injection stays off without requiring a shell rc edit. */\n promptInjection?: boolean;\n}\n\nconst configPath = () => join(resolveUserHomeDir(), ...CODEX_CONFIG_RELATIVE_PATH);\nconst hooksJsonPath = () => join(resolveUserHomeDir(), ...CODEX_HOOKS_RELATIVE_PATH);\n\nexport const codexAdapter: AgentAdapter = {\n name: \"codex\",\n configPath,\n detect() {\n return existsSync(configPath()) || hasCommand(\"codex\") ? \"installed\" : \"not-installed\";\n },\n capabilities() {\n return {\n supports: [\"prompt_submitted\", \"tool_invoked\", \"session_ended\"],\n supports_hook_install: true,\n supports_mcp_fallback: true,\n };\n },\n installHooks(profile: HookProfile): InstallResult {\n return installCodexHooks({ profile });\n },\n uninstallHooks(): InstallResult {\n return uninstallCodexHooks();\n },\n envMapping: {\n prompt_submitted: {\n prompt: \"text\",\n session_id: \"session_id\",\n cwd: \"repo_path\",\n },\n tool_invoked: {\n tool_name: \"name\",\n cwd: \"repo_path\",\n tool_input: \"input_summary\",\n },\n session_ended: {\n session_id: \"session_id\",\n cwd: \"repo_path\",\n reason: \"event\",\n },\n },\n writeMcpFallback(): InstallResult {\n throw new Error(\"Codex MCP fallback wiring not implemented yet.\");\n },\n};\n\nexport function installCodexNotifyBridge(\n options: CodexHookInstallOptions = {},\n): InstallResult {\n const targetPath = options.configPath ?? configPath();\n const existing = existsSync(targetPath)\n ? readFileSync(targetPath, \"utf-8\")\n : \"\";\n const stripped = stripManagedBlock(existing);\n\n if (hasUnmanagedNotify(stripped)) {\n return {\n ok: false,\n changed: false,\n config_path: targetPath,\n message: \"Codex notify is already configured outside Recall-managed block\",\n };\n }\n\n const managedBlock = buildManagedNotifyBlock(options);\n const next = appendManagedBlock(stripped, managedBlock);\n\n if (next === existing) {\n return {\n ok: true,\n changed: false,\n config_path: targetPath,\n message: \"Codex notify bridge already installed\",\n };\n }\n\n writeConfigFile(targetPath, existing || null, next);\n return {\n ok: true,\n changed: true,\n config_path: targetPath,\n message: \"Installed Codex Recall notify bridge\",\n };\n}\n\nexport function uninstallCodexNotifyBridge(\n options: Pick<CodexHookInstallOptions, \"configPath\"> = {},\n): InstallResult {\n const targetPath = options.configPath ?? configPath();\n if (!existsSync(targetPath)) {\n return {\n ok: true,\n changed: false,\n config_path: targetPath,\n message: \"Codex config.toml not found\",\n };\n }\n\n const existing = readFileSync(targetPath, \"utf-8\");\n const next = stripManagedBlock(existing);\n if (next === existing) {\n return {\n ok: true,\n changed: false,\n config_path: targetPath,\n message: \"No Recall-managed Codex notify bridge found\",\n };\n }\n\n writeConfigFile(targetPath, existing, next);\n return {\n ok: true,\n changed: true,\n config_path: targetPath,\n message: \"Removed Codex Recall notify bridge\",\n };\n}\n\ninterface CodexHooksFile {\n hooks?: Record<string, CodexHookMatcherGroup[]>;\n [key: string]: unknown;\n}\n\ninterface CodexHookMatcherGroup {\n matcher?: string;\n hooks?: CodexCommandHook[];\n [key: string]: unknown;\n}\n\ninterface CodexCommandHook {\n type: \"command\";\n command: string;\n [key: string]: unknown;\n}\n\nexport function detectCodexCapability(\n options: Pick<CodexHookInstallOptions, \"minCodexHooksVersion\"> = {},\n): CodexCapability {\n const required = options.minCodexHooksVersion\n ?? process.env.RECALL_CODEX_HOOKS_MIN_VERSION\n ?? DEFAULT_MIN_CODEX_HOOKS_VERSION;\n const detected = probeCodexVersion();\n if (!detected) {\n return {\n hooks_json: false,\n detected_version: null,\n required_version: required,\n reason: \"codex CLI not found on PATH — cannot verify hook support\",\n };\n }\n if (compareSemver(detected, required) < 0) {\n return {\n hooks_json: false,\n detected_version: detected,\n required_version: required,\n reason: `codex ${detected} < ${required} (hooks.json unsupported)`,\n };\n }\n return {\n hooks_json: true,\n detected_version: detected,\n required_version: required,\n };\n}\n\nexport function installCodexHooks(\n options: CodexHookInstallOptions = {},\n): InstallResult {\n const targetConfig = options.configPath ?? configPath();\n const targetHooks = options.hooksPath ?? hooksJsonPath();\n\n const capability = options.forceNotifyBridge\n ? { hooks_json: false, detected_version: null, required_version: \"n/a\", reason: \"forced notify bridge\" }\n : options.forceHooks\n ? { hooks_json: true, detected_version: null, required_version: \"n/a\" }\n : detectCodexCapability(options);\n\n if (!capability.hooks_json) {\n const bridge = installCodexNotifyBridge(options);\n const reason = capability.reason ?? \"codex hooks unsupported\";\n return {\n ok: bridge.ok,\n changed: bridge.changed,\n config_path: bridge.config_path,\n message: `${bridge.message} (fell back to notify bridge: ${reason})`,\n };\n }\n\n // Migration: legacy notify bridge would double-fire on every prompt. Remove first.\n uninstallCodexNotifyBridge({ configPath: targetConfig });\n\n const flagResult = ensureCodexHooksFeatureFlag(targetConfig);\n const hooksResult = writeCodexHooksJson(targetHooks, options);\n\n const changed = flagResult.changed || hooksResult.changed;\n const ok = flagResult.ok && hooksResult.ok;\n const versionNote = capability.detected_version\n ? ` (codex ${capability.detected_version})`\n : \"\";\n const messages = [flagResult.message, hooksResult.message].filter(Boolean).join(\"; \");\n\n return {\n ok,\n changed,\n config_path: targetHooks,\n message: (messages || (changed ? \"Installed Codex hooks.json\" : \"Codex hooks already installed\")) + versionNote,\n };\n}\n\nfunction probeCodexVersion(): string | null {\n if (!hasCommand(\"codex\")) return null;\n try {\n const raw = execFileSync(\"codex\", [\"--version\"], {\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n timeout: 5_000,\n });\n return extractSemverFromVersionString(raw);\n } catch {\n return null;\n }\n}\n\nexport function extractSemverFromVersionString(raw: string): string | null {\n const match = raw.match(/(\\d+)\\.(\\d+)\\.(\\d+)(?:[-+][A-Za-z0-9.-]+)?/);\n return match ? `${match[1]}.${match[2]}.${match[3]}` : null;\n}\n\nexport function compareSemver(a: string, b: string): number {\n const pa = a.split(\".\").map((n) => parseInt(n, 10));\n const pb = b.split(\".\").map((n) => parseInt(n, 10));\n for (let i = 0; i < 3; i++) {\n const av = pa[i] ?? 0;\n const bv = pb[i] ?? 0;\n if (av !== bv) return av < bv ? -1 : 1;\n }\n return 0;\n}\n\nexport function uninstallCodexHooks(\n options: Pick<CodexHookInstallOptions, \"configPath\" | \"hooksPath\"> = {},\n): InstallResult {\n const targetConfig = options.configPath ?? configPath();\n const targetHooks = options.hooksPath ?? hooksJsonPath();\n\n const flagResult = removeCodexHooksFeatureFlag(targetConfig);\n const hooksResult = removeCodexHooksJson(targetHooks);\n const legacyResult = uninstallCodexNotifyBridge({ configPath: targetConfig });\n\n const changed = flagResult.changed || hooksResult.changed || legacyResult.changed;\n const ok = flagResult.ok && hooksResult.ok && legacyResult.ok;\n\n return {\n ok,\n changed,\n config_path: targetHooks,\n message: changed ? \"Removed Codex Recall hooks\" : \"No Recall-managed Codex hooks found\",\n };\n}\n\nfunction writeCodexHooksJson(\n targetPath: string,\n options: CodexHookInstallOptions,\n): InstallResult {\n const existing = readCodexHooksJson(targetPath);\n const next = cloneCodexHooks(existing.parsed);\n const hooks = ensureCodexHooksObject(next);\n const managed = buildCodexManagedGroups(options);\n\n let changed = false;\n for (const [eventName, groups] of Object.entries(managed)) {\n const current = hooks[eventName] ?? [];\n const preserved = current.filter((group) => !isCodexManagedGroup(group));\n const merged = [...preserved, ...groups];\n if (JSON.stringify(current) !== JSON.stringify(merged)) {\n hooks[eventName] = merged;\n changed = true;\n }\n }\n\n if (!changed) {\n return {\n ok: true,\n changed: false,\n config_path: targetPath,\n message: \"\",\n };\n }\n\n writeJsonFile(targetPath, existing.raw, next);\n return {\n ok: true,\n changed: true,\n config_path: targetPath,\n message: \"wrote hooks.json\",\n };\n}\n\nfunction removeCodexHooksJson(targetPath: string): InstallResult {\n if (!existsSync(targetPath)) {\n return { ok: true, changed: false, config_path: targetPath, message: \"\" };\n }\n\n const existing = readCodexHooksJson(targetPath);\n const next = cloneCodexHooks(existing.parsed);\n const hooks = next.hooks;\n if (!hooks || typeof hooks !== \"object\") {\n return { ok: true, changed: false, config_path: targetPath, message: \"\" };\n }\n\n let changed = false;\n for (const eventName of Object.keys(hooks)) {\n const current = hooks[eventName] ?? [];\n const preserved = current.filter((group) => !isCodexManagedGroup(group));\n if (preserved.length !== current.length) {\n changed = true;\n if (preserved.length > 0) {\n hooks[eventName] = preserved;\n } else {\n delete hooks[eventName];\n }\n }\n }\n\n if (Object.keys(hooks).length === 0) delete next.hooks;\n\n if (!changed) {\n return { ok: true, changed: false, config_path: targetPath, message: \"\" };\n }\n\n writeJsonFile(targetPath, existing.raw, next);\n return { ok: true, changed: true, config_path: targetPath, message: \"cleaned hooks.json\" };\n}\n\nfunction buildCodexManagedGroups(\n options: CodexHookInstallOptions,\n): Record<string, CodexHookMatcherGroup[]> {\n const installedEvents = new Set(options.profile ?? []);\n const commandPrefix = resolveHookCommandPrefix(options);\n const groups: Record<string, CodexHookMatcherGroup[]> = {};\n\n groups.SessionStart = [\n {\n matcher: \"startup|resume\",\n hooks: [commandHook(`${commandPrefix} hook session-start --agent codex --codex-stdin`, \"session-start\")],\n },\n ];\n\n if (installedEvents.size === 0 || installedEvents.has(\"prompt_submitted\")) {\n const envPrefix = options.promptInjection === false ? \"RECALL_HOOK_INJECT_PROMPT=false \" : \"\";\n groups.UserPromptSubmit = [\n {\n hooks: [commandHook(`${envPrefix}${commandPrefix} hook prompt --agent codex --codex-stdin`, \"prompt\")],\n },\n ];\n }\n\n if (installedEvents.size === 0 || installedEvents.has(\"tool_invoked\")) {\n groups.PostToolUse = [\n {\n matcher: \"Bash\",\n hooks: [commandHook(`${commandPrefix} hook tool --agent codex --codex-stdin`, \"tool\")],\n },\n ];\n }\n\n return groups;\n}\n\nfunction commandHook(command: string, tag: string): CodexCommandHook {\n return {\n type: \"command\",\n command: `${command} # ${MANAGED_HOOK_TAG}:${tag}`,\n };\n}\n\nfunction resolveHookCommandPrefix(options: CodexHookInstallOptions): string {\n const nodePath = options.nodePath ?? process.env.RECALL_NODE_PATH ?? process.execPath;\n const cliPath = options.cliPath ?? resolveCliPath();\n return `${shellQuote(nodePath)} ${shellQuote(cliPath)}`;\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nfunction readCodexHooksJson(targetPath: string): { raw: string | null; parsed: CodexHooksFile } {\n if (!existsSync(targetPath)) return { raw: null, parsed: {} };\n const raw = readFileSync(targetPath, \"utf-8\");\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(`Invalid Codex hooks.json at ${targetPath}`);\n }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(`Codex hooks.json must be an object at ${targetPath}`);\n }\n return { raw, parsed: parsed as CodexHooksFile };\n}\n\nfunction writeJsonFile(targetPath: string, previousRaw: string | null, value: unknown) {\n const parentDir = dirname(targetPath);\n mkdirSync(parentDir, { recursive: true });\n if (previousRaw != null) {\n writeFileSync(`${targetPath}.recall.bak.${Date.now()}`, previousRaw);\n }\n const tmpPath = `${targetPath}.tmp.${process.pid}`;\n writeFileSync(tmpPath, `${JSON.stringify(value, null, 2)}\\n`);\n renameSync(tmpPath, targetPath);\n}\n\nfunction ensureCodexHooksObject(file: CodexHooksFile): Record<string, CodexHookMatcherGroup[]> {\n if (!file.hooks) file.hooks = {};\n if (typeof file.hooks !== \"object\" || Array.isArray(file.hooks)) {\n throw new Error(\"Codex hooks.json hooks must be an object\");\n }\n return file.hooks;\n}\n\nfunction isCodexManagedGroup(group: CodexHookMatcherGroup): boolean {\n return (group.hooks ?? []).some(\n (hook) => typeof hook.command === \"string\" && hook.command.includes(MANAGED_HOOK_TAG),\n );\n}\n\nfunction cloneCodexHooks(file: CodexHooksFile): CodexHooksFile {\n return JSON.parse(JSON.stringify(file)) as CodexHooksFile;\n}\n\nfunction ensureCodexHooksFeatureFlag(targetConfigPath: string): InstallResult {\n const existing = existsSync(targetConfigPath) ? readFileSync(targetConfigPath, \"utf-8\") : \"\";\n\n if (/^\\s*codex_hooks\\s*=\\s*true\\b/m.test(existing)) {\n return { ok: true, changed: false, config_path: targetConfigPath, message: \"\" };\n }\n\n const featureHeader = /^\\[features\\]\\s*$/m;\n let next: string;\n if (featureHeader.test(existing)) {\n next = existing.replace(\n featureHeader,\n `[features]\\ncodex_hooks = true ${MANAGED_FEATURE_FLAG}`,\n );\n } else {\n const separator = existing.length === 0 || existing.endsWith(\"\\n\") ? \"\" : \"\\n\";\n next = `${existing}${separator}\\n[features]\\ncodex_hooks = true ${MANAGED_FEATURE_FLAG}\\n`;\n }\n\n writeConfigFile(targetConfigPath, existing || null, next);\n return { ok: true, changed: true, config_path: targetConfigPath, message: \"enabled codex_hooks feature flag\" };\n}\n\nfunction removeCodexHooksFeatureFlag(targetConfigPath: string): InstallResult {\n if (!existsSync(targetConfigPath)) {\n return { ok: true, changed: false, config_path: targetConfigPath, message: \"\" };\n }\n const existing = readFileSync(targetConfigPath, \"utf-8\");\n const managedLine = new RegExp(\n `^\\\\s*codex_hooks\\\\s*=\\\\s*true\\\\s*${escapeRegExp(MANAGED_FEATURE_FLAG)}\\\\s*$\\\\n?`,\n \"m\",\n );\n if (!managedLine.test(existing)) {\n return { ok: true, changed: false, config_path: targetConfigPath, message: \"\" };\n }\n const next = existing.replace(managedLine, \"\");\n writeConfigFile(targetConfigPath, existing, next);\n return { ok: true, changed: true, config_path: targetConfigPath, message: \"removed codex_hooks flag\" };\n}\n\nfunction buildManagedNotifyBlock(options: CodexHookInstallOptions): string {\n const command = [\n options.nodePath ?? process.env.RECALL_NODE_PATH ?? process.execPath,\n options.cliPath ?? resolveCliPath(),\n \"hook\",\n \"codex-notify\",\n ];\n return `${MANAGED_START}\nnotify = ${renderTomlStringArray(command)}\n${MANAGED_END}\n`;\n}\n\nfunction resolveCliPath(): string {\n const fromEnv = process.env.RECALL_CLI_PATH;\n if (fromEnv && existsSync(fromEnv)) {\n return resolve(fromEnv);\n }\n\n const fromArgv = process.argv[1];\n if (fromArgv && /(?:^|\\/)cli\\.[cm]?js$/.test(fromArgv) && existsSync(fromArgv)) {\n return resolve(fromArgv);\n }\n\n const sibling = resolve(dirname(fileURLToPath(import.meta.url)), \"..\", \"cli.js\");\n if (existsSync(sibling)) {\n return sibling;\n }\n\n const distCli = resolve(process.cwd(), \"dist\", \"cli.js\");\n if (existsSync(distCli)) {\n return distCli;\n }\n\n throw new Error(\"Unable to resolve Recall CLI path for Codex notify bridge\");\n}\n\nfunction stripManagedBlock(content: string): string {\n if (!content.includes(MANAGED_START)) {\n return content;\n }\n\n return content\n .replace(new RegExp(`${escapeRegExp(MANAGED_START)}[\\\\s\\\\S]*?${escapeRegExp(MANAGED_END)}\\\\n?`, \"g\"), \"\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .replace(/^\\n+/, \"\")\n .replace(/\\s+$/, \"\");\n}\n\nfunction appendManagedBlock(content: string, block: string): string {\n const trimmed = content.trim();\n if (trimmed.length === 0) {\n return block;\n }\n return `${trimmed}\\n\\n${block}`;\n}\n\nfunction hasUnmanagedNotify(content: string): boolean {\n return /^\\s*notify\\s*=.*$/m.test(content);\n}\n\nfunction renderTomlStringArray(values: readonly string[]): string {\n return `[${values.map((value) => JSON.stringify(value)).join(\", \")}]`;\n}\n\nfunction writeConfigFile(\n configPathValue: string,\n previousRaw: string | null,\n nextRaw: string,\n) {\n const parentDir = dirname(configPathValue);\n mkdirSync(parentDir, { recursive: true });\n\n if (previousRaw != null) {\n writeFileSync(`${configPathValue}.recall.bak.${Date.now()}`, previousRaw);\n }\n\n const tmpPath = `${configPathValue}.tmp.${process.pid}`;\n writeFileSync(tmpPath, normalizeTrailingNewline(nextRaw));\n renameSync(tmpPath, configPathValue);\n}\n\nfunction normalizeTrailingNewline(content: string): string {\n return content.trim().length === 0 ? \"\" : `${content.trimEnd()}\\n`;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport Database from \"better-sqlite3\";\nimport { getDbPath, getDbUserVersion, RECALL_DB_USER_VERSION } from \"../db/client.js\";\nimport { getEmbeddingModelInfo } from \"../embeddings/embeddings.js\";\nimport { getLaunchAgentStatus } from \"../daemon/launchd.js\";\nimport { getSystemdStatus } from \"../daemon/systemd.js\";\nimport { hasCommand, resolveUserHomeDir } from \"../agents/utils.js\";\nimport { checkClaudeCodeMemoryOverride } from \"../agents/claude-code.js\";\n\nexport interface AgentDoctorEntry {\n agent: \"claude-code\" | \"codex\";\n detected: boolean;\n mcp: boolean;\n hooks: boolean;\n legacy_notify_bridge?: boolean;\n config_path: string;\n hook_path?: string;\n /** Only set for Claude Code — managed CLAUDE.md memory-override block status. */\n claude_md?: \"current\" | \"stale\" | \"missing\" | \"absent_no_file\";\n claude_md_path?: string;\n notes: string[];\n}\n\nexport interface UpgradeSignal {\n available: boolean;\n reasons: string[];\n}\n\nexport interface CleanupHealth {\n last_run_id: string | null;\n last_run_at: string | null;\n last_run_actions: Record<string, number>;\n total_runs: number;\n pending_candidate_corrections: number;\n followed_rate_resolved: number | null;\n resolved_injections: number;\n}\n\nexport interface DispatcherHealth {\n providers_configured: string[];\n pending_tasks: Record<string, number>;\n last_dispatch_at: string | null;\n last_dispatch_outcome: \"ok\" | \"error\" | null;\n}\n\nexport interface DoctorReport {\n db_path: string;\n db_user_version: number;\n db_target_version: number;\n embeddings: ReturnType<typeof getEmbeddingModelInfo>;\n launchd: {\n installed: boolean;\n loaded: boolean;\n state?: string;\n } | null;\n systemd: {\n installed: boolean;\n loaded: boolean;\n state?: string;\n } | null;\n agents: AgentDoctorEntry[];\n upgrade: UpgradeSignal;\n cleanup: CleanupHealth | null;\n dispatcher: DispatcherHealth | null;\n}\n\nexport function getDoctorReport(): DoctorReport {\n const dbPath = getDbPath();\n const launchd = process.platform === \"darwin\"\n ? (() => {\n try {\n const status = getLaunchAgentStatus();\n return {\n installed: status.installed,\n loaded: status.loaded,\n state: status.state,\n };\n } catch {\n return null;\n }\n })()\n : null;\n\n const systemd = process.platform === \"linux\"\n ? (() => {\n try {\n const status = getSystemdStatus();\n return {\n installed: status.installed,\n loaded: status.loaded,\n state: status.state,\n };\n } catch {\n return null;\n }\n })()\n : null;\n\n const agents = inspectAgentInstalls();\n return {\n db_path: dbPath,\n db_user_version: getDbUserVersion(dbPath),\n db_target_version: RECALL_DB_USER_VERSION,\n embeddings: getEmbeddingModelInfo(),\n launchd,\n systemd,\n agents,\n upgrade: computeUpgradeSignal(agents),\n cleanup: readCleanupHealth(dbPath),\n dispatcher: readDispatcherHealth(dbPath),\n };\n}\n\nfunction readDispatcherHealth(dbPath: string): DispatcherHealth | null {\n if (!existsSync(dbPath)) return null;\n let sqlite: Database.Database | null = null;\n try {\n sqlite = new Database(dbPath, { readonly: true, fileMustExist: true });\n const tables = sqlite.prepare(\n \"SELECT name FROM sqlite_master WHERE type='table' AND name IN ('memory_maintenance_tasks','llm_usage')\",\n ).all() as Array<{ name: string }>;\n const names = new Set(tables.map((t) => t.name));\n\n let providers: string[] = [];\n try {\n // Probe synchronously without importing the keychain module (which would\n // pull node-keychain into the read-only doctor path).\n const { hasProviderConfigured } = require(\"../credentials/keychain.js\");\n providers = [\"anthropic\", \"azure-openai\", \"openai\"].filter((p) =>\n hasProviderConfigured(p),\n );\n } catch {\n providers = [];\n }\n\n const pending: Record<string, number> = {};\n if (names.has(\"memory_maintenance_tasks\")) {\n const rows = sqlite.prepare(\n \"SELECT kind, COUNT(*) AS n FROM memory_maintenance_tasks WHERE status='pending' GROUP BY kind\",\n ).all() as Array<{ kind: string; n: number }>;\n for (const r of rows) pending[r.kind] = r.n;\n }\n\n let lastAt: string | null = null;\n let lastOk: \"ok\" | \"error\" | null = null;\n if (names.has(\"llm_usage\")) {\n const row = sqlite.prepare(\n \"SELECT created_at, ok FROM llm_usage ORDER BY created_at DESC LIMIT 1\",\n ).get() as { created_at: string; ok: number } | undefined;\n if (row) {\n lastAt = row.created_at;\n lastOk = row.ok ? \"ok\" : \"error\";\n }\n }\n\n return {\n providers_configured: providers,\n pending_tasks: pending,\n last_dispatch_at: lastAt,\n last_dispatch_outcome: lastOk,\n };\n } catch {\n return null;\n } finally {\n sqlite?.close();\n }\n}\n\nfunction readCleanupHealth(dbPath: string): CleanupHealth | null {\n if (!existsSync(dbPath)) return null;\n let sqlite: Database.Database | null = null;\n try {\n sqlite = new Database(dbPath, { readonly: true, fileMustExist: true });\n\n const tables = sqlite.prepare(\n \"SELECT name FROM sqlite_master WHERE type='table' AND name IN ('maintenance_cleanup_log','memories','memory_injections')\",\n ).all() as Array<{ name: string }>;\n const names = new Set(tables.map((t) => t.name));\n if (!names.has(\"maintenance_cleanup_log\")) return null;\n\n const totals = sqlite.prepare(\n \"SELECT COUNT(DISTINCT run_id) AS runs, MAX(created_at) AS last_at FROM maintenance_cleanup_log\",\n ).get() as { runs: number; last_at: string | null };\n\n let lastRunId: string | null = null;\n const actions: Record<string, number> = {};\n if (totals.last_at) {\n const lastRow = sqlite.prepare(\n \"SELECT run_id FROM maintenance_cleanup_log WHERE created_at = ? LIMIT 1\",\n ).get(totals.last_at) as { run_id: string } | undefined;\n lastRunId = lastRow?.run_id ?? null;\n if (lastRunId) {\n const rows = sqlite.prepare(\n \"SELECT action, COUNT(*) as c FROM maintenance_cleanup_log WHERE run_id = ? GROUP BY action\",\n ).all(lastRunId) as Array<{ action: string; c: number }>;\n for (const r of rows) actions[r.action] = r.c;\n }\n }\n\n let pending = 0;\n if (names.has(\"memories\")) {\n const row = sqlite.prepare(\n \"SELECT COUNT(*) AS n FROM memories WHERE status='candidate' AND source='user_correction'\",\n ).get() as { n: number };\n pending = row.n;\n }\n\n let followedRate: number | null = null;\n let resolvedInjections = 0;\n if (names.has(\"memory_injections\")) {\n const since = new Date(Date.now() - 14 * 86_400_000).toISOString();\n const rows = sqlite.prepare(\n \"SELECT outcome, COUNT(*) as c FROM memory_injections WHERE injected_at >= ? GROUP BY outcome\",\n ).all(since) as Array<{ outcome: string | null; c: number }>;\n let followed = 0;\n for (const r of rows) {\n if (!r.outcome) continue;\n resolvedInjections += r.c;\n if (r.outcome === \"followed\") followed += r.c;\n }\n followedRate = resolvedInjections > 0 ? followed / resolvedInjections : null;\n }\n\n return {\n last_run_id: lastRunId,\n last_run_at: totals.last_at,\n last_run_actions: actions,\n total_runs: totals.runs,\n pending_candidate_corrections: pending,\n followed_rate_resolved: followedRate,\n resolved_injections: resolvedInjections,\n };\n } catch {\n return null;\n } finally {\n sqlite?.close();\n }\n}\n\nfunction computeUpgradeSignal(agents: AgentDoctorEntry[]): UpgradeSignal {\n const reasons: string[] = [];\n for (const agent of agents) {\n if (!agent.detected) continue;\n if (agent.legacy_notify_bridge) {\n reasons.push(\n `${agent.agent}: legacy notify bridge detected — upgrade to hooks.json for per-turn memory injection`,\n );\n continue;\n }\n if (agent.mcp && !agent.hooks) {\n reasons.push(\n `${agent.agent}: MCP configured but lifecycle hooks missing — memory injection depends on the model calling query`,\n );\n }\n }\n return { available: reasons.length > 0, reasons };\n}\n\nexport function inspectAgentInstalls(homeDir?: string): AgentDoctorEntry[] {\n const home = homeDir ?? resolveUserHomeDir();\n return [\n inspectClaudeCodeInstall(home),\n inspectCodexInstall(home),\n ];\n}\n\nfunction inspectClaudeCodeInstall(home: string): AgentDoctorEntry {\n const configPath = join(home, \".claude\", \"settings.json\");\n const detected = existsSync(configPath) || hasCommand(\"claude\");\n const notes: string[] = [];\n\n let mcp = false;\n let hooks = false;\n\n if (existsSync(configPath)) {\n try {\n const parsed = JSON.parse(readFileSync(configPath, \"utf-8\"));\n mcp = Boolean(parsed?.mcpServers?.recall);\n const hookGroups = parsed?.hooks ?? {};\n hooks = Object.values(hookGroups).some((groups) =>\n Array.isArray(groups) &&\n groups.some((group: unknown) =>\n isHookGroupManagedBy(group, \"recall:managed:claude-code\"),\n ),\n );\n if (!mcp) notes.push(\"MCP server 'recall' not registered in mcpServers\");\n if (!hooks) notes.push(\"No Recall-managed hooks found in settings.json\");\n } catch (err) {\n notes.push(`Could not parse ${configPath}: ${(err as Error).message}`);\n }\n } else if (detected) {\n notes.push(\"Claude CLI detected but settings.json missing\");\n }\n\n // CLAUDE.md memory-override block. Status mirrors the install: current =\n // installed and matches shipped content, stale = older block present (needs\n // `recall doctor --fix`), missing = file exists but no managed block,\n // absent_no_file = no CLAUDE.md at the expected path.\n // Honor the `home` parameter so tests can scope to a temp HOME — otherwise\n // the check always hits the real ~/.claude/CLAUDE.md.\n const claudeMd = checkClaudeCodeMemoryOverride({\n configPath: join(home, \".claude\", \"CLAUDE.md\"),\n });\n if (claudeMd.status === \"stale\") {\n notes.push(\"CLAUDE.md memory-override block is out of date — run `recall doctor --fix`\");\n } else if (claudeMd.status === \"missing\") {\n notes.push(\"CLAUDE.md exists but has no Recall memory-override block — Claude Code's built-in auto-memory may race Recall\");\n } else if (claudeMd.status === \"absent_no_file\" && detected) {\n notes.push(\"No CLAUDE.md at ~/.claude/CLAUDE.md — run `recall doctor --fix` to install the memory-override block\");\n }\n\n return {\n agent: \"claude-code\",\n detected,\n mcp,\n hooks,\n config_path: configPath,\n claude_md: claudeMd.status,\n claude_md_path: claudeMd.config_path,\n notes,\n };\n}\n\nfunction inspectCodexInstall(home: string): AgentDoctorEntry {\n const configPath = join(home, \".codex\", \"config.toml\");\n const hooksPath = join(home, \".codex\", \"hooks.json\");\n const detected = existsSync(configPath) || hasCommand(\"codex\");\n const notes: string[] = [];\n\n let mcp = false;\n let hooks = false;\n let legacy_notify_bridge = false;\n\n if (existsSync(configPath)) {\n const raw = readFileSync(configPath, \"utf-8\");\n mcp = /\\[mcp_servers\\.recall\\]/.test(raw);\n const featureFlagSet = /^\\s*codex_hooks\\s*=\\s*true\\b/m.test(raw);\n const managedHooksJson =\n existsSync(hooksPath) && readFileSync(hooksPath, \"utf-8\").includes(\"recall:managed:codex\");\n hooks = featureFlagSet && managedHooksJson;\n legacy_notify_bridge =\n raw.includes(\"# recall:managed:codex:start\") &&\n raw.includes(\"codex-notify\");\n\n if (!mcp) notes.push(\"MCP block [mcp_servers.recall] not in config.toml\");\n if (legacy_notify_bridge) {\n notes.push(\n \"Legacy notify bridge present — install the new hooks.json path to enable per-turn memory injection\",\n );\n }\n if (!featureFlagSet) notes.push(\"codex_hooks = true missing from [features]\");\n if (!managedHooksJson) notes.push(\"No Recall-managed entries in ~/.codex/hooks.json\");\n } else if (detected) {\n notes.push(\"Codex CLI detected but config.toml missing\");\n }\n\n return {\n agent: \"codex\",\n detected,\n mcp,\n hooks,\n legacy_notify_bridge,\n config_path: configPath,\n hook_path: hooksPath,\n notes,\n };\n}\n\nfunction isHookGroupManagedBy(group: unknown, tag: string): boolean {\n if (!group || typeof group !== \"object\") return false;\n const hooks = (group as { hooks?: unknown[] }).hooks;\n if (!Array.isArray(hooks)) return false;\n return hooks.some(\n (hook) =>\n hook &&\n typeof hook === \"object\" &&\n typeof (hook as { command?: unknown }).command === \"string\" &&\n (hook as { command: string }).command.includes(tag),\n );\n}\n\nexport function formatDoctorReport(report: DoctorReport): string {\n const lines = [\n \"# Recall Doctor\",\n \"\",\n `DB: ${report.db_path}`,\n `DB ver: ${report.db_user_version}/${report.db_target_version}`,\n ];\n\n if (report.embeddings) {\n lines.push(`Embed: ${report.embeddings.provider}`);\n lines.push(`Model: ${report.embeddings.model}`);\n lines.push(`Dims: index=${report.embeddings.index_dimensions} canonical=${report.embeddings.canonical_dimensions}`);\n lines.push(`Cache: ${report.embeddings.size_label} @ ${report.embeddings.cache_path}`);\n } else {\n lines.push(\"Embed: disabled\");\n }\n\n if (report.launchd) {\n lines.push(`Launchd: ${report.launchd.installed ? \"installed\" : \"missing\"} / ${report.launchd.loaded ? \"loaded\" : \"not loaded\"}${report.launchd.state ? ` (${report.launchd.state})` : \"\"}`);\n }\n if (report.systemd) {\n lines.push(`Systemd: ${report.systemd.installed ? \"installed\" : \"missing\"} / ${report.systemd.loaded ? \"loaded\" : \"not loaded\"}${report.systemd.state ? ` (${report.systemd.state})` : \"\"}`);\n }\n\n lines.push(\"\", \"## Agents\");\n for (const agent of report.agents) {\n const label = agent.agent.padEnd(12);\n if (!agent.detected) {\n lines.push(`${label} not detected`);\n continue;\n }\n const mcp = agent.mcp ? \"ok\" : \"MISSING\";\n const hooks = agent.hooks ? \"ok\" : \"MISSING\";\n const legacy = agent.legacy_notify_bridge ? \" (legacy notify bridge)\" : \"\";\n const claudeMd = agent.claude_md\n ? ` claude.md:${agent.claude_md === \"current\" ? \"ok\" : agent.claude_md.toUpperCase()}`\n : \"\";\n lines.push(`${label} mcp:${mcp} hooks:${hooks}${claudeMd}${legacy}`);\n for (const note of agent.notes) {\n lines.push(` - ${note}`);\n }\n }\n\n if (report.cleanup) {\n lines.push(\"\", \"## Cleanup\");\n if (report.cleanup.last_run_at) {\n const actions = Object.entries(report.cleanup.last_run_actions)\n .map(([k, v]) => `${k}=${v}`)\n .join(\" \");\n lines.push(`Last run: ${report.cleanup.last_run_id?.slice(0, 8)} at ${report.cleanup.last_run_at.slice(0, 19)}`);\n lines.push(`Actions: ${actions || \"(none)\"}`);\n } else {\n lines.push(\"Last run: never\");\n }\n lines.push(`Total runs: ${report.cleanup.total_runs}`);\n lines.push(`Pending correction candidates: ${report.cleanup.pending_candidate_corrections}`);\n if (report.cleanup.followed_rate_resolved != null) {\n const pct = (report.cleanup.followed_rate_resolved * 100).toFixed(1);\n lines.push(`Followed rate (last 14d, of ${report.cleanup.resolved_injections} resolved): ${pct}%`);\n } else {\n lines.push(`Followed rate (last 14d): n/a (no resolved injections)`);\n }\n }\n\n if (report.dispatcher) {\n lines.push(\"\", \"## Dispatcher (LLM refinement)\");\n const provs = report.dispatcher.providers_configured;\n lines.push(`Providers: ${provs.length === 0 ? \"none configured (LLM tier dormant)\" : provs.join(\", \")}`);\n const pendingEntries = Object.entries(report.dispatcher.pending_tasks);\n if (pendingEntries.length === 0) {\n lines.push(\"Pending tasks: 0\");\n } else {\n const total = pendingEntries.reduce((s, [, n]) => s + n, 0);\n lines.push(`Pending tasks: ${total} (${pendingEntries.map(([k, n]) => `${k}=${n}`).join(\", \")})`);\n }\n if (report.dispatcher.last_dispatch_at) {\n lines.push(`Last dispatch: ${report.dispatcher.last_dispatch_at.slice(0, 19)} (${report.dispatcher.last_dispatch_outcome ?? \"unknown\"})`);\n } else {\n lines.push(\"Last dispatch: never\");\n }\n if (provs.length === 0 && pendingEntries.length > 0) {\n lines.push(\"Tasks are queued but no provider is configured. Run `recall maintenance dispatch --preview` to inspect prompts, or `recall maintenance credentials set <provider> <key>` to enable.\");\n }\n }\n\n if (report.upgrade.available) {\n lines.push(\"\", \"## Upgrade available\");\n for (const reason of report.upgrade.reasons) {\n lines.push(`- ${reason}`);\n }\n lines.push(\"Run `recall doctor --fix` or `recall setup --yes` to apply.\");\n }\n\n return lines.join(\"\\n\");\n}\n","import { existsSync, mkdirSync, rmSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { execFileSync } from \"node:child_process\";\n\nconst DEFAULT_LABEL = \"com.recall.daemon\";\n\nexport interface LaunchdOptions {\n label?: string;\n port?: number;\n dataDir?: string;\n nodePath?: string;\n daemonScript?: string;\n maintenanceIntervalSeconds?: number;\n repoRoots?: string;\n embeddingProvider?: string;\n embeddingDims?: string;\n embeddingsDisabled?: string;\n}\n\nexport interface LaunchdStatus {\n label: string;\n plistPath: string;\n installed: boolean;\n loaded: boolean;\n state?: string;\n}\n\nexport function installLaunchAgent(opts: LaunchdOptions = {}): LaunchdStatus {\n assertDarwin();\n\n const cfg = resolveConfig(opts);\n mkdirSync(dirname(cfg.plistPath), { recursive: true });\n mkdirSync(dirname(cfg.stdoutPath), { recursive: true });\n\n writeFileSync(cfg.plistPath, renderPlist(cfg));\n\n tryRun(\"launchctl\", [\"bootout\", domainTarget(), cfg.plistPath]);\n execFileSync(\"launchctl\", [\"bootstrap\", domainTarget(), cfg.plistPath], stdioOpts());\n execFileSync(\"launchctl\", [\"enable\", `${domainTarget()}/${cfg.label}`], stdioOpts());\n execFileSync(\"launchctl\", [\"kickstart\", \"-k\", `${domainTarget()}/${cfg.label}`], stdioOpts());\n\n return getLaunchAgentStatus(cfg.label);\n}\n\nexport function uninstallLaunchAgent(label = DEFAULT_LABEL): LaunchdStatus {\n assertDarwin();\n\n const cfg = resolveConfig({ label });\n tryRun(\"launchctl\", [\"bootout\", domainTarget(), cfg.plistPath]);\n tryRun(\"launchctl\", [\"disable\", `${domainTarget()}/${cfg.label}`]);\n rmSync(cfg.plistPath, { force: true });\n\n return getLaunchAgentStatus(cfg.label);\n}\n\nexport function startLaunchAgent(label = DEFAULT_LABEL): LaunchdStatus {\n assertDarwin();\n const cfg = resolveConfig({ label });\n if (!exists(cfg.plistPath)) {\n throw new Error(`LaunchAgent not installed: ${cfg.plistPath}`);\n }\n execFileSync(\"launchctl\", [\"enable\", `${domainTarget()}/${cfg.label}`], stdioOpts());\n tryRun(\"launchctl\", [\"bootstrap\", domainTarget(), cfg.plistPath]);\n execFileSync(\"launchctl\", [\"kickstart\", \"-k\", `${domainTarget()}/${cfg.label}`], stdioOpts());\n return getLaunchAgentStatus(cfg.label);\n}\n\nexport function stopLaunchAgent(label = DEFAULT_LABEL): LaunchdStatus {\n assertDarwin();\n const cfg = resolveConfig({ label });\n if (exists(cfg.plistPath)) {\n tryRun(\"launchctl\", [\"bootout\", domainTarget(), cfg.plistPath]);\n }\n return getLaunchAgentStatus(cfg.label);\n}\n\nexport function getLaunchAgentStatus(label = DEFAULT_LABEL): LaunchdStatus {\n assertDarwin();\n\n const cfg = resolveConfig({ label });\n const installed = exists(cfg.plistPath);\n const output = tryOutput(\"launchctl\", [\"print\", `${domainTarget()}/${cfg.label}`]);\n\n return {\n label: cfg.label,\n plistPath: cfg.plistPath,\n installed,\n loaded: output.ok,\n state: output.ok ? extractState(output.output) : undefined,\n };\n}\n\nexport function getLaunchAgentInfo(label = DEFAULT_LABEL): string {\n assertDarwin();\n\n const cfg = resolveConfig({ label });\n const status = getLaunchAgentStatus(label);\n const installed = readInstalledConfig(cfg.plistPath);\n const lines = [\n `Label: ${status.label}`,\n `Plist: ${cfg.plistPath}`,\n `Installed: ${status.installed ? \"yes\" : \"no\"}`,\n `Loaded: ${status.loaded ? \"yes\" : \"no\"}`,\n ];\n\n if (status.state) {\n lines.push(`State: ${status.state}`);\n }\n\n lines.push(`Port: ${installed?.port ?? cfg.port}`);\n lines.push(`Data dir: ${installed?.dataDir ?? cfg.dataDir}`);\n if (installed?.repoRoots ?? cfg.repoRoots) {\n lines.push(`Repos: ${installed?.repoRoots ?? cfg.repoRoots}`);\n }\n if (installed?.embeddingProvider ?? cfg.embeddingProvider) {\n lines.push(`EmbedProv: ${installed?.embeddingProvider ?? cfg.embeddingProvider}`);\n }\n if (installed?.embeddingDims ?? cfg.embeddingDims) {\n lines.push(`EmbedDims: ${installed?.embeddingDims ?? cfg.embeddingDims}`);\n }\n if (installed?.embeddingsDisabled ?? cfg.embeddingsDisabled) {\n lines.push(`EmbedOff: ${installed?.embeddingsDisabled ?? cfg.embeddingsDisabled}`);\n }\n lines.push(`Node: ${installed?.nodePath ?? cfg.nodePath}`);\n lines.push(`Script: ${installed?.daemonScript ?? cfg.daemonScript}`);\n lines.push(`Maintain: ${installed?.maintenanceIntervalSeconds ?? cfg.maintenanceIntervalSeconds}s`);\n lines.push(`Stdout: ${installed?.stdoutPath ?? cfg.stdoutPath}`);\n lines.push(`Stderr: ${installed?.stderrPath ?? cfg.stderrPath}`);\n\n return lines.join(\"\\n\");\n}\n\nfunction resolveConfig(opts: LaunchdOptions) {\n const label = opts.label ?? DEFAULT_LABEL;\n const home = homedir();\n const port = opts.port ?? parseInt(process.env.RECALL_PORT ?? \"7890\", 10);\n const maintenanceIntervalSeconds =\n opts.maintenanceIntervalSeconds ??\n parseInt(process.env.RECALL_MAINTENANCE_INTERVAL_SECONDS ?? \"300\", 10);\n const dataDir = resolve(\n opts.dataDir ??\n process.env.RECALL_DATA_DIR ??\n join(home, \".recall\"),\n );\n const nodePath = resolve(opts.nodePath ?? process.execPath);\n const daemonScript = resolve(\n opts.daemonScript ?? join(process.cwd(), \"dist\", \"daemon.js\"),\n );\n const plistPath = join(home, \"Library\", \"LaunchAgents\", `${label}.plist`);\n const logDir = join(dataDir, \"logs\");\n\n return {\n label,\n port,\n maintenanceIntervalSeconds,\n dataDir,\n nodePath,\n daemonScript,\n plistPath,\n stdoutPath: join(logDir, \"daemon.stdout.log\"),\n stderrPath: join(logDir, \"daemon.stderr.log\"),\n repoRoots: opts.repoRoots ?? process.env.RECALL_REPO_ROOTS,\n embeddingProvider: opts.embeddingProvider ?? process.env.RECALL_EMBEDDING_PROVIDER,\n embeddingDims: opts.embeddingDims ?? process.env.RECALL_EMBEDDING_DIMS,\n embeddingsDisabled: opts.embeddingsDisabled ?? process.env.RECALL_EMBEDDINGS_DISABLED,\n };\n}\n\nfunction renderPlist(cfg: ReturnType<typeof resolveConfig>): string {\n const env = {\n RECALL_PORT: String(cfg.port),\n RECALL_MAINTENANCE_INTERVAL_SECONDS: String(cfg.maintenanceIntervalSeconds),\n RECALL_DATA_DIR: cfg.dataDir,\n PATH: process.env.PATH ?? \"/usr/bin:/bin:/usr/sbin:/sbin\",\n ...(cfg.repoRoots ? { RECALL_REPO_ROOTS: cfg.repoRoots } : {}),\n ...(cfg.embeddingProvider ? { RECALL_EMBEDDING_PROVIDER: cfg.embeddingProvider } : {}),\n ...(cfg.embeddingDims ? { RECALL_EMBEDDING_DIMS: cfg.embeddingDims } : {}),\n ...(cfg.embeddingsDisabled ? { RECALL_EMBEDDINGS_DISABLED: cfg.embeddingsDisabled } : {}),\n };\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>${escapeXml(cfg.label)}</string>\n <key>ProgramArguments</key>\n <array>\n <string>${escapeXml(cfg.nodePath)}</string>\n <string>${escapeXml(cfg.daemonScript)}</string>\n </array>\n <key>EnvironmentVariables</key>\n <dict>\n <key>PATH</key>\n <string>${escapeXml(env.PATH)}</string>\n <key>RECALL_PORT</key>\n <string>${escapeXml(env.RECALL_PORT)}</string>\n <key>RECALL_MAINTENANCE_INTERVAL_SECONDS</key>\n <string>${escapeXml(env.RECALL_MAINTENANCE_INTERVAL_SECONDS)}</string>\n <key>RECALL_DATA_DIR</key>\n <string>${escapeXml(env.RECALL_DATA_DIR)}</string>\n${env.RECALL_REPO_ROOTS ? ` <key>RECALL_REPO_ROOTS</key>\n <string>${escapeXml(env.RECALL_REPO_ROOTS)}</string>\n` : \"\"}${env.RECALL_EMBEDDING_PROVIDER ? ` <key>RECALL_EMBEDDING_PROVIDER</key>\n <string>${escapeXml(env.RECALL_EMBEDDING_PROVIDER)}</string>\n` : \"\"}${env.RECALL_EMBEDDING_DIMS ? ` <key>RECALL_EMBEDDING_DIMS</key>\n <string>${escapeXml(env.RECALL_EMBEDDING_DIMS)}</string>\n` : \"\"}${env.RECALL_EMBEDDINGS_DISABLED ? ` <key>RECALL_EMBEDDINGS_DISABLED</key>\n <string>${escapeXml(env.RECALL_EMBEDDINGS_DISABLED)}</string>\n` : \"\"} </dict>\n <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <true/>\n <key>WorkingDirectory</key>\n <string>${escapeXml(process.cwd())}</string>\n <key>StandardOutPath</key>\n <string>${escapeXml(cfg.stdoutPath)}</string>\n <key>StandardErrorPath</key>\n <string>${escapeXml(cfg.stderrPath)}</string>\n</dict>\n</plist>\n`;\n}\n\nfunction domainTarget(): string {\n const uid = process.getuid?.();\n if (uid == null) {\n throw new Error(\"Could not determine current macOS user id\");\n }\n return `gui/${uid}`;\n}\n\nfunction extractState(output: string): string | undefined {\n const line = output.split(\"\\n\").find((item) => item.trim().startsWith(\"state = \"));\n if (!line) return undefined;\n return line.split(\"=\").slice(1).join(\"=\").trim();\n}\n\nfunction tryRun(cmd: string, args: string[]) {\n try {\n execFileSync(cmd, args, stdioOpts());\n } catch {\n return;\n }\n}\n\nfunction tryOutput(cmd: string, args: string[]) {\n try {\n const output = execFileSync(cmd, args, {\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n return { ok: true, output };\n } catch (error: any) {\n return {\n ok: false,\n output: String(error?.stdout ?? error?.stderr ?? error?.message ?? \"\"),\n };\n }\n}\n\nfunction readInstalledConfig(plistPath: string): {\n nodePath?: string;\n daemonScript?: string;\n port?: string;\n maintenanceIntervalSeconds?: string;\n dataDir?: string;\n repoRoots?: string;\n embeddingProvider?: string;\n embeddingDims?: string;\n embeddingsDisabled?: string;\n stdoutPath?: string;\n stderrPath?: string;\n} | null {\n if (!exists(plistPath)) return null;\n\n try {\n const raw = execFileSync(\"plutil\", [\"-convert\", \"json\", \"-o\", \"-\", plistPath], {\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n const parsed = JSON.parse(raw);\n return {\n nodePath: parsed?.ProgramArguments?.[0],\n daemonScript: parsed?.ProgramArguments?.[1],\n port: parsed?.EnvironmentVariables?.RECALL_PORT,\n maintenanceIntervalSeconds: parsed?.EnvironmentVariables?.RECALL_MAINTENANCE_INTERVAL_SECONDS,\n dataDir: parsed?.EnvironmentVariables?.RECALL_DATA_DIR,\n repoRoots: parsed?.EnvironmentVariables?.RECALL_REPO_ROOTS,\n embeddingProvider: parsed?.EnvironmentVariables?.RECALL_EMBEDDING_PROVIDER,\n embeddingDims: parsed?.EnvironmentVariables?.RECALL_EMBEDDING_DIMS,\n embeddingsDisabled: parsed?.EnvironmentVariables?.RECALL_EMBEDDINGS_DISABLED,\n stdoutPath: parsed?.StandardOutPath,\n stderrPath: parsed?.StandardErrorPath,\n };\n } catch {\n return null;\n }\n}\n\nfunction stdioOpts() {\n return {\n stdio: \"pipe\" as const,\n };\n}\n\nfunction exists(path: string): boolean {\n return existsSync(path);\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll('\"', \""\")\n .replaceAll(\"'\", \"'\");\n}\n\nfunction assertDarwin() {\n if (process.platform !== \"darwin\") {\n throw new Error(\"launchd daemon install is only supported on macOS\");\n }\n}\n","import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { execFileSync } from \"node:child_process\";\n\nconst DEFAULT_LABEL = \"recall-daemon\";\n\nexport interface SystemdOptions {\n label?: string;\n port?: number;\n dataDir?: string;\n nodePath?: string;\n daemonScript?: string;\n maintenanceIntervalSeconds?: number;\n repoRoots?: string;\n embeddingProvider?: string;\n embeddingDims?: string;\n embeddingsDisabled?: string;\n}\n\nexport interface SystemdStatus {\n label: string;\n unitPath: string;\n installed: boolean;\n loaded: boolean;\n state?: string;\n}\n\nexport function installSystemdUnit(opts: SystemdOptions = {}): SystemdStatus {\n assertLinux();\n\n const cfg = resolveConfig(opts);\n mkdirSync(dirname(cfg.unitPath), { recursive: true });\n mkdirSync(cfg.logDir, { recursive: true });\n\n writeFileSync(cfg.unitPath, renderUnit(cfg));\n\n systemctl([\"--user\", \"daemon-reload\"]);\n systemctl([\"--user\", \"enable\", \"--now\", `${cfg.label}.service`]);\n\n return getSystemdStatus(cfg.label);\n}\n\nexport function uninstallSystemdUnit(label = DEFAULT_LABEL): SystemdStatus {\n assertLinux();\n\n const cfg = resolveConfig({ label });\n trySystemctl([\"--user\", \"disable\", \"--now\", `${cfg.label}.service`]);\n rmSync(cfg.unitPath, { force: true });\n trySystemctl([\"--user\", \"daemon-reload\"]);\n\n return getSystemdStatus(cfg.label);\n}\n\nexport function startSystemdUnit(label = DEFAULT_LABEL): SystemdStatus {\n assertLinux();\n const cfg = resolveConfig({ label });\n if (!existsSync(cfg.unitPath)) {\n throw new Error(`systemd unit not installed: ${cfg.unitPath}`);\n }\n systemctl([\"--user\", \"start\", `${cfg.label}.service`]);\n return getSystemdStatus(cfg.label);\n}\n\nexport function stopSystemdUnit(label = DEFAULT_LABEL): SystemdStatus {\n assertLinux();\n const cfg = resolveConfig({ label });\n if (existsSync(cfg.unitPath)) {\n trySystemctl([\"--user\", \"stop\", `${cfg.label}.service`]);\n }\n return getSystemdStatus(cfg.label);\n}\n\nexport function getSystemdStatus(label = DEFAULT_LABEL): SystemdStatus {\n assertLinux();\n\n const cfg = resolveConfig({ label });\n const installed = existsSync(cfg.unitPath);\n const active = trySystemctlOutput([\"--user\", \"is-active\", `${cfg.label}.service`]);\n const loaded = active.ok && active.output.trim() === \"active\";\n const state = active.output.trim() || undefined;\n\n return {\n label: cfg.label,\n unitPath: cfg.unitPath,\n installed,\n loaded,\n state,\n };\n}\n\nexport function getSystemdInfo(label = DEFAULT_LABEL): string {\n assertLinux();\n\n const cfg = resolveConfig({ label });\n const status = getSystemdStatus(label);\n const installed = readInstalledConfig(cfg.unitPath);\n const lines = [\n `Label: ${status.label}`,\n `Unit: ${cfg.unitPath}`,\n `Installed: ${status.installed ? \"yes\" : \"no\"}`,\n `Loaded: ${status.loaded ? \"yes\" : \"no\"}`,\n ];\n if (status.state) lines.push(`State: ${status.state}`);\n lines.push(`Port: ${installed?.port ?? cfg.port}`);\n lines.push(`Data dir: ${installed?.dataDir ?? cfg.dataDir}`);\n if (installed?.repoRoots ?? cfg.repoRoots) {\n lines.push(`Repos: ${installed?.repoRoots ?? cfg.repoRoots}`);\n }\n if (installed?.embeddingProvider ?? cfg.embeddingProvider) {\n lines.push(`EmbedProv: ${installed?.embeddingProvider ?? cfg.embeddingProvider}`);\n }\n if (installed?.embeddingDims ?? cfg.embeddingDims) {\n lines.push(`EmbedDims: ${installed?.embeddingDims ?? cfg.embeddingDims}`);\n }\n if (installed?.embeddingsDisabled ?? cfg.embeddingsDisabled) {\n lines.push(`EmbedOff: ${installed?.embeddingsDisabled ?? cfg.embeddingsDisabled}`);\n }\n lines.push(`Node: ${installed?.nodePath ?? cfg.nodePath}`);\n lines.push(`Script: ${installed?.daemonScript ?? cfg.daemonScript}`);\n lines.push(`Maintain: ${installed?.maintenanceIntervalSeconds ?? cfg.maintenanceIntervalSeconds}s`);\n lines.push(`Logs: journalctl --user -u ${cfg.label}.service`);\n\n return lines.join(\"\\n\");\n}\n\nfunction resolveConfig(opts: SystemdOptions) {\n const label = opts.label ?? DEFAULT_LABEL;\n const home = homedir();\n const port = opts.port ?? parseInt(process.env.RECALL_PORT ?? \"7890\", 10);\n const maintenanceIntervalSeconds =\n opts.maintenanceIntervalSeconds ??\n parseInt(process.env.RECALL_MAINTENANCE_INTERVAL_SECONDS ?? \"300\", 10);\n const dataDir = resolve(\n opts.dataDir ?? process.env.RECALL_DATA_DIR ?? join(home, \".recall\"),\n );\n const nodePath = resolve(opts.nodePath ?? process.execPath);\n const daemonScript = resolve(\n opts.daemonScript ?? defaultDaemonScript(),\n );\n const configHome = process.env.XDG_CONFIG_HOME ?? join(home, \".config\");\n const unitPath = join(configHome, \"systemd\", \"user\", `${label}.service`);\n const logDir = join(dataDir, \"logs\");\n\n return {\n label,\n port,\n maintenanceIntervalSeconds,\n dataDir,\n nodePath,\n daemonScript,\n unitPath,\n logDir,\n repoRoots: opts.repoRoots ?? process.env.RECALL_REPO_ROOTS,\n embeddingProvider: opts.embeddingProvider ?? process.env.RECALL_EMBEDDING_PROVIDER,\n embeddingDims: opts.embeddingDims ?? process.env.RECALL_EMBEDDING_DIMS,\n embeddingsDisabled: opts.embeddingsDisabled ?? process.env.RECALL_EMBEDDINGS_DISABLED,\n };\n}\n\nfunction defaultDaemonScript(): string {\n // Co-located with this module under dist/\n const here = dirname(fileURLToPath(import.meta.url));\n return join(here, \"daemon.js\");\n}\n\nfunction renderUnit(cfg: ReturnType<typeof resolveConfig>): string {\n const envLines = [\n `Environment=PATH=${process.env.PATH ?? \"/usr/bin:/bin:/usr/local/bin\"}`,\n `Environment=RECALL_PORT=${cfg.port}`,\n `Environment=RECALL_MAINTENANCE_INTERVAL_SECONDS=${cfg.maintenanceIntervalSeconds}`,\n `Environment=RECALL_DATA_DIR=${cfg.dataDir}`,\n ];\n if (cfg.repoRoots) envLines.push(`Environment=RECALL_REPO_ROOTS=${cfg.repoRoots}`);\n if (cfg.embeddingProvider) envLines.push(`Environment=RECALL_EMBEDDING_PROVIDER=${cfg.embeddingProvider}`);\n if (cfg.embeddingDims) envLines.push(`Environment=RECALL_EMBEDDING_DIMS=${cfg.embeddingDims}`);\n if (cfg.embeddingsDisabled) envLines.push(`Environment=RECALL_EMBEDDINGS_DISABLED=${cfg.embeddingsDisabled}`);\n\n return `[Unit]\nDescription=Recall local daemon\nAfter=network.target\n\n[Service]\nType=simple\nExecStart=${cfg.nodePath} ${cfg.daemonScript}\nRestart=always\nRestartSec=2\n${envLines.join(\"\\n\")}\n\n[Install]\nWantedBy=default.target\n`;\n}\n\nfunction readInstalledConfig(unitPath: string): {\n nodePath?: string;\n daemonScript?: string;\n port?: string;\n maintenanceIntervalSeconds?: string;\n dataDir?: string;\n repoRoots?: string;\n embeddingProvider?: string;\n embeddingDims?: string;\n embeddingsDisabled?: string;\n} | null {\n if (!existsSync(unitPath)) return null;\n try {\n const raw = readFileSync(unitPath, \"utf8\");\n const exec = raw.match(/^ExecStart=(.+)$/m)?.[1]?.trim().split(/\\s+/);\n const env: Record<string, string> = {};\n for (const m of raw.matchAll(/^Environment=([^=]+)=(.+)$/gm)) {\n env[m[1]] = m[2];\n }\n return {\n nodePath: exec?.[0],\n daemonScript: exec?.[1],\n port: env.RECALL_PORT,\n maintenanceIntervalSeconds: env.RECALL_MAINTENANCE_INTERVAL_SECONDS,\n dataDir: env.RECALL_DATA_DIR,\n repoRoots: env.RECALL_REPO_ROOTS,\n embeddingProvider: env.RECALL_EMBEDDING_PROVIDER,\n embeddingDims: env.RECALL_EMBEDDING_DIMS,\n embeddingsDisabled: env.RECALL_EMBEDDINGS_DISABLED,\n };\n } catch {\n return null;\n }\n}\n\nfunction systemctl(args: string[]) {\n execFileSync(\"systemctl\", args, { stdio: \"pipe\" });\n}\n\nfunction trySystemctl(args: string[]) {\n try {\n execFileSync(\"systemctl\", args, { stdio: \"pipe\" });\n } catch {\n return;\n }\n}\n\nfunction trySystemctlOutput(args: string[]) {\n try {\n const output = execFileSync(\"systemctl\", args, {\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n return { ok: true, output };\n } catch (error: any) {\n return {\n ok: false,\n output: String(error?.stdout ?? error?.stderr ?? error?.message ?? \"\"),\n };\n }\n}\n\nfunction assertLinux() {\n if (process.platform !== \"linux\") {\n throw new Error(\"systemd daemon install is only supported on Linux\");\n }\n}\n","import {\n installLaunchAgent,\n uninstallLaunchAgent,\n startLaunchAgent,\n stopLaunchAgent,\n getLaunchAgentStatus,\n getLaunchAgentInfo,\n type LaunchdOptions,\n} from \"./launchd.js\";\nimport {\n installSystemdUnit,\n uninstallSystemdUnit,\n startSystemdUnit,\n stopSystemdUnit,\n getSystemdStatus,\n getSystemdInfo,\n type SystemdOptions,\n} from \"./systemd.js\";\n\nexport type ServiceOptions = LaunchdOptions & SystemdOptions;\n\nexport interface ServiceStatus {\n label: string;\n installed: boolean;\n loaded: boolean;\n state?: string;\n}\n\nconst isLinux = process.platform === \"linux\";\nconst isDarwin = process.platform === \"darwin\";\n\nfunction unsupported(): never {\n throw new Error(\n `Recall daemon service is only supported on macOS (launchd) and Linux (systemd). Current platform: ${process.platform}`,\n );\n}\n\nexport function installService(opts: ServiceOptions = {}): ServiceStatus {\n if (isDarwin) return installLaunchAgent(opts);\n if (isLinux) return installSystemdUnit(opts);\n unsupported();\n}\n\nexport function uninstallService(label?: string): ServiceStatus {\n if (isDarwin) return uninstallLaunchAgent(label);\n if (isLinux) return uninstallSystemdUnit(label);\n unsupported();\n}\n\nexport function startService(label?: string): ServiceStatus {\n if (isDarwin) return startLaunchAgent(label);\n if (isLinux) return startSystemdUnit(label);\n unsupported();\n}\n\nexport function stopService(label?: string): ServiceStatus {\n if (isDarwin) return stopLaunchAgent(label);\n if (isLinux) return stopSystemdUnit(label);\n unsupported();\n}\n\nexport function getServiceStatus(label?: string): ServiceStatus {\n if (isDarwin) return getLaunchAgentStatus(label);\n if (isLinux) return getSystemdStatus(label);\n unsupported();\n}\n\nexport function getServiceInfo(label?: string): string {\n if (isDarwin) return getLaunchAgentInfo(label);\n if (isLinux) return getSystemdInfo(label);\n unsupported();\n}\n\nexport function defaultServiceLabel(): string {\n return isLinux ? \"recall-daemon\" : \"com.recall.daemon\";\n}\n"],"mappings":"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","names":["resolve","writeFileSync","readFileSync","join","existsSync","execFileSync","dirname","join","resolve","fileURLToPath","configPath","existsSync","mkdirSync","readFileSync","renameSync","writeFileSync","execFileSync","dirname","join","resolve","fileURLToPath","configPath","join","configPath","existsSync","readFileSync","ok","execFileSync","resolveHookCommandPrefix","commandHook","resolveCliPath","shellQuote","dirname","mkdirSync","writeFileSync","renameSync","resolve","fileURLToPath","existsSync","join","dirname","fileURLToPath","resolve","claudeMdPath","execFileSync","existsSync","readFileSync","join","existsSync","mkdirSync","writeFileSync","homedir","dirname","join","resolve","execFileSync","tryRun","stdioOpts","existsSync","mkdirSync","readFileSync","rmSync","writeFileSync","homedir","dirname","join","resolve","fileURLToPath","execFileSync","DEFAULT_LABEL","resolveConfig","readInstalledConfig","existsSync","configPath","join","readFileSync","require","mkdirSync","renameSync","rmSync","homedir","join","resolve","ok","readFileSync","writeFileSync"]}
|