@susu-eng/gralkor 27.2.11 → 27.2.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/README.md CHANGED
@@ -95,23 +95,10 @@ openclaw config set plugins.entries.gralkor.config.test true
95
95
  ### 3. Install the plugin
96
96
 
97
97
  ```bash
98
- openclaw plugins install @susu-eng/gralkor --dangerously-force-unsafe-install
98
+ openclaw plugins install @susu-eng/gralkor@latest --dangerously-force-unsafe-install
99
99
  ```
100
100
 
101
- From a tarball (e.g. for air-gapped deploys):
102
-
103
- ```bash
104
- openclaw plugins install ./susu-eng-gralkor-memory-26.0.14.tgz --dangerously-force-unsafe-install
105
- ```
106
-
107
- > **Why `--dangerously-force-unsafe-install`?** OpenClaw's install-time security
108
- > scanner flags Gralkor as critical because `dist/server-manager.js` imports
109
- > `node:child_process` and calls `spawn()` to launch the embedded Python server.
110
- > This is intrinsic to how Gralkor works (managed FalkorDB + Graphiti subprocess)
111
- > and cannot be removed. The flag is required on every install and update until
112
- > OpenClaw provides a manifest-level allowlist mechanism. Inspect the source on
113
- > npm/ClawHub before installing if you'd like to verify there's nothing else
114
- > going on.
101
+ > **Why `--dangerously-force-unsafe-install`?** OpenClaw's install-time security scanner flags Gralkor as critical because of the embeeded Python server. Inspect the source if you'd like to verify there's nothing weird going on.
115
102
 
116
103
  ### 4. Enable and assign the memory slot
117
104
 
@@ -155,7 +142,7 @@ Start chatting with your agent. Gralkor works in the background:
155
142
  ### Upgrading
156
143
 
157
144
  ```bash
158
- openclaw plugins update gralkor --dangerously-force-unsafe-install
145
+ openclaw plugins update gralkor@latest --dangerously-force-unsafe-install
159
146
  ```
160
147
 
161
148
  ### LLM providers
package/dist/hooks.d.ts CHANGED
@@ -51,19 +51,42 @@ export interface HookSessionContext {
51
51
  sessionKey?: string;
52
52
  }
53
53
  /**
54
- * Extract the user's actual message from event.prompt.
55
- *
56
- * The prompt may be wrapped in metadata:
57
- * "Sender (untrusted metadata):\n```json\n{...}\n```\n\nActual message"
54
+ * Extract the search query for auto-recall from the trailing run of user
55
+ * messages. Walks backwards from the end, collecting consecutive user
56
+ * messages (drip messages), stops at the first non-user role, cleans each
57
+ * via cleanUserMessageText, and joins in original order.
58
+ */
59
+ export declare function extractInjectQuery(messages: MessageEntry[]): string | null;
60
+ /**
61
+ * System message detectors — content matching any pattern is dropped entirely.
62
+ * OpenClaw injects system content under user/assistant roles (session
63
+ * notifications, timestamps, startup instructions). These patterns detect
64
+ * those injections so extractMessagesFromCtx can drop them before ingestion.
58
65
  *
59
- * System prompts (e.g. "A new session was started via /new") are not user messages.
66
+ * When a new runtime-injected pattern appears, add it here rather than
67
+ * writing bespoke stripping logic.
68
+ */
69
+ export declare const SYSTEM_MESSAGE_PATTERNS: RegExp[];
70
+ /**
71
+ * Returns true if the text is a system-injected message.
60
72
  */
61
- export declare function extractUserMessageFromPrompt(event: PromptBuildEvent): string;
73
+ export declare function isSystemMessage(text: string): boolean;
62
74
  /**
63
- * Extract the last user message text from the messages array.
64
- * Used as fallback when the prompt contains only metadata wrapper.
75
+ * Returns true if a single non-empty line matches a system pattern.
76
+ * Unlike isSystemMessage, does NOT treat empty/whitespace as system content
77
+ * preserves paragraph breaks when filtering line-by-line.
78
+ */
79
+ export declare function isSystemLine(line: string): boolean;
80
+ /**
81
+ * Detect system-injected user messages and extract real user content.
82
+ *
83
+ * Messages matching SYSTEM_MESSAGE_PATTERNS are dropped entirely.
84
+ * Metadata wrappers and gralkor-memory XML are unwrapped because they
85
+ * surround real user content.
86
+ *
87
+ * Returns the user's text, or empty string if the message is a system message.
65
88
  */
66
- export declare function extractLastUserMessageFromMessages(messages: MessageEntry[]): string;
89
+ export declare function cleanUserMessageText(text: string): string;
67
90
  /**
68
91
  * Extract and filter messages for episode ingestion.
69
92
  *
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
package/dist/hooks.js CHANGED
@@ -59,45 +59,27 @@ function truncateText(text, limit) {
59
59
  return text.slice(0, limit) + "... (truncated)";
60
60
  }
61
61
  /**
62
- * Extract the user's actual message from event.prompt.
63
- *
64
- * The prompt may be wrapped in metadata:
65
- * "Sender (untrusted metadata):\n```json\n{...}\n```\n\nActual message"
66
- *
67
- * System prompts (e.g. "A new session was started via /new") are not user messages.
62
+ * Extract the search query for auto-recall from the trailing run of user
63
+ * messages. Walks backwards from the end, collecting consecutive user
64
+ * messages (drip messages), stops at the first non-user role, cleans each
65
+ * via cleanUserMessageText, and joins in original order.
68
66
  */
