@mrc2204/agent-smart-memo 4.0.11 → 4.0.13
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 +2 -0
- package/README.md +35 -3
- 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 +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -4
- package/dist/index.js.map +1 -1
- package/dist/services/embedding.d.ts +5 -1
- package/dist/services/embedding.d.ts.map +1 -1
- package/dist/services/embedding.js +45 -18
- package/dist/services/embedding.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/memory-config.d.ts +19 -6
- package/dist/shared/memory-config.d.ts.map +1 -1
- package/dist/shared/memory-config.js +93 -18
- package/dist/shared/memory-config.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 +18 -1
- package/package.json +3 -3
|
@@ -3,6 +3,45 @@
|
|
|
3
3
|
* With slot invalidation support
|
|
4
4
|
*/
|
|
5
5
|
const EMPTY_RESULT = { slot_updates: [], slot_removals: [], memories: [] };
|
|
6
|
+
function isVietnameseContext(text) {
|
|
7
|
+
const lower = text.toLowerCase();
|
|
8
|
+
return /(\banh\b|\bem\b|\bđã\b|\bkhông\b|\bvì sao\b|\byêu cầu\b|\bsửa\b|\blỗi\b|\btriển khai\b|\bbáo cáo\b|\bduyệt\b)/i.test(lower)
|
|
9
|
+
|| /[ăâđêôơưáàảãạắằẳẵặấầẩẫậéèẻẽẹếềểễệíìỉĩịóòỏõọốồổỗộớờởỡợúùủũụứừửữựýỳỷỹỵ]/i.test(text);
|
|
10
|
+
}
|
|
11
|
+
function looksLikeRawTranscript(text) {
|
|
12
|
+
const t = text.trim();
|
|
13
|
+
if (!t)
|
|
14
|
+
return true;
|
|
15
|
+
const hardPatterns = [
|
|
16
|
+
/^\(no output\)/i,
|
|
17
|
+
/"type"\s*:\s*"toolCall"/i,
|
|
18
|
+
/"name"\s*:\s*"exec"/i,
|
|
19
|
+
/"name"\s*:\s*"read"/i,
|
|
20
|
+
/```[\s\S]*```/,
|
|
21
|
+
/^\s*#\s+/m,
|
|
22
|
+
/^\s*\|.+\|\s*$/m,
|
|
23
|
+
/curl\s+-s\s+"http:\/\/localhost:3001/i,
|
|
24
|
+
/mapped \{\/trading\//i,
|
|
25
|
+
];
|
|
26
|
+
if (hardPatterns.some((p) => p.test(t)))
|
|
27
|
+
return true;
|
|
28
|
+
if (t.length > 1200)
|
|
29
|
+
return true;
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
function englishHeavy(text) {
|
|
33
|
+
const letters = (text.match(/[A-Za-z]/g) || []).length;
|
|
34
|
+
const viMarks = (text.match(/[ăâđêôơưáàảãạắằẳẵặấầẩẫậéèẻẽẹếềểễệíìỉĩịóòỏõọốồổỗộớờởỡợúùủũụứừửữựýỳỷỹỵ]/gi) || []).length;
|
|
35
|
+
return letters > 40 && viMarks === 0;
|
|
36
|
+
}
|
|
37
|
+
function sanitizeExtractedMemories(memories, vnContext) {
|
|
38
|
+
return memories
|
|
39
|
+
.map((m) => ({ ...m, text: String(m.text || "").replace(/\s+/g, " ").trim() }))
|
|
40
|
+
.filter((m) => m.text.length >= 20)
|
|
41
|
+
.filter((m) => !looksLikeRawTranscript(m.text))
|
|
42
|
+
.filter((m) => !(vnContext && englishHeavy(m.text)))
|
|
43
|
+
.slice(0, 12);
|
|
44
|
+
}
|
|
6
45
|
/**
|
|
7
46
|
* Extract facts using LLM via OpenAI Completions API
|
|
8
47
|
*/
|
|
@@ -52,8 +91,10 @@ export async function extractWithLLM(conversation, currentSlots, config, distill
|
|
|
52
91
|
}
|
|
53
92
|
const slotUpdates = (result.slot_updates || []).filter((s) => s.confidence >= 0.7);
|
|
54
93
|
const slotRemovals = result.slot_removals || [];
|
|
55
|
-
const
|
|
56
|
-
|
|
94
|
+
const vnContext = isVietnameseContext(conversation);
|
|
95
|
+
const rawMemories = (result.memories || []).filter((m) => m.confidence >= 0.7);
|
|
96
|
+
const memories = sanitizeExtractedMemories(rawMemories, vnContext);
|
|
97
|
+
console.log(`[LLMExtractor] Extracted ${slotUpdates.length} updates, ${slotRemovals.length} removals, ${memories.length}/${rawMemories.length} memories (sanitized)`);
|
|
57
98
|
return { slot_updates: slotUpdates, slot_removals: slotRemovals, memories: memories };
|
|
58
99
|
}
|
|
59
100
|
catch (error) {
|
|
@@ -65,9 +106,9 @@ function buildSystemInstruction(distillMode = "general") {
|
|
|
65
106
|
return `You are a memory extraction assistant. Analyze conversations and extract/update/invalidate facts.
|
|
66
107
|
|
|
67
108
|
LANGUAGE RULE (PRIORITY):
|
|
68
|
-
-
|
|
69
|
-
-
|
|
70
|
-
-
|
|
109
|
+
- If conversation contains Vietnamese context, memories[].text and slot_updates[].value MUST be in Vietnamese.
|
|
110
|
+
- Never output English narrative for VN context; only keep technical tokens unchanged (endpoint, symbol, config key).
|
|
111
|
+
- For mixed-language conversations with VN context, prefer Vietnamese and translate narrative meaning into Vietnamese.
|
|
71
112
|
- Do NOT normalize Vietnamese content into English.
|
|
72
113
|
|
|
73
114
|
YOUR 3 JOBS:
|
|
@@ -94,7 +135,23 @@ NAMESPACES: agent.<agent>.working_memory | agent.<agent>.lessons | agent.<agent>
|
|
|
94
135
|
|
|
95
136
|
CONFIDENCE: 0.9-1.0 explicit, 0.8-0.9 strongly implied, 0.7-0.8 inferred. Below 0.7: skip.
|
|
96
137
|
|
|
97
|
-
DO NOT extract:
|
|
138
|
+
DO NOT extract:
|
|
139
|
+
- raw tool transcripts (exec/read/edit output), command logs, stack traces, file listings, HTTP payload dumps
|
|
140
|
+
- routine greetings, insults, pure emotional reactions without decision impact
|
|
141
|
+
- duplicate restatements of already-stored facts
|
|
142
|
+
|
|
143
|
+
CONTEXT EXTRACTION PRIORITY (highest -> lowest):
|
|
144
|
+
1) explicit decisions/approvals/rejections
|
|
145
|
+
2) constraints/rules/non-negotiables
|
|
146
|
+
3) configuration/runtime changes with concrete values
|
|
147
|
+
4) task ownership, status transitions, blockers, ETAs
|
|
148
|
+
5) risk/guard adjustments and rollout/rollback conditions
|
|
149
|
+
|
|
150
|
+
CONTEXT QUALITY RULES:
|
|
151
|
+
- If a statement only makes sense with nearby messages, rewrite as self-contained memory with the missing context included.
|
|
152
|
+
- Prefer "because" clauses and trigger-condition clauses in memories (why + when it applies).
|
|
153
|
+
- Keep causal links: "A changed -> B failed -> action C".
|
|
154
|
+
- If conflicting statements exist in the same window, keep the latest and invalidate the stale slot.
|
|
98
155
|
|
|
99
156
|
RESPONSE FORMAT (JSON only):
|
|
100
157
|
{
|
|
@@ -104,11 +161,12 @@ RESPONSE FORMAT (JSON only):
|
|
|
104
161
|
}
|
|
105
162
|
|
|
106
163
|
DISTILL RULES (CRITICAL - apply to ALL outputs):
|
|
107
|
-
- DISTILL, never summarize. Remove
|
|
108
|
-
- memories[].text
|
|
109
|
-
-
|
|
110
|
-
- Preserve critical numbers, thresholds, symbols, time windows.
|
|
111
|
-
-
|
|
164
|
+
- DISTILL, never summarize. Remove decoration/noise; keep decision-grade core.
|
|
165
|
+
- memories[].text MUST be self-contained and operationally useful in isolation.
|
|
166
|
+
- memory format target: "Context -> Decision/Rule -> Condition/Scope" in 1-2 sentences.
|
|
167
|
+
- Preserve critical numbers, thresholds, symbols, time windows, and environment scope (prod/staging, mode paper/live).
|
|
168
|
+
- If content is mostly noise, return no memory instead of weak memory.
|
|
169
|
+
- slot_updates[].value: concise, actionable. Not "anh Công muốn backup trước khi sửa" -> "Rule: PHẢI backup config trước khi sửa openclaw.json"
|
|
112
170
|
|
|
113
171
|
MODE-SPECIFIC DISTILL:
|
|
114
172
|
${getDistillDirective(distillMode)}
|
|
@@ -167,11 +225,13 @@ ${conversation}
|
|
|
167
225
|
---
|
|
168
226
|
|
|
169
227
|
Instructions:
|
|
170
|
-
1. Extract NEW facts from conversation
|
|
171
|
-
2. Check currentSlots
|
|
172
|
-
3.
|
|
173
|
-
4. If a slot value should be UPDATED (not just removed), put new value in slot_updates
|
|
174
|
-
5.
|
|
228
|
+
1. Extract NEW facts from conversation with context preservation.
|
|
229
|
+
2. Check currentSlots and mark any OUTDATED/COMPLETED items in slot_removals.
|
|
230
|
+
3. Audit volatile project keys: project.current, project.current_task, project.current_epic, project.phase, project.status.
|
|
231
|
+
4. If a slot value should be UPDATED (not just removed), put new value in slot_updates.
|
|
232
|
+
5. For each memory, include WHY/CONDITION when available (not just WHAT).
|
|
233
|
+
6. Reject noisy/tool-dump content aggressively; quality over quantity.
|
|
234
|
+
7. Return JSON only.`;
|
|
175
235
|
}
|
|
176
236
|
/**
|
|
177
237
|
* Health check for LLM service
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llm-extractor.js","sourceRoot":"","sources":["../../src/services/llm-extractor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAyCH,MAAM,YAAY,GAAqB,EAAE,YAAY,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AAE7F;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,YAAoB,EACpB,YAAiD,EACjD,MAAiB,EACjB,cAA2B,SAAS;IAEpC,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,WAAW,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAG,eAAe,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IAE/D,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,+BAA+B,gBAAgB,QAAQ,CAAC,CAAC;IAErE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,CAAC,OAAO,mBAAmB,EAAE;YACjE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,eAAe,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE;aAC3C;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,QAAQ,EAAE;oBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,iBAAiB,EAAE;oBAC9C,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE;iBACtC;gBACD,WAAW,EAAE,GAAG;aACjB,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,cAAc,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAwB,CAAC;QACzD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC;QAEzD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;YACvD,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACpD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;YAC1D,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,IAAI,MAAM,CAAC;QACX,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,UAAe,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;YACtE,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,MAAM,WAAW,GAAG,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC;QACxF,MAAM,YAAY,GAAG,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC;QAChD,MAAM,
|
|
1
|
+
{"version":3,"file":"llm-extractor.js","sourceRoot":"","sources":["../../src/services/llm-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,17 +2,28 @@
|
|
|
2
2
|
* Shared Memory Configuration
|
|
3
3
|
* Source of truth for namespace routing, noise policy v2, and recall weighting
|
|
4
4
|
*/
|
|
5
|
-
export declare const
|
|
6
|
-
export type
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
export declare const DEFAULT_CORE_AGENTS: readonly ["assistant", "scrum", "fullstack", "trader", "creator"];
|
|
6
|
+
export type DefaultCoreAgent = (typeof DEFAULT_CORE_AGENTS)[number];
|
|
7
|
+
export type AgentNamespace = `agent.${string}.working_memory` | `agent.${string}.lessons` | `agent.${string}.decisions`;
|
|
8
|
+
/** New normalized namespace model (ASM-5, dynamic agent registry aware) */
|
|
9
|
+
export type MemoryNamespace = AgentNamespace | "shared.project_context" | "shared.rules_slotdb" | "shared.runbooks" | "noise.filtered";
|
|
9
10
|
/** Legacy namespaces kept for migration compatibility */
|
|
10
11
|
export type LegacyNamespace = "agent_decisions" | "user_profile" | "project_context" | "trading_signals" | "agent_learnings" | "system_rules" | "session_summaries" | "market_patterns" | "default";
|
|
12
|
+
export declare function resolveOpenClawConfigPath(): string;
|
|
13
|
+
export declare function getRegisteredAgentIds(): string[];
|
|
14
|
+
export declare function isRegisteredAgent(agentId: string): boolean;
|
|
15
|
+
export declare function resolveAgentId(agentId: string | null | undefined, fallbackAgent?: string): string;
|
|
16
|
+
export declare function isAgentNamespace(value: string | null | undefined): value is AgentNamespace;
|
|
11
17
|
export declare function normalizeNamespace(value: string | null | undefined, fallbackAgent?: string): MemoryNamespace;
|
|
12
|
-
|
|
18
|
+
/**
|
|
19
|
+
* Backward-compatible alias.
|
|
20
|
+
* Historically this returned only a hardcoded core agent and defaulted unknowns to assistant.
|
|
21
|
+
* New behavior keeps unknown/extra registry agents as themselves.
|
|
22
|
+
*/
|
|
23
|
+
export declare function toCoreAgent(agentId: string): string;
|
|
13
24
|
/**
|
|
14
25
|
* Revert coarse blocklist change:
|
|
15
|
-
* keep all
|
|
26
|
+
* keep all agents eligible for capture by default.
|
|
16
27
|
*/
|
|
17
28
|
export declare const DEFAULT_AGENT_BLOCKLIST: Set<string>;
|
|
18
29
|
/**
|
|
@@ -49,4 +60,6 @@ export declare class NoiseFilter {
|
|
|
49
60
|
};
|
|
50
61
|
getTargetNamespace(text?: string): MemoryNamespace;
|
|
51
62
|
}
|
|
63
|
+
export declare const CORE_AGENTS: readonly ["assistant", "scrum", "fullstack", "trader", "creator"];
|
|
64
|
+
export declare const DEFAULT_AGENT_SET: Set<string>;
|
|
52
65
|
//# sourceMappingURL=memory-config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-config.d.ts","sourceRoot":"","sources":["../../src/shared/memory-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"memory-config.d.ts","sourceRoot":"","sources":["../../src/shared/memory-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,75 @@
|
|
|
2
2
|
* Shared Memory Configuration
|
|
3
3
|
* Source of truth for namespace routing, noise policy v2, and recall weighting
|
|
4
4
|
*/
|
|
5
|
-
|
|
5
|
+
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
export const DEFAULT_CORE_AGENTS = ["assistant", "scrum", "fullstack", "trader", "creator"];
|
|
8
|
+
const STATIC_FALLBACK_AGENT_SET = new Set(DEFAULT_CORE_AGENTS);
|
|
9
|
+
const AGENT_NAMESPACE_RE = /^agent\.([a-z0-9][a-z0-9_-]*)\.(working_memory|lessons|decisions)$/i;
|
|
10
|
+
let cachedRegistry = null;
|
|
11
|
+
function normalizeAgentId(agentId) {
|
|
12
|
+
return String(agentId || "")
|
|
13
|
+
.trim()
|
|
14
|
+
.toLowerCase()
|
|
15
|
+
.replace(/[^a-z0-9_-]+/g, "-")
|
|
16
|
+
.replace(/^-+|-+$/g, "");
|
|
17
|
+
}
|
|
18
|
+
function getStateDir() {
|
|
19
|
+
return process.env.OPENCLAW_STATE_DIR || `${process.env.HOME}/.openclaw`;
|
|
20
|
+
}
|
|
21
|
+
export function resolveOpenClawConfigPath() {
|
|
22
|
+
const explicit = process.env.OPENCLAW_CONFIG_PATH || process.env.OPENCLAW_RUNTIME_CONFIG;
|
|
23
|
+
if (explicit && explicit.trim()) {
|
|
24
|
+
return explicit.trim();
|
|
25
|
+
}
|
|
26
|
+
return join(getStateDir(), "openclaw.json");
|
|
27
|
+
}
|
|
28
|
+
function readRuntimeAgentIdsFromConfig(configPath) {
|
|
29
|
+
if (!existsSync(configPath)) {
|
|
30
|
+
return [...DEFAULT_CORE_AGENTS];
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const parsed = JSON.parse(readFileSync(configPath, "utf8"));
|
|
34
|
+
const listed = Array.isArray(parsed?.agents?.list) ? parsed.agents.list : [];
|
|
35
|
+
const dynamicIds = listed
|
|
36
|
+
.map((entry) => normalizeAgentId(String(entry?.id || "")))
|
|
37
|
+
.filter(Boolean);
|
|
38
|
+
const merged = new Set([...DEFAULT_CORE_AGENTS, ...dynamicIds]);
|
|
39
|
+
return [...merged];
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return [...DEFAULT_CORE_AGENTS];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export function getRegisteredAgentIds() {
|
|
46
|
+
const configPath = resolveOpenClawConfigPath();
|
|
47
|
+
try {
|
|
48
|
+
const mtimeMs = existsSync(configPath) ? statSync(configPath).mtimeMs : -1;
|
|
49
|
+
if (cachedRegistry && cachedRegistry.configPath === configPath && cachedRegistry.mtimeMs === mtimeMs) {
|
|
50
|
+
return [...cachedRegistry.agentIds];
|
|
51
|
+
}
|
|
52
|
+
const agentIds = readRuntimeAgentIdsFromConfig(configPath);
|
|
53
|
+
cachedRegistry = { configPath, mtimeMs, agentIds };
|
|
54
|
+
return [...agentIds];
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return [...DEFAULT_CORE_AGENTS];
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export function isRegisteredAgent(agentId) {
|
|
61
|
+
const normalized = normalizeAgentId(agentId);
|
|
62
|
+
if (!normalized)
|
|
63
|
+
return false;
|
|
64
|
+
return getRegisteredAgentIds().includes(normalized);
|
|
65
|
+
}
|
|
66
|
+
export function resolveAgentId(agentId, fallbackAgent = "assistant") {
|
|
67
|
+
const normalized = normalizeAgentId(agentId);
|
|
68
|
+
if (normalized) {
|
|
69
|
+
return normalized;
|
|
70
|
+
}
|
|
71
|
+
const fallback = normalizeAgentId(fallbackAgent);
|
|
72
|
+
return fallback || "assistant";
|
|
73
|
+
}
|
|
6
74
|
const LEGACY_TO_NEW_NAMESPACE = {
|
|
7
75
|
agent_decisions: "agent.assistant.decisions",
|
|
8
76
|
user_profile: "shared.project_context",
|
|
@@ -12,39 +80,44 @@ const LEGACY_TO_NEW_NAMESPACE = {
|
|
|
12
80
|
system_rules: "shared.rules_slotdb",
|
|
13
81
|
default: "agent.assistant.working_memory",
|
|
14
82
|
};
|
|
83
|
+
export function isAgentNamespace(value) {
|
|
84
|
+
return typeof value === "string" && AGENT_NAMESPACE_RE.test(value.trim());
|
|
85
|
+
}
|
|
15
86
|
export function normalizeNamespace(value, fallbackAgent = "assistant") {
|
|
16
|
-
const agent =
|
|
87
|
+
const agent = resolveAgentId(fallbackAgent);
|
|
17
88
|
if (!value)
|
|
18
89
|
return `agent.${agent}.working_memory`;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
||
|
|
22
|
-
||
|
|
23
|
-
||
|
|
24
|
-
|
|
90
|
+
const trimmed = value.trim();
|
|
91
|
+
if (trimmed === "shared.project_context"
|
|
92
|
+
|| trimmed === "shared.rules_slotdb"
|
|
93
|
+
|| trimmed === "shared.runbooks"
|
|
94
|
+
|| trimmed === "noise.filtered"
|
|
95
|
+
|| isAgentNamespace(trimmed)) {
|
|
96
|
+
return trimmed;
|
|
25
97
|
}
|
|
26
|
-
const mapped = LEGACY_TO_NEW_NAMESPACE[
|
|
98
|
+
const mapped = LEGACY_TO_NEW_NAMESPACE[trimmed];
|
|
27
99
|
if (mapped)
|
|
28
100
|
return mapped;
|
|
29
101
|
return `agent.${agent}.working_memory`;
|
|
30
102
|
}
|
|
103
|
+
/**
|
|
104
|
+
* Backward-compatible alias.
|
|
105
|
+
* Historically this returned only a hardcoded core agent and defaulted unknowns to assistant.
|
|
106
|
+
* New behavior keeps unknown/extra registry agents as themselves.
|
|
107
|
+
*/
|
|
31
108
|
export function toCoreAgent(agentId) {
|
|
32
|
-
|
|
33
|
-
if (CORE_AGENTS.includes(normalized)) {
|
|
34
|
-
return normalized;
|
|
35
|
-
}
|
|
36
|
-
return "assistant";
|
|
109
|
+
return resolveAgentId(agentId);
|
|
37
110
|
}
|
|
38
111
|
/**
|
|
39
112
|
* Revert coarse blocklist change:
|
|
40
|
-
* keep all
|
|
113
|
+
* keep all agents eligible for capture by default.
|
|
41
114
|
*/
|
|
42
115
|
export const DEFAULT_AGENT_BLOCKLIST = new Set([]);
|
|
43
116
|
/**
|
|
44
117
|
* Per-agent recall namespaces (noise.filtered is intentionally excluded)
|
|
45
118
|
*/
|
|
46
119
|
export function getAgentNamespaces(agentId) {
|
|
47
|
-
const agent =
|
|
120
|
+
const agent = resolveAgentId(agentId);
|
|
48
121
|
return [
|
|
49
122
|
`agent.${agent}.working_memory`,
|
|
50
123
|
`agent.${agent}.lessons`,
|
|
@@ -55,7 +128,7 @@ export function getAgentNamespaces(agentId) {
|
|
|
55
128
|
];
|
|
56
129
|
}
|
|
57
130
|
export function getAutoCaptureNamespace(agentId, text) {
|
|
58
|
-
const agent =
|
|
131
|
+
const agent = resolveAgentId(agentId);
|
|
59
132
|
const content = String(text || "");
|
|
60
133
|
if (isLearningContent(content))
|
|
61
134
|
return `agent.${agent}.lessons`;
|
|
@@ -76,7 +149,7 @@ const SHARED_NAMESPACE_WEIGHT = {
|
|
|
76
149
|
"shared.runbooks": 1.12,
|
|
77
150
|
};
|
|
78
151
|
export function getNamespaceWeight(agentId, namespace) {
|
|
79
|
-
const agent =
|
|
152
|
+
const agent = resolveAgentId(agentId);
|
|
80
153
|
if (namespace === `agent.${agent}.decisions`)
|
|
81
154
|
return 1.25;
|
|
82
155
|
if (namespace === `agent.${agent}.lessons`)
|
|
@@ -170,4 +243,6 @@ export class NoiseFilter {
|
|
|
170
243
|
return getAutoCaptureNamespace(this.agentId, text);
|
|
171
244
|
}
|
|
172
245
|
}
|
|
246
|
+
export const CORE_AGENTS = DEFAULT_CORE_AGENTS;
|
|
247
|
+
export const DEFAULT_AGENT_SET = STATIC_FALLBACK_AGENT_SET;
|
|
173
248
|
//# sourceMappingURL=memory-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-config.js","sourceRoot":"","sources":["../../src/shared/memory-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,CAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"memory-config.js","sourceRoot":"","sources":["../../src/shared/memory-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface ResolveSlotDbDirInput {
|
|
2
|
+
stateDir?: string;
|
|
3
|
+
slotDbDir?: string;
|
|
4
|
+
env?: NodeJS.ProcessEnv;
|
|
5
|
+
homeDir?: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Resolve SlotDB directory with priority:
|
|
9
|
+
* 1) OPENCLAW_SLOTDB_DIR
|
|
10
|
+
* 2) plugin config slotDbDir
|
|
11
|
+
* 3) legacy fallback: ${stateDir}/agent-memo
|
|
12
|
+
*/
|
|
13
|
+
export declare function resolveSlotDbDir(input: ResolveSlotDbDirInput): string;
|
|
14
|
+
/**
|
|
15
|
+
* Backward compatibility resolver for legacy constructor usage:
|
|
16
|
+
* - If the provided path already points to an `agent-memo` directory, use as-is.
|
|
17
|
+
* - Otherwise treat it as OPENCLAW_STATE_DIR and append `agent-memo`.
|
|
18
|
+
*/
|
|
19
|
+
export declare function resolveLegacyStateDirInput(stateDirOrSlotDbDir: string): string;
|
|
20
|
+
//# sourceMappingURL=slotdb-path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slotdb-path.d.ts","sourceRoot":"","sources":["../../src/shared/slotdb-path.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAWD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,MAAM,CAerE;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,mBAAmB,EAAE,MAAM,GAAG,MAAM,CAS9E"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
function expandHome(input, homeDir) {
|
|
3
|
+
if (!input.startsWith("~"))
|
|
4
|
+
return input;
|
|
5
|
+
const home = homeDir || process.env.HOME || "";
|
|
6
|
+
if (!home)
|
|
7
|
+
return input;
|
|
8
|
+
if (input === "~")
|
|
9
|
+
return home;
|
|
10
|
+
if (input.startsWith("~/"))
|
|
11
|
+
return join(home, input.slice(2));
|
|
12
|
+
return input;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Resolve SlotDB directory with priority:
|
|
16
|
+
* 1) OPENCLAW_SLOTDB_DIR
|
|
17
|
+
* 2) plugin config slotDbDir
|
|
18
|
+
* 3) legacy fallback: ${stateDir}/agent-memo
|
|
19
|
+
*/
|
|
20
|
+
export function resolveSlotDbDir(input) {
|
|
21
|
+
const env = input.env || process.env;
|
|
22
|
+
const envSlotDbDir = env.OPENCLAW_SLOTDB_DIR?.trim();
|
|
23
|
+
const configSlotDbDir = input.slotDbDir?.trim();
|
|
24
|
+
const resolvedFromConfig = envSlotDbDir || configSlotDbDir;
|
|
25
|
+
if (resolvedFromConfig) {
|
|
26
|
+
return expandHome(resolvedFromConfig, input.homeDir || env.HOME);
|
|
27
|
+
}
|
|
28
|
+
const stateDir = input.stateDir?.trim()
|
|
29
|
+
|| env.OPENCLAW_STATE_DIR?.trim()
|
|
30
|
+
|| `${env.HOME}/.openclaw`;
|
|
31
|
+
return join(expandHome(stateDir, input.homeDir || env.HOME), "agent-memo");
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Backward compatibility resolver for legacy constructor usage:
|
|
35
|
+
* - If the provided path already points to an `agent-memo` directory, use as-is.
|
|
36
|
+
* - Otherwise treat it as OPENCLAW_STATE_DIR and append `agent-memo`.
|
|
37
|
+
*/
|
|
38
|
+
export function resolveLegacyStateDirInput(stateDirOrSlotDbDir) {
|
|
39
|
+
const expanded = expandHome(stateDirOrSlotDbDir);
|
|
40
|
+
const normalized = expanded.replace(/\\+$/, "").replace(/\/+$/, "");
|
|
41
|
+
if (normalized.endsWith("/agent-memo") || normalized.endsWith("\\agent-memo")) {
|
|
42
|
+
return expanded;
|
|
43
|
+
}
|
|
44
|
+
return join(expanded, "agent-memo");
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=slotdb-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slotdb-path.js","sourceRoot":"","sources":["../../src/shared/slotdb-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AASjC,SAAS,UAAU,CAAC,KAAa,EAAE,OAAgB;IACjD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACzC,MAAM,IAAI,GAAG,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;IAC/C,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAC/B,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAA4B;IAC3D,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACrC,MAAM,YAAY,GAAG,GAAG,CAAC,mBAAmB,EAAE,IAAI,EAAE,CAAC;IACrD,MAAM,eAAe,GAAG,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC;IAEhD,MAAM,kBAAkB,GAAG,YAAY,IAAI,eAAe,CAAC;IAC3D,IAAI,kBAAkB,EAAE,CAAC;QACvB,OAAO,UAAU,CAAC,kBAAkB,EAAE,KAAK,CAAC,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE;WAClC,GAAG,CAAC,kBAAkB,EAAE,IAAI,EAAE;WAC9B,GAAG,GAAG,CAAC,IAAI,YAAY,CAAC;IAE7B,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC,CAAC;AAC7E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CAAC,mBAA2B;IACpE,MAAM,QAAQ,GAAG,UAAU,CAAC,mBAAmB,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAEpE,IAAI,UAAU,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QAC9E,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -9,5 +9,8 @@
|
|
|
9
9
|
* - memory_graph_search: Search entities + traverse graph
|
|
10
10
|
*/
|
|
11
11
|
import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
|
|
12
|
-
export declare function registerGraphTools(api: OpenClawPluginApi
|
|
12
|
+
export declare function registerGraphTools(api: OpenClawPluginApi, options?: {
|
|
13
|
+
stateDir?: string;
|
|
14
|
+
slotDbDir?: string;
|
|
15
|
+
}): void;
|
|
13
16
|
//# sourceMappingURL=graph-tools.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph-tools.d.ts","sourceRoot":"","sources":["../../src/tools/graph-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"graph-tools.d.ts","sourceRoot":"","sources":["../../src/tools/graph-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAwD7D,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,iBAAiB,EACtB,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAClD,IAAI,CAkXN"}
|
|
@@ -9,16 +9,35 @@
|
|
|
9
9
|
* - memory_graph_search: Search entities + traverse graph
|
|
10
10
|
*/
|
|
11
11
|
import { SlotDB } from "../db/slot-db.js";
|
|
12
|
-
|
|
12
|
+
import { resolveSlotDbDir } from "../shared/slotdb-path.js";
|
|
13
|
+
// Singleton DB instances keyed by resolved slotDbDir
|
|
13
14
|
const dbInstances = new Map();
|
|
14
|
-
|
|
15
|
-
|
|
15
|
+
let runtimeConfig = {
|
|
16
|
+
stateDir: process.env.OPENCLAW_STATE_DIR || `${process.env.HOME}/.openclaw`,
|
|
17
|
+
slotDbDir: resolveSlotDbDir({
|
|
18
|
+
stateDir: process.env.OPENCLAW_STATE_DIR || `${process.env.HOME}/.openclaw`,
|
|
19
|
+
env: process.env,
|
|
20
|
+
homeDir: process.env.HOME,
|
|
21
|
+
}),
|
|
22
|
+
};
|
|
23
|
+
function getSlotDB(slotDbDir) {
|
|
24
|
+
let db = dbInstances.get(slotDbDir);
|
|
16
25
|
if (!db) {
|
|
17
|
-
db = new SlotDB(stateDir);
|
|
18
|
-
dbInstances.set(
|
|
26
|
+
db = new SlotDB(runtimeConfig.stateDir, { slotDbDir });
|
|
27
|
+
dbInstances.set(slotDbDir, db);
|
|
19
28
|
}
|
|
20
29
|
return db;
|
|
21
30
|
}
|
|
31
|
+
function resolveSlotDbDirFromContext(ctx) {
|
|
32
|
+
const stateDir = ctx?.stateDir || runtimeConfig.stateDir;
|
|
33
|
+
const configSlotDbDir = ctx?.pluginConfig?.slotDbDir || ctx?.config?.slotDbDir;
|
|
34
|
+
return resolveSlotDbDir({
|
|
35
|
+
stateDir,
|
|
36
|
+
slotDbDir: configSlotDbDir,
|
|
37
|
+
env: process.env,
|
|
38
|
+
homeDir: process.env.HOME,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
22
41
|
function extractScope(sessionKey) {
|
|
23
42
|
const parts = sessionKey.split(":");
|
|
24
43
|
const agentId = parts.length >= 2 ? parts[1] : "main";
|
|
@@ -32,7 +51,11 @@ function createResult(text, isError = false) {
|
|
|
32
51
|
isError,
|
|
33
52
|
};
|
|
34
53
|
}
|
|
35
|
-
export function registerGraphTools(api) {
|
|
54
|
+
export function registerGraphTools(api, options) {
|
|
55
|
+
runtimeConfig = {
|
|
56
|
+
stateDir: options?.stateDir || runtimeConfig.stateDir,
|
|
57
|
+
slotDbDir: options?.slotDbDir || runtimeConfig.slotDbDir,
|
|
58
|
+
};
|
|
36
59
|
// ===========================================================================
|
|
37
60
|
// Tool 1: memory_graph_entity_get
|
|
38
61
|
// ===========================================================================
|
|
@@ -50,10 +73,10 @@ export function registerGraphTools(api) {
|
|
|
50
73
|
},
|
|
51
74
|
async execute(_id, params, ctx) {
|
|
52
75
|
try {
|
|
53
|
-
const
|
|
76
|
+
const slotDbDir = resolveSlotDbDirFromContext(ctx);
|
|
54
77
|
const sessionKey = ctx?.sessionKey || "agent:main:default";
|
|
55
78
|
const { userId, agentId } = extractScope(sessionKey);
|
|
56
|
-
const db = getSlotDB(
|
|
79
|
+
const db = getSlotDB(slotDbDir);
|
|
57
80
|
// If ID provided, get single entity
|
|
58
81
|
if (params.id) {
|
|
59
82
|
const entity = db.graph.getEntity(userId, agentId, params.id);
|
|
@@ -116,10 +139,10 @@ export function registerGraphTools(api) {
|
|
|
116
139
|
},
|
|
117
140
|
async execute(_id, params, ctx) {
|
|
118
141
|
try {
|
|
119
|
-
const
|
|
142
|
+
const slotDbDir = resolveSlotDbDirFromContext(ctx);
|
|
120
143
|
const sessionKey = ctx?.sessionKey || "agent:main:default";
|
|
121
144
|
const { userId, agentId } = extractScope(sessionKey);
|
|
122
|
-
const db = getSlotDB(
|
|
145
|
+
const db = getSlotDB(slotDbDir);
|
|
123
146
|
let entity;
|
|
124
147
|
if (params.id) {
|
|
125
148
|
// Update existing
|
|
@@ -171,10 +194,10 @@ export function registerGraphTools(api) {
|
|
|
171
194
|
},
|
|
172
195
|
async execute(_id, params, ctx) {
|
|
173
196
|
try {
|
|
174
|
-
const
|
|
197
|
+
const slotDbDir = resolveSlotDbDirFromContext(ctx);
|
|
175
198
|
const sessionKey = ctx?.sessionKey || "agent:main:default";
|
|
176
199
|
const { userId, agentId } = extractScope(sessionKey);
|
|
177
|
-
const db = getSlotDB(
|
|
200
|
+
const db = getSlotDB(slotDbDir);
|
|
178
201
|
// Verify entities exist
|
|
179
202
|
const source = db.graph.getEntity(userId, agentId, params.source_id);
|
|
180
203
|
const target = db.graph.getEntity(userId, agentId, params.target_id);
|
|
@@ -225,10 +248,10 @@ export function registerGraphTools(api) {
|
|
|
225
248
|
},
|
|
226
249
|
async execute(_id, params, ctx) {
|
|
227
250
|
try {
|
|
228
|
-
const
|
|
251
|
+
const slotDbDir = resolveSlotDbDirFromContext(ctx);
|
|
229
252
|
const sessionKey = ctx?.sessionKey || "agent:main:default";
|
|
230
253
|
const { userId, agentId } = extractScope(sessionKey);
|
|
231
|
-
const db = getSlotDB(
|
|
254
|
+
const db = getSlotDB(slotDbDir);
|
|
232
255
|
if (params.id) {
|
|
233
256
|
// Delete by ID
|
|
234
257
|
const deleted = db.graph.deleteRelationship(userId, agentId, params.id);
|
|
@@ -280,10 +303,10 @@ export function registerGraphTools(api) {
|
|
|
280
303
|
},
|
|
281
304
|
async execute(_id, params, ctx) {
|
|
282
305
|
try {
|
|
283
|
-
const
|
|
306
|
+
const slotDbDir = resolveSlotDbDirFromContext(ctx);
|
|
284
307
|
const sessionKey = ctx?.sessionKey || "agent:main:default";
|
|
285
308
|
const { userId, agentId } = extractScope(sessionKey);
|
|
286
|
-
const db = getSlotDB(
|
|
309
|
+
const db = getSlotDB(slotDbDir);
|
|
287
310
|
// Get starting entity
|
|
288
311
|
const startEntity = db.graph.getEntity(userId, agentId, params.entity_id);
|
|
289
312
|
if (!startEntity) {
|