openfox 2.0.106 → 2.0.108

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 (74) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/CHANGELOG.md +27 -0
  3. package/dist/{chat-handler-A22X22VZ.js → chat-handler-UZ2A75DG.js} +21 -21
  4. package/dist/{chunk-46KNPXY6.js → chunk-3GJFZQNV.js} +3 -3
  5. package/dist/{chunk-HU22EVEM.js → chunk-3MYD6Y4W.js} +6 -6
  6. package/dist/{chunk-SUTJJWUK.js → chunk-63ZAFYQ7.js} +8 -8
  7. package/dist/{chunk-AYUUGKZU.js → chunk-7FKSDR7H.js} +11 -11
  8. package/dist/{chunk-27SDWNKL.js → chunk-B5MH4HQ6.js} +12 -2
  9. package/dist/{chunk-QBKAW5H4.js → chunk-CF2HEP3M.js} +4 -4
  10. package/dist/{chunk-TB7TTPYQ.js → chunk-EYMGV4YA.js} +2 -2
  11. package/dist/{chunk-RRTKVJMF.js → chunk-FR5LUTLQ.js} +12 -2
  12. package/dist/{chunk-LOHVZGCM.js → chunk-GWMNR3LC.js} +3 -3
  13. package/dist/{chunk-6VNB4L4V.js → chunk-HGOEHSVC.js} +3 -3
  14. package/dist/{chunk-G2VLGZ3Y.js → chunk-I4M6SCMY.js} +97 -146
  15. package/dist/{chunk-UXQN7FGB.js → chunk-ID4N6PM6.js} +2 -2
  16. package/dist/{chunk-V6Y6OLB4.js → chunk-IRWZJPPA.js} +2 -2
  17. package/dist/{chunk-6M44ZHQA.js → chunk-JBZW5BZX.js} +40 -20
  18. package/dist/{chunk-3C73IUUL.js → chunk-JH6SOEQW.js} +32 -4
  19. package/dist/{chunk-5M45NHQ2.js → chunk-JR54MDZI.js} +2 -2
  20. package/dist/{chunk-26DEYDYV.js → chunk-KYY5PAGE.js} +4 -4
  21. package/dist/{chunk-WDJOSRIB.js → chunk-L737Y63F.js} +5 -2
  22. package/dist/{chunk-KIAKWUZ3.js → chunk-MPWLBKSK.js} +9 -1
  23. package/dist/{chunk-X3USQHHK.js → chunk-P7HT6IJW.js} +3 -3
  24. package/dist/{chunk-OEPRHAIO.js → chunk-P7WCFUPJ.js} +2 -2
  25. package/dist/{chunk-P4APMCTX.js → chunk-PSAWMCD6.js} +16 -52
  26. package/dist/{chunk-UCIZV76E.js → chunk-Q4P4CWWV.js} +3 -3
  27. package/dist/{chunk-GXW4CRR5.js → chunk-QDKLJZO4.js} +130 -57
  28. package/dist/{chunk-IA4Y3CKA.js → chunk-TMVXOLBS.js} +2 -2
  29. package/dist/chunk-UWF4L4CK.js +7 -0
  30. package/dist/{chunk-2GM6SUIQ.js → chunk-WFWFRUBU.js} +2 -2
  31. package/dist/{chunk-SGJ3LSVA.js → chunk-YBIJI53N.js} +2 -2
  32. package/dist/cli/dev.js +1 -1
  33. package/dist/cli/index.js +1 -1
  34. package/dist/{client-MP3FSNN7.js → client-R4TZCZTO.js} +5 -5
  35. package/dist/{client-pure-USVHN4WG.js → client-pure-VFZIIK4S.js} +2 -2
  36. package/dist/{compactor-KK2BVJK5.js → compactor-U3MAROGM.js} +11 -11
  37. package/dist/{dynamic-context-ZUXI5UTW.js → dynamic-context-H7AVSAXQ.js} +7 -7
  38. package/dist/{events-OJ2R6OEM.js → events-7WAOX35W.js} +6 -6
  39. package/dist/{folding-DUZSKCZF.js → folding-MJDFKOHT.js} +4 -4
  40. package/dist/{http-client-KJXFSK7A.js → http-client-NHVT6E5C.js} +3 -3
  41. package/dist/{manager-N27WNW5B.js → manager-ZVHBUECR.js} +4 -4
  42. package/dist/{model-overrides-36SQR3JR.js → model-overrides-47LYCLFO.js} +3 -3
  43. package/dist/{orchestrator-VZORJ7KF.js → orchestrator-X7H5JRM5.js} +20 -20
  44. package/dist/package.json +4 -2
  45. package/dist/{path-security-QCIA6YFV.js → path-security-26J53LD4.js} +8 -8
  46. package/dist/{platform-Q6T3AUHA.js → platform-JOAXLXYQ.js} +3 -3
  47. package/dist/{processor-QYVHKRIV.js → processor-33OESYXP.js} +20 -20
  48. package/dist/{protocol-YDNGGADL.js → protocol-SPIJPOEN.js} +2 -2
  49. package/dist/{protocol-zRSsysOe.d.ts → protocol-_Gphic7p.d.ts} +1 -1
  50. package/dist/provider/index.d.ts +4 -4
  51. package/dist/{provider-RQQ5JN34.js → provider-U4X7BDDL.js} +6 -6
  52. package/dist/{provider-manager-RUC5QQ75.js → provider-manager-ON3V54DS.js} +6 -6
  53. package/dist/{registry-BDSTPV65.js → registry-2PP4PUCL.js} +3 -3
  54. package/dist/{serve-2O7G2WZF.js → serve-LK3LQEWW.js} +28 -28
  55. package/dist/server/index.d.ts +3 -39
  56. package/dist/server/index.js +27 -27
  57. package/dist/server-7Q5RPZKY.js +47 -0
  58. package/dist/{session-overrides-SFWPS5CT.js → session-overrides-FVX6374M.js} +5 -5
  59. package/dist/{sessions-TZNUQJ2I.js → sessions-7XOOISCY.js} +4 -4
  60. package/dist/{settings-5LG7IB3K.js → settings-H2W3SNFE.js} +2 -2
  61. package/dist/shared/index.d.ts +3 -3
  62. package/dist/{tools-Y4F4HJPO.js → tools-5C2VIQ7B.js} +18 -18
  63. package/dist/{types-CTl70hba.d.ts → types-BMEOlLT0.d.ts} +1 -0
  64. package/dist/{types-_uF_PRaD.d.ts → types-D0TgGL3t.d.ts} +1 -1
  65. package/dist/{update-QEZIUJHR.js → update-5R3HZD6U.js} +2 -2
  66. package/dist/web/assets/index-C0OFVoFt.js +323 -0
  67. package/dist/web/assets/{index-B7wjVPjL.css → index-CyWbbpRP.css} +1 -1
  68. package/dist/web/index.html +2 -2
  69. package/dist/web/sw.js +1 -1
  70. package/dist/{workspace-2OG5VQG6.js → workspace-YDUQZ3HC.js} +4 -2
  71. package/package.json +4 -2
  72. package/dist/chunk-C5YV3EA4.js +0 -7
  73. package/dist/server-CYE6XY7J.js +0 -47
  74. package/dist/web/assets/index-BxI3Y9C7.js +0 -323
