@agentmemory/agentmemory 0.8.12 → 0.9.0

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.
@@ -0,0 +1,457 @@
1
+ import { i as generateId } from "./cli.mjs";
2
+ import { n as VERSION, o as getStandalonePersistPath, t as getVisibleTools } from "./tools-registry-DXIK5CxQ.mjs";
3
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
4
+ import { dirname } from "node:path";
5
+ import { createInterface } from "node:readline";
6
+
7
+ //#region src/mcp/in-memory-kv.ts
8
+ var InMemoryKV = class {
9
+ store = /* @__PURE__ */ new Map();
10
+ constructor(persistPath) {
11
+ this.persistPath = persistPath;
12
+ if (persistPath && existsSync(persistPath)) try {
13
+ const data = JSON.parse(readFileSync(persistPath, "utf-8"));
14
+ for (const [scope, entries] of Object.entries(data)) {
15
+ const map = /* @__PURE__ */ new Map();
16
+ for (const [key, value] of Object.entries(entries)) map.set(key, value);
17
+ this.store.set(scope, map);
18
+ }
19
+ } catch {}
20
+ }
21
+ async get(scope, key) {
22
+ return this.store.get(scope)?.get(key) ?? null;
23
+ }
24
+ async set(scope, key, data) {
25
+ if (!this.store.has(scope)) this.store.set(scope, /* @__PURE__ */ new Map());
26
+ this.store.get(scope).set(key, data);
27
+ return data;
28
+ }
29
+ async delete(scope, key) {
30
+ this.store.get(scope)?.delete(key);
31
+ }
32
+ async list(scope) {
33
+ const entries = this.store.get(scope);
34
+ return entries ? Array.from(entries.values()) : [];
35
+ }
36
+ persist() {
37
+ if (!this.persistPath) return;
38
+ try {
39
+ const dir = dirname(this.persistPath);
40
+ if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
41
+ const data = {};
42
+ for (const [scope, entries] of this.store) data[scope] = Object.fromEntries(entries);
43
+ writeFileSync(this.persistPath, JSON.stringify(data), "utf-8");
44
+ } catch (err) {
45
+ process.stderr.write(`[@agentmemory/mcp] Persist failed: ${err instanceof Error ? err.message : String(err)}\n`);
46
+ }
47
+ }
48
+ };
49
+
50
+ //#endregion
51
+ //#region src/mcp/transport.ts
52
+ function isNotification(req) {
53
+ return req.id === void 0 || req.id === null;
54
+ }
55
+ function isValidId(id) {
56
+ return id === void 0 || id === null || typeof id === "string" || typeof id === "number";
57
+ }
58
+ async function processLine(line, handler, writeOut, writeErr = (msg) => process.stderr.write(msg)) {
59
+ const trimmed = line.trim();
60
+ if (!trimmed) return;
61
+ let parsed;
62
+ try {
63
+ parsed = JSON.parse(trimmed);
64
+ } catch {
65
+ writeOut({
66
+ jsonrpc: "2.0",
67
+ id: null,
68
+ error: {
69
+ code: -32700,
70
+ message: "Parse error"
71
+ }
72
+ });
73
+ return;
74
+ }
75
+ const request = parsed;
76
+ const rawId = request?.id;
77
+ if (!request || typeof request !== "object" || request.jsonrpc !== "2.0" || typeof request.method !== "string") {
78
+ if (typeof rawId === "string" || typeof rawId === "number") writeOut({
79
+ jsonrpc: "2.0",
80
+ id: rawId,
81
+ error: {
82
+ code: -32600,
83
+ message: "Invalid Request"
84
+ }
85
+ });
86
+ return;
87
+ }
88
+ if (!isValidId(rawId)) {
89
+ writeOut({
90
+ jsonrpc: "2.0",
91
+ id: null,
92
+ error: {
93
+ code: -32600,
94
+ message: "Invalid Request: id must be string, number, or null"
95
+ }
96
+ });
97
+ return;
98
+ }
99
+ const notification = isNotification(request);
100
+ try {
101
+ const result = await handler(request.method, request.params || {});
102
+ if (notification) return;
103
+ writeOut({
104
+ jsonrpc: "2.0",
105
+ id: request.id,
106
+ result
107
+ });
108
+ } catch (err) {
109
+ if (notification) {
110
+ writeErr(`[mcp-transport] notification handler error for ${request.method}: ${err instanceof Error ? err.message : String(err)}\n`);
111
+ return;
112
+ }
113
+ writeOut({
114
+ jsonrpc: "2.0",
115
+ id: request.id,
116
+ error: {
117
+ code: -32603,
118
+ message: err instanceof Error ? err.message : String(err)
119
+ }
120
+ });
121
+ }
122
+ }
123
+ function createStdioTransport(handler) {
124
+ let rl = null;
125
+ const writeResponse = (response) => {
126
+ process.stdout.write(JSON.stringify(response) + "\n");
127
+ };
128
+ const onLine = (line) => processLine(line, handler, writeResponse);
129
+ return {
130
+ start() {
131
+ rl = createInterface({ input: process.stdin });
132
+ rl.on("line", onLine);
133
+ },
134
+ stop() {
135
+ rl?.close();
136
+ rl = null;
137
+ }
138
+ };
139
+ }
140
+
141
+ //#endregion
142
+ //#region src/mcp/rest-proxy.ts
143
+ const DEFAULT_URL = "http://localhost:3111";
144
+ const HEALTH_PROBE_TIMEOUT_MS = 500;
145
+ const CALL_TIMEOUT_MS = 15e3;
146
+ const LOCAL_MODE_TTL_MS = 3e4;
147
+ let cached = null;
148
+ let cachedAt = 0;
149
+ let probeInFlight = null;
150
+ function baseUrl() {
151
+ return (process.env["AGENTMEMORY_URL"] || DEFAULT_URL).replace(/\/+$/, "");
152
+ }
153
+ function authHeader() {
154
+ const secret = process.env["AGENTMEMORY_SECRET"];
155
+ return secret ? { authorization: `Bearer ${secret}` } : {};
156
+ }
157
+ async function probe(url) {
158
+ try {
159
+ return (await fetch(`${url}/agentmemory/livez`, {
160
+ method: "GET",
161
+ headers: authHeader(),
162
+ signal: AbortSignal.timeout(HEALTH_PROBE_TIMEOUT_MS)
163
+ })).ok;
164
+ } catch {
165
+ return false;
166
+ }
167
+ }
168
+ function invalidateHandle() {
169
+ cached = null;
170
+ cachedAt = 0;
171
+ }
172
+ async function resolveHandle() {
173
+ const now = Date.now();
174
+ if (cached) if (cached.mode === "local" && now - cachedAt >= LOCAL_MODE_TTL_MS) {
175
+ cached = null;
176
+ cachedAt = 0;
177
+ } else return cached;
178
+ if (probeInFlight) return probeInFlight;
179
+ const url = baseUrl();
180
+ probeInFlight = (async () => {
181
+ if (await probe(url)) {
182
+ const handle = {
183
+ mode: "proxy",
184
+ baseUrl: url,
185
+ call: async (path, init) => {
186
+ const res = await fetch(`${url}${path}`, {
187
+ ...init,
188
+ headers: {
189
+ "content-type": "application/json",
190
+ ...authHeader(),
191
+ ...init?.headers
192
+ },
193
+ signal: AbortSignal.timeout(CALL_TIMEOUT_MS)
194
+ });
195
+ if (!res.ok) throw new Error(`${init?.method || "GET"} ${path} -> ${res.status} ${res.statusText}`);
196
+ const text = await res.text();
197
+ return text ? JSON.parse(text) : null;
198
+ }
199
+ };
200
+ cached = handle;
201
+ cachedAt = Date.now();
202
+ return handle;
203
+ }
204
+ const local = { mode: "local" };
205
+ cached = local;
206
+ cachedAt = Date.now();
207
+ return local;
208
+ })();
209
+ try {
210
+ return await probeInFlight;
211
+ } finally {
212
+ probeInFlight = null;
213
+ }
214
+ }
215
+
216
+ //#endregion
217
+ //#region src/mcp/standalone.ts
218
+ const IMPLEMENTED_TOOLS = new Set([
219
+ "memory_save",
220
+ "memory_recall",
221
+ "memory_smart_search",
222
+ "memory_sessions",
223
+ "memory_export",
224
+ "memory_audit",
225
+ "memory_governance_delete"
226
+ ]);
227
+ const SERVER_INFO = {
228
+ name: "agentmemory",
229
+ version: VERSION,
230
+ protocolVersion: "2024-11-05"
231
+ };
232
+ const kv = new InMemoryKV(getStandalonePersistPath());
233
+ let modeAnnounced = false;
234
+ function announceMode(handle) {
235
+ if (modeAnnounced) return;
236
+ modeAnnounced = true;
237
+ if (handle.mode === "proxy") process.stderr.write(`[@agentmemory/mcp] proxying to agentmemory server at ${handle.baseUrl}\n`);
238
+ else process.stderr.write(`[@agentmemory/mcp] no server reachable at ${process.env["AGENTMEMORY_URL"] || "http://localhost:3111"}; falling back to local InMemoryKV\n`);
239
+ }
240
+ function normalizeList(value) {
241
+ if (!value) return [];
242
+ if (Array.isArray(value)) return value.map((v) => typeof v === "string" ? v.trim() : "").filter((v) => v.length > 0);
243
+ if (typeof value === "string") return value.split(",").map((s) => s.trim()).filter((s) => s.length > 0);
244
+ return [];
245
+ }
246
+ const DEFAULT_LIMIT = 10;
247
+ const MAX_LIMIT = 100;
248
+ function parseLimit(raw, fallback = DEFAULT_LIMIT) {
249
+ if (typeof raw !== "number" && typeof raw !== "string") return fallback;
250
+ const n = Number(raw);
251
+ if (!Number.isFinite(n) || n <= 0) return fallback;
252
+ return Math.min(Math.floor(n), MAX_LIMIT);
253
+ }
254
+ function textResponse(payload, pretty = false) {
255
+ return { content: [{
256
+ type: "text",
257
+ text: JSON.stringify(payload, null, pretty ? 2 : 0)
258
+ }] };
259
+ }
260
+ function validate(toolName, args) {
261
+ if (!IMPLEMENTED_TOOLS.has(toolName)) throw new Error(`Unknown tool: ${toolName}`);
262
+ const v = { tool: toolName };
263
+ switch (toolName) {
264
+ case "memory_save": {
265
+ const content = args["content"];
266
+ if (typeof content !== "string" || !content.trim()) throw new Error("content is required");
267
+ v.content = content;
268
+ v.type = args["type"] || "fact";
269
+ v.concepts = normalizeList(args["concepts"]);
270
+ v.files = normalizeList(args["files"]);
271
+ return v;
272
+ }
273
+ case "memory_recall":
274
+ case "memory_smart_search": {
275
+ const query = args["query"];
276
+ if (typeof query !== "string" || !query.trim()) throw new Error("query is required");
277
+ v.query = query.trim();
278
+ v.limit = parseLimit(args["limit"]);
279
+ return v;
280
+ }
281
+ case "memory_sessions":
282
+ v.limit = parseLimit(args["limit"], 20);
283
+ return v;
284
+ case "memory_governance_delete": {
285
+ const ids = normalizeList(args["memoryIds"]);
286
+ if (ids.length === 0) throw new Error("memoryIds is required");
287
+ v.memoryIds = ids;
288
+ v.reason = args["reason"] || "plugin skill request";
289
+ return v;
290
+ }
291
+ case "memory_export": return v;
292
+ case "memory_audit":
293
+ v.limit = parseLimit(args["limit"], 50);
294
+ return v;
295
+ default: throw new Error(`Unknown tool: ${toolName}`);
296
+ }
297
+ }
298
+ async function handleProxy(v, handle) {
299
+ switch (v.tool) {
300
+ case "memory_save": return textResponse(await handle.call("/agentmemory/remember", {
301
+ method: "POST",
302
+ body: JSON.stringify({
303
+ content: v.content,
304
+ type: v.type,
305
+ concepts: v.concepts,
306
+ files: v.files
307
+ })
308
+ }));
309
+ case "memory_recall":
310
+ case "memory_smart_search": return textResponse(await handle.call("/agentmemory/smart-search", {
311
+ method: "POST",
312
+ body: JSON.stringify({
313
+ query: v.query,
314
+ limit: v.limit
315
+ })
316
+ }), true);
317
+ case "memory_sessions": return textResponse(await handle.call(`/agentmemory/sessions?limit=${v.limit}`, { method: "GET" }), true);
318
+ case "memory_governance_delete": return textResponse(await handle.call("/agentmemory/governance/memories", {
319
+ method: "POST",
320
+ body: JSON.stringify({
321
+ memoryIds: v.memoryIds,
322
+ reason: v.reason
323
+ })
324
+ }));
325
+ case "memory_export": return textResponse(await handle.call("/agentmemory/export", { method: "GET" }), true);
326
+ case "memory_audit": return textResponse(await handle.call(`/agentmemory/audit?limit=${v.limit}`, { method: "GET" }), true);
327
+ default: throw new Error(`Unknown tool: ${v.tool}`);
328
+ }
329
+ }
330
+ async function handleLocal(v, kvInstance) {
331
+ switch (v.tool) {
332
+ case "memory_save": {
333
+ const id = generateId("mem");
334
+ const isoNow = (/* @__PURE__ */ new Date()).toISOString();
335
+ await kvInstance.set("mem:memories", id, {
336
+ id,
337
+ type: v.type,
338
+ title: (v.content || "").slice(0, 80),
339
+ content: v.content,
340
+ concepts: v.concepts,
341
+ files: v.files,
342
+ createdAt: isoNow,
343
+ updatedAt: isoNow,
344
+ strength: 7,
345
+ version: 1,
346
+ isLatest: true,
347
+ sessionIds: []
348
+ });
349
+ kvInstance.persist();
350
+ return textResponse({ saved: id });
351
+ }
352
+ case "memory_recall":
353
+ case "memory_smart_search": {
354
+ const query = (v.query || "").toLowerCase();
355
+ const limit = v.limit ?? DEFAULT_LIMIT;
356
+ return textResponse({
357
+ mode: "compact",
358
+ results: (await kvInstance.list("mem:memories")).filter((m) => {
359
+ const text = [
360
+ typeof m["title"] === "string" ? m["title"] : "",
361
+ typeof m["content"] === "string" ? m["content"] : "",
362
+ Array.isArray(m["files"]) ? m["files"].join(" ") : "",
363
+ Array.isArray(m["concepts"]) ? m["concepts"].join(" ") : "",
364
+ Array.isArray(m["sessionIds"]) ? m["sessionIds"].join(" ") : "",
365
+ typeof m["id"] === "string" ? m["id"] : ""
366
+ ].join(" ").toLowerCase();
367
+ return query.split(/\s+/).every((word) => text.includes(word));
368
+ }).slice(0, limit)
369
+ }, true);
370
+ }
371
+ case "memory_sessions": {
372
+ const sessions = await kvInstance.list("mem:sessions");
373
+ const limit = v.limit ?? 20;
374
+ return textResponse({ sessions: sessions.slice(0, limit) }, true);
375
+ }
376
+ case "memory_governance_delete": {
377
+ let deleted = 0;
378
+ for (const id of v.memoryIds || []) if (await kvInstance.get("mem:memories", id)) {
379
+ await kvInstance.delete("mem:memories", id);
380
+ deleted++;
381
+ }
382
+ kvInstance.persist();
383
+ return textResponse({
384
+ deleted,
385
+ requested: (v.memoryIds || []).length,
386
+ reason: v.reason
387
+ });
388
+ }
389
+ case "memory_export": return textResponse({
390
+ version: VERSION,
391
+ memories: await kvInstance.list("mem:memories"),
392
+ sessions: await kvInstance.list("mem:sessions")
393
+ }, true);
394
+ case "memory_audit": {
395
+ const entries = await kvInstance.list("mem:audit");
396
+ const limit = v.limit ?? 50;
397
+ return textResponse({ entries: entries.slice(0, limit) }, true);
398
+ }
399
+ default: throw new Error(`Unknown tool: ${v.tool}`);
400
+ }
401
+ }
402
+ async function handleToolCall(toolName, args, kvInstance = kv) {
403
+ const validated = validate(toolName, args);
404
+ const handle = await resolveHandle();
405
+ announceMode(handle);
406
+ if (handle.mode === "proxy") try {
407
+ return await handleProxy(validated, handle);
408
+ } catch (err) {
409
+ process.stderr.write(`[@agentmemory/mcp] proxy call failed for ${toolName}: ${err instanceof Error ? err.message : String(err)}; invalidating handle and falling back to local KV\n`);
410
+ invalidateHandle();
411
+ }
412
+ return handleLocal(validated, kvInstance);
413
+ }
414
+ const transport = createStdioTransport(async (method, params) => {
415
+ switch (method) {
416
+ case "initialize": return {
417
+ protocolVersion: SERVER_INFO.protocolVersion,
418
+ capabilities: { tools: { listChanged: false } },
419
+ serverInfo: {
420
+ name: SERVER_INFO.name,
421
+ version: SERVER_INFO.version
422
+ }
423
+ };
424
+ case "notifications/initialized": return {};
425
+ case "tools/list": return { tools: getVisibleTools().filter((t) => IMPLEMENTED_TOOLS.has(t.name)) };
426
+ case "tools/call": {
427
+ const toolName = params.name;
428
+ const toolArgs = params.arguments || {};
429
+ try {
430
+ return await handleToolCall(toolName, toolArgs);
431
+ } catch (err) {
432
+ return {
433
+ content: [{
434
+ type: "text",
435
+ text: `Error: ${err instanceof Error ? err.message : String(err)}`
436
+ }],
437
+ isError: true
438
+ };
439
+ }
440
+ }
441
+ default: throw new Error(`Unknown method: ${method}`);
442
+ }
443
+ });
444
+ process.stderr.write(`[@agentmemory/mcp] Standalone MCP server v${SERVER_INFO.version} starting...\n`);
445
+ transport.start();
446
+ process.on("SIGINT", () => {
447
+ kv.persist();
448
+ process.exit(0);
449
+ });
450
+ process.on("SIGTERM", () => {
451
+ kv.persist();
452
+ process.exit(0);
453
+ });
454
+
455
+ //#endregion
456
+ export { };
457
+ //# sourceMappingURL=standalone-DXc-BEqr.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standalone-DXc-BEqr.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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"}
@@ -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;;;iBCiBoB,cAAA,CACpB,QAAA,UACA,IAAA,EAAM,MAAA,mBACN,UAAA,GAAY,UAAA,GACX,OAAA;EAAU,OAAA,EAAS,KAAA;IAAQ,IAAA;IAAc,IAAA;EAAA;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;;;iBC2PoB,cAAA,CACpB,QAAA,UACA,IAAA,EAAM,MAAA,mBACN,UAAA,GAAY,UAAA,GACX,OAAA;EAAU,OAAA,EAAS,KAAA;IAAQ,IAAA;IAAc,IAAA;EAAA;AAAA"}