openfox 0.2.4 → 1.0.1

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 (65) hide show
  1. package/dist/agent-defaults/builder.agent.md +3 -7
  2. package/dist/agent-defaults/code-reviewer.agent.md +1 -2
  3. package/dist/agent-defaults/explorer.agent.md +22 -0
  4. package/dist/agent-defaults/planner.agent.md +2 -9
  5. package/dist/agent-defaults/verifier.agent.md +4 -5
  6. package/dist/ask-3RK5YJZE.js +19 -0
  7. package/dist/auto-compaction-WRS52ERL.js +23 -0
  8. package/dist/{branch.api-WDHKZJS6.js → branch.api-XADFZZAA.js} +2 -2
  9. package/dist/chat-handler-226J7XYE.js +201 -0
  10. package/dist/chunk-22CTURMH.js +128 -0
  11. package/dist/chunk-2KSCZSXQ.js +680 -0
  12. package/dist/{chunk-4Z2OZ6NX.js → chunk-3EHGGBWE.js} +29 -2
  13. package/dist/{chunk-GZ7ZVJIW.js → chunk-3UQACISJ.js} +159 -49
  14. package/dist/{chunk-AF7XS4OI.js → chunk-5YQAXUKO.js} +4 -1
  15. package/dist/{chunk-MTX5Y3V3.js → chunk-7IOZFJBW.js} +2 -2
  16. package/dist/{chunk-FUUYYDVG.js → chunk-ARKA56ZM.js} +2842 -4508
  17. package/dist/chunk-BU2ZYOEA.js +1067 -0
  18. package/dist/{chunk-O4W4555H.js → chunk-HGMG5F72.js} +1353 -1134
  19. package/dist/chunk-M2C5GEQR.js +137 -0
  20. package/dist/chunk-OWDPT3M6.js +314 -0
  21. package/dist/{chunk-U62ZECSQ.js → chunk-PNBH3RAX.js} +2 -2
  22. package/dist/chunk-QDEKU5RL.js +75 -0
  23. package/dist/chunk-QYP5HQV4.js +438 -0
  24. package/dist/chunk-S4QKTRGJ.js +343 -0
  25. package/dist/{chunk-ARFK3RZW.js → chunk-TPT6HP4H.js} +1 -1
  26. package/dist/chunk-TVQOONDR.js +75 -0
  27. package/dist/{chunk-5ZUU23XF.js → chunk-U6BUT37A.js} +286 -33
  28. package/dist/{chunk-S5NRIWEU.js → chunk-VUQPJFMQ.js} +12 -12
  29. package/dist/{chunk-26NRL3HX.js → chunk-XFXOSPYH.js} +3 -2
  30. package/dist/{chunk-N2XYX4ZA.js → chunk-XKFPU2FA.js} +13 -2
  31. package/dist/cli/dev.js +4 -3
  32. package/dist/cli/index.js +4 -3
  33. package/dist/{config-GIXXE4VK.js → config-GIFCEJDU.js} +11 -6
  34. package/dist/events-G6CKHDNZ.js +114 -0
  35. package/dist/folding-O52L65VN.js +37 -0
  36. package/dist/{init-2EJ5AC7Z.js → init-MKTUIGZU.js} +46 -13
  37. package/dist/orchestrator-4CBESUGB.js +39 -0
  38. package/dist/package.json +9 -2
  39. package/dist/{paths-4BPXWB2W.js → paths-MM76AWYB.js} +2 -2
  40. package/dist/processor-LAKHPIG3.js +236 -0
  41. package/dist/{project-creator-CWPKRIKI.js → project-creator-KAQXMZCT.js} +9 -8
  42. package/dist/projects-GSMMEVSO.js +19 -0
  43. package/dist/{protocol-BFFz3WM0.d.ts → protocol-BZ6OIASP.d.ts} +71 -50
  44. package/dist/protocol-WQENDK72.js +88 -0
  45. package/dist/{provider-QEVVNYOX.js → provider-4KTWU6IV.js} +41 -9
  46. package/dist/runtime-config-2XJJIMSC.js +9 -0
  47. package/dist/{serve-RYEBLJVN.js → serve-5NHW3X5B.js} +50 -18
  48. package/dist/server/index.d.ts +81 -27
  49. package/dist/server/index.js +19 -11
  50. package/dist/{settings-D5O3TMLD.js → settings-NCLN4JDZ.js} +4 -4
  51. package/dist/shared/index.d.ts +2 -2
  52. package/dist/shared/index.js +1 -1
  53. package/dist/tools-WOZVXNEQ.js +48 -0
  54. package/dist/vision-fallback-63VPBSEN.js +22 -0
  55. package/dist/web/assets/{index-DHmZmhnR.css → index-BsaaC0X0.css} +32 -1
  56. package/dist/web/assets/index-CvO7QkGh.js +141 -0
  57. package/dist/web/index.html +2 -2
  58. package/dist/web/sounds/typing.mp3 +0 -0
  59. package/dist/workflow-defaults/default.workflow.json +1 -1
  60. package/package.json +9 -2
  61. package/dist/agent-defaults/debugger.agent.md +0 -21
  62. package/dist/agent-defaults/test-generator.agent.md +0 -22
  63. package/dist/chunk-L4XDA3V7.js +0 -218
  64. package/dist/tools-QMIIDJTV.js +0 -48
  65. package/dist/web/assets/index-CAD7Iv_d.js +0 -122
