@mrc2204/agent-smart-memo 4.0.11 → 4.0.12

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.
@@ -21,6 +21,7 @@
21
21
  "embedBaseUrl": "http://localhost:11434",
22
22
  "embedModel": "mxbai-embed-large",
23
23
  "embedDimensions": 1024,
24
+ "slotDbDir": "/Users/mrcagents/.openclaw/agent-memo",
24
25
 
25
26
  "autoCaptureEnabled": true,
26
27
  "autoCaptureMinConfidence": 0.7,
package/README.md CHANGED
@@ -58,7 +58,11 @@ Add to your `~/.openclaw/openclaw.json`:
58
58
  // Required: Ollama for embeddings
59
59
  embedBaseUrl: "http://localhost:11434",
60
60
  embedModel: "mxbai-embed-large",
61
- embedDimensions: 1024
61
+ embedDimensions: 1024,
62
+
63
+ // Optional: explicit SlotDB target dir
64
+ // Priority: OPENCLAW_SLOTDB_DIR > config.slotDbDir > ${OPENCLAW_STATE_DIR}/agent-memo
65
+ slotDbDir: "/Users/mrcagents/.openclaw/agent-memo"
62
66
  }
63
67
  }
64
68
  }
@@ -83,6 +87,7 @@ Start chatting with your agent. Memories are captured automatically.
83
87
  | `embedBaseUrl` | string | `"http://localhost:11434"` | Ollama base URL |
84
88
  | `embedModel` | string | `"mxbai-embed-large"` | Embedding model name |
85
89
  | `embedDimensions` | number | `1024` | Embedding vector dimensions |
90
+ | `slotDbDir` | string | `${OPENCLAW_STATE_DIR}/agent-memo` | Explicit SlotDB directory. Overridden by `OPENCLAW_SLOTDB_DIR` if set |
86
91
  | `autoCaptureEnabled` | boolean | `true` | Enable automatic fact extraction |
87
92
  | `autoCaptureMinConfidence` | number | `0.7` | Minimum confidence to store a fact (0-1) |
88
93
  | `contextWindowMaxTokens` | number | `12000` | Max tokens sent to LLM for extraction |
@@ -93,6 +98,21 @@ Start chatting with your agent. Memories are captured automatically.
93
98
 
94
99
  See [CONFIG.example.json](./CONFIG.example.json) for a copy-paste template.
95
100
 
101
+ ### SlotDB Path Resolution
102
+
103
+ `agent-smart-memo` now resolves the SQLite slot database directory in this order:
104
+
105
+ 1. `OPENCLAW_SLOTDB_DIR`
106
+ 2. Plugin config `slotDbDir`
107
+ 3. Legacy fallback `${OPENCLAW_STATE_DIR}/agent-memo`
108
+
109
+ Examples:
110
+
111
+ - `OPENCLAW_SLOTDB_DIR=/Users/mrcagents/.openclaw/agent-memo` → DB file becomes `/Users/mrcagents/.openclaw/agent-memo/slots.db`
112
+ - Legacy `new SlotDB("/Users/mrcagents/.openclaw")` still resolves to `/Users/mrcagents/.openclaw/agent-memo/slots.db`
113
+ - Passing `/Users/mrcagents/.openclaw/agent-memo` as the target dir will **not** create nested `/agent-memo/agent-memo`
114
+
115
+
96
116
  ## How It Works
97
117
 
