@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.
Files changed (43) hide show
  1. package/CONFIG.example.json +2 -0
  2. package/README.md +35 -3
  3. package/dist/config.d.ts +1 -0
  4. package/dist/config.d.ts.map +1 -1
  5. package/dist/config.js +3 -1
  6. package/dist/config.js.map +1 -1
  7. package/dist/db/slot-db.d.ts +4 -1
  8. package/dist/db/slot-db.d.ts.map +1 -1
  9. package/dist/db/slot-db.js +18 -7
  10. package/dist/db/slot-db.js.map +1 -1
  11. package/dist/hooks/auto-recall.d.ts +28 -0
  12. package/dist/hooks/auto-recall.d.ts.map +1 -1
  13. package/dist/hooks/auto-recall.js +222 -21
  14. package/dist/hooks/auto-recall.js.map +1 -1
  15. package/dist/index.d.ts +9 -0
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +30 -4
  18. package/dist/index.js.map +1 -1
  19. package/dist/services/embedding.d.ts +5 -1
  20. package/dist/services/embedding.d.ts.map +1 -1
  21. package/dist/services/embedding.js +45 -18
  22. package/dist/services/embedding.js.map +1 -1
  23. package/dist/services/llm-extractor.d.ts.map +1 -1
  24. package/dist/services/llm-extractor.js +76 -16
  25. package/dist/services/llm-extractor.js.map +1 -1
  26. package/dist/shared/memory-config.d.ts +19 -6
  27. package/dist/shared/memory-config.d.ts.map +1 -1
  28. package/dist/shared/memory-config.js +93 -18
  29. package/dist/shared/memory-config.js.map +1 -1
  30. package/dist/shared/slotdb-path.d.ts +20 -0
  31. package/dist/shared/slotdb-path.d.ts.map +1 -0
  32. package/dist/shared/slotdb-path.js +46 -0
  33. package/dist/shared/slotdb-path.js.map +1 -0
  34. package/dist/tools/graph-tools.d.ts +4 -1
  35. package/dist/tools/graph-tools.d.ts.map +1 -1
  36. package/dist/tools/graph-tools.js +39 -16
  37. package/dist/tools/graph-tools.js.map +1 -1
  38. package/dist/tools/slot-tools.d.ts +4 -1
  39. package/dist/tools/slot-tools.d.ts.map +1 -1
  40. package/dist/tools/slot-tools.js +37 -14
  41. package/dist/tools/slot-tools.js.map +1 -1
  42. package/openclaw.plugin.json +18 -1
  43. 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 memories = (result.memories || []).filter((m) => m.confidence >= 0.7);
