openfox 1.6.13 → 1.6.15

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 (41) hide show
  1. package/dist/{ask-JQQNGB5K.js → ask-3RK5YJZE.js} +2 -2
  2. package/dist/{auto-compaction-QPFQEWJG.js → auto-compaction-JZIM73ZY.js} +6 -6
  3. package/dist/{chat-handler-FDHHTHS3.js → chat-handler-F2A2IMQB.js} +27 -57
  4. package/dist/{chunk-5LDTVERY.js → chunk-22CTURMH.js} +1 -3
  5. package/dist/{chunk-WQ4W5H6A.js → chunk-2KP34IDL.js} +163 -205
  6. package/dist/{chunk-POJO7A5H.js → chunk-3WHZ47PY.js} +511 -793
  7. package/dist/{chunk-XFXOSPYH.js → chunk-55N6FAAZ.js} +1 -1
  8. package/dist/{chunk-ZRDRYL6W.js → chunk-6L3X7T4K.js} +82 -160
  9. package/dist/{chunk-QDEKU5RL.js → chunk-F54ZJN4X.js} +38 -2
  10. package/dist/{chunk-7T2CA2C6.js → chunk-G4E72ST3.js} +117 -242
  11. package/dist/{chunk-AKFLBPPY.js → chunk-IN5EP4ZB.js} +2 -2
  12. package/dist/{chunk-HCZT5BDI.js → chunk-JFKYCGZ5.js} +6 -6
  13. package/dist/{chunk-ZHGP4PBJ.js → chunk-KOUMYBYM.js} +53 -112
  14. package/dist/{chunk-E6FCNB3B.js → chunk-OVLFEBRR.js} +76 -94
  15. package/dist/chunk-SN7OBEVL.js +44 -0
  16. package/dist/{chunk-LMIBGLOB.js → chunk-YM6VHAPM.js} +4 -4
  17. package/dist/{chunk-TXQNRBMZ.js → chunk-ZDNXCVW4.js} +2 -2
  18. package/dist/cli/dev.js +1 -1
  19. package/dist/cli/index.js +1 -1
  20. package/dist/{config-TUA644W4.js → config-67AX6CNS.js} +5 -5
  21. package/dist/{events-EILPWKYE.js → events-2ETDOE5B.js} +3 -3
  22. package/dist/{folding-NZYOXNKK.js → folding-M7FMUBOL.js} +6 -4
  23. package/dist/{orchestrator-YKQJI3PH.js → orchestrator-SRSG2SIZ.js} +7 -7
  24. package/dist/package.json +14 -3
  25. package/dist/{processor-JU7MSV4F.js → processor-H5BQ5HQM.js} +24 -49
  26. package/dist/{provider-FNSGWDIW.js → provider-DKGBQHUS.js} +7 -7
  27. package/dist/{serve-O62TKFVA.js → serve-5AY7GMN7.js} +13 -13
  28. package/dist/server/index.d.ts +2 -0
  29. package/dist/server/index.js +11 -11
  30. package/dist/{tools-JWAF3MAR.js → tools-VOWNOP6V.js} +6 -6
  31. package/dist/{vision-fallback-BWCKA2FZ.js → vision-fallback-ADYRFFD4.js} +2 -2
  32. package/dist/web/assets/{index-MCWDS5UQ.css → index-CNeIjdxm.css} +1 -1
  33. package/dist/web/assets/index-mBLhctLW.js +150 -0
  34. package/dist/web/index.html +2 -2
  35. package/dist/web/sw.js +1 -1
  36. package/package.json +14 -3
  37. package/dist/web/assets/index-Cp8gfbgP.js +0 -150
  38. /package/dist/{command-defaults → server/commands/defaults}/commit-push.command.md +0 -0
  39. /package/dist/{command-defaults → server/commands/defaults}/init.command.md +0 -0
  40. /package/dist/{command-defaults → server/commands/defaults}/test-ui.command.md +0 -0
  41. /package/dist/{skill-defaults → server/skills/defaults}/browser.skill.md +0 -0
@@ -114,4 +114,4 @@ async function* streamWithSegments(client, request) {
114
114
  export {
115
115
  streamWithSegments
116
116
  };
117
- //# sourceMappingURL=chunk-XFXOSPYH.js.map
117
+ //# sourceMappingURL=chunk-55N6FAAZ.js.map
@@ -2,8 +2,10 @@ import {
2
2
  buildContextMessagesFromEventHistory,
3
3
  buildMessagesFromStoredEvents,
4
4
  foldContextState,
5
- foldSessionState
6
- } from "./chunk-WQ4W5H6A.js";
5
+ foldSessionState,
6
+ spreadOptionalMessageFields,
7
+ stripPromptContextMessages
8
+ } from "./chunk-2KP34IDL.js";
7
9
  import {
8
10
  getDatabase
9
11
  } from "./chunk-3EHGGBWE.js";
