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,370 @@
1
+ /**
2
+ * SDK transcript loading, segmentation, prior context extraction,
3
+ * and cycle matching.
4
+ */
5
+ import fs from "node:fs";
6
+ import path from "node:path";
7
+ import readline from "node:readline";
8
+ // ---------------------------------------------------------------------------
9
+ // Helpers
10
+ // ---------------------------------------------------------------------------
11
+ const BASE64_PLACEHOLDER = "<base64-image>";
12
+ function str(val) {
13
+ return typeof val === "string" ? val : "";
14
+ }
15
+ function extractTextFromContent(content) {
16
+ if (typeof content === "string")
17
+ return content;
18
+ if (Array.isArray(content)) {
19
+ const parts = [];
20
+ for (const block of content) {
21
+ if (block !== null &&
22
+ typeof block === "object" &&
23
+ block.type === "text") {
24
+ parts.push(str(block.text));
25
+ }
26
+ }
27
+ return parts.join("\n");
28
+ }
29
+ return "";
30
+ }
31
+ function redactBase64(content) {
32
+ if (!Array.isArray(content))
33
+ return content;
34
+ const out = [];
35
+ for (const block of content) {
36
+ if (block !== null && typeof block === "object") {
37
+ const b = block;
38
+ if (b.type === "image") {
39
+ const source = b.source;
40
+ if (source?.type === "base64") {
41
+ out.push({
42
+ type: "image",
43
+ source: {
44
+ type: "base64",
45
+ media_type: source.media_type ?? "image/png",
46
+ data: BASE64_PLACEHOLDER,
47
+ },
48
+ });
49
+ continue;
50
+ }
51
+ }
52
+ if (b.type === "tool_result") {
53
+ out.push({
54
+ ...b,
55
+ content: redactBase64(b.content),
56
+ });
57
+ continue;
58
+ }
59
+ }
60
+ out.push(block);
61
+ }
62
+ return out;
63
+ }
64
+ // ---------------------------------------------------------------------------
65
+ // Load SDK transcript
66
+ // ---------------------------------------------------------------------------
67
+ export async function loadSdkTranscript(transcriptDir) {
68
+ const messages = [];
69
+ // Discover session directories (general/, coding/, etc.)
70
+ const sessionDirs = [];
71
+ for (const name of fs.readdirSync(transcriptDir).sort()) {
72
+ const subdir = path.join(transcriptDir, name);
73
+ if (fs.statSync(subdir).isDirectory() &&
74
+ (fs.existsSync(path.join(subdir, "session.jsonl")) ||
75
+ fs.existsSync(path.join(subdir, "session.archive.jsonl")))) {
76
+ sessionDirs.push(subdir);
77
+ }
78
+ }
79
+ if (sessionDirs.length === 0) {
80
+ sessionDirs.push(transcriptDir);
81
+ }
82
+ for (const sdir of sessionDirs) {
83
+ const sessionName = path.basename(sdir);
84
+ const archive = path.join(sdir, "session.archive.jsonl");
85
+ const live = path.join(sdir, "session.jsonl");
86
+ let count = 0;
87
+ for (const filePath of [archive, live]) {
88
+ if (!fs.existsSync(filePath))
89
+ continue;
90
+ const rl = readline.createInterface({
91
+ input: fs.createReadStream(filePath, { encoding: "utf-8" }),
92
+ crlfDelay: Infinity,
93
+ });
94
+ for await (const raw of rl) {
95
+ const trimmed = raw.trim();
96
+ if (!trimmed)
97
+ continue;
98
+ try {
99
+ messages.push(JSON.parse(trimmed));
100
+ count++;
101
+ }
102
+ catch {
103
+ // Skip malformed lines
104
+ }
105
+ }
106
+ }
107
+ console.log(` SDK transcript [${sessionName}]: ${count} messages`);
108
+ }
109
+ messages.sort((a, b) => (a.timestamp ?? "").localeCompare(b.timestamp ?? ""));
110
+ console.log(` SDK transcript total: ${messages.length} messages`);
111
+ return messages;
112
+ }
113
+ // ---------------------------------------------------------------------------
114
+ // Segment SDK messages into wake cycles
115
+ // ---------------------------------------------------------------------------
116
+ export function segmentSdkWakeCycles(messages) {
117
+ // First pass: find all wake-event indices and compact_boundary indices
118
+ const wakeIndices = [];
119
+ const boundaryIndices = [];
120
+ for (let i = 0; i < messages.length; i++) {
121
+ const msg = messages[i];
122
+ if (msg.type === "system" && msg.subtype === "compact_boundary") {
123
+ boundaryIndices.push(i);
124
+ }
125
+ else if (msg.type === "user") {
126
+ const text = extractTextFromContent(msg.message?.content);
127
+ if (text.includes("[Wake Event]")) {
128
+ wakeIndices.push(i);
129
+ }
130
+ }
131
+ }
132
+ // Second pass: build cycles with prior context
133
+ const cycles = [];
134
+ for (let ci = 0; ci < wakeIndices.length; ci++) {
135
+ const wi = wakeIndices[ci];
136
+ const nextWi = ci + 1 < wakeIndices.length ? wakeIndices[ci + 1] : messages.length;
137
+ const cycleMessages = messages.slice(wi, nextWi);
138
+ // Prior context: from most recent compact_boundary to this wake event.
139
+ // For early cycles before any compaction, include all messages from start.
140
+ let prior = [];
141
+ const bp = bisectRight(boundaryIndices, wi);
142
+ if (bp > 0) {
143
+ const lastBoundary = boundaryIndices[bp - 1];
144
+ prior = messages.slice(lastBoundary, wi);
145
+ }
146
+ else if (wi > 0) {
147
+ prior = messages.slice(0, wi);
148
+ }
149
+ cycles.push({
150
+ wakeTimestamp: messages[wi].timestamp ?? "",
151
+ messages: cycleMessages,
152
+ priorContext: prior,
153
+ });
154
+ }
155
+ return cycles;
156
+ }
157
+ function bisectRight(arr, target) {
158
+ let lo = 0;
159
+ let hi = arr.length;
160
+ while (lo < hi) {
161
+ const mid = (lo + hi) >>> 1;
162
+ if (arr[mid] <= target)
163
+ lo = mid + 1;
164
+ else
165
+ hi = mid;
166
+ }
167
+ return lo;
168
+ }
169
+ // ---------------------------------------------------------------------------
170
+ // Build prior context
171
+ // ---------------------------------------------------------------------------
172
+ export function buildPriorContext(sdkCycle) {
173
+ if (sdkCycle.priorContext.length === 0)
174
+ return null;
175
+ const hasCompactBoundary = sdkCycle.priorContext.some((m) => m.type === "system" && m.subtype === "compact_boundary");
176
+ let compactionSummary = null;
177
+ const messagesToConvert = [];
178
+ for (const msg of sdkCycle.priorContext) {
179
+ if (msg.type === "system" && msg.subtype === "compact_boundary")
180
+ continue;
181
+ if (msg.type === "queue-operation" || msg.type === "progress")
182
+ continue;
183
+ if (msg.type === "user" &&
184
+ compactionSummary === null &&
185
+ messagesToConvert.length === 0) {
186
+ const text = extractTextFromContent(msg.message?.content);
187
+ if (text.includes("continued from a previous conversation")) {
188
+ compactionSummary = text;
189
+ continue;
190
+ }
191
+ }
192
+ messagesToConvert.push(msg);
193
+ }
194
+ const priorMessages = convertSdkMessages(messagesToConvert);
195
+ if (compactionSummary === null && priorMessages.length === 0) {
196
+ if (hasCompactBoundary) {
197
+ return {
198
+ compaction_summary: null,
199
+ compacted_fresh_start: true,
200
+ prior_messages_count: 0,
201
+ prior_messages: [],
202
+ };
203
+ }
204
+ return null;
205
+ }
206
+ return {
207
+ compaction_summary: compactionSummary,
208
+ prior_messages_count: priorMessages.length,
209
+ prior_messages: priorMessages,
210
+ };
211
+ }
212
+ // ---------------------------------------------------------------------------
213
+ // Convert raw SDK messages to clean trajectory entries
214
+ // ---------------------------------------------------------------------------
215
+ export function convertSdkMessages(messages) {
216
+ const entries = [];
217
+ for (const msg of messages) {
218
+ const mtype = msg.type ?? "";
219
+ const ts = msg.timestamp ?? "";
220
+ if (mtype === "user") {
221
+ const content = msg.message?.content;
222
+ if (typeof content === "string") {
223
+ if (content.includes("[Wake Event]")) {
224
+ entries.push({ role: "context", content, timestamp: ts });
225
+ }
226
+ else {
227
+ entries.push({ role: "user_message", content, timestamp: ts });
228
+ }
229
+ }
230
+ else if (Array.isArray(content)) {
231
+ const hasWake = content.some((block) => block !== null &&
232
+ typeof block === "object" &&
233
+ block.type === "text" &&
234
+ str(block.text).includes("[Wake Event]"));
235
+ if (hasWake) {
236
+ const redacted = redactBase64(content);
237
+ const textParts = redacted
238
+ .filter((b) => b.type === "text")
239
+ .map((b) => str(b.text));
240
+ const hasImage = content.some((b) => b !== null &&
241
+ typeof b === "object" &&
242
+ b.type === "image");
243
+ let ctxText = textParts.join("\n");
244
+ if (hasImage)
245
+ ctxText += " [+image:base64]";
246
+ entries.push({ role: "context", content: ctxText, timestamp: ts });
247
+ }
248
+ else {
249
+ for (const block of content) {
250
+ if (block !== null &&
251
+ typeof block === "object" &&
252
+ block.type === "tool_result") {
253
+ const b = block;
254
+ let resultContent = b.content;
255
+ if (Array.isArray(resultContent)) {
256
+ resultContent = redactBase64(resultContent);
257
+ }
258
+ const resultText = typeof resultContent === "string"
259
+ ? resultContent
260
+ : JSON.stringify(resultContent);
261
+ entries.push({
262
+ role: "tool_result",
263
+ content: resultText,
264
+ timestamp: ts,
265
+ metadata: {
266
+ tool_use_id: str(b.tool_use_id),
267
+ },
268
+ });
269
+ }
270
+ }
271
+ }
272
+ }
273
+ }
274
+ else if (mtype === "assistant") {
275
+ const contentBlocks = msg.message?.content;
276
+ if (!Array.isArray(contentBlocks))
277
+ continue;
278
+ for (const block of contentBlocks) {
279
+ if (block === null || typeof block !== "object")
280
+ continue;
281
+ const b = block;
282
+ const btype = b.type;
283
+ if (btype === "thinking") {
284
+ entries.push({
285
+ role: "thinking",
286
+ content: str(b.thinking),
287
+ timestamp: ts,
288
+ });
289
+ }
290
+ else if (btype === "text") {
291
+ entries.push({
292
+ role: "assistant",
293
+ content: str(b.text),
294
+ timestamp: ts,
295
+ });
296
+ }
297
+ else if (btype === "tool_use") {
298
+ entries.push({
299
+ role: "tool_call",
300
+ content: str(b.name),
301
+ timestamp: ts,
302
+ metadata: {
303
+ name: str(b.name),
304
+ input: b.input ?? {},
305
+ tool_use_id: str(b.id),
306
+ },
307
+ });
308
+ }
309
+ }
310
+ }
311
+ }
312
+ return entries;
313
+ }
314
+ export function buildSdkTrajectory(sdkCycle) {
315
+ return convertSdkMessages(sdkCycle.messages);
316
+ }
317
+ // ---------------------------------------------------------------------------
318
+ // Index and match SDK cycles to VisionClaw log cycles
319
+ // ---------------------------------------------------------------------------
320
+ export function buildSdkCycleIndex(sdkCycles) {
321
+ const index = new Map();
322
+ for (const sc of sdkCycles) {
323
+ index.set(sc.wakeTimestamp, sc);
324
+ }
325
+ return index;
326
+ }
327
+ function localToUtcApprox(localTs) {
328
+ try {
329
+ const dt = new Date(localTs);
330
+ if (isNaN(dt.getTime()))
331
+ return "";
332
+ const iso = dt.toISOString(); // Already UTC
333
+ // Format as YYYY-MM-DDTHH:MM:SS.mmmZ
334
+ return iso.replace(/(\.\d{3})\d*Z$/, "$1Z");
335
+ }
336
+ catch {
337
+ return "";
338
+ }
339
+ }
340
+ export function matchSdkCycle(cycle, sdkIndex, sdkCycles) {
341
+ const sendEntry = cycle.entries.find((e) => e.category === "send");
342
+ if (!sendEntry)
343
+ return undefined;
344
+ const localTs = sendEntry.timestamp;
345
+ const utcTs = localToUtcApprox(localTs);
346
+ if (!utcTs)
347
+ return undefined;
348
+ // Exact match
349
+ const exact = sdkIndex.get(utcTs);
350
+ if (exact)
351
+ return exact;
352
+ // Fuzzy match: find closest within 5 seconds
353
+ const targetMs = new Date(localTs).getTime();
354
+ if (isNaN(targetMs))
355
+ return undefined;
356
+ let best;
357
+ let bestDelta = 5000;
358
+ for (const sc of sdkCycles) {
359
+ const scMs = new Date(sc.wakeTimestamp.replace("Z", "+00:00")).getTime();
360
+ if (isNaN(scMs))
361
+ continue;
362
+ const delta = Math.abs(scMs - targetMs);
363
+ if (delta < bestDelta) {
364
+ bestDelta = delta;
365
+ best = sc;
366
+ }
367
+ }
368
+ return best;
369
+ }
370
+ //# sourceMappingURL=sdk-transcript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk-transcript.js","sourceRoot":"","sources":["../../src/data-processing/sdk-transcript.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Segment sorted log entries into wake cycles, then classify them
3
+ * as clean, interrupted, or incomplete.
4
+ */
5
+ import { WakeCycle, type LogEntry, type ClassifiedCycles } from "./types.js";
6
+ /**
7
+ * Walk sorted entries, group into wake->result cycles.
8
+ */
9
+ export declare function segmentWakeCycles(entries: LogEntry[]): WakeCycle[];
10
+ /**
11
+ * Split cycles into clean, interrupted, and incomplete buckets.
12
+ */
13
+ export declare function classifyCycles(cycles: WakeCycle[]): ClassifiedCycles;
14
+ //# sourceMappingURL=segmenter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segmenter.d.ts","sourceRoot":"","sources":["../../src/data-processing/segmenter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,QAAQ,EAAE,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE7E;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,SAAS,EAAE,CAqClE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,gBAAgB,CAgCpE"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Segment sorted log entries into wake cycles, then classify them
3
+ * as clean, interrupted, or incomplete.
4
+ */
5
+ import { WakeCycle } from "./types.js";
6
+ /**
7
+ * Walk sorted entries, group into wake->result cycles.
8
+ */
9
+ export function segmentWakeCycles(entries) {
10
+ const cycles = [];
11
+ let current;
12
+ for (const entry of entries) {
13
+ if (entry.category === "wake") {
14
+ if (current) {
15
+ cycles.push(current);
16
+ }
17
+ current = new WakeCycle();
18
+ current.entries.push(entry);
19
+ continue;
20
+ }
21
+ if (!current)
22
+ continue;
23
+ current.entries.push(entry);
24
+ if (entry.category === "incoming" &&
25
+ entry.message.includes("[interrupt]")) {
26
+ current.hasInterrupts = true;
27
+ }
28
+ if (entry.category === "result") {
29
+ current.hasResult = true;
30
+ cycles.push(current);
31
+ current = undefined;
32
+ }
33
+ }
34
+ if (current) {
35
+ cycles.push(current);
36
+ }
37
+ return cycles;
38
+ }
39
+ /**
40
+ * Split cycles into clean, interrupted, and incomplete buckets.
41
+ */
42
+ export function classifyCycles(cycles) {
43
+ const clean = [];
44
+ const interrupted = [];
45
+ const incomplete = [];
46
+ for (const c of cycles) {
47
+ if (!c.hasResult) {
48
+ incomplete.push(c);
49
+ }
50
+ else if (c.hasInterrupts) {
51
+ interrupted.push(c);
52
+ }
53
+ else {
54
+ // Hidden interrupt: incoming after model output started
55
+ let sawModel = false;
56
+ let hasHiddenInterrupt = false;
57
+ for (const e of c.entries) {
58
+ if (e.category === "assistant" || e.category === "tool_call") {
59
+ sawModel = true;
60
+ }
61
+ else if (e.category === "incoming" && sawModel) {
62
+ hasHiddenInterrupt = true;
63
+ break;
64
+ }
65
+ }
66
+ if (hasHiddenInterrupt) {
67
+ c.hasInterrupts = true;
68
+ interrupted.push(c);
69
+ }
70
+ else {
71
+ clean.push(c);
72
+ }
73
+ }
74
+ }
75
+ return { clean, interrupted, incomplete };
76
+ }
77
+ //# sourceMappingURL=segmenter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segmenter.js","sourceRoot":"","sources":["../../src/data-processing/segmenter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAwC,MAAM,YAAY,CAAC;AAE7E;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAmB;IACnD,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,IAAI,OAA8B,CAAC;IAEnC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;YAC9B,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;YACD,OAAO,GAAG,IAAI,SAAS,EAAE,CAAC;YAC1B,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5B,SAAS;QACX,CAAC;QAED,IAAI,CAAC,OAAO;YAAE,SAAS;QAEvB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE5B,IACE,KAAK,CAAC,QAAQ,KAAK,UAAU;YAC7B,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,EACrC,CAAC;YACD,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;QAC/B,CAAC;QAED,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrB,OAAO,GAAG,SAAS,CAAC;QACtB,CAAC;IACH,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAmB;IAChD,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,MAAM,WAAW,GAAgB,EAAE,CAAC;IACpC,MAAM,UAAU,GAAgB,EAAE,CAAC;IAEnC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;YACjB,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC;aAAM,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;YAC3B,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,wDAAwD;YACxD,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,IAAI,kBAAkB,GAAG,KAAK,CAAC;YAC/B,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC1B,IAAI,CAAC,CAAC,QAAQ,KAAK,WAAW,IAAI,CAAC,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;oBAC7D,QAAQ,GAAG,IAAI,CAAC;gBAClB,CAAC;qBAAM,IAAI,CAAC,CAAC,QAAQ,KAAK,UAAU,IAAI,QAAQ,EAAE,CAAC;oBACjD,kBAAkB,GAAG,IAAI,CAAC;oBAC1B,MAAM;gBACR,CAAC;YACH,CAAC;YACD,IAAI,kBAAkB,EAAE,CAAC;gBACvB,CAAC,CAAC,aAAa,GAAG,IAAI,CAAC;gBACvB,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Shared types for the VisionClaw data-processing pipeline.
3
+ */
4
+ export interface LogEntry {
5
+ timestamp: string;
6
+ level: string;
7
+ category: string;
8
+ message: string;
9
+ data: Record<string, unknown>;
10
+ sourceFile: string;
11
+ lineIndex: number;
12
+ }
13
+ export declare class WakeCycle {
14
+ entries: LogEntry[];
15
+ hasResult: boolean;
16
+ hasInterrupts: boolean;
17
+ get wakeEntry(): LogEntry | undefined;
18
+ get resultEntry(): LogEntry | undefined;
19
+ get trigger(): string;
20
+ get incomingMessages(): LogEntry[];
21
+ get originalIncoming(): LogEntry[];
22
+ get interruptIncoming(): LogEntry[];
23
+ get systemInitEntry(): LogEntry | undefined;
24
+ }
25
+ export interface SDKMessage {
26
+ type?: string;
27
+ subtype?: string;
28
+ timestamp?: string;
29
+ message?: {
30
+ role?: string;
31
+ content?: unknown;
32
+ id?: string;
33
+ model?: string;
34
+ stop_reason?: string;
35
+ [key: string]: unknown;
36
+ };
37
+ compactMetadata?: {
38
+ trigger?: string;
39
+ preTokens?: number;
40
+ };
41
+ [key: string]: unknown;
42
+ }
43
+ export interface SDKWakeCycle {
44
+ wakeTimestamp: string;
45
+ messages: SDKMessage[];
46
+ priorContext: SDKMessage[];
47
+ }
48
+ export type TrajectoryRole = "thinking" | "assistant" | "tool_call" | "tool_result" | "context" | "user_message";
49
+ export interface TrajectoryEntry {
50
+ role: TrajectoryRole;
51
+ content: string;
52
+ timestamp: string;
53
+ metadata?: Record<string, unknown>;
54
+ }
55
+ export interface PromptMeta {
56
+ channel: string;
57
+ sender: string;
58
+ message_id: string;
59
+ timestamp: string;
60
+ is_interrupt: boolean;
61
+ }
62
+ export interface InterruptMeta {
63
+ channel: string;
64
+ sender: string;
65
+ message_id: string;
66
+ timestamp: string;
67
+ text: string;
68
+ }
69
+ export interface UsageInfo {
70
+ turns: number | undefined;
71
+ input_tokens: number | undefined;
72
+ output_tokens: number | undefined;
73
+ cost: string | undefined;
74
+ }
75
+ export interface PriorContext {
76
+ compaction_summary: string | null;
77
+ compacted_fresh_start?: boolean;
78
+ prior_messages_count: number;
79
+ prior_messages: TrajectoryEntry[];
80
+ }
81
+ export type TrajectorySource = "sdk_transcript" | "visionclaw_logs";
82
+ export interface OutputRecord {
83
+ system_message: unknown;
84
+ prior_context: PriorContext | null;
85
+ prompt: string;
86
+ prompt_meta: PromptMeta;
87
+ interrupts: InterruptMeta[] | null;
88
+ trajectory: TrajectoryEntry[];
89
+ usage: UsageInfo | null;
90
+ complete: boolean;
91
+ has_interrupts: boolean;
92
+ trajectory_source: TrajectorySource;
93
+ }
94
+ export interface ClassifiedCycles {
95
+ clean: WakeCycle[];
96
+ interrupted: WakeCycle[];
97
+ incomplete: WakeCycle[];
98
+ }
99
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/data-processing/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Shared types for the VisionClaw data-processing pipeline.
3
+ */
4
+ // ---------------------------------------------------------------------------
5
+ // Wake cycle (segment of log entries between wake and result)
6
+ // ---------------------------------------------------------------------------
7
+ export class WakeCycle {
8
+ entries = [];
9
+ hasResult = false;
10
+ hasInterrupts = false;
11
+ get wakeEntry() {
12
+ return this.entries.find((e) => e.category === "wake");
13
+ }
14
+ get resultEntry() {
15
+ for (let i = this.entries.length - 1; i >= 0; i--) {
16
+ if (this.entries[i].category === "result")
17
+ return this.entries[i];
18
+ }
19
+ return undefined;
20
+ }
21
+ get trigger() {
22
+ const w = this.wakeEntry;
23
+ if (w?.data)
24
+ return w.data.trigger ?? "unknown";
25
+ return "unknown";
26
+ }
27
+ get incomingMessages() {
28
+ return this.entries.filter((e) => e.category === "incoming");
29
+ }
30
+ get originalIncoming() {
31
+ return this.entries.filter((e) => e.category === "incoming" && !e.message.includes("[interrupt]"));
32
+ }
33
+ get interruptIncoming() {
34
+ return this.entries.filter((e) => e.category === "incoming" && e.message.includes("[interrupt]"));
35
+ }
36
+ get systemInitEntry() {
37
+ return this.entries.find((e) => e.category === "system" && e.message.startsWith("System message: {"));
38
+ }
39
+ }
40
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/data-processing/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgBH,8EAA8E;AAC9E,8DAA8D;AAC9D,8EAA8E;AAE9E,MAAM,OAAO,SAAS;IACpB,OAAO,GAAe,EAAE,CAAC;IACzB,SAAS,GAAG,KAAK,CAAC;IAClB,aAAa,GAAG,KAAK,CAAC;IAEtB,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,WAAW;QACb,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAClD,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACpE,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,OAAO;QACT,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;QACzB,IAAI,CAAC,EAAE,IAAI;YAAE,OAAQ,CAAC,CAAC,IAAI,CAAC,OAA8B,IAAI,SAAS,CAAC;QACxE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,gBAAgB;QAClB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,gBAAgB;QAClB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CACxB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CACvE,CAAC;IACJ,CAAC;IAED,IAAI,iBAAiB;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CACxB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CACtE,CAAC;IACJ,CAAC;IAED,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CACtB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,mBAAmB,CAAC,CACvE,CAAC;IACJ,CAAC;CACF"}