@agentmemory/agentmemory 0.9.5 → 0.9.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/dist/cli.mjs +12 -5
  2. package/dist/cli.mjs.map +1 -1
  3. package/dist/docker-compose.yml +5 -0
  4. package/dist/hooks/session-start.mjs +23 -10
  5. package/dist/hooks/session-start.mjs.map +1 -1
  6. package/dist/hooks/subagent-start.mjs +17 -18
  7. package/dist/hooks/subagent-start.mjs.map +1 -1
  8. package/dist/iii-config.docker.yaml +2 -2
  9. package/dist/image-refs-B2vyIEyZ.mjs +3 -0
  10. package/dist/{image-store-DnuCI2RB.mjs → image-store-Bx3J2RQ8.mjs} +1 -1
  11. package/dist/index.mjs +35 -34
  12. package/dist/index.mjs.map +1 -1
  13. package/dist/{src-xYHSzz5S.mjs → src-DbgW4F8O.mjs} +43 -42
  14. package/dist/src-DbgW4F8O.mjs.map +1 -0
  15. package/dist/{standalone-BvKacAId.mjs → standalone-CFJp7B7c.mjs} +71 -10
  16. package/dist/standalone-CFJp7B7c.mjs.map +1 -0
  17. package/dist/standalone.d.mts.map +1 -1
  18. package/dist/standalone.mjs +70 -9
  19. package/dist/standalone.mjs.map +1 -1
  20. package/dist/{tools-registry-BWM0vWeA.mjs → tools-registry-UpRrZBDD.mjs} +2 -2
  21. package/dist/{tools-registry-BWM0vWeA.mjs.map → tools-registry-UpRrZBDD.mjs.map} +1 -1
  22. package/docker-compose.yml +5 -0
  23. package/iii-config.docker.yaml +2 -2
  24. package/package.json +1 -1
  25. package/plugin/.claude-plugin/plugin.json +1 -1
  26. package/plugin/scripts/session-start.mjs +23 -10
  27. package/plugin/scripts/session-start.mjs.map +1 -1
  28. package/plugin/scripts/subagent-start.mjs +17 -18
  29. package/plugin/scripts/subagent-start.mjs.map +1 -1
  30. package/dist/image-refs-DRse_ePx.mjs +0 -3
  31. package/dist/src-xYHSzz5S.mjs.map +0 -1
  32. package/dist/standalone-BvKacAId.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"standalone-BvKacAId.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 HEALTH_PROBE_TIMEOUT_MS = 500;\nconst CALL_TIMEOUT_MS = 15_000;\nconst LOCAL_MODE_TTL_MS = 30_000;\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\nasync function probe(url: string): Promise<boolean> {\n try {\n const res = await fetch(`${url}/agentmemory/livez`, {\n method: \"GET\",\n headers: authHeader(),\n signal: AbortSignal.timeout(HEALTH_PROBE_TIMEOUT_MS),\n });\n return res.ok;\n } catch {\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 probeInFlight = (async () => {\n const up = await probe(url);\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}\n","#!/usr/bin/env node\n\nimport { InMemoryKV } from \"./in-memory-kv.js\";\nimport { createStdioTransport } from \"./transport.js\";\nimport { getVisibleTools } 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: \"POST\",\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\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 validated = validate(toolName, args);\n const handle = await resolveHandle();\n announceMode(handle);\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\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 {\n tools: getVisibleTools().filter((t) => IMPLEMENTED_TOOLS.has(t.name)),\n };\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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"}