@@ -5,13 +5,13 @@ import {
5
5
  foldContextState,
6
6
  foldSessionState,
7
7
  spreadOptionalMessageFields
8
- } from "./chunk-3C73IUUL.js";
8
+ } from "./chunk-JH6SOEQW.js";
9
9
  import {
10
10
  updateSessionMessageCount
11
- } from "./chunk-IA4Y3CKA.js";
11
+ } from "./chunk-TMVXOLBS.js";
12
12
  import {
13
13
  getRuntimeConfig
14
- } from "./chunk-2GM6SUIQ.js";
14
+ } from "./chunk-WFWFRUBU.js";
15
15
  import {
16
16
  logger
17
17
  } from "./chunk-K44MW7JJ.js";
@@ -72,11 +72,31 @@ function createSubscriber(state, id) {
72
72
  closed: false
73
73
  };
74
74
  }
75
- var EventStore = class {
75
+ var EventStore = class _EventStore {
76
76
  db;
77
77
  subscribers = /* @__PURE__ */ new Map();
78
78
  globalSubscribers = /* @__PURE__ */ new Map();
79
79
  globalSubscriberIdCounter = 0;
80
+ // Parsed latest-snapshot cache per session. Snapshots can be tens of MB of
81
+ // JSON; re-parsing them on every session load (REST, WS, sidebar list) costs
82
+ // hundreds of ms. Invalidated on every write path (append, delete, cleanup).
83
+ // This is a pragmatic stopgap: the real fix is shrinking the 47MB snapshots
84
+ // themselves (compaction refactor, out of scope) — the cache hides the cost
85
+ // without removing it.
86
+ snapshotCache = /* @__PURE__ */ new Map();
87
+ snapshotCacheBytes = 0;
88
+ static SNAPSHOT_CACHE_MAX_ENTRIES = 16;
89
+ static SNAPSHOT_CACHE_MAX_BYTES = 128 * 1024 * 1024;
90
+ // Recent user prompts per session (sidebar list). Computed once from the
91
+ // snapshot + message.start events, then served from memory. Bounded — small
92
+ // arrays, but a long-lived server must not accumulate one per listed
93
+ // session; entries are also dropped when their session is written to.
94
+ promptsCache = /* @__PURE__ */ new Map();
95
+ static PROMPTS_CACHE_MAX_ENTRIES = 64;
96
+ // Row cap for the message.start query feeding the prompts cache. Kept above
97
+ // any realistic caller limit so the cached result is not clipped to whatever
98
+ // limit the first caller happened to request.
99
+ static PROMPTS_QUERY_LIMIT = 100;
80
100
  constructor(db) {
81
101
  this.db = db;
82
102
  this.initSchema();
@@ -140,6 +160,7 @@ var EventStore = class {
140
160
  `INSERT INTO events (session_id, seq, timestamp, event_type, payload)
141
161
  VALUES (?, ?, ?, ?, ?)`
142
162
  ).run(sessionId, seq, timestamp, event.type, payload);
163
+ this.invalidateSessionCache(sessionId);
143
164
  const stored = {
144
165
  seq,
145
166
  timestamp,
@@ -178,6 +199,7 @@ var EventStore = class {
178
199
  }
179
200
  });
180
201
  transaction();
202
+ this.invalidateSessionCache(sessionId);
181
203
  for (const stored of results) {
182
204
  this.notifySubscribers(sessionId, stored);
183
205
  }
@@ -235,6 +257,7 @@ var EventStore = class {
235
257
  */
236
258
  updateEventPayload(sessionId, seq, data) {
237
259
  this.db.prepare(`UPDATE events SET payload = ? WHERE session_id = ? AND seq = ?`).run(JSON.stringify(data), sessionId, seq);
260
+ this.invalidateSessionCache(sessionId);
238
261
  }
239
262
  /**
240
263
  * Get the latest sequence number for a session
@@ -247,13 +270,106 @@ var EventStore = class {
247
270
  * Get the latest snapshot event for a session
248
271
  */
249
272
  getLatestSnapshot(sessionId) {
273
+ const cached = this.snapshotCache.get(sessionId);
274
+ if (cached) {
275
+ return cached.stored;
276
+ }
250
277
  const row = this.db.prepare(
251
278
  `SELECT * FROM events
252
279
  WHERE session_id = ? AND event_type = 'turn.snapshot'
253
280
  ORDER BY seq DESC LIMIT 1`
254
281
  ).get(sessionId);
255
282
  if (!row) return void 0;
256
- return this.rowToStoredEvent(row);
283
+ const stored = this.rowToStoredEvent(row);
284
+ this.cacheSnapshot(sessionId, stored, row.payload.length);
285
+ return stored;
286
+ }
287
+ cacheSnapshot(sessionId, stored, bytes) {
288
+ const existing = this.snapshotCache.get(sessionId);
289
+ if (existing) {
290
+ this.snapshotCacheBytes -= existing.bytes;
291
+ }
292
+ this.snapshotCache.set(sessionId, { stored, bytes });
293
+ this.snapshotCacheBytes += bytes;
294
+ while (this.snapshotCache.size > _EventStore.SNAPSHOT_CACHE_MAX_ENTRIES || this.snapshotCacheBytes > _EventStore.SNAPSHOT_CACHE_MAX_BYTES) {
295
+ const oldestKey = this.snapshotCache.keys().next().value;
296
+ if (oldestKey === void 0 || oldestKey === sessionId) break;
297
+ const oldest = this.snapshotCache.get(oldestKey);
298
+ if (oldest) {
299
+ this.snapshotCacheBytes -= oldest.bytes;
300
+ }
301
+ this.snapshotCache.delete(oldestKey);
302
+ }
303
+ }
304
+ invalidateSessionCache(sessionId) {
305
+ const entry = this.snapshotCache.get(sessionId);
306
+ if (entry) {
307
+ this.snapshotCacheBytes -= entry.bytes;
308
+ this.snapshotCache.delete(sessionId);
309
+ }
310
+ this.promptsCache.delete(sessionId);
311
+ }
312
+ clearSnapshotCache() {
313
+ this.snapshotCache.clear();
314
+ this.snapshotCacheBytes = 0;
315
+ this.promptsCache.clear();
316
+ }
317
+ /**
318
+ * Get the most recent real user prompts for a session, cached in memory.
319
+ * Extracts them from the latest snapshot (when present) plus recent
320
+ * message.start events. Parsing a multi-MB snapshot on every sidebar list
321
+ * call dominated the list endpoint, so the result is memoized per session.
322
+ */
323
+ getRecentUserPrompts(sessionId, limit) {
324
+ const cached = this.promptsCache.get(sessionId);
325
+ if (cached) {
326
+ return cached.slice(0, limit);
327
+ }
328
+ const isRealUserMessage = (msg) => msg.role === "user" && !msg.isSystemGenerated && !msg.messageKind && !msg.subAgentType;
329
+ const promptMap = /* @__PURE__ */ new Map();
330
+ const snapshotEvent = this.getLatestSnapshot(sessionId);
331
+ if (snapshotEvent) {
332
+ const snapshot = snapshotEvent.data;
333
+ for (const msg of snapshot.messages) {
334
+ if (isRealUserMessage(msg)) {
335
+ promptMap.set(msg.id, {
336
+ id: msg.id,
337
+ content: msg.content,
338
+ timestamp: new Date(msg.timestamp).toISOString()
339
+ });
340
+ }
341
+ }
342
+ }
343
+ const rows = this.db.prepare(
344
+ `
345
+ SELECT payload, timestamp
346
+ FROM events
347
+ WHERE session_id = ? AND event_type = 'message.start'
348
+ AND json_extract(payload, '$.role') = 'user'
349
+ AND json_extract(payload, '$.isSystemGenerated') IS NULL
350
+ AND json_extract(payload, '$.messageKind') IS NULL
351
+ AND json_extract(payload, '$.subAgentType') IS NULL
352
+ ORDER BY timestamp DESC
353
+ LIMIT ?
354
+ `
355
+ ).all(sessionId, _EventStore.PROMPTS_QUERY_LIMIT);
356
+ for (const row of rows) {
357
+ const message = JSON.parse(row.payload);
358
+ promptMap.set(message.messageId, {
359
+ id: message.messageId,
360
+ content: message.content,
361
+ timestamp: new Date(row.timestamp).toISOString()
362
+ });
363
+ }
364
+ const prompts = [...promptMap.values()].sort(
365
+ (a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()
366
+ );
367
+ this.promptsCache.set(sessionId, prompts);
368
+ if (this.promptsCache.size > _EventStore.PROMPTS_CACHE_MAX_ENTRIES) {
369
+ const oldestKey = this.promptsCache.keys().next().value;
370
+ if (oldestKey !== void 0) this.promptsCache.delete(oldestKey);
371
+ }
372
+ return prompts.slice(0, limit);
257
373
  }
258
374
  /**
259
375
  * Get the latest snapshot and all events since it
@@ -404,6 +520,7 @@ var EventStore = class {
404
520
  */
405
521
  deleteSession(sessionId) {
406
522
  this.db.prepare(`DELETE FROM events WHERE session_id = ?`).run(sessionId);
523
+ this.invalidateSessionCache(sessionId);
407
524
  const sessionSubs = this.subscribers.get(sessionId);
408
525
  if (sessionSubs) {
409
526
  for (const subscriber of sessionSubs) {
@@ -423,6 +540,7 @@ var EventStore = class {
423
540
  */
424
541
  deleteEventsUpToSeq(sessionId, upToSeq) {
425
542
  const result = this.db.prepare(`DELETE FROM events WHERE session_id = ? AND seq <= ?`).run(sessionId, upToSeq);
543
+ this.invalidateSessionCache(sessionId);
426
544
  return result.changes;
427
545
  }
428
546
  /**
@@ -436,6 +554,7 @@ var EventStore = class {
436
554
  */
437
555
  deleteEventsAfterSeq(sessionId, fromSeq) {
438
556
  const result = this.db.prepare(`DELETE FROM events WHERE session_id = ? AND seq > ?`).run(sessionId, fromSeq);
557
+ this.invalidateSessionCache(sessionId);
439
558
  return result.changes;
440
559
  }
441
560
  /**
@@ -470,6 +589,7 @@ var EventStore = class {
470
589
  )
471
590
  `
472
591
  ).run(sessionId, latestSnapshotSeq);
592
+ this.invalidateSessionCache(sessionId);
473
593
  return result.changes;
474
594
  }
475
595
  /**
@@ -492,6 +612,7 @@ var EventStore = class {
492
612
  )
493
613
  `
494
614
  ).run();
615
+ this.clearSnapshotCache();
495
616
  return { deletedSnapshots: deleteResult.changes };
496
617
  }
497
618
  /**
@@ -1067,11 +1188,11 @@ function truncateSessionMessages(sessionId, messageIndex) {
1067
1188
  const messages = snapshot.messages;
1068
1189
  const lastKept = messageIndex + 1;
1069
1190
  if (lastKept < 0 || lastKept >= messages.length) return;
1070
- snapshot.messages = messages.slice(0, lastKept);
1191
+ const truncatedSnapshot = { ...snapshot, messages: messages.slice(0, lastKept) };
1071
1192
  eventStore.deleteEventsAfterSeq(sessionId, snapshotEvent.seq);
1072
1193
  eventStore.append(sessionId, {
1073
1194
  type: "turn.snapshot",
1074
- data: snapshot
1195
+ data: truncatedSnapshot
1075
1196
  });
1076
1197
  const removed = messages.length - lastKept;
1077
1198
  updateSessionMessageCount(sessionId, -removed);
@@ -1079,55 +1200,7 @@ function truncateSessionMessages(sessionId, messageIndex) {
1079
1200
  function getRecentUserPromptsForSession(sessionId, limit = 10) {
1080
1201
  try {
1081
1202
  const eventStore = getEventStore();
1082
- const db = eventStore.db;
1083
- if (!db) {
1084
- return [];
1085
- }
1086
- const isRealUserMessage = (msg) => msg.role === "user" && !msg.isSystemGenerated && !msg.messageKind && !msg.subAgentType;
1087
- const promptMap = /* @__PURE__ */ new Map();
1088
- const snapshotRow = db.prepare(
1089
- `
1090
- SELECT payload, timestamp
1091
- FROM events
1092
- WHERE session_id = ? AND event_type = 'turn.snapshot'
1093
- ORDER BY timestamp DESC
1094
- LIMIT 1
1095
- `
1096
- ).get(sessionId);
1097
- if (snapshotRow) {
1098
- const snapshot = JSON.parse(snapshotRow.payload);
1099
- for (const msg of snapshot.messages) {
1100
- if (isRealUserMessage(msg)) {
1101
- promptMap.set(msg.id, {
1102
- id: msg.id,
1103
- content: msg.content,
1104
- timestamp: new Date(msg.timestamp).toISOString()
1105
- });
1106
- }
1107
- }
1108
- }
1109
- const rows = db.prepare(
1110
- `
1111
- SELECT payload, timestamp
1112
- FROM events
1113
- WHERE session_id = ? AND event_type = 'message.start'
1114
- AND json_extract(payload, '$.role') = 'user'
1115
- AND json_extract(payload, '$.isSystemGenerated') IS NULL
1116
- AND json_extract(payload, '$.messageKind') IS NULL
1117
- AND json_extract(payload, '$.subAgentType') IS NULL
1118
- ORDER BY timestamp DESC
1119
- LIMIT ?
1120
- `
1121
- ).all(sessionId, limit);
1122
- for (const row of rows) {
1123
- const message = JSON.parse(row.payload);
1124
- promptMap.set(message.messageId, {
1125
- id: message.messageId,
1126
- content: message.content,
1127
- timestamp: new Date(row.timestamp).toISOString()
1128
- });
1129
- }
1130
- return [...promptMap.values()].sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()).slice(0, limit);
1203
+ return eventStore.getRecentUserPrompts(sessionId, limit);
1131
1204
  } catch {
1132
1205
  return [];
1133
1206
  }
@@ -1176,4 +1249,4 @@ export {
1176
1249
  truncateSessionMessages,
1177
1250
  getRecentUserPromptsForSession
1178
1251
  };
1179
- //# sourceMappingURL=chunk-GXW4CRR5.js.map
1252
+ //# sourceMappingURL=chunk-QDKLJZO4.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resolveDefaultAgentId
3
- } from "./chunk-2GM6SUIQ.js";
3
+ } from "./chunk-WFWFRUBU.js";
4
4
  import {
5
5
  getDatabase
6
6
  } from "./chunk-LCQ5AN6Y.js";
@@ -368,4 +368,4 @@ export {
368
368
  getActiveWorkflowExecution,
369
369
  clearWorkflowExecution
370
370
  };
371
- //# sourceMappingURL=chunk-IA4Y3CKA.js.map
371
+ //# sourceMappingURL=chunk-TMVXOLBS.js.map
@@ -0,0 +1,7 @@
1
+ // src/constants.ts
2
+ var VERSION = "2.0.108";
3
+
4
+ export {
5
+ VERSION
6
+ };
7
+ //# sourceMappingURL=chunk-UWF4L4CK.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  SETTINGS_KEYS,
3
3
  getSetting
4
- } from "./chunk-KIAKWUZ3.js";
4
+ } from "./chunk-MPWLBKSK.js";
5
5
  import {
6
6
  logger
7
7
  } from "./chunk-K44MW7JJ.js";
@@ -455,4 +455,4 @@ export {
455
455
  getOverrideAgentIds,
456
456
  resolveDefaultAgentId
457
457
  };
458
- //# sourceMappingURL=chunk-2GM6SUIQ.js.map
458
+ //# sourceMappingURL=chunk-WFWFRUBU.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getPlatformShell
3
- } from "./chunk-UXQN7FGB.js";
3
+ } from "./chunk-ID4N6PM6.js";
4
4
 
