openfox 2.0.96 → 2.0.97

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.0.97 - 2026-07-27
4
+
5
+ ### Enhancements
6
+
7
+ - **"esc to interrupt" hint hidden on mobile** — the keyboard shortcut hint no longer clutters the UI on small screens where keyboard shortcuts don't apply.
8
+
9
+ ### Bug Fixes
10
+
11
+ - **Mistral structured content blocks now render correctly** — models with `reasoning_effort` (like `mistral-small-2603`) previously showed `[object Object]` for every streaming chunk. Text and thinking content are now properly extracted and displayed.
12
+
3
13
  ## 2.0.96 - 2026-07-26
4
14
 
5
15
  ### Features
package/dist/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.0.97 - 2026-07-27
4
+
5
+ ### Enhancements
6
+
7
+ - **"esc to interrupt" hint hidden on mobile** — the keyboard shortcut hint no longer clutters the UI on small screens where keyboard shortcuts don't apply.
8
+
9
+ ### Bug Fixes
10
+
11
+ - **Mistral structured content blocks now render correctly** — models with `reasoning_effort` (like `mistral-small-2603`) previously showed `[object Object]` for every streaming chunk. Text and thinking content are now properly extracted and displayed.
12
+
3
13
  ## 2.0.96 - 2026-07-26
4
14
 
5
15
  ### Features
@@ -2,7 +2,7 @@ import {
2
2
  buildRunChatTurnParams,
3
3
  finalizeTurnCompletion,
4
4
  generateSessionNameForSession
5
- } from "./chunk-BG4EVBLJ.js";
5
+ } from "./chunk-T3INQCET.js";
6
6
  import {
7
7
  runChatTurn
8
8
  } from "./chunk-C3XL7X4E.js";
@@ -165,4 +165,4 @@ export {
165
165
  startChatSession,
166
166
  stopSessionExecution
167
167
  };
168
- //# sourceMappingURL=chat-handler-5OJMACXB.js.map
168
+ //# sourceMappingURL=chat-handler-XXXMTO7W.js.map
@@ -23,6 +23,22 @@ import {
23
23
  } from "./chunk-K44MW7JJ.js";
24
24
 
25
25
  // src/server/llm/client.ts