@@ -0,0 +1,680 @@
1
+ // src/server/events/folding.ts
2
+ function cloneMessage(message) {
3
+ return {
4
+ ...message,
5
+ ...message.attachments ? { attachments: [...message.attachments] } : {},
6
+ ...message.toolCalls ? {
7
+ toolCalls: message.toolCalls.map((toolCall) => ({
8
+ ...toolCall,
9
+ ...toolCall.streamingOutput ? { streamingOutput: [...toolCall.streamingOutput] } : {},
10
+ ...toolCall.result ? { result: { ...toolCall.result } } : {}
11
+ }))
12
+ } : {},
13
+ ...message.segments ? { segments: [...message.segments] } : {},
14
+ ...message.preparingToolCalls ? { preparingToolCalls: [...message.preparingToolCalls] } : {}
15
+ };
16
+ }
17
+ function snapshotMessageToMessage(message) {
18
+ return cloneMessage({
19
+ id: message.id,
20
+ role: message.role,
21
+ content: message.content,
22
+ timestamp: new Date(message.timestamp).toISOString(),
23
+ ...message.tokenCount !== void 0 && { tokenCount: message.tokenCount },
24
+ ...message.isStreaming !== void 0 && { isStreaming: message.isStreaming },
25
+ ...message.contextWindowId !== void 0 && { contextWindowId: message.contextWindowId },
26
+ ...message.subAgentId !== void 0 && { subAgentId: message.subAgentId },
27
+ ...message.subAgentType !== void 0 && { subAgentType: message.subAgentType },
28
+ ...message.isSystemGenerated !== void 0 && { isSystemGenerated: message.isSystemGenerated },
29
+ ...message.messageKind !== void 0 && { messageKind: message.messageKind },
30
+ ...message.isCompactionSummary !== void 0 && { isCompactionSummary: message.isCompactionSummary },
31
+ ...message.attachments !== void 0 && { attachments: message.attachments },
32
+ ...message.thinkingContent !== void 0 && { thinkingContent: message.thinkingContent },
33
+ ...message.toolCalls !== void 0 && { toolCalls: message.toolCalls },
34
+ ...message.segments !== void 0 && { segments: message.segments },
35
+ ...message.stats !== void 0 && { stats: message.stats },
36
+ ...message.partial !== void 0 && { partial: message.partial },
37
+ ...message.promptContext !== void 0 && { promptContext: message.promptContext },
38
+ ...message.metadata !== void 0 && { metadata: message.metadata }
39
+ });
40
+ }
41
+ function shouldIncludeContextMessage(message, windowId, options) {
42
+ const includeVerifier = options?.includeVerifier ?? true;
43
+ return message.role !== "system" && (windowId === void 0 || message.contextWindowId === windowId) && (includeVerifier || message.subAgentType !== "verifier") && !message.subAgentId;
44
+ }
45
+ function appendSnapshotMessageContext(result, message) {
46
+ const contextMsg = {
47
+ role: message.role,
48
+ content: message.content
49
+ };
50
+ if (message.toolCalls && message.toolCalls.length > 0) {
51
+ contextMsg.toolCalls = message.toolCalls.map((toolCall) => ({
52
+ id: toolCall.id,
53
+ name: toolCall.name,
54
+ arguments: toolCall.arguments
55
+ }));
56
+ }
57
+ if (message.attachments !== void 0) {
58
+ contextMsg.attachments = message.attachments;
59
+ }
60
+ result.push(contextMsg);
61
+ if (!message.toolCalls) {
62
+ return;
63
+ }
64
+ for (const toolCall of message.toolCalls) {
65
+ if (!toolCall.result) {
66
+ continue;
67
+ }
68
+ result.push({
69
+ role: "tool",
70
+ content: toolCall.result.success ? toolCall.result.output ?? "Success" : toolCall.result.output ? `${toolCall.result.output}
71
+
72
+ Error: ${toolCall.result.error}` : `Error: ${toolCall.result.error}`,
73
+ toolCallId: toolCall.id
74
+ });
75
+ }
76
+ }
77
+ function applyStoredMessageEvents(initialMessages, events) {
78
+ const messages = new Map(initialMessages.map((message) => [message.id, cloneMessage(message)]));
79
+ for (const event of events) {
80
+ switch (event.type) {
81
+ case "message.start": {
82
+ const data = event.data;
83
+ const isUserOrSystem = data.role === "user" || data.role === "system";
84
+ messages.set(data.messageId, {
85
+ id: data.messageId,
86
+ role: data.role,
87
+ content: data.content ?? "",
88
+ timestamp: new Date(event.timestamp).toISOString(),
89
+ tokenCount: data.tokenCount ?? 0,
90
+ isStreaming: !isUserOrSystem,
91
+ ...data.contextWindowId !== void 0 && { contextWindowId: data.contextWindowId },
92
+ ...data.subAgentId !== void 0 && { subAgentId: data.subAgentId },
93
+ ...data.subAgentType !== void 0 && { subAgentType: data.subAgentType },
94
+ ...data.isSystemGenerated !== void 0 && { isSystemGenerated: data.isSystemGenerated },
95
+ ...data.messageKind !== void 0 && { messageKind: data.messageKind },
96
+ ...data.isCompactionSummary !== void 0 && { isCompactionSummary: data.isCompactionSummary },
97
+ ...data.attachments !== void 0 && { attachments: data.attachments },
98
+ ...data.metadata !== void 0 && { metadata: data.metadata }
99
+ });
100
+ break;
101
+ }
102
+ case "message.delta": {
103
+ const data = event.data;
104
+ const msg = messages.get(data.messageId);
105
+ if (msg) {
106
+ msg.content += data.content;
107
+ }
108
+ break;
109
+ }
110
+ case "message.thinking": {
111
+ const data = event.data;
112
+ const msg = messages.get(data.messageId);
113
+ if (msg) {
114
+ msg.thinkingContent = (msg.thinkingContent ?? "") + data.content;
115
+ }
116
+ break;
117
+ }
118
+ case "message.done": {
119
+ const data = event.data;
120
+ const msg = messages.get(data.messageId);
121
+ if (msg) {
122
+ msg.isStreaming = false;
123
+ if (data.stats) msg.stats = data.stats;
124
+ if (data.segments) msg.segments = data.segments;
125
+ if (data.partial) msg.partial = data.partial;
126
+ if (data.promptContext) msg.promptContext = data.promptContext;
127
+ if (data.tokenCount !== void 0) msg.tokenCount = data.tokenCount;
128
+ }
129
+ break;
130
+ }
131
+ case "tool.call": {
132
+ const data = event.data;
133
+ const msg = messages.get(data.messageId);
134
+ if (msg) {
135
+ const existingToolCalls = msg.toolCalls ?? [];
136
+ msg.toolCalls = [...existingToolCalls, data.toolCall];
137
+ }
138
+ break;
139
+ }
140
+ case "tool.result": {
141
+ const data = event.data;
142
+ const msg = messages.get(data.messageId);
143
+ if (msg?.toolCalls) {
144
+ const toolCall = msg.toolCalls.find((tc) => tc.id === data.toolCallId);
145
+ if (toolCall) {
146
+ toolCall.result = data.result;
147
+ }
148
+ }
149
+ break;
150
+ }
151
+ case "session.initialized":
152
+ case "turn.snapshot":
153
+ case "phase.changed":
154
+ case "mode.changed":
155
+ case "running.changed":
156
+ case "criteria.set":
157
+ case "criterion.updated":
158
+ case "context.state":
159
+ case "context.compacted":
160
+ case "file.read":
161
+ case "todo.updated":
162
+ case "chat.done":
163
+ case "chat.error":
164
+ case "format.retry":
165
+ case "tool.preparing":
166
+ case "tool.output":
167
+ break;
168
+ }
169
+ }
170
+ return Array.from(messages.values());
171
+ }
172
+ function cloneSnapshotMessage(message) {
173
+ return {
174
+ ...message,
175
+ ...message.attachments ? { attachments: [...message.attachments] } : {},
176
+ ...message.toolCalls ? {
177
+ toolCalls: message.toolCalls.map((toolCall) => ({
178
+ ...toolCall,
179
+ ...toolCall.streamingOutput ? { streamingOutput: [...toolCall.streamingOutput] } : {},
180
+ ...toolCall.result ? { result: { ...toolCall.result } } : {}
181
+ }))
182
+ } : {},
183
+ ...message.segments ? { segments: [...message.segments] } : {}
184
+ };
185
+ }
186
+ function applyTurnEventsToSnapshotMessages(initialMessages, events) {
187
+ const messages = new Map(initialMessages.map((message) => [message.id, cloneSnapshotMessage(message)]));
188
+ for (const event of events) {
189
+ switch (event.type) {
190
+ case "message.start": {
191
+ const data = event.data;
192
+ const msg = {
193
+ id: data.messageId,
194
+ role: data.role,
195
+ content: data.content ?? "",
196
+ timestamp: typeof event.timestamp === "number" ? event.timestamp : Date.now(),
197
+ isStreaming: true
198
+ };
199
+ if (data.tokenCount !== void 0) msg.tokenCount = data.tokenCount;
200
+ if (data.contextWindowId !== void 0) msg.contextWindowId = data.contextWindowId;
201
+ if (data.subAgentId !== void 0) msg.subAgentId = data.subAgentId;
202
+ if (data.subAgentType !== void 0) msg.subAgentType = data.subAgentType;
203
+ if (data.isSystemGenerated !== void 0) msg.isSystemGenerated = data.isSystemGenerated;
204
+ if (data.messageKind !== void 0) msg.messageKind = data.messageKind;
205
+ if (data.isCompactionSummary !== void 0) msg.isCompactionSummary = data.isCompactionSummary;
206
+ if (data.attachments !== void 0) msg.attachments = data.attachments;
207
+ if (data.metadata !== void 0) msg.metadata = data.metadata;
208
+ messages.set(data.messageId, msg);
209
+ break;
210
+ }
211
+ case "message.delta": {
212
+ const data = event.data;
213
+ const msg = messages.get(data.messageId);
214
+ if (msg) {
215
+ msg.content += data.content;
216
+ }
217
+ break;
218
+ }
219
+ case "message.thinking": {
220
+ const data = event.data;
221
+ const msg = messages.get(data.messageId);
222
+ if (msg) {
223
+ msg.thinkingContent = (msg.thinkingContent ?? "") + data.content;
224
+ }
225
+ break;
226
+ }
227
+ case "message.done": {
228
+ const data = event.data;
229
+ const msg = messages.get(data.messageId);
230
+ if (msg) {
231
+ msg.isStreaming = false;
232
+ if (data.stats) msg.stats = data.stats;
233
+ if (data.segments) msg.segments = data.segments;
234
+ if (data.partial) msg.partial = data.partial;
235
+ if (data.promptContext) msg.promptContext = data.promptContext;
236
+ if (data.tokenCount !== void 0) msg.tokenCount = data.tokenCount;
237
+ }
238
+ break;
239
+ }
240
+ case "tool.call": {
241
+ const data = event.data;
242
+ const msg = messages.get(data.messageId);
243
+ if (msg) {
244
+ const toolCalls = msg.toolCalls ?? [];
245
+ msg.toolCalls = [...toolCalls, data.toolCall];
246
+ }
247
+ break;
248
+ }
249
+ case "tool.result": {
250
+ const data = event.data;
251
+ const msg = messages.get(data.messageId);
252
+ if (msg?.toolCalls) {
253
+ const toolCall = msg.toolCalls.find((tc) => tc.id === data.toolCallId);
254
+ if (toolCall) {
255
+ toolCall.result = data.result;
256
+ }
257
+ }
258
+ break;
259
+ }
260
+ }
261
+ }
262
+ return Array.from(messages.values());
263
+ }
264
+ function buildMessagesFromStoredEvents(events) {
265
+ const snapshotEvent = [...events].reverse().find((event) => event.type === "turn.snapshot");
266
+ if (snapshotEvent) {
267
+ const snapshot = snapshotEvent.data;
268
+ const snapshotMessages = snapshot.messages.map(snapshotMessageToMessage);
269
+ const laterEvents = events.filter((event) => event.seq > snapshotEvent.seq);
270
+ return applyStoredMessageEvents(snapshotMessages, laterEvents);
271
+ }
272
+ return applyStoredMessageEvents([], events);
273
+ }
274
+ function buildContextMessagesFromStoredEvents(events, windowId, options) {
275
+ const includeVerifier = options?.includeVerifier ?? true;
276
+ const messages = [];
277
+ const messageMap = /* @__PURE__ */ new Map();
278
+ for (const event of events) {
279
+ switch (event.type) {
280
+ case "message.start": {
281
+ const data = event.data;
282
+ if (data.role !== "system" && (windowId === void 0 || data.contextWindowId === windowId) && (includeVerifier || data.subAgentType !== "verifier") && !data.subAgentId) {
283
+ const message = {
284
+ id: data.messageId,
285
+ role: data.role,
286
+ content: data.content ?? "",
287
+ ...data.attachments !== void 0 && { attachments: data.attachments }
288
+ };
289
+ messageMap.set(data.messageId, message);
290
+ messages.push(message);
291
+ }
292
+ break;
293
+ }
294
+ case "message.delta": {
295
+ const data = event.data;
296
+ const msg = messageMap.get(data.messageId);
297
+ if (msg) {
298
+ msg.content += data.content;
299
+ }
300
+ break;
301
+ }
302
+ case "tool.call": {
303
+ const data = event.data;
304
+ const msg = messageMap.get(data.messageId);
305
+ if (msg) {
306
+ if (!msg.toolCalls) msg.toolCalls = [];
307
+ msg.toolCalls.push(data.toolCall);
308
+ }
309
+ break;
310
+ }
311
+ case "tool.result": {
312
+ const data = event.data;
313
+ if (messageMap.has(data.messageId)) {
314
+ const imageMeta = data.result.metadata;
315
+ const msg = {
316
+ id: `tool-${data.toolCallId}`,
317
+ role: "tool",
318
+ content: data.result.success ? data.result.output ?? "Success" : data.result.output ? `${data.result.output}
319
+
320
+ Error: ${data.result.error}` : `Error: ${data.result.error}`,
321
+ toolCallId: data.toolCallId
322
+ };
323
+ if (imageMeta?.dataUrl && imageMeta?.mimeType?.startsWith("image/")) {
324
+ msg.attachments = [{
325
+ id: crypto.randomUUID(),
326
+ filename: imageMeta.path ?? "image",
327
+ mimeType: imageMeta.mimeType,
328
+ size: imageMeta.size ?? 0,
329
+ data: imageMeta.dataUrl
330
+ }];
331
+ }
332
+ messages.push(msg);
333
+ }
334
+ break;
335
+ }
336
+ }
337
+ }
338
+ return messages.map(({ id: _id, ...message }) => message);
339
+ }
340
+ function buildContextMessagesFromEventHistory(events, windowId, options) {
341
+ const snapshotEvent = [...events].reverse().find((event) => event.type === "turn.snapshot");
342
+ if (!snapshotEvent) {
343
+ return buildContextMessagesFromStoredEvents(events, windowId, options);
344
+ }
345
+ const snapshot = snapshotEvent.data;
346
+ const snapshotMessages = snapshot.messages.reduce((result, message) => {
347
+ if (!shouldIncludeContextMessage(message, windowId, options)) {
348
+ return result;
349
+ }
350
+ appendSnapshotMessageContext(result, message);
351
+ return result;
352
+ }, []);
353
+ const laterEvents = events.filter((event) => event.seq > snapshotEvent.seq);
354
+ return [
355
+ ...snapshotMessages,
356
+ ...buildContextMessagesFromStoredEvents(laterEvents, windowId, options)
357
+ ];
358
+ }
359
+ function foldTurnEventsToSnapshotMessages(events) {
360
+ return applyTurnEventsToSnapshotMessages([], events);
361
+ }
362
+ function foldCriteria(events) {
363
+ let criteria = [];
364
+ for (const event of events) {
365
+ switch (event.type) {
366
+ case "criteria.set": {
367
+ const data = event.data;
368
+ criteria = data.criteria;
369
+ break;
370
+ }
371
+ case "criterion.updated": {
372
+ const data = event.data;
373
+ criteria = criteria.map(
374
+ (c) => c.id === data.criterionId ? { ...c, status: data.status } : c
375
+ );
376
+ break;
377
+ }
378
+ }
379
+ }
380
+ return criteria;
381
+ }
382
+ function foldTodos(events) {
383
+ let todos = [];
384
+ for (const event of events) {
385
+ if (event.type === "todo.updated") {
386
+ const data = event.data;
387
+ todos = data.todos;
388
+ }
389
+ }
390
+ return todos;
391
+ }
392
+ function foldContextState(events, initialWindowId) {
393
+ let currentContextWindowId = initialWindowId;
394
+ let compactionCount = 0;
395
+ let latestContextState = null;
396
+ const readFilesMap = /* @__PURE__ */ new Map();
397
+ for (const event of events) {
398
+ switch (event.type) {
399
+ case "session.initialized": {
400
+ const data = event.data;
401
+ currentContextWindowId = data.contextWindowId;
402
+ break;
403
+ }
404
+ case "turn.snapshot": {
405
+ const data = event.data;
406
+ currentContextWindowId = data.currentContextWindowId;
407
+ compactionCount = data.contextState.compactionCount;
408
+ latestContextState = data.contextState;
409
+ readFilesMap.clear();
410
+ for (const entry of data.readFiles) {
411
+ readFilesMap.set(entry.path, { ...entry });
412
+ }
413
+ break;
414
+ }
415
+ case "context.state": {
416
+ const data = event.data;
417
+ latestContextState = data;
418
+ break;
419
+ }
420
+ case "context.compacted": {
421
+ const data = event.data;
422
+ currentContextWindowId = data.newWindowId;
423
+ compactionCount++;
424
+ readFilesMap.clear();
425
+ latestContextState = null;
426
+ break;
427
+ }
428
+ case "file.read": {
429
+ const data = event.data;
430
+ if (data.contextWindowId === currentContextWindowId) {
431
+ readFilesMap.set(data.path, {
432
+ path: data.path,
433
+ tokenCount: data.tokenCount
434
+ });
435
+ }
436
+ break;
437
+ }
438
+ }
439
+ }
440
+ return {
441
+ currentContextWindowId,
442
+ compactionCount,
443
+ readFiles: Array.from(readFilesMap.values()),
444
+ latestContextState
445
+ };
446
+ }
447
+ function foldMode(events) {
448
+ let mode = "planner";
449
+ for (const event of events) {
450
+ if (event.type === "mode.changed") {
451
+ const data = event.data;
452
+ mode = data.mode;
453
+ }
454
+ }
455
+ return mode;
456
+ }
457
+ function foldPhase(events) {
458
+ let phase = "plan";
459
+ for (const event of events) {
460
+ if (event.type === "phase.changed") {
461
+ const data = event.data;
462
+ phase = data.phase;
463
+ }
464
+ }
465
+ return phase;
466
+ }
467
+ function foldIsRunning(events) {
468
+ let isRunning = false;
469
+ for (const event of events) {
470
+ if (event.type === "running.changed") {
471
+ const data = event.data;
472
+ isRunning = data.isRunning;
473
+ }
474
+ }
475
+ return isRunning;
476
+ }
477
+ function foldPendingConfirmations(events) {
478
+ const pending = [];
479
+ const responded = /* @__PURE__ */ new Set();
480
+ for (const event of events) {
481
+ if (event.type === "path.confirmation_responded") {
482
+ const data = event.data;
483
+ responded.add(data.callId);
484
+ }
485
+ }
486
+ for (const event of events) {
487
+ if (event.type === "path.confirmation_pending") {
488
+ const data = event.data;
489
+ if (!responded.has(data.callId)) {
490
+ pending.push({
491
+ callId: data.callId,
492
+ tool: data.tool,
493
+ paths: data.paths,
494
+ workdir: data.workdir,
495
+ reason: data.reason
496
+ });
497
+ }
498
+ }
499
+ }
500
+ return pending;
501
+ }
502
+ function foldSessionState(events, initialWindowId, maxTokens) {
503
+ const mode = foldMode(events);
504
+ const phase = foldPhase(events);
505
+ const isRunning = foldIsRunning(events);
506
+ const messages = foldTurnEventsToSnapshotMessages(events);
507
+ const criteria = foldCriteria(events);
508
+ const todos = foldTodos(events);
509
+ const contextResult = foldContextState(events, initialWindowId);
510
+ const pendingConfirmations = foldPendingConfirmations(events);
511
+ const baseContextState = contextResult.latestContextState ?? {
512
+ currentTokens: 0,
513
+ maxTokens,
514
+ compactionCount: contextResult.compactionCount,
515
+ dangerZone: false,
516
+ canCompact: false
517
+ };
518
+ const contextState = baseContextState.compactionCount !== contextResult.compactionCount || baseContextState.maxTokens !== maxTokens ? { ...baseContextState, compactionCount: contextResult.compactionCount, maxTokens } : { ...baseContextState, maxTokens };
519
+ let lastModeWithReminder;
520
+ for (let i = events.length - 1; i >= 0; i--) {
521
+ const event = events[i];
522
+ if (event.type === "turn.snapshot") {
523
+ const snapshotData = event.data;
524
+ if (snapshotData.lastModeWithReminder) {
525
+ lastModeWithReminder = snapshotData.lastModeWithReminder;
526
+ break;
527
+ }
528
+ for (let j = snapshotData.messages.length - 1; j >= 0; j--) {
529
+ const msg = snapshotData.messages[j];
530
+ if (msg.role === "user" && msg.messageKind === "auto-prompt" && msg.content?.includes("<system-reminder>")) {
531
+ if (msg.content.includes("Plan Mode")) {
532
+ lastModeWithReminder = "planner";
533
+ } else if (msg.content.includes("Build Mode")) {
534
+ lastModeWithReminder = "builder";
535
+ }
536
+ break;
537
+ }
538
+ }
539
+ if (lastModeWithReminder) break;
540
+ }
541
+ }
542
+ if (lastModeWithReminder === void 0) {
543
+ for (let i = events.length - 1; i >= 0; i--) {
544
+ const event = events[i];
545
+ if (event.type === "message.start") {
546
+ const data = event.data;
547
+ if (data.role === "user" && data.messageKind === "auto-prompt" && data.content?.includes("<system-reminder>")) {
548
+ if (data.content.includes("Plan Mode")) {
549
+ lastModeWithReminder = "planner";
550
+ } else if (data.content.includes("Build Mode")) {
551
+ lastModeWithReminder = "builder";
552
+ }
553
+ break;
554
+ }
555
+ }
556
+ }
557
+ }
558
+ return {
559
+ mode,
560
+ phase,
561
+ isRunning,
562
+ messages,
563
+ criteria,
564
+ todos,
565
+ contextState,
566
+ currentContextWindowId: contextResult.currentContextWindowId,
567
+ readFiles: contextResult.readFiles,
568
+ ...lastModeWithReminder !== void 0 && { lastModeWithReminder },
569
+ pendingConfirmations
570
+ };
571
+ }
572
+ function buildSnapshot(foldedState, latestSeq, snapshotAt = Date.now()) {
573
+ return {
574
+ mode: foldedState.mode,
575
+ phase: foldedState.phase,
576
+ isRunning: foldedState.isRunning,
577
+ messages: foldedState.messages,
578
+ criteria: foldedState.criteria,
579
+ contextState: foldedState.contextState,
580
+ currentContextWindowId: foldedState.currentContextWindowId,
581
+ todos: foldedState.todos,
582
+ readFiles: foldedState.readFiles,
583
+ ...foldedState.lastModeWithReminder !== void 0 && { lastModeWithReminder: foldedState.lastModeWithReminder },
584
+ snapshotSeq: latestSeq,
585
+ snapshotAt
586
+ };
587
+ }
588
+ function stripPromptContextMessages(messages) {
589
+ let lastAssistantIdx = -1;
590
+ for (let i = messages.length - 1; i >= 0; i--) {
591
+ const msg = messages[i];
592
+ if (!msg) continue;
593
+ if (msg.role === "assistant" && msg.promptContext) {
594
+ lastAssistantIdx = i;
595
+ break;
596
+ }
597
+ }
598
+ for (let i = 0; i < messages.length; i++) {
599
+ const msg = messages[i];
600
+ if (!msg) continue;
601
+ const pc = msg.promptContext;
602
+ if (pc && i !== lastAssistantIdx) {
603
+ const { messages: _msgs, ...rest } = pc;
604
+ msg.promptContext = { ...rest, messages: [] };
605
+ }
606
+ }
607
+ }
608
+ function buildSnapshotFromSessionState(input) {
609
+ const { session, events, latestSeq, snapshotAt = Date.now(), maxTokens = 2e5 } = input;
610
+ let initialWindowId = "";
611
+ for (const event of events) {
612
+ if (event.type === "session.initialized") {
613
+ const data = event.data;
614
+ initialWindowId = data.contextWindowId;
615
+ break;
616
+ }
617
+ }
618
+ if (!initialWindowId) {
619
+ initialWindowId = "legacy-window-1";
620
+ }
621
+ const foldedState = foldSessionState(events, initialWindowId, maxTokens);
622
+ const latestSnapshotIndex = events.map((event) => event.type).lastIndexOf("turn.snapshot");
623
+ const latestSnapshotEvent = latestSnapshotIndex >= 0 ? events[latestSnapshotIndex] : void 0;
624
+ const messages = latestSnapshotEvent ? applyTurnEventsToSnapshotMessages(
625
+ latestSnapshotEvent.data.messages,
626
+ events.slice(latestSnapshotIndex + 1)
627
+ ) : foldedState.messages;
628
+ stripPromptContextMessages(messages);
629
+ return {
630
+ mode: session.mode,
631
+ phase: session.phase,
632
+ isRunning: session.isRunning,
633
+ messages,
634
+ criteria: session.criteria,
635
+ contextState: {
636
+ currentTokens: session.executionState?.currentTokenCount ?? foldedState.contextState.currentTokens,
637
+ maxTokens: foldedState.contextState.maxTokens,
638
+ compactionCount: session.executionState?.compactionCount ?? foldedState.contextState.compactionCount,
639
+ dangerZone: foldedState.contextState.dangerZone,
640
+ canCompact: foldedState.contextState.canCompact
641
+ },
642
+ currentContextWindowId: foldedState.currentContextWindowId,
643
+ todos: foldedState.todos,
644
+ readFiles: foldedState.readFiles,
645
+ snapshotSeq: latestSeq,
646
+ snapshotAt
647
+ };
648
+ }
649
+ function getMessagesForWindow(messages, windowId) {
650
+ return messages.filter((m) => m.contextWindowId === windowId);
651
+ }
652
+ function buildContextMessagesFromMessages(messages, windowId) {
653
+ return getMessagesForWindow(messages, windowId).reduce((result, message) => {
654
+ if (!shouldIncludeContextMessage(message, windowId)) {
655
+ return result;
656
+ }
657
+ appendSnapshotMessageContext(result, message);
658
+ return result;
659
+ }, []);
660
+ }
661
+
662
+ export {
663
+ buildMessagesFromStoredEvents,
664
+ buildContextMessagesFromStoredEvents,
665
+ buildContextMessagesFromEventHistory,
666
+ foldTurnEventsToSnapshotMessages,
667
+ foldCriteria,
668
+ foldTodos,
669
+ foldContextState,
670
+ foldMode,
671
+ foldPhase,
672
+ foldIsRunning,
673
+ foldPendingConfirmations,
674
+ foldSessionState,
675
+ buildSnapshot,
676
+ buildSnapshotFromSessionState,
677
+ getMessagesForWindow,
678
+ buildContextMessagesFromMessages
679
+ };
680
+ //# sourceMappingURL=chunk-2KSCZSXQ.js.map