@agentmemory/agentmemory 0.9.29 → 0.9.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/.env.example +83 -22
  2. package/AGENTS.md +17 -24
  3. package/README.md +447 -170
  4. package/dist/.env.example +83 -22
  5. package/dist/cli.d.mts.map +1 -1
  6. package/dist/cli.mjs +1221 -335
  7. package/dist/cli.mjs.map +1 -1
  8. package/dist/{connect-Qaeq15TQ.mjs → connect-B4_ca6BD.mjs} +30 -39
  9. package/dist/connect-B4_ca6BD.mjs.map +1 -0
  10. package/dist/docker-compose.yml +40 -14
  11. package/dist/hooks/_capture.d.mts +22 -0
  12. package/dist/hooks/_capture.d.mts.map +1 -0
  13. package/dist/hooks/_capture.mjs +908 -0
  14. package/dist/hooks/_capture.mjs.map +1 -0
  15. package/dist/hooks/antigravity-bridge.d.mts +1 -1
  16. package/dist/hooks/antigravity-bridge.d.mts.map +1 -1
  17. package/dist/hooks/antigravity-bridge.mjs +24 -15
  18. package/dist/hooks/antigravity-bridge.mjs.map +1 -1
  19. package/dist/hooks/notification.mjs +17 -25
  20. package/dist/hooks/notification.mjs.map +1 -1
  21. package/dist/hooks/post-commit.mjs +71 -1
  22. package/dist/hooks/post-commit.mjs.map +1 -1
  23. package/dist/hooks/post-tool-failure.mjs +59 -25
  24. package/dist/hooks/post-tool-failure.mjs.map +1 -1
  25. package/dist/hooks/post-tool-use.mjs +87 -35
  26. package/dist/hooks/post-tool-use.mjs.map +1 -1
  27. package/dist/hooks/pre-compact.mjs +83 -3
  28. package/dist/hooks/pre-compact.mjs.map +1 -1
  29. package/dist/hooks/pre-tool-use.mjs +71 -1
  30. package/dist/hooks/pre-tool-use.mjs.map +1 -1
  31. package/dist/hooks/prompt-submit.mjs +13 -21
  32. package/dist/hooks/prompt-submit.mjs.map +1 -1
  33. package/dist/hooks/session-end.mjs +25 -20
  34. package/dist/hooks/session-end.mjs.map +1 -1
  35. package/dist/hooks/session-start.mjs +80 -3
  36. package/dist/hooks/session-start.mjs.map +1 -1
  37. package/dist/hooks/stop.mjs +71 -1
  38. package/dist/hooks/stop.mjs.map +1 -1
  39. package/dist/hooks/subagent-start.mjs +16 -25
  40. package/dist/hooks/subagent-start.mjs.map +1 -1
  41. package/dist/hooks/subagent-stop.mjs +17 -25
  42. package/dist/hooks/subagent-stop.mjs.map +1 -1
  43. package/dist/hooks/task-completed.mjs +19 -27
  44. package/dist/hooks/task-completed.mjs.map +1 -1
  45. package/dist/iii-config.docker.yaml +10 -10
  46. package/dist/iii-config.yaml +3 -1
  47. package/dist/{image-refs-BKLmp_sD.mjs → image-refs-BaT-9oMU.mjs} +2 -2
  48. package/dist/image-refs-BaT-9oMU.mjs.map +1 -0
  49. package/dist/{image-refs-CJgZmb9X.mjs → image-refs-T_urbwHM.mjs} +3 -3
  50. package/dist/image-refs-T_urbwHM.mjs.map +1 -0
  51. package/dist/{keyed-mutex-DTHtcZrt.mjs → image-store-BsN4vyjr.mjs} +2 -14
  52. package/dist/image-store-BsN4vyjr.mjs.map +1 -0
  53. package/dist/index.mjs +12943 -6218
  54. package/dist/index.mjs.map +1 -1
  55. package/dist/{schema-BFZhNTF7.mjs → keyed-mutex-DchXsyfP.mjs} +28 -4
  56. package/dist/keyed-mutex-DchXsyfP.mjs.map +1 -0
  57. package/dist/secret-store-BnY3A50C.mjs +2348 -0
  58. package/dist/secret-store-BnY3A50C.mjs.map +1 -0
  59. package/dist/{src-G7yt8gGm.mjs → src-Jsq9LCeH.mjs} +5941 -2180
  60. package/dist/src-Jsq9LCeH.mjs.map +1 -0
  61. package/dist/{standalone-BqNJDJ04.mjs → standalone-DKCdrf1d.mjs} +39 -12
  62. package/dist/standalone-DKCdrf1d.mjs.map +1 -0
  63. package/dist/standalone.d.mts.map +1 -1
  64. package/dist/standalone.mjs +249 -14
  65. package/dist/standalone.mjs.map +1 -1
  66. package/dist/status-IRz7ta8-.mjs +2344 -0
  67. package/dist/status-IRz7ta8-.mjs.map +1 -0
  68. package/dist/viewer/index.html +7224 -2794
  69. package/docker-compose.yml +40 -14
  70. package/iii-config.docker.yaml +10 -10
  71. package/iii-config.yaml +3 -1
  72. package/integrations/pi/index.ts +2 -3
  73. package/integrations/pi/security.ts +52 -0
  74. package/package.json +13 -4
  75. package/plugin/.claude-plugin/plugin.json +2 -2
  76. package/plugin/.codex-plugin/plugin.json +26 -4
  77. package/plugin/.devin-plugin/plugin.json +1 -1
  78. package/plugin/.mcp.codex.json +12 -0
  79. package/plugin/.mcp.copilot.json +2 -7
  80. package/plugin/.mcp.json +2 -7
  81. package/plugin/assets/icon.svg +35 -0
  82. package/plugin/hooks/hooks.copilot.json +11 -11
  83. package/plugin/opencode/README.md +266 -30
  84. package/plugin/opencode/agentmemory-capture.ts +572 -3
  85. package/plugin/opencode/plugin.json +1 -1
  86. package/plugin/plugin.json +1 -1
  87. package/plugin/scripts/_capture.d.mts +22 -0
  88. package/plugin/scripts/_capture.d.mts.map +1 -0
  89. package/plugin/scripts/_capture.mjs +908 -0
  90. package/plugin/scripts/_capture.mjs.map +1 -0
  91. package/plugin/scripts/antigravity-bridge.d.mts +1 -1
  92. package/plugin/scripts/antigravity-bridge.d.mts.map +1 -1
  93. package/plugin/scripts/antigravity-bridge.mjs +24 -15
  94. package/plugin/scripts/antigravity-bridge.mjs.map +1 -1
  95. package/plugin/scripts/notification.mjs +17 -25
  96. package/plugin/scripts/notification.mjs.map +1 -1
  97. package/plugin/scripts/plugin-bridge.mjs +378 -0
  98. package/plugin/scripts/post-commit.mjs +71 -1
  99. package/plugin/scripts/post-commit.mjs.map +1 -1
  100. package/plugin/scripts/post-tool-failure.mjs +59 -25
  101. package/plugin/scripts/post-tool-failure.mjs.map +1 -1
  102. package/plugin/scripts/post-tool-use.mjs +87 -35
  103. package/plugin/scripts/post-tool-use.mjs.map +1 -1
  104. package/plugin/scripts/pre-compact.mjs +83 -3
  105. package/plugin/scripts/pre-compact.mjs.map +1 -1
  106. package/plugin/scripts/pre-tool-use.mjs +71 -1
  107. package/plugin/scripts/pre-tool-use.mjs.map +1 -1
  108. package/plugin/scripts/prompt-submit.mjs +13 -21
  109. package/plugin/scripts/prompt-submit.mjs.map +1 -1
  110. package/plugin/scripts/session-end.mjs +25 -20
  111. package/plugin/scripts/session-end.mjs.map +1 -1
  112. package/plugin/scripts/session-start.mjs +80 -3
  113. package/plugin/scripts/session-start.mjs.map +1 -1
  114. package/plugin/scripts/stop.mjs +71 -1
  115. package/plugin/scripts/stop.mjs.map +1 -1
  116. package/plugin/scripts/subagent-start.mjs +16 -25
  117. package/plugin/scripts/subagent-start.mjs.map +1 -1
  118. package/plugin/scripts/subagent-stop.mjs +17 -25
  119. package/plugin/scripts/subagent-stop.mjs.map +1 -1
  120. package/plugin/scripts/task-completed.mjs +19 -27
  121. package/plugin/scripts/task-completed.mjs.map +1 -1
  122. package/plugin/skills/_shared/TROUBLESHOOTING.md +22 -6
  123. package/plugin/skills/agentmemory-agents/REFERENCE.md +3 -3
  124. package/plugin/skills/agentmemory-config/REFERENCE.md +49 -1
  125. package/plugin/skills/agentmemory-config/SKILL.md +44 -7
  126. package/plugin/skills/agentmemory-mcp-tools/REFERENCE.md +1 -1
  127. package/plugin/skills/agentmemory-rest-api/REFERENCE.md +10 -2
  128. package/plugin/skills/handoff/SKILL.md +4 -2
  129. package/plugin/skills/memory-discipline/SKILL.md +13 -5
  130. package/dist/connect-Qaeq15TQ.mjs.map +0 -1
  131. package/dist/image-refs-BKLmp_sD.mjs.map +0 -1
  132. package/dist/image-refs-CJgZmb9X.mjs.map +0 -1
  133. package/dist/keyed-mutex-DTHtcZrt.mjs.map +0 -1
  134. package/dist/logger-BEB7pCI9.mjs +0 -43
  135. package/dist/logger-BEB7pCI9.mjs.map +0 -1
  136. package/dist/schema-BFZhNTF7.mjs.map +0 -1
  137. package/dist/src-G7yt8gGm.mjs.map +0 -1
  138. package/dist/standalone-BqNJDJ04.mjs.map +0 -1
  139. package/dist/tools-registry-BV_2bu7z.mjs +0 -1405
  140. package/dist/tools-registry-BV_2bu7z.mjs.map +0 -1