98
118
  ```
package/dist/config.d.ts CHANGED
@@ -41,6 +41,7 @@ export declare const PluginConfig: {
41
41
  absoluteMaxMessages: number;
42
42
  };
43
43
  stateDir: string;
44
+ slotDbDir: string;
44
45
  defaults: {
45
46
  namespace: string;
46
47
  slotCategories: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH;;;GAGG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6DxB,CAAC;AAEF;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAyBpF;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAOlC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH;;;GAGG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8DxB,CAAC;AAEF;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAyBpF;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAQlC"}
package/dist/config.js CHANGED
@@ -53,7 +53,8 @@ export const PluginConfig = {
53
53
  absoluteMaxMessages: parseInt(process.env.CONTEXT_WINDOW_MAX_MESSAGES || "200"),
54
54
  },
55
55
  // State storage
56
- stateDir: process.env.STATE_DIR || `${process.env.HOME}/.openclaw`,
56
+ stateDir: process.env.STATE_DIR || process.env.OPENCLAW_STATE_DIR || `${process.env.HOME}/.openclaw`,
57
+ slotDbDir: process.env.OPENCLAW_SLOTDB_DIR || `${process.env.HOME}/.openclaw/agent-memo`,
57
58
  // Plugin defaults
58
59
  defaults: {
59
60
  namespace: process.env.DEFAULT_NAMESPACE || "default",
@@ -96,5 +97,6 @@ export function printConfig() {
96
97
  console.log(` Embedding: ${PluginConfig.embedding.model} (${PluginConfig.embedding.dimensions}d)`);
97
98
  console.log(` AutoCapture: ${PluginConfig.autoCapture.enabled ? "enabled" : "disabled"}`);
98
99
  console.log(` StateDir: ${PluginConfig.stateDir}`);
100
+ console.log(` SlotDbDir: ${PluginConfig.slotDbDir}`);
99
101
  }
100
102
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -56,8 +56,11 @@ export interface SlotListInput {
56
56
  export declare class SlotDB {
57
57
  private db;
58
58
  private stateDir;
59
+ private slotDbDir;
59
60
  graph: GraphDB;
60
- constructor(stateDir: string);
61
+ constructor(stateDirOrSlotDbDir: string, options?: {
62
+ slotDbDir?: string;
63
+ });
61
64
  private migrate;
62
65
  /**
63
66
  * Set (upsert) a slot. Creates or updates, incrementing version.
@@ -1 +1 @@
1
- {"version":3,"file":"slot-db.d.ts","sourceRoot":"","sources":["../../src/db/slot-db.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"slot-db.d.ts","sourceRoot":"","sources":["../../src/db/slot-db.ts"],"names":[],"mappings":"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"}
@@ -7,10 +7,12 @@
7
7
  * Values are stored as JSON strings.
8
8
  */
9
9
  import { DatabaseSync } from "node:sqlite";
10
+ import { randomUUID } from "node:crypto";
10
11
  import { join } from "node:path";
11
12
  import { mkdirSync, existsSync } from "node:fs";
12
13
  import { GraphDB } from "./graph-db.js";
13
14
  import { getSlotTTL } from "../shared/memory-config.js";
15
+ import { resolveLegacyStateDirInput, resolveSlotDbDir } from "../shared/slotdb-path.js";
14
16
  // Re-export GraphDB types
15
17
  export { GraphDB };
16
18
  // ============================================================================
@@ -19,14 +21,23 @@ export { GraphDB };
19
21
  export class SlotDB {
20
22
  db;
21
23
  stateDir;
24
+ slotDbDir;
22
25
  graph;
23
- constructor(stateDir) {
24
- this.stateDir = stateDir;
25
- const dbDir = join(stateDir, "agent-memo");
26
- if (!existsSync(dbDir)) {
27
- mkdirSync(dbDir, { recursive: true });
26
+ constructor(stateDirOrSlotDbDir, options) {
27
+ this.stateDir = stateDirOrSlotDbDir;
28
+ // Priority resolver for new config/env flow.
29
+ // If explicit slotDbDir option is provided, it is treated as already-resolved target dir.
30
+ if (options?.slotDbDir) {
31
+ this.slotDbDir = resolveSlotDbDir({ slotDbDir: options.slotDbDir, stateDir: stateDirOrSlotDbDir });
28
32
  }
29
- const dbPath = join(dbDir, "slots.db");
33
+ else {
34
+ // Backward compatibility for legacy constructor callsites that pass OPENCLAW_STATE_DIR.
35
+ this.slotDbDir = resolveLegacyStateDirInput(stateDirOrSlotDbDir);
36
+ }
37
+ if (!existsSync(this.slotDbDir)) {
38
+ mkdirSync(this.slotDbDir, { recursive: true });
39
+ }
40
+ const dbPath = join(this.slotDbDir, "slots.db");
30
41
  this.db = new DatabaseSync(dbPath);
31
42
  this.db.exec("PRAGMA journal_mode = WAL");
32
43
  this.db.exec("PRAGMA foreign_keys = ON");
@@ -104,7 +115,7 @@ export class SlotDB {
104
115
  };
105
116
  }
106
117
  // Insert new slot
107
- const id = `${category}:${input.key}:${Date.now()}`;
118
+ const id = randomUUID();
108
119
  const insertStmt = this.db.prepare(`INSERT INTO slots (id, scope_user_id, scope_agent_id, category, key, value, source, confidence, version, created_at, updated_at, expires_at)
