openfox 2.0.0-beta.0 → 2.0.0-beta.10

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 (48) hide show
  1. package/dist/agent-defaults/code-reviewer.agent.md +2 -1
  2. package/dist/{chat-handler-IVIWOR3D.js → chat-handler-6COBLIDR.js} +14 -27
  3. package/dist/{chunk-CEZNMLOO.js → chunk-7TTEGAO6.js} +12 -13
  4. package/dist/{chunk-JZQ644DE.js → chunk-BE2S4NJX.js} +6 -6
  5. package/dist/{chunk-FQLK5GL5.js → chunk-BVHFMAVN.js} +1 -1
  6. package/dist/{chunk-UFY4I643.js → chunk-C75I2KZM.js} +135 -147
  7. package/dist/{chunk-QFSSKIQ3.js → chunk-CDDMHSZF.js} +4 -4
  8. package/dist/{chunk-RF2JGDSS.js → chunk-DMH6JVPF.js} +13 -10
  9. package/dist/{chunk-NNEHZT3V.js → chunk-EZUR7OEP.js} +11 -3
  10. package/dist/{chunk-CTQ2FS4K.js → chunk-G4SACK4E.js} +221 -104
  11. package/dist/{chunk-ALH4KM2Y.js → chunk-LR5R7EEE.js} +2962 -3249
  12. package/dist/{chunk-XKR3HCAL.js → chunk-NPHYEUYE.js} +128 -34
  13. package/dist/{chunk-PSJIT5LZ.js → chunk-RFNEDBVO.js} +4 -4
  14. package/dist/chunk-RI6GAMNP.js +13 -0
  15. package/dist/{chunk-HHAJ3QF6.js → chunk-UKTPL5ZG.js} +16 -28
  16. package/dist/{chunk-HGAMIPFO.js → chunk-VIIRNJDT.js} +39 -178
  17. package/dist/{chunk-NONI4CRP.js → chunk-XJEOP6XU.js} +5 -32
  18. package/dist/cli/dev.js +1 -1
  19. package/dist/cli/index.js +1 -1
  20. package/dist/compactor-TDNRM3A7.js +9 -0
  21. package/dist/{config-YU7NYZYG.js → config-TDVA7MQN.js} +9 -8
  22. package/dist/{events-OHJWCI3S.js → events-PQ3KTI5H.js} +8 -7
  23. package/dist/{folding-U6UHQAS5.js → folding-CXORTBAU.js} +2 -2
  24. package/dist/{orchestrator-7ZXM4J22.js → orchestrator-ZNGTMZ7W.js} +18 -22
  25. package/dist/package.json +1 -1
  26. package/dist/{processor-TKBJLQ2N.js → processor-WMAU4C2N.js} +8 -9
  27. package/dist/{protocol-BQ12Aw5J.d.ts → protocol-CDOV1pyc.d.ts} +13 -38
  28. package/dist/{protocol-K62EPEGS.js → protocol-CN24IKQN.js} +3 -5
  29. package/dist/{provider-HTJEB3ON.js → provider-BGH4MBLH.js} +25 -10
  30. package/dist/{serve-FGPHMDOC.js → serve-7VMTNIXT.js} +25 -26
  31. package/dist/server/index.d.ts +1 -6
  32. package/dist/server/index.js +15 -16
  33. package/dist/{settings-VRAOAPLA.js → settings-6XX56F3F.js} +2 -2
  34. package/dist/shared/index.d.ts +2 -2
  35. package/dist/shared/index.js +1 -1
  36. package/dist/{tools-Z7X4HXZN.js → tools-CQGEU3JK.js} +11 -13
  37. package/dist/web/assets/index-BF6jgTAb.js +299 -0
  38. package/dist/web/assets/{index-BY8EbT5Z.css → index-CSOB8dwI.css} +1 -1
  39. package/dist/web/index.html +2 -2
  40. package/dist/web/sw.js +1 -1
  41. package/dist/workflow-defaults/default.workflow.json +18 -4
  42. package/package.json +1 -1
  43. package/dist/auto-compaction-UIWTO3H5.js +0 -27
  44. package/dist/chunk-CGZHLM3K.js +0 -70
  45. package/dist/chunk-SZKEGZIB.js +0 -140
  46. package/dist/runtime-config-NPSPMRDA.js +0 -9
  47. package/dist/vision-fallback-3MIZZ6NQ.js +0 -22
  48. package/dist/web/assets/index-BDezz42a.js +0 -299
