@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 +4 -4
- package/dist/hooks/session-start.mjs +23 -10
- package/dist/hooks/session-start.mjs.map +1 -1
- package/dist/hooks/subagent-start.mjs +17 -18
- package/dist/hooks/subagent-start.mjs.map +1 -1
- package/dist/image-refs-CZVd2z6E.mjs +3 -0
- package/dist/{image-store-DnuCI2RB.mjs → image-store-CF4gfkLr.mjs} +1 -1
- package/dist/index.mjs +34 -34
- package/dist/index.mjs.map +1 -1
- package/dist/{src-xYHSzz5S.mjs → src-C7vGxttN.mjs} +42 -42
- package/dist/src-C7vGxttN.mjs.map +1 -0
- package/dist/{standalone-BvKacAId.mjs → standalone-DnSJzyXL.mjs} +36 -4
- package/dist/{standalone-BvKacAId.mjs.map → standalone-DnSJzyXL.mjs.map} +1 -1
- package/dist/standalone.d.mts.map +1 -1
- package/dist/standalone.mjs +35 -3
- package/dist/standalone.mjs.map +1 -1
- package/dist/{tools-registry-BWM0vWeA.mjs → tools-registry-CKMeHaPN.mjs} +2 -2
- package/dist/{tools-registry-BWM0vWeA.mjs.map → tools-registry-CKMeHaPN.mjs.map} +1 -1
- package/package.json +1 -1
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/scripts/session-start.mjs +23 -10
- package/plugin/scripts/session-start.mjs.map +1 -1
- package/plugin/scripts/subagent-start.mjs +17 -18
- package/plugin/scripts/subagent-start.mjs.map +1 -1
- package/dist/image-refs-DRse_ePx.mjs +0 -3
- package/dist/src-xYHSzz5S.mjs.map +0 -1
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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(
|
|
30
|
-
|
|
31
|
-
|
|
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 (
|
|
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
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
|
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"}
|
|
@@ -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-
|
|
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(
|
|
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(
|
|
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) =>
|
|
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(
|
|
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.
|
|
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}`
|