5
5
  // src/server/tools/tool-policy.ts
6
6
  var ALWAYS_ALLOWED = /* @__PURE__ */ new Set(["step_done"]);
@@ -246,4 +246,4 @@ export {
246
246
  buildAgentSmallReminder,
247
247
  COMPACTION_PROMPT
248
248
  };
249
- //# sourceMappingURL=chunk-SGJ3LSVA.js.map
249
+ //# sourceMappingURL=chunk-YBIJI53N.js.map
package/dist/cli/dev.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runCli
4
- } from "../chunk-QBKAW5H4.js";
4
+ } from "../chunk-CF2HEP3M.js";
5
5
  import "../chunk-4H427UBV.js";
6
6
  import {
7
7
  logger
package/dist/cli/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runCli
4
- } from "../chunk-QBKAW5H4.js";
4
+ } from "../chunk-CF2HEP3M.js";
5
5
  import "../chunk-4H427UBV.js";
6
6
  import {
7
7
  logger
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  createLLMClient
3
- } from "./chunk-46KNPXY6.js";
3
+ } from "./chunk-3GJFZQNV.js";
4
4
  import "./chunk-V4IE7HJY.js";
5
5
  import "./chunk-YHEQTVFV.js";
6
6
  import "./chunk-HNCM3D7Y.js";
