@hasna/mementos 0.4.13 → 0.4.15

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/dist/mcp/index.js CHANGED
@@ -6190,7 +6190,7 @@ ${lines.join(`
6190
6190
  return { content: [{ type: "text", text: formatError(e) }], isError: true };
6191
6191
  }
6192
6192
  });
6193
- server.tool("memory_update", "Update a memory's metadata (value, importance, tags, etc.)", {
6193
+ server.tool("memory_update", "Update a memory's metadata (value, importance, tags, etc.). version is optional \u2014 auto-fetched if omitted.", {
6194
6194
  id: exports_external.string(),
6195
6195
  value: exports_external.string().optional(),
6196
6196
  category: exports_external.enum(["preference", "fact", "knowledge", "history"]).optional(),
@@ -6202,18 +6202,58 @@ server.tool("memory_update", "Update a memory's metadata (value, importance, tag
6202
6202
  status: exports_external.enum(["active", "archived", "expired"]).optional(),
6203
6203
  metadata: exports_external.record(exports_external.unknown()).optional(),
6204
6204
  expires_at: exports_external.string().nullable().optional(),
6205
- version: exports_external.coerce.number()
6205
+ version: exports_external.coerce.number().optional()
6206
6206
  }, async (args) => {
6207
6207
  try {
6208
6208
  const id = resolveId(args.id);
6209
- const { id: _id, ...updateFields } = args;
6210
- const memory = updateMemory(id, updateFields);
6209
+ const { id: _id, version, ...updateFields } = args;
6210
+ const resolvedVersion = version ?? getMemory(id)?.version;
6211
+ if (resolvedVersion === undefined) {
6212
+ return { content: [{ type: "text", text: `Memory not found: ${id}` }] };
6213
+ }
6214
+ const memory = updateMemory(id, { ...updateFields, version: resolvedVersion });
6211
6215
  return { content: [{ type: "text", text: `Memory updated:
6212
6216
  ${formatMemory(memory)}` }] };
6213
6217
  } catch (e) {
6214
6218
  return { content: [{ type: "text", text: formatError(e) }], isError: true };
6215
6219
  }
6216
6220
  });
6221
+ server.tool("memory_pin", "Pin or unpin a memory by ID or key. No version needed.", {
6222
+ id: exports_external.string().optional(),
6223
+ key: exports_external.string().optional(),
6224
+ pinned: exports_external.boolean().optional(),
6225
+ scope: exports_external.enum(["global", "shared", "private"]).optional(),
6226
+ agent_id: exports_external.string().optional(),
6227
+ project_id: exports_external.string().optional()
6228
+ }, async (args) => {
6229
+ try {
6230
+ let memory = args.id ? getMemory(resolveId(args.id)) : getMemoryByKey(args.key, args.scope, args.agent_id, args.project_id);
6231
+ if (!memory)
6232
+ return { content: [{ type: "text", text: `Memory not found.` }] };
6233
+ const pinned = args.pinned !== false;
6234
+ updateMemory(memory.id, { pinned, version: memory.version });
6235
+ return { content: [{ type: "text", text: `Memory "${memory.key}" ${pinned ? "pinned" : "unpinned"}.` }] };
6236
+ } catch (e) {
6237
+ return { content: [{ type: "text", text: formatError(e) }], isError: true };
6238
+ }
6239
+ });
6240
+ server.tool("memory_archive", "Archive a memory by ID or key (hides from lists, keeps history). No version needed.", {
6241
+ id: exports_external.string().optional(),
6242
+ key: exports_external.string().optional(),
6243
+ scope: exports_external.enum(["global", "shared", "private"]).optional(),
6244
+ agent_id: exports_external.string().optional(),
6245
+ project_id: exports_external.string().optional()
6246
+ }, async (args) => {
6247
+ try {
6248
+ let memory = args.id ? getMemory(resolveId(args.id)) : getMemoryByKey(args.key, args.scope, args.agent_id, args.project_id);
6249
+ if (!memory)
6250
+ return { content: [{ type: "text", text: `Memory not found.` }] };
6251
+ updateMemory(memory.id, { status: "archived", version: memory.version });
6252
+ return { content: [{ type: "text", text: `Memory "${memory.key}" archived.` }] };
6253
+ } catch (e) {
6254
+ return { content: [{ type: "text", text: formatError(e) }], isError: true };
6255
+ }
6256
+ });
6217
6257
  server.tool("memory_forget", "Delete a memory by ID or key", {
6218
6258
  id: exports_external.string().optional(),
6219
6259
  key: exports_external.string().optional(),
@@ -7041,11 +7081,11 @@ var FULL_SCHEMAS = {
7041
7081
  example: '{"scope":"global","min_importance":7,"limit":20}'
7042
7082
  },
7043
7083
  memory_update: {
7044
- description: "Update a memory's fields. Requires current version for optimistic concurrency.",
7084
+ description: "Update a memory's fields. version is optional \u2014 auto-fetched if omitted (eliminates 2-round-trip pattern).",
7045
7085
  category: "memory",
7046
7086
  params: {
7047
7087
  id: { type: "string", description: "Memory ID (partial OK)", required: true },
7048
- version: { type: "number", description: "Current version (for conflict detection)", required: true },
7088
+ version: { type: "number", description: "Current version for conflict detection (omit to auto-fetch)" },
7049
7089
  value: { type: "string", description: "New value" },
7050
7090
  category: { type: "string", description: "New category", enum: ["preference", "fact", "knowledge", "history"] },
7051
7091
  scope: { type: "string", description: "New scope", enum: ["global", "shared", "private"] },
@@ -7059,6 +7099,27 @@ var FULL_SCHEMAS = {
7059
7099
  },
7060
7100
  example: '{"id":"abc123","version":1,"importance":9,"tags":["correction","important"]}'
7061
7101
  },
7102
+ memory_pin: {
7103
+ description: "Pin or unpin a memory by ID or key. No version required.",
7104
+ category: "memory",
7105
+ params: {
7106
+ id: { type: "string", description: "Memory ID" },
7107
+ key: { type: "string", description: "Memory key (alternative to id)" },
7108
+ pinned: { type: "boolean", description: "true=pin (default), false=unpin" },
7109
+ scope: { type: "string", description: "Scope filter for key lookup", enum: ["global", "shared", "private"] }
7110
+ },
7111
+ example: '{"key":"project-stack","pinned":true}'
7112
+ },
7113
+ memory_archive: {
7114
+ description: "Archive a memory by ID or key. Hides from lists, preserves history. No version required.",
7115
+ category: "memory",
7116
+ params: {
7117
+ id: { type: "string", description: "Memory ID" },
7118
+ key: { type: "string", description: "Memory key (alternative to id)" },
7119
+ scope: { type: "string", description: "Scope filter for key lookup", enum: ["global", "shared", "private"] }
7120
+ },
7121
+ example: '{"key":"old-project-stack"}'
7122
+ },
7062
7123
  memory_forget: {
7063
7124
  description: "Delete a memory by ID or key.",
7064
7125
  category: "memory",
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":";AACA;;;GAGG;AAkkCH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAkH9C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":";AACA;;;GAGG;AAukCH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAkH9C"}
@@ -2418,11 +2418,15 @@ addRoute("PATCH", "/api/memories/:id", async (req, _url, params) => {
2418
2418
  if (!body) {
2419
2419
  return errorResponse("Invalid JSON body", 400);
2420
2420
  }
2421
- if (body["version"] === undefined) {
2422
- return errorResponse("Missing required field: version", 400);
2421
+ const updateBody = { ...body };
2422
+ if (updateBody["version"] === undefined) {
2423
+ const existing = getMemory(params["id"]);
2424
+ if (!existing)
2425
+ return errorResponse("Memory not found", 404);
2426
+ updateBody["version"] = existing.version;
2423
2427
  }
2424
2428
  try {
2425
- const memory = updateMemory(params["id"], body);
2429
+ const memory = updateMemory(params["id"], updateBody);
2426
2430
  return json(memory);
2427
2431
  } catch (e) {
2428
2432
  if (e instanceof MemoryNotFoundError) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hasna/mementos",
3
- "version": "0.4.13",
3
+ "version": "0.4.15",
4
4
  "description": "Universal memory system for AI agents - CLI + MCP server + library API",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",