openfox 1.6.75 → 1.6.77

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 (70) hide show
  1. package/README.md +18 -18
  2. package/dist/agent-defaults/code-reviewer.agent.md +1 -0
  3. package/dist/agent-defaults/explorer.agent.md +2 -1
  4. package/dist/agent-defaults/verifier.agent.md +4 -0
  5. package/dist/{ask-3RK5YJZE.js → ask-5SSOA6SZ.js} +2 -2
  6. package/dist/{auth-LZZX63KI.js → auth-56SIRACI.js} +3 -6
  7. package/dist/auto-compaction-GOHNI2R2.js +27 -0
  8. package/dist/{branch.api-XADFZZAA.js → branch.api-PWFW26KC.js} +2 -2
  9. package/dist/{chat-handler-KYMMXPP6.js → chat-handler-K2RDXBO6.js} +31 -29
  10. package/dist/{chunk-IA4O65CR.js → chunk-6SYNGMU4.js} +100 -68
  11. package/dist/{chunk-AFATQ5LJ.js → chunk-B5AP3RSV.js} +1 -1
  12. package/dist/{chunk-PFRQO5Z3.js → chunk-BBC46FN4.js} +61 -28
  13. package/dist/{chunk-22CTURMH.js → chunk-BJYPTN5S.js} +1 -1
  14. package/dist/{chunk-DLINTLB7.js → chunk-BSTVRSV6.js} +7 -5
  15. package/dist/{chunk-7JPKRM6M.js → chunk-CMQCO27Y.js} +22 -12
  16. package/dist/{chunk-R4HADRYO.js → chunk-CQGTEGKL.js} +1 -1
  17. package/dist/{chunk-J5DV33SS.js → chunk-CUDAT6SS.js} +46 -18
  18. package/dist/{chunk-ETIXH35K.js → chunk-EBQYRNNU.js} +535 -291
  19. package/dist/{chunk-4CQ7CUQ6.js → chunk-I7JVS7V5.js} +5 -5
  20. package/dist/{chunk-PNBH3RAX.js → chunk-K44MW7JJ.js} +1 -1
  21. package/dist/{chunk-BLNFJ22S.js → chunk-KIOUKC3Z.js} +6 -4
  22. package/dist/{chunk-CTAIXOZJ.js → chunk-NDJ6FKSP.js} +1 -1
  23. package/dist/{chunk-VIGOXEZG.js → chunk-OJBFC6ER.js} +15 -16
  24. package/dist/{chunk-GQZGIMJO.js → chunk-OXI26S7U.js} +12 -7
  25. package/dist/{chunk-NBU6KIOD.js → chunk-PBGOZMVY.js} +4 -4
  26. package/dist/{chunk-B7E3BICY.js → chunk-RGRBWDZP.js} +2 -4
  27. package/dist/{chunk-KFBIHS3S.js → chunk-STYHKCG7.js} +20 -14
  28. package/dist/{chunk-55Z3DJ7G.js → chunk-TGWEH2BC.js} +10 -11
  29. package/dist/{chunk-TYUNDOX2.js → chunk-UKMRZDWM.js} +90 -41
  30. package/dist/{chunk-5UTTLO4D.js → chunk-UVN6AKIO.js} +89 -49
  31. package/dist/{chunk-574HZVLE.js → chunk-VRGRAQDG.js} +2 -2
  32. package/dist/{chunk-JQBTYHUR.js → chunk-WR6QCJJO.js} +53 -15
  33. package/dist/{chunk-RBPOAAIZ.js → chunk-XKIEDGQF.js} +22 -18
  34. package/dist/{chunk-XIZ6B6IS.js → chunk-XSUQDB6R.js} +541 -299
  35. package/dist/cli/dev.js +2 -2
  36. package/dist/cli/index.js +2 -2
  37. package/dist/{config-6T4EHAP2.js → config-5CONAOL7.js} +7 -7
  38. package/dist/{events-LKEZ3YCW.js → events-5RIXWI5Y.js} +6 -6
  39. package/dist/{folding-JN2WT44N.js → folding-JNOUTI5Z.js} +2 -2
  40. package/dist/{inspect-proxy-Y4MRAVB7.js → inspect-proxy-Y75AXMRX.js} +3 -3
  41. package/dist/{manager-HM2J5VMW.js → manager-W7N3XQ4Q.js} +3 -3
  42. package/dist/orchestrator-TW5II347.js +43 -0
  43. package/dist/package.json +19 -3
  44. package/dist/{paths-ZRI56O63.js → paths-X46PPOI2.js} +2 -2
  45. package/dist/{processor-23O4HPSS.js → processor-MZ3QIUED.js} +15 -11
  46. package/dist/{project-creator-LASKNQPA.js → project-creator-VD7MLOWE.js} +8 -5
  47. package/dist/{projects-HEUOWNSR.js → projects-XLMSDFTQ.js} +4 -4
  48. package/dist/{protocol-5AWNGFLH.js → protocol-4CTV7OZC.js} +3 -3
  49. package/dist/{protocol-DRBnujwe.d.ts → protocol-4xbfAlGO.d.ts} +3 -0
  50. package/dist/{provider-AKN355YH.js → provider-ESEBV3LL.js} +15 -11
  51. package/dist/{pwa-GHQCMCIU.js → pwa-76XP2DY2.js} +2 -2
  52. package/dist/{runtime-config-ZCK74XKM.js → runtime-config-CBJJJGBD.js} +2 -2
  53. package/dist/{serve-TW63YCNQ.js → serve-FTTLGRAO.js} +29 -27
  54. package/dist/server/index.d.ts +6 -1
  55. package/dist/server/index.js +22 -22
  56. package/dist/server/public/__inspect__.js +163 -143
  57. package/dist/{service-74Z7JK2J.js → service-D6LC3CAM.js} +3 -2
  58. package/dist/{settings-NI4ITGV6.js → settings-TQNQB56H.js} +4 -4
  59. package/dist/shared/index.d.ts +2 -2
  60. package/dist/shared/index.js +2 -2
  61. package/dist/{store-2IF3ZSLD.js → store-OQ45KONN.js} +2 -2
  62. package/dist/{tools-RUAY6EVI.js → tools-QJ5K5IJP.js} +18 -18
  63. package/dist/{vision-fallback-AXH3BGJC.js → vision-fallback-ED27LH6C.js} +3 -3
  64. package/dist/web/__inspect__.js +178 -155
  65. package/dist/web/assets/{index-CWdKiSP8.js → index-FjLp1t6r.js} +62 -62
  66. package/dist/web/index.html +2 -2
  67. package/dist/web/sw.js +1 -1
  68. package/package.json +19 -3
  69. package/dist/auto-compaction-OW4P2QWQ.js +0 -27
  70. package/dist/orchestrator-QP4O7MUM.js +0 -43
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getDatabase
3
- } from "./chunk-BLNFJ22S.js";
3
+ } from "./chunk-KIOUKC3Z.js";
4
4
  import {
5
5
  buildContextMessagesFromEventHistory,
6
6
  buildMessagesFromStoredEvents,
@@ -9,13 +9,13 @@ import {
9
9
  foldSessionState,
10
10
  spreadOptionalMessageFields,
11
11
  stripPromptContextMessages
12
- } from "./chunk-PFRQO5Z3.js";
12
+ } from "./chunk-BBC46FN4.js";
13
13
  import {
14
14
  getRuntimeConfig
15
- } from "./chunk-AFATQ5LJ.js";
15
+ } from "./chunk-B5AP3RSV.js";
16
16
  import {
17
17
  logger
18
- } from "./chunk-PNBH3RAX.js";
18
+ } from "./chunk-K44MW7JJ.js";
19
19
 