7
- import "./chunk-WDJOSRIB.js";
8
- import "./chunk-TB7TTPYQ.js";
9
- import "./chunk-KIAKWUZ3.js";
7
+ import "./chunk-L737Y63F.js";
8
+ import "./chunk-EYMGV4YA.js";
9
+ import "./chunk-MPWLBKSK.js";
10
10
  import "./chunk-LCQ5AN6Y.js";
11
11
  import "./chunk-K44MW7JJ.js";
12
12
  import "./chunk-5WRI5ZAA.js";
13
13
  export {
14
14
  createLLMClient
15
15
  };
16
- //# sourceMappingURL=client-MP3FSNN7.js.map
16
+ //# sourceMappingURL=client-R4TZCZTO.js.map
@@ -8,7 +8,7 @@ import {
8
8
  mapFinishReason,
9
9
  parseToolArguments,
10
10
  resolveAttachmentsInMessages
11
- } from "./chunk-WDJOSRIB.js";
11
+ } from "./chunk-L737Y63F.js";
12
12
  import "./chunk-5WRI5ZAA.js";
13
13
  export {
14
14
  buildModelParams,
@@ -21,4 +21,4 @@ export {
21
21
  parseToolArguments,
22
22
  resolveAttachmentsInMessages
23
23
  };
24
- //# sourceMappingURL=client-pure-USVHN4WG.js.map
24
+ //# sourceMappingURL=client-pure-VFZIIK4S.js.map
@@ -3,19 +3,19 @@ import {
3
3
  COMPACTION_MAX_RATIO,
4
4
  appendCompactionPrompt,
5
5
  shouldCompact
6
- } from "./chunk-26DEYDYV.js";
7
- import "./chunk-5M45NHQ2.js";
8
- import "./chunk-SGJ3LSVA.js";
9
- import "./chunk-GXW4CRR5.js";
10
- import "./chunk-UXQN7FGB.js";
11
- import "./chunk-3C73IUUL.js";
12
- import "./chunk-IA4Y3CKA.js";
13
- import "./chunk-2GM6SUIQ.js";
6
+ } from "./chunk-KYY5PAGE.js";
7
+ import "./chunk-JR54MDZI.js";
8
+ import "./chunk-YBIJI53N.js";
9
+ import "./chunk-QDKLJZO4.js";
10
+ import "./chunk-ID4N6PM6.js";
11
+ import "./chunk-JH6SOEQW.js";
12
+ import "./chunk-TMVXOLBS.js";
13
+ import "./chunk-WFWFRUBU.js";
14
14
  import "./chunk-J2GP3J3X.js";
