visionclaw 0.1.129 → 0.1.130

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 (75) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/agent/client-factory.js +1 -1
  3. package/dist/agent/image-archive.d.ts +66 -0
  4. package/dist/agent/image-archive.d.ts.map +1 -0
  5. package/dist/agent/image-archive.js +278 -0
  6. package/dist/agent/image-archive.js.map +1 -0
  7. package/dist/agent/image-pruner.d.ts.map +1 -1
  8. package/dist/agent/image-pruner.js +30 -6
  9. package/dist/agent/image-pruner.js.map +1 -1
  10. package/dist/agent/openai-file-session.js +1 -1
  11. package/dist/agent/openai-session.js +1 -1
  12. package/dist/agent/openai-tools.js +1 -1
  13. package/dist/agent/providers/claude/session.d.ts.map +1 -1
  14. package/dist/agent/providers/claude/session.js.map +1 -1
  15. package/dist/agent/session.js +1 -1
  16. package/dist/channels/slack.js +1 -1
  17. package/dist/channels/sms.js +1 -1
  18. package/dist/channels/whatsapp.js +1 -1
  19. package/dist/config/types.d.ts +14 -0
  20. package/dist/config/types.d.ts.map +1 -1
  21. package/dist/config/types.js +13 -0
  22. package/dist/config/types.js.map +1 -1
  23. package/dist/data-processing/index.d.ts +6 -0
  24. package/dist/data-processing/index.d.ts.map +1 -0
  25. package/dist/data-processing/index.js +6 -0
  26. package/dist/data-processing/index.js.map +1 -0
  27. package/dist/data-processing/loader.d.ts +7 -0
  28. package/dist/data-processing/loader.d.ts.map +1 -0
  29. package/dist/data-processing/loader.js +55 -0
  30. package/dist/data-processing/loader.js.map +1 -0
  31. package/dist/data-processing/record-builder.d.ts +7 -0
  32. package/dist/data-processing/record-builder.d.ts.map +1 -0
  33. package/dist/data-processing/record-builder.js +176 -0
  34. package/dist/data-processing/record-builder.js.map +1 -0
  35. package/dist/data-processing/restructure.d.ts +11 -0
  36. package/dist/data-processing/restructure.d.ts.map +1 -0
  37. package/dist/data-processing/restructure.js +276 -0
  38. package/dist/data-processing/restructure.js.map +1 -0
  39. package/dist/data-processing/sanitize.d.ts +12 -0
  40. package/dist/data-processing/sanitize.d.ts.map +1 -0
  41. package/dist/data-processing/sanitize.js +229 -0
  42. package/dist/data-processing/sanitize.js.map +1 -0
  43. package/dist/data-processing/sdk-transcript.d.ts +13 -0
  44. package/dist/data-processing/sdk-transcript.d.ts.map +1 -0
  45. package/dist/data-processing/sdk-transcript.js +370 -0
  46. package/dist/data-processing/sdk-transcript.js.map +1 -0
  47. package/dist/data-processing/segmenter.d.ts +14 -0
  48. package/dist/data-processing/segmenter.d.ts.map +1 -0
  49. package/dist/data-processing/segmenter.js +77 -0
  50. package/dist/data-processing/segmenter.js.map +1 -0
  51. package/dist/data-processing/types.d.ts +99 -0
  52. package/dist/data-processing/types.d.ts.map +1 -0
  53. package/dist/data-processing/types.js +40 -0
  54. package/dist/data-processing/types.js.map +1 -0
  55. package/dist/files.js +1 -1
  56. package/dist/google/default-oauth-app.js +1 -1
  57. package/dist/index.js +11 -1
  58. package/dist/index.js.map +1 -1
  59. package/dist/memory/store.js +1 -1
  60. package/dist/onboarding/index.d.ts.map +1 -1
  61. package/dist/onboarding/index.js +28 -18
  62. package/dist/onboarding/index.js.map +1 -1
  63. package/dist/onboarding/provisioning-spec.d.ts +2 -0
  64. package/dist/onboarding/provisioning-spec.d.ts.map +1 -1
  65. package/dist/onboarding/provisioning-spec.js +3 -1
  66. package/dist/onboarding/provisioning-spec.js.map +1 -1
  67. package/dist/onboarding/setup-steps.d.ts.map +1 -1
  68. package/dist/onboarding/setup-steps.js +5 -3
  69. package/dist/onboarding/setup-steps.js.map +1 -1
  70. package/dist/tools/browser.js +1 -1
  71. package/dist/tools/sleep-interval.js +1 -1
  72. package/dist/tools/version-check.js +1 -1
  73. package/dist/utils/backup-paths.js +1 -1
  74. package/dist-agent/bundle.cjs +9337 -9413
  75. package/package.json +2 -1
