@agentmemory/agentmemory 0.9.16 → 0.9.18
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 +6 -0
- package/AGENTS.md +5 -5
- package/README.md +41 -6
- package/dist/.env.example +6 -0
- package/dist/cli.mjs +12 -6
- package/dist/cli.mjs.map +1 -1
- package/dist/index.mjs +324 -17
- package/dist/index.mjs.map +1 -1
- package/dist/{src-3Oy_OOlF.mjs → src-C7vygXCj.mjs} +315 -15
- package/dist/src-C7vygXCj.mjs.map +1 -0
- package/dist/{standalone-BQOaGF4z.mjs → standalone-kg2TedgD.mjs} +18 -9
- package/dist/standalone-kg2TedgD.mjs.map +1 -0
- package/dist/standalone.mjs +17 -8
- package/dist/standalone.mjs.map +1 -1
- package/dist/{tools-registry-BF0pgZmI.mjs → tools-registry-BFKFKmYh.mjs} +11 -4
- package/dist/tools-registry-BFKFKmYh.mjs.map +1 -0
- package/dist/viewer/favicon.svg +1 -0
- package/dist/viewer/index.html +190 -60
- package/package.json +2 -2
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/.codex-plugin/plugin.json +1 -1
- package/dist/src-3Oy_OOlF.mjs.map +0 -1
- package/dist/standalone-BQOaGF4z.mjs.map +0 -1
- package/dist/tools-registry-BF0pgZmI.mjs.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { s as generateId, t as VERSION } from "./cli.mjs";
|
|
2
|
-
import { s as getStandalonePersistPath, t as getAllTools } from "./tools-registry-
|
|
2
|
+
import { s as getStandalonePersistPath, t as getAllTools } from "./tools-registry-BFKFKmYh.mjs";
|
|
3
3
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
4
4
|
import { dirname } from "node:path";
|
|
5
5
|
import { createInterface } from "node:readline";
|
|
@@ -164,15 +164,24 @@ function authHeader() {
|
|
|
164
164
|
const secret = process.env["AGENTMEMORY_SECRET"];
|
|
165
165
|
return secret ? { authorization: `Bearer ${secret}` } : {};
|
|
166
166
|
}
|
|
167
|
+
const defaultLivezProbe = async (url, timeoutMs, headers) => {
|
|
168
|
+
const res = await fetch(`${url}/agentmemory/livez`, {
|
|
169
|
+
method: "GET",
|
|
170
|
+
headers,
|
|
171
|
+
signal: AbortSignal.timeout(timeoutMs)
|
|
172
|
+
});
|
|
173
|
+
return {
|
|
174
|
+
ok: res.ok,
|
|
175
|
+
status: res.status,
|
|
176
|
+
statusText: res.statusText
|
|
177
|
+
};
|
|
178
|
+
};
|
|
179
|
+
let livezProbe = defaultLivezProbe;
|
|
167
180
|
async function probe(url) {
|
|
168
181
|
const timeout = probeTimeoutMs();
|
|
169
182
|
try {
|
|
170
|
-
const res = await
|
|
171
|
-
|
|
172
|
-
headers: authHeader(),
|
|
173
|
-
signal: AbortSignal.timeout(timeout)
|
|
174
|
-
});
|
|
175
|
-
if (!res.ok) process.stderr.write(`[@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`);
|
|
183
|
+
const res = await livezProbe(url, timeout, authHeader());
|
|
184
|
+
if (!res.ok) process.stderr.write(`[@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`);
|
|
176
185
|
return res.ok;
|
|
177
186
|
} catch (err) {
|
|
178
187
|
process.stderr.write(`[@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`);
|
|
@@ -333,7 +342,7 @@ async function handleProxy(v, handle) {
|
|
|
333
342
|
}), true);
|
|
334
343
|
case "memory_sessions": return textResponse(await handle.call(`/agentmemory/sessions?limit=${v.limit}`, { method: "GET" }), true);
|
|
335
344
|
case "memory_governance_delete": return textResponse(await handle.call("/agentmemory/governance/memories", {
|
|
336
|
-
method: "
|
|
345
|
+
method: "DELETE",
|
|
337
346
|
body: JSON.stringify({
|
|
338
347
|
memoryIds: v.memoryIds,
|
|
339
348
|
reason: v.reason
|
|
@@ -516,4 +525,4 @@ process.on("SIGTERM", () => {
|
|
|
516
525
|
|
|
517
526
|
//#endregion
|
|
518
527
|
export { };
|
|
519
|
-
//# sourceMappingURL=standalone-
|
|
528
|
+
//# sourceMappingURL=standalone-kg2TedgD.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standalone-kg2TedgD.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","import { createInterface } from \"node:readline\";\n\nexport 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\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\nexport function createStdioTransport(handler: RequestHandler): {\n start: () => void;\n stop: () => void;\n} {\n let rl: ReturnType<typeof createInterface> | null = null;\n\n const writeResponse = (response: JsonRpcResponse) => {\n process.stdout.write(JSON.stringify(response) + \"\\n\");\n };\n\n const onLine = (line: string) => processLine(line, handler, writeResponse);\n\n return {\n start() {\n rl = createInterface({ input: process.stdin });\n rl.on(\"line\", onLine);\n },\n stop() {\n rl?.close();\n rl = 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\nfunction baseUrl(): string {\n return (process.env[\"AGENTMEMORY_URL\"] || DEFAULT_URL).replace(/\\/+$/, \"\");\n}\n\nfunction authHeader(): Record<string, string> {\n const secret = process.env[\"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 SERVER_INFO = {\n name: \"agentmemory\",\n version: VERSION,\n protocolVersion: \"2024-11-05\",\n};\n\nconst kv = new InMemoryKV(getStandalonePersistPath());\nlet modeAnnounced = false;\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 process.stderr.write(\n `[@agentmemory/mcp] no server reachable at ${process.env[\"AGENTMEMORY_URL\"] || \"http://localhost:3111\"}; falling back to local InMemoryKV\\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 query?: string;\n limit?: 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 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 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 }),\n });\n return textResponse(result);\n }\n case \"memory_recall\":\n case \"memory_smart_search\": {\n const result = await handle.call(\"/agentmemory/smart-search\", {\n method: \"POST\",\n body: JSON.stringify({ query: v.query, limit: v.limit }),\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 51 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 return {\n protocolVersion: SERVER_INFO.protocolVersion,\n capabilities: { tools: { listChanged: false } },\n serverInfo: {\n name: SERVER_INFO.name,\n version: SERVER_INFO.version,\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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"}
|
package/dist/standalone.mjs
CHANGED
|
@@ -1237,7 +1237,7 @@ function getStandalonePersistPath() {
|
|
|
1237
1237
|
|
|
1238
1238
|
//#endregion
|
|
1239
1239
|
//#region src/version.ts
|
|
1240
|
-
const VERSION = "0.9.
|
|
1240
|
+
const VERSION = "0.9.18";
|
|
1241
1241
|
|
|
1242
1242
|
//#endregion
|
|
1243
1243
|
//#region src/state/schema.ts
|
|
@@ -1271,15 +1271,24 @@ function authHeader() {
|
|
|
1271
1271
|
const secret = process.env["AGENTMEMORY_SECRET"];
|
|
1272
1272
|
return secret ? { authorization: `Bearer ${secret}` } : {};
|
|
1273
1273
|
}
|
|
1274
|
+
const defaultLivezProbe = async (url, timeoutMs, headers) => {
|
|
1275
|
+
const res = await fetch(`${url}/agentmemory/livez`, {
|
|
1276
|
+
method: "GET",
|
|
1277
|
+
headers,
|
|
1278
|
+
signal: AbortSignal.timeout(timeoutMs)
|
|
1279
|
+
});
|
|
1280
|
+
return {
|
|
1281
|
+
ok: res.ok,
|
|
1282
|
+
status: res.status,
|
|
1283
|
+
statusText: res.statusText
|
|
1284
|
+
};
|
|
1285
|
+
};
|
|
1286
|
+
let livezProbe = defaultLivezProbe;
|
|
1274
1287
|
async function probe(url) {
|
|
1275
1288
|
const timeout = probeTimeoutMs();
|
|
1276
1289
|
try {
|
|
1277
|
-
const res = await
|
|
1278
|
-
|
|
1279
|
-
headers: authHeader(),
|
|
1280
|
-
signal: AbortSignal.timeout(timeout)
|
|
1281
|
-
});
|
|
1282
|
-
if (!res.ok) process.stderr.write(`[@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`);
|
|
1290
|
+
const res = await livezProbe(url, timeout, authHeader());
|
|
1291
|
+
if (!res.ok) process.stderr.write(`[@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`);
|
|
1283
1292
|
return res.ok;
|
|
1284
1293
|
} catch (err) {
|
|
1285
1294
|
process.stderr.write(`[@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`);
|
|
@@ -1440,7 +1449,7 @@ async function handleProxy(v, handle) {
|
|
|
1440
1449
|
}), true);
|
|
1441
1450
|
case "memory_sessions": return textResponse(await handle.call(`/agentmemory/sessions?limit=${v.limit}`, { method: "GET" }), true);
|
|
1442
1451
|
case "memory_governance_delete": return textResponse(await handle.call("/agentmemory/governance/memories", {
|
|
1443
|
-
method: "
|
|
1452
|
+
method: "DELETE",
|
|
1444
1453
|
body: JSON.stringify({
|
|
1445
1454
|
memoryIds: v.memoryIds,
|
|
1446
1455
|
reason: v.reason
|