@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.
- package/.env.example +83 -22
- package/AGENTS.md +17 -24
- package/README.md +447 -170
- package/dist/.env.example +83 -22
- package/dist/cli.d.mts.map +1 -1
- package/dist/cli.mjs +1221 -335
- package/dist/cli.mjs.map +1 -1
- package/dist/{connect-Qaeq15TQ.mjs → connect-B4_ca6BD.mjs} +30 -39
- package/dist/connect-B4_ca6BD.mjs.map +1 -0
- package/dist/docker-compose.yml +40 -14
- package/dist/hooks/_capture.d.mts +22 -0
- package/dist/hooks/_capture.d.mts.map +1 -0
- package/dist/hooks/_capture.mjs +908 -0
- package/dist/hooks/_capture.mjs.map +1 -0
- package/dist/hooks/antigravity-bridge.d.mts +1 -1
- package/dist/hooks/antigravity-bridge.d.mts.map +1 -1
- package/dist/hooks/antigravity-bridge.mjs +24 -15
- package/dist/hooks/antigravity-bridge.mjs.map +1 -1
- package/dist/hooks/notification.mjs +17 -25
- package/dist/hooks/notification.mjs.map +1 -1
- package/dist/hooks/post-commit.mjs +71 -1
- package/dist/hooks/post-commit.mjs.map +1 -1
- package/dist/hooks/post-tool-failure.mjs +59 -25
- package/dist/hooks/post-tool-failure.mjs.map +1 -1
- package/dist/hooks/post-tool-use.mjs +87 -35
- package/dist/hooks/post-tool-use.mjs.map +1 -1
- package/dist/hooks/pre-compact.mjs +83 -3
- package/dist/hooks/pre-compact.mjs.map +1 -1
- package/dist/hooks/pre-tool-use.mjs +71 -1
- package/dist/hooks/pre-tool-use.mjs.map +1 -1
- package/dist/hooks/prompt-submit.mjs +13 -21
- package/dist/hooks/prompt-submit.mjs.map +1 -1
- package/dist/hooks/session-end.mjs +25 -20
- package/dist/hooks/session-end.mjs.map +1 -1
- package/dist/hooks/session-start.mjs +80 -3
- package/dist/hooks/session-start.mjs.map +1 -1
- package/dist/hooks/stop.mjs +71 -1
- package/dist/hooks/stop.mjs.map +1 -1
- package/dist/hooks/subagent-start.mjs +16 -25
- package/dist/hooks/subagent-start.mjs.map +1 -1
- package/dist/hooks/subagent-stop.mjs +17 -25
- package/dist/hooks/subagent-stop.mjs.map +1 -1
- package/dist/hooks/task-completed.mjs +19 -27
- package/dist/hooks/task-completed.mjs.map +1 -1
- package/dist/iii-config.docker.yaml +10 -10
- package/dist/iii-config.yaml +3 -1
- package/dist/{image-refs-BKLmp_sD.mjs → image-refs-BaT-9oMU.mjs} +2 -2
- package/dist/image-refs-BaT-9oMU.mjs.map +1 -0
- package/dist/{image-refs-CJgZmb9X.mjs → image-refs-T_urbwHM.mjs} +3 -3
- package/dist/image-refs-T_urbwHM.mjs.map +1 -0
- package/dist/{keyed-mutex-DTHtcZrt.mjs → image-store-BsN4vyjr.mjs} +2 -14
- package/dist/image-store-BsN4vyjr.mjs.map +1 -0
- package/dist/index.mjs +12943 -6218
- package/dist/index.mjs.map +1 -1
- package/dist/{schema-BFZhNTF7.mjs → keyed-mutex-DchXsyfP.mjs} +28 -4
- package/dist/keyed-mutex-DchXsyfP.mjs.map +1 -0
- package/dist/secret-store-BnY3A50C.mjs +2348 -0
- package/dist/secret-store-BnY3A50C.mjs.map +1 -0
- package/dist/{src-G7yt8gGm.mjs → src-Jsq9LCeH.mjs} +5941 -2180
- package/dist/src-Jsq9LCeH.mjs.map +1 -0
- package/dist/{standalone-BqNJDJ04.mjs → standalone-DKCdrf1d.mjs} +39 -12
- package/dist/standalone-DKCdrf1d.mjs.map +1 -0
- package/dist/standalone.d.mts.map +1 -1
- package/dist/standalone.mjs +249 -14
- package/dist/standalone.mjs.map +1 -1
- package/dist/status-IRz7ta8-.mjs +2344 -0
- package/dist/status-IRz7ta8-.mjs.map +1 -0
- package/dist/viewer/index.html +7224 -2794
- package/docker-compose.yml +40 -14
- package/iii-config.docker.yaml +10 -10
- package/iii-config.yaml +3 -1
- package/integrations/pi/index.ts +2 -3
- package/integrations/pi/security.ts +52 -0
- package/package.json +13 -4
- package/plugin/.claude-plugin/plugin.json +2 -2
- package/plugin/.codex-plugin/plugin.json +26 -4
- package/plugin/.devin-plugin/plugin.json +1 -1
- package/plugin/.mcp.codex.json +12 -0
- package/plugin/.mcp.copilot.json +2 -7
- package/plugin/.mcp.json +2 -7
- package/plugin/assets/icon.svg +35 -0
- package/plugin/hooks/hooks.copilot.json +11 -11
- package/plugin/opencode/README.md +266 -30
- package/plugin/opencode/agentmemory-capture.ts +572 -3
- package/plugin/opencode/plugin.json +1 -1
- package/plugin/plugin.json +1 -1
- package/plugin/scripts/_capture.d.mts +22 -0
- package/plugin/scripts/_capture.d.mts.map +1 -0
- package/plugin/scripts/_capture.mjs +908 -0
- package/plugin/scripts/_capture.mjs.map +1 -0
- package/plugin/scripts/antigravity-bridge.d.mts +1 -1
- package/plugin/scripts/antigravity-bridge.d.mts.map +1 -1
- package/plugin/scripts/antigravity-bridge.mjs +24 -15
- package/plugin/scripts/antigravity-bridge.mjs.map +1 -1
- package/plugin/scripts/notification.mjs +17 -25
- package/plugin/scripts/notification.mjs.map +1 -1
- package/plugin/scripts/plugin-bridge.mjs +378 -0
- package/plugin/scripts/post-commit.mjs +71 -1
- package/plugin/scripts/post-commit.mjs.map +1 -1
- package/plugin/scripts/post-tool-failure.mjs +59 -25
- package/plugin/scripts/post-tool-failure.mjs.map +1 -1
- package/plugin/scripts/post-tool-use.mjs +87 -35
- package/plugin/scripts/post-tool-use.mjs.map +1 -1
- package/plugin/scripts/pre-compact.mjs +83 -3
- package/plugin/scripts/pre-compact.mjs.map +1 -1
- package/plugin/scripts/pre-tool-use.mjs +71 -1
- package/plugin/scripts/pre-tool-use.mjs.map +1 -1
- package/plugin/scripts/prompt-submit.mjs +13 -21
- package/plugin/scripts/prompt-submit.mjs.map +1 -1
- package/plugin/scripts/session-end.mjs +25 -20
- package/plugin/scripts/session-end.mjs.map +1 -1
- package/plugin/scripts/session-start.mjs +80 -3
- package/plugin/scripts/session-start.mjs.map +1 -1
- package/plugin/scripts/stop.mjs +71 -1
- package/plugin/scripts/stop.mjs.map +1 -1
- package/plugin/scripts/subagent-start.mjs +16 -25
- package/plugin/scripts/subagent-start.mjs.map +1 -1
- package/plugin/scripts/subagent-stop.mjs +17 -25
- package/plugin/scripts/subagent-stop.mjs.map +1 -1
- package/plugin/scripts/task-completed.mjs +19 -27
- package/plugin/scripts/task-completed.mjs.map +1 -1
- package/plugin/skills/_shared/TROUBLESHOOTING.md +22 -6
- package/plugin/skills/agentmemory-agents/REFERENCE.md +3 -3
- package/plugin/skills/agentmemory-config/REFERENCE.md +49 -1
- package/plugin/skills/agentmemory-config/SKILL.md +44 -7
- package/plugin/skills/agentmemory-mcp-tools/REFERENCE.md +1 -1
- package/plugin/skills/agentmemory-rest-api/REFERENCE.md +10 -2
- package/plugin/skills/handoff/SKILL.md +4 -2
- package/plugin/skills/memory-discipline/SKILL.md +13 -5
- package/dist/connect-Qaeq15TQ.mjs.map +0 -1
- package/dist/image-refs-BKLmp_sD.mjs.map +0 -1
- package/dist/image-refs-CJgZmb9X.mjs.map +0 -1
- package/dist/keyed-mutex-DTHtcZrt.mjs.map +0 -1
- package/dist/logger-BEB7pCI9.mjs +0 -43
- package/dist/logger-BEB7pCI9.mjs.map +0 -1
- package/dist/schema-BFZhNTF7.mjs.map +0 -1
- package/dist/src-G7yt8gGm.mjs.map +0 -1
- package/dist/standalone-BqNJDJ04.mjs.map +0 -1
- package/dist/tools-registry-BV_2bu7z.mjs +0 -1405
- package/dist/tools-registry-BV_2bu7z.mjs.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
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 =
|
|
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)
|
|
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":
|
|
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-
|
|
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;;;
|
|
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"}
|
package/dist/standalone.mjs
CHANGED
|
@@ -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: {
|
|
320
|
-
|
|
321
|
-
|
|
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.
|
|
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 =
|
|
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)
|
|
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":
|
|
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
|
}
|