26
+ function extractContentFromBlocks(blocks) {
27
+ let text = "";
28
+ let thinking = "";
29
+ for (const block of blocks) {
30
+ if (block.type === "text") {
31
+ text += block.text;
32
+ } else if (block.type === "thinking") {
33
+ for (const part of block.thinking) {
34
+ if (part.type === "text") {
35
+ thinking += part.text;
36
+ }
37
+ }
38
+ }
39
+ }
40
+ return { text, thinking };
41
+ }
26
42
  function createLLMClient(config, initialBackend = "unknown") {
27
43
  const baseURL = ensureVersionPrefix(config.llm.baseUrl);
28
44
  const httpClient = new OpenAIHttpClient({
@@ -91,8 +107,16 @@ function createLLMClient(config, initialBackend = "unknown") {
91
107
  throw new LLMError("No completion choice returned");
92
108
  }
93
109
  const message = choice.message;
94
- const content = message.content ?? "";
95
- const thinkingContent = getThinking(message, thinkingField) ?? "";
110
+ let content;
111
+ let thinkingContent;
112
+ if (Array.isArray(message.content)) {
113
+ const extracted = extractContentFromBlocks(message.content);
114
+ content = extracted.text;
115
+ thinkingContent = extracted.thinking;
116
+ } else {
117
+ content = message.content ?? "";
118
+ thinkingContent = getThinking(message, thinkingField) ?? "";
119
+ }
96
120
  const toolCalls = message.tool_calls?.map((tc) => {
97
121
  const { arguments: args, parseError } = parseToolArguments(tc.function.arguments, {
98
122
  id: tc.id,
@@ -190,8 +214,20 @@ function createLLMClient(config, initialBackend = "unknown") {
190
214
  yield { type: "thinking_delta", content: reasoning };
191
215
  }
192
216
  if (delta.content) {
193
- fullContent += delta.content;
194
- yield { type: "text_delta", content: delta.content };
217
+ if (Array.isArray(delta.content)) {
218
+ const extracted = extractContentFromBlocks(delta.content);
219
+ if (extracted.text) {
220
+ fullContent += extracted.text;
221
+ yield { type: "text_delta", content: extracted.text };
222
+ }
223
+ if (extracted.thinking) {
224
+ fullThinking += extracted.thinking;
225
+ yield { type: "thinking_delta", content: extracted.thinking };
226
+ }
227
+ } else {
228
+ fullContent += delta.content;
229
+ yield { type: "text_delta", content: delta.content };
230
+ }
195
231
  }
196
232
  if (delta.tool_calls) {
197
233
  for (const tc of delta.tool_calls) {
@@ -268,4 +304,4 @@ function createLLMClient(config, initialBackend = "unknown") {
268
304
  export {
269
305
  createLLMClient
270
306
  };
271
- //# sourceMappingURL=chunk-SJJVNSA6.js.map
307
+ //# sourceMappingURL=chunk-2VJIQEZE.js.map
@@ -2,7 +2,7 @@ import {
2
2
  generateSessionNameForSession,
3
3
  getSessionMessageCount,
4
4
  needsNameGeneration
5
- } from "./chunk-BG4EVBLJ.js";
5
+ } from "./chunk-T3INQCET.js";
6
6
  import {
7
7
  runAgentTurn,
8
8
  runChatTurn
@@ -2477,4 +2477,4 @@ export {
2477
2477
  signalMcpReady,
2478
2478
  createWebSocketServer
2479
2479
  };
2480
- //# sourceMappingURL=chunk-WS7EY4CU.js.map
2480
+ //# sourceMappingURL=chunk-CCEG3AFM.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createLLMClient
3
- } from "./chunk-SJJVNSA6.js";
3
+ } from "./chunk-2VJIQEZE.js";
4
4
  import {
5
5
  getModelProfile
6
6
  } from "./chunk-V4IE7HJY.js";
@@ -807,4 +807,4 @@ export {
807
807
  parseDefaultModelSelection,
808
808
  createProviderManager
809
809
  };
810
- //# sourceMappingURL=chunk-YPBV47DH.js.map
810
+ //# sourceMappingURL=chunk-CSKPPHD3.js.map
@@ -0,0 +1,7 @@
1
+ // src/constants.ts
2
+ var VERSION = "2.0.97";
3
+
4
+ export {
5
+ VERSION
6
+ };
7
+ //# sourceMappingURL=chunk-DRMYR6BF.js.map
@@ -21,7 +21,7 @@ import {
21
21
  tokenFromPassword,
22
22
  verifyPassword,
23
23
  workflowExists
24
- } from "./chunk-WS7EY4CU.js";
24
+ } from "./chunk-CCEG3AFM.js";
25
25
  import {
26
26
  openFolder
27
27
  } from "./chunk-62QCBNPE.js";
@@ -114,7 +114,7 @@ import {
114
114
  } from "./chunk-NLN5LPQ4.js";
115
115
  import {
116
116
  VERSION
117
- } from "./chunk-7B3XSBRL.js";
117
+ } from "./chunk-DRMYR6BF.js";
118
118
  import {
119
119
  clearWorkflowExecution,
120
120
  createSession,
@@ -163,7 +163,7 @@ import {
163
163
  detectModel,
164
164
  getLlmStatus,
165
165
  parseDefaultModelSelection
166
- } from "./chunk-YPBV47DH.js";
166
+ } from "./chunk-CSKPPHD3.js";
167
167
  import {
168
168
  getModelProfile
169
169
  } from "./chunk-V4IE7HJY.js";
@@ -5715,7 +5715,7 @@ async function createServerHandle(config3) {
5715
5715
  setMcpTools(mcpTools);
5716
5716
  logger.info("MCP tools registered", { count: mcpTools.length });
5717
5717
  }
5718
- const { signalMcpReady } = await import("./server-4BHDA6PA.js");
5718
+ const { signalMcpReady } = await import("./server-KIRPYPP6.js");
5719
5719
  signalMcpReady();
5720
5720
  });
5721
5721
  const app = express();
@@ -6243,7 +6243,7 @@ All file and git operations should use this branch.
6243
6243
  if (!session) {
6244
6244
  return res.status(404).json({ error: "Session not found" });
6245
6245
  }
6246
- const { stopSessionExecution } = await import("./chat-handler-5OJMACXB.js");
6246
+ const { stopSessionExecution } = await import("./chat-handler-XXXMTO7W.js");
6247
6247
  const { cancelQuestionsForSession, cancelPathConfirmationsForSession } = await import("./tools-I3BAXRVD.js");
6248
6248
  sessionManager.clearMessageQueue(sessionId);
6249
6249
  stopSessionExecution(sessionId, sessionManager);
@@ -6631,7 +6631,7 @@ All file and git operations should use this branch.
6631
6631
  if (!session) {
6632
6632
  return res.status(404).json({ error: "Session not found" });
6633
6633
  }
6634
- const { stopSessionExecution } = await import("./chat-handler-5OJMACXB.js");
6634
+ const { stopSessionExecution } = await import("./chat-handler-XXXMTO7W.js");
6635
6635
  const { cancelQuestionsForSession, cancelPathConfirmationsForSession } = await import("./tools-I3BAXRVD.js");
6636
6636
  const queuedMessages = sessionManager.getQueueState(sessionId);
6637
6637
  sessionManager.clearMessageQueue(sessionId);
@@ -7000,7 +7000,7 @@ All file and git operations should use this branch.
7000
7000
  const backend = req.query["backend"];
7001
7001
  if (!url) return res.status(400).json({ error: "url is required" });
7002
7002
  try {
7003
- const { fetchModelsWithContext } = await import("./provider-manager-PBOF77RQ.js");
7003
+ const { fetchModelsWithContext } = await import("./provider-manager-23O5QVDJ.js");
7004
7004
  const { getModelProfile: getModelProfile2 } = await import("./profiles-5J7F4BML.js");
7005
7005
  const models = await fetchModelsWithContext(
7006
7006
  url,
@@ -7824,7 +7824,7 @@ All file and git operations should use this branch.
7824
7824
  const state = sessionManager.getContextState(sessionId);
7825
7825
  wssExports.broadcastForSession(sessionId, createContextStateMessage(state));
7826
7826
  });
7827
- const { QueueProcessor } = await import("./processor-HX4FXDDT.js");
7827
+ const { QueueProcessor } = await import("./processor-F3EZWNPO.js");
7828
7828
  const queueProcessor = new QueueProcessor({
7829
7829
  sessionManager,
7830
7830
  providerManager,
@@ -7908,4 +7908,4 @@ export {
7908
7908
  createServerHandle,
7909
7909
  createServer
7910
7910
  };
7911
- //# sourceMappingURL=chunk-ML5ZU6VS.js.map
7911
+ //# sourceMappingURL=chunk-GPGJBDI6.js.map
@@ -163,7 +163,7 @@ async function runCli(options) {
163
163
  break;
164
164
  }
165
165
  case "provider": {
166
- const { runProviderCommand } = await import("./provider-LZ3XMDX6.js");
166
+ const { runProviderCommand } = await import("./provider-5KFIZM5T.js");
167
167
  const [, subcommand] = positionals;
168
168
  await runProviderCommand(mode, subcommand);
169
169
  break;
@@ -200,7 +200,7 @@ async function runCli(options) {
200
200
  break;
201
201
  }
202
202
  case "update": {
203
- const { runUpdate } = await import("./update-2Z6TXHFH.js");
203
+ const { runUpdate } = await import("./update-NZZWLDK7.js");
204
204
  const code = await runUpdate();
205
205
  if (code !== 0) {
206
206
  process.exit(code);
@@ -213,7 +213,7 @@ async function runCli(options) {
213
213
  if (!configExists) {
214
214
  await runNetworkSetup(mode);
215
215
  }
216
- const { runServe } = await import("./serve-VGATDJX5.js");
216
+ const { runServe } = await import("./serve-JACH7OQW.js");
217
217
  const serveOptions = { mode };
218
218
  if (values.port) serveOptions.port = parseInt(values.port);
219
219
  if (values["no-browser"] === true) serveOptions.openBrowser = false;
@@ -225,4 +225,4 @@ async function runCli(options) {
225
225
  export {
226
226
  runCli
227
227
  };
228
- //# sourceMappingURL=chunk-3DAZIZ7E.js.map
228
+ //# sourceMappingURL=chunk-HJEATCSM.js.map
@@ -153,7 +153,7 @@ async function generateSessionNameForSession(sessionId, userMessage, deps, signa
153
153
  client = deps.getLLMClient();
154
154
  client.setModel(providerConfig.model);
155
155
  } else if (providerConfig) {
156
- const { createLLMClient } = await import("./client-RENSCJPZ.js");
156
+ const { createLLMClient } = await import("./client-IK47PLPP.js");
157
157
  client = createLLMClient({
158
158
  llm: {
159
159
  baseUrl: providerConfig.baseUrl,
@@ -204,4 +204,4 @@ export {
204
204
  needsNameGeneration,
205
205
  generateSessionNameForSession
206
206
  };
207
- //# sourceMappingURL=chunk-BG4EVBLJ.js.map
207
+ //# sourceMappingURL=chunk-T3INQCET.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-3DAZIZ7E.js";
4
+ } from "../chunk-HJEATCSM.js";
5
5
  import "../chunk-XY3LESVZ.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-3DAZIZ7E.js";
4
+ } from "../chunk-HJEATCSM.js";
5
5
  import "../chunk-XY3LESVZ.js";
6
6
  import {
7
7
  logger
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createLLMClient
3
- } from "./chunk-SJJVNSA6.js";
3
+ } from "./chunk-2VJIQEZE.js";
4
4
  import "./chunk-V4IE7HJY.js";
5
5
  import "./chunk-YHEQTVFV.js";
6
6
  import "./chunk-HNCM3D7Y.js";
@@ -13,4 +13,4 @@ import "./chunk-5WRI5ZAA.js";
13
13
  export {
14
14
  createLLMClient
15
15
  };
16
- //# sourceMappingURL=client-RENSCJPZ.js.map
16
+ //# sourceMappingURL=client-IK47PLPP.js.map
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openfox",
3
- "version": "2.0.96",
3
+ "version": "2.0.97",
4
4
  "description": "Local-LLM-first agentic coding assistant",
5
5
  "type": "module",
6
6
  "bin": {
@@ -2,7 +2,7 @@ import {
2
2
  buildRunChatTurnParams,
3
3
  finalizeTurnCompletion,
4
4
  generateSessionNameForSession
5
- } from "./chunk-BG4EVBLJ.js";
5
+ } from "./chunk-T3INQCET.js";
6
6
  import "./chunk-O5YWFX7H.js";
7
7
  import "./chunk-ZASSAZ73.js";
8
8
  import "./chunk-HAFRPV7I.js";
@@ -233,4 +233,4 @@ var QueueProcessor = class {
233
233
  export {
234
234
  QueueProcessor
235
235
  };
236
- //# sourceMappingURL=processor-HX4FXDDT.js.map
236
+ //# sourceMappingURL=processor-F3EZWNPO.js.map
@@ -11,9 +11,9 @@ import {
11
11
  import {
12
12
  detectModel,
13
13
  fetchAvailableModelsFromBackend
14
- } from "./chunk-YPBV47DH.js";
14
+ } from "./chunk-CSKPPHD3.js";
15
15
  import "./chunk-J2GP3J3X.js";
16
- import "./chunk-SJJVNSA6.js";
16
+ import "./chunk-2VJIQEZE.js";
17
17
  import "./chunk-V4IE7HJY.js";
18
18
  import "./chunk-YHEQTVFV.js";
19
19
  import "./chunk-HNCM3D7Y.js";
@@ -398,4 +398,4 @@ export {
398
398
  runProviderRemove,
399
399
  runProviderUse
400
400
  };
401
- //# sourceMappingURL=provider-LZ3XMDX6.js.map
401
+ //# sourceMappingURL=provider-5KFIZM5T.js.map
@@ -3,9 +3,9 @@ import {
3
3
  fetchAvailableModelsFromBackend,
4
4
  fetchModelsWithContext,
5
5
  parseDefaultModelSelection
6
- } from "./chunk-YPBV47DH.js";
6
+ } from "./chunk-CSKPPHD3.js";
7
7
  import "./chunk-J2GP3J3X.js";
8
- import "./chunk-SJJVNSA6.js";
8
+ import "./chunk-2VJIQEZE.js";
9
9
  import "./chunk-V4IE7HJY.js";
10
10
  import "./chunk-YHEQTVFV.js";
11
11
  import "./chunk-HNCM3D7Y.js";
@@ -21,4 +21,4 @@ export {
21
21
  fetchModelsWithContext,
22
22
  parseDefaultModelSelection
23
23
  };
24
- //# sourceMappingURL=provider-manager-PBOF77RQ.js.map
24
+ //# sourceMappingURL=provider-manager-23O5QVDJ.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  createServer
3
- } from "./chunk-ML5ZU6VS.js";
4
- import "./chunk-WS7EY4CU.js";
3
+ } from "./chunk-GPGJBDI6.js";
4
+ import "./chunk-CCEG3AFM.js";
5
5
  import "./chunk-62QCBNPE.js";
6
- import "./chunk-BG4EVBLJ.js";
6
+ import "./chunk-T3INQCET.js";
7
7
  import "./chunk-C3XL7X4E.js";
8
8
  import "./chunk-O5YWFX7H.js";
9
9
  import "./chunk-ZASSAZ73.js";
@@ -27,15 +27,15 @@ import "./chunk-KNYPBXPW.js";
27
27
  import "./chunk-NLN5LPQ4.js";
28
28
  import {
29
29
  VERSION
30
- } from "./chunk-7B3XSBRL.js";
30
+ } from "./chunk-DRMYR6BF.js";
31
31
  import "./chunk-O2PLNJIU.js";
32
32
  import "./chunk-ZIMGU5ZH.js";
33
33
  import {
34
34
  loadConfig
35
35
  } from "./chunk-3LRYZ7R3.js";
36
- import "./chunk-YPBV47DH.js";
36
+ import "./chunk-CSKPPHD3.js";
37
37
  import "./chunk-J2GP3J3X.js";
38
- import "./chunk-SJJVNSA6.js";
38
+ import "./chunk-2VJIQEZE.js";
39
39
  import "./chunk-V4IE7HJY.js";
40
40
  import "./chunk-YHEQTVFV.js";
41
41
  import "./chunk-HNCM3D7Y.js";
@@ -219,4 +219,4 @@ async function runServe(options) {
219
219
  export {
220
220
  runServe
221
221
  };
222
- //# sourceMappingURL=serve-VGATDJX5.js.map
222
+ //# sourceMappingURL=serve-JACH7OQW.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  createServer,
3
3
  createServerHandle
4
- } from "../chunk-ML5ZU6VS.js";
5
- import "../chunk-WS7EY4CU.js";
4
+ } from "../chunk-GPGJBDI6.js";
5
+ import "../chunk-CCEG3AFM.js";
6
6
  import "../chunk-62QCBNPE.js";
7
- import "../chunk-BG4EVBLJ.js";
7
+ import "../chunk-T3INQCET.js";
8
8
  import "../chunk-C3XL7X4E.js";
9
9
  import "../chunk-O5YWFX7H.js";
10
10
  import "../chunk-ZASSAZ73.js";
@@ -26,13 +26,13 @@ import "../chunk-K2O7JTCX.js";
26
26
  import "../chunk-MRWR3SIT.js";
27
27
  import "../chunk-KNYPBXPW.js";
28
28
  import "../chunk-NLN5LPQ4.js";
29
- import "../chunk-7B3XSBRL.js";
29
+ import "../chunk-DRMYR6BF.js";
30
30
  import "../chunk-O2PLNJIU.js";
31
31
  import "../chunk-ZIMGU5ZH.js";
32
32
  import "../chunk-3LRYZ7R3.js";
33
- import "../chunk-YPBV47DH.js";
33
+ import "../chunk-CSKPPHD3.js";
34
34
  import "../chunk-J2GP3J3X.js";
35
- import "../chunk-SJJVNSA6.js";
35
+ import "../chunk-2VJIQEZE.js";
36
36
  import "../chunk-V4IE7HJY.js";
37
37
  import "../chunk-YHEQTVFV.js";
38
38
  import "../chunk-HNCM3D7Y.js";
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  createWebSocketServer,
3
3
  signalMcpReady
4
- } from "./chunk-WS7EY4CU.js";
5
- import "./chunk-BG4EVBLJ.js";
4
+ } from "./chunk-CCEG3AFM.js";
5
+ import "./chunk-T3INQCET.js";
6
6
  import "./chunk-C3XL7X4E.js";
7
7
  import "./chunk-O5YWFX7H.js";
8
8
  import "./chunk-ZASSAZ73.js";
@@ -43,4 +43,4 @@ export {
43
43
  createWebSocketServer,
44
44
  signalMcpReady
45
45
  };
46
- //# sourceMappingURL=server-4BHDA6PA.js.map
46
+ //# sourceMappingURL=server-KIRPYPP6.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  VERSION
3
- } from "./chunk-7B3XSBRL.js";
3
+ } from "./chunk-DRMYR6BF.js";
4
4
  import "./chunk-5WRI5ZAA.js";
5
5
 
6
6
  // src/cli/update.ts
@@ -46,4 +46,4 @@ async function runUpdate(options = {}) {
46
46
  export {
47
47
  runUpdate
48
48
  };
49
- //# sourceMappingURL=update-2Z6TXHFH.js.map
49
+ //# sourceMappingURL=update-NZZWLDK7.js.map