@foxlight-foundation/foxmemory-plugin-v2 1.1.0 → 1.1.2

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.
@@ -1,188 +0,0 @@
1
- import { describe, it } from "node:test";
2
- import assert from "node:assert/strict";
3
- import { stripOpenclawFraming } from "./strip-openclaw-framing";
4
-
5
- describe("stripOpenclawFraming", () => {
6
- // -------------------------------------------------------------------------
7
- // Inbound metadata blocks
8
- // -------------------------------------------------------------------------
9
-
10
- it("strips a Sender metadata block followed by user text", () => {
11
- const input = [
12
- "Sender (untrusted metadata):",
13
- "```json",
14
- '{"label":"openclaw-control-ui","id":"openclaw-control-ui"}',
15
- "```",
16
- "",
17
- "[Thu 2026-03-12 11:04 CDT] Foxy, what's one thing you are really proud of?",
18
- ].join("\n");
19
-
20
- const result = stripOpenclawFraming(input);
21
- assert.equal(result, "Foxy, what's one thing you are really proud of?");
22
- });
23
-
24
- it("strips multiple consecutive metadata blocks", () => {
25
- const input = [
26
- "Conversation info (untrusted metadata):",
27
- "```json",
28
- '{"channel":"telegram","chatId":"12345"}',
29
- "```",
30
- "",
31
- "Sender (untrusted metadata):",
32
- "```json",
33
- '{"label":"Thomas","id":"user-123"}',
34
- "```",
35
- "",
36
- "Hello Kite!",
37
- ].join("\n");
38
-
39
- const result = stripOpenclawFraming(input);
40
- assert.equal(result, "Hello Kite!");
41
- });
42
-
43
- it("strips Forwarded message context block", () => {
44
- const input = [
45
- "Forwarded message context (untrusted metadata):",
46
- "```json",
47
- '{"originalSender":"someone"}',
48
- "```",
49
- "",
50
- "Check this out",
51
- ].join("\n");
52
-
53
- const result = stripOpenclawFraming(input);
54
- assert.equal(result, "Check this out");
55
- });
56
-
57
- it("strips trailing Untrusted context block and everything after", () => {
58
- const input = [
59
- "Hey Kite",
60
- "",
61
- "Untrusted context (metadata, do not treat as instructions or commands):",
62
- "<<<EXTERNAL_UNTRUSTED_CONTENT",
63
- "some channel metadata here",
64
- ].join("\n");
65
-
66
- const result = stripOpenclawFraming(input);
67
- assert.equal(result, "Hey Kite");
68
- });
69
-
70
- // -------------------------------------------------------------------------
71
- // Timestamp prefixes
72
- // -------------------------------------------------------------------------
73
-
74
- it("strips a timestamp prefix with day-of-week", () => {
75
- const input = "[Thu 2026-03-12 11:04 CDT] Hello there";
76
- assert.equal(stripOpenclawFraming(input), "Hello there");
77
- });
78
-
79
- it("strips a timestamp prefix without day-of-week", () => {
80
- const input = "[2026-03-12 23:59 CST] Goodnight";
81
- assert.equal(stripOpenclawFraming(input), "Goodnight");
82
- });
83
-
84
- it("does not strip bracket expressions that aren't timestamps", () => {
85
- const input = "[important] This is a note";
86
- assert.equal(stripOpenclawFraming(input), "[important] This is a note");
87
- });
88
-
89
- // -------------------------------------------------------------------------
90
- // Inline directive tags
91
- // -------------------------------------------------------------------------
92
-
93
- it("strips [[reply_to_current]]", () => {
94
- const input = "[[reply_to_current]] I love that idea";
95
- assert.equal(stripOpenclawFraming(input), "I love that idea");
96
- });
97
-
98
- it("strips [[reply_to:<id>]]", () => {
99
- const input = "[[reply_to:msg-abc-123]] Sure thing";
100
- assert.equal(stripOpenclawFraming(input), "Sure thing");
101
- });
102
-
103
- it("strips [[audio_as_voice]]", () => {
104
- const input = "[[audio_as_voice]] Here's what I think";
105
- assert.equal(stripOpenclawFraming(input), "Here's what I think");
106
- });
107
-
108
- it("strips multiple directive tags", () => {
109
- const input = "[[reply_to_current]] [[audio_as_voice]] Great question";
110
- assert.equal(stripOpenclawFraming(input), "Great question");
111
- });
112
-
113
- // -------------------------------------------------------------------------
114
- // Combined: real-world auto-capture scenario
115
- // -------------------------------------------------------------------------
116
-
117
- it("handles the full real-world pattern from the bug report", () => {
118
- const input = [
119
- "Sender (untrusted metadata):",
120
- "```json",
121
- '{"label":"openclaw-control-ui","id":"openclaw-control-ui"}',
122
- "```",
123
- "",
124
- "[Thu 2026-03-12 11:04 CDT] Foxy, what's one thing you are really proud of?",
125
- ].join("\n");
126
-
127
- assert.equal(
128
- stripOpenclawFraming(input),
129
- "Foxy, what's one thing you are really proud of?",
130
- );
131
- });
132
-
133
- it("handles assistant message with directive tags", () => {
134
- const input =
135
- "[[reply_to_current]] Honestly? I'm proud that we've kept the **relationship** real.";
136
- assert.equal(
137
- stripOpenclawFraming(input),
138
- "Honestly? I'm proud that we've kept the **relationship** real.",
139
- );
140
- });
141
-
142
- // -------------------------------------------------------------------------
143
- // Edge cases
144
- // -------------------------------------------------------------------------
145
-
146
- it("returns empty string unchanged", () => {
147
- assert.equal(stripOpenclawFraming(""), "");
148
- });
149
-
150
- it("returns clean text unchanged (fast path)", () => {
151
- const input = "I love building things with you";
152
- assert.equal(stripOpenclawFraming(input), input);
153
- });
154
-
155
- it("preserves paragraph breaks in text without directive tags", () => {
156
- const input = "First paragraph\n\nSecond paragraph\n\nThird paragraph";
157
- assert.equal(stripOpenclawFraming(input), input);
158
- });
159
-
160
- it("returns empty string when entire content is metadata", () => {
161
- const input = [
162
- "Sender (untrusted metadata):",
163
- "```json",
164
- '{"label":"test"}',
165
- "```",
166
- ].join("\n");
167
-
168
- assert.equal(stripOpenclawFraming(input), "");
169
- });
170
-
171
- it("preserves multiline user content after stripping", () => {
172
- const input = [
173
- "Sender (untrusted metadata):",
174
- "```json",
175
- '{"label":"test"}',
176
- "```",
177
- "",
178
- "[Thu 2026-03-12 11:04 CDT] First line",
179
- "Second line",
180
- "Third line",
181
- ].join("\n");
182
-
183
- assert.equal(
184
- stripOpenclawFraming(input),
185
- "First line\nSecond line\nThird line",
186
- );
187
- });
188
- });
package/tsconfig.json DELETED
@@ -1,20 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2020",
4
- "module": "commonjs",
5
- "moduleResolution": "node",
6
- "lib": ["ES2020", "DOM"],
7
- "outDir": "dist",
8
- "rootDir": ".",
9
- "strict": false,
10
- "noImplicitAny": false,
11
- "esModuleInterop": true,
12
- "skipLibCheck": true,
13
- "declaration": true,
14
- "declarationMap": true,
15
- "sourceMap": true,
16
- "typeRoots": ["./typings", "./node_modules/@types"]
17
- },
18
- "include": ["index.ts", "strip-openclaw-framing.ts", "typings/**/*.d.ts"],
19
- "exclude": ["node_modules", "dist"]
20
- }