@@ -1,5 +1,5 @@
1
- import { i as generateId } from "./schema-BFZhNTF7.mjs";
2
- import { f as getStandalonePersistPath, i as VERSION, n as getAllTools } from "./tools-registry-BV_2bu7z.mjs";
1
+ import { o as generateId } from "./keyed-mutex-DchXsyfP.mjs";
2
+ import { A as getStandalonePersistPath, _ as VERSION, i as resolveClientSecret, m as getAllTools, s as queryAudit } from "./secret-store-BnY3A50C.mjs";
3
3
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
4
4
  import { dirname } from "node:path";
5
5
  //#region src/mcp/in-memory-kv.ts
@@ -46,6 +46,13 @@ var InMemoryKV = class {
46
46
  };
47
47
  //#endregion
48
48
  //#region src/mcp/transport.ts
49
+ var JsonRpcError = class extends Error {
50
+ constructor(code, message) {
51
+ super(message);
52
+ this.code = code;
53
+ this.name = "JsonRpcError";
54
+ }
55
+ };
49
56
  function isNotification(req) {
50
57
  return req.id === void 0 || req.id === null;
51
58
  }
@@ -111,7 +118,7 @@ async function processLine(line, handler, writeOut, writeErr = (msg) => process.
111
118
  jsonrpc: "2.0",
112
119
  id: request.id,
113
120
  error: {
114
- code: -32603,
121
+ code: err instanceof JsonRpcError ? err.code : -32603,
115
122
  message: err instanceof Error ? err.message : String(err)
116
123
  }
117
124
  });
@@ -232,6 +239,16 @@ function forceProxy() {
232
239
  const raw = process.env["AGENTMEMORY_FORCE_PROXY"];
233
240
  return raw === "1" || raw === "true";
234
241
  }
242
+ var ProxyCallError = class extends Error {
243
+ status;
244
+ body;
245
+ constructor(message, status, body) {
246
+ super(message);
247
+ this.name = "ProxyCallError";
248
+ this.status = status;
249
+ this.body = body;
250
+ }
251
+ };
235
252
  let cached = null;
236
253
  let cachedAt = 0;
237
254
  let probeInFlight = null;
@@ -245,7 +262,7 @@ function baseUrl() {
245
262
  return (resolveEnvOrEmpty("AGENTMEMORY_URL") || DEFAULT_URL).replace(/\/+$/, "");
246
263
  }
247
264
  function authHeader() {
248
- const secret = resolveEnvOrEmpty("AGENTMEMORY_SECRET");
265
+ const secret = resolveClientSecret(baseUrl());
249
266
  return secret ? { authorization: `Bearer ${secret}` } : {};
250
267
  }
251
268
  const defaultLivezProbe = async (url, timeoutMs, headers) => {
@@ -302,7 +319,16 @@ async function resolveHandle() {
302
319
  },
303
320
  signal: AbortSignal.timeout(CALL_TIMEOUT_MS)
304
321
  });
305
- if (!res.ok) throw new Error(`${init?.method || "GET"} ${path} -> ${res.status} ${res.statusText}`);
322
+ if (!res.ok) {
323
+ const errText = await res.text().catch(() => "");
324
+ let errBody = void 0;
325
+ if (errText) try {
326
+ errBody = JSON.parse(errText);
327
+ } catch {
328
+ errBody = void 0;
329
+ }
330
+ throw new ProxyCallError(`${init?.method || "GET"} ${path} -> ${res.status} ${res.statusText}`, res.status, errBody);
331
+ }
306
332
  const text = await res.text();
307
333
  return text ? JSON.parse(text) : null;
308
334
  }
@@ -472,7 +498,12 @@ async function handleProxy(v, handle) {
472
498
  reason: v.reason
473
499
  })
474
500
  }));
475
- case "memory_export": return textResponse(await handle.call("/agentmemory/export", { method: "GET" }), true);
501
+ case "memory_export": try {
502
+ return textResponse(await handle.call("/agentmemory/export", { method: "GET" }), true);
503
+ } catch (err) {
504
+ if (err instanceof ProxyCallError && err.body != null && typeof err.body === "object" && err.body.oversized === true) return textResponse(err.body, true);
505
+ throw err;
506
+ }
476
507
  case "memory_audit": return textResponse(await handle.call(`/agentmemory/audit?limit=${v.limit}`, { method: "GET" }), true);
477
508
  default: throw new Error(`Unknown tool: ${v.tool}`);
478
509
  }
@@ -541,11 +572,7 @@ async function handleLocal(v, kvInstance) {
541
572
  memories: await kvInstance.list("mem:memories"),
542
573
  sessions: await kvInstance.list("mem:sessions")
543
574
  }, true);
544
- case "memory_audit": {
545
- const entries = await kvInstance.list("mem:audit");
546
- const limit = v.limit ?? 50;
547
- return textResponse({ entries: entries.slice(0, limit) }, true);
548
- }
575
+ case "memory_audit": return textResponse(await queryAudit(kvInstance, { limit: v.limit ?? 50 }), true);
549
576
  default: throw new Error(`Unknown tool: ${v.tool}`);
550
577
  }
551
578
  }
