@agentmemory/agentmemory 0.9.4 → 0.9.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +108 -50
- package/dist/cli.mjs +60 -20
- package/dist/cli.mjs.map +1 -1
- package/dist/docker-compose.yml +10 -1
- package/dist/hooks/session-end.mjs +4 -4
- package/dist/hooks/session-end.mjs.map +1 -1
- package/dist/hooks/session-start.mjs +23 -10
- package/dist/hooks/session-start.mjs.map +1 -1
- package/dist/hooks/stop.mjs +1 -1
- package/dist/hooks/stop.mjs.map +1 -1
- package/dist/hooks/subagent-start.mjs +17 -18
- package/dist/hooks/subagent-start.mjs.map +1 -1
- package/dist/image-refs-CZVd2z6E.mjs +3 -0
- package/dist/{image-store-Cn9eD-7D.mjs → image-store-CF4gfkLr.mjs} +1 -1
- package/dist/index.mjs +205 -82
- package/dist/index.mjs.map +1 -1
- package/dist/{src-uDy2jLO-.mjs → src-C7vGxttN.mjs} +147 -24
- package/dist/src-C7vGxttN.mjs.map +1 -0
- package/dist/{standalone-CqqEcfNR.mjs → standalone-DnSJzyXL.mjs} +36 -4
- package/dist/{standalone-CqqEcfNR.mjs.map → standalone-DnSJzyXL.mjs.map} +1 -1
- package/dist/standalone.d.mts.map +1 -1
- package/dist/standalone.mjs +35 -3
- package/dist/standalone.mjs.map +1 -1
- package/dist/{tools-registry-Co8VIL4t.mjs → tools-registry-CKMeHaPN.mjs} +2 -2
- package/dist/{tools-registry-Co8VIL4t.mjs.map → tools-registry-CKMeHaPN.mjs.map} +1 -1
- package/docker-compose.yml +10 -1
- package/package.json +1 -1
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/scripts/session-end.mjs +4 -4
- package/plugin/scripts/session-end.mjs.map +1 -1
- package/plugin/scripts/session-start.mjs +23 -10
- package/plugin/scripts/session-start.mjs.map +1 -1
- package/plugin/scripts/stop.mjs +1 -1
- package/plugin/scripts/stop.mjs.map +1 -1
- package/plugin/scripts/subagent-start.mjs +17 -18
- package/plugin/scripts/subagent-start.mjs.map +1 -1
- package/dist/image-refs-BfT7XAa-.mjs +0 -3
- package/dist/src-uDy2jLO-.mjs.map +0 -1
package/dist/cli.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.mjs","names":["PATH_DELIMITER"],"sources":["../src/state/schema.ts","../src/cli.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\n\nexport const KV = {\n sessions: \"mem:sessions\",\n observations: (sessionId: string) => `mem:obs:${sessionId}`,\n memories: \"mem:memories\",\n summaries: \"mem:summaries\",\n config: \"mem:config\",\n metrics: \"mem:metrics\",\n health: \"mem:health\",\n embeddings: (obsId: string) => `mem:emb:${obsId}`,\n bm25Index: \"mem:index:bm25\",\n relations: \"mem:relations\",\n profiles: \"mem:profiles\",\n claudeBridge: \"mem:claude-bridge\",\n graphNodes: \"mem:graph:nodes\",\n graphEdges: \"mem:graph:edges\",\n semantic: \"mem:semantic\",\n procedural: \"mem:procedural\",\n teamShared: (teamId: string) => `mem:team:${teamId}:shared`,\n teamUsers: (teamId: string, userId: string) =>\n `mem:team:${teamId}:users:${userId}`,\n teamProfile: (teamId: string) => `mem:team:${teamId}:profile`,\n audit: \"mem:audit\",\n actions: \"mem:actions\",\n actionEdges: \"mem:action-edges\",\n leases: \"mem:leases\",\n routines: \"mem:routines\",\n routineRuns: \"mem:routine-runs\",\n signals: \"mem:signals\",\n checkpoints: \"mem:checkpoints\",\n mesh: \"mem:mesh\",\n sketches: \"mem:sketches\",\n facets: \"mem:facets\",\n sentinels: \"mem:sentinels\",\n crystals: \"mem:crystals\",\n lessons: \"mem:lessons\",\n insights: \"mem:insights\",\n graphEdgeHistory: \"mem:graph:edge-history\",\n enrichedChunks: (sessionId: string) => `mem:enriched:${sessionId}`,\n latentEmbeddings: (obsId: string) => `mem:latent:${obsId}`,\n retentionScores: \"mem:retention\",\n accessLog: \"mem:access\",\n imageRefs: \"mem:image-refs\",\n imageEmbeddings: \"mem:image-embeddings\",\n slots: \"mem:slots\",\n globalSlots: \"mem:slots:global\",\n state: \"mem:state\",\n} as const;\n\nexport const STREAM = {\n name: \"mem-live\",\n group: (sessionId: string) => sessionId,\n viewerGroup: \"viewer\",\n} as const;\n\nexport function generateId(prefix: string): string {\n const ts = Date.now().toString(36);\n const rand = crypto.randomUUID().replace(/-/g, \"\").slice(0, 12);\n return `${prefix}_${ts}_${rand}`;\n}\n\nexport function fingerprintId(prefix: string, content: string): string {\n const hash = createHash(\"sha256\").update(content).digest(\"hex\");\n return `${prefix}_${hash.slice(0, 16)}`;\n}\n\nexport function jaccardSimilarity(a: string, b: string): number {\n const setA = new Set(a.split(/\\s+/).filter((t) => t.length > 2));\n const setB = new Set(b.split(/\\s+/).filter((t) => t.length > 2));\n if (setA.size === 0 && setB.size === 0) return 1;\n if (setA.size === 0 || setB.size === 0) return 0;\n let intersection = 0;\n for (const word of setA) {\n if (setB.has(word)) intersection++;\n }\n return intersection / (setA.size + setB.size - intersection);\n}\n","#!/usr/bin/env node\n\nimport {\n spawn,\n execFileSync,\n spawnSync,\n type ChildProcess,\n} from \"node:child_process\";\nimport { existsSync, readdirSync, readFileSync, readlinkSync, statSync } from \"node:fs\";\nimport { join, dirname, delimiter as PATH_DELIMITER } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { homedir, platform } from \"node:os\";\nimport * as p from \"@clack/prompts\";\nimport { generateId } from \"./state/schema.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst args = process.argv.slice(2);\nconst IS_WINDOWS = platform() === \"win32\";\nconst IS_VERBOSE = args.includes(\"--verbose\") || args.includes(\"-v\");\n\nfunction vlog(msg: string): void {\n if (IS_VERBOSE) p.log.info(`[verbose] ${msg}`);\n}\n\nif (args.includes(\"--help\") || args.includes(\"-h\")) {\n console.log(`\nagentmemory — persistent memory for AI coding agents\n\nUsage: agentmemory [command] [options]\n\nCommands:\n (default) Start agentmemory worker\n status Show connection status, memory count, flags, and health\n doctor Run diagnostic checks (server, flags, graph, providers)\n demo Seed sample sessions and show recall in action\n upgrade Upgrade local deps + iii runtime (best effort)\n mcp Start standalone MCP server (no engine required)\n import-jsonl [p] Import Claude Code JSONL transcripts (default: ~/.claude/projects)\n --max-files <N> | --max-files=<N>: override scan cap (default 200, max 1000;\n out-of-range is rejected; for trees >1000 files, batch by subdirectory)\n\nOptions:\n --help, -h Show this help\n --verbose, -v Show engine stderr and diagnostic info on startup\n --tools all|core Tool visibility (default: core = 7 tools)\n --no-engine Skip auto-starting iii-engine\n --port <N> Override REST port (default: 3111)\n\nEnvironment:\n AGENTMEMORY_URL Full REST base URL (e.g. http://localhost:3111).\n Honored by status, doctor, and MCP shim commands.\n\nQuick start:\n npx @agentmemory/agentmemory # start with local iii-engine or Docker\n npx @agentmemory/agentmemory demo # see semantic recall in 30 seconds\n npx @agentmemory/agentmemory doctor # diagnose config + feature flags\n npx @agentmemory/agentmemory status # health + memory count + flags\n npx @agentmemory/agentmemory upgrade # upgrade agentmemory + iii runtime\n npx @agentmemory/agentmemory mcp # standalone MCP server (no engine)\n npx @agentmemory/mcp # same as above (shim package)\n`);\n process.exit(0);\n}\n\nconst toolsIdx = args.indexOf(\"--tools\");\nif (toolsIdx !== -1 && args[toolsIdx + 1]) {\n process.env[\"AGENTMEMORY_TOOLS\"] = args[toolsIdx + 1];\n}\n\nconst portIdx = args.indexOf(\"--port\");\nif (portIdx !== -1 && args[portIdx + 1]) {\n process.env[\"III_REST_PORT\"] = args[portIdx + 1];\n}\n\nconst skipEngine = args.includes(\"--no-engine\");\n\nfunction getRestPort(): number {\n const url = process.env[\"AGENTMEMORY_URL\"];\n if (url) {\n try {\n const parsed = new URL(url).port;\n if (parsed) return parseInt(parsed, 10);\n } catch {}\n }\n return parseInt(process.env[\"III_REST_PORT\"] || \"3111\", 10) || 3111;\n}\n\nfunction getBaseUrl(): string {\n const url = process.env[\"AGENTMEMORY_URL\"];\n if (url) return url.replace(/\\/+$/, \"\");\n return `http://localhost:${getRestPort()}`;\n}\n\nfunction getViewerUrl(): string {\n const envUrl = process.env[\"AGENTMEMORY_VIEWER_URL\"];\n if (envUrl) return envUrl.replace(/\\/+$/, \"\");\n try {\n const u = new URL(getBaseUrl());\n const vPort = (parseInt(u.port || \"3111\", 10) || 3111) + 2;\n return `${u.protocol}//${u.hostname}:${vPort}`;\n } catch {\n return `http://localhost:${getRestPort() + 2}`;\n }\n}\n\nasync function isEngineRunning(): Promise<boolean> {\n try {\n await fetch(`${getBaseUrl()}/`, {\n signal: AbortSignal.timeout(2000),\n });\n return true;\n } catch {\n return false;\n }\n}\n\nasync function isAgentmemoryReady(): Promise<boolean> {\n try {\n const res = await fetch(`${getBaseUrl()}/agentmemory/livez`, {\n signal: AbortSignal.timeout(2000),\n });\n return res.ok;\n } catch {\n return false;\n }\n}\n\nfunction findIiiConfig(): string {\n const candidates = [\n join(__dirname, \"iii-config.yaml\"),\n join(__dirname, \"..\", \"iii-config.yaml\"),\n join(process.cwd(), \"iii-config.yaml\"),\n ];\n for (const c of candidates) {\n if (existsSync(c)) return c;\n }\n return \"\";\n}\n\nfunction whichBinary(name: string): string | null {\n const cmd = IS_WINDOWS ? \"where\" : \"which\";\n try {\n const out = execFileSync(cmd, [name], { encoding: \"utf-8\" });\n const first = out\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .find((line) => line.length > 0);\n return first ?? null;\n } catch {\n return null;\n }\n}\n\nfunction fallbackIiiPaths(): string[] {\n if (IS_WINDOWS) {\n const userProfile = process.env[\"USERPROFILE\"];\n if (!userProfile) return [];\n return [\n join(userProfile, \".local\", \"bin\", \"iii.exe\"),\n join(userProfile, \"bin\", \"iii.exe\"),\n ];\n }\n const home = process.env[\"HOME\"];\n if (!home) return [\"/usr/local/bin/iii\"];\n return [join(home, \".local\", \"bin\", \"iii\"), \"/usr/local/bin/iii\"];\n}\n\ntype StartupFailure = {\n kind: \"no-engine\" | \"no-docker-compose\" | \"engine-crashed\" | \"docker-crashed\";\n stderr?: string;\n binary?: string;\n};\n\nlet startupFailure: StartupFailure | null = null;\n\n// Spawn a background engine and collect any startup stderr for a short\n// window. The process is unref'd so the CLI parent can exit cleanly; we\n// only care about stderr that shows up BEFORE the health check succeeds,\n// which is what surfaces early crash/config-parse errors on all platforms.\nfunction spawnEngineBackground(\n bin: string,\n spawnArgs: string[],\n label: string,\n): ChildProcess {\n vlog(`spawn: ${bin} ${spawnArgs.join(\" \")}`);\n const child = spawn(bin, spawnArgs, {\n detached: true,\n stdio: [\"ignore\", \"ignore\", \"pipe\"],\n windowsHide: true,\n });\n const stderrChunks: Buffer[] = [];\n let stderrBytes = 0;\n const MAX_STDERR_CAPTURE = 16 * 1024;\n child.stderr?.on(\"data\", (chunk: Buffer) => {\n if (stderrBytes >= MAX_STDERR_CAPTURE) return;\n const slice = chunk.subarray(0, MAX_STDERR_CAPTURE - stderrBytes);\n stderrChunks.push(slice);\n stderrBytes += slice.length;\n });\n child.on(\"exit\", (code, signal) => {\n const abnormal =\n (code !== null && code !== 0) || (code === null && signal !== null);\n if (abnormal) {\n const stderr = Buffer.concat(stderrChunks).toString(\"utf-8\");\n startupFailure = {\n kind: label.includes(\"Docker\") ? \"docker-crashed\" : \"engine-crashed\",\n stderr:\n stderr.trim() ||\n (signal\n ? `process killed by signal ${signal}`\n : `process exited with code ${code}`),\n binary: bin,\n };\n vlog(`engine exited early: code=${code} signal=${signal}`);\n if (IS_VERBOSE && stderr.trim()) {\n p.log.error(`engine stderr:\\n${stderr}`);\n }\n }\n });\n child.unref();\n return child;\n}\n\nasync function startEngine(): Promise<boolean> {\n const configPath = findIiiConfig();\n let iiiBin = whichBinary(\"iii\");\n vlog(`iii binary: ${iiiBin ?? \"(not on PATH)\"}, config: ${configPath || \"(not found)\"}`);\n\n if (iiiBin && configPath) {\n const s = p.spinner();\n s.start(`Starting iii-engine: ${iiiBin}`);\n spawnEngineBackground(iiiBin, [\"--config\", configPath], \"iii-engine\");\n s.stop(\"iii-engine process started\");\n return true;\n }\n\n const dockerBin = whichBinary(\"docker\");\n vlog(`docker binary: ${dockerBin ?? \"(not on PATH)\"}`);\n const dockerComposeCandidates = [\n join(__dirname, \"..\", \"docker-compose.yml\"),\n join(__dirname, \"docker-compose.yml\"),\n join(process.cwd(), \"docker-compose.yml\"),\n ];\n const composeFile = dockerComposeCandidates.find((c) => existsSync(c));\n vlog(`docker-compose.yml: ${composeFile ?? \"(not found)\"}`);\n\n if (dockerBin && composeFile) {\n const s = p.spinner();\n s.start(\"Starting iii-engine via Docker...\");\n spawnEngineBackground(\n dockerBin,\n [\"compose\", \"-f\", composeFile, \"up\", \"-d\"],\n \"iii-engine via Docker\",\n );\n s.stop(\"Docker compose started\");\n return true;\n }\n\n for (const iiiPath of fallbackIiiPaths()) {\n if (existsSync(iiiPath)) {\n p.log.info(`Found iii at: ${iiiPath}`);\n process.env[\"PATH\"] = `${dirname(iiiPath)}${PATH_DELIMITER}${process.env[\"PATH\"] ?? \"\"}`;\n iiiBin = iiiPath;\n break;\n }\n }\n\n if (iiiBin && configPath) {\n const s = p.spinner();\n s.start(`Starting iii-engine: ${iiiBin}`);\n spawnEngineBackground(iiiBin, [\"--config\", configPath], \"iii-engine\");\n s.stop(\"iii-engine process started\");\n return true;\n }\n\n if (!iiiBin && (!dockerBin || !composeFile)) {\n startupFailure = { kind: \"no-engine\" };\n } else if (!composeFile && dockerBin) {\n startupFailure = { kind: \"no-docker-compose\" };\n }\n return false;\n}\n\nasync function waitForEngine(timeoutMs: number): Promise<boolean> {\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n if (await isEngineRunning()) return true;\n await new Promise((r) => setTimeout(r, 500));\n }\n return false;\n}\n\nfunction installInstructions(): string[] {\n if (IS_WINDOWS) {\n return [\n \"agentmemory requires the `iii-engine` runtime. Pick one:\",\n \"\",\n \" A) Download the prebuilt Windows binary:\",\n \" 1. Open https://github.com/iii-hq/iii/releases/latest\",\n \" 2. Download iii-x86_64-pc-windows-msvc.zip\",\n \" (or iii-aarch64-pc-windows-msvc.zip on ARM)\",\n \" 3. Extract iii.exe and either add its folder to PATH\",\n \" or move it to %USERPROFILE%\\\\.local\\\\bin\\\\iii.exe\",\n \" 4. Re-run: npx @agentmemory/agentmemory\",\n \"\",\n \" B) Docker Desktop:\",\n \" 1. Install Docker Desktop for Windows\",\n \" 2. Start Docker Desktop (engine must be running)\",\n \" 3. Re-run: npx @agentmemory/agentmemory\",\n \"\",\n \"Or skip the engine entirely for standalone MCP:\",\n \" npx @agentmemory/agentmemory mcp\",\n ];\n }\n return [\n \"agentmemory requires the `iii-engine` runtime. Pick one:\",\n \"\",\n \" A) curl -fsSL https://install.iii.dev/iii/main/install.sh | sh\",\n \" (installs the prebuilt iii binary into ~/.local/bin/iii)\",\n \"\",\n \" B) Docker: install Docker Desktop or docker-ce, then re-run\",\n \"\",\n \"Or skip the engine entirely for standalone MCP:\",\n \" npx @agentmemory/agentmemory mcp\",\n \"\",\n \"Docs: https://iii.dev/docs\",\n ];\n}\n\nfunction portInUseDiagnostic(port: number): string {\n return IS_WINDOWS\n ? ` netstat -ano | findstr :${port}`\n : ` lsof -i :${port} # or: ss -tlnp | grep :${port}`;\n}\n\nasync function main() {\n p.intro(\"agentmemory\");\n\n if (skipEngine) {\n p.log.info(\"Skipping engine check (--no-engine)\");\n await import(\"./index.js\");\n return;\n }\n\n if (await isEngineRunning()) {\n p.log.success(\"iii-engine is running\");\n await import(\"./index.js\");\n return;\n }\n\n const started = await startEngine();\n if (!started) {\n p.log.error(\"Could not start iii-engine.\");\n const lines = installInstructions();\n if (startupFailure?.kind === \"no-docker-compose\") {\n lines.unshift(\n \"Docker is installed but docker-compose.yml is missing from this\",\n \"install. Re-install with: npm install -g @agentmemory/agentmemory\",\n \"\",\n );\n }\n p.note(lines.join(\"\\n\"), \"Setup required\");\n process.exit(1);\n }\n\n const s = p.spinner();\n s.start(\"Waiting for iii-engine to be ready...\");\n\n const ready = await waitForEngine(15000);\n if (!ready) {\n const port = getRestPort();\n s.stop(\"iii-engine did not become ready within 15s\");\n\n if (startupFailure?.kind === \"engine-crashed\" || startupFailure?.kind === \"docker-crashed\") {\n p.log.error(\"The iii-engine process crashed on startup.\");\n if (startupFailure.binary) {\n p.log.info(`Binary: ${startupFailure.binary}`);\n }\n if (startupFailure.stderr) {\n p.note(startupFailure.stderr, \"engine stderr\");\n } else {\n p.log.info(\"No stderr was captured. Re-run with --verbose for more detail.\");\n }\n p.note(\n [\n \"Common causes:\",\n \" - iii-engine version mismatch — reinstall the latest binary\",\n \" (sh script on macOS/Linux, GitHub release zip on Windows)\",\n \" - Docker Desktop not running (if you're using the Docker path)\",\n \" - Port already in use (see below)\",\n \"\",\n \"See https://iii.dev/docs for current install instructions.\",\n ].join(\"\\n\"),\n \"Troubleshooting\",\n );\n } else {\n p.log.error(\"The engine process started but the REST API never responded.\");\n p.note(\n [\n `Check whether port ${port} is already bound by another process:`,\n portInUseDiagnostic(port),\n \"\",\n \"If it is, free the port or override: agentmemory --port <N>\",\n \"\",\n \"If it isn't, a firewall may be blocking 127.0.0.1:\" + port + \".\",\n \"Re-run with --verbose to see engine stderr.\",\n ].join(\"\\n\"),\n \"Troubleshooting\",\n );\n }\n process.exit(1);\n }\n\n s.stop(\"iii-engine is ready\");\n await import(\"./index.js\");\n}\n\nasync function apiFetch<T = unknown>(base: string, path: string, timeoutMs = 5000): Promise<T | null> {\n try {\n const res = await fetch(`${base}/agentmemory/${path}`, { signal: AbortSignal.timeout(timeoutMs) });\n return (await res.json()) as T;\n } catch {\n return null;\n }\n}\n\nasync function runStatus() {\n const port = getRestPort();\n const base = getBaseUrl();\n p.intro(\"agentmemory status\");\n\n const up = await isEngineRunning();\n if (!up) {\n p.log.error(`Not running — no response at ${base}`);\n p.log.info(\"Start with: npx @agentmemory/agentmemory\");\n process.exit(1);\n }\n\n try {\n const [healthRes, sessionsRes, graphRes, memoriesRes, flagsRes] = await Promise.all([\n apiFetch<any>(base, \"health\"),\n apiFetch<any>(base, \"sessions\"),\n apiFetch<any>(base, \"graph/stats\"),\n apiFetch<any>(base, \"export\"),\n apiFetch<any>(base, \"config/flags\"),\n ]);\n\n const h = healthRes?.health;\n const status = healthRes?.status || \"unknown\";\n const version = healthRes?.version || \"?\";\n const sessions = Array.isArray(sessionsRes?.sessions) ? sessionsRes.sessions.length : 0;\n const nodes = Number(graphRes?.totalNodes ?? graphRes?.nodes ?? graphRes?.nodeCount ?? 0);\n const edges = Number(graphRes?.totalEdges ?? graphRes?.edges ?? graphRes?.edgeCount ?? 0);\n const cb = healthRes?.circuitBreaker?.state || \"closed\";\n const heapMB = h?.memory ? Math.round(h.memory.heapUsed / 1048576) : 0;\n const uptime = h?.uptimeSeconds ? Math.round(h.uptimeSeconds) : 0;\n\n const obsCount = memoriesRes?.observations?.length || 0;\n const memCount = memoriesRes?.memories?.length || 0;\n const estFullTokens = obsCount * 80;\n const estInjectedTokens = Math.min(obsCount, 50) * 38;\n const tokensSaved = estFullTokens - estInjectedTokens;\n const pctSaved = estFullTokens > 0 ? Math.round((tokensSaved / estFullTokens) * 100) : 0;\n\n p.log.success(`Connected — v${version} at ${base}`);\n\n const lines = [\n `Health: ${status === \"healthy\" ? \"✓ healthy\" : status}`,\n `Sessions: ${sessions}`,\n `Observations: ${obsCount}`,\n `Memories: ${memCount}`,\n `Graph: ${nodes} nodes, ${edges} edges`,\n `Circuit: ${cb}`,\n `Heap: ${heapMB} MB`,\n `Uptime: ${uptime}s`,\n `Viewer: ${getViewerUrl()}`,\n ];\n\n if (obsCount > 0) {\n lines.push(\"\");\n lines.push(`Token savings: ~${tokensSaved.toLocaleString()} tokens saved (${pctSaved}% reduction)`);\n lines.push(` Full context: ~${estFullTokens.toLocaleString()} tokens`);\n lines.push(` Injected: ~${estInjectedTokens.toLocaleString()} tokens`);\n }\n\n if (flagsRes) {\n const provider = flagsRes.provider === \"llm\" ? \"✓ llm\" : \"✗ noop (no key)\";\n const embed = flagsRes.embeddingProvider === \"embeddings\" ? \"✓ embeddings\" : \"bm25-only\";\n const flagRows = (flagsRes.flags || []).map((f: { key: string; enabled: boolean; label: string }) =>\n ` ${f.enabled ? \"✓\" : \"✗\"} ${f.key.padEnd(32)} ${f.label}`\n );\n lines.push(\"\");\n lines.push(`Provider: ${provider}`);\n lines.push(`Embeddings: ${embed}`);\n lines.push(`Flags:`);\n flagRows.forEach((r: string) => lines.push(r));\n }\n\n p.note(lines.join(\"\\n\"), \"agentmemory\");\n } catch (err) {\n p.log.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n}\n\ntype DoctorCheck = { name: string; ok: boolean; hint?: string };\n\nfunction formatChecks(checks: DoctorCheck[]): string {\n return checks\n .map((c) => `${c.ok ? \"✓\" : \"✗\"} ${c.name}${c.hint ? `\\n ${c.hint}` : \"\"}`)\n .join(\"\\n\");\n}\n\ntype CCHooksCheck =\n | { state: \"loaded\"; manifestPath?: string }\n | { state: \"not-loaded\" }\n | { state: \"no-debug-log\" }\n | { state: \"no-cc-dir\" };\n\nfunction findLatestDebugLog(debugDir: string): string | undefined {\n const latestLink = join(debugDir, \"latest\");\n try {\n if (existsSync(latestLink)) {\n const target = readlinkSync(latestLink);\n const resolved = target.startsWith(\"/\") ? target : join(debugDir, target);\n if (existsSync(resolved)) return resolved;\n }\n } catch {}\n\n try {\n const newest = readdirSync(debugDir)\n .filter((f) => f.endsWith(\".txt\"))\n .map((f) => ({ f, m: statSync(join(debugDir, f)).mtimeMs }))\n .sort((a, b) => b.m - a.m)[0];\n if (newest) return join(debugDir, newest.f);\n } catch {}\n\n return undefined;\n}\n\nfunction checkClaudeCodeHooks(): CCHooksCheck {\n const debugDir = join(homedir(), \".claude\", \"debug\");\n if (!existsSync(debugDir)) return { state: \"no-cc-dir\" };\n\n const logPath = findLatestDebugLog(debugDir);\n if (!logPath) return { state: \"no-debug-log\" };\n\n let content: string;\n try {\n content = readFileSync(logPath, \"utf8\");\n } catch {\n return { state: \"no-debug-log\" };\n }\n\n const match = content.match(\n /Loaded hooks from standard location for plugin agentmemory:\\s*(\\S+)/\n );\n if (match) return { state: \"loaded\", manifestPath: match[1] };\n if (content.includes(\"Loading hooks from plugin: agentmemory\")) return { state: \"loaded\" };\n return { state: \"not-loaded\" };\n}\n\nasync function runDoctor() {\n p.intro(\"agentmemory doctor\");\n const base = getBaseUrl();\n const viewerUrl = getViewerUrl();\n const checks: DoctorCheck[] = [];\n\n const serverUp = await isEngineRunning();\n checks.push({\n name: \"Server reachable\",\n ok: serverUp,\n hint: serverUp ? undefined : `Start with: npx @agentmemory/agentmemory (tried ${base})`,\n });\n\n if (!serverUp) {\n p.note(formatChecks(checks), \"server unreachable\");\n process.exit(1);\n }\n\n const [health, flags, graph] = await Promise.all([\n apiFetch<any>(base, \"health\", 3000),\n apiFetch<any>(base, \"config/flags\", 3000),\n apiFetch<any>(base, \"graph/stats\", 3000),\n ]);\n\n const viewerUp = await fetch(viewerUrl, { signal: AbortSignal.timeout(2000) })\n .then((r) => r.ok)\n .catch(() => false);\n\n const hasLlm = flags?.provider === \"llm\";\n const hasEmbed = flags?.embeddingProvider === \"embeddings\";\n const graphNodeCount = Number(graph?.totalNodes ?? graph?.nodes ?? graph?.nodeCount ?? 0);\n const graphHas = graphNodeCount > 0;\n\n checks.push(\n {\n name: \"Health status\",\n ok: health?.status === \"healthy\",\n hint: health?.status === \"healthy\" ? undefined : `Status: ${health?.status || \"unknown\"}`,\n },\n {\n name: \"Viewer reachable\",\n ok: viewerUp,\n hint: viewerUp ? undefined : `${viewerUrl} not responding`,\n },\n {\n name: \"LLM provider\",\n ok: hasLlm,\n hint: hasLlm ? undefined : \"export ANTHROPIC_API_KEY=sk-ant-... (or GEMINI/OPENROUTER/MINIMAX) then restart\",\n },\n {\n name: \"Embedding provider\",\n ok: hasEmbed,\n hint: hasEmbed ? undefined : \"Running BM25-only. Add OPENAI_API_KEY / VOYAGE_API_KEY / COHERE_API_KEY / OLLAMA_HOST for semantic recall\",\n },\n );\n\n for (const f of (flags?.flags || []) as { label: string; enabled: boolean; enableHow: string }[]) {\n checks.push({ name: f.label, ok: f.enabled, hint: f.enabled ? undefined : f.enableHow });\n }\n\n const cc = checkClaudeCodeHooks();\n const ccCheck = (() => {\n switch (cc.state) {\n case \"loaded\":\n return {\n ok: true,\n hint: cc.manifestPath ? `manifest: ${cc.manifestPath}` : undefined,\n };\n case \"not-loaded\":\n return {\n ok: false,\n hint: \"Plugin enabled but hooks not loaded by Claude Code. Try: /plugin uninstall agentmemory@agentmemory && /plugin install agentmemory@agentmemory, then restart the session. CC must be >= 2.1.x for plugin-hook auto-load.\",\n };\n case \"no-debug-log\":\n return {\n ok: false,\n hint: \"Cannot verify — no Claude Code debug log found. Run once with `claude --debug -p \\\"x\\\"`, then re-run doctor.\",\n };\n case \"no-cc-dir\":\n return undefined;\n }\n })();\n if (ccCheck) checks.push({ name: \"Claude Code plugin hooks registered\", ...ccCheck });\n\n checks.push({\n name: \"Knowledge graph populated\",\n ok: graphHas,\n hint: graphHas ? undefined : \"Graph is empty. Run a session with GRAPH_EXTRACTION_ENABLED=true, or POST /agentmemory/graph/extract\",\n });\n\n const passed = checks.filter((c) => c.ok).length;\n const total = checks.length;\n p.note(formatChecks(checks), `${passed}/${total} checks passing`);\n\n if (passed === total) {\n p.outro(\"✓ All checks passed. agentmemory is healthy.\");\n } else {\n p.outro(`${total - passed} issue(s) — follow hints above to fix.`);\n process.exit(1);\n }\n}\n\ntype DemoObservation = {\n toolName: string;\n toolInput: Record<string, string>;\n toolOutput: string;\n};\n\ntype DemoSession = {\n id: string;\n title: string;\n observations: DemoObservation[];\n};\n\ntype SearchResult = { query: string; hits: number; topTitle: string };\n\nfunction buildDemoSessions(): DemoSession[] {\n return [\n {\n id: generateId(\"demo\"),\n title: \"Session 1: JWT auth setup\",\n observations: [\n {\n toolName: \"Write\",\n toolInput: { file_path: \"src/middleware/auth.ts\" },\n toolOutput:\n \"Created JWT middleware using jose library. Tokens expire after 30 days. Chose jose over jsonwebtoken for Edge compatibility.\",\n },\n {\n toolName: \"Write\",\n toolInput: { file_path: \"test/auth.test.ts\" },\n toolOutput:\n \"Added token validation tests covering expired, malformed, and valid cases.\",\n },\n {\n toolName: \"Bash\",\n toolInput: { command: \"npm test\" },\n toolOutput: \"All 12 auth tests passing.\",\n },\n ],\n },\n {\n id: generateId(\"demo\"),\n title: \"Session 2: Database migration debugging\",\n observations: [\n {\n toolName: \"Read\",\n toolInput: { file_path: \"prisma/schema.prisma\" },\n toolOutput:\n \"Found N+1 query issue in user relations. Need to add include on posts query.\",\n },\n {\n toolName: \"Edit\",\n toolInput: { file_path: \"src/api/users.ts\" },\n toolOutput:\n \"Fixed N+1 by adding Prisma include. Query time dropped from 450ms to 28ms.\",\n },\n ],\n },\n {\n id: generateId(\"demo\"),\n title: \"Session 3: Rate limiting\",\n observations: [\n {\n toolName: \"Write\",\n toolInput: { file_path: \"src/middleware/ratelimit.ts\" },\n toolOutput:\n \"Added rate limiting middleware with 100 req/min default. Uses in-memory store for dev, Redis for prod.\",\n },\n ],\n },\n ];\n}\n\nasync function postJson<T = unknown>(\n url: string,\n body: unknown,\n timeoutMs = 5000,\n): Promise<T | null> {\n try {\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(timeoutMs),\n });\n if (!res.ok) return null;\n return (await res.json().catch(() => null)) as T | null;\n } catch {\n return null;\n }\n}\n\nasync function postJsonStrict<T = unknown>(\n url: string,\n body: unknown,\n timeoutMs = 5000,\n): Promise<T | null> {\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(timeoutMs),\n });\n if (!res.ok) {\n const errBody = await res.text().catch(() => \"\");\n const suffix = errBody ? ` — ${errBody.slice(0, 200)}` : \"\";\n throw new Error(`POST ${url} failed: ${res.status} ${res.statusText}${suffix}`);\n }\n return (await res.json().catch(() => null)) as T | null;\n}\n\nasync function seedDemoSession(\n base: string,\n project: string,\n session: DemoSession,\n): Promise<number> {\n await postJsonStrict(`${base}/agentmemory/session/start`, {\n sessionId: session.id,\n project,\n cwd: project,\n });\n\n let stored = 0;\n for (const obs of session.observations) {\n const url = `${base}/agentmemory/observe`;\n const payload = {\n hookType: \"post_tool_use\",\n sessionId: session.id,\n timestamp: new Date().toISOString(),\n data: {\n tool_name: obs.toolName,\n tool_input: obs.toolInput,\n tool_output: obs.toolOutput,\n },\n };\n\n try {\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n signal: AbortSignal.timeout(5000),\n });\n if (res.ok) {\n stored++;\n } else {\n const body = await res.text().catch(() => \"\");\n p.log.warn(\n `observe failed for ${obs.toolName}: ${res.status} ${res.statusText}${body ? ` — ${body.slice(0, 160)}` : \"\"}`,\n );\n }\n } catch (err) {\n p.log.warn(\n `observe request failed for ${obs.toolName}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n await postJsonStrict(`${base}/agentmemory/session/end`, { sessionId: session.id });\n return stored;\n}\n\nasync function runDemoSearch(base: string, query: string): Promise<SearchResult> {\n const data = await postJson<{ results?: Array<{ title?: string }> }>(\n `${base}/agentmemory/smart-search`,\n { query, limit: 5 },\n 10000,\n );\n const items = data?.results ?? [];\n return {\n query,\n hits: items.length,\n topTitle: items[0]?.title ?? \"(no results)\",\n };\n}\n\nasync function runDemo() {\n const port = getRestPort();\n const base = `http://localhost:${port}`;\n p.intro(\"agentmemory demo\");\n\n if (!(await isAgentmemoryReady())) {\n p.log.error(\n `agentmemory worker not reachable on port ${port} (livez probe failed). Something may be on the port but it isn't serving /agentmemory/*.`,\n );\n p.log.info(\"Start it with: npx @agentmemory/agentmemory\");\n process.exit(1);\n }\n\n const demoProject = \"/tmp/agentmemory-demo\";\n const sessions = buildDemoSessions();\n\n const sSeed = p.spinner();\n sSeed.start(\"Seeding 3 demo sessions with realistic observations...\");\n\n let totalObs = 0;\n for (const session of sessions) {\n totalObs += await seedDemoSession(base, demoProject, session);\n }\n\n sSeed.stop(`Seeded ${totalObs} observations across ${sessions.length} sessions`);\n\n const queries = [\n \"jwt auth middleware\",\n \"database performance optimization\",\n \"rate limiting\",\n ];\n\n const sQuery = p.spinner();\n sQuery.start(`Running ${queries.length} smart-search queries...`);\n\n const results: SearchResult[] = [];\n for (const query of queries) {\n results.push(await runDemoSearch(base, query));\n }\n\n sQuery.stop(\"Search complete\");\n\n const lines = [\n `Project: ${demoProject}`,\n `Sessions: ${sessions.length} seeded (${totalObs} observations)`,\n \"\",\n \"Search results:\",\n ...results.flatMap((r) => [\n ` \"${r.query}\"`,\n ` → ${r.hits} hit(s), top: ${r.topTitle.slice(0, 60)}`,\n ]),\n \"\",\n `Notice: searching \"database performance optimization\"`,\n `found the N+1 query fix — keyword matching can't do that.`,\n \"\",\n `Viewer: ${getViewerUrl()}`,\n `Clean up with: curl -X DELETE \"${base}/agentmemory/sessions?project=${demoProject}\"`,\n ];\n\n p.note(lines.join(\"\\n\"), \"demo complete\");\n p.log.success(\"agentmemory is working. Point your agent at it and get back to coding.\");\n}\n\nfunction runCommand(\n command: string,\n commandArgs: string[],\n options: { cwd?: string; label: string; optional?: boolean } = { label: \"command\" },\n): boolean {\n const spinner = p.spinner();\n spinner.start(options.label);\n const result = spawnSync(command, commandArgs, {\n cwd: options.cwd || process.cwd(),\n stdio: \"pipe\",\n encoding: \"utf-8\",\n });\n\n if (result.status === 0) {\n spinner.stop(`${options.label} ✓`);\n return true;\n }\n\n const stderr = (result.stderr || \"\").toString().trim();\n const stdout = (result.stdout || \"\").toString().trim();\n const msg = stderr || stdout || \"unknown error\";\n\n if (options.optional) {\n spinner.stop(`${options.label} (skipped)`);\n p.log.warn(msg.slice(0, 300));\n return false;\n }\n\n spinner.stop(`${options.label} ✗`);\n p.log.error(msg.slice(0, 300));\n return false;\n}\n\nasync function runUpgrade() {\n p.intro(\"agentmemory upgrade\");\n\n const cwd = process.cwd();\n const hasPackageJson = existsSync(join(cwd, \"package.json\"));\n const hasPnpmLock = existsSync(join(cwd, \"pnpm-lock.yaml\"));\n\n const pnpmBin = whichBinary(\"pnpm\");\n const npmBin = whichBinary(\"npm\");\n const dockerBin = whichBinary(\"docker\");\n\n p.log.info(`Working directory: ${cwd}`);\n const requireSuccess = (ok: boolean, label: string): void => {\n if (!ok) {\n p.log.error(`Upgrade aborted: ${label} failed.`);\n process.exit(1);\n }\n };\n\n if (hasPackageJson) {\n const usePnpm = !!pnpmBin && hasPnpmLock;\n if (usePnpm && pnpmBin) {\n const installOk = runCommand(pnpmBin, [\"install\"], {\n label: \"Refreshing dependencies (pnpm install)\",\n });\n requireSuccess(installOk, \"pnpm install\");\n runCommand(pnpmBin, [\"up\", \"iii-sdk@latest\"], {\n label: \"Upgrading iii-sdk to latest\",\n optional: true,\n });\n } else if (npmBin) {\n const installOk = runCommand(npmBin, [\"install\"], {\n label: \"Refreshing dependencies (npm install)\",\n });\n requireSuccess(installOk, \"npm install\");\n runCommand(npmBin, [\"install\", \"iii-sdk@latest\"], {\n label: \"Upgrading iii-sdk to latest\",\n optional: true,\n });\n } else {\n p.log.warn(\"No package manager found (pnpm/npm). Skipping JS dependency upgrade.\");\n }\n } else {\n p.log.warn(\"No package.json in current directory. Skipping JS dependency upgrade.\");\n }\n\n const shBin = whichBinary(\"sh\");\n const curlBin = whichBinary(\"curl\");\n if (shBin && curlBin) {\n const upgradeEngine = await p.confirm({\n message: \"Re-run the iii-engine install script (curl | sh)?\",\n initialValue: true,\n });\n if (p.isCancel(upgradeEngine)) {\n p.cancel(\"Cancelled.\");\n return process.exit(0);\n }\n if (upgradeEngine === true) {\n const installerOk = runCommand(\n shBin,\n [\"-c\", \"curl -fsSL https://install.iii.dev/iii/main/install.sh | sh\"],\n { label: \"Upgrading iii-engine via installer\", optional: true },\n );\n if (!installerOk) {\n p.log.warn(\n \"iii-engine installer failed. Fallbacks: Docker (`docker pull iiidev/iii:latest`) or releases at https://github.com/iii-hq/iii/releases/latest.\",\n );\n }\n } else {\n p.log.info(\"Skipped iii-engine installer.\");\n }\n } else {\n p.log.warn(\"curl or sh not found. Skipping iii-engine installer.\");\n }\n\n if (dockerBin) {\n runCommand(dockerBin, [\"pull\", \"iiidev/iii:latest\"], {\n label: \"Pulling latest iii Docker image\",\n optional: true,\n });\n } else {\n p.log.info(\"Docker not found. Skipping Docker image refresh.\");\n }\n\n p.note(\n [\n \"Upgrade flow completed.\",\n \"\",\n \"Recommended next steps:\",\n \" 1) agentmemory status\",\n \" 2) npm/pnpm test\",\n \" 3) restart agentmemory process\",\n ].join(\"\\n\"),\n \"agentmemory upgrade\",\n );\n}\n\nasync function runMcp(): Promise<void> {\n await import(\"./mcp/standalone.js\");\n}\n\nasync function runImportJsonl(): Promise<void> {\n // Long-form flags that take a value. Their value tokens must be\n // consumed alongside the flag so they don't leak into positional\n // args (e.g. `--port 3112 import-jsonl` would otherwise turn\n // 3112 into pathArg).\n const VALUE_FLAGS = new Set([\"--port\", \"--tools\"]);\n let maxFiles: number | undefined;\n const tail = args.slice(1);\n const positional: string[] = [];\n for (let i = 0; i < tail.length; i++) {\n const a = tail[i]!;\n if (a === \"--max-files\") {\n const raw = tail[i + 1];\n const parsed = raw !== undefined ? parseInt(raw, 10) : NaN;\n if (Number.isInteger(parsed) && parsed > 0) {\n maxFiles = parsed;\n } else if (raw !== undefined) {\n p.log.warn(`Ignoring --max-files ${raw}: expected a positive integer.`);\n }\n i++;\n continue;\n }\n if (a.startsWith(\"--max-files=\")) {\n const raw = a.slice(\"--max-files=\".length);\n const parsed = parseInt(raw, 10);\n if (Number.isInteger(parsed) && parsed > 0) {\n maxFiles = parsed;\n } else {\n p.log.warn(`Ignoring --max-files=${raw}: expected a positive integer.`);\n }\n continue;\n }\n if (VALUE_FLAGS.has(a)) {\n i++;\n continue;\n }\n if (a.startsWith(\"-\")) continue;\n positional.push(a);\n }\n const pathArg = positional[0];\n\n const port = getRestPort();\n const base = `http://localhost:${port}`;\n\n let probeOk = false;\n let probeDetail = \"\";\n try {\n const probe = await fetch(`${base}/agentmemory/livez`, {\n signal: AbortSignal.timeout(2000),\n });\n probeOk = probe.ok;\n if (!probeOk) {\n const probeBody = await probe.text().catch(() => \"\");\n probeDetail = `reachable but unhealthy (HTTP ${probe.status}${probeBody ? `: ${probeBody.slice(0, 200)}` : \"\"})`;\n }\n } catch (err) {\n probeOk = false;\n const msg = err instanceof Error ? err.message : String(err);\n probeDetail = `unreachable (${msg})`;\n }\n if (!probeOk) {\n p.log.error(\n `agentmemory livez probe failed on port ${port}: ${probeDetail}. Start it with \\`npx @agentmemory/agentmemory\\` in another terminal, then re-run this command.`,\n );\n process.exit(1);\n }\n\n const body: Record<string, unknown> = {};\n if (pathArg) body[\"path\"] = pathArg;\n if (maxFiles !== undefined) body[\"maxFiles\"] = maxFiles;\n\n const headers: Record<string, string> = { \"content-type\": \"application/json\" };\n const secret = process.env[\"AGENTMEMORY_SECRET\"];\n if (secret) headers[\"authorization\"] = `Bearer ${secret}`;\n\n p.log.info(`Importing JSONL from ${pathArg || \"~/.claude/projects\"}…`);\n const spinner = p.spinner();\n spinner.start(\"scanning files\");\n\n try {\n const res = await fetch(`${base}/agentmemory/replay/import-jsonl`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(120_000),\n });\n const text = await res.text();\n let json: {\n success?: boolean;\n error?: string;\n imported?: number;\n sessionIds?: string[];\n observations?: number;\n discovered?: number;\n truncated?: boolean;\n traversalCapped?: boolean;\n maxFiles?: number;\n maxFilesUpperBound?: number;\n } = {};\n if (text.length > 0) {\n try {\n json = JSON.parse(text);\n } catch {\n spinner.stop(\"failed\");\n p.log.error(\n `server returned non-JSON response (HTTP ${res.status}): ${text.slice(0, 200)}`,\n );\n process.exit(1);\n }\n }\n if (!res.ok || json.success !== true) {\n spinner.stop(\"failed\");\n const detail =\n json.error ||\n (text.length === 0\n ? \"empty response body\"\n : json.success === undefined\n ? `HTTP ${res.status} (response missing success field)`\n : `HTTP ${res.status}`);\n if (res.status === 401) {\n p.log.error(\n `${detail}. Set AGENTMEMORY_SECRET to match the server's secret and re-run.`,\n );\n } else if (res.status === 404) {\n p.log.error(\n `${detail}. The running agentmemory server does not expose /agentmemory/replay/import-jsonl — upgrade to v0.8.13 or later.`,\n );\n } else {\n p.log.error(detail);\n }\n process.exit(1);\n }\n spinner.stop(\n `imported ${json.imported ?? 0} file(s), ${json.observations ?? 0} observation(s) across ${json.sessionIds?.length || 0} session(s)`,\n );\n if (json.truncated) {\n const cap = json.maxFiles ?? 200;\n const upper = json.maxFilesUpperBound ?? 1000;\n const discovered = json.discovered ?? 0;\n const skipped = discovered - (json.imported ?? 0);\n const discoveredLabel = json.traversalCapped\n ? `${discovered}+ (traversal halted at safety cap)`\n : String(discovered);\n const baseMsg = `Hit the ${cap}-file scan cap; ${skipped} of ${discoveredLabel} discovered file(s) were skipped.`;\n // If we already saw more than the server's hard cap (or the\n // walker stopped early), bumping --max-files won't help on its\n // own — recommend batching by subdirectory.\n if (discovered > upper || json.traversalCapped) {\n p.log.warn(\n `${baseMsg} Tree exceeds the server's --max-files limit of ${upper}; ` +\n `batch by subdirectory (run import-jsonl once per project under ~/.claude/projects).`,\n );\n } else {\n const suggested = Math.min(\n Math.max((discovered || cap) + 100, cap * 2),\n upper,\n );\n p.log.warn(\n `${baseMsg} Re-run with --max-files=${suggested} (max ${upper}) or batch by subdirectory.`,\n );\n }\n }\n if (json.sessionIds && json.sessionIds.length > 0) {\n p.log.info(`View at ${getViewerUrl()} → Replay tab`);\n }\n } catch (err) {\n spinner.stop(\"failed\");\n if (err instanceof Error && err.name === \"TimeoutError\") {\n p.log.error(\"import timed out after 2 minutes\");\n } else {\n p.log.error(err instanceof Error ? err.message : String(err));\n }\n process.exit(1);\n }\n}\n\nconst commands: Record<string, () => Promise<void>> = {\n status: runStatus,\n doctor: runDoctor,\n demo: runDemo,\n upgrade: runUpgrade,\n mcp: runMcp,\n \"import-jsonl\": runImportJsonl,\n};\n\nconst handler = commands[args[0] ?? \"\"] ?? main;\nhandler().catch((err) => {\n p.log.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.mjs","names":["PATH_DELIMITER"],"sources":["../src/state/schema.ts","../src/cli.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\n\nexport const KV = {\n sessions: \"mem:sessions\",\n observations: (sessionId: string) => `mem:obs:${sessionId}`,\n memories: \"mem:memories\",\n summaries: \"mem:summaries\",\n config: \"mem:config\",\n metrics: \"mem:metrics\",\n health: \"mem:health\",\n embeddings: (obsId: string) => `mem:emb:${obsId}`,\n bm25Index: \"mem:index:bm25\",\n relations: \"mem:relations\",\n profiles: \"mem:profiles\",\n claudeBridge: \"mem:claude-bridge\",\n graphNodes: \"mem:graph:nodes\",\n graphEdges: \"mem:graph:edges\",\n semantic: \"mem:semantic\",\n procedural: \"mem:procedural\",\n teamShared: (teamId: string) => `mem:team:${teamId}:shared`,\n teamUsers: (teamId: string, userId: string) =>\n `mem:team:${teamId}:users:${userId}`,\n teamProfile: (teamId: string) => `mem:team:${teamId}:profile`,\n audit: \"mem:audit\",\n actions: \"mem:actions\",\n actionEdges: \"mem:action-edges\",\n leases: \"mem:leases\",\n routines: \"mem:routines\",\n routineRuns: \"mem:routine-runs\",\n signals: \"mem:signals\",\n checkpoints: \"mem:checkpoints\",\n mesh: \"mem:mesh\",\n sketches: \"mem:sketches\",\n facets: \"mem:facets\",\n sentinels: \"mem:sentinels\",\n crystals: \"mem:crystals\",\n lessons: \"mem:lessons\",\n insights: \"mem:insights\",\n graphEdgeHistory: \"mem:graph:edge-history\",\n enrichedChunks: (sessionId: string) => `mem:enriched:${sessionId}`,\n latentEmbeddings: (obsId: string) => `mem:latent:${obsId}`,\n retentionScores: \"mem:retention\",\n accessLog: \"mem:access\",\n imageRefs: \"mem:image-refs\",\n imageEmbeddings: \"mem:image-embeddings\",\n slots: \"mem:slots\",\n globalSlots: \"mem:slots:global\",\n state: \"mem:state\",\n} as const;\n\nexport const STREAM = {\n name: \"mem-live\",\n group: (sessionId: string) => sessionId,\n viewerGroup: \"viewer\",\n} as const;\n\nexport function generateId(prefix: string): string {\n const ts = Date.now().toString(36);\n const rand = crypto.randomUUID().replace(/-/g, \"\").slice(0, 12);\n return `${prefix}_${ts}_${rand}`;\n}\n\nexport function fingerprintId(prefix: string, content: string): string {\n const hash = createHash(\"sha256\").update(content).digest(\"hex\");\n return `${prefix}_${hash.slice(0, 16)}`;\n}\n\nexport function jaccardSimilarity(a: string, b: string): number {\n const setA = new Set(a.split(/\\s+/).filter((t) => t.length > 2));\n const setB = new Set(b.split(/\\s+/).filter((t) => t.length > 2));\n if (setA.size === 0 && setB.size === 0) return 1;\n if (setA.size === 0 || setB.size === 0) return 0;\n let intersection = 0;\n for (const word of setA) {\n if (setB.has(word)) intersection++;\n }\n return intersection / (setA.size + setB.size - intersection);\n}\n","#!/usr/bin/env node\n\nimport {\n spawn,\n execFileSync,\n spawnSync,\n type ChildProcess,\n} from \"node:child_process\";\nimport { existsSync, readdirSync, readFileSync, readlinkSync, statSync } from \"node:fs\";\nimport { join, dirname, delimiter as PATH_DELIMITER } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { homedir, platform } from \"node:os\";\nimport * as p from \"@clack/prompts\";\nimport { generateId } from \"./state/schema.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst args = process.argv.slice(2);\nconst IS_WINDOWS = platform() === \"win32\";\nconst IS_VERBOSE = args.includes(\"--verbose\") || args.includes(\"-v\");\n\n// Pinned iii-engine version. The unpinned `install.iii.dev/iii/main/install.sh`\n// script tracks `latest`, which made every fresh agentmemory install pull\n// engine 0.11.6 — and 0.11.6 introduces a new sandbox-everything-via-\n// `iii worker add` worker model that agentmemory hasn't been refactored\n// for yet (we still use the old `iii-exec watch` config-file model). The\n// architectural mismatch surfaces as EPIPE reconnect loops and empty\n// search results after save. Pin to v0.11.2 — the last engine that runs\n// agentmemory's current worker model cleanly — until the refactor lands.\n// Override env var AGENTMEMORY_III_VERSION lets users on the sandbox\n// model already point at a newer engine without us cutting a release.\nconst IIPINNED_VERSION =\n process.env[\"AGENTMEMORY_III_VERSION\"] || \"0.11.2\";\n\n// Map Node platform/arch → the asset name iii-hq/iii ships under\n// https://github.com/iii-hq/iii/releases/download/iii/v<version>/<asset>\nfunction iiiReleaseAsset(): string | null {\n const p = platform();\n const a = process.arch;\n if (p === \"darwin\" && a === \"arm64\")\n return \"iii-aarch64-apple-darwin.tar.gz\";\n if (p === \"darwin\" && a === \"x64\")\n return \"iii-x86_64-apple-darwin.tar.gz\";\n if (p === \"linux\" && a === \"x64\")\n return \"iii-x86_64-unknown-linux-gnu.tar.gz\";\n if (p === \"linux\" && a === \"arm64\")\n return \"iii-aarch64-unknown-linux-gnu.tar.gz\";\n if (p === \"linux\" && a === \"arm\")\n return \"iii-armv7-unknown-linux-gnueabihf.tar.gz\";\n if (p === \"win32\" && a === \"x64\")\n return \"iii-x86_64-pc-windows-msvc.zip\";\n if (p === \"win32\" && a === \"arm64\")\n return \"iii-aarch64-pc-windows-msvc.zip\";\n return null;\n}\n\nfunction iiiReleaseUrl(): string | null {\n const asset = iiiReleaseAsset();\n if (!asset) return null;\n // Tag name is monorepo-prefixed: `iii/v0.11.2`. Slash is URL-encoded\n // by GitHub when serving the download path, hence `iii/v...` not `iii%2Fv...`.\n return `https://github.com/iii-hq/iii/releases/download/iii/v${IIPINNED_VERSION}/${asset}`;\n}\n\nfunction vlog(msg: string): void {\n if (IS_VERBOSE) p.log.info(`[verbose] ${msg}`);\n}\n\nif (args.includes(\"--help\") || args.includes(\"-h\")) {\n console.log(`\nagentmemory — persistent memory for AI coding agents\n\nUsage: agentmemory [command] [options]\n\nCommands:\n (default) Start agentmemory worker\n status Show connection status, memory count, flags, and health\n doctor Run diagnostic checks (server, flags, graph, providers)\n demo Seed sample sessions and show recall in action\n upgrade Upgrade local deps + iii runtime (best effort)\n mcp Start standalone MCP server (no engine required)\n import-jsonl [p] Import Claude Code JSONL transcripts (default: ~/.claude/projects)\n --max-files <N> | --max-files=<N>: override scan cap (default 200, max 1000;\n out-of-range is rejected; for trees >1000 files, batch by subdirectory)\n\nOptions:\n --help, -h Show this help\n --verbose, -v Show engine stderr and diagnostic info on startup\n --tools all|core Tool visibility (default: core = 7 tools)\n --no-engine Skip auto-starting iii-engine\n --port <N> Override REST port (default: 3111)\n\nEnvironment:\n AGENTMEMORY_URL Full REST base URL (e.g. http://localhost:3111).\n Honored by status, doctor, and MCP shim commands.\n\nQuick start:\n npx @agentmemory/agentmemory # start with local iii-engine or Docker\n npx @agentmemory/agentmemory demo # see semantic recall in 30 seconds\n npx @agentmemory/agentmemory doctor # diagnose config + feature flags\n npx @agentmemory/agentmemory status # health + memory count + flags\n npx @agentmemory/agentmemory upgrade # upgrade agentmemory + iii runtime\n npx @agentmemory/agentmemory mcp # standalone MCP server (no engine)\n npx @agentmemory/mcp # same as above (shim package)\n`);\n process.exit(0);\n}\n\nconst toolsIdx = args.indexOf(\"--tools\");\nif (toolsIdx !== -1 && args[toolsIdx + 1]) {\n process.env[\"AGENTMEMORY_TOOLS\"] = args[toolsIdx + 1];\n}\n\nconst portIdx = args.indexOf(\"--port\");\nif (portIdx !== -1 && args[portIdx + 1]) {\n process.env[\"III_REST_PORT\"] = args[portIdx + 1];\n}\n\nconst skipEngine = args.includes(\"--no-engine\");\n\nfunction getRestPort(): number {\n const url = process.env[\"AGENTMEMORY_URL\"];\n if (url) {\n try {\n const parsed = new URL(url).port;\n if (parsed) return parseInt(parsed, 10);\n } catch {}\n }\n return parseInt(process.env[\"III_REST_PORT\"] || \"3111\", 10) || 3111;\n}\n\nfunction getBaseUrl(): string {\n const url = process.env[\"AGENTMEMORY_URL\"];\n if (url) return url.replace(/\\/+$/, \"\");\n return `http://localhost:${getRestPort()}`;\n}\n\nfunction getViewerUrl(): string {\n const envUrl = process.env[\"AGENTMEMORY_VIEWER_URL\"];\n if (envUrl) return envUrl.replace(/\\/+$/, \"\");\n try {\n const u = new URL(getBaseUrl());\n const vPort = (parseInt(u.port || \"3111\", 10) || 3111) + 2;\n return `${u.protocol}//${u.hostname}:${vPort}`;\n } catch {\n return `http://localhost:${getRestPort() + 2}`;\n }\n}\n\nasync function isEngineRunning(): Promise<boolean> {\n try {\n await fetch(`${getBaseUrl()}/`, {\n signal: AbortSignal.timeout(2000),\n });\n return true;\n } catch {\n return false;\n }\n}\n\nasync function isAgentmemoryReady(): Promise<boolean> {\n try {\n const res = await fetch(`${getBaseUrl()}/agentmemory/livez`, {\n signal: AbortSignal.timeout(2000),\n });\n return res.ok;\n } catch {\n return false;\n }\n}\n\nfunction findIiiConfig(): string {\n const candidates = [\n join(__dirname, \"iii-config.yaml\"),\n join(__dirname, \"..\", \"iii-config.yaml\"),\n join(process.cwd(), \"iii-config.yaml\"),\n ];\n for (const c of candidates) {\n if (existsSync(c)) return c;\n }\n return \"\";\n}\n\nfunction whichBinary(name: string): string | null {\n const cmd = IS_WINDOWS ? \"where\" : \"which\";\n try {\n const out = execFileSync(cmd, [name], { encoding: \"utf-8\" });\n const first = out\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .find((line) => line.length > 0);\n return first ?? null;\n } catch {\n return null;\n }\n}\n\nfunction fallbackIiiPaths(): string[] {\n if (IS_WINDOWS) {\n const userProfile = process.env[\"USERPROFILE\"];\n if (!userProfile) return [];\n return [\n join(userProfile, \".local\", \"bin\", \"iii.exe\"),\n join(userProfile, \"bin\", \"iii.exe\"),\n ];\n }\n const home = process.env[\"HOME\"];\n if (!home) return [\"/usr/local/bin/iii\"];\n return [join(home, \".local\", \"bin\", \"iii\"), \"/usr/local/bin/iii\"];\n}\n\ntype StartupFailure = {\n kind: \"no-engine\" | \"no-docker-compose\" | \"engine-crashed\" | \"docker-crashed\";\n stderr?: string;\n binary?: string;\n};\n\nlet startupFailure: StartupFailure | null = null;\n\n// Spawn a background engine and collect any startup stderr for a short\n// window. The process is unref'd so the CLI parent can exit cleanly; we\n// only care about stderr that shows up BEFORE the health check succeeds,\n// which is what surfaces early crash/config-parse errors on all platforms.\nfunction spawnEngineBackground(\n bin: string,\n spawnArgs: string[],\n label: string,\n): ChildProcess {\n vlog(`spawn: ${bin} ${spawnArgs.join(\" \")}`);\n const child = spawn(bin, spawnArgs, {\n detached: true,\n stdio: [\"ignore\", \"ignore\", \"pipe\"],\n windowsHide: true,\n });\n const stderrChunks: Buffer[] = [];\n let stderrBytes = 0;\n const MAX_STDERR_CAPTURE = 16 * 1024;\n child.stderr?.on(\"data\", (chunk: Buffer) => {\n if (stderrBytes >= MAX_STDERR_CAPTURE) return;\n const slice = chunk.subarray(0, MAX_STDERR_CAPTURE - stderrBytes);\n stderrChunks.push(slice);\n stderrBytes += slice.length;\n });\n child.on(\"exit\", (code, signal) => {\n const abnormal =\n (code !== null && code !== 0) || (code === null && signal !== null);\n if (abnormal) {\n const stderr = Buffer.concat(stderrChunks).toString(\"utf-8\");\n startupFailure = {\n kind: label.includes(\"Docker\") ? \"docker-crashed\" : \"engine-crashed\",\n stderr:\n stderr.trim() ||\n (signal\n ? `process killed by signal ${signal}`\n : `process exited with code ${code}`),\n binary: bin,\n };\n vlog(`engine exited early: code=${code} signal=${signal}`);\n if (IS_VERBOSE && stderr.trim()) {\n p.log.error(`engine stderr:\\n${stderr}`);\n }\n }\n });\n child.unref();\n return child;\n}\n\nasync function startEngine(): Promise<boolean> {\n const configPath = findIiiConfig();\n let iiiBin = whichBinary(\"iii\");\n vlog(`iii binary: ${iiiBin ?? \"(not on PATH)\"}, config: ${configPath || \"(not found)\"}`);\n\n if (iiiBin && configPath) {\n const s = p.spinner();\n s.start(`Starting iii-engine: ${iiiBin}`);\n spawnEngineBackground(iiiBin, [\"--config\", configPath], \"iii-engine\");\n s.stop(\"iii-engine process started\");\n return true;\n }\n\n const dockerBin = whichBinary(\"docker\");\n vlog(`docker binary: ${dockerBin ?? \"(not on PATH)\"}`);\n const dockerComposeCandidates = [\n join(__dirname, \"..\", \"docker-compose.yml\"),\n join(__dirname, \"docker-compose.yml\"),\n join(process.cwd(), \"docker-compose.yml\"),\n ];\n const composeFile = dockerComposeCandidates.find((c) => existsSync(c));\n vlog(`docker-compose.yml: ${composeFile ?? \"(not found)\"}`);\n\n if (dockerBin && composeFile) {\n const s = p.spinner();\n s.start(\"Starting iii-engine via Docker...\");\n spawnEngineBackground(\n dockerBin,\n [\"compose\", \"-f\", composeFile, \"up\", \"-d\"],\n \"iii-engine via Docker\",\n );\n s.stop(\"Docker compose started\");\n return true;\n }\n\n for (const iiiPath of fallbackIiiPaths()) {\n if (existsSync(iiiPath)) {\n p.log.info(`Found iii at: ${iiiPath}`);\n process.env[\"PATH\"] = `${dirname(iiiPath)}${PATH_DELIMITER}${process.env[\"PATH\"] ?? \"\"}`;\n iiiBin = iiiPath;\n break;\n }\n }\n\n if (iiiBin && configPath) {\n const s = p.spinner();\n s.start(`Starting iii-engine: ${iiiBin}`);\n spawnEngineBackground(iiiBin, [\"--config\", configPath], \"iii-engine\");\n s.stop(\"iii-engine process started\");\n return true;\n }\n\n if (!iiiBin && (!dockerBin || !composeFile)) {\n startupFailure = { kind: \"no-engine\" };\n } else if (!composeFile && dockerBin) {\n startupFailure = { kind: \"no-docker-compose\" };\n }\n return false;\n}\n\nasync function waitForEngine(timeoutMs: number): Promise<boolean> {\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n if (await isEngineRunning()) return true;\n await new Promise((r) => setTimeout(r, 500));\n }\n return false;\n}\n\nfunction installInstructions(): string[] {\n const releaseUrl = iiiReleaseUrl();\n if (IS_WINDOWS) {\n return [\n `agentmemory requires the \\`iii-engine\\` runtime, pinned to v${IIPINNED_VERSION}. Pick one:`,\n \"\",\n \" A) Download the prebuilt Windows binary:\",\n ` 1. Open https://github.com/iii-hq/iii/releases/tag/iii%2Fv${IIPINNED_VERSION}`,\n ` 2. Download iii-x86_64-pc-windows-msvc.zip`,\n \" (or iii-aarch64-pc-windows-msvc.zip on ARM)\",\n \" 3. Extract iii.exe and either add its folder to PATH\",\n \" or move it to %USERPROFILE%\\\\.local\\\\bin\\\\iii.exe\",\n \" 4. Re-run: npx @agentmemory/agentmemory\",\n \"\",\n \" B) Docker Desktop:\",\n \" 1. Install Docker Desktop for Windows\",\n ` 2. docker pull iiidev/iii:${IIPINNED_VERSION}`,\n \" 3. Start Docker Desktop (engine must be running)\",\n \" 4. Re-run: npx @agentmemory/agentmemory\",\n \"\",\n \"Or skip the engine entirely for standalone MCP:\",\n \" npx @agentmemory/agentmemory mcp\",\n ];\n }\n const linuxInstall = releaseUrl\n ? ` A) mkdir -p ~/.local/bin && curl -fsSL \"${releaseUrl}\" | tar -xz -C ~/.local/bin && chmod +x ~/.local/bin/iii`\n : ` A) Manual download from https://github.com/iii-hq/iii/releases/tag/iii%2Fv${IIPINNED_VERSION}`;\n return [\n `agentmemory requires the \\`iii-engine\\` runtime, pinned to v${IIPINNED_VERSION}. Pick one:`,\n \"\",\n linuxInstall,\n ` (installs iii v${IIPINNED_VERSION} into ~/.local/bin/iii)`,\n \"\",\n ` B) Docker: \\`docker pull iiidev/iii:${IIPINNED_VERSION}\\``,\n \"\",\n \"Or skip the engine entirely for standalone MCP:\",\n \" npx @agentmemory/agentmemory mcp\",\n \"\",\n \"Docs: https://iii.dev/docs\",\n `Why pinned: iii v0.11.6 introduces the new sandbox-everything model`,\n `(\\`iii worker add\\` registration). agentmemory still uses the older`,\n `iii-exec config-file worker model and needs a refactor before it`,\n `runs cleanly under the new engine. Override with`,\n `AGENTMEMORY_III_VERSION=<version> when you've migrated manually.`,\n ];\n}\n\nfunction portInUseDiagnostic(port: number): string {\n return IS_WINDOWS\n ? ` netstat -ano | findstr :${port}`\n : ` lsof -i :${port} # or: ss -tlnp | grep :${port}`;\n}\n\nasync function main() {\n p.intro(\"agentmemory\");\n\n if (skipEngine) {\n p.log.info(\"Skipping engine check (--no-engine)\");\n await import(\"./index.js\");\n return;\n }\n\n if (await isEngineRunning()) {\n p.log.success(\"iii-engine is running\");\n await import(\"./index.js\");\n return;\n }\n\n const started = await startEngine();\n if (!started) {\n p.log.error(\"Could not start iii-engine.\");\n const lines = installInstructions();\n if (startupFailure?.kind === \"no-docker-compose\") {\n lines.unshift(\n \"Docker is installed but docker-compose.yml is missing from this\",\n \"install. Re-install with: npm install -g @agentmemory/agentmemory\",\n \"\",\n );\n }\n p.note(lines.join(\"\\n\"), \"Setup required\");\n process.exit(1);\n }\n\n const s = p.spinner();\n s.start(\"Waiting for iii-engine to be ready...\");\n\n const ready = await waitForEngine(15000);\n if (!ready) {\n const port = getRestPort();\n s.stop(\"iii-engine did not become ready within 15s\");\n\n if (startupFailure?.kind === \"engine-crashed\" || startupFailure?.kind === \"docker-crashed\") {\n p.log.error(\"The iii-engine process crashed on startup.\");\n if (startupFailure.binary) {\n p.log.info(`Binary: ${startupFailure.binary}`);\n }\n if (startupFailure.stderr) {\n p.note(startupFailure.stderr, \"engine stderr\");\n } else {\n p.log.info(\"No stderr was captured. Re-run with --verbose for more detail.\");\n }\n p.note(\n [\n \"Common causes:\",\n \" - iii-engine version mismatch — reinstall the latest binary\",\n \" (sh script on macOS/Linux, GitHub release zip on Windows)\",\n \" - Docker Desktop not running (if you're using the Docker path)\",\n \" - Port already in use (see below)\",\n \"\",\n \"See https://iii.dev/docs for current install instructions.\",\n ].join(\"\\n\"),\n \"Troubleshooting\",\n );\n } else {\n p.log.error(\"The engine process started but the REST API never responded.\");\n p.note(\n [\n `Check whether port ${port} is already bound by another process:`,\n portInUseDiagnostic(port),\n \"\",\n \"If it is, free the port or override: agentmemory --port <N>\",\n \"\",\n \"If it isn't, a firewall may be blocking 127.0.0.1:\" + port + \".\",\n \"Re-run with --verbose to see engine stderr.\",\n ].join(\"\\n\"),\n \"Troubleshooting\",\n );\n }\n process.exit(1);\n }\n\n s.stop(\"iii-engine is ready\");\n await import(\"./index.js\");\n}\n\nasync function apiFetch<T = unknown>(base: string, path: string, timeoutMs = 5000): Promise<T | null> {\n try {\n const res = await fetch(`${base}/agentmemory/${path}`, { signal: AbortSignal.timeout(timeoutMs) });\n return (await res.json()) as T;\n } catch {\n return null;\n }\n}\n\nasync function runStatus() {\n const port = getRestPort();\n const base = getBaseUrl();\n p.intro(\"agentmemory status\");\n\n const up = await isEngineRunning();\n if (!up) {\n p.log.error(`Not running — no response at ${base}`);\n p.log.info(\"Start with: npx @agentmemory/agentmemory\");\n process.exit(1);\n }\n\n try {\n const [healthRes, sessionsRes, graphRes, memoriesRes, flagsRes] = await Promise.all([\n apiFetch<any>(base, \"health\"),\n apiFetch<any>(base, \"sessions\"),\n apiFetch<any>(base, \"graph/stats\"),\n apiFetch<any>(base, \"export\"),\n apiFetch<any>(base, \"config/flags\"),\n ]);\n\n const h = healthRes?.health;\n const status = healthRes?.status || \"unknown\";\n const version = healthRes?.version || \"?\";\n const sessions = Array.isArray(sessionsRes?.sessions) ? sessionsRes.sessions.length : 0;\n const nodes = Number(graphRes?.totalNodes ?? graphRes?.nodes ?? graphRes?.nodeCount ?? 0);\n const edges = Number(graphRes?.totalEdges ?? graphRes?.edges ?? graphRes?.edgeCount ?? 0);\n const cb = healthRes?.circuitBreaker?.state || \"closed\";\n const heapMB = h?.memory ? Math.round(h.memory.heapUsed / 1048576) : 0;\n const uptime = h?.uptimeSeconds ? Math.round(h.uptimeSeconds) : 0;\n\n const obsCount = memoriesRes?.observations?.length || 0;\n const memCount = memoriesRes?.memories?.length || 0;\n const estFullTokens = obsCount * 80;\n const estInjectedTokens = Math.min(obsCount, 50) * 38;\n const tokensSaved = estFullTokens - estInjectedTokens;\n const pctSaved = estFullTokens > 0 ? Math.round((tokensSaved / estFullTokens) * 100) : 0;\n\n p.log.success(`Connected — v${version} at ${base}`);\n\n const lines = [\n `Health: ${status === \"healthy\" ? \"✓ healthy\" : status}`,\n `Sessions: ${sessions}`,\n `Observations: ${obsCount}`,\n `Memories: ${memCount}`,\n `Graph: ${nodes} nodes, ${edges} edges`,\n `Circuit: ${cb}`,\n `Heap: ${heapMB} MB`,\n `Uptime: ${uptime}s`,\n `Viewer: ${getViewerUrl()}`,\n ];\n\n if (obsCount > 0) {\n lines.push(\"\");\n lines.push(`Token savings: ~${tokensSaved.toLocaleString()} tokens saved (${pctSaved}% reduction)`);\n lines.push(` Full context: ~${estFullTokens.toLocaleString()} tokens`);\n lines.push(` Injected: ~${estInjectedTokens.toLocaleString()} tokens`);\n }\n\n if (flagsRes) {\n const provider = flagsRes.provider === \"llm\" ? \"✓ llm\" : \"✗ noop (no key)\";\n const embed = flagsRes.embeddingProvider === \"embeddings\" ? \"✓ embeddings\" : \"bm25-only\";\n const flagRows = (flagsRes.flags || []).map((f: { key: string; enabled: boolean; label: string }) =>\n ` ${f.enabled ? \"✓\" : \"✗\"} ${f.key.padEnd(32)} ${f.label}`\n );\n lines.push(\"\");\n lines.push(`Provider: ${provider}`);\n lines.push(`Embeddings: ${embed}`);\n lines.push(`Flags:`);\n flagRows.forEach((r: string) => lines.push(r));\n }\n\n p.note(lines.join(\"\\n\"), \"agentmemory\");\n } catch (err) {\n p.log.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n}\n\ntype DoctorCheck = { name: string; ok: boolean; hint?: string };\n\nfunction formatChecks(checks: DoctorCheck[]): string {\n return checks\n .map((c) => `${c.ok ? \"✓\" : \"✗\"} ${c.name}${c.hint ? `\\n ${c.hint}` : \"\"}`)\n .join(\"\\n\");\n}\n\ntype CCHooksCheck =\n | { state: \"loaded\"; manifestPath?: string }\n | { state: \"not-loaded\" }\n | { state: \"no-debug-log\" }\n | { state: \"no-cc-dir\" };\n\nfunction findLatestDebugLog(debugDir: string): string | undefined {\n const latestLink = join(debugDir, \"latest\");\n try {\n if (existsSync(latestLink)) {\n const target = readlinkSync(latestLink);\n const resolved = target.startsWith(\"/\") ? target : join(debugDir, target);\n if (existsSync(resolved)) return resolved;\n }\n } catch {}\n\n try {\n const newest = readdirSync(debugDir)\n .filter((f) => f.endsWith(\".txt\"))\n .map((f) => ({ f, m: statSync(join(debugDir, f)).mtimeMs }))\n .sort((a, b) => b.m - a.m)[0];\n if (newest) return join(debugDir, newest.f);\n } catch {}\n\n return undefined;\n}\n\nfunction checkClaudeCodeHooks(): CCHooksCheck {\n const debugDir = join(homedir(), \".claude\", \"debug\");\n if (!existsSync(debugDir)) return { state: \"no-cc-dir\" };\n\n const logPath = findLatestDebugLog(debugDir);\n if (!logPath) return { state: \"no-debug-log\" };\n\n let content: string;\n try {\n content = readFileSync(logPath, \"utf8\");\n } catch {\n return { state: \"no-debug-log\" };\n }\n\n const match = content.match(\n /Loaded hooks from standard location for plugin agentmemory:\\s*(\\S+)/\n );\n if (match) return { state: \"loaded\", manifestPath: match[1] };\n if (content.includes(\"Loading hooks from plugin: agentmemory\")) return { state: \"loaded\" };\n return { state: \"not-loaded\" };\n}\n\nasync function runDoctor() {\n p.intro(\"agentmemory doctor\");\n const base = getBaseUrl();\n const viewerUrl = getViewerUrl();\n const checks: DoctorCheck[] = [];\n\n const serverUp = await isEngineRunning();\n checks.push({\n name: \"Server reachable\",\n ok: serverUp,\n hint: serverUp ? undefined : `Start with: npx @agentmemory/agentmemory (tried ${base})`,\n });\n\n if (!serverUp) {\n p.note(formatChecks(checks), \"server unreachable\");\n process.exit(1);\n }\n\n const [health, flags, graph] = await Promise.all([\n apiFetch<any>(base, \"health\", 3000),\n apiFetch<any>(base, \"config/flags\", 3000),\n apiFetch<any>(base, \"graph/stats\", 3000),\n ]);\n\n const viewerUp = await fetch(viewerUrl, { signal: AbortSignal.timeout(2000) })\n .then((r) => r.ok)\n .catch(() => false);\n\n const hasLlm = flags?.provider === \"llm\";\n const hasEmbed = flags?.embeddingProvider === \"embeddings\";\n const graphNodeCount = Number(graph?.totalNodes ?? graph?.nodes ?? graph?.nodeCount ?? 0);\n const graphHas = graphNodeCount > 0;\n\n checks.push(\n {\n name: \"Health status\",\n ok: health?.status === \"healthy\",\n hint: health?.status === \"healthy\" ? undefined : `Status: ${health?.status || \"unknown\"}`,\n },\n {\n name: \"Viewer reachable\",\n ok: viewerUp,\n hint: viewerUp ? undefined : `${viewerUrl} not responding`,\n },\n {\n name: \"LLM provider\",\n ok: hasLlm,\n hint: hasLlm ? undefined : \"export ANTHROPIC_API_KEY=sk-ant-... (or GEMINI/OPENROUTER/MINIMAX) then restart\",\n },\n {\n name: \"Embedding provider\",\n ok: hasEmbed,\n hint: hasEmbed ? undefined : \"Running BM25-only. Add OPENAI_API_KEY / VOYAGE_API_KEY / COHERE_API_KEY / OLLAMA_HOST for semantic recall\",\n },\n );\n\n for (const f of (flags?.flags || []) as { label: string; enabled: boolean; enableHow: string }[]) {\n checks.push({ name: f.label, ok: f.enabled, hint: f.enabled ? undefined : f.enableHow });\n }\n\n const cc = checkClaudeCodeHooks();\n const ccCheck = (() => {\n switch (cc.state) {\n case \"loaded\":\n return {\n ok: true,\n hint: cc.manifestPath ? `manifest: ${cc.manifestPath}` : undefined,\n };\n case \"not-loaded\":\n return {\n ok: false,\n hint: \"Plugin enabled but hooks not loaded by Claude Code. Try: /plugin uninstall agentmemory@agentmemory && /plugin install agentmemory@agentmemory, then restart the session. CC must be >= 2.1.x for plugin-hook auto-load.\",\n };\n case \"no-debug-log\":\n return {\n ok: false,\n hint: \"Cannot verify — no Claude Code debug log found. Run once with `claude --debug -p \\\"x\\\"`, then re-run doctor.\",\n };\n case \"no-cc-dir\":\n return undefined;\n }\n })();\n if (ccCheck) checks.push({ name: \"Claude Code plugin hooks registered\", ...ccCheck });\n\n checks.push({\n name: \"Knowledge graph populated\",\n ok: graphHas,\n hint: graphHas ? undefined : \"Graph is empty. Run a session with GRAPH_EXTRACTION_ENABLED=true, or POST /agentmemory/graph/extract\",\n });\n\n const passed = checks.filter((c) => c.ok).length;\n const total = checks.length;\n p.note(formatChecks(checks), `${passed}/${total} checks passing`);\n\n if (passed === total) {\n p.outro(\"✓ All checks passed. agentmemory is healthy.\");\n } else {\n p.outro(`${total - passed} issue(s) — follow hints above to fix.`);\n process.exit(1);\n }\n}\n\ntype DemoObservation = {\n toolName: string;\n toolInput: Record<string, string>;\n toolOutput: string;\n};\n\ntype DemoSession = {\n id: string;\n title: string;\n observations: DemoObservation[];\n};\n\ntype SearchResult = { query: string; hits: number; topTitle: string };\n\nfunction buildDemoSessions(): DemoSession[] {\n return [\n {\n id: generateId(\"demo\"),\n title: \"Session 1: JWT auth setup\",\n observations: [\n {\n toolName: \"Write\",\n toolInput: { file_path: \"src/middleware/auth.ts\" },\n toolOutput:\n \"Created JWT middleware using jose library. Tokens expire after 30 days. Chose jose over jsonwebtoken for Edge compatibility.\",\n },\n {\n toolName: \"Write\",\n toolInput: { file_path: \"test/auth.test.ts\" },\n toolOutput:\n \"Added token validation tests covering expired, malformed, and valid cases.\",\n },\n {\n toolName: \"Bash\",\n toolInput: { command: \"npm test\" },\n toolOutput: \"All 12 auth tests passing.\",\n },\n ],\n },\n {\n id: generateId(\"demo\"),\n title: \"Session 2: Database migration debugging\",\n observations: [\n {\n toolName: \"Read\",\n toolInput: { file_path: \"prisma/schema.prisma\" },\n toolOutput:\n \"Found N+1 query issue in user relations. Need to add include on posts query.\",\n },\n {\n toolName: \"Edit\",\n toolInput: { file_path: \"src/api/users.ts\" },\n toolOutput:\n \"Fixed N+1 by adding Prisma include. Query time dropped from 450ms to 28ms.\",\n },\n ],\n },\n {\n id: generateId(\"demo\"),\n title: \"Session 3: Rate limiting\",\n observations: [\n {\n toolName: \"Write\",\n toolInput: { file_path: \"src/middleware/ratelimit.ts\" },\n toolOutput:\n \"Added rate limiting middleware with 100 req/min default. Uses in-memory store for dev, Redis for prod.\",\n },\n ],\n },\n ];\n}\n\nasync function postJson<T = unknown>(\n url: string,\n body: unknown,\n timeoutMs = 5000,\n): Promise<T | null> {\n try {\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(timeoutMs),\n });\n if (!res.ok) return null;\n return (await res.json().catch(() => null)) as T | null;\n } catch {\n return null;\n }\n}\n\nasync function postJsonStrict<T = unknown>(\n url: string,\n body: unknown,\n timeoutMs = 5000,\n): Promise<T | null> {\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(timeoutMs),\n });\n if (!res.ok) {\n const errBody = await res.text().catch(() => \"\");\n const suffix = errBody ? ` — ${errBody.slice(0, 200)}` : \"\";\n throw new Error(`POST ${url} failed: ${res.status} ${res.statusText}${suffix}`);\n }\n return (await res.json().catch(() => null)) as T | null;\n}\n\nasync function seedDemoSession(\n base: string,\n project: string,\n session: DemoSession,\n): Promise<number> {\n await postJsonStrict(`${base}/agentmemory/session/start`, {\n sessionId: session.id,\n project,\n cwd: project,\n });\n\n let stored = 0;\n for (const obs of session.observations) {\n const url = `${base}/agentmemory/observe`;\n const payload = {\n hookType: \"post_tool_use\",\n sessionId: session.id,\n project,\n cwd: project,\n timestamp: new Date().toISOString(),\n data: {\n tool_name: obs.toolName,\n tool_input: obs.toolInput,\n tool_output: obs.toolOutput,\n },\n };\n\n try {\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n signal: AbortSignal.timeout(5000),\n });\n if (res.ok) {\n stored++;\n } else {\n const body = await res.text().catch(() => \"\");\n p.log.warn(\n `observe failed for ${obs.toolName}: ${res.status} ${res.statusText}${body ? ` — ${body.slice(0, 160)}` : \"\"}`,\n );\n }\n } catch (err) {\n p.log.warn(\n `observe request failed for ${obs.toolName}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n await postJsonStrict(`${base}/agentmemory/session/end`, { sessionId: session.id });\n return stored;\n}\n\nasync function runDemoSearch(base: string, query: string): Promise<SearchResult> {\n const data = await postJson<{ results?: Array<{ title?: string }> }>(\n `${base}/agentmemory/smart-search`,\n { query, limit: 5 },\n 10000,\n );\n const items = data?.results ?? [];\n return {\n query,\n hits: items.length,\n topTitle: items[0]?.title ?? \"(no results)\",\n };\n}\n\nasync function runDemo() {\n const port = getRestPort();\n const base = `http://localhost:${port}`;\n p.intro(\"agentmemory demo\");\n\n if (!(await isAgentmemoryReady())) {\n p.log.error(\n `agentmemory worker not reachable on port ${port} (livez probe failed). Something may be on the port but it isn't serving /agentmemory/*.`,\n );\n p.log.info(\"Start it with: npx @agentmemory/agentmemory\");\n process.exit(1);\n }\n\n const demoProject = \"/tmp/agentmemory-demo\";\n const sessions = buildDemoSessions();\n\n const sSeed = p.spinner();\n sSeed.start(\"Seeding 3 demo sessions with realistic observations...\");\n\n let totalObs = 0;\n for (const session of sessions) {\n totalObs += await seedDemoSession(base, demoProject, session);\n }\n\n sSeed.stop(`Seeded ${totalObs} observations across ${sessions.length} sessions`);\n\n const queries = [\n \"jwt auth middleware\",\n \"database performance optimization\",\n \"rate limiting\",\n ];\n\n const sQuery = p.spinner();\n sQuery.start(`Running ${queries.length} smart-search queries...`);\n\n const results: SearchResult[] = [];\n for (const query of queries) {\n results.push(await runDemoSearch(base, query));\n }\n\n sQuery.stop(\"Search complete\");\n\n const lines = [\n `Project: ${demoProject}`,\n `Sessions: ${sessions.length} seeded (${totalObs} observations)`,\n \"\",\n \"Search results:\",\n ...results.flatMap((r) => [\n ` \"${r.query}\"`,\n ` → ${r.hits} hit(s), top: ${r.topTitle.slice(0, 60)}`,\n ]),\n \"\",\n `Notice: searching \"database performance optimization\"`,\n `found the N+1 query fix — keyword matching can't do that.`,\n \"\",\n `Viewer: ${getViewerUrl()}`,\n `Clean up with: curl -X DELETE \"${base}/agentmemory/sessions?project=${demoProject}\"`,\n ];\n\n p.note(lines.join(\"\\n\"), \"demo complete\");\n p.log.success(\"agentmemory is working. Point your agent at it and get back to coding.\");\n}\n\nfunction runCommand(\n command: string,\n commandArgs: string[],\n options: { cwd?: string; label: string; optional?: boolean } = { label: \"command\" },\n): boolean {\n const spinner = p.spinner();\n spinner.start(options.label);\n const result = spawnSync(command, commandArgs, {\n cwd: options.cwd || process.cwd(),\n stdio: \"pipe\",\n encoding: \"utf-8\",\n });\n\n if (result.status === 0) {\n spinner.stop(`${options.label} ✓`);\n return true;\n }\n\n const stderr = (result.stderr || \"\").toString().trim();\n const stdout = (result.stdout || \"\").toString().trim();\n const msg = stderr || stdout || \"unknown error\";\n\n if (options.optional) {\n spinner.stop(`${options.label} (skipped)`);\n p.log.warn(msg.slice(0, 300));\n return false;\n }\n\n spinner.stop(`${options.label} ✗`);\n p.log.error(msg.slice(0, 300));\n return false;\n}\n\nasync function runUpgrade() {\n p.intro(\"agentmemory upgrade\");\n\n const cwd = process.cwd();\n const hasPackageJson = existsSync(join(cwd, \"package.json\"));\n const hasPnpmLock = existsSync(join(cwd, \"pnpm-lock.yaml\"));\n\n const pnpmBin = whichBinary(\"pnpm\");\n const npmBin = whichBinary(\"npm\");\n const dockerBin = whichBinary(\"docker\");\n\n p.log.info(`Working directory: ${cwd}`);\n const requireSuccess = (ok: boolean, label: string): void => {\n if (!ok) {\n p.log.error(`Upgrade aborted: ${label} failed.`);\n process.exit(1);\n }\n };\n\n if (hasPackageJson) {\n const usePnpm = !!pnpmBin && hasPnpmLock;\n if (usePnpm && pnpmBin) {\n const installOk = runCommand(pnpmBin, [\"install\"], {\n label: \"Refreshing dependencies (pnpm install)\",\n });\n requireSuccess(installOk, \"pnpm install\");\n runCommand(pnpmBin, [\"up\", \"iii-sdk@latest\"], {\n label: \"Upgrading iii-sdk to latest\",\n optional: true,\n });\n } else if (npmBin) {\n const installOk = runCommand(npmBin, [\"install\"], {\n label: \"Refreshing dependencies (npm install)\",\n });\n requireSuccess(installOk, \"npm install\");\n runCommand(npmBin, [\"install\", \"iii-sdk@latest\"], {\n label: \"Upgrading iii-sdk to latest\",\n optional: true,\n });\n } else {\n p.log.warn(\"No package manager found (pnpm/npm). Skipping JS dependency upgrade.\");\n }\n } else {\n p.log.warn(\"No package.json in current directory. Skipping JS dependency upgrade.\");\n }\n\n const shBin = whichBinary(\"sh\");\n const curlBin = whichBinary(\"curl\");\n if (shBin && curlBin) {\n const upgradeEngine = await p.confirm({\n message: \"Re-run the iii-engine install script (curl | sh)?\",\n initialValue: true,\n });\n if (p.isCancel(upgradeEngine)) {\n p.cancel(\"Cancelled.\");\n return process.exit(0);\n }\n if (upgradeEngine === true) {\n const releaseUrl = iiiReleaseUrl();\n const asset = iiiReleaseAsset();\n const isZipAsset = asset?.endsWith(\".zip\") === true;\n if (!releaseUrl) {\n p.log.warn(\n `iii-engine binary not available for ${platform()}/${process.arch}. Use Docker (\\`docker pull iiidev/iii:${IIPINNED_VERSION}\\`) or download manually from https://github.com/iii-hq/iii/releases/tag/iii%2Fv${IIPINNED_VERSION}.`,\n );\n } else if (IS_WINDOWS || isZipAsset) {\n // Windows ships a .zip, not a tarball, and the rest of this\n // branch assumes sh + tar -xz + chmod. Skip the auto-installer\n // there and point at the manual flow / Docker fallback. Same\n // guidance as installInstructions().\n p.log.info(\n `Skipping auto-install on ${platform()} — the ${asset} asset isn't tar-compatible. Install manually:\\n` +\n ` 1. Download ${releaseUrl}\\n` +\n ` 2. Extract iii.exe and place it on PATH (e.g. %USERPROFILE%\\\\.local\\\\bin)\\n` +\n `Or use Docker: docker pull iiidev/iii:${IIPINNED_VERSION}`,\n );\n } else {\n // Pinned to IIPINNED_VERSION rather than `install.iii.dev/iii/main`,\n // which would track `latest` and re-pull the broken 0.11.6 build.\n const homeDir = homedir();\n const binDir = join(homeDir, \".local\", \"bin\");\n const installCmd = [\n `mkdir -p \"${binDir}\"`,\n `curl -fsSL \"${releaseUrl}\" | tar -xz -C \"${binDir}\"`,\n `chmod +x \"${binDir}/iii\"`,\n ].join(\" && \");\n const installerOk = runCommand(shBin, [\"-c\", installCmd], {\n label: `Installing iii-engine v${IIPINNED_VERSION} (pinned)`,\n optional: true,\n });\n if (!installerOk) {\n p.log.warn(\n `iii-engine installer failed. Fallbacks: Docker (\\`docker pull iiidev/iii:${IIPINNED_VERSION}\\`) or download manually from https://github.com/iii-hq/iii/releases/tag/iii%2Fv${IIPINNED_VERSION}.`,\n );\n }\n }\n } else {\n p.log.info(\"Skipped iii-engine installer.\");\n }\n } else {\n p.log.warn(\"curl or sh not found. Skipping iii-engine installer.\");\n }\n\n if (dockerBin) {\n runCommand(dockerBin, [\"pull\", `iiidev/iii:${IIPINNED_VERSION}`], {\n label: `Pulling iii Docker image v${IIPINNED_VERSION} (pinned)`,\n optional: true,\n });\n } else {\n p.log.info(\"Docker not found. Skipping Docker image refresh.\");\n }\n\n p.note(\n [\n \"Upgrade flow completed.\",\n \"\",\n \"Recommended next steps:\",\n \" 1) agentmemory status\",\n \" 2) npm/pnpm test\",\n \" 3) restart agentmemory process\",\n ].join(\"\\n\"),\n \"agentmemory upgrade\",\n );\n}\n\nasync function runMcp(): Promise<void> {\n await import(\"./mcp/standalone.js\");\n}\n\nasync function runImportJsonl(): Promise<void> {\n // Long-form flags that take a value. Their value tokens must be\n // consumed alongside the flag so they don't leak into positional\n // args (e.g. `--port 3112 import-jsonl` would otherwise turn\n // 3112 into pathArg).\n const VALUE_FLAGS = new Set([\"--port\", \"--tools\"]);\n let maxFiles: number | undefined;\n const tail = args.slice(1);\n const positional: string[] = [];\n for (let i = 0; i < tail.length; i++) {\n const a = tail[i]!;\n if (a === \"--max-files\") {\n const raw = tail[i + 1];\n const parsed = raw !== undefined ? parseInt(raw, 10) : NaN;\n if (Number.isInteger(parsed) && parsed > 0) {\n maxFiles = parsed;\n } else if (raw !== undefined) {\n p.log.warn(`Ignoring --max-files ${raw}: expected a positive integer.`);\n }\n i++;\n continue;\n }\n if (a.startsWith(\"--max-files=\")) {\n const raw = a.slice(\"--max-files=\".length);\n const parsed = parseInt(raw, 10);\n if (Number.isInteger(parsed) && parsed > 0) {\n maxFiles = parsed;\n } else {\n p.log.warn(`Ignoring --max-files=${raw}: expected a positive integer.`);\n }\n continue;\n }\n if (VALUE_FLAGS.has(a)) {\n i++;\n continue;\n }\n if (a.startsWith(\"-\")) continue;\n positional.push(a);\n }\n const pathArg = positional[0];\n\n const port = getRestPort();\n const base = `http://localhost:${port}`;\n\n let probeOk = false;\n let probeDetail = \"\";\n try {\n const probe = await fetch(`${base}/agentmemory/livez`, {\n signal: AbortSignal.timeout(2000),\n });\n probeOk = probe.ok;\n if (!probeOk) {\n const probeBody = await probe.text().catch(() => \"\");\n probeDetail = `reachable but unhealthy (HTTP ${probe.status}${probeBody ? `: ${probeBody.slice(0, 200)}` : \"\"})`;\n }\n } catch (err) {\n probeOk = false;\n const msg = err instanceof Error ? err.message : String(err);\n probeDetail = `unreachable (${msg})`;\n }\n if (!probeOk) {\n p.log.error(\n `agentmemory livez probe failed on port ${port}: ${probeDetail}. Start it with \\`npx @agentmemory/agentmemory\\` in another terminal, then re-run this command.`,\n );\n process.exit(1);\n }\n\n const body: Record<string, unknown> = {};\n if (pathArg) body[\"path\"] = pathArg;\n if (maxFiles !== undefined) body[\"maxFiles\"] = maxFiles;\n\n const headers: Record<string, string> = { \"content-type\": \"application/json\" };\n const secret = process.env[\"AGENTMEMORY_SECRET\"];\n if (secret) headers[\"authorization\"] = `Bearer ${secret}`;\n\n p.log.info(`Importing JSONL from ${pathArg || \"~/.claude/projects\"}…`);\n const spinner = p.spinner();\n spinner.start(\"scanning files\");\n\n try {\n const res = await fetch(`${base}/agentmemory/replay/import-jsonl`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(120_000),\n });\n const text = await res.text();\n let json: {\n success?: boolean;\n error?: string;\n imported?: number;\n sessionIds?: string[];\n observations?: number;\n discovered?: number;\n truncated?: boolean;\n traversalCapped?: boolean;\n maxFiles?: number;\n maxFilesUpperBound?: number;\n } = {};\n if (text.length > 0) {\n try {\n json = JSON.parse(text);\n } catch {\n spinner.stop(\"failed\");\n p.log.error(\n `server returned non-JSON response (HTTP ${res.status}): ${text.slice(0, 200)}`,\n );\n process.exit(1);\n }\n }\n if (!res.ok || json.success !== true) {\n spinner.stop(\"failed\");\n const detail =\n json.error ||\n (text.length === 0\n ? \"empty response body\"\n : json.success === undefined\n ? `HTTP ${res.status} (response missing success field)`\n : `HTTP ${res.status}`);\n if (res.status === 401) {\n p.log.error(\n `${detail}. Set AGENTMEMORY_SECRET to match the server's secret and re-run.`,\n );\n } else if (res.status === 404) {\n p.log.error(\n `${detail}. The running agentmemory server does not expose /agentmemory/replay/import-jsonl — upgrade to v0.8.13 or later.`,\n );\n } else {\n p.log.error(detail);\n }\n process.exit(1);\n }\n spinner.stop(\n `imported ${json.imported ?? 0} file(s), ${json.observations ?? 0} observation(s) across ${json.sessionIds?.length || 0} session(s)`,\n );\n if (json.truncated) {\n const cap = json.maxFiles ?? 200;\n const upper = json.maxFilesUpperBound ?? 1000;\n const discovered = json.discovered ?? 0;\n const skipped = discovered - (json.imported ?? 0);\n const discoveredLabel = json.traversalCapped\n ? `${discovered}+ (traversal halted at safety cap)`\n : String(discovered);\n const baseMsg = `Hit the ${cap}-file scan cap; ${skipped} of ${discoveredLabel} discovered file(s) were skipped.`;\n // If we already saw more than the server's hard cap (or the\n // walker stopped early), bumping --max-files won't help on its\n // own — recommend batching by subdirectory.\n if (discovered > upper || json.traversalCapped) {\n p.log.warn(\n `${baseMsg} Tree exceeds the server's --max-files limit of ${upper}; ` +\n `batch by subdirectory (run import-jsonl once per project under ~/.claude/projects).`,\n );\n } else {\n const suggested = Math.min(\n Math.max((discovered || cap) + 100, cap * 2),\n upper,\n );\n p.log.warn(\n `${baseMsg} Re-run with --max-files=${suggested} (max ${upper}) or batch by subdirectory.`,\n );\n }\n }\n if (json.sessionIds && json.sessionIds.length > 0) {\n p.log.info(`View at ${getViewerUrl()} → Replay tab`);\n }\n } catch (err) {\n spinner.stop(\"failed\");\n if (err instanceof Error && err.name === \"TimeoutError\") {\n p.log.error(\"import timed out after 2 minutes\");\n } else {\n p.log.error(err instanceof Error ? err.message : String(err));\n }\n process.exit(1);\n }\n}\n\nconst commands: Record<string, () => Promise<void>> = {\n status: runStatus,\n doctor: runDoctor,\n demo: runDemo,\n upgrade: runUpgrade,\n mcp: runMcp,\n \"import-jsonl\": runImportJsonl,\n};\n\nconst handler = commands[args[0] ?? \"\"] ?? main;\nhandler().catch((err) => {\n p.log.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n});\n"],"mappings":"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"}
|
package/dist/docker-compose.yml
CHANGED
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
services:
|
|
2
2
|
iii-engine:
|
|
3
|
-
|
|
3
|
+
# Pinned to v0.11.2 — the last engine that runs agentmemory's current
|
|
4
|
+
# worker model cleanly. v0.11.6 introduces a new sandbox-everything-
|
|
5
|
+
# via-`iii worker add` model that agentmemory hasn't been refactored
|
|
6
|
+
# for yet; the architectural mismatch surfaces as EPIPE reconnect
|
|
7
|
+
# loops and empty search after save. Bump only after agentmemory is
|
|
8
|
+
# refactored to register as a sandboxed worker.
|
|
9
|
+
#
|
|
10
|
+
# Override per-shell or via .env file:
|
|
11
|
+
# AGENTMEMORY_III_VERSION=0.11.7 docker compose up
|
|
12
|
+
image: iiidev/iii:${AGENTMEMORY_III_VERSION:-0.11.2}
|
|
4
13
|
ports:
|
|
5
14
|
- "127.0.0.1:49134:49134"
|
|
6
15
|
- "127.0.0.1:3111:3111"
|
|
@@ -28,7 +28,7 @@ async function main() {
|
|
|
28
28
|
method: "POST",
|
|
29
29
|
headers: authHeaders(),
|
|
30
30
|
body: JSON.stringify({ sessionId }),
|
|
31
|
-
signal: AbortSignal.timeout(
|
|
31
|
+
signal: AbortSignal.timeout(3e4)
|
|
32
32
|
});
|
|
33
33
|
} catch {}
|
|
34
34
|
if (process.env["CONSOLIDATION_ENABLED"] === "true") {
|
|
@@ -37,7 +37,7 @@ async function main() {
|
|
|
37
37
|
method: "POST",
|
|
38
38
|
headers: authHeaders(),
|
|
39
39
|
body: JSON.stringify({ olderThanDays: 0 }),
|
|
40
|
-
signal: AbortSignal.timeout(
|
|
40
|
+
signal: AbortSignal.timeout(6e4)
|
|
41
41
|
});
|
|
42
42
|
} catch {}
|
|
43
43
|
try {
|
|
@@ -48,7 +48,7 @@ async function main() {
|
|
|
48
48
|
tier: "all",
|
|
49
49
|
force: true
|
|
50
50
|
}),
|
|
51
|
-
signal: AbortSignal.timeout(
|
|
51
|
+
signal: AbortSignal.timeout(12e4)
|
|
52
52
|
});
|
|
53
53
|
} catch {}
|
|
54
54
|
}
|
|
@@ -56,7 +56,7 @@ async function main() {
|
|
|
56
56
|
await fetch(`${REST_URL}/agentmemory/claude-bridge/sync`, {
|
|
57
57
|
method: "POST",
|
|
58
58
|
headers: authHeaders(),
|
|
59
|
-
signal: AbortSignal.timeout(
|
|
59
|
+
signal: AbortSignal.timeout(3e4)
|
|
60
60
|
});
|
|
61
61
|
} catch {}
|
|
62
62
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-end.mjs","names":[],"sources":["../../src/hooks/session-end.ts"],"sourcesContent":["#!/usr/bin/env node\n\nfunction isSdkChildContext(payload: unknown): boolean {\n if (process.env[\"AGENTMEMORY_SDK_CHILD\"] === \"1\") return true;\n if (!payload || typeof payload !== \"object\") return false;\n return (payload as { entrypoint?: unknown }).entrypoint === \"sdk-ts\";\n}\n\nconst REST_URL = process.env[\"AGENTMEMORY_URL\"] || \"http://localhost:3111\";\nconst SECRET = process.env[\"AGENTMEMORY_SECRET\"] || \"\";\n\nfunction authHeaders(): Record<string, string> {\n const h: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (SECRET) h[\"Authorization\"] = `Bearer ${SECRET}`;\n return h;\n}\n\nasync function main() {\n let input = \"\";\n for await (const chunk of process.stdin) {\n input += chunk;\n }\n\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(input);\n } catch {\n return;\n }\n\n if (isSdkChildContext(data)) return;\n\n const sessionId = (data.session_id as string) || \"unknown\";\n\n try {\n await fetch(`${REST_URL}/agentmemory/session/end`, {\n method: \"POST\",\n headers: authHeaders(),\n body: JSON.stringify({ sessionId }),\n signal: AbortSignal.timeout(
|
|
1
|
+
{"version":3,"file":"session-end.mjs","names":[],"sources":["../../src/hooks/session-end.ts"],"sourcesContent":["#!/usr/bin/env node\n\nfunction isSdkChildContext(payload: unknown): boolean {\n if (process.env[\"AGENTMEMORY_SDK_CHILD\"] === \"1\") return true;\n if (!payload || typeof payload !== \"object\") return false;\n return (payload as { entrypoint?: unknown }).entrypoint === \"sdk-ts\";\n}\n\nconst REST_URL = process.env[\"AGENTMEMORY_URL\"] || \"http://localhost:3111\";\nconst SECRET = process.env[\"AGENTMEMORY_SECRET\"] || \"\";\n\nfunction authHeaders(): Record<string, string> {\n const h: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (SECRET) h[\"Authorization\"] = `Bearer ${SECRET}`;\n return h;\n}\n\nasync function main() {\n let input = \"\";\n for await (const chunk of process.stdin) {\n input += chunk;\n }\n\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(input);\n } catch {\n return;\n }\n\n if (isSdkChildContext(data)) return;\n\n const sessionId = (data.session_id as string) || \"unknown\";\n\n try {\n await fetch(`${REST_URL}/agentmemory/session/end`, {\n method: \"POST\",\n headers: authHeaders(),\n body: JSON.stringify({ sessionId }),\n signal: AbortSignal.timeout(30000), // Increased from 5s\n });\n } catch {\n // best-effort\n }\n\n if (process.env[\"CONSOLIDATION_ENABLED\"] === \"true\") {\n try {\n await fetch(`${REST_URL}/agentmemory/crystals/auto`, {\n method: \"POST\",\n headers: authHeaders(),\n body: JSON.stringify({ olderThanDays: 0 }),\n signal: AbortSignal.timeout(60000), // Increased from 15s\n });\n } catch {}\n\n try {\n await fetch(`${REST_URL}/agentmemory/consolidate-pipeline`, {\n method: \"POST\",\n headers: authHeaders(),\n body: JSON.stringify({ tier: \"all\", force: true }),\n signal: AbortSignal.timeout(120000), // Increased from 30s\n });\n } catch {}\n }\n\n if (process.env[\"CLAUDE_MEMORY_BRIDGE\"] === \"true\") {\n try {\n await fetch(`${REST_URL}/agentmemory/claude-bridge/sync`, {\n method: \"POST\",\n headers: authHeaders(),\n signal: AbortSignal.timeout(30000), // Increased from 5s\n });\n } catch {\n // best-effort\n }\n }\n}\n\nmain();"],"mappings":";;AAEA,SAAS,kBAAkB,SAA2B;AACpD,KAAI,QAAQ,IAAI,6BAA6B,IAAK,QAAO;AACzD,KAAI,CAAC,WAAW,OAAO,YAAY,SAAU,QAAO;AACpD,QAAQ,QAAqC,eAAe;;AAG9D,MAAM,WAAW,QAAQ,IAAI,sBAAsB;AACnD,MAAM,SAAS,QAAQ,IAAI,yBAAyB;AAEpD,SAAS,cAAsC;CAC7C,MAAM,IAA4B,EAAE,gBAAgB,oBAAoB;AACxE,KAAI,OAAQ,GAAE,mBAAmB,UAAU;AAC3C,QAAO;;AAGT,eAAe,OAAO;CACpB,IAAI,QAAQ;AACZ,YAAW,MAAM,SAAS,QAAQ,MAChC,UAAS;CAGX,IAAI;AACJ,KAAI;AACF,SAAO,KAAK,MAAM,MAAM;SAClB;AACN;;AAGF,KAAI,kBAAkB,KAAK,CAAE;CAE7B,MAAM,YAAa,KAAK,cAAyB;AAEjD,KAAI;AACF,QAAM,MAAM,GAAG,SAAS,2BAA2B;GACjD,QAAQ;GACR,SAAS,aAAa;GACtB,MAAM,KAAK,UAAU,EAAE,WAAW,CAAC;GACnC,QAAQ,YAAY,QAAQ,IAAM;GACnC,CAAC;SACI;AAIR,KAAI,QAAQ,IAAI,6BAA6B,QAAQ;AACnD,MAAI;AACF,SAAM,MAAM,GAAG,SAAS,6BAA6B;IACnD,QAAQ;IACR,SAAS,aAAa;IACtB,MAAM,KAAK,UAAU,EAAE,eAAe,GAAG,CAAC;IAC1C,QAAQ,YAAY,QAAQ,IAAM;IACnC,CAAC;UACI;AAER,MAAI;AACF,SAAM,MAAM,GAAG,SAAS,oCAAoC;IAC1D,QAAQ;IACR,SAAS,aAAa;IACtB,MAAM,KAAK,UAAU;KAAE,MAAM;KAAO,OAAO;KAAM,CAAC;IAClD,QAAQ,YAAY,QAAQ,KAAO;IACpC,CAAC;UACI;;AAGV,KAAI,QAAQ,IAAI,4BAA4B,OAC1C,KAAI;AACF,QAAM,MAAM,GAAG,SAAS,kCAAkC;GACxD,QAAQ;GACR,SAAS,aAAa;GACtB,QAAQ,YAAY,QAAQ,IAAM;GACnC,CAAC;SACI;;AAMZ,MAAM"}
|
|
@@ -8,6 +8,8 @@ function isSdkChildContext(payload) {
|
|
|
8
8
|
const INJECT_CONTEXT = process.env["AGENTMEMORY_INJECT_CONTEXT"] === "true";
|
|
9
9
|
const REST_URL = process.env["AGENTMEMORY_URL"] || "http://localhost:3111";
|
|
10
10
|
const SECRET = process.env["AGENTMEMORY_SECRET"] || "";
|
|
11
|
+
const INJECT_TIMEOUT_MS = 1500;
|
|
12
|
+
const REGISTER_TIMEOUT_MS = 800;
|
|
11
13
|
function authHeaders() {
|
|
12
14
|
const h = { "Content-Type": "application/json" };
|
|
13
15
|
if (SECRET) h["Authorization"] = `Bearer ${SECRET}`;
|
|
@@ -25,18 +27,29 @@ async function main() {
|
|
|
25
27
|
if (isSdkChildContext(data)) return;
|
|
26
28
|
const sessionId = data.session_id || `ses_${Date.now().toString(36)}`;
|
|
27
29
|
const project = data.cwd || process.cwd();
|
|
30
|
+
const url = `${REST_URL}/agentmemory/session/start`;
|
|
31
|
+
const init = {
|
|
32
|
+
method: "POST",
|
|
33
|
+
headers: authHeaders(),
|
|
34
|
+
body: JSON.stringify({
|
|
35
|
+
sessionId,
|
|
36
|
+
project,
|
|
37
|
+
cwd: project
|
|
38
|
+
})
|
|
39
|
+
};
|
|
40
|
+
if (!INJECT_CONTEXT) {
|
|
41
|
+
fetch(url, {
|
|
42
|
+
...init,
|
|
43
|
+
signal: AbortSignal.timeout(REGISTER_TIMEOUT_MS)
|
|
44
|
+
}).catch(() => {});
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
28
47
|
try {
|
|
29
|
-
const res = await fetch(
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
body: JSON.stringify({
|
|
33
|
-
sessionId,
|
|
34
|
-
project,
|
|
35
|
-
cwd: project
|
|
36
|
-
}),
|
|
37
|
-
signal: AbortSignal.timeout(5e3)
|
|
48
|
+
const res = await fetch(url, {
|
|
49
|
+
...init,
|
|
50
|
+
signal: AbortSignal.timeout(INJECT_TIMEOUT_MS)
|
|
38
51
|
});
|
|
39
|
-
if (
|
|
52
|
+
if (res.ok) {
|
|
40
53
|
const result = await res.json();
|
|
41
54
|
if (result.context) process.stdout.write(result.context);
|
|
42
55
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-start.mjs","names":[],"sources":["../../src/hooks/session-start.ts"],"sourcesContent":["#!/usr/bin/env node\n\nfunction isSdkChildContext(payload: unknown): boolean {\n if (process.env[\"AGENTMEMORY_SDK_CHILD\"] === \"1\") return true;\n if (!payload || typeof payload !== \"object\") return false;\n return (payload as { entrypoint?: unknown }).entrypoint === \"sdk-ts\";\n}\n\n// Session-start hook.\n//\n// Always registers the session for observation tracking (so memories\n// captured on PostToolUse get attached to the right session). Only writes\n// project context to stdout — which Claude Code prepends to the very first\n// turn — when AGENTMEMORY_INJECT_CONTEXT=true. Default off as of 0.8.10\n// (#143); see pre-tool-use.ts for the full explanation.\nconst INJECT_CONTEXT = process.env[\"AGENTMEMORY_INJECT_CONTEXT\"] === \"true\";\n\nconst REST_URL = process.env[\"AGENTMEMORY_URL\"] || \"http://localhost:3111\";\nconst SECRET = process.env[\"AGENTMEMORY_SECRET\"] || \"\";\n\nfunction authHeaders(): Record<string, string> {\n const h: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (SECRET) h[\"Authorization\"] = `Bearer ${SECRET}`;\n return h;\n}\n\nasync function main() {\n let input = \"\";\n for await (const chunk of process.stdin) {\n input += chunk;\n }\n\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(input);\n } catch {\n return;\n }\n\n if (isSdkChildContext(data)) return;\n\n const sessionId =\n (data.session_id as string) || `ses_${Date.now().toString(36)}`;\n const project = (data.cwd as string) || process.cwd();\n\n
|
|
1
|
+
{"version":3,"file":"session-start.mjs","names":[],"sources":["../../src/hooks/session-start.ts"],"sourcesContent":["#!/usr/bin/env node\n\n// Inlined from ./sdk-guard so each hook bundles to a single self-contained\n// .mjs (matches the pattern used by every other hook entry in tsdown.config).\nfunction isSdkChildContext(payload: unknown): boolean {\n if (process.env[\"AGENTMEMORY_SDK_CHILD\"] === \"1\") return true;\n if (!payload || typeof payload !== \"object\") return false;\n return (payload as { entrypoint?: unknown }).entrypoint === \"sdk-ts\";\n}\n\n// Session-start hook.\n//\n// Always registers the session for observation tracking (so memories\n// captured on PostToolUse get attached to the right session). Only writes\n// project context to stdout — which Claude Code prepends to the very first\n// turn — when AGENTMEMORY_INJECT_CONTEXT=true. Default off as of 0.8.10\n// (#143); see pre-tool-use.ts for the full explanation.\nconst INJECT_CONTEXT = process.env[\"AGENTMEMORY_INJECT_CONTEXT\"] === \"true\";\n\nconst REST_URL = process.env[\"AGENTMEMORY_URL\"] || \"http://localhost:3111\";\nconst SECRET = process.env[\"AGENTMEMORY_SECRET\"] || \"\";\n\n// When the server is unreachable a 5s timeout multiplies hard under\n// concurrent fan-out (Slack bots, multi-agent harnesses) and becomes a\n// positive feedback loop that OOM-kills iii-engine (#221). Cap tight on\n// both paths and skip the await entirely when the response is unused.\nconst INJECT_TIMEOUT_MS = 1500;\nconst REGISTER_TIMEOUT_MS = 800;\n\nfunction authHeaders(): Record<string, string> {\n const h: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (SECRET) h[\"Authorization\"] = `Bearer ${SECRET}`;\n return h;\n}\n\nasync function main() {\n let input = \"\";\n for await (const chunk of process.stdin) {\n input += chunk;\n }\n\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(input);\n } catch {\n return;\n }\n\n if (isSdkChildContext(data)) return;\n\n const sessionId =\n (data.session_id as string) || `ses_${Date.now().toString(36)}`;\n const project = (data.cwd as string) || process.cwd();\n\n const url = `${REST_URL}/agentmemory/session/start`;\n const init: RequestInit = {\n method: \"POST\",\n headers: authHeaders(),\n body: JSON.stringify({ sessionId, project, cwd: project }),\n };\n\n if (!INJECT_CONTEXT) {\n // Pure telemetry path: caller never reads the response, so don't\n // block on it. AbortSignal.timeout caps the wait the event loop\n // gives the pending socket before exit.\n fetch(url, {\n ...init,\n signal: AbortSignal.timeout(REGISTER_TIMEOUT_MS),\n }).catch(() => {});\n return;\n }\n\n try {\n const res = await fetch(url, {\n ...init,\n signal: AbortSignal.timeout(INJECT_TIMEOUT_MS),\n });\n if (res.ok) {\n const result = (await res.json()) as { context?: string };\n if (result.context) {\n process.stdout.write(result.context);\n }\n }\n } catch {\n // silently fail -- don't block Claude Code startup\n }\n}\n\nmain();\n"],"mappings":";;AAIA,SAAS,kBAAkB,SAA2B;AACpD,KAAI,QAAQ,IAAI,6BAA6B,IAAK,QAAO;AACzD,KAAI,CAAC,WAAW,OAAO,YAAY,SAAU,QAAO;AACpD,QAAQ,QAAqC,eAAe;;AAU9D,MAAM,iBAAiB,QAAQ,IAAI,kCAAkC;AAErE,MAAM,WAAW,QAAQ,IAAI,sBAAsB;AACnD,MAAM,SAAS,QAAQ,IAAI,yBAAyB;AAMpD,MAAM,oBAAoB;AAC1B,MAAM,sBAAsB;AAE5B,SAAS,cAAsC;CAC7C,MAAM,IAA4B,EAAE,gBAAgB,oBAAoB;AACxE,KAAI,OAAQ,GAAE,mBAAmB,UAAU;AAC3C,QAAO;;AAGT,eAAe,OAAO;CACpB,IAAI,QAAQ;AACZ,YAAW,MAAM,SAAS,QAAQ,MAChC,UAAS;CAGX,IAAI;AACJ,KAAI;AACF,SAAO,KAAK,MAAM,MAAM;SAClB;AACN;;AAGF,KAAI,kBAAkB,KAAK,CAAE;CAE7B,MAAM,YACH,KAAK,cAAyB,OAAO,KAAK,KAAK,CAAC,SAAS,GAAG;CAC/D,MAAM,UAAW,KAAK,OAAkB,QAAQ,KAAK;CAErD,MAAM,MAAM,GAAG,SAAS;CACxB,MAAM,OAAoB;EACxB,QAAQ;EACR,SAAS,aAAa;EACtB,MAAM,KAAK,UAAU;GAAE;GAAW;GAAS,KAAK;GAAS,CAAC;EAC3D;AAED,KAAI,CAAC,gBAAgB;AAInB,QAAM,KAAK;GACT,GAAG;GACH,QAAQ,YAAY,QAAQ,oBAAoB;GACjD,CAAC,CAAC,YAAY,GAAG;AAClB;;AAGF,KAAI;EACF,MAAM,MAAM,MAAM,MAAM,KAAK;GAC3B,GAAG;GACH,QAAQ,YAAY,QAAQ,kBAAkB;GAC/C,CAAC;AACF,MAAI,IAAI,IAAI;GACV,MAAM,SAAU,MAAM,IAAI,MAAM;AAChC,OAAI,OAAO,QACT,SAAQ,OAAO,MAAM,OAAO,QAAQ;;SAGlC;;AAKV,MAAM"}
|
package/dist/hooks/stop.mjs
CHANGED
package/dist/hooks/stop.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stop.mjs","names":[],"sources":["../../src/hooks/stop.ts"],"sourcesContent":["#!/usr/bin/env node\n\n// Inlined — see src/hooks/sdk-guard.ts for canonical version. Kept local\n// per-hook so tsdown does not emit a shared hashed chunk that would churn\n// the diff on every rebuild.\nfunction isSdkChildContext(payload: unknown): boolean {\n if (process.env[\"AGENTMEMORY_SDK_CHILD\"] === \"1\") return true;\n if (!payload || typeof payload !== \"object\") return false;\n return (payload as { entrypoint?: unknown }).entrypoint === \"sdk-ts\";\n}\n\nconst REST_URL = process.env[\"AGENTMEMORY_URL\"] || \"http://localhost:3111\";\nconst SECRET = process.env[\"AGENTMEMORY_SECRET\"] || \"\";\n\nfunction authHeaders(): Record<string, string> {\n const h: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (SECRET) h[\"Authorization\"] = `Bearer ${SECRET}`;\n return h;\n}\n\nasync function main() {\n let input = \"\";\n for await (const chunk of process.stdin) {\n input += chunk;\n }\n\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(input);\n } catch {\n return;\n }\n\n if (isSdkChildContext(data)) {\n // Do not summarize from inside a Claude Agent SDK child session;\n // would re-enter agent-sdk provider and loop (see sdk-guard.ts).\n return;\n }\n\n const sessionId = (data.session_id as string) || \"unknown\";\n\n try {\n await fetch(`${REST_URL}/agentmemory/summarize`, {\n method: \"POST\",\n headers: authHeaders(),\n body: JSON.stringify({ sessionId }),\n signal: AbortSignal.timeout(
|
|
1
|
+
{"version":3,"file":"stop.mjs","names":[],"sources":["../../src/hooks/stop.ts"],"sourcesContent":["#!/usr/bin/env node\n\n// Inlined — see src/hooks/sdk-guard.ts for canonical version. Kept local\n// per-hook so tsdown does not emit a shared hashed chunk that would churn\n// the diff on every rebuild.\nfunction isSdkChildContext(payload: unknown): boolean {\n if (process.env[\"AGENTMEMORY_SDK_CHILD\"] === \"1\") return true;\n if (!payload || typeof payload !== \"object\") return false;\n return (payload as { entrypoint?: unknown }).entrypoint === \"sdk-ts\";\n}\n\nconst REST_URL = process.env[\"AGENTMEMORY_URL\"] || \"http://localhost:3111\";\nconst SECRET = process.env[\"AGENTMEMORY_SECRET\"] || \"\";\n\nfunction authHeaders(): Record<string, string> {\n const h: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (SECRET) h[\"Authorization\"] = `Bearer ${SECRET}`;\n return h;\n}\n\nasync function main() {\n let input = \"\";\n for await (const chunk of process.stdin) {\n input += chunk;\n }\n\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(input);\n } catch {\n return;\n }\n\n if (isSdkChildContext(data)) {\n // Do not summarize from inside a Claude Agent SDK child session;\n // would re-enter agent-sdk provider and loop (see sdk-guard.ts).\n return;\n }\n\n const sessionId = (data.session_id as string) || \"unknown\";\n\n try {\n await fetch(`${REST_URL}/agentmemory/summarize`, {\n method: \"POST\",\n headers: authHeaders(),\n body: JSON.stringify({ sessionId }),\n signal: AbortSignal.timeout(120000), // Increased from 30s to 120s\n });\n } catch {\n // summarize is best-effort\n }\n}\n\nmain();"],"mappings":";;AAKA,SAAS,kBAAkB,SAA2B;AACpD,KAAI,QAAQ,IAAI,6BAA6B,IAAK,QAAO;AACzD,KAAI,CAAC,WAAW,OAAO,YAAY,SAAU,QAAO;AACpD,QAAQ,QAAqC,eAAe;;AAG9D,MAAM,WAAW,QAAQ,IAAI,sBAAsB;AACnD,MAAM,SAAS,QAAQ,IAAI,yBAAyB;AAEpD,SAAS,cAAsC;CAC7C,MAAM,IAA4B,EAAE,gBAAgB,oBAAoB;AACxE,KAAI,OAAQ,GAAE,mBAAmB,UAAU;AAC3C,QAAO;;AAGT,eAAe,OAAO;CACpB,IAAI,QAAQ;AACZ,YAAW,MAAM,SAAS,QAAQ,MAChC,UAAS;CAGX,IAAI;AACJ,KAAI;AACF,SAAO,KAAK,MAAM,MAAM;SAClB;AACN;;AAGF,KAAI,kBAAkB,KAAK,CAGzB;CAGF,MAAM,YAAa,KAAK,cAAyB;AAEjD,KAAI;AACF,QAAM,MAAM,GAAG,SAAS,yBAAyB;GAC/C,QAAQ;GACR,SAAS,aAAa;GACtB,MAAM,KAAK,UAAU,EAAE,WAAW,CAAC;GACnC,QAAQ,YAAY,QAAQ,KAAO;GACpC,CAAC;SACI;;AAKV,MAAM"}
|
|
@@ -7,6 +7,7 @@ function isSdkChildContext(payload) {
|
|
|
7
7
|
}
|
|
8
8
|
const REST_URL = process.env["AGENTMEMORY_URL"] || "http://localhost:3111";
|
|
9
9
|
const SECRET = process.env["AGENTMEMORY_SECRET"] || "";
|
|
10
|
+
const TIMEOUT_MS = 800;
|
|
10
11
|
function authHeaders() {
|
|
11
12
|
const h = { "Content-Type": "application/json" };
|
|
12
13
|
if (SECRET) h["Authorization"] = `Bearer ${SECRET}`;
|
|
@@ -23,24 +24,22 @@ async function main() {
|
|
|
23
24
|
}
|
|
24
25
|
if (isSdkChildContext(data)) return;
|
|
25
26
|
const sessionId = data.session_id || "unknown";
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
});
|
|
43
|
-
} catch {}
|
|
27
|
+
fetch(`${REST_URL}/agentmemory/observe`, {
|
|
28
|
+
method: "POST",
|
|
29
|
+
headers: authHeaders(),
|
|
30
|
+
body: JSON.stringify({
|
|
31
|
+
hookType: "subagent_start",
|
|
32
|
+
sessionId,
|
|
33
|
+
project: data.cwd || process.cwd(),
|
|
34
|
+
cwd: data.cwd || process.cwd(),
|
|
35
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
36
|
+
data: {
|
|
37
|
+
agent_id: data.agent_id,
|
|
38
|
+
agent_type: data.agent_type
|
|
39
|
+
}
|
|
40
|
+
}),
|
|
41
|
+
signal: AbortSignal.timeout(TIMEOUT_MS)
|
|
42
|
+
}).catch(() => {});
|
|
44
43
|
}
|
|
45
44
|
main();
|
|
46
45
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagent-start.mjs","names":[],"sources":["../../src/hooks/subagent-start.ts"],"sourcesContent":["#!/usr/bin/env node\n\nfunction isSdkChildContext(payload: unknown): boolean {\n if (process.env[\"AGENTMEMORY_SDK_CHILD\"] === \"1\") return true;\n if (!payload || typeof payload !== \"object\") return false;\n return (payload as { entrypoint?: unknown }).entrypoint === \"sdk-ts\";\n}\n\nconst REST_URL = process.env[\"AGENTMEMORY_URL\"] || \"http://localhost:3111\";\nconst SECRET = process.env[\"AGENTMEMORY_SECRET\"] || \"\";\n\nfunction authHeaders(): Record<string, string> {\n const h: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (SECRET) h[\"Authorization\"] = `Bearer ${SECRET}`;\n return h;\n}\n\nasync function main() {\n let input = \"\";\n for await (const chunk of process.stdin) {\n input += chunk;\n }\n\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(input);\n } catch {\n return;\n }\n\n if (isSdkChildContext(data)) return;\n\n const sessionId = (data.session_id as string) || \"unknown\";\n\n
|
|
1
|
+
{"version":3,"file":"subagent-start.mjs","names":[],"sources":["../../src/hooks/subagent-start.ts"],"sourcesContent":["#!/usr/bin/env node\n\n// Inlined from ./sdk-guard so each hook bundles to a single self-contained\n// .mjs (matches the pattern used by every other hook entry in tsdown.config).\nfunction isSdkChildContext(payload: unknown): boolean {\n if (process.env[\"AGENTMEMORY_SDK_CHILD\"] === \"1\") return true;\n if (!payload || typeof payload !== \"object\") return false;\n return (payload as { entrypoint?: unknown }).entrypoint === \"sdk-ts\";\n}\n\nconst REST_URL = process.env[\"AGENTMEMORY_URL\"] || \"http://localhost:3111\";\nconst SECRET = process.env[\"AGENTMEMORY_SECRET\"] || \"\";\n\n// Passive telemetry only — nothing reads the response, so the previous\n// `await` was pure latency. Tightened from 2000ms to a defensive cap so a\n// slow/unreachable server can't stack onto every concurrent subagent\n// startup (#221).\nconst TIMEOUT_MS = 800;\n\nfunction authHeaders(): Record<string, string> {\n const h: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (SECRET) h[\"Authorization\"] = `Bearer ${SECRET}`;\n return h;\n}\n\nasync function main() {\n let input = \"\";\n for await (const chunk of process.stdin) {\n input += chunk;\n }\n\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(input);\n } catch {\n return;\n }\n\n if (isSdkChildContext(data)) return;\n\n const sessionId = (data.session_id as string) || \"unknown\";\n\n fetch(`${REST_URL}/agentmemory/observe`, {\n method: \"POST\",\n headers: authHeaders(),\n body: JSON.stringify({\n hookType: \"subagent_start\",\n sessionId,\n project: data.cwd || process.cwd(),\n cwd: data.cwd || process.cwd(),\n timestamp: new Date().toISOString(),\n data: {\n agent_id: data.agent_id,\n agent_type: data.agent_type,\n },\n }),\n signal: AbortSignal.timeout(TIMEOUT_MS),\n }).catch(() => {});\n}\n\nmain();\n"],"mappings":";;AAIA,SAAS,kBAAkB,SAA2B;AACpD,KAAI,QAAQ,IAAI,6BAA6B,IAAK,QAAO;AACzD,KAAI,CAAC,WAAW,OAAO,YAAY,SAAU,QAAO;AACpD,QAAQ,QAAqC,eAAe;;AAG9D,MAAM,WAAW,QAAQ,IAAI,sBAAsB;AACnD,MAAM,SAAS,QAAQ,IAAI,yBAAyB;AAMpD,MAAM,aAAa;AAEnB,SAAS,cAAsC;CAC7C,MAAM,IAA4B,EAAE,gBAAgB,oBAAoB;AACxE,KAAI,OAAQ,GAAE,mBAAmB,UAAU;AAC3C,QAAO;;AAGT,eAAe,OAAO;CACpB,IAAI,QAAQ;AACZ,YAAW,MAAM,SAAS,QAAQ,MAChC,UAAS;CAGX,IAAI;AACJ,KAAI;AACF,SAAO,KAAK,MAAM,MAAM;SAClB;AACN;;AAGF,KAAI,kBAAkB,KAAK,CAAE;CAE7B,MAAM,YAAa,KAAK,cAAyB;AAEjD,OAAM,GAAG,SAAS,uBAAuB;EACvC,QAAQ;EACR,SAAS,aAAa;EACtB,MAAM,KAAK,UAAU;GACnB,UAAU;GACV;GACA,SAAS,KAAK,OAAO,QAAQ,KAAK;GAClC,KAAK,KAAK,OAAO,QAAQ,KAAK;GAC9B,4BAAW,IAAI,MAAM,EAAC,aAAa;GACnC,MAAM;IACJ,UAAU,KAAK;IACf,YAAY,KAAK;IAClB;GACF,CAAC;EACF,QAAQ,YAAY,QAAQ,WAAW;EACxC,CAAC,CAAC,YAAY,GAAG;;AAGpB,MAAM"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { a as deleteImage, c as saveImageToDisk, i as IMAGES_DIR, l as touchImage, o as getMaxBytes, s as isManagedImagePath } from "./src-
|
|
1
|
+
import { a as deleteImage, c as saveImageToDisk, i as IMAGES_DIR, l as touchImage, o as getMaxBytes, s as isManagedImagePath } from "./src-C7vGxttN.mjs";
|
|
2
2
|
|
|
3
3
|
export { deleteImage, saveImageToDisk };
|