15
15
  import "./chunk-V4IE7HJY.js";
16
16
  import "./chunk-YHEQTVFV.js";
17
- import "./chunk-WDJOSRIB.js";
18
- import "./chunk-KIAKWUZ3.js";
17
+ import "./chunk-L737Y63F.js";
18
+ import "./chunk-MPWLBKSK.js";
19
19
  import "./chunk-LCQ5AN6Y.js";
20
20
  import "./chunk-K44MW7JJ.js";
21
21
  import "./chunk-CQGTEGKL.js";
@@ -26,4 +26,4 @@ export {
26
26
  appendCompactionPrompt,
27
27
  shouldCompact
28
28
  };
29
- //# sourceMappingURL=compactor-KK2BVJK5.js.map
29
+ //# sourceMappingURL=compactor-U3MAROGM.js.map
@@ -5,13 +5,13 @@ import {
5
5
  computeSessionHash,
6
6
  computeUnifiedDiff,
7
7
  getToolFingerprint
8
- } from "./chunk-HU22EVEM.js";
9
- import "./chunk-LOHVZGCM.js";
10
- import "./chunk-SGJ3LSVA.js";
11
- import "./chunk-UXQN7FGB.js";
8
+ } from "./chunk-3MYD6Y4W.js";
9
+ import "./chunk-GWMNR3LC.js";
10
+ import "./chunk-YBIJI53N.js";
11
+ import "./chunk-ID4N6PM6.js";
12
12
  import "./chunk-6FPGJR7O.js";