@@ -652,4 +679,4 @@ process.on("SIGTERM", () => {
652
679
  //#endregion
653
680
  export {};
654
681
 
655
- //# sourceMappingURL=standalone-BqNJDJ04.mjs.map
682
+ //# sourceMappingURL=standalone-DKCdrf1d.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standalone-DKCdrf1d.mjs","names":[],"sources":["../src/mcp/in-memory-kv.ts","../src/mcp/transport.ts","../src/mcp/rest-proxy.ts","../src/mcp/standalone.ts"],"sourcesContent":["import { existsSync, readFileSync, writeFileSync, mkdirSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\n\nexport class InMemoryKV {\n private store = new Map<string, Map<string, unknown>>();\n\n constructor(private persistPath?: string) {\n if (persistPath && existsSync(persistPath)) {\n try {\n const data = JSON.parse(readFileSync(persistPath, \"utf-8\"));\n for (const [scope, entries] of Object.entries(data)) {\n const map = new Map<string, unknown>();\n for (const [key, value] of Object.entries(\n entries as Record<string, unknown>,\n )) {\n map.set(key, value);\n }\n this.store.set(scope, map);\n }\n } catch {\n // start fresh\n }\n }\n }\n\n async get<T = unknown>(scope: string, key: string): Promise<T | null> {\n return (this.store.get(scope)?.get(key) as T) ?? null;\n }\n\n async set<T = unknown>(scope: string, key: string, data: T): Promise<T> {\n if (!this.store.has(scope)) this.store.set(scope, new Map());\n this.store.get(scope)!.set(key, data);\n return data;\n }\n\n async delete(scope: string, key: string): Promise<void> {\n this.store.get(scope)?.delete(key);\n }\n\n async list<T = unknown>(scope: string): Promise<T[]> {\n const entries = this.store.get(scope);\n return entries ? (Array.from(entries.values()) as T[]) : [];\n }\n\n persist(): void {\n if (!this.persistPath) return;\n try {\n const dir = dirname(this.persistPath);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n const data: Record<string, Record<string, unknown>> = {};\n for (const [scope, entries] of this.store) {\n data[scope] = Object.fromEntries(entries);\n }\n writeFileSync(this.persistPath, JSON.stringify(data), \"utf-8\");\n } catch (err) {\n process.stderr.write(\n `[@agentmemory/mcp] Persist failed: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n }\n }\n}\n","export interface JsonRpcRequest {\n jsonrpc: \"2.0\";\n id?: string | number;\n method: string;\n params?: Record<string, unknown>;\n}\n\nexport interface JsonRpcResponse {\n jsonrpc: \"2.0\";\n id: string | number | null;\n result?: unknown;\n error?: { code: number; message: string; data?: unknown };\n}\n\nexport type RequestHandler = (\n method: string,\n params: Record<string, unknown>,\n) => Promise<unknown>;\n\nexport class JsonRpcError extends Error {\n constructor(public readonly code: number, message: string) {\n super(message);\n this.name = \"JsonRpcError\";\n }\n}\n\nexport interface StdioMessageParser {\n push: (chunk: Buffer | string) => void;\n isFramed: () => boolean;\n}\n\n// JSON-RPC 2.0 notifications are messages without an `id` field. The spec\n// (and the MCP transport contract) requires the server to NOT send a\n// response for notifications. Some clients tolerate spurious responses;\n// stricter clients (e.g. Codex CLI) treat them as protocol violations and\n// close the transport. See agentmemory#129.\nfunction isNotification(req: JsonRpcRequest): boolean {\n return req.id === undefined || req.id === null;\n}\n\n// Per JSON-RPC 2.0 §4, a valid request id must be a String, Number, or Null\n// (Null is technically only allowed in responses; in requests, omitting id\n// is the convention for notifications, which we treat the same as null).\n// Any other runtime type (object, array, boolean) is an Invalid Request.\nfunction isValidId(id: unknown): id is string | number | null | undefined {\n return (\n id === undefined ||\n id === null ||\n typeof id === \"string\" ||\n typeof id === \"number\"\n );\n}\n\n// Exported for unit tests so the line-handling logic is exercised\n// independently of process.stdin / process.stdout.\nexport async function processLine(\n line: string,\n handler: RequestHandler,\n writeOut: (response: JsonRpcResponse) => void,\n writeErr: (msg: string) => void = (msg) => process.stderr.write(msg),\n): Promise<void> {\n const trimmed = line.trim();\n if (!trimmed) return;\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed);\n } catch {\n writeOut({\n jsonrpc: \"2.0\",\n id: null,\n error: { code: -32700, message: \"Parse error\" },\n });\n return;\n }\n\n const request = parsed as JsonRpcRequest;\n const rawId = (request as { id?: unknown } | null)?.id;\n\n // Invalid request shape (missing/wrong jsonrpc, non-string method).\n if (\n !request ||\n typeof request !== \"object\" ||\n request.jsonrpc !== \"2.0\" ||\n typeof request.method !== \"string\"\n ) {\n // Echo the id back only if it's a valid string/number. Notifications\n // (missing/null id) and malformed ids both drop silently — we don't\n // want to respond to something that could be a notification, and we\n // can't invent an id for a malformed one.\n if (typeof rawId === \"string\" || typeof rawId === \"number\") {\n writeOut({\n jsonrpc: \"2.0\",\n id: rawId,\n error: { code: -32600, message: \"Invalid Request\" },\n });\n }\n return;\n }\n\n // Request shape is valid but id may still be of the wrong type\n // (object, array, boolean). Per the spec, that's an Invalid Request.\n // Respond with id: null because we can't safely echo a non-JSON-RPC id.\n if (!isValidId(rawId)) {\n writeOut({\n jsonrpc: \"2.0\",\n id: null,\n error: { code: -32600, message: \"Invalid Request: id must be string, number, or null\" },\n });\n return;\n }\n\n const notification = isNotification(request);\n\n try {\n const result = await handler(request.method, request.params || {});\n if (notification) return;\n writeOut({\n jsonrpc: \"2.0\",\n id: request.id as string | number,\n result,\n });\n } catch (err) {\n if (notification) {\n writeErr(\n `[mcp-transport] notification handler error for ${request.method}: ${\n err instanceof Error ? err.message : String(err)\n }\\n`,\n );\n return;\n }\n writeOut({\n jsonrpc: \"2.0\",\n id: request.id as string | number,\n error: {\n code: err instanceof JsonRpcError ? err.code : -32603,\n message: err instanceof Error ? err.message : String(err),\n },\n });\n }\n}\n\nfunction findHeaderEnd(buffer: Buffer): { headerEnd: number; bodyStart: number } | null {\n const crlf = buffer.indexOf(\"\\r\\n\\r\\n\");\n const lf = buffer.indexOf(\"\\n\\n\");\n if (crlf === -1 && lf === -1) return null;\n if (crlf !== -1 && (lf === -1 || crlf <= lf)) {\n return { headerEnd: crlf, bodyStart: crlf + 4 };\n }\n return { headerEnd: lf, bodyStart: lf + 2 };\n}\n\nfunction parseContentLength(header: string): number | null {\n for (const line of header.split(/\\r?\\n/)) {\n const match = line.match(/^content-length:\\s*(\\d+)\\s*$/i);\n if (match) return Number(match[1]);\n }\n return null;\n}\n\nexport function formatResponse(\n response: JsonRpcResponse,\n framed: boolean,\n): string | Buffer[] {\n const body = JSON.stringify(response);\n if (!framed) return `${body}\\n`;\n const bytes = Buffer.from(body, \"utf8\");\n return [Buffer.from(`Content-Length: ${bytes.length}\\r\\n\\r\\n`, \"ascii\"), bytes];\n}\n\nexport function createMessageParser(\n onMessage: (message: string) => void,\n writeErr: (msg: string) => void = (msg) => process.stderr.write(msg),\n): StdioMessageParser {\n let buffer = Buffer.alloc(0);\n let framed = false;\n\n function processBuffer(): void {\n while (buffer.length > 0) {\n if (buffer[0] === 10 || buffer[0] === 13) {\n buffer = buffer.subarray(1);\n continue;\n }\n\n const preview = buffer.toString(\"ascii\", 0, Math.min(buffer.length, 32));\n if (/^content-length:/i.test(preview)) {\n const header = findHeaderEnd(buffer);\n if (!header) return;\n\n const headerText = buffer.subarray(0, header.headerEnd).toString(\"ascii\");\n const contentLength = parseContentLength(headerText);\n if (contentLength === null) {\n writeErr(\"[mcp-transport] missing Content-Length header\\n\");\n buffer = buffer.subarray(header.bodyStart);\n continue;\n }\n\n const messageEnd = header.bodyStart + contentLength;\n if (buffer.length < messageEnd) return;\n\n framed = true;\n const message = buffer.subarray(header.bodyStart, messageEnd).toString(\"utf8\");\n buffer = buffer.subarray(messageEnd);\n onMessage(message);\n continue;\n }\n\n const newline = buffer.indexOf(10);\n if (newline === -1) return;\n const line = buffer\n .subarray(0, newline)\n .toString(\"utf8\")\n .replace(/\\r$/, \"\");\n buffer = buffer.subarray(newline + 1);\n onMessage(line);\n }\n }\n\n return {\n push(chunk) {\n const bytes = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, \"utf8\");\n buffer = Buffer.concat([buffer, bytes]);\n processBuffer();\n },\n isFramed() {\n return framed;\n },\n };\n}\n\nexport function createStdioTransport(handler: RequestHandler): {\n start: () => void;\n stop: () => void;\n} {\n let parser: StdioMessageParser | null = null;\n let queue = Promise.resolve();\n\n const writeResponse = (response: JsonRpcResponse) => {\n const formatted = formatResponse(response, parser?.isFramed() ?? false);\n if (typeof formatted === \"string\") {\n process.stdout.write(formatted);\n return;\n }\n for (const chunk of formatted) {\n process.stdout.write(chunk);\n }\n };\n\n const onData = (chunk: Buffer) => parser?.push(chunk);\n\n return {\n start() {\n parser = createMessageParser((message) => {\n queue = queue.then(() => processLine(message, handler, writeResponse));\n void queue.catch((err) => {\n process.stderr.write(\n `[mcp-transport] request processing failed: ${\n err instanceof Error ? err.message : String(err)\n }\\n`,\n );\n });\n });\n process.stdin.on(\"data\", onData);\n },\n stop() {\n process.stdin.off(\"data\", onData);\n parser = null;\n },\n };\n}\n","import { resolveClientSecret } from \"../secret-store.js\";\nconst DEFAULT_URL = \"http://localhost:3111\";\nconst DEFAULT_HEALTH_PROBE_TIMEOUT_MS = 2_000;\nconst CALL_TIMEOUT_MS = 15_000;\nconst LOCAL_MODE_TTL_MS = 30_000;\n\nfunction probeTimeoutMs(): number {\n const raw = process.env[\"AGENTMEMORY_PROBE_TIMEOUT_MS\"];\n if (!raw) return DEFAULT_HEALTH_PROBE_TIMEOUT_MS;\n const n = Number(raw);\n return Number.isFinite(n) && n > 0 ? Math.floor(n) : DEFAULT_HEALTH_PROBE_TIMEOUT_MS;\n}\n\nfunction forceProxy(): boolean {\n const raw = process.env[\"AGENTMEMORY_FORCE_PROXY\"];\n return raw === \"1\" || raw === \"true\";\n}\n\nexport interface ProxyHandle {\n mode: \"proxy\";\n baseUrl: string;\n call: (path: string, init?: RequestInit) => Promise<unknown>;\n}\n\nexport class ProxyCallError extends Error {\n status: number;\n body: unknown;\n\n constructor(message: string, status: number, body: unknown) {\n super(message);\n this.name = \"ProxyCallError\";\n this.status = status;\n this.body = body;\n }\n}\n\nexport interface LocalHandle {\n mode: \"local\";\n}\n\nexport type Handle = ProxyHandle | LocalHandle;\n\nlet cached: Handle | null = null;\nlet cachedAt = 0;\nlet probeInFlight: Promise<Handle> | null = null;\n\n// `${VAR}`-style placeholders ship in plugin/.mcp.json so MCP hosts that\n// expand them (Claude Code, Cursor) substitute the user's shell value.\n// Hosts that DON'T expand pass the literal string `\"${AGENTMEMORY_URL}\"`\n// through to our subprocess — that string is truthy, defeats the `||`\n// fallback, and would have us POST to `${AGENTMEMORY_URL}/agentmemory/...`\n// (DNS failure). Strip any literal placeholder we see so the fallback\n// engages instead.\nexport function resolveEnvOrEmpty(name: string): string {\n const raw = process.env[name];\n if (!raw) return \"\";\n if (raw.startsWith(\"${\") && raw.endsWith(\"}\")) return \"\";\n return raw;\n}\n\nfunction baseUrl(): string {\n return (resolveEnvOrEmpty(\"AGENTMEMORY_URL\") || DEFAULT_URL).replace(/\\/+$/, \"\");\n}\n\nfunction authHeader(): Record<string, string> {\n const secret = resolveClientSecret(baseUrl());\n return secret ? { authorization: `Bearer ${secret}` } : {};\n}\n\nexport type LivezProbe = (\n url: string,\n timeoutMs: number,\n headers: Record<string, string>,\n) => Promise<{ ok: boolean; status?: number; statusText?: string }>;\n\nconst defaultLivezProbe: LivezProbe = async (url, timeoutMs, headers) => {\n const res = await fetch(`${url}/agentmemory/livez`, {\n method: \"GET\",\n headers,\n signal: AbortSignal.timeout(timeoutMs),\n });\n return { ok: res.ok, status: res.status, statusText: res.statusText };\n};\n\nlet livezProbe: LivezProbe = defaultLivezProbe;\n\n/**\n * Override the livez probe. Intended for tests — production code should rely\n * on the default fetch-based probe. Calling without an argument restores the\n * default. Pair with {@link resetHandleForTests} so the cached handle is\n * dropped before the next call.\n */\nexport function setLivezProbe(fn?: LivezProbe): void {\n livezProbe = fn ?? defaultLivezProbe;\n}\n\nasync function probe(url: string): Promise<boolean> {\n const timeout = probeTimeoutMs();\n try {\n const res = await livezProbe(url, timeout, authHeader());\n if (!res.ok) {\n process.stderr.write(\n `[@agentmemory/mcp] livez probe ${url}/agentmemory/livez -> ${res.status ?? \"?\"} ${res.statusText ?? \"\"}; falling back to local InMemoryKV (set AGENTMEMORY_FORCE_PROXY=1 to skip the probe)\\n`,\n );\n }\n return res.ok;\n } catch (err) {\n process.stderr.write(\n `[@agentmemory/mcp] livez probe ${url}/agentmemory/livez failed in ${timeout}ms: ${err instanceof Error ? err.message : String(err)}; falling back to local InMemoryKV (set AGENTMEMORY_FORCE_PROXY=1 to skip the probe, or raise AGENTMEMORY_PROBE_TIMEOUT_MS)\\n`,\n );\n return false;\n }\n}\n\nexport function invalidateHandle(): void {\n cached = null;\n cachedAt = 0;\n}\n\nexport async function resolveHandle(): Promise<Handle> {\n const now = Date.now();\n if (cached) {\n if (cached.mode === \"local\" && now - cachedAt >= LOCAL_MODE_TTL_MS) {\n cached = null;\n cachedAt = 0;\n } else {\n return cached;\n }\n }\n if (probeInFlight) return probeInFlight;\n const url = baseUrl();\n const skipProbe = forceProxy();\n probeInFlight = (async () => {\n const up = skipProbe ? true : await probe(url);\n if (skipProbe) {\n process.stderr.write(\n `[@agentmemory/mcp] AGENTMEMORY_FORCE_PROXY set; skipping livez probe and trusting ${url}\\n`,\n );\n }\n if (up) {\n const handle: ProxyHandle = {\n mode: \"proxy\",\n baseUrl: url,\n call: async (path, init) => {\n const res = await fetch(`${url}${path}`, {\n ...init,\n headers: {\n \"content-type\": \"application/json\",\n ...authHeader(),\n ...(init?.headers as Record<string, string> | undefined),\n },\n signal: AbortSignal.timeout(CALL_TIMEOUT_MS),\n });\n if (!res.ok) {\n const errText = await res.text().catch(() => \"\");\n let errBody: unknown = undefined;\n if (errText) {\n try {\n errBody = JSON.parse(errText);\n } catch {\n errBody = undefined;\n }\n }\n throw new ProxyCallError(\n `${init?.method || \"GET\"} ${path} -> ${res.status} ${res.statusText}`,\n res.status,\n errBody,\n );\n }\n const text = await res.text();\n return text ? JSON.parse(text) : null;\n },\n };\n cached = handle;\n cachedAt = Date.now();\n return handle;\n }\n const local: LocalHandle = { mode: \"local\" };\n cached = local;\n cachedAt = Date.now();\n return local;\n })();\n try {\n return await probeInFlight;\n } finally {\n probeInFlight = null;\n }\n}\n\nexport function resetHandleForTests(): void {\n cached = null;\n cachedAt = 0;\n probeInFlight = null;\n livezProbe = defaultLivezProbe;\n}\n","#!/usr/bin/env node\n\nimport { InMemoryKV } from \"./in-memory-kv.js\";\nimport { createStdioTransport } from \"./transport.js\";\nimport { getAllTools } from \"./tools-registry.js\";\nimport { getStandalonePersistPath } from \"../config.js\";\nimport { VERSION } from \"../version.js\";\nimport { generateId } from \"../state/schema.js\";\nimport { queryAudit } from \"../functions/audit.js\";\nimport {\n resolveHandle,\n invalidateHandle,\n ProxyCallError,\n type Handle,\n type ProxyHandle,\n} from \"./rest-proxy.js\";\n\nconst IMPLEMENTED_TOOLS = new Set([\n \"memory_save\",\n \"memory_recall\",\n \"memory_smart_search\",\n \"memory_sessions\",\n \"memory_export\",\n \"memory_audit\",\n \"memory_governance_delete\",\n]);\n\nconst SUPPORTED_PROTOCOL_VERSIONS = [\n \"2025-11-25\",\n \"2025-06-18\",\n \"2025-03-26\",\n \"2024-11-05\",\n];\n\nconst SERVER_INFO = {\n name: \"agentmemory\",\n version: VERSION,\n};\n\nconst kv = new InMemoryKV(getStandalonePersistPath());\nlet modeAnnounced = false;\n\nfunction displayAgentmemoryUrl(): string {\n // Match the literal-placeholder guard in rest-proxy.ts so log lines\n // don't show `${AGENTMEMORY_URL}` when an MCP host passed the\n // placeholder through unexpanded.\n const raw = process.env[\"AGENTMEMORY_URL\"];\n if (!raw || (raw.startsWith(\"${\") && raw.endsWith(\"}\"))) {\n return \"http://localhost:3111\";\n }\n return raw;\n}\n\nfunction announceMode(handle: Handle): void {\n if (modeAnnounced) return;\n modeAnnounced = true;\n if (handle.mode === \"proxy\") {\n process.stderr.write(\n `[@agentmemory/mcp] proxying to agentmemory server at ${handle.baseUrl}\\n`,\n );\n } else {\n const fullToolCount = getAllTools().length;\n process.stderr.write(\n `[@agentmemory/mcp] no server reachable at ${displayAgentmemoryUrl()}; running reduced LOCAL FALLBACK with ${IMPLEMENTED_TOOLS.size} of ${fullToolCount} tools. Start 'npx @agentmemory/agentmemory' (and point AGENTMEMORY_URL at it) to unlock all ${fullToolCount} tools.\\n`,\n );\n }\n}\n\nfunction normalizeList(value: unknown): string[] {\n if (!value) return [];\n if (Array.isArray(value)) {\n return value\n .map((v) => (typeof v === \"string\" ? v.trim() : \"\"))\n .filter((v) => v.length > 0);\n }\n if (typeof value === \"string\") {\n return value\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n }\n return [];\n}\n\nconst DEFAULT_LIMIT = 10;\nconst MAX_LIMIT = 100;\nfunction parseLimit(raw: unknown, fallback = DEFAULT_LIMIT): number {\n if (typeof raw !== \"number\" && typeof raw !== \"string\") return fallback;\n const n = Number(raw);\n if (!Number.isFinite(n) || n <= 0) return fallback;\n return Math.min(Math.floor(n), MAX_LIMIT);\n}\n\nfunction textResponse(payload: unknown, pretty = false): {\n content: Array<{ type: string; text: string }>;\n} {\n return {\n content: [\n { type: \"text\", text: JSON.stringify(payload, null, pretty ? 2 : 0) },\n ],\n };\n}\n\ninterface Validated {\n tool: string;\n content?: string;\n type?: string;\n concepts?: string[];\n files?: string[];\n project?: string;\n agentId?: string;\n query?: string;\n limit?: number;\n format?: string;\n tokenBudget?: number;\n memoryIds?: string[];\n reason?: string;\n}\n\nfunction validate(toolName: string, args: Record<string, unknown>): Validated {\n if (!IMPLEMENTED_TOOLS.has(toolName)) {\n throw new Error(`Unknown tool: ${toolName}`);\n }\n const v: Validated = { tool: toolName };\n switch (toolName) {\n case \"memory_save\": {\n const content = args[\"content\"];\n if (typeof content !== \"string\" || !content.trim()) {\n throw new Error(\"content is required\");\n }\n v.content = content;\n v.type = (args[\"type\"] as string) || \"fact\";\n v.concepts = normalizeList(args[\"concepts\"]);\n v.files = normalizeList(args[\"files\"]);\n // The tool schema exposes project (and now agentId); dropping them\n // here silently broke project/agent scoping through the stdio\n // package specifically.\n if (typeof args[\"project\"] === \"string\" && args[\"project\"].trim()) {\n v.project = args[\"project\"].trim();\n }\n if (typeof args[\"agentId\"] === \"string\" && args[\"agentId\"].trim()) {\n v.agentId = args[\"agentId\"].trim();\n }\n return v;\n }\n case \"memory_recall\":\n case \"memory_smart_search\": {\n const query = args[\"query\"];\n if (typeof query !== \"string\" || !query.trim()) {\n throw new Error(\"query is required\");\n }\n v.query = query.trim();\n v.limit = parseLimit(args[\"limit\"]);\n const fmt = args[\"format\"];\n if (typeof fmt === \"string\" && fmt.trim()) {\n v.format = fmt.trim().toLowerCase();\n }\n const budget = args[\"token_budget\"];\n if (typeof budget === \"number\" && Number.isFinite(budget) && budget > 0) {\n v.tokenBudget = Math.floor(budget);\n } else if (typeof budget === \"string\" && budget.trim()) {\n const n = Number(budget);\n if (Number.isFinite(n) && n > 0) v.tokenBudget = Math.floor(n);\n }\n return v;\n }\n case \"memory_sessions\": {\n v.limit = parseLimit(args[\"limit\"], 20);\n return v;\n }\n case \"memory_governance_delete\": {\n const ids = normalizeList(args[\"memoryIds\"]);\n if (ids.length === 0) throw new Error(\"memoryIds is required\");\n v.memoryIds = ids;\n v.reason = (args[\"reason\"] as string) || \"plugin skill request\";\n return v;\n }\n case \"memory_export\":\n return v;\n case \"memory_audit\": {\n v.limit = parseLimit(args[\"limit\"], 50);\n return v;\n }\n default:\n throw new Error(`Unknown tool: ${toolName}`);\n }\n}\n\nasync function handleProxy(\n v: Validated,\n handle: ProxyHandle,\n): Promise<{ content: Array<{ type: string; text: string }> }> {\n switch (v.tool) {\n case \"memory_save\": {\n const result = await handle.call(\"/agentmemory/remember\", {\n method: \"POST\",\n body: JSON.stringify({\n content: v.content,\n type: v.type,\n concepts: v.concepts,\n files: v.files,\n ...(v.project !== undefined && { project: v.project }),\n ...(v.agentId !== undefined && { agentId: v.agentId }),\n }),\n });\n return textResponse(result);\n }\n case \"memory_recall\": {\n const body: Record<string, unknown> = {\n query: v.query,\n limit: v.limit,\n format: v.format ?? \"full\",\n };\n if (v.tokenBudget != null) body[\"token_budget\"] = v.tokenBudget;\n const result = await handle.call(\"/agentmemory/search\", {\n method: \"POST\",\n body: JSON.stringify(body),\n });\n return textResponse(result, true);\n }\n case \"memory_smart_search\": {\n const body: Record<string, unknown> = { query: v.query, limit: v.limit };\n if (v.format != null) body[\"format\"] = v.format;\n if (v.tokenBudget != null) body[\"token_budget\"] = v.tokenBudget;\n const result = await handle.call(\"/agentmemory/smart-search\", {\n method: \"POST\",\n body: JSON.stringify(body),\n });\n return textResponse(result, true);\n }\n case \"memory_sessions\": {\n const result = await handle.call(\n `/agentmemory/sessions?limit=${v.limit}`,\n { method: \"GET\" },\n );\n return textResponse(result, true);\n }\n case \"memory_governance_delete\": {\n const result = await handle.call(\"/agentmemory/governance/memories\", {\n method: \"DELETE\",\n body: JSON.stringify({ memoryIds: v.memoryIds, reason: v.reason }),\n });\n return textResponse(result);\n }\n case \"memory_export\": {\n try {\n const result = await handle.call(\"/agentmemory/export\", { method: \"GET\" });\n return textResponse(result, true);\n } catch (err) {\n if (\n err instanceof ProxyCallError &&\n err.body != null &&\n typeof err.body === \"object\" &&\n (err.body as { oversized?: boolean }).oversized === true\n ) {\n return textResponse(err.body, true);\n }\n throw err;\n }\n }\n case \"memory_audit\": {\n const result = await handle.call(\n `/agentmemory/audit?limit=${v.limit}`,\n { method: \"GET\" },\n );\n return textResponse(result, true);\n }\n default:\n throw new Error(`Unknown tool: ${v.tool}`);\n }\n}\n\nasync function handleLocal(\n v: Validated,\n kvInstance: InMemoryKV,\n): Promise<{ content: Array<{ type: string; text: string }> }> {\n switch (v.tool) {\n case \"memory_save\": {\n const id = generateId(\"mem\");\n const isoNow = new Date().toISOString();\n await kvInstance.set(\"mem:memories\", id, {\n id,\n type: v.type,\n title: (v.content || \"\").slice(0, 80),\n content: v.content,\n concepts: v.concepts,\n files: v.files,\n createdAt: isoNow,\n updatedAt: isoNow,\n strength: 7,\n version: 1,\n isLatest: true,\n sessionIds: [],\n });\n kvInstance.persist();\n return textResponse({ saved: id });\n }\n\n case \"memory_recall\":\n case \"memory_smart_search\": {\n const query = (v.query || \"\").toLowerCase();\n const limit = v.limit ?? DEFAULT_LIMIT;\n const all =\n await kvInstance.list<Record<string, unknown>>(\"mem:memories\");\n const results = all\n .filter((m) => {\n const text = [\n typeof m[\"title\"] === \"string\" ? m[\"title\"] : \"\",\n typeof m[\"content\"] === \"string\" ? m[\"content\"] : \"\",\n Array.isArray(m[\"files\"]) ? m[\"files\"].join(\" \") : \"\",\n Array.isArray(m[\"concepts\"]) ? m[\"concepts\"].join(\" \") : \"\",\n Array.isArray(m[\"sessionIds\"]) ? m[\"sessionIds\"].join(\" \") : \"\",\n typeof m[\"id\"] === \"string\" ? m[\"id\"] : \"\",\n ]\n .join(\" \")\n .toLowerCase();\n return query.split(/\\s+/).every((word) => text.includes(word));\n })\n .slice(0, limit);\n return textResponse({ mode: \"compact\", results }, true);\n }\n\n case \"memory_sessions\": {\n const sessions =\n await kvInstance.list<Record<string, unknown>>(\"mem:sessions\");\n const limit = v.limit ?? 20;\n return textResponse({ sessions: sessions.slice(0, limit) }, true);\n }\n\n case \"memory_governance_delete\": {\n let deleted = 0;\n for (const id of v.memoryIds || []) {\n const existing = await kvInstance.get(\"mem:memories\", id);\n if (existing) {\n await kvInstance.delete(\"mem:memories\", id);\n deleted++;\n }\n }\n kvInstance.persist();\n return textResponse({\n deleted,\n requested: (v.memoryIds || []).length,\n reason: v.reason,\n });\n }\n\n case \"memory_export\": {\n const memories = await kvInstance.list(\"mem:memories\");\n const sessions = await kvInstance.list(\"mem:sessions\");\n return textResponse({ version: VERSION, memories, sessions }, true);\n }\n\n case \"memory_audit\": {\n const result = await queryAudit(kvInstance as never, {\n limit: v.limit ?? 50,\n });\n return textResponse(result, true);\n }\n\n default:\n throw new Error(`Unknown tool: ${v.tool}`);\n }\n}\n\nasync function handleProxyGeneric(\n toolName: string,\n args: Record<string, unknown>,\n handle: ProxyHandle,\n): Promise<{ content: Array<{ type: string; text: string }> }> {\n // Forward to the server's full MCP surface so non-Claude clients can\n // reach all 54 tools (lessons, sentinels, slots, signals, graph, …)\n // instead of being capped at the 7 IMPLEMENTED_TOOLS set baked into\n // this shim. The server validates arguments per tool.\n const result = (await handle.call(\"/agentmemory/mcp/call\", {\n method: \"POST\",\n body: JSON.stringify({ name: toolName, arguments: args }),\n })) as { content?: Array<{ type: string; text: string }> } | null;\n if (result && Array.isArray(result.content)) {\n return { content: result.content };\n }\n return textResponse(result, true);\n}\n\nexport async function handleToolCall(\n toolName: string,\n args: Record<string, unknown>,\n kvInstance: InMemoryKV = kv,\n): Promise<{ content: Array<{ type: string; text: string }> }> {\n const handle = await resolveHandle();\n announceMode(handle);\n\n if (!IMPLEMENTED_TOOLS.has(toolName)) {\n if (handle.mode === \"proxy\") {\n try {\n return await handleProxyGeneric(toolName, args, handle);\n } catch (err) {\n process.stderr.write(\n `[@agentmemory/mcp] proxy call failed for ${toolName}: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n invalidateHandle();\n throw err;\n }\n }\n throw new Error(\n `Unknown tool: ${toolName} (local fallback supports only ${[...IMPLEMENTED_TOOLS].join(\", \")}; start an agentmemory server and set AGENTMEMORY_URL to use the full tool set)`,\n );\n }\n\n const validated = validate(toolName, args);\n if (handle.mode === \"proxy\") {\n try {\n return await handleProxy(validated, handle);\n } catch (err) {\n process.stderr.write(\n `[@agentmemory/mcp] proxy call failed for ${toolName}: ${err instanceof Error ? err.message : String(err)}; invalidating handle and falling back to local KV\\n`,\n );\n invalidateHandle();\n }\n }\n return handleLocal(validated, kvInstance);\n}\n\nexport async function handleToolsList(): Promise<{ tools: unknown[] }> {\n const debug = process.env[\"AGENTMEMORY_DEBUG\"] === \"1\" || process.env[\"AGENTMEMORY_DEBUG\"] === \"true\";\n const handle = await resolveHandle();\n announceMode(handle);\n if (debug) {\n process.stderr.write(\n `[@agentmemory/mcp] tools/list: handle.mode=${handle.mode}${handle.mode === \"proxy\" ? ` baseUrl=${handle.baseUrl}` : \"\"}\\n`,\n );\n }\n if (handle.mode === \"proxy\") {\n try {\n const remote = (await handle.call(\"/agentmemory/mcp/tools\", {\n method: \"GET\",\n })) as { tools?: unknown } | null;\n if (debug) {\n const shape = remote === null\n ? \"null\"\n : typeof remote !== \"object\"\n ? typeof remote\n : `keys=${Object.keys(remote as object).join(\",\")} toolsType=${Array.isArray((remote as { tools?: unknown }).tools) ? `array(len=${((remote as { tools: unknown[] }).tools).length})` : typeof (remote as { tools?: unknown }).tools}`;\n process.stderr.write(\n `[@agentmemory/mcp] tools/list: remote response shape: ${shape}\\n`,\n );\n }\n if (remote && Array.isArray(remote.tools)) {\n if (debug) {\n process.stderr.write(\n `[@agentmemory/mcp] tools/list: returning ${remote.tools.length} tools from server\\n`,\n );\n }\n return { tools: remote.tools };\n }\n process.stderr.write(\n `[@agentmemory/mcp] tools/list: server returned unexpected shape (no .tools array); falling back to local IMPLEMENTED_TOOLS list. Set AGENTMEMORY_DEBUG=1 to inspect response.\\n`,\n );\n } catch (err) {\n process.stderr.write(\n `[@agentmemory/mcp] tools/list proxy failed: ${err instanceof Error ? err.message : String(err)}; falling back to local list\\n`,\n );\n invalidateHandle();\n }\n }\n const fallback = getAllTools().filter((t) => IMPLEMENTED_TOOLS.has(t.name));\n if (debug) {\n process.stderr.write(\n `[@agentmemory/mcp] tools/list: returning ${fallback.length} local fallback tools (${fallback.map((t) => t.name).join(\",\")})\\n`,\n );\n }\n return { tools: fallback };\n}\n\nconst transport = createStdioTransport(async (method, params) => {\n switch (method) {\n case \"initialize\": {\n const requested = (params as { protocolVersion?: unknown } | undefined)\n ?.protocolVersion;\n const protocolVersion =\n typeof requested === \"string\" &&\n SUPPORTED_PROTOCOL_VERSIONS.includes(requested)\n ? requested\n : SUPPORTED_PROTOCOL_VERSIONS[0];\n return {\n protocolVersion,\n capabilities: { tools: { listChanged: false } },\n serverInfo: {\n name: SERVER_INFO.name,\n version: SERVER_INFO.version,\n },\n };\n }\n\n case \"notifications/initialized\":\n return {};\n\n case \"tools/list\":\n return handleToolsList();\n\n case \"tools/call\": {\n const toolName = params.name as string;\n const toolArgs = (params.arguments as Record<string, unknown>) || {};\n try {\n return await handleToolCall(toolName, toolArgs);\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `Error: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n isError: true,\n };\n }\n }\n\n default:\n throw new Error(`Unknown method: ${method}`);\n }\n});\n\nprocess.stderr.write(\n `[@agentmemory/mcp] Standalone MCP server v${SERVER_INFO.version} starting...\\n`,\n);\ntransport.start();\n\nprocess.on(\"SIGINT\", () => {\n kv.persist();\n process.exit(0);\n});\nprocess.on(\"SIGTERM\", () => {\n kv.persist();\n process.exit(0);\n});\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"standalone.d.mts","names":[],"sources":["../src/mcp/in-memory-kv.ts","../src/mcp/standalone.ts"],"mappings":";cAGa,UAAA;EAAA,QAGS,WAAA;EAAA,QAFZ,KAAA;cAEY,WAAA;EAmBd,GAAA,aAAA,CAAiB,KAAA,UAAe,GAAA,WAAc,OAAA,CAAQ,CAAA;EAItD,GAAA,aAAA,CAAiB,KAAA,UAAe,GAAA,UAAa,IAAA,EAAM,CAAA,GAAI,OAAA,CAAQ,CAAA;EAM/D,MAAA,CAAO,KAAA,UAAe,GAAA,WAAc,OAAA;EAIpC,IAAA,aAAA,CAAkB,KAAA,WAAgB,OAAA,CAAQ,CAAA;EAKhD,OAAA,CAAA;AAAA;;;iBCyUoB,cAAA,CACpB,QAAA,UACA,IAAA,EAAM,MAAA,mBACN,UAAA,GAAY,UAAA,GACX,OAAA;EAAU,OAAA,EAAS,KAAA;IAAQ,IAAA;IAAc,IAAA;EAAA;AAAA;AAAA,iBAsCtB,eAAA,CAAA,GAAmB,OAAA;EAAU,KAAA;AAAA"}
1
+ {"version":3,"file":"standalone.d.mts","names":[],"sources":["../src/mcp/in-memory-kv.ts","../src/mcp/standalone.ts"],"mappings":";cAGa,UAAA;EAAA,QAGS,WAAA;EAAA,QAFZ,KAAA;cAEY,WAAA;EAmBd,GAAA,aAAA,CAAiB,KAAA,UAAe,GAAA,WAAc,OAAA,CAAQ,CAAA;EAItD,GAAA,aAAA,CAAiB,KAAA,UAAe,GAAA,UAAa,IAAA,EAAM,CAAA,GAAI,OAAA,CAAQ,CAAA;EAM/D,MAAA,CAAO,KAAA,UAAe,GAAA,WAAc,OAAA;EAIpC,IAAA,aAAA,CAAkB,KAAA,WAAgB,OAAA,CAAQ,CAAA;EAKhD,OAAA,CAAA;AAAA;;;iBCmVoB,cAAA,CACpB,QAAA,UACA,IAAA,EAAM,MAAA,mBACN,UAAA,GAAY,UAAA,GACX,OAAA;EAAU,OAAA,EAAS,KAAA;IAAQ,IAAA;IAAc,IAAA;EAAA;AAAA;AAAA,iBAmCtB,eAAA,CAAA,GAAmB,OAAA;EAAU,KAAA;AAAA"}
@@ -48,6 +48,13 @@ var InMemoryKV = class {
48
48
  };
49
49
  //#endregion
50
50
  //#region src/mcp/transport.ts
51
+ var JsonRpcError = class extends Error {
52
+ constructor(code, message) {
53
+ super(message);
54
+ this.code = code;
55
+ this.name = "JsonRpcError";
56
+ }
57
+ };
51
58
  function isNotification(req) {
52
59
  return req.id === void 0 || req.id === null;
53
60
  }
@@ -113,7 +120,7 @@ async function processLine(line, handler, writeOut, writeErr = (msg) => process.
113
120
  jsonrpc: "2.0",
114
121
  id: request.id,
115
122
  error: {
116
- code: -32603,
123
+ code: err instanceof JsonRpcError ? err.code : -32603,
117
124
  message: err instanceof Error ? err.message : String(err)
118
125
  }
119
126
  });
@@ -316,10 +323,16 @@ const CORE_TOOLS = [
316
323
  description: "Detect recurring patterns across sessions.",
317
324
  inputSchema: {
318
325
  type: "object",
319
- properties: { project: {
320
- type: "string",
321
- description: "Project path to analyze"
322
- } }
326
+ properties: {
327
+ project: {
328
+ type: "string",
329
+ description: "Project path to analyze"
330
+ },
331
+ limit: {
332
+ type: "integer",
333
+ description: "Most recent sessions to scan (default 50, max 500)"
334
+ }
335
+ }
323
336
  }
324
337
  },
325
338
  {
@@ -1371,13 +1384,215 @@ function getStandalonePersistPath() {
1371
1384
  }
1372
1385
  //#endregion
1373
1386
  //#region src/version.ts
1374
- const VERSION = "0.9.29";
1387
+ const VERSION = "0.9.30";
1375
1388
  createRequire(import.meta.url);
1376
1389
  //#endregion
1377
1390
  //#region src/state/schema.ts
1391
+ const KV = {
1392
+ sessions: "mem:sessions",
1393
+ observations: (sessionId) => `mem:obs:${sessionId}`,
1394
+ memories: "mem:memories",
1395
+ summaries: "mem:summaries",
1396
+ config: "mem:config",
1397
+ metrics: "mem:metrics",
1398
+ health: "mem:health",
1399
+ embeddings: (obsId) => `mem:emb:${obsId}`,
1400
+ bm25Index: "mem:index:bm25",
1401
+ vectorPendingLog: "mem:index:vec-pending",
1402
+ relations: "mem:relations",
1403
+ profiles: "mem:profiles",
1404
+ claudeBridge: "mem:claude-bridge",
1405
+ graphNodes: "mem:graph:nodes",
1406
+ graphEdges: "mem:graph:edges",
1407
+ graphSnapshot: "mem:graph:snapshot",
1408
+ graphNameIndex: "mem:graph:name-index",
1409
+ graphEdgeKey: "mem:graph:edge-key",
1410
+ graphNodeDegree: "mem:graph:node-degree",
1411
+ semantic: "mem:semantic",
1412
+ procedural: "mem:procedural",
1413
+ teamShared: (teamId) => `mem:team:${teamId}:shared`,
1414
+ teamUsers: (teamId, userId) => `mem:team:${teamId}:users:${userId}`,
1415
+ teamProfile: (teamId) => `mem:team:${teamId}:profile`,
1416
+ audit: "mem:audit",
1417
+ auditMonth: (month) => `mem:audit:${month}`,
1418
+ auditMonths: "mem:audit:months",
1419
+ actions: "mem:actions",
1420
+ actionEdges: "mem:action-edges",
1421
+ leases: "mem:leases",
1422
+ routines: "mem:routines",
1423
+ routineRuns: "mem:routine-runs",
1424
+ signals: "mem:signals",
1425
+ checkpoints: "mem:checkpoints",
1426
+ mesh: "mem:mesh",
1427
+ sketches: "mem:sketches",
1428
+ facets: "mem:facets",
1429
+ sentinels: "mem:sentinels",
1430
+ crystals: "mem:crystals",
1431
+ lessons: "mem:lessons",
1432
+ insights: "mem:insights",
1433
+ graphEdgeHistory: "mem:graph:edge-history",
1434
+ enrichedChunks: (sessionId) => `mem:enriched:${sessionId}`,
1435
+ latentEmbeddings: (obsId) => `mem:latent:${obsId}`,
1436
+ retentionScores: "mem:retention",
1437
+ accessLog: "mem:access",
1438
+ imageRefs: "mem:image-refs",
1439
+ imageEmbeddings: "mem:image-embeddings",
1440
+ slots: "mem:slots",
1441
+ globalSlots: "mem:slots:global",
1442
+ state: "mem:state",
1443
+ commits: "mem:commits",
1444
+ recentSearches: "mem:recent-searches",
1445
+ projectSessionsIndex: "mem:idx:project-sessions",
1446
+ obsSessionIndex: (shard) => `mem:idx:obs:${shard}`,
1447
+ captureInbox: "mem:capture:inbox",
1448
+ captureEvents: (shard) => `mem:capture:events:${shard}`,
1449
+ capturePrompts: "mem:capture:prompts"
1450
+ };
1378
1451
  function generateId(prefix) {
1379
1452
  return `${prefix}_${Date.now().toString(36)}_${crypto.randomUUID().replace(/-/g, "").slice(0, 12)}`;
1380
1453
  }
1454
+ process.env["AGENTMEMORY_VERBOSE"] === "1" || process.env["AGENTMEMORY_VERBOSE"];
1455
+ KV.auditMonths;
1456
+ const AUDIT_MIGRATION_STATE_KEY = "migration";
1457
+ async function readAuditMigrationState(kv) {
1458
+ return kv.get(KV.auditMonths, AUDIT_MIGRATION_STATE_KEY);
1459
+ }
1460
+ function monthStartMs(month) {
1461
+ const [year, mon] = month.split("-").map(Number);
1462
+ return Date.UTC(year, mon - 1, 1);
1463
+ }
1464
+ function monthEndMs(month) {
1465
+ const [year, mon] = month.split("-").map(Number);
1466
+ return Date.UTC(year, mon, 1) - 1;
1467
+ }
1468
+ async function readAuditMonthIndex(kv) {
1469
+ return (await kv.get(KV.auditMonths, "index"))?.months ?? [];
1470
+ }
1471
+ async function listAuditMonthsDesc(kv) {
1472
+ return [...await readAuditMonthIndex(kv)].sort().reverse();
1473
+ }
1474
+ async function queryAudit(kv, filter) {
1475
+ const limit = filter?.limit || 100;
1476
+ let fromMs;
1477
+ if (filter?.dateFrom) {
1478
+ fromMs = new Date(filter.dateFrom).getTime();
1479
+ if (Number.isNaN(fromMs)) throw new Error(`Invalid dateFrom: ${filter.dateFrom}`);
1480
+ }
1481
+ const query = filter?.query?.trim().toLowerCase();
1482
+ let toMs;
1483
+ if (filter?.dateTo) {
1484
+ toMs = new Date(filter.dateTo).getTime();
1485
+ if (Number.isNaN(toMs)) throw new Error(`Invalid dateTo: ${filter.dateTo}`);
1486
+ }
1487
+ const matches = (entry) => {
1488
+ if (filter?.operation && entry.operation !== filter.operation) return false;
1489
+ const t = new Date(entry.timestamp).getTime();
1490
+ if (fromMs !== void 0 && t < fromMs) return false;
1491
+ if (toMs !== void 0 && t > toMs) return false;
1492
+ if (query && ![entry.functionId, ...entry.targetIds || []].some((v) => String(v || "").toLowerCase().includes(query))) return false;
1493
+ return true;
1494
+ };
1495
+ const seenIds = /* @__PURE__ */ new Set();
1496
+ const collected = [];
1497
+ const addIfNew = (row) => {
1498
+ if (seenIds.has(row.id)) return;
1499
+ seenIds.add(row.id);
1500
+ if (matches(row)) collected.push(row);
1501
+ };
1502
+ const months = await listAuditMonthsDesc(kv);
1503
+ for (const month of months) {
1504
+ if (collected.length >= limit) break;
1505
+ if (toMs !== void 0 && monthStartMs(month) > toMs) continue;
1506
+ if (fromMs !== void 0 && monthEndMs(month) < fromMs) break;
1507
+ const rows = await kv.list(KV.auditMonth(month));
1508
+ for (const row of rows) addIfNew(row);
1509
+ }
1510
+ let legacyFrozen = false;
1511
+ let legacyFrozenBytes;
1512
+ if (collected.length < limit) {
1513
+ const migrationState = await readAuditMigrationState(kv);
1514
+ if (migrationState?.safeToListLegacy) {
1515
+ const legacyRows = await kv.list(KV.audit);
1516
+ for (const row of legacyRows) addIfNew(row);
1517
+ } else if (migrationState?.status === "too-large" || migrationState?.status === "unreadable") {
1518
+ legacyFrozen = true;
1519
+ legacyFrozenBytes = migrationState.legacySizeBytes;
1520
+ }
1521
+ }
1522
+ collected.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
1523
+ return {
1524
+ entries: collected.slice(0, limit),
1525
+ legacyFrozen,
1526
+ legacyFrozenBytes
1527
+ };
1528
+ }
1529
+ //#endregion
1530
+ //#region src/secret-store.ts
1531
+ const SECRET_KEY = "AGENTMEMORY_SECRET";
1532
+ function agentmemoryHomeDir() {
1533
+ return join(homedir(), ".agentmemory");
1534
+ }
1535
+ function secretFilePath() {
1536
+ return join(agentmemoryHomeDir(), "secret");
1537
+ }
1538
+ function usable(value) {
1539
+ if (typeof value !== "string") return "";
1540
+ const trimmed = value.trim();
1541
+ if (!trimmed) return "";
1542
+ if (trimmed.startsWith("${") && trimmed.endsWith("}")) return "";
1543
+ return trimmed;
1544
+ }
1545
+ function unquote(value) {
1546
+ const quote = value[0];
1547
+ if ((quote === "\"" || quote === "'") && value.length > 1) {
1548
+ const close = value.indexOf(quote, 1);
1549
+ if (close !== -1) return value.slice(1, close);
1550
+ }
1551
+ const hash = value.indexOf(" #");
1552
+ return hash === -1 ? value : value.slice(0, hash).trim();
1553
+ }
1554
+ function readEnvFileSecret() {
1555
+ let content;
1556
+ try {
1557
+ content = readFileSync(join(agentmemoryHomeDir(), ".env"), "utf-8");
1558
+ } catch {
1559
+ return "";
1560
+ }
1561
+ if (typeof content !== "string") return "";
1562
+ let found = "";
1563
+ for (const line of content.split("\n")) {
1564
+ const trimmed = line.trim();
1565
+ if (trimmed.startsWith("#")) continue;
1566
+ const eq = trimmed.indexOf("=");
1567
+ if (eq === -1) continue;
1568
+ if (trimmed.slice(0, eq).replace(/^export\s+/, "").trim() !== SECRET_KEY) continue;
1569
+ found = usable(unquote(trimmed.slice(eq + 1).trim()));
1570
+ }
1571
+ return found;
1572
+ }
1573
+ function readStoredSecret() {
1574
+ try {
1575
+ return usable(readFileSync(secretFilePath(), "utf-8"));
1576
+ } catch {
1577
+ return "";
1578
+ }
1579
+ }
1580
+ function isLoopbackUrl(url) {
1581
+ let hostname;
1582
+ try {
1583
+ hostname = new URL(url).hostname.toLowerCase();
1584
+ } catch {
1585
+ return false;
1586
+ }
1587
+ const bare = hostname.replace(/^\[|\]$/g, "");
1588
+ return bare === "localhost" || bare === "::1" || /^127(?:\.\d{1,3}){3}$/.test(bare);
1589
+ }
1590
+ function resolveClientSecret(baseUrl, env = process.env) {
1591
+ const fromEnv = usable(env[SECRET_KEY]);
1592
+ if (fromEnv) return fromEnv;
1593
+ if (!isLoopbackUrl(baseUrl)) return "";
1594
+ return readEnvFileSecret() || readStoredSecret();
1595
+ }
1381
1596
  //#endregion
1382
1597
  //#region src/mcp/rest-proxy.ts
1383
1598
  const DEFAULT_URL = "http://localhost:3111";
@@ -1394,6 +1609,16 @@ function forceProxy() {
1394
1609
  const raw = process.env["AGENTMEMORY_FORCE_PROXY"];
1395
1610
  return raw === "1" || raw === "true";
1396
1611
  }
1612
+ var ProxyCallError = class extends Error {
1613
+ status;
1614
+ body;
1615
+ constructor(message, status, body) {
1616
+ super(message);
1617
+ this.name = "ProxyCallError";
1618
+ this.status = status;
1619
+ this.body = body;
1620
+ }
1621
+ };
1397
1622
  let cached = null;
1398
1623
  let cachedAt = 0;
1399
1624
  let probeInFlight = null;
@@ -1407,7 +1632,7 @@ function baseUrl() {
1407
1632
  return (resolveEnvOrEmpty("AGENTMEMORY_URL") || DEFAULT_URL).replace(/\/+$/, "");
1408
1633
  }
1409
1634
  function authHeader() {
1410
- const secret = resolveEnvOrEmpty("AGENTMEMORY_SECRET");
1635
+ const secret = resolveClientSecret(baseUrl());
1411
1636
  return secret ? { authorization: `Bearer ${secret}` } : {};
1412
1637
  }
1413
1638
  const defaultLivezProbe = async (url, timeoutMs, headers) => {
@@ -1464,7 +1689,16 @@ async function resolveHandle() {
1464
1689
  },
1465
1690
  signal: AbortSignal.timeout(CALL_TIMEOUT_MS)
1466
1691
  });
1467
- if (!res.ok) throw new Error(`${init?.method || "GET"} ${path} -> ${res.status} ${res.statusText}`);
1692
+ if (!res.ok) {
1693
+ const errText = await res.text().catch(() => "");
1694
+ let errBody = void 0;
1695
+ if (errText) try {
1696
+ errBody = JSON.parse(errText);
1697
+ } catch {
1698
+ errBody = void 0;
1699
+ }
1700
+ throw new ProxyCallError(`${init?.method || "GET"} ${path} -> ${res.status} ${res.statusText}`, res.status, errBody);
1701
+ }
1468
1702
  const text = await res.text();
1469
1703
  return text ? JSON.parse(text) : null;
1470
1704
  }
