@agentmemory/agentmemory 0.9.13 → 0.9.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/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\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 init Copy bundled .env.example to ~/.agentmemory/.env if absent\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], {\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\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\n// Prefer the packaged `.env.example` (next to `dist/cli.mjs`); fall back to\n// the repo root when running from a source checkout.\nfunction findEnvExample(): string | null {\n const candidates = [\n join(__dirname, \"..\", \".env.example\"),\n join(__dirname, \".env.example\"),\n join(process.cwd(), \".env.example\"),\n ];\n for (const c of candidates) {\n if (existsSync(c)) return c;\n }\n return null;\n}\n\nasync function runInit() {\n p.intro(\"agentmemory init\");\n const target = join(homedir(), \".agentmemory\", \".env\");\n const template = findEnvExample();\n if (!template) {\n p.log.error(\n \"Could not locate .env.example in the package. Re-install with: npm i -g @agentmemory/agentmemory\",\n );\n process.exit(1);\n }\n const dir = dirname(target);\n const { mkdir, copyFile } = await import(\"node:fs/promises\");\n const { constants: fsConstants } = await import(\"node:fs\");\n try {\n await mkdir(dir, { recursive: true });\n // COPYFILE_EXCL collapses the exists-check + copy into one syscall —\n // an existsSync(target) + copyFile() pair races with a parallel init\n // (or any other process touching ~/.agentmemory/.env between the two\n // calls) and would silently overwrite a config the operator just\n // wrote. EEXIST out of copyFile is the only \"already configured\"\n // signal we trust.\n await copyFile(template, target, fsConstants.COPYFILE_EXCL);\n } catch (err) {\n if ((err as NodeJS.ErrnoException)?.code === \"EEXIST\") {\n p.log.warn(`${target} already exists — leaving it untouched.`);\n p.log.info(\n `Compare against the latest template: diff ${target} ${template}`,\n );\n p.outro(\"Nothing changed.\");\n return;\n }\n p.log.error(\n `Failed to copy template: ${err instanceof Error ? err.message : String(err)}`,\n );\n process.exit(1);\n }\n p.log.success(`Wrote ${target}`);\n p.note(\n [\n \"All keys are commented out by default. Uncomment the ones you want.\",\n \"\",\n \"Common next steps:\",\n \" 1. Pick an LLM provider key (ANTHROPIC_API_KEY / OPENAI_API_KEY / GEMINI_API_KEY / etc.)\",\n \" 2. Run `npx @agentmemory/agentmemory doctor` to verify the daemon sees them\",\n \" 3. Run `npx @agentmemory/agentmemory` to start the worker\",\n ].join(\"\\n\"),\n \"Next steps\",\n );\n p.outro(`Edit ${target} and you're set.`);\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 init: runInit,\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 {\n existsSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n readlinkSync,\n statSync,\n unlinkSync,\n writeFileSync,\n} 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 init Copy bundled .env.example to ~/.agentmemory/.env if absent\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 stop Stop the running iii-engine started by this CLI\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 AGENTMEMORY_USE_DOCKER=1 Prefer the bundled docker-compose path over the\n native iii-engine binary on first run.\n AGENTMEMORY_III_VERSION Override pinned iii-engine version (default ${IIPINNED_VERSION}).\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], {\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\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\nfunction iiiBinVersion(binPath: string): string | null {\n try {\n const out = execFileSync(binPath, [\"--version\"], {\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n timeout: 3000,\n });\n const match = out.match(/(\\d+\\.\\d+\\.\\d+(?:[-+][\\w.]+)?)/);\n return match ? match[1]! : null;\n } catch {\n return null;\n }\n}\n\nfunction enginePidfilePath(): string {\n return join(homedir(), \".agentmemory\", \"iii.pid\");\n}\n\nfunction engineStatePath(): string {\n return join(homedir(), \".agentmemory\", \"engine-state.json\");\n}\n\ntype EngineState =\n | { kind: \"native\"; configPath: string }\n | { kind: \"docker\"; composeFile: string };\n\nfunction writeEnginePidfile(pid: number): void {\n try {\n const pidPath = enginePidfilePath();\n mkdirSync(dirname(pidPath), { recursive: true });\n writeFileSync(pidPath, `${pid}\\n`, { encoding: \"utf-8\" });\n } catch (err) {\n vlog(`writeEnginePidfile: ${err instanceof Error ? err.message : String(err)}`);\n }\n}\n\nfunction readEnginePidfile(): number | null {\n try {\n const pidStr = readFileSync(enginePidfilePath(), \"utf-8\").trim();\n const pid = parseInt(pidStr, 10);\n return Number.isFinite(pid) && pid > 0 ? pid : null;\n } catch {\n return null;\n }\n}\n\nfunction clearEnginePidfile(): void {\n try {\n unlinkSync(enginePidfilePath());\n } catch {}\n}\n\nfunction writeEngineState(state: EngineState): void {\n try {\n const statePath = engineStatePath();\n mkdirSync(dirname(statePath), { recursive: true });\n writeFileSync(statePath, `${JSON.stringify(state)}\\n`, { encoding: \"utf-8\" });\n } catch (err) {\n vlog(`writeEngineState: ${err instanceof Error ? err.message : String(err)}`);\n }\n}\n\nfunction readEngineState(): EngineState | null {\n try {\n const raw = readFileSync(engineStatePath(), \"utf-8\");\n const parsed = JSON.parse(raw) as Partial<EngineState>;\n if (parsed && (parsed.kind === \"native\" || parsed.kind === \"docker\")) {\n return parsed as EngineState;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nfunction clearEngineState(): void {\n try {\n unlinkSync(engineStatePath());\n } catch {}\n}\n\nfunction discoverComposeFile(): string | null {\n const candidates = [\n join(__dirname, \"..\", \"docker-compose.yml\"),\n join(__dirname, \"docker-compose.yml\"),\n join(process.cwd(), \"docker-compose.yml\"),\n ];\n return candidates.find((c) => existsSync(c)) ?? null;\n}\n\nasync function runIiiInstaller(): Promise<{ ok: boolean; binPath: string | null }> {\n const releaseUrl = iiiReleaseUrl();\n const asset = iiiReleaseAsset();\n const isZipAsset = asset?.endsWith(\".zip\") === true;\n\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 return { ok: false, binPath: null };\n }\n\n if (IS_WINDOWS || isZipAsset) {\n p.log.info(\n `Auto-install unavailable on ${platform()} — ${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 return { ok: false, binPath: null };\n }\n\n const shBin = whichBinary(\"sh\");\n const curlBin = whichBinary(\"curl\");\n if (!shBin || !curlBin) {\n p.log.warn(\"curl or sh not found. Cannot auto-install iii-engine.\");\n return { ok: false, binPath: null };\n }\n\n const binDir = join(homedir(), \".local\", \"bin\");\n const binPath = join(binDir, \"iii\");\n const installCmd = [\n `mkdir -p \"${binDir}\"`,\n `curl -fsSL \"${releaseUrl}\" | tar -xz -C \"${binDir}\"`,\n `chmod +x \"${binPath}\"`,\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 return { ok: false, binPath: null };\n }\n return { ok: true, binPath };\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 isDocker = label.includes(\"Docker\");\n if (!isDocker && typeof child.pid === \"number\") {\n writeEnginePidfile(child.pid);\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: isDocker ? \"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 if (!isDocker) clearEnginePidfile();\n clearEngineState();\n }\n });\n child.unref();\n return child;\n}\n\nfunction startIiiBin(iiiBin: string, configPath: string): boolean {\n const s = p.spinner();\n s.start(`Starting iii-engine: ${iiiBin}`);\n writeEngineState({ kind: \"native\", configPath });\n spawnEngineBackground(iiiBin, [\"--config\", configPath], \"iii-engine\");\n s.stop(\"iii-engine process started\");\n return true;\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) return startIiiBin(iiiBin, configPath);\n\n for (const iiiPath of fallbackIiiPaths()) {\n if (existsSync(iiiPath)) {\n const v = iiiBinVersion(iiiPath);\n vlog(`fallback iii at ${iiiPath} reports version: ${v ?? \"unknown\"}`);\n p.log.info(`Found iii at: ${iiiPath}${v ? ` (v${v})` : \"\"}`);\n process.env[\"PATH\"] = `${dirname(iiiPath)}${PATH_DELIMITER}${process.env[\"PATH\"] ?? \"\"}`;\n iiiBin = iiiPath;\n break;\n }\n }\n\n if (iiiBin && configPath) return startIiiBin(iiiBin, configPath);\n\n if (!configPath) {\n startupFailure = { kind: \"no-engine\" };\n return false;\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 const dockerOptIn =\n process.env[\"AGENTMEMORY_USE_DOCKER\"] === \"1\" ||\n process.env[\"AGENTMEMORY_USE_DOCKER\"] === \"true\";\n const interactive = !!process.stdin.isTTY && !process.env[\"CI\"];\n\n type Choice = \"install\" | \"docker\" | \"manual\";\n let choice: Choice;\n\n if (dockerOptIn && dockerBin && composeFile) {\n choice = \"docker\";\n } else if (!interactive) {\n choice = \"install\";\n p.log.info(\"Non-interactive environment detected — auto-installing iii-engine.\");\n } else {\n p.log.warn(`iii-engine binary not found locally.`);\n const options: { value: Choice; label: string; hint?: string }[] = [\n {\n value: \"install\",\n label: `Install iii v${IIPINNED_VERSION} to ~/.local/bin (~6MB, ~5s)`,\n hint: \"recommended\",\n },\n ];\n if (dockerBin && composeFile) {\n options.push({ value: \"docker\", label: \"Use Docker compose\", hint: \"advanced\" });\n }\n options.push({ value: \"manual\", label: \"Show manual install steps and exit\" });\n\n const picked = await p.select<Choice>({\n message: \"How would you like to start iii-engine?\",\n options,\n initialValue: \"install\",\n });\n if (p.isCancel(picked)) {\n startupFailure = { kind: \"no-engine\" };\n return false;\n }\n choice = picked;\n }\n\n if (choice === \"manual\") {\n startupFailure = { kind: \"no-engine\" };\n return false;\n }\n\n if (choice === \"install\") {\n const result = await runIiiInstaller();\n if (result.ok && result.binPath) {\n process.env[\"PATH\"] = `${dirname(result.binPath)}${PATH_DELIMITER}${process.env[\"PATH\"] ?? \"\"}`;\n iiiBin = result.binPath;\n return startIiiBin(iiiBin, configPath);\n }\n if (dockerBin && composeFile && interactive) {\n const fallback = await p.confirm({\n message: \"Auto-install failed. Try Docker compose instead?\",\n initialValue: true,\n });\n if (p.isCancel(fallback) || fallback !== true) {\n startupFailure = { kind: \"no-engine\" };\n return false;\n }\n choice = \"docker\";\n } else {\n startupFailure = { kind: \"no-engine\" };\n return false;\n }\n }\n\n if (choice === \"docker\" && dockerBin && composeFile) {\n const s = p.spinner();\n s.start(\"Starting iii-engine via Docker...\");\n writeEngineState({ kind: \"docker\", composeFile });\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 if (!composeFile && dockerBin) {\n startupFailure = { kind: \"no-docker-compose\" };\n } else {\n startupFailure = { kind: \"no-engine\" };\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 needs iii-engine 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 (or iii-aarch64-pc-windows-msvc.zip on ARM)`,\n \" 3. Extract iii.exe to %USERPROFILE%\\\\.local\\\\bin\\\\iii.exe (or add to PATH)\",\n \" 4. Re-run: npx @agentmemory/agentmemory\",\n \"\",\n ` B) Docker: docker pull iiidev/iii:${IIPINNED_VERSION}`,\n \" Re-run with AGENTMEMORY_USE_DOCKER=1 npx @agentmemory/agentmemory\",\n \"\",\n \"Or skip the engine entirely (standalone MCP): npx @agentmemory/agentmemory mcp\",\n \"\",\n \"Docs: https://iii.dev/docs\",\n ];\n }\n const linuxInstall = releaseUrl\n ? ` A) curl -fsSL \"${releaseUrl}\" | tar -xz -C ~/.local/bin && chmod +x ~/.local/bin/iii`\n : ` A) Manual download: https://github.com/iii-hq/iii/releases/tag/iii%2Fv${IIPINNED_VERSION}`;\n return [\n `agentmemory needs iii-engine v${IIPINNED_VERSION}. Pick one:`,\n \"\",\n linuxInstall,\n \" Then re-run: npx @agentmemory/agentmemory\",\n \"\",\n ` B) Docker: docker pull iiidev/iii:${IIPINNED_VERSION}`,\n \" Re-run with AGENTMEMORY_USE_DOCKER=1 npx @agentmemory/agentmemory\",\n \"\",\n \"Or skip the engine entirely (standalone MCP): 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 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\n// Prefer the packaged `.env.example` (next to `dist/cli.mjs`); fall back to\n// the repo root when running from a source checkout.\nfunction findEnvExample(): string | null {\n const candidates = [\n join(__dirname, \"..\", \".env.example\"),\n join(__dirname, \".env.example\"),\n join(process.cwd(), \".env.example\"),\n ];\n for (const c of candidates) {\n if (existsSync(c)) return c;\n }\n return null;\n}\n\nasync function runInit() {\n p.intro(\"agentmemory init\");\n const target = join(homedir(), \".agentmemory\", \".env\");\n const template = findEnvExample();\n if (!template) {\n p.log.error(\n \"Could not locate .env.example in the package. Re-install with: npm i -g @agentmemory/agentmemory\",\n );\n process.exit(1);\n }\n const dir = dirname(target);\n const { mkdir, copyFile } = await import(\"node:fs/promises\");\n const { constants: fsConstants } = await import(\"node:fs\");\n try {\n await mkdir(dir, { recursive: true });\n // COPYFILE_EXCL collapses the exists-check + copy into one syscall —\n // an existsSync(target) + copyFile() pair races with a parallel init\n // (or any other process touching ~/.agentmemory/.env between the two\n // calls) and would silently overwrite a config the operator just\n // wrote. EEXIST out of copyFile is the only \"already configured\"\n // signal we trust.\n await copyFile(template, target, fsConstants.COPYFILE_EXCL);\n } catch (err) {\n if ((err as NodeJS.ErrnoException)?.code === \"EEXIST\") {\n p.log.warn(`${target} already exists — leaving it untouched.`);\n p.log.info(\n `Compare against the latest template: diff ${target} ${template}`,\n );\n p.outro(\"Nothing changed.\");\n return;\n }\n p.log.error(\n `Failed to copy template: ${err instanceof Error ? err.message : String(err)}`,\n );\n process.exit(1);\n }\n p.log.success(`Wrote ${target}`);\n p.note(\n [\n \"All keys are commented out by default. Uncomment the ones you want.\",\n \"\",\n \"Common next steps:\",\n \" 1. Pick an LLM provider key (ANTHROPIC_API_KEY / OPENAI_API_KEY / GEMINI_API_KEY / etc.)\",\n \" 2. Run `npx @agentmemory/agentmemory doctor` to verify the daemon sees them\",\n \" 3. Run `npx @agentmemory/agentmemory` to start the worker\",\n ].join(\"\\n\"),\n \"Next steps\",\n );\n p.outro(`Edit ${target} and you're set.`);\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 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 await runIiiInstaller();\n } else {\n p.log.info(\"Skipped 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\nfunction pidAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (err) {\n return (err as NodeJS.ErrnoException)?.code === \"EPERM\";\n }\n}\n\nasync function signalAndWait(\n pid: number,\n initialSignal: NodeJS.Signals,\n timeoutMs: number,\n): Promise<boolean> {\n try {\n process.kill(pid, initialSignal);\n } catch (err) {\n const code = (err as NodeJS.ErrnoException)?.code;\n if (code === \"ESRCH\") return true;\n if (code === \"EPERM\") {\n p.log.warn(`No permission to signal pid ${pid}. Try: kill ${pid}`);\n return false;\n }\n vlog(`${initialSignal} ${pid}: ${err instanceof Error ? err.message : String(err)}`);\n return false;\n }\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n if (!pidAlive(pid)) return true;\n await new Promise((r) => setTimeout(r, 200));\n }\n if (!pidAlive(pid)) return true;\n try {\n process.kill(pid, \"SIGKILL\");\n } catch (err) {\n if ((err as NodeJS.ErrnoException)?.code === \"ESRCH\") return true;\n vlog(`SIGKILL ${pid}: ${err instanceof Error ? err.message : String(err)}`);\n return false;\n }\n await new Promise((r) => setTimeout(r, 200));\n return !pidAlive(pid);\n}\n\nfunction findEnginePidsByPort(port: number): number[] {\n if (IS_WINDOWS) return [];\n const lsof = whichBinary(\"lsof\");\n if (!lsof) return [];\n // -sTCP:LISTEN restricts to listening server sockets only. Without\n // this, lsof also returns client-side PIDs (any process with an\n // active TCP connection to :port), which includes the agentmemory\n // CLI itself thanks to the keep-alive fetch in isEngineRunning().\n // signalAndWait would then SIGKILL its own parent — exit code 137.\n const selfPid = process.pid;\n try {\n const out = execFileSync(lsof, [\"-i\", `:${port}`, \"-sTCP:LISTEN\", \"-t\"], {\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n return out\n .split(/\\s+/)\n .map((s) => parseInt(s, 10))\n .filter((n) => Number.isFinite(n) && n > 0 && n !== selfPid);\n } catch (err) {\n vlog(`lsof :${port}: ${err instanceof Error ? err.message : String(err)}`);\n return [];\n }\n}\n\nasync function stopDockerEngine(composeFile: string, port: number): Promise<void> {\n const dockerBin = whichBinary(\"docker\");\n if (!dockerBin) {\n p.log.error(\n `Engine was started via Docker compose, but \\`docker\\` is no longer on PATH. Stop it manually:\\n docker compose -f ${composeFile} down`,\n );\n process.exit(1);\n }\n if (!existsSync(composeFile)) {\n p.log.error(\n `Engine state references ${composeFile}, but the file is gone. Stop it manually:\\n docker compose down (from the dir holding the original docker-compose.yml)`,\n );\n process.exit(1);\n }\n const ok = runCommand(dockerBin, [\"compose\", \"-f\", composeFile, \"down\"], {\n label: `docker compose -f ${composeFile} down`,\n });\n clearEnginePidfile();\n clearEngineState();\n if (!ok) {\n p.log.error(\n `docker compose down failed. The engine may still be running on :${port}. Inspect with:\\n docker compose -f ${composeFile} ps`,\n );\n process.exit(1);\n }\n p.outro(\"Stopped. Memories persisted to disk; restart anytime with: npx @agentmemory/agentmemory\");\n}\n\nasync function runStop(): Promise<void> {\n p.intro(\"agentmemory stop\");\n const port = getRestPort();\n const state = readEngineState();\n const running = await isEngineRunning();\n\n if (state?.kind === \"docker\") {\n if (!running) {\n p.log.info(`No engine responding on port ${port}.`);\n clearEnginePidfile();\n clearEngineState();\n p.outro(\"Nothing to stop.\");\n return;\n }\n await stopDockerEngine(state.composeFile, port);\n return;\n }\n\n const portPids = findEnginePidsByPort(port);\n const pidfilePid = readEnginePidfile();\n\n if (!running) {\n if (portPids.length === 0 && pidfilePid === null) {\n clearEnginePidfile();\n clearEngineState();\n p.outro(\"Nothing to stop.\");\n return;\n }\n const survivors = new Set<number>(portPids);\n if (pidfilePid) survivors.add(pidfilePid);\n p.log.warn(\n `Engine not responding on :${port}, but ${survivors.size} process(es) still hold the port or pidfile: ${[...survivors].join(\", \")}`,\n );\n p.log.info(\n `Preserving ~/.agentmemory/iii.pid. Investigate before manual cleanup:\\n ps -p ${[...survivors].join(\",\")} -o pid,ppid,comm,etime\\n ${IS_WINDOWS ? \"netstat -ano | findstr :\" + port : \"lsof -i :\" + port}`,\n );\n process.exit(1);\n }\n\n if (!state) {\n const compose = discoverComposeFile();\n if (compose && pidfilePid === null) {\n p.log.error(\n `Engine is running on :${port} but no pidfile or state file is present. It may have been started via Docker compose by a different shell. Refusing to signal host PIDs.\\n\\nStop it with:\\n docker compose -f ${compose} down\\n\\nOr re-run with AGENTMEMORY_USE_DOCKER=1 to record state next time.`,\n );\n process.exit(1);\n }\n }\n\n const candidates = new Set<number>();\n if (pidfilePid) candidates.add(pidfilePid);\n for (const pid of portPids) candidates.add(pid);\n\n if (candidates.size === 0) {\n p.log.error(\n `Could not locate engine process. Try:\\n ${IS_WINDOWS ? \"netstat -ano | findstr :\" + port : \"lsof -i :\" + port + \" -t | xargs kill -9\"}`,\n );\n process.exit(1);\n }\n\n let allStopped = true;\n for (const pid of candidates) {\n const s = p.spinner();\n s.start(`Stopping iii-engine (pid ${pid})...`);\n const ok = await signalAndWait(pid, \"SIGTERM\", 3000);\n s.stop(ok ? `Stopped pid ${pid}` : `Failed to stop pid ${pid}`);\n if (!ok) allStopped = false;\n }\n\n clearEnginePidfile();\n clearEngineState();\n if (!allStopped) {\n p.log.error(\"One or more engine processes survived SIGKILL. Investigate with `ps`.\");\n process.exit(1);\n }\n p.outro(\"Stopped. Memories persisted to disk; restart anytime with: npx @agentmemory/agentmemory\");\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 init: runInit,\n status: runStatus,\n doctor: runDoctor,\n demo: runDemo,\n upgrade: runUpgrade,\n stop: runStop,\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/index.mjs CHANGED
@@ -5956,7 +5956,7 @@ function registerAutoForgetFunction(sdk, kv) {
5956
5956
 
5957
5957
  //#endregion
5958
5958
  //#region src/version.ts
5959
- const VERSION = "0.9.13";
5959
+ const VERSION = "0.9.14";
5960
5960
 
5961
5961
  //#endregion
5962
5962
  //#region src/functions/export-import.ts
@@ -6087,7 +6087,8 @@ function registerExportImportFunction(sdk, kv) {
6087
6087
  "0.9.10",
6088
6088
  "0.9.11",
6089
6089
  "0.9.12",
6090
- "0.9.13"
6090
+ "0.9.13",
6091
+ "0.9.14"
6091
6092
  ]).has(importData.version)) return {
6092
6093
  success: false,
6093
6094
  error: `Unsupported export version: ${importData.version}`