@agentmemory/agentmemory 0.9.5 → 0.9.6

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/cli.mjs CHANGED
@@ -354,12 +354,12 @@ async function main() {
354
354
  p.intro("agentmemory");
355
355
  if (skipEngine) {
356
356
  p.log.info("Skipping engine check (--no-engine)");
357
- await import("./src-xYHSzz5S.mjs");
357
+ await import("./src-C7vGxttN.mjs");
358
358
  return;
359
359
  }
360
360
  if (await isEngineRunning()) {
361
361
  p.log.success("iii-engine is running");
362
- await import("./src-xYHSzz5S.mjs");
362
+ await import("./src-C7vGxttN.mjs");
363
363
  return;
364
364
  }
365
365
  if (!await startEngine()) {
@@ -403,7 +403,7 @@ async function main() {
403
403
  process.exit(1);
404
404
  }
405
405
  s.stop("iii-engine is ready");
406
- await import("./src-xYHSzz5S.mjs");
406
+ await import("./src-C7vGxttN.mjs");
407
407
  }
408
408
  async function apiFetch(base, path, timeoutMs = 5e3) {
409
409
  try {
@@ -865,7 +865,7 @@ async function runUpgrade() {
865
865
  ].join("\n"), "agentmemory upgrade");
866
866
  }
867
867
  async function runMcp() {
868
- await import("./standalone-BvKacAId.mjs");
868
+ await import("./standalone-DnSJzyXL.mjs");
869
869
  }
870
870
  async function runImportJsonl() {
871
871
  const VALUE_FLAGS = new Set(["--port", "--tools"]);
@@ -8,6 +8,8 @@ function isSdkChildContext(payload) {
8
8
  const INJECT_CONTEXT = process.env["AGENTMEMORY_INJECT_CONTEXT"] === "true";
9
9
  const REST_URL = process.env["AGENTMEMORY_URL"] || "http://localhost:3111";
10
10
  const SECRET = process.env["AGENTMEMORY_SECRET"] || "";
11
+ const INJECT_TIMEOUT_MS = 1500;
12
+ const REGISTER_TIMEOUT_MS = 800;
11
13
  function authHeaders() {
12
14
  const h = { "Content-Type": "application/json" };
13
15
  if (SECRET) h["Authorization"] = `Bearer ${SECRET}`;
@@ -25,18 +27,29 @@ async function main() {
25
27
  if (isSdkChildContext(data)) return;
26
28
  const sessionId = data.session_id || `ses_${Date.now().toString(36)}`;
27
29
  const project = data.cwd || process.cwd();
30
+ const url = `${REST_URL}/agentmemory/session/start`;
31
+ const init = {
32
+ method: "POST",
33
+ headers: authHeaders(),
34
+ body: JSON.stringify({
35
+ sessionId,
36
+ project,
37
+ cwd: project
38
+ })
39
+ };
40
+ if (!INJECT_CONTEXT) {
41
+ fetch(url, {
42
+ ...init,
43
+ signal: AbortSignal.timeout(REGISTER_TIMEOUT_MS)
44
+ }).catch(() => {});
45
+ return;
46
+ }
28
47
  try {
29
- const res = await fetch(`${REST_URL}/agentmemory/session/start`, {
30
- method: "POST",
31
- headers: authHeaders(),
32
- body: JSON.stringify({
33
- sessionId,
34
- project,
35
- cwd: project
36
- }),
37
- signal: AbortSignal.timeout(5e3)
48
+ const res = await fetch(url, {
49
+ ...init,
50
+ signal: AbortSignal.timeout(INJECT_TIMEOUT_MS)
38
51
  });
39
- if (INJECT_CONTEXT && res.ok) {
52
+ if (res.ok) {
40
53
  const result = await res.json();
41
54
  if (result.context) process.stdout.write(result.context);
42
55
  }
@@ -1 +1 @@
1
- {"version":3,"file":"session-start.mjs","names":[],"sources":["../../src/hooks/session-start.ts"],"sourcesContent":["#!/usr/bin/env node\n\nfunction isSdkChildContext(payload: unknown): boolean {\n if (process.env[\"AGENTMEMORY_SDK_CHILD\"] === \"1\") return true;\n if (!payload || typeof payload !== \"object\") return false;\n return (payload as { entrypoint?: unknown }).entrypoint === \"sdk-ts\";\n}\n\n// Session-start hook.\n//\n// Always registers the session for observation tracking (so memories\n// captured on PostToolUse get attached to the right session). Only writes\n// project context to stdout — which Claude Code prepends to the very first\n// turn — when AGENTMEMORY_INJECT_CONTEXT=true. Default off as of 0.8.10\n// (#143); see pre-tool-use.ts for the full explanation.\nconst INJECT_CONTEXT = process.env[\"AGENTMEMORY_INJECT_CONTEXT\"] === \"true\";\n\nconst REST_URL = process.env[\"AGENTMEMORY_URL\"] || \"http://localhost:3111\";\nconst SECRET = process.env[\"AGENTMEMORY_SECRET\"] || \"\";\n\nfunction authHeaders(): Record<string, string> {\n const h: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (SECRET) h[\"Authorization\"] = `Bearer ${SECRET}`;\n return h;\n}\n\nasync function main() {\n let input = \"\";\n for await (const chunk of process.stdin) {\n input += chunk;\n }\n\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(input);\n } catch {\n return;\n }\n\n if (isSdkChildContext(data)) return;\n\n const sessionId =\n (data.session_id as string) || `ses_${Date.now().toString(36)}`;\n const project = (data.cwd as string) || process.cwd();\n\n try {\n const res = await fetch(`${REST_URL}/agentmemory/session/start`, {\n method: \"POST\",\n headers: authHeaders(),\n body: JSON.stringify({ sessionId, project, cwd: project }),\n signal: AbortSignal.timeout(5000),\n });\n\n // Only write context to stdout when the user has explicitly opted\n // into injection. Registering the session is cheap and doesn't touch\n // Claude Code's input token window.\n if (INJECT_CONTEXT && res.ok) {\n const result = (await res.json()) as { context?: string };\n if (result.context) {\n process.stdout.write(result.context);\n }\n }\n } catch {\n // silently fail -- don't block Claude Code startup\n }\n}\n\nmain();\n"],"mappings":";;AAEA,SAAS,kBAAkB,SAA2B;AACpD,KAAI,QAAQ,IAAI,6BAA6B,IAAK,QAAO;AACzD,KAAI,CAAC,WAAW,OAAO,YAAY,SAAU,QAAO;AACpD,QAAQ,QAAqC,eAAe;;AAU9D,MAAM,iBAAiB,QAAQ,IAAI,kCAAkC;AAErE,MAAM,WAAW,QAAQ,IAAI,sBAAsB;AACnD,MAAM,SAAS,QAAQ,IAAI,yBAAyB;AAEpD,SAAS,cAAsC;CAC7C,MAAM,IAA4B,EAAE,gBAAgB,oBAAoB;AACxE,KAAI,OAAQ,GAAE,mBAAmB,UAAU;AAC3C,QAAO;;AAGT,eAAe,OAAO;CACpB,IAAI,QAAQ;AACZ,YAAW,MAAM,SAAS,QAAQ,MAChC,UAAS;CAGX,IAAI;AACJ,KAAI;AACF,SAAO,KAAK,MAAM,MAAM;SAClB;AACN;;AAGF,KAAI,kBAAkB,KAAK,CAAE;CAE7B,MAAM,YACH,KAAK,cAAyB,OAAO,KAAK,KAAK,CAAC,SAAS,GAAG;CAC/D,MAAM,UAAW,KAAK,OAAkB,QAAQ,KAAK;AAErD,KAAI;EACF,MAAM,MAAM,MAAM,MAAM,GAAG,SAAS,6BAA6B;GAC/D,QAAQ;GACR,SAAS,aAAa;GACtB,MAAM,KAAK,UAAU;IAAE;IAAW;IAAS,KAAK;IAAS,CAAC;GAC1D,QAAQ,YAAY,QAAQ,IAAK;GAClC,CAAC;AAKF,MAAI,kBAAkB,IAAI,IAAI;GAC5B,MAAM,SAAU,MAAM,IAAI,MAAM;AAChC,OAAI,OAAO,QACT,SAAQ,OAAO,MAAM,OAAO,QAAQ;;SAGlC;;AAKV,MAAM"}
1
+ {"version":3,"file":"session-start.mjs","names":[],"sources":["../../src/hooks/session-start.ts"],"sourcesContent":["#!/usr/bin/env node\n\n// Inlined from ./sdk-guard so each hook bundles to a single self-contained\n// .mjs (matches the pattern used by every other hook entry in tsdown.config).\nfunction isSdkChildContext(payload: unknown): boolean {\n if (process.env[\"AGENTMEMORY_SDK_CHILD\"] === \"1\") return true;\n if (!payload || typeof payload !== \"object\") return false;\n return (payload as { entrypoint?: unknown }).entrypoint === \"sdk-ts\";\n}\n\n// Session-start hook.\n//\n// Always registers the session for observation tracking (so memories\n// captured on PostToolUse get attached to the right session). Only writes\n// project context to stdout — which Claude Code prepends to the very first\n// turn — when AGENTMEMORY_INJECT_CONTEXT=true. Default off as of 0.8.10\n// (#143); see pre-tool-use.ts for the full explanation.\nconst INJECT_CONTEXT = process.env[\"AGENTMEMORY_INJECT_CONTEXT\"] === \"true\";\n\nconst REST_URL = process.env[\"AGENTMEMORY_URL\"] || \"http://localhost:3111\";\nconst SECRET = process.env[\"AGENTMEMORY_SECRET\"] || \"\";\n\n// When the server is unreachable a 5s timeout multiplies hard under\n// concurrent fan-out (Slack bots, multi-agent harnesses) and becomes a\n// positive feedback loop that OOM-kills iii-engine (#221). Cap tight on\n// both paths and skip the await entirely when the response is unused.\nconst INJECT_TIMEOUT_MS = 1500;\nconst REGISTER_TIMEOUT_MS = 800;\n\nfunction authHeaders(): Record<string, string> {\n const h: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (SECRET) h[\"Authorization\"] = `Bearer ${SECRET}`;\n return h;\n}\n\nasync function main() {\n let input = \"\";\n for await (const chunk of process.stdin) {\n input += chunk;\n }\n\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(input);\n } catch {\n return;\n }\n\n if (isSdkChildContext(data)) return;\n\n const sessionId =\n (data.session_id as string) || `ses_${Date.now().toString(36)}`;\n const project = (data.cwd as string) || process.cwd();\n\n const url = `${REST_URL}/agentmemory/session/start`;\n const init: RequestInit = {\n method: \"POST\",\n headers: authHeaders(),\n body: JSON.stringify({ sessionId, project, cwd: project }),\n };\n\n if (!INJECT_CONTEXT) {\n // Pure telemetry path: caller never reads the response, so don't\n // block on it. AbortSignal.timeout caps the wait the event loop\n // gives the pending socket before exit.\n fetch(url, {\n ...init,\n signal: AbortSignal.timeout(REGISTER_TIMEOUT_MS),\n }).catch(() => {});\n return;\n }\n\n try {\n const res = await fetch(url, {\n ...init,\n signal: AbortSignal.timeout(INJECT_TIMEOUT_MS),\n });\n if (res.ok) {\n const result = (await res.json()) as { context?: string };\n if (result.context) {\n process.stdout.write(result.context);\n }\n }\n } catch {\n // silently fail -- don't block Claude Code startup\n }\n}\n\nmain();\n"],"mappings":";;AAIA,SAAS,kBAAkB,SAA2B;AACpD,KAAI,QAAQ,IAAI,6BAA6B,IAAK,QAAO;AACzD,KAAI,CAAC,WAAW,OAAO,YAAY,SAAU,QAAO;AACpD,QAAQ,QAAqC,eAAe;;AAU9D,MAAM,iBAAiB,QAAQ,IAAI,kCAAkC;AAErE,MAAM,WAAW,QAAQ,IAAI,sBAAsB;AACnD,MAAM,SAAS,QAAQ,IAAI,yBAAyB;AAMpD,MAAM,oBAAoB;AAC1B,MAAM,sBAAsB;AAE5B,SAAS,cAAsC;CAC7C,MAAM,IAA4B,EAAE,gBAAgB,oBAAoB;AACxE,KAAI,OAAQ,GAAE,mBAAmB,UAAU;AAC3C,QAAO;;AAGT,eAAe,OAAO;CACpB,IAAI,QAAQ;AACZ,YAAW,MAAM,SAAS,QAAQ,MAChC,UAAS;CAGX,IAAI;AACJ,KAAI;AACF,SAAO,KAAK,MAAM,MAAM;SAClB;AACN;;AAGF,KAAI,kBAAkB,KAAK,CAAE;CAE7B,MAAM,YACH,KAAK,cAAyB,OAAO,KAAK,KAAK,CAAC,SAAS,GAAG;CAC/D,MAAM,UAAW,KAAK,OAAkB,QAAQ,KAAK;CAErD,MAAM,MAAM,GAAG,SAAS;CACxB,MAAM,OAAoB;EACxB,QAAQ;EACR,SAAS,aAAa;EACtB,MAAM,KAAK,UAAU;GAAE;GAAW;GAAS,KAAK;GAAS,CAAC;EAC3D;AAED,KAAI,CAAC,gBAAgB;AAInB,QAAM,KAAK;GACT,GAAG;GACH,QAAQ,YAAY,QAAQ,oBAAoB;GACjD,CAAC,CAAC,YAAY,GAAG;AAClB;;AAGF,KAAI;EACF,MAAM,MAAM,MAAM,MAAM,KAAK;GAC3B,GAAG;GACH,QAAQ,YAAY,QAAQ,kBAAkB;GAC/C,CAAC;AACF,MAAI,IAAI,IAAI;GACV,MAAM,SAAU,MAAM,IAAI,MAAM;AAChC,OAAI,OAAO,QACT,SAAQ,OAAO,MAAM,OAAO,QAAQ;;SAGlC;;AAKV,MAAM"}
@@ -7,6 +7,7 @@ function isSdkChildContext(payload) {
7
7
  }
8
8
  const REST_URL = process.env["AGENTMEMORY_URL"] || "http://localhost:3111";
9
9
  const SECRET = process.env["AGENTMEMORY_SECRET"] || "";
10
+ const TIMEOUT_MS = 800;
10
11
  function authHeaders() {
11
12
  const h = { "Content-Type": "application/json" };
12
13
  if (SECRET) h["Authorization"] = `Bearer ${SECRET}`;
@@ -23,24 +24,22 @@ async function main() {
23
24
  }
24
25
  if (isSdkChildContext(data)) return;
25
26
  const sessionId = data.session_id || "unknown";
26
- try {
27
- await fetch(`${REST_URL}/agentmemory/observe`, {
28
- method: "POST",
29
- headers: authHeaders(),
30
- body: JSON.stringify({
31
- hookType: "subagent_start",
32
- sessionId,
33
- project: data.cwd || process.cwd(),
34
- cwd: data.cwd || process.cwd(),
35
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
36
- data: {
37
- agent_id: data.agent_id,
38
- agent_type: data.agent_type
39
- }
40
- }),
41
- signal: AbortSignal.timeout(2e3)
42
- });
43
- } catch {}
27
+ fetch(`${REST_URL}/agentmemory/observe`, {
28
+ method: "POST",
29
+ headers: authHeaders(),
30
+ body: JSON.stringify({
31
+ hookType: "subagent_start",
32
+ sessionId,
33
+ project: data.cwd || process.cwd(),
34
+ cwd: data.cwd || process.cwd(),
35
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
36
+ data: {
37
+ agent_id: data.agent_id,
38
+ agent_type: data.agent_type
39
+ }
40
+ }),
41
+ signal: AbortSignal.timeout(TIMEOUT_MS)
42
+ }).catch(() => {});
44
43
  }
45
44
  main();
46
45
 
@@ -1 +1 @@
1
- {"version":3,"file":"subagent-start.mjs","names":[],"sources":["../../src/hooks/subagent-start.ts"],"sourcesContent":["#!/usr/bin/env node\n\nfunction isSdkChildContext(payload: unknown): boolean {\n if (process.env[\"AGENTMEMORY_SDK_CHILD\"] === \"1\") return true;\n if (!payload || typeof payload !== \"object\") return false;\n return (payload as { entrypoint?: unknown }).entrypoint === \"sdk-ts\";\n}\n\nconst REST_URL = process.env[\"AGENTMEMORY_URL\"] || \"http://localhost:3111\";\nconst SECRET = process.env[\"AGENTMEMORY_SECRET\"] || \"\";\n\nfunction authHeaders(): Record<string, string> {\n const h: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (SECRET) h[\"Authorization\"] = `Bearer ${SECRET}`;\n return h;\n}\n\nasync function main() {\n let input = \"\";\n for await (const chunk of process.stdin) {\n input += chunk;\n }\n\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(input);\n } catch {\n return;\n }\n\n if (isSdkChildContext(data)) return;\n\n const sessionId = (data.session_id as string) || \"unknown\";\n\n try {\n await fetch(`${REST_URL}/agentmemory/observe`, {\n method: \"POST\",\n headers: authHeaders(),\n body: JSON.stringify({\n hookType: \"subagent_start\",\n sessionId,\n project: data.cwd || process.cwd(),\n cwd: data.cwd || process.cwd(),\n timestamp: new Date().toISOString(),\n data: {\n agent_id: data.agent_id,\n agent_type: data.agent_type,\n },\n }),\n signal: AbortSignal.timeout(2000),\n });\n } catch {\n // fire and forget\n }\n}\n\nmain();\n"],"mappings":";;AAEA,SAAS,kBAAkB,SAA2B;AACpD,KAAI,QAAQ,IAAI,6BAA6B,IAAK,QAAO;AACzD,KAAI,CAAC,WAAW,OAAO,YAAY,SAAU,QAAO;AACpD,QAAQ,QAAqC,eAAe;;AAG9D,MAAM,WAAW,QAAQ,IAAI,sBAAsB;AACnD,MAAM,SAAS,QAAQ,IAAI,yBAAyB;AAEpD,SAAS,cAAsC;CAC7C,MAAM,IAA4B,EAAE,gBAAgB,oBAAoB;AACxE,KAAI,OAAQ,GAAE,mBAAmB,UAAU;AAC3C,QAAO;;AAGT,eAAe,OAAO;CACpB,IAAI,QAAQ;AACZ,YAAW,MAAM,SAAS,QAAQ,MAChC,UAAS;CAGX,IAAI;AACJ,KAAI;AACF,SAAO,KAAK,MAAM,MAAM;SAClB;AACN;;AAGF,KAAI,kBAAkB,KAAK,CAAE;CAE7B,MAAM,YAAa,KAAK,cAAyB;AAEjD,KAAI;AACF,QAAM,MAAM,GAAG,SAAS,uBAAuB;GAC7C,QAAQ;GACR,SAAS,aAAa;GACtB,MAAM,KAAK,UAAU;IACnB,UAAU;IACV;IACA,SAAS,KAAK,OAAO,QAAQ,KAAK;IAClC,KAAK,KAAK,OAAO,QAAQ,KAAK;IAC9B,4BAAW,IAAI,MAAM,EAAC,aAAa;IACnC,MAAM;KACJ,UAAU,KAAK;KACf,YAAY,KAAK;KAClB;IACF,CAAC;GACF,QAAQ,YAAY,QAAQ,IAAK;GAClC,CAAC;SACI;;AAKV,MAAM"}
1
+ {"version":3,"file":"subagent-start.mjs","names":[],"sources":["../../src/hooks/subagent-start.ts"],"sourcesContent":["#!/usr/bin/env node\n\n// Inlined from ./sdk-guard so each hook bundles to a single self-contained\n// .mjs (matches the pattern used by every other hook entry in tsdown.config).\nfunction isSdkChildContext(payload: unknown): boolean {\n if (process.env[\"AGENTMEMORY_SDK_CHILD\"] === \"1\") return true;\n if (!payload || typeof payload !== \"object\") return false;\n return (payload as { entrypoint?: unknown }).entrypoint === \"sdk-ts\";\n}\n\nconst REST_URL = process.env[\"AGENTMEMORY_URL\"] || \"http://localhost:3111\";\nconst SECRET = process.env[\"AGENTMEMORY_SECRET\"] || \"\";\n\n// Passive telemetry only — nothing reads the response, so the previous\n// `await` was pure latency. Tightened from 2000ms to a defensive cap so a\n// slow/unreachable server can't stack onto every concurrent subagent\n// startup (#221).\nconst TIMEOUT_MS = 800;\n\nfunction authHeaders(): Record<string, string> {\n const h: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (SECRET) h[\"Authorization\"] = `Bearer ${SECRET}`;\n return h;\n}\n\nasync function main() {\n let input = \"\";\n for await (const chunk of process.stdin) {\n input += chunk;\n }\n\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(input);\n } catch {\n return;\n }\n\n if (isSdkChildContext(data)) return;\n\n const sessionId = (data.session_id as string) || \"unknown\";\n\n fetch(`${REST_URL}/agentmemory/observe`, {\n method: \"POST\",\n headers: authHeaders(),\n body: JSON.stringify({\n hookType: \"subagent_start\",\n sessionId,\n project: data.cwd || process.cwd(),\n cwd: data.cwd || process.cwd(),\n timestamp: new Date().toISOString(),\n data: {\n agent_id: data.agent_id,\n agent_type: data.agent_type,\n },\n }),\n signal: AbortSignal.timeout(TIMEOUT_MS),\n }).catch(() => {});\n}\n\nmain();\n"],"mappings":";;AAIA,SAAS,kBAAkB,SAA2B;AACpD,KAAI,QAAQ,IAAI,6BAA6B,IAAK,QAAO;AACzD,KAAI,CAAC,WAAW,OAAO,YAAY,SAAU,QAAO;AACpD,QAAQ,QAAqC,eAAe;;AAG9D,MAAM,WAAW,QAAQ,IAAI,sBAAsB;AACnD,MAAM,SAAS,QAAQ,IAAI,yBAAyB;AAMpD,MAAM,aAAa;AAEnB,SAAS,cAAsC;CAC7C,MAAM,IAA4B,EAAE,gBAAgB,oBAAoB;AACxE,KAAI,OAAQ,GAAE,mBAAmB,UAAU;AAC3C,QAAO;;AAGT,eAAe,OAAO;CACpB,IAAI,QAAQ;AACZ,YAAW,MAAM,SAAS,QAAQ,MAChC,UAAS;CAGX,IAAI;AACJ,KAAI;AACF,SAAO,KAAK,MAAM,MAAM;SAClB;AACN;;AAGF,KAAI,kBAAkB,KAAK,CAAE;CAE7B,MAAM,YAAa,KAAK,cAAyB;AAEjD,OAAM,GAAG,SAAS,uBAAuB;EACvC,QAAQ;EACR,SAAS,aAAa;EACtB,MAAM,KAAK,UAAU;GACnB,UAAU;GACV;GACA,SAAS,KAAK,OAAO,QAAQ,KAAK;GAClC,KAAK,KAAK,OAAO,QAAQ,KAAK;GAC9B,4BAAW,IAAI,MAAM,EAAC,aAAa;GACnC,MAAM;IACJ,UAAU,KAAK;IACf,YAAY,KAAK;IAClB;GACF,CAAC;EACF,QAAQ,YAAY,QAAQ,WAAW;EACxC,CAAC,CAAC,YAAY,GAAG;;AAGpB,MAAM"}
@@ -0,0 +1,3 @@
1
+ import { n as getImageRefCount, r as incrementImageRef, t as decrementImageRef } from "./src-C7vGxttN.mjs";
2
+
3
+ export { decrementImageRef, incrementImageRef };
@@ -1,3 +1,3 @@
1
- import { a as deleteImage, c as saveImageToDisk, i as IMAGES_DIR, l as touchImage, o as getMaxBytes, s as isManagedImagePath } from "./src-xYHSzz5S.mjs";
1
+ import { a as deleteImage, c as saveImageToDisk, i as IMAGES_DIR, l as touchImage, o as getMaxBytes, s as isManagedImagePath } from "./src-C7vGxttN.mjs";
2
2
 
3
3
  export { deleteImage, saveImageToDisk };
package/dist/index.mjs CHANGED
@@ -1213,6 +1213,23 @@ var VectorIndex = class VectorIndex {
1213
1213
  }
1214
1214
  };
1215
1215
 
1216
+ //#endregion
1217
+ //#region src/state/memory-utils.ts
1218
+ function memoryToObservation(memory) {
1219
+ return {
1220
+ id: memory.id,
1221
+ sessionId: memory.sessionIds[0] ?? "memory",
1222
+ timestamp: memory.createdAt,
1223
+ type: "decision",
1224
+ title: memory.title,
1225
+ facts: [memory.content],
1226
+ narrative: memory.content,
1227
+ concepts: memory.concepts,
1228
+ files: memory.files,
1229
+ importance: memory.strength
1230
+ };
1231
+ }
1232
+
1216
1233
  //#endregion
1217
1234
  //#region src/functions/graph-retrieval.ts
1218
1235
  function buildGraphContext(path) {
@@ -1777,7 +1794,12 @@ var HybridSearch = class {
1777
1794
  }
1778
1795
  async enrichResults(results, limit) {
1779
1796
  const sliced = results.slice(0, limit);
1780
- const observations = await Promise.all(sliced.map((r) => this.kv.get(KV.observations(r.sessionId), r.obsId).catch(() => null)));
1797
+ const observations = await Promise.all(sliced.map(async (r) => {
1798
+ const obs = await this.kv.get(KV.observations(r.sessionId), r.obsId).catch(() => null);
1799
+ if (obs) return obs;
1800
+ const mem = await this.kv.get(KV.memories, r.obsId).catch(() => null);
1801
+ return mem ? memoryToObservation(mem) : null;
1802
+ }));
1781
1803
  const enriched = [];
1782
1804
  for (let i = 0; i < sliced.length; i++) {
1783
1805
  const obs = observations[i];
@@ -2507,20 +2529,6 @@ async function deleteAccessLog(kv, memoryId) {
2507
2529
 
2508
2530
  //#endregion
2509
2531
  //#region src/functions/search.ts
2510
- function memoryAsIndexable$1(memory) {
2511
- return {
2512
- id: memory.id,
2513
- sessionId: memory.sessionIds[0] ?? "memory",
2514
- timestamp: memory.createdAt,
2515
- type: "decision",
2516
- title: memory.title,
2517
- facts: [memory.content],
2518
- narrative: memory.content,
2519
- concepts: memory.concepts,
2520
- files: memory.files,
2521
- importance: memory.strength
2522
- };
2523
- }
2524
2532
  let index = null;
2525
2533
  function getSearchIndex() {
2526
2534
  if (!index) index = new SearchIndex();
@@ -2535,7 +2543,7 @@ async function rebuildIndex(kv) {
2535
2543
  for (const memory of memories) {
2536
2544
  if (memory.isLatest === false) continue;
2537
2545
  if (!memory.title || !memory.content) continue;
2538
- idx.add(memoryAsIndexable$1(memory));
2546
+ idx.add(memoryToObservation(memory));
2539
2547
  count++;
2540
2548
  }
2541
2549
  } catch (err) {
@@ -2613,7 +2621,12 @@ function registerSearchFunction(sdk, kv) {
2613
2621
  }
2614
2622
  candidates.push(r);
2615
2623
  }
2616
- const obsResults = await Promise.all(candidates.map((r) => kv.get(KV.observations(r.sessionId), r.obsId)));
2624
+ const obsResults = await Promise.all(candidates.map(async (r) => {
2625
+ const obs = await kv.get(KV.observations(r.sessionId), r.obsId).catch(() => null);
2626
+ if (obs) return obs;
2627
+ const mem = await kv.get(KV.memories, r.obsId).catch(() => null);
2628
+ return mem ? memoryToObservation(mem) : null;
2629
+ }));
2617
2630
  const enriched = [];
2618
2631
  for (let i = 0; i < candidates.length; i++) {
2619
2632
  const obs = obsResults[i];
@@ -4848,20 +4861,6 @@ function registerPatternsFunction(sdk, kv) {
4848
4861
 
4849
4862
  //#endregion
4850
4863
  //#region src/functions/remember.ts
4851
- function memoryAsIndexable(memory) {
4852
- return {
4853
- id: memory.id,
4854
- sessionId: memory.sessionIds[0] ?? "memory",
4855
- timestamp: memory.createdAt,
4856
- type: "decision",
4857
- title: memory.title,
4858
- facts: [memory.content],
4859
- narrative: memory.content,
4860
- concepts: memory.concepts,
4861
- files: memory.files,
4862
- importance: memory.strength
4863
- };
4864
- }
4865
4864
  function registerRememberFunction(sdk, kv) {
4866
4865
  sdk.registerFunction("mem::remember", async (data) => {
4867
4866
  if (!data.content || typeof data.content !== "string" || !data.content.trim()) return {
@@ -4928,7 +4927,7 @@ function registerRememberFunction(sdk, kv) {
4928
4927
  }
4929
4928
  await kv.set(KV.memories, memory.id, memory);
4930
4929
  try {
4931
- getSearchIndex().add(memoryAsIndexable(memory));
4930
+ getSearchIndex().add(memoryToObservation(memory));
4932
4931
  } catch (err) {
4933
4932
  logger.warn("Failed to index saved memory into BM25", {
4934
4933
  memId: memory.id,
@@ -5732,7 +5731,7 @@ function registerAutoForgetFunction(sdk, kv) {
5732
5731
 
5733
5732
  //#endregion
5734
5733
  //#region src/version.ts
5735
- const VERSION = "0.9.5";
5734
+ const VERSION = "0.9.6";
5736
5735
 
5737
5736
  //#endregion
5738
5737
  //#region src/functions/export-import.ts
@@ -5855,7 +5854,8 @@ function registerExportImportFunction(sdk, kv) {
5855
5854
  "0.9.2",
5856
5855
  "0.9.3",
5857
5856
  "0.9.4",
5858
- "0.9.5"
5857
+ "0.9.5",
5858
+ "0.9.6"
5859
5859
  ]).has(importData.version)) return {
5860
5860
  success: false,
5861
5861
  error: `Unsupported export version: ${importData.version}`