13
- import "./chunk-2GM6SUIQ.js";
14
- import "./chunk-KIAKWUZ3.js";
13
+ import "./chunk-WFWFRUBU.js";
14
+ import "./chunk-MPWLBKSK.js";
15
15
  import "./chunk-LCQ5AN6Y.js";
16
16
  import "./chunk-K44MW7JJ.js";
17
17
  import "./chunk-CQGTEGKL.js";
@@ -24,4 +24,4 @@ export {
24
24
  computeUnifiedDiff,
25
25
  getToolFingerprint
26
26
  };
27
- //# sourceMappingURL=dynamic-context-ZUXI5UTW.js.map
27
+ //# sourceMappingURL=dynamic-context-H7AVSAXQ.js.map
@@ -40,7 +40,7 @@ import {
40
40
  isStoredEvent,
41
41
  isTurnEvent,
42
42
  truncateSessionMessages
43
- } from "./chunk-GXW4CRR5.js";
43
+ } from "./chunk-QDKLJZO4.js";
44
44
  import {
45
45
  buildContextMessagesFromEventHistory,
46
46
  buildContextMessagesFromMessages,
@@ -57,10 +57,10 @@ import {
57
57
  foldTodos,
58
58
  foldTurnEventsToSnapshotMessages,
59
59
  getMessagesForWindow
60
- } from "./chunk-3C73IUUL.js";
61
- import "./chunk-IA4Y3CKA.js";
62
- import "./chunk-2GM6SUIQ.js";
63
- import "./chunk-KIAKWUZ3.js";
60
+ } from "./chunk-JH6SOEQW.js";
61
+ import "./chunk-TMVXOLBS.js";
62
+ import "./chunk-WFWFRUBU.js";
63
+ import "./chunk-MPWLBKSK.js";
64
64
  import "./chunk-LCQ5AN6Y.js";