@@ -1,18 +1,14 @@
1
- import {
2
- getDatabase
3
- } from "./chunk-FBGWG4N6.js";
4
1
  import {
5
2
  buildContextMessagesFromEventHistory,
6
3
  buildMessagesFromStoredEvents,
7
4
  buildSnapshot,
8
5
  foldContextState,
9
6
  foldSessionState,
10
- spreadOptionalMessageFields,
11
- stripPromptContextMessages
12
- } from "./chunk-NONI4CRP.js";
7
+ spreadOptionalMessageFields
8
+ } from "./chunk-XJEOP6XU.js";
13
9
  import {
14
- getRuntimeConfig
15
- } from "./chunk-CGZHLM3K.js";
10
+ getDatabase
11
+ } from "./chunk-FBGWG4N6.js";
16
12
  import {
17
13
  logger
18
14
  } from "./chunk-K44MW7JJ.js";
@@ -105,6 +101,18 @@ var EventStore = class {
105
101
  CREATE INDEX IF NOT EXISTS idx_events_session_type
106
102
  ON events(session_id, event_type)
107
103
  `);
104
+ this.db.exec(`
105
+ CREATE TABLE IF NOT EXISTS tombstones (
106
+ session_id TEXT NOT NULL,
107
+ seq INTEGER NOT NULL,
108
+ timestamp INTEGER NOT NULL,
109
+ UNIQUE(session_id, seq)
110
+ )
111
+ `);
112
+ this.db.exec(`
113
+ CREATE INDEX IF NOT EXISTS idx_tombstones_session_seq
114
+ ON tombstones(session_id, seq)
115
+ `);
108
116
  }
109
117
  // --------------------------------------------------------------------------
110
118
  // Append
@@ -183,10 +191,41 @@ var EventStore = class {
183
191
  * Get all events for a session, optionally starting from a specific seq
184
192
  */
185
193
  getEvents(sessionId, fromSeq) {
186
- const query = fromSeq !== void 0 ? `SELECT * FROM events WHERE session_id = ? AND seq >= ? ORDER BY seq` : `SELECT * FROM events WHERE session_id = ? ORDER BY seq`;
194
+ const query = fromSeq !== void 0 ? `SELECT e.* FROM events e
195
+ LEFT JOIN tombstones t ON e.session_id = t.session_id AND e.seq = t.seq
196
+ WHERE e.session_id = ? AND e.seq >= ? AND t.seq IS NULL
197
+ ORDER BY e.seq` : `SELECT e.* FROM events e
198
+ LEFT JOIN tombstones t ON e.session_id = t.session_id AND e.seq = t.seq
199
+ WHERE e.session_id = ? AND t.seq IS NULL
200
+ ORDER BY e.seq`;
187
201
  const rows = fromSeq !== void 0 ? this.db.prepare(query).all(sessionId, fromSeq) : this.db.prepare(query).all(sessionId);
188
202
  return rows.map((row) => this.rowToStoredEvent(row));
189
203
  }
204
+ /**
205
+ * Soft-delete (tombstone) events by sequence number.
206
+ * Tombstoned events are hidden from getEvents but remain in the database.
207
+ *
208
+ * @param sessionId - The session ID
209
+ * @param seqs - Array of sequence numbers to tombstone
210
+ * @returns The number of events tombstoned
211
+ */
212
+ tombstoneEvents(sessionId, seqs) {
213
+ if (seqs.length === 0) return 0;
214
+ const timestamp = Date.now();
215
+ const insert = this.db.prepare(
216
+ `INSERT OR IGNORE INTO tombstones (session_id, seq, timestamp)
217
+ VALUES (?, ?, ?)`
218
+ );
219
+ let count = 0;
220
+ const transaction = this.db.transaction(() => {
221
+ for (const seq of seqs) {
222
+ const result = insert.run(sessionId, seq, timestamp);
223
+ count += result.changes;
224
+ }
225
+ });
226
+ transaction();
227
+ return count;
228
+ }
190
229
  /**
191
230
  * Get the latest sequence number for a session
192
231
  */
@@ -375,13 +414,10 @@ var EventStore = class {
375
414
  return result.changes;
376
415
  }
377
416
  /**
378
- * One-time storage optimization: delete old snapshots and strip
379
- * promptContext.messages from remaining snapshots across all sessions.
417
+ * One-time storage optimization: delete old snapshots across all sessions.
380
418
  * Safe to run multiple times (idempotent).
381
419
  */
382
420
  optimizeStorage() {
383
- let deletedSnapshots = 0;
384
- let strippedSnapshots = 0;
385
421
  const deleteResult = this.db.prepare(
386
422
  `
387
423
  DELETE FROM events
@@ -397,20 +433,7 @@ var EventStore = class {
397
433
  )
398
434
  `
399
435
  ).run();
400
- deletedSnapshots = deleteResult.changes;
401
- const snapshots = this.db.prepare(`SELECT id, payload FROM events WHERE event_type = 'turn.snapshot'`).all();
402
- const updateStmt = this.db.prepare(`UPDATE events SET payload = ? WHERE id = ?`);
403
- for (const row of snapshots) {
404
- const data = JSON.parse(row.payload);
405
- const messages = data.messages;
406
- if (!messages) continue;
407
- const changed = stripPromptContextMessages(messages);
408
- if (changed) {
409
- updateStmt.run(JSON.stringify(data), row.id);
410
- strippedSnapshots++;
411
- }
412
- }
413
- return { deletedSnapshots, strippedSnapshots };
436
+ return { deletedSnapshots: deleteResult.changes };
414
437
  }
415
438
  /**
416
439
  * Get the latest snapshot sequence number for a session
@@ -521,7 +544,7 @@ function initEventStore(db) {
521
544
  }
522
545
  resetStaleRunningSessions(eventStoreInstance, db);
523
546
  const result = eventStoreInstance.optimizeStorage();
524
- if (result.deletedSnapshots > 0 || result.strippedSnapshots > 0) {
547
+ if (result.deletedSnapshots > 0) {
525
548
  logger.info("Storage optimized", result);
526
549
  }
527
550
  setImmediate(() => {
@@ -808,6 +831,70 @@ function mapSessionSummaryRow(row) {
808
831
  };
809
832
  }
810
833
 
834
+ // src/server/config.ts
835
+ import { z } from "zod";
836
+ var backendSchema = z.enum(["auto", "vllm", "sglang", "ollama", "llamacpp"]).default("auto");
837
+ var envSchema = z.object({
838
+ // New env var name, with fallback to old name for backward compatibility
839
+ OPENFOX_LLM_URL: z.string().url().optional(),
840
+ OPENFOX_VLLM_URL: z.string().url().optional(),
841
+ OPENFOX_BACKEND: backendSchema,
842
+ OPENFOX_MODEL_NAME: z.string().default("qwen3.5-122b-int4-autoround"),
843
+ OPENFOX_MAX_CONTEXT: z.coerce.number().default(2e5),
844
+ OPENFOX_PORT: z.coerce.number().default(10369),
845
+ OPENFOX_HOST: z.string().optional(),
846
+ OPENFOX_WORKDIR: z.string().optional(),
847
+ OPENFOX_DB_PATH: z.string().default("./openfox.db"),
848
+ OPENFOX_LOG_LEVEL: z.enum(["debug", "info", "warn", "error"]).default("info"),
849
+ OPENFOX_DISABLE_THINKING: z.coerce.boolean().default(false),
850
+ OPENFOX_DEV: z.coerce.boolean().default(false)
851
+ });
852
+ function loadConfig() {
853
+ const env = envSchema.parse(process.env);
854
+ const llmUrl = env.OPENFOX_LLM_URL ?? env.OPENFOX_VLLM_URL ?? "http://localhost:8000/v1";
855
+ const workdir = env.OPENFOX_WORKDIR ?? process.cwd();
856
+ return {
857
+ llm: {
858
+ baseUrl: llmUrl,
859
+ model: env.OPENFOX_MODEL_NAME,
860
+ timeout: 3e5,
861
+ // 5 minutes (deprecated, kept for backward compatibility)
862
+ idleTimeout: 3e5,
863
+ // 5 minutes of inactivity
864
+ backend: env.OPENFOX_BACKEND,
865
+ disableThinking: env.OPENFOX_DISABLE_THINKING
866
+ },
867
+ context: {
868
+ maxTokens: env.OPENFOX_MAX_CONTEXT,
869
+ compactionThreshold: 0.85,
870
+ compactionTarget: 0.6
871
+ },
872
+ agent: {
873
+ maxIterations: 10,
874
+ maxConsecutiveFailures: 3,
875
+ toolTimeout: 3e5
876
+ },
877
+ server: {
878
+ port: env.OPENFOX_PORT,
879
+ ...env.OPENFOX_HOST !== void 0 ? { host: env.OPENFOX_HOST } : {}
880
+ },
881
+ database: {
882
+ path: env.OPENFOX_DB_PATH
883
+ },
884
+ mode: env.OPENFOX_DEV ? "development" : "production",
885
+ workdir
886
+ };
887
+ }
888
+
889
+ // src/server/runtime-config.ts
890
+ var runtimeConfig = null;
891
+ function setRuntimeConfig(config) {
892
+ runtimeConfig = config;
893
+ }
894
+ function getRuntimeConfig() {
895
+ return runtimeConfig ?? loadConfig();
896
+ }
897
+
811
898
  // src/server/events/session.ts
812
899
  function toSnapshotMessage(message) {
813
900
  return {
@@ -890,6 +977,10 @@ function getCurrentContextWindowId(sessionId) {
890
977
  const contextResult = foldContextState(events, "");
891
978
  return contextResult.currentContextWindowId || void 0;
892
979
  }
980
+ function getCurrentWindowMessageOptions(sessionId) {
981
+ const contextWindowId = getCurrentContextWindowId(sessionId);
982
+ return contextWindowId ? { contextWindowId } : void 0;
983
+ }
893
984
  function getReadFilesCache(sessionId) {
894
985
  const state = getSessionState(sessionId);
895
986
  return state?.readFiles ?? [];
@@ -976,7 +1067,6 @@ function emitMessageDone(sessionId, messageId, options) {
976
1067
  ...options?.stats !== void 0 && { stats: options.stats },
977
1068
  ...options?.segments !== void 0 && { segments: options.segments },
978
1069
  ...options?.partial !== void 0 && { partial: options.partial },
979
- ...options?.promptContext !== void 0 && { promptContext: options.promptContext },
980
1070
  ...options?.tokenCount !== void 0 && { tokenCount: options.tokenCount }
981
1071
  }
982
1072
  });
@@ -1115,11 +1205,11 @@ function emitChatError(sessionId, error, recoverable) {
1115
1205
  data: { error, recoverable }
1116
1206
  });
1117
1207
  }
1118
- function emitFormatRetry(sessionId, attempt, maxAttempts) {
1208
+ function emitPatternRetry(sessionId, messageId, pattern, field, attempt, maxAttempts, matchedContent) {
1119
1209
  const eventStore = getEventStore();
1120
1210
  eventStore.append(sessionId, {
1121
- type: "format.retry",
1122
- data: { attempt, maxAttempts }
1211
+ type: "pattern.retry",
1212
+ data: { messageId, pattern, field, attempt, maxAttempts, matchedContent }
1123
1213
  });
1124
1214
  }
1125
1215
  function emitTurnSnapshot(sessionId, snapshot) {
@@ -1245,10 +1335,14 @@ export {
1245
1335
  listSessions,
1246
1336
  listSessionsByProject,
1247
1337
  deleteSession,
1338
+ loadConfig,
1339
+ setRuntimeConfig,
1340
+ getRuntimeConfig,
1248
1341
  getSessionState,
1249
1342
  getCurrentWindowMessages,
1250
1343
  getContextMessages,
1251
1344
  getCurrentContextWindowId,
1345
+ getCurrentWindowMessageOptions,
1252
1346
  getReadFilesCache,
1253
1347
  isFileInCache,
1254
1348
  emitSessionInitialized,
@@ -1273,10 +1367,10 @@ export {
1273
1367
  emitContextState,
1274
1368
  emitChatDone,
1275
1369
  emitChatError,
1276
- emitFormatRetry,
1370
+ emitPatternRetry,
1277
1371
  emitTurnSnapshot,
1278
1372
  truncateSessionMessages,
1279
1373
  compactContext,
1280
1374
  getRecentUserPromptsForSession
1281
1375
  };
1282
- //# sourceMappingURL=chunk-XKR3HCAL.js.map
1376
+ //# sourceMappingURL=chunk-NPHYEUYE.js.map
@@ -15,9 +15,9 @@ var SETTINGS_KEYS = {
15
15
  DISPLAY_USER_PRESETS: "display.userPresets",
16
16
  DISPLAY_FOLLOW_SYSTEM_THEME: "display.followSystemTheme",
17
17
  DISPLAY_SHOW_OPEN_IN_EDITOR: "display.showOpenInEditorLinks",
18
- LLM_DISABLE_XML_PROTECTION: "llm.disableXmlProtection",
19
18
  LLM_DYNAMIC_SYSTEM_PROMPT: "llm.dynamicSystemPrompt",
20
- KEYBINDINGS: "keybindings"
19
+ KEYBINDINGS: "keybindings",
20
+ RETRY_PATTERNS: "agent.retryPatterns"
21
21
  };
22
22
  var SETTINGS_DEFAULTS = {
23
23
  [SETTINGS_KEYS.DISPLAY_SHOW_THINKING]: "true",
@@ -29,8 +29,8 @@ var SETTINGS_DEFAULTS = {
29
29
  [SETTINGS_KEYS.DISPLAY_THEME]: JSON.stringify({ preset: "dark" }),
30
30
  [SETTINGS_KEYS.DISPLAY_FOLLOW_SYSTEM_THEME]: "true",
31
31
  [SETTINGS_KEYS.DISPLAY_SHOW_OPEN_IN_EDITOR]: "false",
32
- [SETTINGS_KEYS.LLM_DISABLE_XML_PROTECTION]: "false",
33
32
  [SETTINGS_KEYS.LLM_DYNAMIC_SYSTEM_PROMPT]: "false",
33
+ [SETTINGS_KEYS.RETRY_PATTERNS]: JSON.stringify({ patterns: [], maxRetriesPerTurn: 10 }),
34
34
  [SETTINGS_KEYS.KEYBINDINGS]: JSON.stringify({
35
35
  terminalToggle: { type: "double-press", key: "Control", threshold: 300 },
36
36
  quickAction: { type: "double-press", key: "Shift", threshold: 300 },
@@ -88,4 +88,4 @@ export {
88
88
  deleteSetting,
89
89
  getAllSettings
90
90
  };
91
- //# sourceMappingURL=chunk-PSJIT5LZ.js.map
91
+ //# sourceMappingURL=chunk-RFNEDBVO.js.map
@@ -0,0 +1,13 @@
1
+ // src/server/context/compactor.ts
2
+ function shouldCompact(currentTokens, maxTokens, threshold) {
3
+ return currentTokens > maxTokens * threshold;
4
+ }
5
+ function getCompactionTarget(maxTokens, targetRatio) {
6
+ return Math.floor(maxTokens * targetRatio);
7
+ }
8
+
9
+ export {
10
+ shouldCompact,
11
+ getCompactionTarget
12
+ };
13
+ //# sourceMappingURL=chunk-RI6GAMNP.js.map
@@ -1,14 +1,14 @@
1
1
  import {
2
+ buildModelsUrl,
2
3
  buildNonStreamingCreateParams,
3
4
  buildStreamingCreateParams,
5
+ ensureVersionPrefix,
4
6
  extractThinking,
5
7
  getBackendCapabilities,
6
8
  getModelProfile,
7
- mapFinishReason
8
- } from "./chunk-HGAMIPFO.js";
9
- import {
10
- ensureVisionFallbackConfigLoaded
11
- } from "./chunk-SZKEGZIB.js";
9
+ mapFinishReason,
10
+ stripVersionPrefix
11
+ } from "./chunk-VIIRNJDT.js";
12
12
  import {
13
13
  logger
14
14
  } from "./chunk-K44MW7JJ.js";
@@ -19,7 +19,7 @@ var llmStatus = "unknown";
19
19
  var lastActiveUrl = null;
20
20
  var CACHE_TTL_MS = 3e4;
21
21
  function getCacheKey(url) {
22
- return url.replace(/\/v1\/?$/, "");
22
+ return stripVersionPrefix(url);
23
23
  }
24
24
  async function detectModel(llmBaseUrl, retries = 3, silent = false) {
25
25
  const cacheKey = getCacheKey(llmBaseUrl);
@@ -30,7 +30,7 @@ async function detectModel(llmBaseUrl, retries = 3, silent = false) {
30
30
  llmStatus = "connected";
31
31
  return cached.model;
32
32
  }
33
- const url = llmBaseUrl.includes("/v1") ? `${llmBaseUrl}/models` : `${llmBaseUrl}/v1/models`;
33
+ const url = buildModelsUrl(llmBaseUrl);
34
34
  for (let attempt = 1; attempt <= retries; attempt++) {
35
35
  try {
36
36
  if (silent) {
@@ -140,7 +140,7 @@ var LLMError = class extends OpenFoxError {
140
140
 
141
141
  // src/server/llm/client.ts
142
142
  function createLLMClient(config, initialBackend = "unknown") {
143
- const baseURL = config.llm.baseUrl.includes("/v1") ? config.llm.baseUrl : `${config.llm.baseUrl}/v1`;
143
+ const baseURL = ensureVersionPrefix(config.llm.baseUrl);
144
144
  const openai = new OpenAI({
145
145
  baseURL,
146
146
  apiKey: config.llm.apiKey ?? "not-needed"
@@ -187,23 +187,13 @@ function createLLMClient(config, initialBackend = "unknown") {
187
187
  });
188
188
  try {
189
189
  const shouldDisableThinking = disableThinking || request.disableThinking === true;
190
- await ensureVisionFallbackConfigLoaded();
191
- const { isVisionFallbackEnabled } = await import("./vision-fallback-3MIZZ6NQ.js");
192
- const paramsOptions = {
190
+ const { params: createParams } = await buildNonStreamingCreateParams({
193
191
  model,
194
192
  request,
195
193
  profile,
196
194
  capabilities,
197
- disableThinking: shouldDisableThinking,
198
- visionFallbackEnabled: isVisionFallbackEnabled()
199
- };
200
- if (request.onVisionFallbackStart) {
201
- paramsOptions.onVisionFallbackStart = request.onVisionFallbackStart;
202
- }
203
- if (request.onVisionFallbackDone) {
204
- paramsOptions.onVisionFallbackDone = request.onVisionFallbackDone;
205
- }
206
- const { params: createParams } = await buildNonStreamingCreateParams(paramsOptions);
195
+ disableThinking: shouldDisableThinking
196
+ });
207
197
  const response = await openai.chat.completions.create(createParams, {
208
198
  signal: request.signal
209
199
  });
@@ -264,18 +254,13 @@ function createLLMClient(config, initialBackend = "unknown") {
264
254
  idleTimeout
265
255
  });
266
256
  try {
267
- await ensureVisionFallbackConfigLoaded();
268
- const { isVisionFallbackEnabled } = await import("./vision-fallback-3MIZZ6NQ.js");
269
257
  const shouldDisableThinking = disableThinking || request.disableThinking === true;
270
258
  const createParams = await buildStreamingCreateParams({
271
259
  model,
272
260
  request,
273
261
  profile,
274
262
  capabilities,
275
- disableThinking: shouldDisableThinking,
276
- visionFallbackEnabled: isVisionFallbackEnabled(),
277
- onVisionFallbackStart: request.onVisionFallbackStart,
278
- onVisionFallbackDone: request.onVisionFallbackDone
263
+ disableThinking: shouldDisableThinking
279
264
  });
280
265
  const { params: streamingParams } = createParams;
281
266
  const stream = await openai.chat.completions.create(streamingParams, {
@@ -298,6 +283,8 @@ function createLLMClient(config, initialBackend = "unknown") {
298
283
  idleTimeoutController.abort();
299
284
  }
300
285
  }, 100);
286
+ const onAbort = () => clearInterval(idleTimer);
287
+ request.signal?.addEventListener("abort", onAbort, { once: true });
301
288
  try {
302
289
  for await (const chunk of stream) {
303
290
  if (idleTimeoutController.signal.aborted) {
@@ -412,6 +399,7 @@ function createLLMClient(config, initialBackend = "unknown") {
412
399
  }
413
400
  } finally {
414
401
  clearInterval(idleTimer);
402
+ request.signal?.removeEventListener("abort", onAbort);
415
403
  }
416
404
  if (tagBuffer) {
417
405
  if (inThinking) {
@@ -478,4 +466,4 @@ export {
478
466
  getLlmStatus,
479
467
  clearModelCache
480
468
  };
481
- //# sourceMappingURL=chunk-HHAJ3QF6.js.map
469
+ //# sourceMappingURL=chunk-UKTPL5ZG.js.map