69
- export function extractUserMessageFromPrompt(event) {
70
- // Strip leading "System: ..." lines (queued events prepended by gateway)
71
- const stripped = event.prompt.replace(/^(?:System: [^\n]*\n\n)+/, "");
72
- // Strip session-start system instruction (may have user message after it)
73
- const afterSession = stripped.replace(/^A new session was started[^\n]*(?:\n\n)?/, "");
74
- if (!afterSession)
75
- return "";
76
- // Strip metadata wrapper if present
77
- const metadataPattern = /^.+?\(untrusted metadata\):\n```json\n[\s\S]*?\n```\n\n/;
78
- const fromPrompt = afterSession.replace(metadataPattern, "").trim();
79
- if (fromPrompt)
80
- return fromPrompt;
81
- // Prompt was only metadata wrapper — extract from messages instead.
82
- return extractLastUserMessageFromMessages(event.messages);
83
- }
84
- /**
85
- * Extract the last user message text from the messages array.
86
- * Used as fallback when the prompt contains only metadata wrapper.
87
- */
88
- export function extractLastUserMessageFromMessages(messages) {
67
+ export function extractInjectQuery(messages) {
68
+ const parts = [];
89
69
  for (let i = messages.length - 1; i >= 0; i--) {
90
- if (messages[i].role === "user") {
91
- const text = normalizeContent(messages[i].content)
92
- .filter(isTextBlock)
93
- .map((block) => block.text)
94
- .join("\n");
95
- const cleaned = cleanUserMessageText(text);
96
- if (cleaned)
97
- return cleaned;
98
- }
70
+ if (messages[i].role !== "user")
71
+ break;
72
+ const text = normalizeContent(messages[i].content)
73
+ .filter(isTextBlock)
74
+ .map((block) => block.text)
75
+ .join("\n");
76
+ const cleaned = cleanUserMessageText(text);
77
+ if (cleaned)
78
+ parts.push(cleaned);
99
79
  }
100
- return "";
80
+ if (parts.length === 0)
81
+ return null;
82
+ return parts.reverse().join("\n\n");
101
83
  }
102
84
  /**
103
85
  * System message detectors — content matching any pattern is dropped entirely.
@@ -108,7 +90,7 @@ export function extractLastUserMessageFromMessages(messages) {
108
90
  * When a new runtime-injected pattern appears, add it here rather than
109
91
  * writing bespoke stripping logic.
110
92
  */
111
- const SYSTEM_MESSAGE_PATTERNS = [
93
+ export const SYSTEM_MESSAGE_PATTERNS = [
112
94
  /^A new session was started\b/,
113
95
  /^Current time:/i,
114
96
  /^✅?\s*New session started\b/,
@@ -118,7 +100,7 @@ const SYSTEM_MESSAGE_PATTERNS = [
118
100
  /**
119
101
  * Returns true if the text is a system-injected message.
120
102
  */
121
- function isSystemMessage(text) {
103
+ export function isSystemMessage(text) {
122
104
  const trimmed = text.trim();
123
105
  return !trimmed || SYSTEM_MESSAGE_PATTERNS.some((p) => p.test(trimmed));
124
106
  }
@@ -127,10 +109,27 @@ function isSystemMessage(text) {
127
109
  * Unlike isSystemMessage, does NOT treat empty/whitespace as system content —
128
110
  * preserves paragraph breaks when filtering line-by-line.
129
111
  */
130
- function isSystemLine(line) {
112
+ export function isSystemLine(line) {
131
113
  const trimmed = line.trim();
132
114
  return trimmed !== "" && SYSTEM_MESSAGE_PATTERNS.some((p) => p.test(trimmed));
133
115
  }
116
+ /**
117
+ * Remove gralkor-memory XML from text (feedback loop prevention).
118
+ * Applied to all message roles, not just user.
119
+ */
120
+ function stripGralkorMemoryXml(text) {
121
+ return text.replace(/<gralkor-memory[\s\S]*?<\/gralkor-memory>\n*/g, "");
122
+ }
123
+ /**
124
+ * Multi-line patterns that match entire messages which are NOT real user content.
125
+ * Checked in cleanUserMessageText as early-out — if the full text matches, the
126
+ * message is dropped entirely. Used for external plugin prompts that wrap
127
+ * conversation context in a structured template.
128
+ */
129
+ const SYSTEM_MESSAGE_MULTILINE_PATTERNS = [
130
+ // File-naming slug prompt from external plugins (e.g., ACPX session-namer)
131
+ /^Based on this conversation, generate a short \d+-\d+ word filename slug[\s\S]*Reply with ONLY the slug/,
132
+ ];
134
133
  /**
135
134
  * Detect system-injected user messages and extract real user content.
136
135
  *
@@ -140,13 +139,16 @@ function isSystemLine(line) {
140
139
  *
141
140
  * Returns the user's text, or empty string if the message is a system message.
142
141
  */
143
- function cleanUserMessageText(text) {
142
+ export function cleanUserMessageText(text) {
144
143
  if (!text.trim())
145
144
  return "";
145
+ // Drop messages matching known multi-line system templates
146
+ if (SYSTEM_MESSAGE_MULTILINE_PATTERNS.some((p) => p.test(text.trim())))
147
+ return "";
146
148
  // Unwrap metadata wrappers (they surround real user content)
147
149
  let cleaned = text.replace(/[^\n]+\(untrusted metadata\):\n```json\n[\s\S]*?\n```\n\n/g, "");
148
150
  // Remove gralkor-memory XML (feedback loop prevention)
149
- cleaned = cleaned.replace(/<gralkor-memory[\s\S]*?<\/gralkor-memory>\n*/g, "");
151
+ cleaned = stripGralkorMemoryXml(cleaned);
150
152
  // Remove Untrusted context footer (appended by OpenClaw's appendUntrustedContext)
151
153
  cleaned = cleaned.replace(/\n*Untrusted context \(metadata[^)]*\):\n[\s\S]*$/, "");
152
154
  // Strip individual system lines (session-start, Current time, etc.)
@@ -194,8 +196,9 @@ export function extractMessagesFromCtx(event) {
194
196
  filtered.push({ type: "tool_use", text: serializeToolBlock(block) });
195
197
  }
196
198
  else if (isTextBlock(block)) {
197
- if (!isSystemMessage(block.text)) {
198
- filtered.push({ type: "text", text: block.text });
199
+ const cleaned = stripGralkorMemoryXml(block.text);
200
+ if (cleaned.trim() && !isSystemMessage(cleaned)) {
201
+ filtered.push({ type: "text", text: cleaned });
199
202
  }
200
203
  }
201
204
  }
@@ -208,10 +211,11 @@ export function extractMessagesFromCtx(event) {
208
211
  .filter(isTextBlock)
209
212
  .map((block) => block.text)
210
213
  .join("\n");
211
- if (textParts) {
214
+ const cleaned = stripGralkorMemoryXml(textParts);
215
+ if (cleaned.trim()) {
212
216
  result.push({
213
217
  role: "assistant",
214
- content: [{ type: "tool_result", text: truncateText(textParts, TOOL_RESULT_TRUNCATE_LIMIT) }],
218
+ content: [{ type: "tool_result", text: truncateText(cleaned, TOOL_RESULT_TRUNCATE_LIMIT) }],
215
219
  });
216
220
  }
217
221
  }
@@ -292,8 +296,8 @@ export function createBeforePromptBuildHandler(client, config, opts) {
292
296
  console.log(`[gralkor] auto-recall skip (disabled) — agentId:${agentId}`);
293
297
  return;
294
298
  }
295
- const userMessage = extractUserMessageFromPrompt(event);
296
- if (!userMessage) {
299
+ const userMessage = extractInjectQuery(event.messages);
300
+ if (userMessage === null) {
297
301
  console.log(`[gralkor] auto-recall skip (no query) — agentId:${agentId} promptLen:${event.prompt.length} messages:${event.messages.length}`);
298
302
  return;
299
303
  }
@@ -306,7 +310,7 @@ export function createBeforePromptBuildHandler(client, config, opts) {
306
310
  const searchResults = await client.search(userMessage, [groupId], limit, "fast");
307
311
  const factCount = searchResults.facts.length;
308
312
  console.log(`[gralkor] auto-recall result — graph: ${factCount} facts — groupId:${groupId}`);
309
- const furtherQuerying = "Then, search memory up to 3 times in parallel with diverse queries to understand more deeply.";
313
+ const furtherQuerying = "Search memory up to 3 times in parallel with diverse queries to understand more deeply.";
310
314
  let contextBody;
311
315
  if (factCount > 0) {
312
316
  const factsText = "Facts:\n" + searchResults.facts.map(formatFact).join("\n");
package/dist/hooks.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Data-driven test fixtures for capture hygiene.
3
+ *
4
+ * To add a new case: append an entry to the relevant array. Each case is a
5
+ * self-contained input/expected pair with an optional `discovered` field
6
+ * noting where the problematic content was found.
7
+ *
8
+ * When enough cases accumulate, analyse for underlying patterns and promote
9
+ * to structural filters.
10
+ */
11
+ export interface SystemPatternCase {
12
+ description: string;
13
+ input: string;
14
+ expected: boolean;
15
+ }
16
+ export declare const systemPatternCases: SystemPatternCase[];
17
+ /**
18
+ * Edge cases for isSystemMessage that go beyond pattern matching.
19
+ * isSystemMessage has a !trimmed short-circuit that treats empty/whitespace
20
+ * as system content even though no SYSTEM_MESSAGE_PATTERNS matches them.
21
+ */
22
+ export declare const isSystemMessageEdgeCases: SystemPatternCase[];
23
+ export interface CleanTextCase {
24
+ description: string;
25
+ input: string;
26
+ expected: string;
27
+ discovered?: string;
28
+ }
29
+ export declare const cleanTextCases: CleanTextCase[];
30
+ //# sourceMappingURL=capture-cases.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture-cases.d.ts","sourceRoot":"","sources":["../../src/test-fixtures/capture-cases.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,eAAO,MAAM,kBAAkB,EAAE,iBAAiB,EA2DjD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,EAAE,iBAAiB,EAWvD,CAAC;AAIF,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,cAAc,EAAE,aAAa,EA4FzC,CAAC"}
@@ -0,0 +1,176 @@
1
+ /**
2
+ * Data-driven test fixtures for capture hygiene.
3
+ *
4
+ * To add a new case: append an entry to the relevant array. Each case is a
5
+ * self-contained input/expected pair with an optional `discovered` field
6
+ * noting where the problematic content was found.
7
+ *
8
+ * When enough cases accumulate, analyse for underlying patterns and promote
9
+ * to structural filters.
10
+ */
11
+ export const systemPatternCases = [
12
+ // Positive matches (expected: true)
13
+ {
14
+ description: "session-start instruction",
15
+ input: "A new session was started via /new or /reset. Execute your Session Startup sequence now",
16
+ expected: true,
17
+ },
18
+ {
19
+ description: "Current time line",
20
+ input: "Current time: Wednesday, March 25th, 2026 — 20:37 (Asia/Bangkok)",
21
+ expected: true,
22
+ },
23
+ {
24
+ description: "Current time line (lowercase)",
25
+ input: "current time: Thursday",
26
+ expected: true,
27
+ },
28
+ {
29
+ description: "session-started notification with emoji",
30
+ input: "✅ New session started · model: anthropic/claude-opus-4-6",
31
+ expected: true,
32
+ },
33
+ {
34
+ description: "session-started notification without emoji",
35
+ input: "New session started · model: openai/gpt-4o",
36
+ expected: true,
37
+ },
38
+ {
39
+ description: "System: event line",
40
+ input: "System: [Fri 2026-03-27 09:15:30] Node: agent-1 running",
41
+ expected: true,
42
+ },
43
+ {
44
+ description: "media placeholder",
45
+ input: "[User sent media without caption]",
46
+ expected: true,
47
+ },
48
+ // Negative matches (expected: false)
49
+ {
50
+ description: "real user question",
51
+ input: "What is the weather today?",
52
+ expected: false,
53
+ },
54
+ {
55
+ description: "System: appearing mid-string",
56
+ input: "Tell me about System: concepts in Linux",
57
+ expected: false,
58
+ },
59
+ {
60
+ description: "session-start text appearing mid-string",
61
+ input: "Explain what A new session was started means in this app",
62
+ expected: false,
63
+ },
64
+ {
65
+ description: "assistant response",
66
+ input: "Here is the answer to your question",
67
+ expected: false,
68
+ },
69
+ ];
70
+ /**
71
+ * Edge cases for isSystemMessage that go beyond pattern matching.
72
+ * isSystemMessage has a !trimmed short-circuit that treats empty/whitespace
73
+ * as system content even though no SYSTEM_MESSAGE_PATTERNS matches them.
74
+ */
75
+ export const isSystemMessageEdgeCases = [
76
+ {
77
+ description: "empty string is system",
78
+ input: "",
79
+ expected: true,
80
+ },
81
+ {
82
+ description: "whitespace only is system",
83
+ input: " ",
84
+ expected: true,
85
+ },
86
+ ];
87
+ export const cleanTextCases = [
88
+ // Metadata wrappers
89
+ {
90
+ description: "strips metadata and keeps user text",
91
+ input: 'Sender (untrusted metadata):\n```json\n{"id": "123"}\n```\n\nHey, enjoying tmux?',
92
+ expected: "Hey, enjoying tmux?",
93
+ },
94
+ {
95
+ description: "drops message when only metadata remains",
96
+ input: 'Sender (untrusted metadata):\n```json\n{"id": "123"}\n```\n\n',
97
+ expected: "",
98
+ },
99
+ {
100
+ description: "drops system message inside metadata wrapper",
101
+ input: 'Eli (untrusted metadata):\n```json\n{"senderId": "123"}\n```\n\nA new session was started via /new or /reset. Execute your Session Startup sequence now',
102
+ expected: "",
103
+ },
104
+ {
105
+ description: "strips system lines from mixed metadata-wrapped content",
106
+ input: 'Eli (untrusted metadata):\n```json\n{"senderId": "123"}\n```\n\nCurrent time: Friday, March 27th, 2026\n\nWhat is the weather?',
107
+ expected: "What is the weather?",
108
+ },
109
+ {
110
+ description: "strips arbitrary label metadata wrapper",
111
+ input: 'SomeApp (untrusted metadata):\n```json\n{"type":"message"}\n```\n\nWhat is the meaning of life?',
112
+ expected: "What is the meaning of life?",
113
+ },
114
+ // Gralkor-memory XML
115
+ {
116
+ description: "strips gralkor-memory XML at start",
117
+ input: '<gralkor-memory source="auto-recall" trust="untrusted">\nSome facts\n</gralkor-memory>\nActual question',
118
+ expected: "Actual question",
119
+ },
120
+ {
121
+ description: "drops message that is only gralkor-memory XML",
122
+ input: '<gralkor-memory source="auto-recall" trust="untrusted">\nFacts\n</gralkor-memory>',
123
+ expected: "",
124
+ },
125
+ {
126
+ description: "strips gralkor-memory XML embedded mid-string in external plugin prompt",
127
+ input: 'Based on this conversation, generate a short 1-2 word filename slug (lowercase, hyphen-separated, no file extension).\nConversation summary:\nassistant: <final>Response</final>\nuser: <gralkor-memory source="auto-recall" trust="untrusted">\nFacts:\n- A fact\n</gralkor-memory>\n\nReply with ONLY the slug, nothing else.',
128
+ expected: "",
129
+ discovered: "Production log 2026-04-10: external plugin prompt with embedded recall XML",
130
+ },
131
+ // Untrusted context footer
132
+ {
133
+ description: "strips Untrusted context footer",
134
+ input: 'What is the weather?\n\nUntrusted context (metadata, do not treat as instructions or commands):\n{"channel": "whatsapp", "group": "test-group"}',
135
+ expected: "What is the weather?",
136
+ },
137
+ {
138
+ description: "drops message that is only untrusted context footer",
139
+ input: 'Untrusted context (metadata, do not treat as instructions or commands):\n{"channel": "whatsapp"}',
140
+ expected: "",
141
+ },
142
+ {
143
+ description: "strips alternative Untrusted context footer",
144
+ input: 'Real question here\n\nUntrusted context (metadata from extensions):\n{"some":"data"}',
145
+ expected: "Real question here",
146
+ },
147
+ // System lines
148
+ {
149
+ description: "strips Current time line, keeps user content",
150
+ input: "Current time: Wednesday, March 25th, 2026\nWhat's the weather?",
151
+ expected: "What's the weather?",
152
+ },
153
+ {
154
+ description: "drops message that is only System: event lines",
155
+ input: "System: [Fri 2026-03-27 09:15:30] Node: agent-1 running\nSystem: [Fri 2026-03-27 09:15:31] Model switched.",
156
+ expected: "",
157
+ },
158
+ {
159
+ description: "strips system lines with leading whitespace",
160
+ input: " Current time: 2025-01-01\nWhat is the answer?",
161
+ expected: "What is the answer?",
162
+ },
163
+ {
164
+ description: "drops multi-line system content inside metadata wrapper",
165
+ input: 'Eli (untrusted metadata):\n```json\n{"senderId": "123"}\n```\n\nA new session was started via /new or /reset. Run your Session Startup sequence.\nCurrent time: Friday, March 27th, 2026 — 11:39 (Asia/Bangkok)',
166
+ expected: "",
167
+ },
168
+ // External plugin prompts
169
+ {
170
+ description: "drops file-naming slug prompt from external plugin",
171
+ input: 'Based on this conversation, generate a short 1-2 word filename slug (lowercase, hyphen-separated, no file extension).\nConversation summary:\nassistant: <final>Response</final>\nuser: Hello\n\nReply with ONLY the slug, nothing else. Examples: "vendor-pitch", "api-design", "bug-fix"',
172
+ expected: "",
173
+ discovered: "Production log 2026-04-10: ACPX session-namer plugin prompt",
174
+ },
175
+ ];
176
+ //# sourceMappingURL=capture-cases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture-cases.js","sourceRoot":"","sources":["../../src/test-fixtures/capture-cases.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAUH,MAAM,CAAC,MAAM,kBAAkB,GAAwB;IACrD,oCAAoC;IACpC;QACE,WAAW,EAAE,2BAA2B;QACxC,KAAK,EAAE,yFAAyF;QAChG,QAAQ,EAAE,IAAI;KACf;IACD;QACE,WAAW,EAAE,mBAAmB;QAChC,KAAK,EAAE,kEAAkE;QACzE,QAAQ,EAAE,IAAI;KACf;IACD;QACE,WAAW,EAAE,+BAA+B;QAC5C,KAAK,EAAE,wBAAwB;QAC/B,QAAQ,EAAE,IAAI;KACf;IACD;QACE,WAAW,EAAE,yCAAyC;QACtD,KAAK,EAAE,0DAA0D;QACjE,QAAQ,EAAE,IAAI;KACf;IACD;QACE,WAAW,EAAE,4CAA4C;QACzD,KAAK,EAAE,4CAA4C;QACnD,QAAQ,EAAE,IAAI;KACf;IACD;QACE,WAAW,EAAE,oBAAoB;QACjC,KAAK,EAAE,yDAAyD;QAChE,QAAQ,EAAE,IAAI;KACf;IACD;QACE,WAAW,EAAE,mBAAmB;QAChC,KAAK,EAAE,mCAAmC;QAC1C,QAAQ,EAAE,IAAI;KACf;IAED,qCAAqC;IACrC;QACE,WAAW,EAAE,oBAAoB;QACjC,KAAK,EAAE,4BAA4B;QACnC,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,WAAW,EAAE,8BAA8B;QAC3C,KAAK,EAAE,yCAAyC;QAChD,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,WAAW,EAAE,yCAAyC;QACtD,KAAK,EAAE,0DAA0D;QACjE,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,WAAW,EAAE,oBAAoB;QACjC,KAAK,EAAE,qCAAqC;QAC5C,QAAQ,EAAE,KAAK;KAChB;CACF,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAwB;IAC3D;QACE,WAAW,EAAE,wBAAwB;QACrC,KAAK,EAAE,EAAE;QACT,QAAQ,EAAE,IAAI;KACf;IACD;QACE,WAAW,EAAE,2BAA2B;QACxC,KAAK,EAAE,KAAK;QACZ,QAAQ,EAAE,IAAI;KACf;CACF,CAAC;AAWF,MAAM,CAAC,MAAM,cAAc,GAAoB;IAC7C,oBAAoB;IACpB;QACE,WAAW,EAAE,qCAAqC;QAClD,KAAK,EAAE,kFAAkF;QACzF,QAAQ,EAAE,qBAAqB;KAChC;IACD;QACE,WAAW,EAAE,0CAA0C;QACvD,KAAK,EAAE,+DAA+D;QACtE,QAAQ,EAAE,EAAE;KACb;IACD;QACE,WAAW,EAAE,8CAA8C;QAC3D,KAAK,EAAE,yJAAyJ;QAChK,QAAQ,EAAE,EAAE;KACb;IACD;QACE,WAAW,EAAE,yDAAyD;QACtE,KAAK,EAAE,gIAAgI;QACvI,QAAQ,EAAE,sBAAsB;KACjC;IACD;QACE,WAAW,EAAE,yCAAyC;QACtD,KAAK,EAAE,iGAAiG;QACxG,QAAQ,EAAE,8BAA8B;KACzC;IAED,qBAAqB;IACrB;QACE,WAAW,EAAE,oCAAoC;QACjD,KAAK,EAAE,yGAAyG;QAChH,QAAQ,EAAE,iBAAiB;KAC5B;IACD;QACE,WAAW,EAAE,+CAA+C;QAC5D,KAAK,EAAE,mFAAmF;QAC1F,QAAQ,EAAE,EAAE;KACb;IACD;QACE,WAAW,EAAE,yEAAyE;QACtF,KAAK,EAAE,iUAAiU;QACxU,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,4EAA4E;KACzF;IAED,2BAA2B;IAC3B;QACE,WAAW,EAAE,iCAAiC;QAC9C,KAAK,EAAE,iJAAiJ;QACxJ,QAAQ,EAAE,sBAAsB;KACjC;IACD;QACE,WAAW,EAAE,qDAAqD;QAClE,KAAK,EAAE,kGAAkG;QACzG,QAAQ,EAAE,EAAE;KACb;IACD;QACE,WAAW,EAAE,6CAA6C;QAC1D,KAAK,EAAE,sFAAsF;QAC7F,QAAQ,EAAE,oBAAoB;KAC/B;IAED,eAAe;IACf;QACE,WAAW,EAAE,8CAA8C;QAC3D,KAAK,EAAE,gEAAgE;QACvE,QAAQ,EAAE,qBAAqB;KAChC;IACD;QACE,WAAW,EAAE,gDAAgD;QAC7D,KAAK,EAAE,4GAA4G;QACnH,QAAQ,EAAE,EAAE;KACb;IACD;QACE,WAAW,EAAE,6CAA6C;QAC1D,KAAK,EAAE,iDAAiD;QACxD,QAAQ,EAAE,qBAAqB;KAChC;IACD;QACE,WAAW,EAAE,yDAAyD;QACtE,KAAK,EAAE,iNAAiN;QACxN,QAAQ,EAAE,EAAE;KACb;IAED,0BAA0B;IAC1B;QACE,WAAW,EAAE,oDAAoD;QACjE,KAAK,EAAE,4RAA4R;QACnS,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,6DAA6D;KAC1E;CACF,CAAC"}
@@ -153,5 +153,5 @@
153
153
  "label": "Groq API key"
154
154
  }
155
155
  },
156
- "version": "27.2.11"
156
+ "version": "27.2.12"
157
157
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@susu-eng/gralkor",
3
3
  "displayName": "Gralkor",
4
- "version": "27.2.11",
4
+ "version": "27.2.12",
5
5
  "description": "OpenClaw memory plugin powered by Graphiti knowledge graphs and FalkorDB",
6
6
  "type": "module",
7
7
  "main": "./dist/index.js",
@@ -18,14 +18,12 @@
18
18
  },
19
19
  "files": [
20
20
  "dist",
21
- "server/Dockerfile",
22
21
  "server/main.py",
23
22
  "server/pyproject.toml",
24
23
  "server/uv.lock",
25
24
  "server/requirements.txt",
26
25
  "server/wheels",
27
26
  "openclaw.plugin.json",
28
- "docker-compose.yml",
29
27
  "config.yaml",
30
28
  ".env.example"
31
29
  ],
@@ -69,24 +67,22 @@
69
67
  "scripts": {
70
68
  "build": "tsc",
71
69
  "typecheck": "tsc --noEmit",
72
- "test": "pnpm run typecheck && pnpm run test:plugin && pnpm run test:integration && pnpm run test:server",
73
- "test:plugin": "vitest run",
74
- "test:integration": "vitest run --config test/integration/vitest.config.ts",
70
+ "test": "pnpm run typecheck && pnpm run test:unit && pnpm run test:integration",
71
+ "test:unit": "pnpm run test:unit:ts && pnpm run test:unit:py",
72
+ "test:unit:ts": "vitest run",
73
+ "test:unit:py": "cd server && uv run pytest tests/ --ignore=tests/test_integration.py",
74
+ "test:integration": "pnpm run test:integration:ts && pnpm run test:integration:py",
75
+ "test:integration:ts": "vitest run --config test/integration/vitest.config.ts",
76
+ "test:integration:py": "cd server && uv run pytest tests/test_integration.py",
75
77
  "test:functional": "bash test/harness/functional-env.sh test",
76
78
  "test:functional:both": "bash scripts/functional-test-both.sh",
77
79
  "test:functional:results": "bash scripts/functional-test-results.sh /tmp/gralkor-functional-arm64.log /tmp/gralkor-functional-amd64.log",
78
80
  "test:functional:up": "bash test/harness/functional-env.sh up",
79
81
  "test:functional:run": "bash test/harness/functional-env.sh run",
80
82
  "test:functional:down": "bash test/harness/functional-env.sh down",
81
- "test:server": "cd server && uv run pytest tests/",
82
- "test:server:changed": "cd server && files=$(git diff --name-only --diff-filter=d HEAD -- 'tests/*.py') && [ -n \"$files\" ] && uv run pytest $files || echo 'No changed server test files'",
83
83
  "test:mutate": "stryker run",
84
84
  "setup:server": "cd server && uv sync",
85
85
  "pack": "bash scripts/pack.sh",
86
- "docker:build": "docker build -t gralkor-server:latest server/",
87
- "docker:up": "pnpm run docker:build && docker compose up -d",
88
- "docker:down": "docker compose down",
89
- "docker:logs": "docker compose logs graphiti",
90
86
  "publish:npm": "bash scripts/publish-npm.sh",
91
87
  "publish:clawhub": "bash scripts/publish-clawhub.sh",
92
88
  "publish:all": "bash scripts/publish-all.sh"
package/server/main.py CHANGED
@@ -198,6 +198,15 @@ ontology_entity_types: dict[str, type[BaseModel]] | None = None
198
198
  ontology_edge_types: dict[str, type[BaseModel]] | None = None
199
199
  ontology_edge_type_map: dict[tuple[str, str], list[str]] | None = None
200
200
 
201
+ # Serializes any operation that depends on graphiti.driver pointing at a
202
+ # specific FalkorDB named graph. graphiti-core's add_episode() and our
203
+ # _ensure_driver_graph() both work by mutating the global graphiti.driver,
204
+ # so two concurrent requests for different group_ids can interleave and
205
+ # clobber each other's driver state — losing data on writes and returning
206
+ # wrong results on reads. Single-user agent semantics make serialization
207
+ # acceptable; correctness > throughput here.
208
+ _driver_lock = asyncio.Lock()
209
+
201
210
 
202
211
  @asynccontextmanager
203
212
  async def lifespan(_app: FastAPI):
@@ -469,18 +478,19 @@ async def add_episode(req: AddEpisodeRequest):
469
478
  )
470
479
  episode_type = EpisodeType(req.source) if req.source else EpisodeType.message
471
480
  t0 = time.monotonic()
472
- result = await graphiti.add_episode(
473
- name=req.name,
474
- episode_body=req.episode_body,
475
- source_description=req.source_description,
476
- group_id=req.group_id,
477
- reference_time=ref_time,
478
- source=episode_type,
479
- entity_types=ontology_entity_types,
480
- edge_types=ontology_edge_types,
481
- edge_type_map=ontology_edge_type_map,
482
- excluded_entity_types=None,
483
- )
481
+ async with _driver_lock:
482
+ result = await graphiti.add_episode(
483
+ name=req.name,
484
+ episode_body=req.episode_body,
485
+ source_description=req.source_description,
486
+ group_id=_sanitize_group_id(req.group_id),
487
+ reference_time=ref_time,
488
+ source=episode_type,
489
+ entity_types=ontology_entity_types,
490
+ edge_types=ontology_edge_types,
491
+ edge_type_map=ontology_edge_type_map,
492
+ excluded_entity_types=None,
493
+ )
484
494
  duration_ms = (time.monotonic() - t0) * 1000
485
495
  episode = result.episode
486
496
  logger.info("[gralkor] episode added — uuid:%s duration:%.0fms", episode.uuid, duration_ms)
@@ -499,6 +509,17 @@ def _sanitize_query(query: str) -> str:
499
509
  return query.replace("`", " ")
500
510
 
501
511
 
512
+ def _sanitize_group_id(group_id: str) -> str:
513
+ """Replace hyphens with underscores to avoid RediSearch syntax errors.
514
+
515
+ graphiti-core embeds group_id verbatim in RediSearch queries like
516
+ (@group_id:"my-hyphen-agent") where hyphens break the parser.
517
+ The plugin-side sanitizeGroupId() handles this at write time, but
518
+ direct API callers (e.g. functional tests) may pass raw hyphens.
519
+ """
520
+ return group_id.replace("-", "_")
521
+
522
+
502
523
  def _ensure_driver_graph(group_ids: list[str] | None) -> None:
503
524
  """Route graphiti's driver to the correct FalkorDB named graph.
504
525
 
@@ -512,43 +533,52 @@ def _ensure_driver_graph(group_ids: list[str] | None) -> None:
512
533
  return
513
534
  target = group_ids[0]
514
535
  if target != graphiti.driver._database:
515
- graphiti.driver = graphiti.driver.clone(database=target)
516
- graphiti.clients.driver = graphiti.driver
517
- print(f"[gralkor] driver graph routed: {target}", flush=True)
536
+ try:
537
+ graphiti.driver = graphiti.driver.clone(database=target)
538
+ graphiti.clients.driver = graphiti.driver
539
+ print(f"[gralkor] driver graph routed: {target}", flush=True)
540
+ except Exception as e:
541
+ # Invalid group_id (e.g. hyphens rejected by FalkorDB). Skip routing
542
+ # so the search runs against the current graph and returns empty results
543
+ # instead of 500ing.
544
+ logger.warning("[gralkor] driver graph routing failed for %s: %s", target, e)
518
545
 
519
546
 
520
547
  @app.post("/search")
521
548
  async def search(req: SearchRequest):
549
+ # Sanitize group IDs: hyphens cause RediSearch syntax errors in graphiti-core.
550
+ sanitized = [_sanitize_group_id(g) for g in req.group_ids]
522
551
  logger.info("[gralkor] search — mode:%s query:%d chars group_ids:%s num_results:%d",
523
- req.mode, len(req.query), req.group_ids, req.num_results)
552
+ req.mode, len(req.query), sanitized, req.num_results)
524
553
  # graphiti.add_episode() clones the driver to target the correct FalkorDB
525
554
  # named graph (database=group_id), but graphiti.search() does not — it just
526
555
  # uses whatever graph the driver currently points at. Before the first
527
556
  # add_episode, the driver targets 'default_db' (an empty graph), so all
528
557
  # searches return 0 results. Fix: route to the correct graph here.
529
- _ensure_driver_graph(req.group_ids)
530
558
  t0 = time.monotonic()
531
559
  try:
532
- if req.mode == "slow":
533
- # Cross-encoder + BFS: higher quality, also returns entity node summaries.
534
- # deepcopy required — COMBINED_HYBRID_SEARCH_CROSS_ENCODER is a module-level
535
- # constant; mutating .limit directly would corrupt it across requests.
536
- config = deepcopy(COMBINED_HYBRID_SEARCH_CROSS_ENCODER)
537
- config.limit = req.num_results
538
- search_result = await graphiti.search_(
539
- query=_sanitize_query(req.query),
540
- group_ids=req.group_ids,
541
- config=config,
542
- )
543
- edges = search_result.edges
544
- nodes = search_result.nodes
545
- else:
546
- edges = await graphiti.search(
547
- query=_sanitize_query(req.query),
548
- group_ids=req.group_ids,
549
- num_results=req.num_results,
550
- )
551
- nodes = []
560
+ async with _driver_lock:
561
+ _ensure_driver_graph(sanitized)
562
+ if req.mode == "slow":
563
+ # Cross-encoder + BFS: higher quality, also returns entity node summaries.
564
+ # deepcopy required — COMBINED_HYBRID_SEARCH_CROSS_ENCODER is a module-level
565
+ # constant; mutating .limit directly would corrupt it across requests.
566
+ config = deepcopy(COMBINED_HYBRID_SEARCH_CROSS_ENCODER)
567
+ config.limit = req.num_results
568
+ search_result = await graphiti.search_(
569
+ query=_sanitize_query(req.query),
570
+ group_ids=sanitized,
571
+ config=config,
572
+ )
573
+ edges = search_result.edges
574
+ nodes = search_result.nodes
575
+ else:
576
+ edges = await graphiti.search(
577
+ query=_sanitize_query(req.query),
578
+ group_ids=sanitized,
579
+ num_results=req.num_results,
580
+ )
581
+ nodes = []
552
582
  except Exception as e:
553
583
  duration_ms = (time.monotonic() - t0) * 1000
554
584
  logger.error("[gralkor] search failed — mode:%s %.0fms: %s", req.mode, duration_ms, e)
@@ -571,8 +601,10 @@ async def build_indices():
571
601
 
572
602
  @app.post("/build-communities")
573
603
  async def build_communities(req: GroupIdRequest):
574
- _ensure_driver_graph([req.group_id])
575
- communities, edges = await graphiti.build_communities(
576
- group_ids=[req.group_id],
577
- )
604
+ gid = _sanitize_group_id(req.group_id)
605
+ async with _driver_lock:
606
+ _ensure_driver_graph([gid])
607
+ communities, edges = await graphiti.build_communities(
608
+ group_ids=[gid],
609
+ )
578
610
  return {"communities": len(communities), "edges": len(edges)}