65
65
  import "./chunk-K44MW7JJ.js";
66
66
  import "./chunk-CQGTEGKL.js";
@@ -123,4 +123,4 @@ export {
123
123
  isTurnEvent,
124
124
  truncateSessionMessages
125
125
  };
126
- //# sourceMappingURL=events-OJ2R6OEM.js.map
126
+ //# sourceMappingURL=events-7WAOX35W.js.map
@@ -25,9 +25,9 @@ import {
25
25
  reorderToolMessages,
26
26
  spreadOptionalMessageFields,
27
27
  stripOrphanedToolCalls
28
- } from "./chunk-3C73IUUL.js";
29
- import "./chunk-2GM6SUIQ.js";
30
- import "./chunk-KIAKWUZ3.js";
28
+ } from "./chunk-JH6SOEQW.js";
29
+ import "./chunk-WFWFRUBU.js";
30
+ import "./chunk-MPWLBKSK.js";
31
31
  import "./chunk-LCQ5AN6Y.js";
32
32
  import "./chunk-K44MW7JJ.js";
33
33
  import "./chunk-CQGTEGKL.js";
@@ -60,4 +60,4 @@ export {
60
60
  spreadOptionalMessageFields,
61
61
  stripOrphanedToolCalls
62
62
  };
63
- //# sourceMappingURL=folding-DUZSKCZF.js.map
63
+ //# sourceMappingURL=folding-MJDFKOHT.js.map
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  OpenAIHttpClient
3
- } from "./chunk-TB7TTPYQ.js";
4
- import "./chunk-KIAKWUZ3.js";
3
+ } from "./chunk-EYMGV4YA.js";
4
+ import "./chunk-MPWLBKSK.js";
5
5
  import "./chunk-LCQ5AN6Y.js";
6
6
  import "./chunk-K44MW7JJ.js";
7
7
  import "./chunk-5WRI5ZAA.js";
8
8
  export {
9
9
  OpenAIHttpClient
10
10
  };
11
- //# sourceMappingURL=http-client-KJXFSK7A.js.map
11
+ //# sourceMappingURL=http-client-NHVT6E5C.js.map
@@ -6,10 +6,10 @@ import {
6
6
  onProcessEvent,
7
7
  startProcessCommand,
8
8
  stopProcess
9
- } from "./chunk-6VNB4L4V.js";
9
+ } from "./chunk-HGOEHSVC.js";
10
10
  import "./chunk-I72ACQ6R.js";
11
- import "./chunk-UXQN7FGB.js";
12
- import "./chunk-KIAKWUZ3.js";
11
+ import "./chunk-ID4N6PM6.js";
12
+ import "./chunk-MPWLBKSK.js";
13
13
  import "./chunk-LCQ5AN6Y.js";
14
14
  import "./chunk-K44MW7JJ.js";
15
15
  import "./chunk-5WRI5ZAA.js";
@@ -22,4 +22,4 @@ export {
22
22
  startProcessCommand,
23
23
  stopProcess
24
24
  };
25
- //# sourceMappingURL=manager-N27WNW5B.js.map
25
+ //# sourceMappingURL=manager-ZVHBUECR.js.map
@@ -5,8 +5,8 @@ import {
5
5
  parseAgentModelOverrides,
6
6
  resolveLLMClientForAgent,
7
7
  setAgentModelOverride
8
- } from "./chunk-V6Y6OLB4.js";
9
- import "./chunk-KIAKWUZ3.js";
8
+ } from "./chunk-IRWZJPPA.js";
9
+ import "./chunk-MPWLBKSK.js";
10
10
  import "./chunk-LCQ5AN6Y.js";
11
11
  import "./chunk-K44MW7JJ.js";
12
12
  import "./chunk-5WRI5ZAA.js";
@@ -18,4 +18,4 @@ export {
18
18
  resolveLLMClientForAgent,
19
19
  setAgentModelOverride
20
20
  };