20
20
  // src/server/events/store.ts
21
21
  function createEventIterator(state, subscriber) {
@@ -307,7 +307,7 @@ var EventStore = class {
307
307
  /**
308
308
  * Delete all events up to (and including) a given sequence number.
309
309
  * This is used to clean up events that are now contained in a snapshot.
310
- *
310
+ *
311
311
  * @param sessionId - The session ID
312
312
  * @param upToSeq - The sequence number to delete up to (inclusive)
313
313
  * @returns The number of events deleted
@@ -322,9 +322,9 @@ var EventStore = class {
322
322
  * - All snapshot events
323
323
  * - State-changing events (criteria.set, criterion.updated, mode.changed, phase.changed, context.state, etc.)
324
324
  * - Events after the latest snapshot (current window)
325
- *
325
+ *
326
326
  * This is the recommended cleanup method that preserves all snapshots and state.
327
- *
327
+ *
328
328
  * @param sessionId - The session ID
329
329
  * @returns The number of events deleted
330
330
  */
@@ -333,7 +333,8 @@ var EventStore = class {
333
333
  if (latestSnapshotSeq === 0) {
334
334
  return 0;
335
335
  }
336
- const result = this.db.prepare(`
336
+ const result = this.db.prepare(
337
+ `
337
338
  DELETE FROM events
338
339
  WHERE session_id = ? AND seq > 1 AND seq < ?
339
340
  AND event_type NOT IN (
@@ -344,7 +345,8 @@ var EventStore = class {
344
345
  'todo.updated',
345
346
  'context.state'
346
347
  )
347
- `).run(sessionId, latestSnapshotSeq);
348
+ `
349
+ ).run(sessionId, latestSnapshotSeq);
348
350
  return result.changes;
349
351
  }
350
352
  /**
@@ -355,7 +357,8 @@ var EventStore = class {
355
357
  optimizeStorage() {
356
358
  let deletedSnapshots = 0;
357
359
  let strippedSnapshots = 0;
358
- const deleteResult = this.db.prepare(`
360
+ const deleteResult = this.db.prepare(
361
+ `
359
362
  DELETE FROM events
360
363
  WHERE event_type = 'turn.snapshot'
361
364
  AND id NOT IN (
@@ -367,7 +370,8 @@ var EventStore = class {
367
370
  AND e2.event_type = 'turn.snapshot'
368
371
  )
369
372
  )
370
- `).run();
373
+ `
374
+ ).run();
371
375
  deletedSnapshots = deleteResult.changes;
372
376
  const snapshots = this.db.prepare(`SELECT id, payload FROM events WHERE event_type = 'turn.snapshot'`).all();
373
377
  const updateStmt = this.db.prepare(`UPDATE events SET payload = ? WHERE id = ?`);
@@ -388,11 +392,13 @@ var EventStore = class {
388
392
  * @returns The sequence number of the latest snapshot, or 0 if none
389
393
  */
390
394
  getLatestSnapshotSeq(sessionId) {
391
- const row = this.db.prepare(`
395
+ const row = this.db.prepare(
396
+ `
392
397
  SELECT seq FROM events
393
398
  WHERE session_id = ? AND event_type = 'turn.snapshot'
394
399
  ORDER BY seq DESC LIMIT 1
395
- `).get(sessionId);
400
+ `
401
+ ).get(sessionId);
396
402
  return row?.seq ?? 0;
397
403
  }
398
404
  /**
@@ -413,11 +419,13 @@ var EventStore = class {
413
419
  const snapshotMessages = latestSnapshot?.data && typeof latestSnapshot.data === "object" && "messages" in latestSnapshot.data ? latestSnapshot.data.messages : [];
414
420
  const foldedState = foldSessionState(events, initialWindowId, 2e5, snapshotMessages);
415
421
  const newSnapshot = buildSnapshot(foldedState, latestSeq);
416
- const deleteResult = this.db.prepare(`
422
+ const deleteResult = this.db.prepare(
423
+ `
417
424
  DELETE FROM events
418
425
  WHERE session_id = ? AND seq <= ?
419
426
  AND event_type != 'session.initialized'
420
- `).run(sessionId, latestSeq);
427
+ `
428
+ ).run(sessionId, latestSeq);
421
429
  const snapshotEvent = this.append(sessionId, {
422
430
  type: "turn.snapshot",
423
431
  data: newSnapshot
@@ -442,22 +450,28 @@ var EventStore = class {
442
450
  findOrphanedSessions() {
443
451
  const cutoff = new Date(Date.now() - 5 * 60 * 1e3).toISOString();
444
452
  logger.debug("Looking for orphaned sessions", { cutoff });
445
- const sessions = this.db.prepare(`
453
+ const sessions = this.db.prepare(
454
+ `
446
455
  SELECT id, is_running
447
456
  FROM sessions
448
457
  WHERE is_running = 0 AND updated_at < ?
449
- `).all(cutoff);
458
+ `
459
+ ).all(cutoff);
450
460
  logger.debug("Idle sessions found", { count: sessions.length });
451
461
  const orphaned = [];
452
462
  for (const session of sessions) {
453
- const hasSnapshot = this.db.prepare(`
463
+ const hasSnapshot = this.db.prepare(
464
+ `
454
465
  SELECT 1 FROM events WHERE session_id = ? AND event_type = 'turn.snapshot' LIMIT 1
455
- `).get(session.id);
466
+ `
467
+ ).get(session.id);
456
468
  if (hasSnapshot) {
457
469
  const latestSnapshotSeq = this.getLatestSnapshotSeq(session.id);
458
- const eventsAfter = this.db.prepare(`
470
+ const eventsAfter = this.db.prepare(
471
+ `
459
472
  SELECT 1 FROM events WHERE session_id = ? AND seq > ? LIMIT 1
460
- `).get(session.id, latestSnapshotSeq);
473
+ `
474
+ ).get(session.id, latestSnapshotSeq);
461
475
  if (eventsAfter) {
462
476
  orphaned.push(session.id);
463
477
  }
@@ -502,11 +516,13 @@ function resetStaleRunningSessions(eventStore, db) {
502
516
  const sessions = db.prepare(`SELECT id FROM sessions`).all();
503
517
  let resetCount = 0;
504
518
  for (const { id: sessionId } of sessions) {
505
- const lastRunningEvent = db.prepare(`
519
+ const lastRunningEvent = db.prepare(
520
+ `
506
521
  SELECT payload FROM events
507
522
  WHERE session_id = ? AND event_type = 'running.changed'
508
523
  ORDER BY seq DESC LIMIT 1
509
- `).get(sessionId);
524
+ `
525
+ ).get(sessionId);
510
526
  if (lastRunningEvent) {
511
527
  const data = JSON.parse(lastRunningEvent.payload);
512
528
  if (data.isRunning === true) {
@@ -545,10 +561,12 @@ function createSession(projectId, workdir, title, providerId, providerModel) {
545
561
  const db = getDatabase();
546
562
  const now = (/* @__PURE__ */ new Date()).toISOString();
547
563
  const id = crypto.randomUUID();
548
- db.prepare(`
564
+ db.prepare(
565
+ `
549
566
  INSERT INTO sessions (id, project_id, workdir, phase, mode, workflow_phase, is_running, created_at, updated_at, title, provider_id, provider_model, danger_level)
550
567
  VALUES (?, ?, ?, 'idle', 'planner', 'plan', 0, ?, ?, ?, ?, ?, 'normal')
551
- `).run(id, projectId, workdir, now, now, title ?? null, providerId ?? null, providerModel ?? null);
568
+ `
569
+ ).run(id, projectId, workdir, now, now, title ?? null, providerId ?? null, providerModel ?? null);
552
570
  return {
553
571
  id,
554
572
  projectId,
@@ -576,9 +594,11 @@ function createSession(projectId, workdir, title, providerId, providerModel) {
576
594
  }
577
595
  function getSession(id) {
578
596
  const db = getDatabase();
579
- const row = db.prepare(`
597
+ const row = db.prepare(
598
+ `
580
599
  SELECT * FROM sessions WHERE id = ?
581
- `).get(id);
600
+ `
601
+ ).get(id);
582
602
  if (!row) {
583
603
  return null;
584
604
  }
@@ -610,30 +630,38 @@ function getSession(id) {
610
630
  function updateSessionProvider(id, providerId, providerModel) {
611
631
  const db = getDatabase();
612
632
  const now = (/* @__PURE__ */ new Date()).toISOString();
613
- db.prepare(`
633
+ db.prepare(
634
+ `
614
635
  UPDATE sessions SET provider_id = ?, provider_model = ?, updated_at = ? WHERE id = ?
615
- `).run(providerId, providerModel, now, id);
636
+ `
637
+ ).run(providerId, providerModel, now, id);
616
638
  }
617
639
  function updateSessionDangerLevel(id, dangerLevel) {
618
640
  const db = getDatabase();
619
641
  const now = (/* @__PURE__ */ new Date()).toISOString();
620
- db.prepare(`
642
+ db.prepare(
643
+ `
621
644
  UPDATE sessions SET danger_level = ?, updated_at = ? WHERE id = ?
622
- `).run(dangerLevel, now, id);
645
+ `
646
+ ).run(dangerLevel, now, id);
623
647
  }
624
648
  function updateSessionRunning(id, isRunning) {
625
649
  const db = getDatabase();
626
650
  const now = (/* @__PURE__ */ new Date()).toISOString();
627
- db.prepare(`
651
+ db.prepare(
652
+ `
628
653
  UPDATE sessions SET is_running = ?, updated_at = ? WHERE id = ?
629
- `).run(isRunning ? 1 : 0, now, id);
654
+ `
655
+ ).run(isRunning ? 1 : 0, now, id);
630
656
  }
631
657
  function updateSessionSummary(id, summary) {
632
658
  const db = getDatabase();
633
659
  const now = (/* @__PURE__ */ new Date()).toISOString();
634
- db.prepare(`
660
+ db.prepare(
661
+ `
635
662
  UPDATE sessions SET summary = ?, updated_at = ? WHERE id = ?
636
- `).run(summary, now, id);
663
+ `
664
+ ).run(summary, now, id);
637
665
  }
638
666
  function updateSessionMetadata(id, metadata) {
639
667
  const db = getDatabase();
@@ -657,23 +685,28 @@ function updateSessionMetadata(id, metadata) {
657
685
  values.push(metadata.iterationCount);
658
686
  }
659
687
  values.push(id);
660
- db.prepare(`
688
+ db.prepare(
689
+ `
661
690
  UPDATE sessions SET ${updates.join(", ")} WHERE id = ?
662
- `).run(...values);
691
+ `
692
+ ).run(...values);
663
693
  }
664
694
  function updateSessionMessageCount(id, delta) {
665
695
  try {
666
696
  const db = getDatabase();
667
697
  const now = (/* @__PURE__ */ new Date()).toISOString();
668
- db.prepare(`
698
+ db.prepare(
699
+ `
669
700
  UPDATE sessions SET message_count = message_count + ?, updated_at = ? WHERE id = ?
670
- `).run(delta, now, id);
701
+ `
702
+ ).run(delta, now, id);
671
703
  } catch {
672
704
  }
673
705
  }
674
706
  function listSessions() {
675
707
  const db = getDatabase();
676
- const rows = db.prepare(`
708
+ const rows = db.prepare(
709
+ `
677
710
  SELECT
678
711
  s.id,
679
712
  s.project_id,
@@ -689,12 +722,14 @@ function listSessions() {
689
722
  s.message_count
690
723
  FROM sessions s
691
724
  ORDER BY s.updated_at DESC
692
- `).all();
725
+ `
726
+ ).all();
693
727
  return rows.map(mapSessionSummaryRow);
694
728
  }
695
729
  function listSessionsByProject(projectId, limit = 20, offset = 0) {
696
730
  const db = getDatabase();
697
- const rows = db.prepare(`
731
+ const rows = db.prepare(
732
+ `
698
733
  SELECT
699
734
  s.id,
700
735
  s.project_id,
@@ -712,7 +747,8 @@ function listSessionsByProject(projectId, limit = 20, offset = 0) {
712
747
  WHERE s.project_id = ?
713
748
  ORDER BY s.updated_at DESC
714
749
  LIMIT ? OFFSET ?
715
- `).all(projectId, limit + 1, offset);
750
+ `
751
+ ).all(projectId, limit + 1, offset);
716
752
  const hasMore = rows.length > limit;
717
753
  const sessions = rows.slice(0, limit).map(mapSessionSummaryRow);
718
754
  return { sessions, hasMore };
@@ -1088,13 +1124,15 @@ function getRecentUserPromptsForSession(sessionId, limit = 10) {
1088
1124
  }
1089
1125
  const isRealUserMessage = (msg) => msg.role === "user" && !msg.isSystemGenerated && !msg.messageKind && !msg.subAgentType;
1090
1126
  const promptMap = /* @__PURE__ */ new Map();
1091
- const snapshotRow = db.prepare(`
1127
+ const snapshotRow = db.prepare(
1128
+ `
1092
1129
  SELECT payload, timestamp
1093
1130
  FROM events
1094
1131
  WHERE session_id = ? AND event_type = 'turn.snapshot'
1095
1132
  ORDER BY timestamp DESC
1096
1133
  LIMIT 1
1097
- `).get(sessionId);
1134
+ `
1135
+ ).get(sessionId);
1098
1136
  if (snapshotRow) {
1099
1137
  const snapshot = JSON.parse(snapshotRow.payload);
1100
1138
  for (const msg of snapshot.messages) {
@@ -1107,7 +1145,8 @@ function getRecentUserPromptsForSession(sessionId, limit = 10) {
1107
1145
  }
1108
1146
  }
1109
1147
  }
1110
- const rows = db.prepare(`
1148
+ const rows = db.prepare(
1149
+ `
1111
1150
  SELECT payload, timestamp
1112
1151
  FROM events
1113
1152
  WHERE session_id = ? AND event_type = 'message.start'
@@ -1117,7 +1156,8 @@ function getRecentUserPromptsForSession(sessionId, limit = 10) {
1117
1156
  AND json_extract(payload, '$.subAgentType') IS NULL
1118
1157
  ORDER BY timestamp DESC
1119
1158
  LIMIT ?
1120
- `).all(sessionId, limit);
1159
+ `
1160
+ ).all(sessionId, limit);
1121
1161
  for (const row of rows) {
1122
1162
  const message = JSON.parse(row.payload);
1123
1163
  promptMap.set(message.messageId, {
@@ -1127,7 +1167,7 @@ function getRecentUserPromptsForSession(sessionId, limit = 10) {
1127
1167
  });
1128
1168
  }
1129
1169
  return [...promptMap.values()].sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()).slice(0, limit);
1130
- } catch (error) {
1170
+ } catch {
1131
1171
  return [];
1132
1172
  }
1133
1173
  }
@@ -1181,4 +1221,4 @@ export {
1181
1221
  compactContext,
1182
1222
  getRecentUserPromptsForSession
1183
1223
  };
1184
- //# sourceMappingURL=chunk-5UTTLO4D.js.map
1224
+ //# sourceMappingURL=chunk-UVN6AKIO.js.map
@@ -120,7 +120,7 @@ function cleanupAllProcesses() {
120
120
  } catch {
121
121
  try {
122
122
  process.kill(proc.pid, "SIGTERM");
123
- } catch (_) {
123
+ } catch {
124
124
  }
125
125
  }
126
126
  }
@@ -146,4 +146,4 @@ export {
146
146
  getProcessById,
147
147
  cleanupAllProcesses
148
148
  };
149
- //# sourceMappingURL=chunk-574HZVLE.js.map
149
+ //# sourceMappingURL=chunk-VRGRAQDG.js.map
@@ -3,14 +3,14 @@ import {
3
3
  createLLMClient,
4
4
  detectModel,
5
5
  setLlmStatus
6
- } from "./chunk-55Z3DJ7G.js";
6
+ } from "./chunk-TGWEH2BC.js";
7
7
  import {
8
8
  detectBackend,
9
9
  getModelProfile
10
- } from "./chunk-J5DV33SS.js";
10
+ } from "./chunk-CUDAT6SS.js";
11
11
  import {
12
12
  logger
13
- } from "./chunk-PNBH3RAX.js";
13
+ } from "./chunk-K44MW7JJ.js";
14
14
 
15
15
  // src/server/provider-manager.ts
16
16
  function normalizeModelId(s) {
@@ -143,7 +143,10 @@ async function fetchOllamaModelsWithContext(baseUrl, _apiKey) {
143
143
  }
144
144
  return modelsWithContext;
145
145
  } catch (error) {
146
- logger.info("Error fetching Ollama models", { url: baseUrl, error: error instanceof Error ? error.message : String(error) });
146
+ logger.info("Error fetching Ollama models", {
147
+ url: baseUrl,
148
+ error: error instanceof Error ? error.message : String(error)
149
+ });
147
150
  return [];
148
151
  }
149
152
  }
@@ -161,7 +164,12 @@ function createProviderManager(config) {
161
164
  let defaultModelSelection = config.defaultModelSelection;
162
165
  let llmClient = createLLMClient(config);
163
166
  const providerStatus = /* @__PURE__ */ new Map();
164
- logger.debug("ProviderManager created", { providers: providers.map((p) => ({ id: p.id, models: p.models.map((m) => ({ id: m.id, contextWindow: m.contextWindow, source: m.source })) })) });
167
+ logger.debug("ProviderManager created", {
168
+ providers: providers.map((p) => ({
169
+ id: p.id,
170
+ models: p.models.map((m) => ({ id: m.id, contextWindow: m.contextWindow, source: m.source }))
171
+ }))
172
+ });
165
173
  for (const p of providers) {
166
174
  providerStatus.set(p.id, "unknown");
167
175
  }
@@ -177,6 +185,13 @@ function createProviderManager(config) {
177
185
  }
178
186
  };
179
187
  }
188
+ const { providerId: activeProviderId, model: activeModel } = parseDefaultModelSelection(defaultModelSelection);
189
+ if (activeProviderId && activeModel) {
190
+ const activeProvider = providers.find((p) => p.id === activeProviderId);
191
+ if (activeProvider && activeProvider.apiKey) {
192
+ llmClient = createLLMClient(createConfigForProvider(activeProvider, activeModel));
193
+ }
194
+ }
180
195
  return {
181
196
  getProviders() {
182
197
  return [...providers];
@@ -224,12 +239,19 @@ function createProviderManager(config) {
224
239
  logger.info("activateProvider fetching models", { providerId, providerName: provider.name, url, backend });
225
240
  const modelsWithContext = await fetchModelsWithContext(url, provider.apiKey, backend);
226
241
  const userModels = provider.models.filter((m) => m.source === "user");
227
- logger.debug("activateProvider", { providerId, backendModelsCount: modelsWithContext.length, userModelsCount: userModels.length });
242
+ logger.debug("activateProvider", {
243
+ providerId,
244
+ backendModelsCount: modelsWithContext.length,
245
+ userModelsCount: userModels.length
246
+ });
228
247
  if (modelsWithContext.length > 0) {
229
248
  const updatedModels = mergeModelsWithUserOverrides(modelsWithContext, userModels);
230
249
  providers = providers.map((p) => p.id === providerId ? { ...p, models: updatedModels } : p);
231
250
  } else if (userModels.length > 0) {
232
- logger.debug("Backend unavailable during provider switch, preserving user models", { providerId, userModelsCount: userModels.length });
251
+ logger.debug("Backend unavailable during provider switch, preserving user models", {
252
+ providerId,
253
+ userModelsCount: userModels.length
254
+ });
233
255
  providers = providers.map((p) => p.id === providerId ? { ...p, models: userModels } : p);
234
256
  }
235
257
  if (provider.backend === "auto") {
@@ -370,7 +392,12 @@ function createProviderManager(config) {
370
392
  );
371
393
  } else {
372
394
  providers = providers.map(
373
- (p) => p.id === providerId ? { ...p, models: p.models.map((m, i) => i === modelIndex ? { ...m, contextWindow, source: "user" } : m) } : p
395
+ (p) => p.id === providerId ? {
396
+ ...p,
397
+ models: p.models.map(
398
+ (m, i) => i === modelIndex ? { ...m, contextWindow, source: "user" } : m
399
+ )
400
+ } : p
374
401
  );
375
402
  }
376
403
  logger.info("Model context updated", { providerId, modelId, contextWindow });
@@ -392,7 +419,13 @@ function createProviderManager(config) {
392
419
  modelId,
393
420
  existing: existingModel,
394
421
  incoming: settings,
395
- final: { temperature: finalTemp, topP: finalTopP, topK: finalTopK, maxTokens: finalMaxTokens, supportsVision: finalSupportsVision }
422
+ final: {
423
+ temperature: finalTemp,
424
+ topP: finalTopP,
425
+ topK: finalTopK,
426
+ maxTokens: finalMaxTokens,
427
+ supportsVision: finalSupportsVision
428
+ }
396
429
  });
397
430
  const updatedModel = enrichWithProfileDefaults({
398
431
  id: modelId,
@@ -409,9 +442,7 @@ function createProviderManager(config) {
409
442
  (p) => p.id === providerId ? { ...p, models: p.models.map((m) => m.id === modelId ? updatedModel : m) } : p
410
443
  );
411
444
  } else {
412
- providers = providers.map(
413
- (p) => p.id === providerId ? { ...p, models: [...p.models, updatedModel] } : p
414
- );
445
+ providers = providers.map((p) => p.id === providerId ? { ...p, models: [...p.models, updatedModel] } : p);
415
446
  }
416
447
  logger.info("Model settings updated", { providerId, modelId, final: updatedModel });
417
448
  return { success: true, model: updatedModel };
@@ -438,11 +469,18 @@ function createProviderManager(config) {
438
469
  logger.info("refreshProviderModels fetching models", { providerId, providerName: provider.name, url, backend });
439
470
  const modelsWithContext = await fetchModelsWithContext(url, provider.apiKey, backend);
440
471
  const userModels = provider.models.filter((m) => m.source === "user");
441
- logger.info("refreshProviderModels", { providerId, userModelsCount: userModels.length, backendModelsCount: modelsWithContext.length });
472
+ logger.info("refreshProviderModels", {
473
+ providerId,
474
+ userModelsCount: userModels.length,
475
+ backendModelsCount: modelsWithContext.length
476
+ });
442
477
  if (modelsWithContext.length === 0) {
443
478
  setLlmStatus("disconnected");
444
479
  if (userModels.length > 0) {
445
- logger.debug("Backend unavailable, preserving user models", { providerId, userModels: userModels.map((m) => ({ id: m.id, contextWindow: m.contextWindow })) });
480
+ logger.debug("Backend unavailable, preserving user models", {
481
+ providerId,
482
+ userModels: userModels.map((m) => ({ id: m.id, contextWindow: m.contextWindow }))
483
+ });
446
484
  providers = providers.map((p) => p.id === providerId ? { ...p, models: userModels } : p);
447
485
  return { success: true };
448
486
  }
@@ -471,4 +509,4 @@ export {
471
509
  parseDefaultModelSelection,
472
510
  createProviderManager
473
511
  };
474
- //# sourceMappingURL=chunk-JQBTYHUR.js.map
512
+ //# sourceMappingURL=chunk-WR6QCJJO.js.map
@@ -1,12 +1,22 @@
1
1
  import {
2
2
  logger
3
- } from "./chunk-PNBH3RAX.js";
3
+ } from "./chunk-K44MW7JJ.js";
4
4
 
5
5
  // src/server/dev-server/inspect-proxy.ts
6
6
  import net from "net";
7
7
  import zlib from "zlib";
8
8
  var OPENFOX_BASE_PORT = Number(process.env["OPENFOX_PORT"] ?? 10369);
9
9
  var INJECT_SCRIPT = `<script src="http://127.0.0.1:${OPENFOX_BASE_PORT}/__inspect__.js"></script>`;
10
+ function buildHttpHeaders(resHeaders, status, contentLengthOverride, contentTypeOverride) {
11
+ const newH = { ...resHeaders };
12
+ delete newH["content-length"];
13
+ delete newH["transfer-encoding"];
14
+ newH["connection"] = "close";
15
+ if (contentLengthOverride !== void 0) newH["content-length"] = contentLengthOverride.toString();
16
+ if (contentTypeOverride !== void 0) newH["content-type"] = contentTypeOverride;
17
+ return `HTTP/1.1 ${status} OK\r
18
+ ` + Object.entries(newH).map(([k, v]) => `${k}: ${v}`).join("\r\n") + "\r\n\r\n";
19
+ }
10
20
  var proxyPool = /* @__PURE__ */ new Map();
11
21
  var nextOffset = 0;
12
22
  function getAvailablePort() {
@@ -118,7 +128,9 @@ ${annotation || "(none)"}`;
118
128
  }
119
129
  client.write(buildResponse(200, { "Content-Type": "application/json" }, Buffer.from('{"success":true}')));
120
130
  } catch {
121
- client.write(buildResponse(400, { "Content-Type": "application/json" }, Buffer.from('{"error":"Invalid request"}')));
131
+ client.write(
132
+ buildResponse(400, { "Content-Type": "application/json" }, Buffer.from('{"error":"Invalid request"}'))
133
+ );
122
134
  }
123
135
  client.end();
124
136
  };
@@ -163,7 +175,7 @@ ${annotation || "(none)"}`;
163
175
  let enc = null;
164
176
  let status = 200;
165
177
  let resHeaders = {};
166
- let bodyBuf = [];
178
+ const bodyBuf = [];
167
179
  let headEnd = -1;
168
180
  targetSocket.on("data", (sChunk) => {
169
181
  if (!serverParsed) {
@@ -232,11 +244,7 @@ ${annotation || "(none)"}`;
232
244
  if (enc === "gzip") compressed = zlib.gzipSync(Buffer.from(modified, "utf8"));
233
245
  else if (enc === "deflate") compressed = zlib.deflateSync(Buffer.from(modified, "utf8"));
234
246
  else compressed = Buffer.from(modified, "utf8");
235
- const newH = { ...resHeaders };
236
- delete newH["content-length"];
237
- newH["connection"] = "close";
238
- const headStr = `HTTP/1.1 ${status} OK\r
239
- ` + Object.entries(newH).map(([k, v]) => `${k}: ${v}`).join("\r\n") + "\r\n\r\n";
247
+ const headStr = buildHttpHeaders(resHeaders, status);
240
248
  client.write(Buffer.from(headStr, "utf8"));
241
249
  client.write(compressed);
242
250
  } else if (isHtml && bodyBuf.length > 0) {
@@ -246,19 +254,15 @@ ${annotation || "(none)"}`;
246
254
  const bi = dechunks.indexOf("</body>");
247
255
  const hi = dechunks.indexOf("</head>");
248
256
  let modified;
249
- if (bi >= 0) modified = Buffer.concat([dechunks.slice(0, bi), Buffer.from(INJECT_SCRIPT, "utf8"), dechunks.slice(bi)]);
250
- else if (hi >= 0) modified = Buffer.concat([dechunks.slice(0, hi), Buffer.from(INJECT_SCRIPT, "utf8"), dechunks.slice(hi)]);
257
+ if (bi >= 0)
258
+ modified = Buffer.concat([dechunks.slice(0, bi), Buffer.from(INJECT_SCRIPT, "utf8"), dechunks.slice(bi)]);
259
+ else if (hi >= 0)
260
+ modified = Buffer.concat([dechunks.slice(0, hi), Buffer.from(INJECT_SCRIPT, "utf8"), dechunks.slice(hi)]);
251
261
  else {
252
262
  client.end();
253
263
  return;
254
264
  }
255
- const newH = { ...resHeaders, "content-type": "text/html; charset=utf-8" };
256
- delete newH["content-length"];
257
- delete newH["transfer-encoding"];
258
- newH["connection"] = "close";
259
- newH["content-length"] = Buffer.byteLength(modified).toString();
260
- const headStr = `HTTP/1.1 ${status} OK\r
261
- ` + Object.entries(newH).map(([k, v]) => `${k}: ${v}`).join("\r\n") + "\r\n\r\n";
265
+ const headStr = buildHttpHeaders(resHeaders, status, Buffer.byteLength(modified), "text/html; charset=utf-8");
262
266
  client.write(Buffer.from(headStr, "utf8"));
263
267
  client.write(modified);
264
268
  }
@@ -290,4 +294,4 @@ export {
290
294
  startInspectProxy,
291
295
  stopAllInspectProxies
292
296
  };
293
- //# sourceMappingURL=chunk-RBPOAAIZ.js.map
297
+ //# sourceMappingURL=chunk-XKIEDGQF.js.map