@@ -1634,7 +1868,12 @@ async function handleProxy(v, handle) {
1634
1868
  reason: v.reason
1635
1869
  })
1636
1870
  }));
1637
- case "memory_export": return textResponse(await handle.call("/agentmemory/export", { method: "GET" }), true);
1871
+ case "memory_export": try {
1872
+ return textResponse(await handle.call("/agentmemory/export", { method: "GET" }), true);
1873
+ } catch (err) {
1874
+ if (err instanceof ProxyCallError && err.body != null && typeof err.body === "object" && err.body.oversized === true) return textResponse(err.body, true);
1875
+ throw err;
1876
+ }
1638
1877
  case "memory_audit": return textResponse(await handle.call(`/agentmemory/audit?limit=${v.limit}`, { method: "GET" }), true);
1639
1878
  default: throw new Error(`Unknown tool: ${v.tool}`);
1640
1879
  }
@@ -1703,11 +1942,7 @@ async function handleLocal(v, kvInstance) {
1703
1942
  memories: await kvInstance.list("mem:memories"),
1704
1943
  sessions: await kvInstance.list("mem:sessions")
1705
1944
  }, true);
1706
- case "memory_audit": {
1707
- const entries = await kvInstance.list("mem:audit");
1708
- const limit = v.limit ?? 50;
1709
- return textResponse({ entries: entries.slice(0, limit) }, true);
1710
- }
1945
+ case "memory_audit": return textResponse(await queryAudit(kvInstance, { limit: v.limit ?? 50 }), true);
1711
1946
  default: throw new Error(`Unknown tool: ${v.tool}`);
1712
1947
  }
1713
1948
  }