21
- //# sourceMappingURL=model-overrides-36SQR3JR.js.map
21
+ //# sourceMappingURL=model-overrides-47LYCLFO.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  runAgentTurn,
3
3
  runChatTurn
4
- } from "./chunk-AYUUGKZU.js";
5
- import "./chunk-HU22EVEM.js";
6
- import "./chunk-6M44ZHQA.js";
7
- import "./chunk-LOHVZGCM.js";
4
+ } from "./chunk-7FKSDR7H.js";
5
+ import "./chunk-3MYD6Y4W.js";
6
+ import "./chunk-JBZW5BZX.js";
7
+ import "./chunk-GWMNR3LC.js";
8
8
  import {
9
9
  TurnMetrics,
10
10
  createChatDoneEvent,
@@ -12,31 +12,31 @@ import {
12
12
  createMessageStartEvent,
13
13
  createToolCallEvent,
14
14
  createToolResultEvent
15
- } from "./chunk-5M45NHQ2.js";
16
- import "./chunk-SGJ3LSVA.js";
15
+ } from "./chunk-JR54MDZI.js";
16
+ import "./chunk-YBIJI53N.js";
17
17
  import "./chunk-33Q7LCVD.js";
18
- import "./chunk-6VNB4L4V.js";
18
+ import "./chunk-HGOEHSVC.js";
19
19
  import "./chunk-I72ACQ6R.js";
20
20
  import "./chunk-JE7LW7Y6.js";
21
21
  import "./chunk-VKWVPQJ5.js";
22
- import "./chunk-RRTKVJMF.js";
22
+ import "./chunk-FR5LUTLQ.js";
23
23
  import "./chunk-J7GAZGZT.js";
24
- import "./chunk-OEPRHAIO.js";
25
- import "./chunk-X3USQHHK.js";
26
- import "./chunk-GXW4CRR5.js";
27
- import "./chunk-27SDWNKL.js";
24
+ import "./chunk-P7WCFUPJ.js";
25
+ import "./chunk-P7HT6IJW.js";
26
+ import "./chunk-QDKLJZO4.js";
27
+ import "./chunk-B5MH4HQ6.js";
28
28
  import "./chunk-JAX5OEMM.js";
29
- import "./chunk-UXQN7FGB.js";
30
- import "./chunk-V6Y6OLB4.js";
29
+ import "./chunk-ID4N6PM6.js";
30
+ import "./chunk-IRWZJPPA.js";
31
31
  import "./chunk-6FPGJR7O.js";
32
- import "./chunk-3C73IUUL.js";
33
- import "./chunk-IA4Y3CKA.js";
34
- import "./chunk-2GM6SUIQ.js";
32
+ import "./chunk-JH6SOEQW.js";
33
+ import "./chunk-TMVXOLBS.js";
34
+ import "./chunk-WFWFRUBU.js";
35
35
  import "./chunk-J2GP3J3X.js";
36
36
  import "./chunk-V4IE7HJY.js";
37
37
  import "./chunk-YHEQTVFV.js";
38
- import "./chunk-WDJOSRIB.js";
39
- import "./chunk-KIAKWUZ3.js";
38
+ import "./chunk-L737Y63F.js";
39
+ import "./chunk-MPWLBKSK.js";
40
40
  import "./chunk-LCQ5AN6Y.js";
41
41
  import "./chunk-K44MW7JJ.js";
42
42
  import "./chunk-4R7G5JB6.js";
@@ -53,4 +53,4 @@ export {
53
53
  runAgentTurn,
54
54
  runChatTurn
55
55
  };
56
- //# sourceMappingURL=orchestrator-VZORJ7KF.js.map
56
+ //# sourceMappingURL=orchestrator-X7H5JRM5.js.map
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openfox",
3
- "version": "2.0.106",
3
+ "version": "2.0.108",
4
4
  "description": "Local-LLM-first agentic coding assistant",
5
5
  "type": "module",
6
6
  "bin": {
@@ -62,7 +62,7 @@
62
62
  "clean": "rm -rf dist",
63
63
  "prepublishOnly": "npm run build && npm run test:publish:e2e",
64
64
  "prepare": "husky",
65
- "postinstall": "if [ ! -d web/node_modules ]; then cd web && npm install --prefer-offline; fi",
65
+ "postinstall": "if [ -f web/package.json ] && [ ! -d web/node_modules ]; then cd web && npm install --prefer-offline; fi",
66
66
  "test:publish:e2e": "tsx scripts/run-publish-e2e.ts"
67
67
  },
68
68
  "dependencies": {
@@ -88,6 +88,8 @@
88
88
  "multer": "^2.2.0",
89
89
  "node-pty": "^1.2.0-beta.12",
90
90
  "open": "^11.0.0",
91
+ "overlayscrollbars": "^2.16.0",
92
+ "overlayscrollbars-react": "^0.5.6",
91
93
  "pdfjs-dist": "^6.1.200",
92
94
  "pngjs": "^7.0.0",
93
95
  "pyright": "^1.1.408",