@agentmemory/agentmemory 0.9.28 → 0.9.29
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 +15 -6
- package/AGENTS.md +6 -6
- package/README.md +220 -152
- package/dist/.env.example +15 -6
- package/dist/cli.d.mts.map +1 -1
- package/dist/cli.mjs +233 -35
- package/dist/cli.mjs.map +1 -1
- package/dist/{connect-JnsJXc68.mjs → connect-Qaeq15TQ.mjs} +599 -41
- package/dist/connect-Qaeq15TQ.mjs.map +1 -0
- package/dist/docker-compose.yml +2 -2
- package/dist/hooks/antigravity-bridge.d.mts +8 -0
- package/dist/hooks/antigravity-bridge.d.mts.map +1 -0
- package/dist/hooks/antigravity-bridge.mjs +114 -0
- package/dist/hooks/antigravity-bridge.mjs.map +1 -0
- package/dist/hooks/notification.mjs +19 -4
- package/dist/hooks/notification.mjs.map +1 -1
- package/dist/hooks/post-commit.mjs +13 -1
- package/dist/hooks/post-commit.mjs.map +1 -1
- package/dist/hooks/post-tool-failure.mjs +14 -3
- package/dist/hooks/post-tool-failure.mjs.map +1 -1
- package/dist/hooks/post-tool-use.mjs +14 -3
- package/dist/hooks/post-tool-use.mjs.map +1 -1
- package/dist/hooks/pre-compact.mjs +12 -2
- package/dist/hooks/pre-compact.mjs.map +1 -1
- package/dist/hooks/pre-tool-use.mjs +1 -1
- package/dist/hooks/pre-tool-use.mjs.map +1 -1
- package/dist/hooks/prompt-submit.mjs +14 -3
- package/dist/hooks/prompt-submit.mjs.map +1 -1
- package/dist/hooks/session-end.mjs +82 -18
- package/dist/hooks/session-end.mjs.map +1 -1
- package/dist/hooks/session-start.mjs +22 -4
- package/dist/hooks/session-start.mjs.map +1 -1
- package/dist/hooks/stop.mjs +1 -7
- package/dist/hooks/stop.mjs.map +1 -1
- package/dist/hooks/subagent-start.mjs +14 -3
- package/dist/hooks/subagent-start.mjs.map +1 -1
- package/dist/hooks/subagent-stop.mjs +14 -3
- package/dist/hooks/subagent-stop.mjs.map +1 -1
- package/dist/hooks/task-completed.mjs +14 -3
- package/dist/hooks/task-completed.mjs.map +1 -1
- package/dist/{image-refs-C2YU7BIm.mjs → image-refs-CJgZmb9X.mjs} +2 -2
- package/dist/{image-refs-C2YU7BIm.mjs.map → image-refs-CJgZmb9X.mjs.map} +1 -1
- package/dist/index.mjs +1557 -755
- package/dist/index.mjs.map +1 -1
- package/dist/schema-BFZhNTF7.mjs +197 -0
- package/dist/schema-BFZhNTF7.mjs.map +1 -0
- package/dist/{src-CzgoepGU.mjs → src-G7yt8gGm.mjs} +1531 -883
- package/dist/src-G7yt8gGm.mjs.map +1 -0
- package/dist/{standalone-YsZFFQBM.mjs → standalone-BqNJDJ04.mjs} +26 -15
- package/dist/standalone-BqNJDJ04.mjs.map +1 -0
- package/dist/standalone.d.mts.map +1 -1
- package/dist/standalone.mjs +50 -14
- package/dist/standalone.mjs.map +1 -1
- package/dist/{tools-registry-D3NEoe5m.mjs → tools-registry-BV_2bu7z.mjs} +293 -3
- package/dist/tools-registry-BV_2bu7z.mjs.map +1 -0
- package/dist/viewer/favicon.svg +35 -1
- package/dist/viewer/index.html +473 -83
- package/docker-compose.yml +2 -2
- package/integrations/pi/README.md +77 -0
- package/integrations/pi/index.ts +403 -0
- package/integrations/pi/package.json +32 -0
- package/integrations/pi/security.ts +35 -0
- package/package.json +3 -4
- package/plugin/.claude-plugin/plugin.json +2 -2
- package/plugin/.codex-plugin/plugin.json +2 -2
- package/plugin/.devin-plugin/plugin.json +32 -0
- package/plugin/cursor/hooks.json +41 -0
- package/plugin/cursor/mcp.json +12 -0
- package/plugin/hooks/hooks.antigravity.json +43 -0
- package/plugin/hooks/hooks.devin.json +67 -0
- package/plugin/hooks/hooks.droid.json +55 -0
- package/plugin/opencode/README.md +1 -1
- package/plugin/opencode/agentmemory-capture.ts +73 -13
- package/plugin/opencode/plugin.json +1 -1
- package/plugin/plugin.json +2 -2
- package/plugin/scripts/antigravity-bridge.d.mts +8 -0
- package/plugin/scripts/antigravity-bridge.d.mts.map +1 -0
- package/plugin/scripts/antigravity-bridge.mjs +114 -0
- package/plugin/scripts/antigravity-bridge.mjs.map +1 -0
- package/plugin/scripts/notification.mjs +19 -4
- package/plugin/scripts/notification.mjs.map +1 -1
- package/plugin/scripts/post-commit.mjs +13 -1
- package/plugin/scripts/post-commit.mjs.map +1 -1
- package/plugin/scripts/post-tool-failure.mjs +14 -3
- package/plugin/scripts/post-tool-failure.mjs.map +1 -1
- package/plugin/scripts/post-tool-use.mjs +14 -3
- package/plugin/scripts/post-tool-use.mjs.map +1 -1
- package/plugin/scripts/pre-compact.mjs +12 -2
- package/plugin/scripts/pre-compact.mjs.map +1 -1
- package/plugin/scripts/pre-tool-use.mjs +1 -1
- package/plugin/scripts/pre-tool-use.mjs.map +1 -1
- package/plugin/scripts/prompt-submit.mjs +14 -3
- package/plugin/scripts/prompt-submit.mjs.map +1 -1
- package/plugin/scripts/session-end.mjs +82 -18
- package/plugin/scripts/session-end.mjs.map +1 -1
- package/plugin/scripts/session-start.mjs +22 -4
- package/plugin/scripts/session-start.mjs.map +1 -1
- package/plugin/scripts/stop.mjs +1 -7
- package/plugin/scripts/stop.mjs.map +1 -1
- package/plugin/scripts/subagent-start.mjs +14 -3
- package/plugin/scripts/subagent-start.mjs.map +1 -1
- package/plugin/scripts/subagent-stop.mjs +14 -3
- package/plugin/scripts/subagent-stop.mjs.map +1 -1
- package/plugin/scripts/task-completed.mjs +14 -3
- package/plugin/scripts/task-completed.mjs.map +1 -1
- package/plugin/skills/agentmemory-agents/REFERENCE.md +6 -3
- package/plugin/skills/agentmemory-config/REFERENCE.md +4 -1
- package/plugin/skills/agentmemory-mcp-tools/REFERENCE.md +3 -2
- package/plugin/skills/agentmemory-rest-api/REFERENCE.md +14 -1
- package/plugin/skills/forget/SKILL.md +4 -1
- package/plugin/skills/lesson/SKILL.md +64 -0
- package/plugin/skills/memory-discipline/SKILL.md +57 -0
- package/plugin/skills/recall/SKILL.md +4 -1
- package/plugin/skills/remember/SKILL.md +6 -1
- package/dist/config-ChC9EtgV.mjs +0 -259
- package/dist/config-ChC9EtgV.mjs.map +0 -1
- package/dist/connect-JnsJXc68.mjs.map +0 -1
- package/dist/schema-CNiCWzV9.mjs +0 -78
- package/dist/schema-CNiCWzV9.mjs.map +0 -1
- package/dist/src-CzgoepGU.mjs.map +0 -1
- package/dist/standalone-YsZFFQBM.mjs.map +0 -1
- package/dist/tools-registry-D3NEoe5m.mjs.map +0 -1
- package/plugin/scripts/diagnostics.d.mts +0 -17
- package/plugin/scripts/diagnostics.d.mts.map +0 -1
- package/plugin/scripts/diagnostics.mjs.map +0 -1
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { i as generateId } from "./schema-
|
|
2
|
-
import { i as VERSION, n as getAllTools } from "./tools-registry-
|
|
3
|
-
import { s as getStandalonePersistPath } from "./config-ChC9EtgV.mjs";
|
|
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";
|
|
4
3
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
5
4
|
import { dirname } from "node:path";
|
|
6
5
|
//#region src/mcp/in-memory-kv.ts
|
|
@@ -334,10 +333,15 @@ const IMPLEMENTED_TOOLS = new Set([
|
|
|
334
333
|
"memory_audit",
|
|
335
334
|
"memory_governance_delete"
|
|
336
335
|
]);
|
|
336
|
+
const SUPPORTED_PROTOCOL_VERSIONS = [
|
|
337
|
+
"2025-11-25",
|
|
338
|
+
"2025-06-18",
|
|
339
|
+
"2025-03-26",
|
|
340
|
+
"2024-11-05"
|
|
341
|
+
];
|
|
337
342
|
const SERVER_INFO = {
|
|
338
343
|
name: "agentmemory",
|
|
339
|
-
version: VERSION
|
|
340
|
-
protocolVersion: "2024-11-05"
|
|
344
|
+
version: VERSION
|
|
341
345
|
};
|
|
342
346
|
const kv = new InMemoryKV(getStandalonePersistPath());
|
|
343
347
|
let modeAnnounced = false;
|
|
@@ -386,6 +390,8 @@ function validate(toolName, args) {
|
|
|
386
390
|
v.type = args["type"] || "fact";
|
|
387
391
|
v.concepts = normalizeList(args["concepts"]);
|
|
388
392
|
v.files = normalizeList(args["files"]);
|
|
393
|
+
if (typeof args["project"] === "string" && args["project"].trim()) v.project = args["project"].trim();
|
|
394
|
+
if (typeof args["agentId"] === "string" && args["agentId"].trim()) v.agentId = args["agentId"].trim();
|
|
389
395
|
return v;
|
|
390
396
|
}
|
|
391
397
|
case "memory_recall":
|
|
@@ -429,7 +435,9 @@ async function handleProxy(v, handle) {
|
|
|
429
435
|
content: v.content,
|
|
430
436
|
type: v.type,
|
|
431
437
|
concepts: v.concepts,
|
|
432
|
-
files: v.files
|
|
438
|
+
files: v.files,
|
|
439
|
+
...v.project !== void 0 && { project: v.project },
|
|
440
|
+
...v.agentId !== void 0 && { agentId: v.agentId }
|
|
433
441
|
})
|
|
434
442
|
}));
|
|
435
443
|
case "memory_recall": {
|
|
@@ -600,14 +608,17 @@ async function handleToolsList() {
|
|
|
600
608
|
}
|
|
601
609
|
const transport = createStdioTransport(async (method, params) => {
|
|
602
610
|
switch (method) {
|
|
603
|
-
case "initialize":
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
+
case "initialize": {
|
|
612
|
+
const requested = params?.protocolVersion;
|
|
613
|
+
return {
|
|
614
|
+
protocolVersion: typeof requested === "string" && SUPPORTED_PROTOCOL_VERSIONS.includes(requested) ? requested : SUPPORTED_PROTOCOL_VERSIONS[0],
|
|
615
|
+
capabilities: { tools: { listChanged: false } },
|
|
616
|
+
serverInfo: {
|
|
617
|
+
name: SERVER_INFO.name,
|
|
618
|
+
version: SERVER_INFO.version
|
|
619
|
+
}
|
|
620
|
+
};
|
|
621
|
+
}
|
|
611
622
|
case "notifications/initialized": return {};
|
|
612
623
|
case "tools/list": return handleToolsList();
|
|
613
624
|
case "tools/call": {
|
|
@@ -641,4 +652,4 @@ process.on("SIGTERM", () => {
|
|
|
641
652
|
//#endregion
|
|
642
653
|
export {};
|
|
643
654
|
|
|
644
|
-
//# sourceMappingURL=standalone-
|
|
655
|
+
//# sourceMappingURL=standalone-BqNJDJ04.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standalone-BqNJDJ04.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 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: -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","const 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 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 = resolveEnvOrEmpty(\"AGENTMEMORY_SECRET\");\n return secret ? { authorization: `Bearer ${secret}` } : {};\n}\n\n/**\n * Probes the agentmemory server's livez endpoint. Returns a Response-shaped\n * object whose `ok` flag drives the proxy/local-fallback decision.\n *\n * Tests can swap this via {@link setLivezProbe} to avoid the real 2s\n * AbortController race that destabilises mcp-standalone test runs (#449).\n * Production callers should leave it on the default.\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 throw new Error(\n `${init?.method || \"GET\"} ${path} -> ${res.status} ${res.statusText}`,\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 {\n resolveHandle,\n invalidateHandle,\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 const result = await handle.call(\"/agentmemory/export\", { method: \"GET\" });\n return textResponse(result, true);\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 entries = await kvInstance.list(\"mem:audit\");\n const limit = v.limit ?? 50;\n return textResponse(\n {\n entries: (entries as Array<Record<string, unknown>>).slice(0, limit),\n },\n true,\n );\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 // Tools the local InMemoryKV fallback doesn't implement: forward straight\n // to the server. Local validation would otherwise raise \"Unknown tool\"\n // (issue #234).\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;;;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"}
|
package/dist/standalone.mjs
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { createRequire } from "node:module";
|
|
2
3
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
4
|
import { dirname, join } from "node:path";
|
|
4
5
|
import { homedir } from "node:os";
|
|
@@ -283,6 +284,10 @@ const CORE_TOOLS = [
|
|
|
283
284
|
project: {
|
|
284
285
|
type: "string",
|
|
285
286
|
description: "Stable canonical project identifier this memory belongs to (e.g. a slug, UUID, or registry key). Must match the value used when the session was started. Do not use filesystem paths or ad-hoc display names — those change across machines and will silently break project scoping."
|
|
287
|
+
},
|
|
288
|
+
agentId: {
|
|
289
|
+
type: "string",
|
|
290
|
+
description: "Agent identity to scope this memory to. When set, agent-scoped recall and search only surface it for the same agentId. Omit for shared memory."
|
|
286
291
|
}
|
|
287
292
|
},
|
|
288
293
|
required: ["content"]
|
|
@@ -1141,6 +1146,18 @@ const V070_TOOLS = [
|
|
|
1141
1146
|
required: ["query"]
|
|
1142
1147
|
}
|
|
1143
1148
|
},
|
|
1149
|
+
{
|
|
1150
|
+
name: "memory_lesson_delete",
|
|
1151
|
+
description: "Soft-delete a lesson by id. Deleted lessons are excluded from recall and list; re-saving the same content creates a fresh lesson.",
|
|
1152
|
+
inputSchema: {
|
|
1153
|
+
type: "object",
|
|
1154
|
+
properties: { lessonId: {
|
|
1155
|
+
type: "string",
|
|
1156
|
+
description: "The lesson id (lsn_...)"
|
|
1157
|
+
} },
|
|
1158
|
+
required: ["lessonId"]
|
|
1159
|
+
}
|
|
1160
|
+
},
|
|
1144
1161
|
{
|
|
1145
1162
|
name: "memory_obsidian_export",
|
|
1146
1163
|
description: "Export memories, lessons, and crystals as Obsidian-compatible Markdown files with YAML frontmatter and wikilinks for graph view.",
|
|
@@ -1313,8 +1330,13 @@ function getAllTools() {
|
|
|
1313
1330
|
];
|
|
1314
1331
|
}
|
|
1315
1332
|
const ENV_FILE = join(join(homedir(), ".agentmemory"), ".env");
|
|
1333
|
+
let envFileCache;
|
|
1316
1334
|
function loadEnvFile() {
|
|
1317
|
-
if (
|
|
1335
|
+
if (envFileCache) return envFileCache;
|
|
1336
|
+
if (!existsSync(ENV_FILE)) {
|
|
1337
|
+
envFileCache = {};
|
|
1338
|
+
return envFileCache;
|
|
1339
|
+
}
|
|
1318
1340
|
const content = readFileSync(ENV_FILE, "utf-8");
|
|
1319
1341
|
const vars = {};
|
|
1320
1342
|
for (const line of content.split("\n")) {
|
|
@@ -1334,7 +1356,8 @@ function loadEnvFile() {
|
|
|
1334
1356
|
}
|
|
1335
1357
|
vars[key] = val;
|
|
1336
1358
|
}
|
|
1337
|
-
|
|
1359
|
+
envFileCache = vars;
|
|
1360
|
+
return envFileCache;
|
|
1338
1361
|
}
|
|
1339
1362
|
function getMergedEnv(overrides) {
|
|
1340
1363
|
return {
|
|
@@ -1348,7 +1371,8 @@ function getStandalonePersistPath() {
|
|
|
1348
1371
|
}
|
|
1349
1372
|
//#endregion
|
|
1350
1373
|
//#region src/version.ts
|
|
1351
|
-
const VERSION = "0.9.
|
|
1374
|
+
const VERSION = "0.9.29";
|
|
1375
|
+
createRequire(import.meta.url);
|
|
1352
1376
|
//#endregion
|
|
1353
1377
|
//#region src/state/schema.ts
|
|
1354
1378
|
function generateId(prefix) {
|
|
@@ -1471,10 +1495,15 @@ const IMPLEMENTED_TOOLS = new Set([
|
|
|
1471
1495
|
"memory_audit",
|
|
1472
1496
|
"memory_governance_delete"
|
|
1473
1497
|
]);
|
|
1498
|
+
const SUPPORTED_PROTOCOL_VERSIONS = [
|
|
1499
|
+
"2025-11-25",
|
|
1500
|
+
"2025-06-18",
|
|
1501
|
+
"2025-03-26",
|
|
1502
|
+
"2024-11-05"
|
|
1503
|
+
];
|
|
1474
1504
|
const SERVER_INFO = {
|
|
1475
1505
|
name: "agentmemory",
|
|
1476
|
-
version: VERSION
|
|
1477
|
-
protocolVersion: "2024-11-05"
|
|
1506
|
+
version: VERSION
|
|
1478
1507
|
};
|
|
1479
1508
|
const kv = new InMemoryKV(getStandalonePersistPath());
|
|
1480
1509
|
let modeAnnounced = false;
|
|
@@ -1523,6 +1552,8 @@ function validate(toolName, args) {
|
|
|
1523
1552
|
v.type = args["type"] || "fact";
|
|
1524
1553
|
v.concepts = normalizeList(args["concepts"]);
|
|
1525
1554
|
v.files = normalizeList(args["files"]);
|
|
1555
|
+
if (typeof args["project"] === "string" && args["project"].trim()) v.project = args["project"].trim();
|
|
1556
|
+
if (typeof args["agentId"] === "string" && args["agentId"].trim()) v.agentId = args["agentId"].trim();
|
|
1526
1557
|
return v;
|
|
1527
1558
|
}
|
|
1528
1559
|
case "memory_recall":
|
|
@@ -1566,7 +1597,9 @@ async function handleProxy(v, handle) {
|
|
|
1566
1597
|
content: v.content,
|
|
1567
1598
|
type: v.type,
|
|
1568
1599
|
concepts: v.concepts,
|
|
1569
|
-
files: v.files
|
|
1600
|
+
files: v.files,
|
|
1601
|
+
...v.project !== void 0 && { project: v.project },
|
|
1602
|
+
...v.agentId !== void 0 && { agentId: v.agentId }
|
|
1570
1603
|
})
|
|
1571
1604
|
}));
|
|
1572
1605
|
case "memory_recall": {
|
|
@@ -1737,14 +1770,17 @@ async function handleToolsList() {
|
|
|
1737
1770
|
}
|
|
1738
1771
|
const transport = createStdioTransport(async (method, params) => {
|
|
1739
1772
|
switch (method) {
|
|
1740
|
-
case "initialize":
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1773
|
+
case "initialize": {
|
|
1774
|
+
const requested = params?.protocolVersion;
|
|
1775
|
+
return {
|
|
1776
|
+
protocolVersion: typeof requested === "string" && SUPPORTED_PROTOCOL_VERSIONS.includes(requested) ? requested : SUPPORTED_PROTOCOL_VERSIONS[0],
|
|
1777
|
+
capabilities: { tools: { listChanged: false } },
|
|
1778
|
+
serverInfo: {
|
|
1779
|
+
name: SERVER_INFO.name,
|
|
1780
|
+
version: SERVER_INFO.version
|
|
1781
|
+
}
|
|
1782
|
+
};
|
|
1783
|
+
}
|
|
1748
1784
|
case "notifications/initialized": return {};
|
|
1749
1785
|
case "tools/list": return handleToolsList();
|
|
1750
1786
|
case "tools/call": {
|