109
120
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, 1, ?, ?, ?)`);
110
121
  insertStmt.run(id, scopeUserId, scopeAgentId, category, input.key, valueJson, source, confidence, now, now, input.expires_at || null);
@@ -1 +1 @@
1
- {"version":3,"file":"slot-db.js","sourceRoot":"","sources":["../../src/db/slot-db.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"slot-db.js","sourceRoot":"","sources":["../../src/db/slot-db.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,24 @@ interface RecallContext {
14
14
  userId: string;
15
15
  agentId: string;
16
16
  }
17
+ interface RecallHintSet {
18
+ sessionKeys: Set<string>;
19
+ topicTags: Set<string>;
20
+ }
21
+ interface SemanticSelectionResult {
22
+ memories: Array<{
23
+ text: string;
24
+ score: number;
25
+ namespace?: string;
26
+ }>;
27
+ recallConfidence: "high" | "medium" | "low";
28
+ suppressed: boolean;
29
+ suppressionReason?: string;
30
+ }
31
+ export declare function selectSemanticMemories(results: Array<{
32
+ score: number;
33
+ payload?: Record<string, any>;
34
+ }>, ctx: RecallContext, hints: RecallHintSet): SemanticSelectionResult;
17
35
  /**
18
36
  * Gather auto-recall context from all memory sources
19
37
  */
@@ -23,6 +41,11 @@ export declare function gatherRecallContext(db: SlotDB, qdrant: QdrantClient, em
23
41
  graphContext: string;
24
42
  recentUpdates: string;
25
43
  semanticMemories: string;
44
+ recallMeta: {
45
+ recall_confidence: "high" | "medium" | "low";
46
+ recall_suppressed: boolean;
47
+ suppression_reason?: string;
48
+ };
26
49
  }>;
27
50
  /**
28
51
  * Inject recall context into system prompt
@@ -33,6 +56,11 @@ export declare function injectRecallContext(systemPrompt: string, context: {
33
56
  graphContext: string;
34
57
  recentUpdates: string;
35
58
  semanticMemories: string;
59
+ recallMeta?: {
60
+ recall_confidence: "high" | "medium" | "low";
61
+ recall_suppressed: boolean;
62
+ suppression_reason?: string;
63
+ };
36
64
  }): string;
37
65
  /**
38
66
  * Register auto-recall hook
@@ -1 +1 @@
1
- {"version":3,"file":"auto-recall.d.ts","sourceRoot":"","sources":["../../src/hooks/auto-recall.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAW3D,UAAU,aAAa;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAsJD;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,eAAe,EAC1B,GAAG,EAAE,aAAa,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC;IACT,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC,CA2ID;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE;IACjE,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,GAAG,MAAM,CAsCT;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,iBAAiB,EACtB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,eAAe,GACzB,IAAI,CA6CN;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,eAAe,EAC1B,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CAsBjB"}
1
+ {"version":3,"file":"auto-recall.d.ts","sourceRoot":"","sources":["../../src/hooks/auto-recall.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAW3D,UAAU,aAAa;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,aAAa;IACrB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACxB;AAaD,UAAU,uBAAuB;IAC/B,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE,gBAAgB,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IAC5C,UAAU,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAqQD,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAAE,CAAC,EAChE,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE,aAAa,GACnB,uBAAuB,CA6EzB;AAyBD;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,eAAe,EAC1B,GAAG,EAAE,aAAa,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC;IACT,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE;QACV,iBAAiB,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;QAC7C,iBAAiB,EAAE,OAAO,CAAC;QAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC7B,CAAC;CACH,CAAC,CAgJD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE;IACjE,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE;QACX,iBAAiB,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;QAC7C,iBAAiB,EAAE,OAAO,CAAC;QAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC7B,CAAC;CACH,GAAG,MAAM,CA2CT;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,iBAAiB,EACtB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,eAAe,GACzB,IAAI,CA6CN;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,eAAe,EAC1B,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CAsBjB"}
@@ -114,6 +114,198 @@ function formatSemanticMemories(memories) {
114
114
  xml += "</semantic-memories>";
115
115
  return xml;
116
116
  }
117
+ function normalizeToken(value) {
118
+ if (value === null || value === undefined)
119
+ return "";
120
+ const s = String(value).trim().toLowerCase();
121
+ return s;
122
+ }
123
+ function splitToTags(input) {
124
+ return input
125
+ .split(/[\s,;|:/\\]+/g)
126
+ .map((x) => normalizeToken(x))
127
+ .filter((x) => x.length >= 3)
128
+ .slice(0, 12);
129
+ }
130
+ function collectRecallHints(sessionKey, projectLivingStateValue, currentState) {
131
+ const hints = {
132
+ sessionKeys: new Set(),
133
+ topicTags: new Set(),
134
+ };
135
+ const normalizedSession = normalizeToken(sessionKey);
136
+ if (normalizedSession)
137
+ hints.sessionKeys.add(normalizedSession);
138
+ const sessionTail = normalizeToken(sessionKey.split(":").slice(2).join(":"));
139
+ if (sessionTail)
140
+ hints.sessionKeys.add(sessionTail);
141
+ const living = (projectLivingStateValue && typeof projectLivingStateValue === "object")
142
+ ? projectLivingStateValue
143
+ : null;
144
+ if (living) {
145
+ const activeContext = normalizeToken(living.active_context);
146
+ if (activeContext) {
147
+ hints.topicTags.add(activeContext);
148
+ splitToTags(activeContext).forEach((t) => hints.topicTags.add(t));
149
+ }
150
+ const currentFocus = normalizeToken(living.current_focus);
151
+ if (currentFocus) {
152
+ splitToTags(currentFocus).forEach((t) => hints.topicTags.add(t));
153
+ }
154
+ }
155
+ const projectState = currentState.project || {};
156
+ for (const key of ["project.current", "project.current_epic", "project.current_task", "project.phase", "project.status"]) {
157
+ const raw = projectState[key];
158
+ const normalized = normalizeToken(raw);
159
+ if (normalized) {
160
+ hints.topicTags.add(normalized);
161
+ splitToTags(normalized).forEach((t) => hints.topicTags.add(t));
162
+ }
163
+ }
164
+ return hints;
165
+ }
166
+ function getSessionTokenFromPayload(payload) {
167
+ const direct = normalizeToken(payload.sessionId || payload.session_id || payload.thread_id || payload.threadId || payload.conversationId || payload.conversation_id);
168
+ if (direct)
169
+ return direct;
170
+ const meta = payload.metadata && typeof payload.metadata === "object" ? payload.metadata : {};
171
+ return normalizeToken(meta.sessionId || meta.session_id || meta.thread_id || meta.threadId || meta.conversationId || meta.conversation_id);
172
+ }
173
+ function collectPayloadTopicTags(payload) {
174
+ const tags = new Set();
175
+ const meta = payload.metadata && typeof payload.metadata === "object" ? payload.metadata : {};
176
+ const rawCandidates = [
177
+ payload.project,
178
+ payload.projectTag,
179
+ payload.project_tag,
180
+ payload.topic,
181
+ payload.topicTag,
182
+ payload.topic_tag,
183
+ meta.project,
184
+ meta.projectTag,
185
+ meta.project_tag,
186
+ meta.topic,
187
+ meta.topicTag,
188
+ meta.topic_tag,
189
+ payload.namespace,
190
+ ];
191
+ for (const raw of rawCandidates) {
192
+ const v = normalizeToken(raw);
193
+ if (!v)
194
+ continue;
195
+ tags.add(v);
196
+ splitToTags(v).forEach((x) => tags.add(x));
197
+ }
198
+ const listCandidates = [payload.tags, payload.topics, meta.tags, meta.topics];
199
+ for (const lc of listCandidates) {
200
+ if (Array.isArray(lc)) {
201
+ lc.forEach((item) => {
202
+ const v = normalizeToken(item);
203
+ if (v) {
204
+ tags.add(v);
205
+ splitToTags(v).forEach((x) => tags.add(x));
206
+ }
207
+ });
208
+ }
209
+ }
210
+ return tags;
211
+ }
212
+ function intersects(a, b) {
213
+ if (a.size === 0 || b.size === 0)
214
+ return false;
215
+ for (const x of a) {
216
+ if (b.has(x))
217
+ return true;
218
+ }
219
+ return false;
220
+ }
221
+ function applyRecencyBoost(baseScore, payload, sameSession) {
222
+ const tsRaw = payload.updatedAt || payload.timestamp || payload.ts;
223
+ const ts = Number(tsRaw);
224
+ if (!Number.isFinite(ts) || ts <= 0)
225
+ return baseScore;
226
+ const ageMs = Math.max(0, Date.now() - ts);
227
+ if (sameSession) {
228
+ if (ageMs <= 60 * 60 * 1000)
229
+ return baseScore + 0.12;
230
+ if (ageMs <= 24 * 60 * 60 * 1000)
231
+ return baseScore + 0.07;
232
+ if (ageMs <= 3 * 24 * 60 * 60 * 1000)
233
+ return baseScore + 0.03;
234
+ }
235
+ if (ageMs <= 60 * 60 * 1000)
236
+ return baseScore + 0.02;
237
+ return baseScore;
238
+ }
239
+ export function selectSemanticMemories(results, ctx, hints) {
240
+ const weighted = results
241
+ .filter((r) => (r.payload?.namespace || "") !== "noise.filtered")
242
+ .map((r) => {
243
+ const payload = (r.payload || {});
244
+ const ns = String(payload.namespace || "");
245
+ const baseWeighted = Math.min(1, r.score * getNamespaceWeight(ctx.agentId, ns));
246
+ const sessionToken = getSessionTokenFromPayload(payload);
247
+ const sameSession = sessionToken ? hints.sessionKeys.has(sessionToken) : false;
248
+ const memoryTags = collectPayloadTopicTags(payload);
249
+ const sameProject = intersects(hints.topicTags, memoryTags);
250
+ const crossProject = hints.topicTags.size > 0 && memoryTags.size > 0 && !sameProject;
251
+ let adjusted = baseWeighted;
252
+ if (sameSession)
253
+ adjusted += 0.2;
254
+ if (sameProject)
255
+ adjusted += 0.1;
256
+ if (crossProject)
257
+ adjusted -= 0.18;
258
+ adjusted = applyRecencyBoost(adjusted, payload, sameSession);
259
+ return {
260
+ text: payload.text || "",
261
+ score: baseWeighted,
262
+ namespace: ns,
263
+ payload,
264
+ adjustedScore: Math.max(0, Math.min(1, adjusted)),
265
+ sameSession,
266
+ sameProject,
267
+ crossProject,
268
+ };
269
+ })
270
+ .filter((m) => m.text.length > 0)
271
+ .sort((a, b) => (b.adjustedScore || 0) - (a.adjustedScore || 0));
272
+ const kept = weighted.filter((m) => (m.adjustedScore || 0) >= 0.7).slice(0, 5);
273
+ if (kept.length === 0) {
274
+ return {
275
+ memories: [],
276
+ recallConfidence: "low",
277
+ suppressed: true,
278
+ suppressionReason: "no_high_relevance",
279
+ };
280
+ }
281
+ const top3 = kept.slice(0, 3);
282
+ const crossCount = top3.filter((m) => m.crossProject).length;
283
+ const sessionCount = top3.filter((m) => m.sameSession).length;
284
+ const projectCount = top3.filter((m) => m.sameProject).length;
285
+ if (crossCount >= 2 && sessionCount === 0 && projectCount === 0) {
286
+ return {
287
+ memories: [],
288
+ recallConfidence: "low",
289
+ suppressed: true,
290
+ suppressionReason: "mixed_or_cross_topic_top_hits",
291
+ };
292
+ }
293
+ const recallConfidence = sessionCount >= 1 || projectCount >= 2
294
+ ? "high"
295
+ : crossCount >= 1
296
+ ? "medium"
297
+ : "high";
298
+ const cap = recallConfidence === "medium" ? 2 : 5;
299
+ return {
300
+ memories: kept.slice(0, cap).map((m) => ({
301
+ text: m.text,
302
+ score: m.adjustedScore || m.score,
303
+ namespace: m.namespace,
304
+ })),
305
+ recallConfidence,
306
+ suppressed: false,
307
+ };
308
+ }
117
309
  /**
118
310
  * Build multi-namespace filter for Qdrant search
119
311
  */
@@ -181,13 +373,16 @@ export async function gatherRecallContext(db, qdrant, embedding, ctx, userQuery)
181
373
  db.get("__public__", "__public__", { key: "project_living_state" }),
182
374
  ];
183
375
  let projectLivingStateXml = "";
376
+ let projectLivingStateValue = null;
184
377
  for (const c of projectLivingCandidates) {
185
378
  if (c && !Array.isArray(c)) {
379
+ projectLivingStateValue = c.value;
186
380
  projectLivingStateXml = formatProjectLivingState(c.value);
187
381
  if (projectLivingStateXml)
188
382
  break;
189
383
  }
190
384
  }
385
+ const recallHints = collectRecallHints(ctx.sessionKey, projectLivingStateValue, mergedState);
191
386
  // 2. Get Graph Context (from private scope only for privacy)
192
387
  const allEntities = db.graph.listEntities(ctx.userId, ctx.agentId);
193
388
  const entityList = allEntities.slice(0, 10).map((e) => ({ name: e.name, type: e.type }));
@@ -216,6 +411,10 @@ export async function gatherRecallContext(db, qdrant, embedding, ctx, userQuery)
216
411
  : "";
217
412
  // 4. Semantic Memories from Qdrant (NEW)
218
413
  let semanticMemoriesXml = "";
414
+ let recallMeta = {
415
+ recall_confidence: "medium",
416
+ recall_suppressed: false,
417
+ };
219
418
  if (userQuery && userQuery.trim().length > 0) {
220
419
  try {
221
420
  // Get agent's namespaces
@@ -225,32 +424,29 @@ export async function gatherRecallContext(db, qdrant, embedding, ctx, userQuery)
225
424
  // Build multi-namespace filter
226
425
  const namespaceFilter = buildNamespaceFilter(namespaces);
227
426
  // Search for relevant memories
228
- const results = await qdrant.search(vector, 5, namespaceFilter);
229
- // Exclude quarantined noise + apply namespace priority weighting
230
- const relevantMemories = results
231
- .filter((r) => (r.payload?.namespace || "") !== "noise.filtered")
232
- .map((r) => {
233
- const ns = String(r.payload?.namespace || "");
234
- const weight = getNamespaceWeight(ctx.agentId, ns);
235
- const weighted = Math.min(1, r.score * weight);
236
- return {
237
- text: r.payload?.text || "",
238
- score: weighted,
239
- namespace: ns,
240
- };
241
- })
242
- .filter((r) => r.score >= 0.7)
243
- .sort((a, b) => b.score - a.score)
244
- .slice(0, 5)
245
- .filter((m) => m.text.length > 0);
246
- semanticMemoriesXml = formatSemanticMemories(relevantMemories);
247
- if (relevantMemories.length > 0) {
248
- console.log(`[AutoRecall] Found ${relevantMemories.length} relevant semantic memories for query (namespaces: ${namespaces.join(", ")})`);
427
+ const results = await qdrant.search(vector, 8, namespaceFilter);
428
+ const selection = selectSemanticMemories(results, ctx, recallHints);
429
+ recallMeta = {
430
+ recall_confidence: selection.recallConfidence,
431
+ recall_suppressed: selection.suppressed,
432
+ suppression_reason: selection.suppressionReason,
433
+ };
434
+ semanticMemoriesXml = formatSemanticMemories(selection.memories);
435
+ if (selection.memories.length > 0) {
436
+ console.log(`[AutoRecall] Found ${selection.memories.length} relevant semantic memories for query (confidence=${selection.recallConfidence}, namespaces: ${namespaces.join(", ")})`);
437
+ }
438
+ else if (selection.suppressed) {
439
+ console.warn(`[AutoRecall] Semantic recall suppressed due to low confidence: ${selection.suppressionReason || "unknown"}`);
249
440
  }
250
441
  }
251
442
  catch (error) {
252
443
  console.error("[AutoRecall] Error querying semantic memories:", error.message);
253
444
  semanticMemoriesXml = "";
445
+ recallMeta = {
446
+ recall_confidence: "low",
447
+ recall_suppressed: true,
448
+ suppression_reason: "semantic_search_error",
449
+ };
254
450
  }
255
451
  }
256
452
  return {
@@ -259,6 +455,7 @@ export async function gatherRecallContext(db, qdrant, embedding, ctx, userQuery)
259
455
  graphContext: graphContextXml,
260
456
  recentUpdates,
261
457
  semanticMemories: semanticMemoriesXml,
458
+ recallMeta,
262
459
  };
263
460
  }
264
461
  /**
@@ -282,6 +479,10 @@ export function injectRecallContext(systemPrompt, context) {
282
479
  if (context.semanticMemories) {
283
480
  injectionParts.push(context.semanticMemories);
284
481
  }
482
+ if (context.recallMeta) {
483
+ const confidenceBlock = `<recall-meta>\n <recall_confidence>${context.recallMeta.recall_confidence}</recall_confidence>\n <recall_suppressed>${String(context.recallMeta.recall_suppressed)}</recall_suppressed>${context.recallMeta.suppression_reason ? `\n <suppression_reason>${context.recallMeta.suppression_reason}</suppression_reason>` : ""}\n</recall-meta>`;
484
+ injectionParts.push(confidenceBlock);
485
+ }
285
486
  if (injectionParts.length === 0) {
286
487
  return systemPrompt;
287
488
  }