56
- console.log(`[LLMExtractor] Extracted ${slotUpdates.length} updates, ${slotRemovals.length} removals, ${memories.length} memories`);
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
- - Prefer Vietnamese output when conversation contains Vietnamese or Vietnam-context operational commands.
69
- - For mixed-language conversations, output memories/slot values in the dominant operational language; prioritize Vietnamese if ambiguous.
70
- - Keep original technical tokens (endpoints, code symbols, config keys) unchanged.
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: trading data, prices, indicators, routine greetings, empty content.
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 all decoration/noise; keep only decision-grade core.
108
- - memories[].text must be terse atomic fragments. No filler words, no transitions.
109
- - Ban phrases in output: 'in conclusion', 'moreover', 'therefore', 'overall', 'it seems', 'anh ấy nói rằng', 'đã thảo luận về'.
110
- - Preserve critical numbers, thresholds, symbols, time windows.
111
- - 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"
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 - mark any OUTDATED/COMPLETED items in slot_removals
172
- 3. Especially audit volatile project keys: project.current, project.current_task, project.current_epic, project.phase, project.status
173
- 4. If a slot value should be UPDATED (not just removed), put new value in slot_updates
174
- 5. Return JSON only`;
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":"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"}
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 CORE_AGENTS: readonly ["assistant", "scrum", "fullstack", "trader", "creator"];
6
- export type CoreAgent = (typeof CORE_AGENTS)[number];
7
- /** New normalized namespace model (ASM-5) */
8
- export type MemoryNamespace = `agent.${CoreAgent}.working_memory` | `agent.${CoreAgent}.lessons` | `agent.${CoreAgent}.decisions` | "shared.project_context" | "shared.rules_slotdb" | "shared.runbooks" | "noise.filtered";
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
- export declare function toCoreAgent(agentId: string): CoreAgent;
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 5 core agents eligible for capture by default.
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;AAEH,eAAO,MAAM,WAAW,mEAAoE,CAAC;AAC7F,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAErD,6CAA6C;AAC7C,MAAM,MAAM,eAAe,GACvB,SAAS,SAAS,iBAAiB,GACnC,SAAS,SAAS,UAAU,GAC5B,SAAS,SAAS,YAAY,GAC9B,wBAAwB,GACxB,qBAAqB,GACrB,iBAAiB,GACjB,gBAAgB,CAAC;AAErB,yDAAyD;AACzD,MAAM,MAAM,eAAe,GACvB,iBAAiB,GACjB,cAAc,GACd,iBAAiB,GACjB,iBAAiB,GACjB,iBAAiB,GACjB,cAAc,GACd,mBAAmB,GACnB,iBAAiB,GACjB,SAAS,CAAC;AAYd,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,aAAa,GAAE,MAAoB,GAAG,eAAe,CAiBzH;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAMtD;AAED;;;GAGG;AACH,eAAO,MAAM,uBAAuB,aAAsB,CAAC;AAE3D;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,EAAE,CAUrE;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,eAAe,CAUvF;AASD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAY7E;AAED,sBAAsB;AACtB,eAAO,MAAM,iBAAiB,EAAE,MAAM,EAQrC,CAAC;AAQF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,GAAE,cAAc,GAAG,QAAQ,GAAG,WAA4B,GAAG;IACnH,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B,CAcA;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAKzD;AAED,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMhD,CAAC;AAEF,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAS;gBACZ,OAAO,EAAE,MAAM;IAI3B,SAAS,IAAI,OAAO;IAIpB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIjC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,GAAE,cAAc,GAAG,QAAQ,GAAG,WAA4B;eA5EpF,MAAM;iBACJ,OAAO;yBACC,MAAM,EAAE;;IA8EzB,kBAAkB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,eAAe;CAGnD"}
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
- export const CORE_AGENTS = ["assistant", "scrum", "fullstack", "trader", "creator"];
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 = toCoreAgent(fallbackAgent);
87
+ const agent = resolveAgentId(fallbackAgent);
17
88
  if (!value)
18
89
  return `agent.${agent}.working_memory`;
19
- if (value === "shared.project_context"
20
- || value === "shared.rules_slotdb"
21
- || value === "shared.runbooks"
22
- || value === "noise.filtered"
23
- || /^agent\.(assistant|scrum|fullstack|trader|creator)\.(working_memory|lessons|decisions)$/.test(value)) {
24
- return value;
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[value];
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
- const normalized = (agentId || "").toLowerCase();
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 5 core agents eligible for capture by default.
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 = toCoreAgent(agentId);
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 = toCoreAgent(agentId);
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 = toCoreAgent(agentId);
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":"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"}
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): void;
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;AA8B7D,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CA8W/D"}
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
- // Singleton DB instances
12
+ import { resolveSlotDbDir } from "../shared/slotdb-path.js";
13
+ // Singleton DB instances keyed by resolved slotDbDir
13
14
  const dbInstances = new Map();
14
- function getSlotDB(stateDir) {
15
- let db = dbInstances.get(stateDir);
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(stateDir, db);
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 stateDir = ctx?.stateDir || process.env.OPENCLAW_STATE_DIR || `${process.env.HOME}/.openclaw`;
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(stateDir);
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 stateDir = ctx?.stateDir || process.env.OPENCLAW_STATE_DIR || `${process.env.HOME}/.openclaw`;
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(stateDir);
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 stateDir = ctx?.stateDir || process.env.OPENCLAW_STATE_DIR || `${process.env.HOME}/.openclaw`;
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(stateDir);
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 stateDir = ctx?.stateDir || process.env.OPENCLAW_STATE_DIR || `${process.env.HOME}/.openclaw`;
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(stateDir);
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 stateDir = ctx?.stateDir || process.env.OPENCLAW_STATE_DIR || `${process.env.HOME}/.openclaw`;
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(stateDir);
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) {