@@ -0,0 +1,276 @@
1
+ /**
2
+ * Stage 2: Restructure VisionClaw logs into task-oriented records.
3
+ *
4
+ * Loads log entries, segments into wake cycles, optionally enriches with
5
+ * SDK transcripts, and writes three separate JSONL output files:
6
+ * - restructured-clean.jsonl
7
+ * - restructured-interrupted.jsonl
8
+ * - restructured-incomplete.jsonl
9
+ */
10
+ import fs from "node:fs";
11
+ import path from "node:path";
12
+ import { loadAllEntries } from "./loader.js";
13
+ import { segmentWakeCycles, classifyCycles } from "./segmenter.js";
14
+ import { loadSdkTranscript, segmentSdkWakeCycles, buildSdkCycleIndex, matchSdkCycle, } from "./sdk-transcript.js";
15
+ import { buildRecord } from "./record-builder.js";
16
+ function parseRestructureArgs(args) {
17
+ let logsDir = "";
18
+ let transcriptDir;
19
+ let outputDir = ".";
20
+ let samples = false;
21
+ for (let i = 0; i < args.length; i++) {
22
+ const arg = args[i];
23
+ if ((arg === "-t" || arg === "--transcript-dir") && i + 1 < args.length) {
24
+ transcriptDir = args[++i];
25
+ }
26
+ else if ((arg === "-o" || arg === "--output-dir") && i + 1 < args.length) {
27
+ outputDir = args[++i];
28
+ }
29
+ else if (arg === "--samples") {
30
+ samples = true;
31
+ }
32
+ else if (!arg.startsWith("-") && !logsDir) {
33
+ logsDir = arg;
34
+ }
35
+ }
36
+ if (!logsDir) {
37
+ console.error("Usage: visionclaw restructure-logs <logs-dir> [-t transcript-dir] [-o output-dir] [--samples]");
38
+ process.exit(1);
39
+ }
40
+ return { logsDir, transcriptDir, outputDir, samples };
41
+ }
42
+ // ---------------------------------------------------------------------------
43
+ // JSONL writer
44
+ // ---------------------------------------------------------------------------
45
+ function writeJsonl(filePath, records) {
46
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
47
+ const fd = fs.openSync(filePath, "w");
48
+ try {
49
+ for (const rec of records) {
50
+ const line = JSON.stringify(rec);
51
+ fs.writeSync(fd, line + "\n");
52
+ }
53
+ }
54
+ finally {
55
+ fs.closeSync(fd);
56
+ }
57
+ }
58
+ function writeSamples(filePath, records, maxSamples = 3) {
59
+ const samples = records.slice(0, maxSamples);
60
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
61
+ fs.writeFileSync(filePath, JSON.stringify(samples, null, 2));
62
+ }
63
+ // ---------------------------------------------------------------------------
64
+ // Compaction-only detection
65
+ // ---------------------------------------------------------------------------
66
+ function isCompactionOnly(record) {
67
+ return record.trajectory.some((t) => t.role === "user_message" &&
68
+ t.content.includes("<local-command-stdout>Compacted"));
69
+ }
70
+ // ---------------------------------------------------------------------------
71
+ // No meaningful work: trajectory has no non-finish tool calls
72
+ // ---------------------------------------------------------------------------
73
+ function lacksRealToolCall(record) {
74
+ return !record.trajectory.some((t) => t.role === "tool_call" &&
75
+ t.metadata?.name !== "mcp__visionclaw__finish");
76
+ }
77
+ // ---------------------------------------------------------------------------
78
+ // Process a list of cycles into records
79
+ // ---------------------------------------------------------------------------
80
+ function processCycles(cycles, sdkIndex, sdkCycles, hasTranscript) {
81
+ let matched = 0;
82
+ let unmatched = 0;
83
+ let compactionOnly = 0;
84
+ let noRealToolCall = 0;
85
+ const records = [];
86
+ for (const c of cycles) {
87
+ let sdkCycle;
88
+ if (hasTranscript) {
89
+ sdkCycle = matchSdkCycle(c, sdkIndex, sdkCycles);
90
+ if (sdkCycle)
91
+ matched++;
92
+ else
93
+ unmatched++;
94
+ }
95
+ const record = buildRecord(c, sdkCycle);
96
+ if (isCompactionOnly(record)) {
97
+ compactionOnly++;
98
+ continue;
99
+ }
100
+ if (lacksRealToolCall(record)) {
101
+ noRealToolCall++;
102
+ continue;
103
+ }
104
+ records.push(record);
105
+ }
106
+ return { records, matched, unmatched, compactionOnly, noRealToolCall };
107
+ }
108
+ // ---------------------------------------------------------------------------
109
+ // Print stats for a set of records
110
+ // ---------------------------------------------------------------------------
111
+ function printRecordStats(label, records, matched, unmatched, hasTranscript, compactionOnly, noRealToolCall) {
112
+ if (records.length === 0 && compactionOnly === 0 && noRealToolCall === 0)
113
+ return;
114
+ const totalTraj = records.reduce((sum, r) => sum + r.trajectory.length, 0);
115
+ const withPrompts = records.filter((r) => r.prompt !== "heartbeat").length;
116
+ const withInterrupts = records.filter((r) => r.has_interrupts).length;
117
+ console.log(`\n ${label}:`);
118
+ console.log(` Records: ${records.length}`);
119
+ if (compactionOnly > 0) {
120
+ console.log(` Compaction-only (filtered): ${compactionOnly}`);
121
+ }
122
+ if (noRealToolCall > 0) {
123
+ console.log(` No real tool call (filtered): ${noRealToolCall}`);
124
+ }
125
+ console.log(` With user prompt: ${withPrompts}`);
126
+ if (withInterrupts > 0) {
127
+ console.log(` With interrupts: ${withInterrupts}`);
128
+ }
129
+ console.log(` Total trajectory: ${totalTraj}`);
130
+ if (records.length > 0) {
131
+ console.log(` Avg trajectory len: ${(totalTraj / records.length).toFixed(1)}`);
132
+ }
133
+ if (hasTranscript) {
134
+ console.log(` SDK matched: ${matched}`);
135
+ console.log(` Log fallback: ${unmatched}`);
136
+ }
137
+ }
138
+ // ---------------------------------------------------------------------------
139
+ // Pick diverse samples
140
+ // ---------------------------------------------------------------------------
141
+ const MIN_MEANINGFUL_TRAJECTORY = 5;
142
+ function pickDiverseSamples(records, maxSamples = 3) {
143
+ const samples = [];
144
+ // 1. With compaction summary + user prompt
145
+ for (const r of records) {
146
+ if (r.prompt !== "heartbeat" &&
147
+ r.prior_context?.compaction_summary &&
148
+ r.trajectory.length >= MIN_MEANINGFUL_TRAJECTORY) {
149
+ samples.push(r);
150
+ break;
151
+ }
152
+ }
153
+ // 2. Interrupted cycle (if any)
154
+ for (const r of records) {
155
+ if (r.has_interrupts &&
156
+ r.interrupts &&
157
+ r.trajectory.length >= MIN_MEANINGFUL_TRAJECTORY) {
158
+ samples.push(r);
159
+ break;
160
+ }
161
+ }
162
+ // 3. Compacted fresh start with real work
163
+ for (const r of records) {
164
+ if (samples.includes(r))
165
+ continue;
166
+ if (r.prior_context?.compacted_fresh_start &&
167
+ r.trajectory.length >= MIN_MEANINGFUL_TRAJECTORY) {
168
+ samples.push(r);
169
+ break;
170
+ }
171
+ }
172
+ // Fill remaining — prefer records with meaningful trajectories
173
+ for (const r of records) {
174
+ if (samples.length >= maxSamples)
175
+ break;
176
+ if (!samples.includes(r) && r.trajectory.length >= MIN_MEANINGFUL_TRAJECTORY) {
177
+ samples.push(r);
178
+ }
179
+ }
180
+ // Last resort: fill from any records if not enough yet
181
+ for (const r of records) {
182
+ if (samples.length >= maxSamples)
183
+ break;
184
+ if (!samples.includes(r))
185
+ samples.push(r);
186
+ }
187
+ return samples.slice(0, maxSamples);
188
+ }
189
+ // ---------------------------------------------------------------------------
190
+ // Public entry point
191
+ // ---------------------------------------------------------------------------
192
+ export async function runRestructure(args) {
193
+ const opts = parseRestructureArgs(args);
194
+ // Load logs
195
+ const entries = await loadAllEntries(opts.logsDir);
196
+ // Segment and classify
197
+ const cycles = segmentWakeCycles(entries);
198
+ const { clean, interrupted, incomplete } = classifyCycles(cycles);
199
+ console.log(`\nWake cycles: ${cycles.length}`);
200
+ console.log(` Clean (no interrupts, complete): ${clean.length}`);
201
+ console.log(` Interrupted (has injections): ${interrupted.length}`);
202
+ console.log(` Incomplete (no result): ${incomplete.length}`);
203
+ const heartbeat = clean.filter((c) => c.trigger === "heartbeat").length;
204
+ const message = clean.filter((c) => c.trigger === "message").length;
205
+ console.log(`\nClean cycles breakdown:`);
206
+ console.log(` Heartbeat-triggered: ${heartbeat}`);
207
+ console.log(` Message-triggered: ${message}`);
208
+ // Load SDK transcript if provided
209
+ let sdkIndex = new Map();
210
+ let sdkCyclesList = [];
211
+ const hasTranscript = !!opts.transcriptDir;
212
+ if (opts.transcriptDir) {
213
+ console.log(`\nLoading SDK transcript...`);
214
+ const sdkMessages = await loadSdkTranscript(opts.transcriptDir);
215
+ sdkCyclesList = segmentSdkWakeCycles(sdkMessages);
216
+ sdkIndex = buildSdkCycleIndex(sdkCyclesList);
217
+ console.log(` SDK wake cycles: ${sdkCyclesList.length}`);
218
+ }
219
+ // Process each category
220
+ const cleanResult = processCycles(clean, sdkIndex, sdkCyclesList, hasTranscript);
221
+ const interruptedResult = processCycles(interrupted, sdkIndex, sdkCyclesList, hasTranscript);
222
+ const incompleteResult = processCycles(incomplete, sdkIndex, sdkCyclesList, hasTranscript);
223
+ // Print stats
224
+ const totalMatched = cleanResult.matched + interruptedResult.matched + incompleteResult.matched;
225
+ const totalUnmatched = cleanResult.unmatched +
226
+ interruptedResult.unmatched +
227
+ incompleteResult.unmatched;
228
+ if (hasTranscript) {
229
+ console.log(`\nSDK transcript matching:`);
230
+ console.log(` Matched: ${totalMatched}`);
231
+ console.log(` Unmatched: ${totalUnmatched} (using log-based trajectory)`);
232
+ }
233
+ printRecordStats("Clean", cleanResult.records, cleanResult.matched, cleanResult.unmatched, hasTranscript, cleanResult.compactionOnly, cleanResult.noRealToolCall);
234
+ printRecordStats("Interrupted", interruptedResult.records, interruptedResult.matched, interruptedResult.unmatched, hasTranscript, interruptedResult.compactionOnly, interruptedResult.noRealToolCall);
235
+ printRecordStats("Incomplete", incompleteResult.records, incompleteResult.matched, incompleteResult.unmatched, hasTranscript, incompleteResult.compactionOnly, incompleteResult.noRealToolCall);
236
+ // Write output files
237
+ const outDir = opts.outputDir;
238
+ const cleanPath = path.join(outDir, "restructured-clean.jsonl");
239
+ const interruptedPath = path.join(outDir, "restructured-interrupted.jsonl");
240
+ const incompletePath = path.join(outDir, "restructured-incomplete.jsonl");
241
+ writeJsonl(cleanPath, cleanResult.records);
242
+ writeJsonl(interruptedPath, interruptedResult.records);
243
+ writeJsonl(incompletePath, incompleteResult.records);
244
+ console.log(`\nWrote output files to ${outDir}:`);
245
+ console.log(` ${cleanPath} (${cleanResult.records.length} records)`);
246
+ console.log(` ${interruptedPath} (${interruptedResult.records.length} records)`);
247
+ console.log(` ${incompletePath} (${incompleteResult.records.length} records)`);
248
+ // Write samples if requested
249
+ if (opts.samples) {
250
+ const allRecords = [
251
+ ...cleanResult.records,
252
+ ...interruptedResult.records,
253
+ ...incompleteResult.records,
254
+ ];
255
+ if (cleanResult.records.length > 0) {
256
+ const samplesPath = path.join(outDir, "samples-clean.json");
257
+ writeSamples(samplesPath, pickDiverseSamples(cleanResult.records));
258
+ console.log(` ${samplesPath}`);
259
+ }
260
+ if (interruptedResult.records.length > 0) {
261
+ const samplesPath = path.join(outDir, "samples-interrupted.json");
262
+ writeSamples(samplesPath, pickDiverseSamples(interruptedResult.records));
263
+ console.log(` ${samplesPath}`);
264
+ }
265
+ if (incompleteResult.records.length > 0) {
266
+ const samplesPath = path.join(outDir, "samples-incomplete.json");
267
+ writeSamples(samplesPath, pickDiverseSamples(incompleteResult.records));
268
+ console.log(` ${samplesPath}`);
269
+ }
270
+ // Also write a combined samples file
271
+ const combinedPath = path.join(outDir, "samples-all.json");
272
+ writeSamples(combinedPath, pickDiverseSamples(allRecords));
273
+ console.log(` ${combinedPath}`);
274
+ }
275
+ }
276
+ //# sourceMappingURL=restructure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restructure.js","sourceRoot":"","sources":["../../src/data-processing/restructure.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAM7B,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,GACd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAalD,SAAS,oBAAoB,CAAC,IAAc;IAC1C,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,aAAiC,CAAC;IACtC,IAAI,SAAS,GAAG,GAAG,CAAC;IACpB,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACxE,aAAa,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,CAAC;aAAM,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC3E,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACxB,CAAC;aAAM,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YAC/B,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;aAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAC5C,OAAO,GAAG,GAAG,CAAC;QAChB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,+FAA+F,CAChG,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AACxD,CAAC;AAED,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,SAAS,UAAU,CAAC,QAAgB,EAAE,OAAuB;IAC3D,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACjC,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CACnB,QAAgB,EAChB,OAAuB,EACvB,UAAU,GAAG,CAAC;IAEd,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAC7C,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,8EAA8E;AAC9E,4BAA4B;AAC5B,8EAA8E;AAE9E,SAAS,gBAAgB,CAAC,MAAoB;IAC5C,OAAO,MAAM,CAAC,UAAU,CAAC,IAAI,CAC3B,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI,KAAK,cAAc;QACzB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,iCAAiC,CAAC,CACxD,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,8DAA8D;AAC9D,8EAA8E;AAE9E,SAAS,iBAAiB,CAAC,MAAoB;IAC7C,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAC5B,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI,KAAK,WAAW;QACtB,CAAC,CAAC,QAAQ,EAAE,IAAI,KAAK,yBAAyB,CACjD,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,wCAAwC;AACxC,8EAA8E;AAE9E,SAAS,aAAa,CACpB,MAAmB,EACnB,QAAmC,EACnC,SAAyB,EACzB,aAAsB;IAEtB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,MAAM,OAAO,GAAmB,EAAE,CAAC;IAEnC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,QAAkC,CAAC;QACvC,IAAI,aAAa,EAAE,CAAC;YAClB,QAAQ,GAAG,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YACjD,IAAI,QAAQ;gBAAE,OAAO,EAAE,CAAC;;gBACnB,SAAS,EAAE,CAAC;QACnB,CAAC;QACD,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QACxC,IAAI,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,cAAc,EAAE,CAAC;YACjB,SAAS;QACX,CAAC;QACD,IAAI,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,cAAc,EAAE,CAAC;YACjB,SAAS;QACX,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC;AACzE,CAAC;AAED,8EAA8E;AAC9E,mCAAmC;AACnC,8EAA8E;AAE9E,SAAS,gBAAgB,CACvB,KAAa,EACb,OAAuB,EACvB,OAAe,EACf,SAAiB,EACjB,aAAsB,EACtB,cAAsB,EACtB,cAAsB;IAEtB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,cAAc,KAAK,CAAC,IAAI,cAAc,KAAK,CAAC;QAAE,OAAO;IAEjF,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAC9B,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,UAAU,CAAC,MAAM,EACrC,CAAC,CACF,CAAC;IACF,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAChC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAChC,CAAC,MAAM,CAAC;IACT,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC;IAEtE,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,GAAG,CAAC,CAAC;IAC7B,OAAO,CAAC,GAAG,CAAC,6BAA6B,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3D,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,mCAAmC,cAAc,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,qCAAqC,cAAc,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,6BAA6B,WAAW,EAAE,CAAC,CAAC;IACxD,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,6BAA6B,cAAc,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,6BAA6B,SAAS,EAAE,CAAC,CAAC;IACtD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CACT,6BAA6B,CAAC,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CACvE,CAAC;IACJ,CAAC;IACD,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,6BAA6B,OAAO,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,6BAA6B,SAAS,EAAE,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E,MAAM,yBAAyB,GAAG,CAAC,CAAC;AAEpC,SAAS,kBAAkB,CACzB,OAAuB,EACvB,UAAU,GAAG,CAAC;IAEd,MAAM,OAAO,GAAmB,EAAE,CAAC;IAEnC,2CAA2C;IAC3C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IACE,CAAC,CAAC,MAAM,KAAK,WAAW;YACxB,CAAC,CAAC,aAAa,EAAE,kBAAkB;YACnC,CAAC,CAAC,UAAU,CAAC,MAAM,IAAI,yBAAyB,EAChD,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChB,MAAM;QACR,CAAC;IACH,CAAC;IAED,gCAAgC;IAChC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IACE,CAAC,CAAC,cAAc;YAChB,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,UAAU,CAAC,MAAM,IAAI,yBAAyB,EAChD,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChB,MAAM;QACR,CAAC;IACH,CAAC;IAED,0CAA0C;IAC1C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,SAAS;QAClC,IACE,CAAC,CAAC,aAAa,EAAE,qBAAqB;YACtC,CAAC,CAAC,UAAU,CAAC,MAAM,IAAI,yBAAyB,EAChD,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChB,MAAM;QACR,CAAC;IACH,CAAC;IAED,+DAA+D;IAC/D,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,OAAO,CAAC,MAAM,IAAI,UAAU;YAAE,MAAM;QACxC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,IAAI,yBAAyB,EAAE,CAAC;YAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,uDAAuD;IACvD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,OAAO,CAAC,MAAM,IAAI,UAAU;YAAE,MAAM;QACxC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;AACtC,CAAC;AAED,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAc;IACjD,MAAM,IAAI,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAExC,YAAY;IACZ,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEnD,uBAAuB;IACvB,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAElE,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,uCAAuC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,wCAAwC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,CAAC,wCAAwC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAEzE,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,WAAW,CAAC,CAAC,MAAM,CAAC;IACxE,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,2BAA2B,SAAS,EAAE,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,2BAA2B,OAAO,EAAE,CAAC,CAAC;IAElD,kCAAkC;IAClC,IAAI,QAAQ,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC/C,IAAI,aAAa,GAAmB,EAAE,CAAC;IACvC,MAAM,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC;IAE3C,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAChE,aAAa,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;QAClD,QAAQ,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,sBAAsB,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,wBAAwB;IACxB,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;IACjF,MAAM,iBAAiB,GAAG,aAAa,CACrC,WAAW,EACX,QAAQ,EACR,aAAa,EACb,aAAa,CACd,CAAC;IACF,MAAM,gBAAgB,GAAG,aAAa,CACpC,UAAU,EACV,QAAQ,EACR,aAAa,EACb,aAAa,CACd,CAAC;IAEF,cAAc;IACd,MAAM,YAAY,GAChB,WAAW,CAAC,OAAO,GAAG,iBAAiB,CAAC,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC;IAC7E,MAAM,cAAc,GAClB,WAAW,CAAC,SAAS;QACrB,iBAAiB,CAAC,SAAS;QAC3B,gBAAgB,CAAC,SAAS,CAAC;IAE7B,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,gBAAgB,YAAY,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,gBAAgB,cAAc,+BAA+B,CAAC,CAAC;IAC7E,CAAC;IAED,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC,OAAO,EAAE,WAAW,CAAC,OAAO,EAAE,WAAW,CAAC,SAAS,EAAE,aAAa,EAAE,WAAW,CAAC,cAAc,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC;IAClK,gBAAgB,CAAC,aAAa,EAAE,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,EAAE,aAAa,EAAE,iBAAiB,CAAC,cAAc,EAAE,iBAAiB,CAAC,cAAc,CAAC,CAAC;IACtM,gBAAgB,CAAC,YAAY,EAAE,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,CAAC,SAAS,EAAE,aAAa,EAAE,gBAAgB,CAAC,cAAc,EAAE,gBAAgB,CAAC,cAAc,CAAC,CAAC;IAEhM,qBAAqB;IACrB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;IAChE,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,gCAAgC,CAAC,CAAC;IAC5E,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,+BAA+B,CAAC,CAAC;IAE1E,UAAU,CAAC,SAAS,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC3C,UAAU,CAAC,eAAe,EAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACvD,UAAU,CAAC,cAAc,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAErD,OAAO,CAAC,GAAG,CAAC,2BAA2B,MAAM,GAAG,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,KAAK,WAAW,CAAC,OAAO,CAAC,MAAM,WAAW,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CACT,KAAK,eAAe,KAAK,iBAAiB,CAAC,OAAO,CAAC,MAAM,WAAW,CACrE,CAAC;IACF,OAAO,CAAC,GAAG,CACT,KAAK,cAAc,KAAK,gBAAgB,CAAC,OAAO,CAAC,MAAM,WAAW,CACnE,CAAC;IAEF,6BAA6B;IAC7B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,UAAU,GAAG;YACjB,GAAG,WAAW,CAAC,OAAO;YACtB,GAAG,iBAAiB,CAAC,OAAO;YAC5B,GAAG,gBAAgB,CAAC,OAAO;SAC5B,CAAC;QAEF,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;YAC5D,YAAY,CAAC,WAAW,EAAE,kBAAkB,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,KAAK,WAAW,EAAE,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,iBAAiB,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;YAClE,YAAY,CAAC,WAAW,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;YACzE,OAAO,CAAC,GAAG,CAAC,KAAK,WAAW,EAAE,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,gBAAgB,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;YACjE,YAAY,CACV,WAAW,EACX,kBAAkB,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAC7C,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,KAAK,WAAW,EAAE,CAAC,CAAC;QAClC,CAAC;QAED,qCAAqC;QACrC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;QAC3D,YAAY,CAAC,YAAY,EAAE,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,YAAY,EAAE,CAAC,CAAC;IACnC,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Stage 1: Sanitize VisionClaw JSONL logs in-place.
3
+ *
4
+ * Applies:
5
+ * 1. Remove lines containing noise substrings ([compact], [image-pruner])
6
+ * 2. Remove lines whose message starts with specific prefixes
7
+ * 3. Replace leaked API key strings
8
+ * 4. Redact obs domain URLs
9
+ * 5. Redact embedded base64 image payloads
10
+ */
11
+ export declare function runSanitize(args: string[]): void;
12
+ //# sourceMappingURL=sanitize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/data-processing/sanitize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAiMH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAkEhD"}
@@ -0,0 +1,229 @@
1
+ /**
2
+ * Stage 1: Sanitize VisionClaw JSONL logs in-place.
3
+ *
4
+ * Applies:
5
+ * 1. Remove lines containing noise substrings ([compact], [image-pruner])
6
+ * 2. Remove lines whose message starts with specific prefixes
7
+ * 3. Replace leaked API key strings
8
+ * 4. Redact obs domain URLs
9
+ * 5. Redact embedded base64 image payloads
10
+ */
11
+ import fs from "node:fs";
12
+ import path from "node:path";
13
+ // ---------------------------------------------------------------------------
14
+ // Constants
15
+ // ---------------------------------------------------------------------------
16
+ const APIKEY_OLD = "apiKey=58Io52IKCOO1cir4WKDHNu0Cq9CF4HzQ";
17
+ const APIKEY_NEW = "apiKey=58Io52IKCOO1xxxxxxxxxx";
18
+ const REMOVE_SUBSTRINGS = ["[compact]", "[image-pruner]"];
19
+ const DROP_MESSAGE_PREFIXES = ["Version check", "Image resized for vision"];
20
+ const REDACT_OBS_DOMAIN = "visionclawobs.com";
21
+ const REDACT_OBS_REPLACEMENT = "<obsurl>";
22
+ const REDACTED_IMAGE_DATA = "<base64-redacted>";
23
+ // ---------------------------------------------------------------------------
24
+ // Helpers
25
+ // ---------------------------------------------------------------------------
26
+ function parseMessageField(line) {
27
+ const trimmed = line.trim();
28
+ if (!trimmed)
29
+ return null;
30
+ try {
31
+ const obj = JSON.parse(trimmed);
32
+ const msg = obj.message;
33
+ return typeof msg === "string" ? msg : null;
34
+ }
35
+ catch {
36
+ return null;
37
+ }
38
+ }
39
+ function redactImageBase64InObj(obj) {
40
+ let redactions = 0;
41
+ if (Array.isArray(obj)) {
42
+ for (const item of obj) {
43
+ redactions += redactImageBase64InObj(item);
44
+ }
45
+ }
46
+ else if (obj !== null && typeof obj === "object") {
47
+ const record = obj;
48
+ if (record.type === "image") {
49
+ const src = record.source;
50
+ if (src !== null &&
51
+ typeof src === "object" &&
52
+ !Array.isArray(src)) {
53
+ const source = src;
54
+ if (typeof source.data === "string" && source.data) {
55
+ source.data = REDACTED_IMAGE_DATA;
56
+ redactions += 1;
57
+ }
58
+ }
59
+ }
60
+ for (const v of Object.values(record)) {
61
+ redactions += redactImageBase64InObj(v);
62
+ }
63
+ }
64
+ return redactions;
65
+ }
66
+ function redactImageBase64InEmbeddedJsonStrings(obj) {
67
+ let redactions = 0;
68
+ if (Array.isArray(obj)) {
69
+ for (const item of obj) {
70
+ redactions += redactImageBase64InEmbeddedJsonStrings(item);
71
+ }
72
+ }
73
+ else if (obj !== null && typeof obj === "object") {
74
+ const record = obj;
75
+ for (const [key, val] of Object.entries(record)) {
76
+ if (typeof val === "string") {
77
+ const s = val.trim();
78
+ if (s && (s.startsWith("{") || s.startsWith("["))) {
79
+ try {
80
+ const embedded = JSON.parse(s);
81
+ const r1 = redactImageBase64InObj(embedded);
82
+ const r2 = redactImageBase64InEmbeddedJsonStrings(embedded);
83
+ if (r1 || r2) {
84
+ redactions += r1 + r2;
85
+ record[key] = JSON.stringify(embedded);
86
+ continue;
87
+ }
88
+ }
89
+ catch {
90
+ // Not valid JSON — skip
91
+ }
92
+ }
93
+ }
94
+ redactions += redactImageBase64InEmbeddedJsonStrings(val);
95
+ }
96
+ }
97
+ return redactions;
98
+ }
99
+ function cleanLines(lines) {
100
+ const stats = {
101
+ removedSubstring: 0,
102
+ removedPrefix: 0,
103
+ replaced: 0,
104
+ redactedImageBase64: 0,
105
+ redactedObsDomain: 0,
106
+ };
107
+ // 1. Remove lines with noise substrings
108
+ let stage = lines.filter((line) => {
109
+ if (REMOVE_SUBSTRINGS.some((s) => line.includes(s))) {
110
+ stats.removedSubstring++;
111
+ return false;
112
+ }
113
+ return true;
114
+ });
115
+ // 2. Replace API key + obs domain
116
+ stage = stage.map((line) => {
117
+ if (line.includes(APIKEY_OLD)) {
118
+ stats.replaced += countOccurrences(line, APIKEY_OLD);
119
+ line = line.replaceAll(APIKEY_OLD, APIKEY_NEW);
120
+ }
121
+ if (line.includes(REDACT_OBS_DOMAIN)) {
122
+ stats.redactedObsDomain += countOccurrences(line, REDACT_OBS_DOMAIN);
123
+ line = line.replaceAll(REDACT_OBS_DOMAIN, REDACT_OBS_REPLACEMENT);
124
+ }
125
+ return line;
126
+ });
127
+ // 3. Drop lines by message prefix
128
+ stage = stage.filter((line) => {
129
+ const msg = parseMessageField(line);
130
+ if (msg !== null &&
131
+ DROP_MESSAGE_PREFIXES.some((p) => msg.startsWith(p))) {
132
+ stats.removedPrefix++;
133
+ return false;
134
+ }
135
+ return true;
136
+ });
137
+ // 4. Redact base64 image payloads
138
+ const final = stage.map((line) => {
139
+ const trimmed = line.trim();
140
+ if (!trimmed)
141
+ return line;
142
+ let obj;
143
+ try {
144
+ obj = JSON.parse(trimmed);
145
+ }
146
+ catch {
147
+ return line;
148
+ }
149
+ let redactions = redactImageBase64InObj(obj);
150
+ redactions += redactImageBase64InEmbeddedJsonStrings(obj);
151
+ if (redactions) {
152
+ stats.redactedImageBase64 += redactions;
153
+ return JSON.stringify(obj);
154
+ }
155
+ return line;
156
+ });
157
+ return { cleaned: final, stats };
158
+ }
159
+ function countOccurrences(str, sub) {
160
+ let count = 0;
161
+ let idx = str.indexOf(sub);
162
+ while (idx !== -1) {
163
+ count++;
164
+ idx = str.indexOf(sub, idx + sub.length);
165
+ }
166
+ return count;
167
+ }
168
+ // ---------------------------------------------------------------------------
169
+ // Public entry point
170
+ // ---------------------------------------------------------------------------
171
+ export function runSanitize(args) {
172
+ const logsDir = args[0];
173
+ if (!logsDir) {
174
+ console.error("Usage: visionclaw sanitize-logs <logs-dir>");
175
+ process.exit(1);
176
+ }
177
+ if (!fs.existsSync(logsDir) || !fs.statSync(logsDir).isDirectory()) {
178
+ console.error(`Not a directory: ${logsDir}`);
179
+ process.exit(1);
180
+ }
181
+ const files = fs
182
+ .readdirSync(logsDir)
183
+ .filter((f) => f.endsWith(".jsonl"))
184
+ .sort()
185
+ .map((f) => path.join(logsDir, f));
186
+ if (files.length === 0) {
187
+ console.error(`No .jsonl files found in ${logsDir}`);
188
+ process.exit(1);
189
+ }
190
+ const totals = {
191
+ filesChanged: 0,
192
+ removedSubstring: 0,
193
+ removedPrefix: 0,
194
+ replaced: 0,
195
+ redactedImageBase64: 0,
196
+ redactedObsDomain: 0,
197
+ linesBefore: 0,
198
+ linesAfter: 0,
199
+ };
200
+ for (const filePath of files) {
201
+ const originalText = fs.readFileSync(filePath, "utf-8");
202
+ const lines = originalText.split("\n");
203
+ const { cleaned, stats } = cleanLines(lines);
204
+ totals.linesBefore += lines.length;
205
+ totals.linesAfter += cleaned.length;
206
+ totals.removedSubstring += stats.removedSubstring;
207
+ totals.removedPrefix += stats.removedPrefix;
208
+ totals.replaced += stats.replaced;
209
+ totals.redactedImageBase64 += stats.redactedImageBase64;
210
+ totals.redactedObsDomain += stats.redactedObsDomain;
211
+ const newText = cleaned.join("\n");
212
+ if (newText !== originalText) {
213
+ fs.writeFileSync(filePath, newText, "utf-8");
214
+ totals.filesChanged++;
215
+ }
216
+ }
217
+ console.log("Sanitize complete:", {
218
+ files_processed: files.length,
219
+ files_changed: totals.filesChanged,
220
+ lines_before: totals.linesBefore,
221
+ lines_after: totals.linesAfter,
222
+ removed_substring: totals.removedSubstring,
223
+ removed_prefix: totals.removedPrefix,
224
+ replaced_apikey: totals.replaced,
225
+ redacted_image_base64: totals.redactedImageBase64,
226
+ redacted_obs_domain: totals.redactedObsDomain,
227
+ });
228
+ }
229
+ //# sourceMappingURL=sanitize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../../src/data-processing/sanitize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * SDK transcript loading, segmentation, prior context extraction,
3
+ * and cycle matching.
4
+ */
5
+ import type { SDKMessage, SDKWakeCycle, TrajectoryEntry, WakeCycle, PriorContext } from "./types.js";
6
+ export declare function loadSdkTranscript(transcriptDir: string): Promise<SDKMessage[]>;
7
+ export declare function segmentSdkWakeCycles(messages: SDKMessage[]): SDKWakeCycle[];
8
+ export declare function buildPriorContext(sdkCycle: SDKWakeCycle): PriorContext | null;
9
+ export declare function convertSdkMessages(messages: SDKMessage[]): TrajectoryEntry[];
10
+ export declare function buildSdkTrajectory(sdkCycle: SDKWakeCycle): TrajectoryEntry[];
11
+ export declare function buildSdkCycleIndex(sdkCycles: SDKWakeCycle[]): Map<string, SDKWakeCycle>;
12
+ export declare function matchSdkCycle(cycle: WakeCycle, sdkIndex: Map<string, SDKWakeCycle>, sdkCycles: SDKWakeCycle[]): SDKWakeCycle | undefined;
13
+ //# sourceMappingURL=sdk-transcript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk-transcript.d.ts","sourceRoot":"","sources":["../../src/data-processing/sdk-transcript.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EACZ,eAAe,EACf,SAAS,EACT,YAAY,EACb,MAAM,YAAY,CAAC;AAqEpB,wBAAsB,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAmDpF;AAMD,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,UAAU,EAAE,GACrB,YAAY,EAAE,CA6ChB;AAiBD,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,YAAY,GACrB,YAAY,GAAG,IAAI,CAgDrB;AAMD,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,UAAU,EAAE,GACrB,eAAe,EAAE,CAwGnB;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,YAAY,GAAG,eAAe,EAAE,CAE5E;AAMD,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,YAAY,EAAE,GACxB,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAM3B;AAcD,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EACnC,SAAS,EAAE,YAAY,EAAE,GACxB,YAAY,GAAG,SAAS,CAgC1B"}