@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.
- package/CONFIG.example.json +1 -0
- package/README.md +21 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +3 -1
- package/dist/config.js.map +1 -1
- package/dist/db/slot-db.d.ts +4 -1
- package/dist/db/slot-db.d.ts.map +1 -1
- package/dist/db/slot-db.js +18 -7
- package/dist/db/slot-db.js.map +1 -1
- package/dist/hooks/auto-recall.d.ts +28 -0
- package/dist/hooks/auto-recall.d.ts.map +1 -1
- package/dist/hooks/auto-recall.js +222 -21
- package/dist/hooks/auto-recall.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -3
- package/dist/index.js.map +1 -1
- package/dist/services/llm-extractor.d.ts.map +1 -1
- package/dist/services/llm-extractor.js +76 -16
- package/dist/services/llm-extractor.js.map +1 -1
- package/dist/shared/slotdb-path.d.ts +20 -0
- package/dist/shared/slotdb-path.d.ts.map +1 -0
- package/dist/shared/slotdb-path.js +46 -0
- package/dist/shared/slotdb-path.js.map +1 -0
- package/dist/tools/graph-tools.d.ts +4 -1
- package/dist/tools/graph-tools.d.ts.map +1 -1
- package/dist/tools/graph-tools.js +39 -16
- package/dist/tools/graph-tools.js.map +1 -1
- package/dist/tools/slot-tools.d.ts +4 -1
- package/dist/tools/slot-tools.d.ts.map +1 -1
- package/dist/tools/slot-tools.js +37 -14
- package/dist/tools/slot-tools.js.map +1 -1
- package/openclaw.plugin.json +8 -0
- package/package.json +3 -3
package/CONFIG.example.json
CHANGED
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
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH;;;GAGG;AACH,eAAO,MAAM,YAAY
|
|
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
|
package/dist/config.js.map
CHANGED
|
@@ -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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"}
|
package/dist/db/slot-db.d.ts
CHANGED
|
@@ -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(
|
|
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.
|
package/dist/db/slot-db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slot-db.d.ts","sourceRoot":"","sources":["../../src/db/slot-db.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"slot-db.d.ts","sourceRoot":"","sources":["../../src/db/slot-db.ts"],"names":[],"mappings":"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"}
|
package/dist/db/slot-db.js
CHANGED
|
@@ -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(
|
|
24
|
-
this.stateDir =
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
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 =
|
|
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);
|
package/dist/db/slot-db.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slot-db.js","sourceRoot":"","sources":["../../src/db/slot-db.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;
|
|
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;
|
|
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,
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
.
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
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
|
}
|