@@ -15,6 +17,61 @@ import {
15
17
  } from "./chunk-PNBH3RAX.js";
16
18
 
17
19
  // src/server/events/store.ts
20
+ function createEventIterator(state, subscriber) {
21
+ return {
22
+ [Symbol.asyncIterator]() {
23
+ return this;
24
+ },
25
+ async next() {
26
+ if (state.closed) {
27
+ return { value: void 0, done: true };
28
+ }
29
+ const queued = state.queue.shift();
30
+ if (queued) {
31
+ return { value: queued, done: false };
32
+ }
33
+ return new Promise((resolve) => {
34
+ state.resolveNext = resolve;
35
+ });
36
+ },
37
+ async return() {
38
+ state.closed = true;
39
+ subscriber.closed = true;
40
+ return { value: void 0, done: true };
41
+ }
42
+ };
43
+ }
44
+ function createIteratorState() {
45
+ const state = {
46
+ closed: false,
47
+ queue: [],
48
+ resolveNext: null,
49
+ closeIterator: () => {
50
+ state.closed = true;
51
+ if (state.resolveNext) {
52
+ state.resolveNext({ value: void 0, done: true });
53
+ state.resolveNext = null;
54
+ }
55
+ }
56
+ };
57
+ return state;
58
+ }
59
+ function createSubscriber(state, id) {
60
+ return {
61
+ ...id,
62
+ callback: (event) => {
63
+ if (state.closed) return;
64
+ if (state.resolveNext) {
65
+ state.resolveNext({ value: event, done: false });
66
+ state.resolveNext = null;
67
+ } else {
68
+ state.queue.push(event);
69
+ }
70
+ },
71
+ close: state.closeIterator,
72
+ closed: false
73
+ };
74
+ }
18
75
  var EventStore = class {
19
76
  db;
20
77
  subscribers = /* @__PURE__ */ new Map();
@@ -176,30 +233,8 @@ var EventStore = class {
176
233
  * Returns an async iterator that yields events and an unsubscribe function
177
234
  */
178
235
  subscribe(sessionId, fromSeq) {
179
- const queue = [];
180
- let resolveNext = null;
181
- let closed = false;
182
- const closeIterator = () => {
183
- closed = true;
184
- if (resolveNext) {
185
- resolveNext({ value: void 0, done: true });
186
- resolveNext = null;
187
- }
188
- };
189
- const subscriber = {
190
- sessionId,
191
- callback: (event) => {
192
- if (closed) return;
193
- if (resolveNext) {
194
- resolveNext({ value: event, done: false });
195
- resolveNext = null;
196
- } else {
197
- queue.push(event);
198
- }
199
- },
200
- close: closeIterator,
201
- closed: false
202
- };
236
+ const state = createIteratorState();
237
+ const subscriber = createSubscriber(state, { sessionId });
203
238
  let sessionSubs = this.subscribers.get(sessionId);
204
239
  if (!sessionSubs) {
205
240
  sessionSubs = /* @__PURE__ */ new Set();
@@ -208,36 +243,14 @@ var EventStore = class {
208
243
  sessionSubs.add(subscriber);
209
244
  if (fromSeq !== void 0) {
210
245
  const replayEvents = this.getEvents(sessionId, fromSeq);
211
- queue.push(...replayEvents);
246
+ state.queue.push(...replayEvents);
212
247
  }
213
- const iterator = {
214
- [Symbol.asyncIterator]() {
215
- return this;
216
- },
217
- async next() {
218
- if (closed) {
219
- return { value: void 0, done: true };
220
- }
221
- const queued = queue.shift();
222
- if (queued) {
223
- return { value: queued, done: false };
224
- }
225
- return new Promise((resolve) => {
226
- resolveNext = resolve;
227
- });
228
- },
229
- async return() {
230
- closed = true;
231
- subscriber.closed = true;
232
- return { value: void 0, done: true };
233
- }
234
- };
235
248
  const unsubscribe = () => {
236
249
  subscriber.closed = true;
237
- closeIterator();
250
+ state.closeIterator();
238
251
  sessionSubs?.delete(subscriber);
239
252
  };
240
- return { iterator, unsubscribe };
253
+ return { iterator: createEventIterator(state, subscriber), unsubscribe };
241
254
  }
242
255
  notifySubscribers(sessionId, event) {
243
256
  const sessionSubs = this.subscribers.get(sessionId);
@@ -262,60 +275,16 @@ var EventStore = class {
262
275
  * Returns an async iterator that yields events and an unsubscribe function
263
276
  */
264
277
  subscribeAll() {
265
- const queue = [];
266
- let resolveNext = null;
267
- let closed = false;
268
- const closeIterator = () => {
269
- closed = true;
270
- if (resolveNext) {
271
- resolveNext({ value: void 0, done: true });
272
- resolveNext = null;
273
- }
274
- };
278
+ const state = createIteratorState();
275
279
  const wsId = ++this.globalSubscriberIdCounter;
276
- const subscriber = {
277
- wsId,
278
- callback: (event) => {
279
- if (closed) return;
280
- if (resolveNext) {
281
- resolveNext({ value: event, done: false });
282
- resolveNext = null;
283
- } else {
284
- queue.push(event);
285
- }
286
- },
287
- close: closeIterator,
288
- closed: false
289
- };
280
+ const subscriber = createSubscriber(state, { wsId });
290
281
  this.globalSubscribers.set(wsId, subscriber);
291
- const iterator = {
292
- [Symbol.asyncIterator]() {
293
- return this;
294
- },
295
- async next() {
296
- if (closed) {
297
- return { value: void 0, done: true };
298
- }
299
- const queued = queue.shift();
300
- if (queued) {
301
- return { value: queued, done: false };
302
- }
303
- return new Promise((resolve) => {
304
- resolveNext = resolve;
305
- });
306
- },
307
- async return() {
308
- closed = true;
309
- subscriber.closed = true;
310
- return { value: void 0, done: true };
311
- }
312
- };
313
282
  const unsubscribe = () => {
314
283
  subscriber.closed = true;
315
- closeIterator();
284
+ state.closeIterator();
316
285
  this.globalSubscribers.delete(wsId);
317
286
  };
318
- return { iterator, unsubscribe };
287
+ return { iterator: createEventIterator(state, subscriber), unsubscribe };
319
288
  }
320
289
  // --------------------------------------------------------------------------
321
290
  // Cleanup
@@ -417,25 +386,7 @@ var EventStore = class {
417
386
  const data = JSON.parse(row.payload);
418
387
  const messages = data.messages;
419
388
  if (!messages) continue;
420
- let lastAssistantIdx = -1;
421
- for (let i = messages.length - 1; i >= 0; i--) {
422
- const msg = messages[i];
423
- if (!msg) continue;
424
- if (msg.role === "assistant" && msg.promptContext) {
425
- lastAssistantIdx = i;
426
- break;
427
- }
428
- }
429
- let changed = false;
430
- for (let i = 0; i < messages.length; i++) {
431
- const msg = messages[i];
432
- if (!msg) continue;
433
- const pc = msg.promptContext;
434
- if (pc?.messages && pc.messages.length > 0 && i !== lastAssistantIdx) {
435
- pc.messages = [];
436
- changed = true;
437
- }
438
- }
389
+ const changed = stripPromptContextMessages(messages);
439
390
  if (changed) {
440
391
  updateStmt.run(JSON.stringify(data), row.id);
441
392
  strippedSnapshots++;
@@ -646,24 +597,7 @@ function listSessions() {
646
597
  FROM sessions s
647
598
  ORDER BY s.updated_at DESC
648
599
  `).all();
649
- return rows.map((row) => ({
650
- id: row.id,
651
- projectId: row.project_id,
652
- ...row.title ? { title: row.title } : {},
653
- workdir: row.workdir,
654
- mode: row.mode ?? "planner",
655
- phase: row.workflow_phase ?? "plan",
656
- isRunning: Boolean(row.is_running),
657
- providerId: row.provider_id ?? null,
658
- providerModel: row.provider_model ?? null,
659
- createdAt: row.created_at,
660
- updatedAt: row.updated_at,
661
- criteriaCount: 0,
662
- // Derived from events
663
- criteriaCompleted: 0,
664
- // Derived from events
665
- messageCount: row.message_count
666
- }));
600
+ return rows.map(mapSessionSummaryRow);
667
601
  }
668
602
  function listSessionsByProject(projectId, limit = 20, offset = 0) {
669
603
  const db = getDatabase();
@@ -687,7 +621,15 @@ function listSessionsByProject(projectId, limit = 20, offset = 0) {
687
621
  LIMIT ? OFFSET ?
688
622
  `).all(projectId, limit + 1, offset);
689
623
  const hasMore = rows.length > limit;
690
- const sessions = rows.slice(0, limit).map((row) => ({
624
+ const sessions = rows.slice(0, limit).map(mapSessionSummaryRow);
625
+ return { sessions, hasMore };
626
+ }
627
+ function deleteSession(id) {
628
+ const db = getDatabase();
629
+ db.prepare("DELETE FROM sessions WHERE id = ?").run(id);
630
+ }
631
+ function mapSessionSummaryRow(row) {
632
+ return {
691
633
  id: row.id,
692
634
  projectId: row.project_id,
693
635
  ...row.title ? { title: row.title } : {},
@@ -702,12 +644,7 @@ function listSessionsByProject(projectId, limit = 20, offset = 0) {
702
644
  criteriaCount: 0,
703
645
  criteriaCompleted: 0,
704
646
  messageCount: row.message_count
705
- }));
706
- return { sessions, hasMore };
707
- }
708
- function deleteSession(id) {
709
- const db = getDatabase();
710
- db.prepare("DELETE FROM sessions WHERE id = ?").run(id);
647
+ };
711
648
  }
712
649
 
713
650
  // src/server/events/session.ts
@@ -717,22 +654,7 @@ function toSnapshotMessage(message) {
717
654
  role: message.role,
718
655
  content: message.content,
719
656
  timestamp: new Date(message.timestamp).getTime(),
720
- ...message.thinkingContent !== void 0 && { thinkingContent: message.thinkingContent },
721
- ...message.toolCalls !== void 0 && { toolCalls: message.toolCalls },
722
- ...message.segments !== void 0 && { segments: message.segments },
723
- ...message.stats !== void 0 && { stats: message.stats },
724
- ...message.tokenCount !== void 0 && { tokenCount: message.tokenCount },
725
- ...message.isStreaming !== void 0 && { isStreaming: message.isStreaming },
726
- ...message.partial !== void 0 && { partial: message.partial },
727
- ...message.subAgentId !== void 0 && { subAgentId: message.subAgentId },
728
- ...message.subAgentType !== void 0 && { subAgentType: message.subAgentType },
729
- ...message.isSystemGenerated !== void 0 && { isSystemGenerated: message.isSystemGenerated },
730
- ...message.messageKind !== void 0 && { messageKind: message.messageKind },
731
- ...message.contextWindowId !== void 0 && { contextWindowId: message.contextWindowId },
732
- ...message.isCompactionSummary !== void 0 && { isCompactionSummary: message.isCompactionSummary },
733
- ...message.promptContext !== void 0 && { promptContext: message.promptContext },
734
- ...message.attachments !== void 0 && { attachments: message.attachments },
735
- ...message.metadata !== void 0 && { metadata: message.metadata }
657
+ ...spreadOptionalMessageFields(message)
736
658
  };
737
659
  }
738
660
  function getSessionState(sessionId, maxTokens) {
@@ -1144,4 +1066,4 @@ export {
1144
1066
  compactContext,
1145
1067
  getRecentUserPromptsForSession
1146
1068
  };
1147
- //# sourceMappingURL=chunk-ZRDRYL6W.js.map
1069
+ //# sourceMappingURL=chunk-6L3X7T4K.js.map
@@ -1,3 +1,13 @@
1
+ import {
2
+ updateSessionMetadata
3
+ } from "./chunk-6L3X7T4K.js";
4
+ import {
5
+ buildMessagesFromStoredEvents,
6
+ foldPendingConfirmations
7
+ } from "./chunk-2KP34IDL.js";
8
+ import {
9
+ createSessionStateMessage
10
+ } from "./chunk-NJWPSSRW.js";
1
11
  import {
2
12
  logger
3
13
  } from "./chunk-PNBH3RAX.js";
@@ -67,9 +77,35 @@ function needsNameGeneration(sessionTitle, messageCount) {
67
77
  }
68
78
  return false;
69
79
  }
80
+ function needsNameGenerationCheck(sessionId, sessionTitle, messageCount) {
81
+ const needsGeneration = needsNameGeneration(sessionTitle, messageCount);
82
+ logger.debug("Session name generation check", {
83
+ sessionId,
84
+ title: sessionTitle,
85
+ messageCount,
86
+ needsGeneration
87
+ });
88
+ return needsGeneration;
89
+ }
90
+ function applyGeneratedSessionName(sessionId, name, deps) {
91
+ updateSessionMetadata(sessionId, { title: name });
92
+ deps.eventStore.append(sessionId, {
93
+ type: "session.name_generated",
94
+ data: { name }
95
+ });
96
+ const updatedSession = deps.sessionManager.getSession(sessionId);
97
+ if (updatedSession) {
98
+ const events = deps.eventStore.getEvents(sessionId);
99
+ const messages = buildMessagesFromStoredEvents(events);
100
+ const pendingConfirmations = foldPendingConfirmations(events);
101
+ deps.broadcastForSession(sessionId, createSessionStateMessage(updatedSession, messages, pendingConfirmations));
102
+ }
103
+ }
70
104
 
71
105
  export {
72
106
  generateSessionName,
73
- needsNameGeneration
107
+ needsNameGeneration,
108
+ needsNameGenerationCheck,
109
+ applyGeneratedSessionName
74
110
  };
75
- //# sourceMappingURL=chunk-QDEKU5RL.js.map
111
+ //# sourceMappingURL=chunk-F54ZJN4X.js.map