openfox 2.0.135 → 2.0.137

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 (87) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/CHANGELOG.md +33 -0
  3. package/dist/agent-defaults/builder.agent.md +1 -0
  4. package/dist/agent-defaults/planner.agent.md +1 -0
  5. package/dist/{ask-UBIRH3SO.js → ask-46J5WYRL.js} +2 -2
  6. package/dist/{auto-config-5VSNLVNI.js → auto-config-2A7Y2WOK.js} +25 -6
  7. package/dist/{backend-NDBY3DAQ.js → backend-24FTDSHF.js} +4 -2
  8. package/dist/{chat-handler-WGDFMOOD.js → chat-handler-ZCPFNHTE.js} +30 -26
  9. package/dist/{chunk-QZOV4OVN.js → chunk-2OO46UAW.js} +5 -5
  10. package/dist/{chunk-7QMWYNVF.js → chunk-4LLGI372.js} +2 -2
  11. package/dist/chunk-4SBVW4UH.js +24 -0
  12. package/dist/{chunk-ZMK4VX7V.js → chunk-64YDOCQR.js} +53 -21
  13. package/dist/{chunk-VHLD6PCZ.js → chunk-6TQNTFJW.js} +17 -11
  14. package/dist/{chunk-UV6IH6HK.js → chunk-AKWJMMEJ.js} +15 -1
  15. package/dist/{chunk-ORCQ3EXQ.js → chunk-BHVR2YS5.js} +2 -2
  16. package/dist/{chunk-S67WIWUG.js → chunk-DG2YSWMC.js} +40 -6
  17. package/dist/chunk-FG4G4EWB.js +7 -0
  18. package/dist/{chunk-NFEZATSN.js → chunk-FIQPKLDY.js} +8 -8
  19. package/dist/chunk-FSSUPWYO.js +336 -0
  20. package/dist/{chunk-5UQ4CKOA.js → chunk-G5GUQKLS.js} +27 -6
  21. package/dist/{chunk-7ET46SNE.js → chunk-HEYU7FAY.js} +3 -3
  22. package/dist/{chunk-4R5GV7RW.js → chunk-JIS6C6PA.js} +21 -21
  23. package/dist/{chunk-5H5NRWHA.js → chunk-LQPAM55V.js} +12 -10
  24. package/dist/{chunk-MEEUXRFL.js → chunk-MMGHIPBU.js} +72 -54
  25. package/dist/{chunk-O3RCSKUH.js → chunk-MOYWDP73.js} +2 -2
  26. package/dist/{chunk-J3NMNYGM.js → chunk-N5JKVNLH.js} +2 -2
  27. package/dist/{chunk-DWA4IE65.js → chunk-Q33DL67W.js} +2 -2
  28. package/dist/{chunk-OZWHRBDY.js → chunk-QBWJCO5K.js} +12 -29
  29. package/dist/{chunk-EUOWCVU6.js → chunk-QMU3ZY2C.js} +37 -341
  30. package/dist/{chunk-CTWZPN7G.js → chunk-QUAEH3MP.js} +29 -1
  31. package/dist/{chunk-BIZFY3QP.js → chunk-RS7I4W5A.js} +212 -148
  32. package/dist/{chunk-5UMXFLET.js → chunk-SAGDTQXD.js} +3 -3
  33. package/dist/{chunk-UKIUQAQZ.js → chunk-U7XCK7WL.js} +4 -4
  34. package/dist/{chunk-JURM3RPZ.js → chunk-V5AC2TV7.js} +8 -13
  35. package/dist/{chunk-JE7LW7Y6.js → chunk-VIJVLLPT.js} +12 -3
  36. package/dist/{chunk-2AI7VYPN.js → chunk-VKMPR25F.js} +9 -3
  37. package/dist/{chunk-IAT2LBIX.js → chunk-WOIQO7ZC.js} +4 -4
  38. package/dist/chunk-WQUCCHOY.js +1155 -0
  39. package/dist/{chunk-F2MOHHXB.js → chunk-X4PVR6AW.js} +2 -2
  40. package/dist/chunk-XG3AUMPI.js +72 -0
  41. package/dist/{chunk-I5ODJKYM.js → chunk-XWWRZSK7.js} +162 -6
  42. package/dist/{chunk-GP3CLMPQ.js → chunk-ZJ2IHOVN.js} +23 -23
  43. package/dist/{chunk-ESZQTFQP.js → chunk-ZQENKB7X.js} +86 -1010
  44. package/dist/cli/dev.js +1 -1
  45. package/dist/cli/index.js +1 -1
  46. package/dist/client-MVI3J7SN.js +18 -0
  47. package/dist/{client-pure-FLKP6PTI.js → client-pure-YZ4IGCU4.js} +4 -2
  48. package/dist/{compactor-454UEIEX.js → compactor-KDTY4ERE.js} +14 -12
  49. package/dist/describe-image-EFHMWGWI.js +30 -0
  50. package/dist/{dynamic-context-LKC6JYLQ.js → dynamic-context-HL4RGNHK.js} +12 -10
  51. package/dist/{events-335XAKFK.js → events-ADE2KEHI.js} +7 -9
  52. package/dist/{export-import-3WMRLO4A.js → export-import-6OUEANYH.js} +7 -7
  53. package/dist/{folding-H7JTX6KI.js → folding-CM63AVSB.js} +6 -6
  54. package/dist/{http-client-A445WYZU.js → http-client-C6UYWVWZ.js} +3 -3
  55. package/dist/launch-L5NSPAAX.js +58 -0
  56. package/dist/{manager-ZACEUL5P.js → manager-FSPRJCYT.js} +4 -4
  57. package/dist/{model-catalog-2PCKTYGW.js → model-catalog-Y5MA5OZP.js} +2 -2
  58. package/dist/{orchestrator-JGJWTRO5.js → orchestrator-FMWKMD54.js} +29 -25
  59. package/dist/package.json +1 -1
  60. package/dist/{path-security-4LROI7F4.js → path-security-DND2R3RP.js} +8 -8
  61. package/dist/{platform-XPMZKAUB.js → platform-KPKYBU54.js} +3 -3
  62. package/dist/{processor-MSQP63ML.js → processor-SB5X44PX.js} +29 -25
  63. package/dist/{provider-JWUNG2TD.js → provider-SOC6Z25R.js} +10 -8
  64. package/dist/{provider-manager-2KKZ37XJ.js → provider-manager-Y53SVVQ3.js} +10 -8
  65. package/dist/{registry-BEIR7Y5G.js → registry-FMDMGIUB.js} +3 -3
  66. package/dist/{serve-CW5C3CBZ.js → serve-VONTGJCK.js} +41 -32
  67. package/dist/server/index.d.ts +1 -0
  68. package/dist/server/index.js +34 -30
  69. package/dist/server-MI2LZK3W.js +61 -0
  70. package/dist/{service-XIUNS5XV.js → service-NKLQH647.js} +12 -9
  71. package/dist/{session-overrides-LYW5PJ3R.js → session-overrides-ANQBKV74.js} +11 -7
  72. package/dist/{sessions-AOK3AGHY.js → sessions-GLYACE5R.js} +4 -4
  73. package/dist/{settings-ZJPM6PQV.js → settings-WH6BVQCP.js} +4 -2
  74. package/dist/{tasks-3JJWJJ3X.js → tasks-GPM3JAE6.js} +14 -10
  75. package/dist/tool-adapter-ZY4FC4C4.js +9 -0
  76. package/dist/{tools-E63MOJBO.js → tools-WLJJ3ILO.js} +27 -23
  77. package/dist/{update-XVXNSSDK.js → update-6ZSQJQJB.js} +2 -2
  78. package/dist/web/assets/{index-wTFCxQAw.js → index-CfFwerN2.js} +84 -84
  79. package/dist/web/assets/{index-Bg_Z8i3F.css → index-ChJjYovg.css} +1 -1
  80. package/dist/web/index.html +2 -2
  81. package/dist/web/sw.js +1 -1
  82. package/package.json +1 -1
  83. package/dist/chunk-WY3PWHWY.js +0 -7
  84. package/dist/client-VVYOWXRR.js +0 -16
  85. package/dist/launch-GJ7EHQRI.js +0 -54
  86. package/dist/server-ZHEB7XS2.js +0 -57
  87. package/dist/tool-adapter-FJAFLDZA.js +0 -8
package/CHANGELOG.md CHANGED
@@ -1,5 +1,38 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.0.137 - 2026-09-03
4
+
5
+ ### Bug Fixes
6
+
7
+ - **Image descriptions survive reloads** — vision details no longer drop from tool results after a page reload
8
+
9
+ ## 2.0.136 - 2026-09-02
10
+
11
+ ### Features
12
+
13
+ - **Model favorites** — heart-toggle any model and pin a Favorites section at the top of the model selector
14
+ - **Model selector display settings** — full-height sizing, and start with providers or favorites collapsed
15
+ - **Describe-image tool for non-vision models** — delegates image questions to a vision-capable fallback
16
+ - **Sync button in the provider editor** — refetch the model catalog without losing current selections
17
+
18
+ ### Enhancements
19
+
20
+ - **Hover tooltips for truncated tool-call labels** — reveal the full path or command
21
+ - **Compact provider auth badge** — the Connected/Connect button is smaller and better aligned
22
+
23
+ ### Bug Fixes
24
+
25
+ - **Localized modal footer buttons** — Cancel/Save now translate to French
26
+ - **Tool schemas work with strict providers** — Vertex AI, Antigravity, and Gemini no longer reject tool calls
27
+ - **New sessions inherit project MCP overrides** — forked sessions keep the parent's MCP state too
28
+ - **No more duplicate models after a sync** — merged model families and selections survive a catalog refresh
29
+ - **Deleting a provider cleans up its sessions** — no dead provider pins, wrong context windows, or auto-compaction
30
+ - **Ollama vision images work again** — content arrays are converted to Ollama's native format
31
+ - **grep patterns no longer trigger path confirmations** — only real file operands are checked
32
+ - **Quoted paths can't sneak past path security** — nested quotes are now detected
33
+ - **DeepSeek reasoning preserved** — chain-of-thought is echoed under reasoning_content instead of being dropped
34
+ - **Per-model reasoning efforts accepted** — validation now honors each model's modes and effort lists
35
+
3
36
  ## 2.0.135 - 2026-09-01
4
37
 
5
38
  ### Features
package/dist/CHANGELOG.md CHANGED
@@ -1,5 +1,38 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.0.137 - 2026-09-03
4
+
5
+ ### Bug Fixes
6
+
7
+ - **Image descriptions survive reloads** — vision details no longer drop from tool results after a page reload
8
+
9
+ ## 2.0.136 - 2026-09-02
10
+
11
+ ### Features
12
+
13
+ - **Model favorites** — heart-toggle any model and pin a Favorites section at the top of the model selector
14
+ - **Model selector display settings** — full-height sizing, and start with providers or favorites collapsed
15
+ - **Describe-image tool for non-vision models** — delegates image questions to a vision-capable fallback
16
+ - **Sync button in the provider editor** — refetch the model catalog without losing current selections
17
+
18
+ ### Enhancements
19
+
20
+ - **Hover tooltips for truncated tool-call labels** — reveal the full path or command
21
+ - **Compact provider auth badge** — the Connected/Connect button is smaller and better aligned
22
+
23
+ ### Bug Fixes
24
+
25
+ - **Localized modal footer buttons** — Cancel/Save now translate to French
26
+ - **Tool schemas work with strict providers** — Vertex AI, Antigravity, and Gemini no longer reject tool calls
27
+ - **New sessions inherit project MCP overrides** — forked sessions keep the parent's MCP state too
28
+ - **No more duplicate models after a sync** — merged model families and selections survive a catalog refresh
29
+ - **Deleting a provider cleans up its sessions** — no dead provider pins, wrong context windows, or auto-compaction
30
+ - **Ollama vision images work again** — content arrays are converted to Ollama's native format
31
+ - **grep patterns no longer trigger path confirmations** — only real file operands are checked
32
+ - **Quoted paths can't sneak past path security** — nested quotes are now detected
33
+ - **DeepSeek reasoning preserved** — chain-of-thought is echoed under reasoning_content instead of being dropped
34
+ - **Per-model reasoning efforts accepted** — validation now honors each model's modes and effort lists
35
+
3
36
  ## 2.0.135 - 2026-09-01
4
37
 
5
38
  ### Features
@@ -6,6 +6,7 @@ subagent: false
6
6
  color: '#3b82f6'
7
7
  allowedTools:
8
8
  - read_file
9
+ - describe_image
9
10
  - web_fetch
10
11
  - web_search
11
12
  - write_file
@@ -6,6 +6,7 @@ subagent: false
6
6
  color: '#a855f7'
7
7
  allowedTools:
8
8
  - read_file
9
+ - describe_image
9
10
  - web_fetch
10
11
  - web_search
11
12
  - run_command
@@ -7,7 +7,7 @@ import {
7
7
  getPendingQuestionsForSession,
8
8
  hasPendingQuestion,
9
9
  provideAnswer
10
- } from "./chunk-JURM3RPZ.js";
10
+ } from "./chunk-V5AC2TV7.js";
11
11
  import "./chunk-LCLH6ZUL.js";
12
12
  import "./chunk-YLJ4XMA6.js";
13
13
  export {
@@ -20,4 +20,4 @@ export {
20
20
  hasPendingQuestion,
21
21
  provideAnswer
22
22
  };
23
- //# sourceMappingURL=ask-UBIRH3SO.js.map
23
+ //# sourceMappingURL=ask-46J5WYRL.js.map
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-HNCM3D7Y.js";
8
8
  import {
9
9
  getCatalogEntry
10
- } from "./chunk-2AI7VYPN.js";
10
+ } from "./chunk-VKMPR25F.js";
11
11
  import {
12
12
  logger
13
13
  } from "./chunk-K44MW7JJ.js";
@@ -118,6 +118,14 @@ async function detectLmstudioInfo(baseUrl, modelId) {
118
118
  }
119
119
  throw new Error("No context_length in LM Studio response");
120
120
  }
121
+ var REASONING_FIELDS = ["reasoning", "reasoning_content", "thinking"];
122
+ function detectThinkingField(message) {
123
+ for (const field of REASONING_FIELDS) {
124
+ const value = message[field];
125
+ if (typeof value === "string" && value.length > 0) return field;
126
+ }
127
+ return void 0;
128
+ }
121
129
  async function probeCombo(baseUrl, apiKey, model, combo, signal) {
122
130
  const body = {
123
131
  model,
@@ -139,8 +147,15 @@ async function probeCombo(baseUrl, apiKey, model, combo, signal) {
139
147
  }
140
148
  const data = await response.json();
141
149
  const message = data.choices?.[0]?.message ?? {};
142
- const hasContent = !!(message["content"] || message["reasoning"] || message["reasoning_content"] || message["thinking"]);
143
- return { combo, httpCode: response.status, hasContent, durationMs };
150
+ const thinkingField = detectThinkingField(message);
151
+ const hasContent = !!(message["content"] || thinkingField);
152
+ return {
153
+ combo,
154
+ httpCode: response.status,
155
+ hasContent,
156
+ ...thinkingField ? { thinkingField } : {},
157
+ durationMs
158
+ };
144
159
  } catch {
145
160
  const durationMs = Date.now() - start;
146
161
  return { combo, httpCode: 0, hasContent: false, durationMs };
@@ -159,7 +174,7 @@ async function probeCombos(baseUrl, apiKey, model, combos) {
159
174
  combo: winner.combo,
160
175
  durationMs: winner.durationMs
161
176
  });
162
- return winner.combo;
177
+ return { combo: winner.combo, ...winner.thinkingField ? { thinkingField: winner.thinkingField } : {} };
163
178
  }
164
179
  logger.debug("Auto-config: no working combo found", { model });
165
180
  return null;
@@ -284,11 +299,14 @@ async function autoConfig(input) {
284
299
  } = await detectModelInfo(baseUrl, apiKey, backend, model.id);
285
300
  const catalog = getCatalogEntry(model.id);
286
301
  const reasoningEfforts = catalog?.reasoningEfforts;
287
- const [thinkingConfig, nonThinkingConfig, rejectedParams] = await Promise.all([
302
+ const [thinkingResult, nonThinkingResult, rejectedParams] = await Promise.all([
288
303
  probeCombos(baseUrl, apiKey, model.id, THINKING_COMBOS),
289
304
  probeCombos(baseUrl, apiKey, model.id, NON_THINKING_COMBOS),
290
305
  probeRejectedParams(baseUrl, apiKey, model.id, backend)
291
306
  ]);
307
+ const thinkingConfig = thinkingResult?.combo ?? null;
308
+ const nonThinkingConfig = nonThinkingResult?.combo ?? null;
309
+ const thinkingField = thinkingResult?.thinkingField;
292
310
  const sendReasoningInMessages = thinkingConfig ? await probeReasoningInMessages(baseUrl, apiKey, model.id) : void 0;
293
311
  results.push({
294
312
  id: model.id,
@@ -297,6 +315,7 @@ async function autoConfig(input) {
297
315
  supportsVision,
298
316
  thinkingConfig,
299
317
  nonThinkingConfig,
318
+ ...thinkingField ? { thinkingField } : {},
300
319
  ...sendReasoningInMessages !== void 0 ? { sendReasoningInMessages } : {},
301
320
  ...rejectedParams.length > 0 ? { rejectedParams } : {},
302
321
  ...reasoningEfforts ? { reasoningEfforts } : {},
@@ -308,4 +327,4 @@ async function autoConfig(input) {
308
327
  export {
309
328
  autoConfig
310
329
  };
311
- //# sourceMappingURL=auto-config-5VSNLVNI.js.map
330
+ //# sourceMappingURL=auto-config-2A7Y2WOK.js.map
@@ -1,12 +1,14 @@
1
1
  import {
2
2
  detectBackendFromUrl,
3
+ detectProviderDefaultsFromUrl,
3
4
  getBackendCapabilities,
4
5
  getBackendDisplayName
5
- } from "./chunk-UV6IH6HK.js";
6
+ } from "./chunk-AKWJMMEJ.js";
6
7
  import "./chunk-YLJ4XMA6.js";
7
8
  export {
8
9
  detectBackendFromUrl,
10
+ detectProviderDefaultsFromUrl,
9
11
  getBackendCapabilities,
10
12
  getBackendDisplayName
11
13
  };
12
- //# sourceMappingURL=backend-NDBY3DAQ.js.map
14
+ //# sourceMappingURL=backend-24FTDSHF.js.map
@@ -2,32 +2,34 @@ import {
2
2
  buildRunChatTurnParams,
3
3
  finalizeTurnCompletion,
4
4
  generateSessionNameForSession
5
- } from "./chunk-NFEZATSN.js";
5
+ } from "./chunk-FIQPKLDY.js";
6
6
  import {
7
7
  runChatTurn
8
- } from "./chunk-4R5GV7RW.js";
9
- import "./chunk-ESZQTFQP.js";
8
+ } from "./chunk-JIS6C6PA.js";
9
+ import "./chunk-6TQNTFJW.js";
10
+ import "./chunk-ZQENKB7X.js";
11
+ import "./chunk-Q33DL67W.js";
10
12
  import "./chunk-XE6UC5Z3.js";
11
13
  import "./chunk-J7GAZGZT.js";
12
- import "./chunk-OZWHRBDY.js";
13
- import "./chunk-S67WIWUG.js";
14
- import "./chunk-7ET46SNE.js";
14
+ import "./chunk-QBWJCO5K.js";
15
+ import "./chunk-DG2YSWMC.js";
16
+ import "./chunk-WQUCCHOY.js";
17
+ import "./chunk-4SBVW4UH.js";
18
+ import "./chunk-HEYU7FAY.js";
19
+ import "./chunk-4LLGI372.js";
15
20
  import "./chunk-LW6MMSTD.js";
16
- import "./chunk-5UMXFLET.js";
21
+ import "./chunk-SAGDTQXD.js";
17
22
  import "./chunk-I72ACQ6R.js";
18
- import "./chunk-JE7LW7Y6.js";
23
+ import "./chunk-VIJVLLPT.js";
19
24
  import "./chunk-OAN4BXEW.js";
20
- import "./chunk-VHLD6PCZ.js";
21
- import "./chunk-DWA4IE65.js";
22
- import "./chunk-7QMWYNVF.js";
23
- import "./chunk-JURM3RPZ.js";
24
- import "./chunk-I5ODJKYM.js";
25
+ import "./chunk-V5AC2TV7.js";
26
+ import "./chunk-XWWRZSK7.js";
25
27
  import {
26
28
  getEventStore
27
- } from "./chunk-QZOV4OVN.js";
28
- import "./chunk-MEEUXRFL.js";
29
- import "./chunk-F2MOHHXB.js";
30
- import "./chunk-ORCQ3EXQ.js";
29
+ } from "./chunk-2OO46UAW.js";
30
+ import "./chunk-MMGHIPBU.js";
31
+ import "./chunk-X4PVR6AW.js";
32
+ import "./chunk-BHVR2YS5.js";
31
33
  import "./chunk-OSXPQSLW.js";
32
34
  import {
33
35
  createChatMessageMessage,
@@ -35,20 +37,22 @@ import {
35
37
  createSessionRunningMessage
36
38
  } from "./chunk-AATMPL7S.js";
37
39
  import "./chunk-LCLH6ZUL.js";
38
- import "./chunk-O3RCSKUH.js";
39
- import "./chunk-5UQ4CKOA.js";
40
+ import "./chunk-MOYWDP73.js";
41
+ import "./chunk-G5GUQKLS.js";
40
42
  import "./chunk-OA2FURC3.js";
41
43
  import "./chunk-J2GP3J3X.js";
42
44
  import "./chunk-DPFET73G.js";
43
- import "./chunk-ZMK4VX7V.js";
45
+ import "./chunk-64YDOCQR.js";
44
46
  import "./chunk-TS5WKTFB.js";
45
- import "./chunk-UV6IH6HK.js";
47
+ import "./chunk-AKWJMMEJ.js";
46
48
  import "./chunk-HNCM3D7Y.js";
47
- import "./chunk-EUOWCVU6.js";
48
- import "./chunk-J3NMNYGM.js";
49
- import "./chunk-CTWZPN7G.js";
49
+ import "./chunk-QMU3ZY2C.js";
50
+ import "./chunk-FSSUPWYO.js";
51
+ import "./chunk-XG3AUMPI.js";
52
+ import "./chunk-N5JKVNLH.js";
53
+ import "./chunk-QUAEH3MP.js";
50
54
  import "./chunk-JU757HVI.js";
51
- import "./chunk-2AI7VYPN.js";
55
+ import "./chunk-VKMPR25F.js";
52
56
  import "./chunk-K44MW7JJ.js";
53
57
  import "./chunk-HF3NDXB4.js";
54
58
  import "./chunk-24YKXKCG.js";
@@ -175,4 +179,4 @@ export {
175
179
  startChatSession,
176
180
  stopSessionExecution
177
181
  };
178
- //# sourceMappingURL=chat-handler-WGDFMOOD.js.map
182
+ //# sourceMappingURL=chat-handler-ZCPFNHTE.js.map
@@ -6,16 +6,16 @@ import {
6
6
  foldSessionState,
7
7
  spreadOptionalMessageFields,
8
8
  trimSnapshotStreamingOutput
9
- } from "./chunk-MEEUXRFL.js";
9
+ } from "./chunk-MMGHIPBU.js";
10
10
  import {
11
11
  updateSessionMessageCount
12
- } from "./chunk-F2MOHHXB.js";
12
+ } from "./chunk-X4PVR6AW.js";
13
13
  import {
14
14
  getRuntimeConfig
15
- } from "./chunk-ORCQ3EXQ.js";
15
+ } from "./chunk-BHVR2YS5.js";
16
16
  import {
17
17
  SETTINGS_KEYS
18
- } from "./chunk-CTWZPN7G.js";
18
+ } from "./chunk-QUAEH3MP.js";
19
19
  import {
20
20
  logger
21
21
  } from "./chunk-K44MW7JJ.js";
@@ -1489,4 +1489,4 @@ export {
1489
1489
  truncateSessionMessages,
1490
1490
  getRecentUserPromptsForSession
1491
1491
  };
1492
- //# sourceMappingURL=chunk-QZOV4OVN.js.map
1492
+ //# sourceMappingURL=chunk-2OO46UAW.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getPlatformShell
3
- } from "./chunk-O3RCSKUH.js";
3
+ } from "./chunk-MOYWDP73.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-7QMWYNVF.js.map
249
+ //# sourceMappingURL=chunk-4LLGI372.js.map
@@ -0,0 +1,24 @@
1
+ import {
2
+ SETTINGS_KEYS,
3
+ getSetting
4
+ } from "./chunk-QUAEH3MP.js";
5
+ import {
6
+ getLocale,
7
+ setLocale,
8
+ t
9
+ } from "./chunk-24YKXKCG.js";
10
+
11
+ // src/server/i18n.ts
12
+ function resolveLocale() {
13
+ return getSetting(SETTINGS_KEYS.DISPLAY_LOCALE) === "fr" ? "fr" : "en";
14
+ }
15
+ function serverT(tx, vars) {
16
+ const locale = resolveLocale();
17
+ if (getLocale() !== locale) setLocale(locale);
18
+ return t(tx, vars);
19
+ }
20
+
21
+ export {
22
+ serverT
23
+ };
24
+ //# sourceMappingURL=chunk-4SBVW4UH.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-TS5WKTFB.js";
4
4
  import {
5
5
  getBackendCapabilities
6
- } from "./chunk-UV6IH6HK.js";
6
+ } from "./chunk-AKWJMMEJ.js";
7
7
  import {
8
8
  ensureVersionPrefix,
9
9
  stripVersionPrefix
@@ -14,13 +14,13 @@ import {
14
14
  getThinking,
15
15
  mapFinishReason,
16
16
  parseToolArguments
17
- } from "./chunk-EUOWCVU6.js";
17
+ } from "./chunk-QMU3ZY2C.js";
18
18
  import {
19
19
  ChatHttpClient,
20
20
  DONE,
21
21
  LLMError,
22
22
  OpenAIHttpClient
23
- } from "./chunk-J3NMNYGM.js";
23
+ } from "./chunk-N5JKVNLH.js";
24
24
  import {
25
25
  logger
26
26
  } from "./chunk-K44MW7JJ.js";
@@ -300,27 +300,59 @@ function toOllamaThink(effort) {
300
300
  if (OLLAMA_THINK_LEVELS.has(effort)) return effort;
301
301
  return true;
302
302
  }
303
+ function parseToolCalls(toolCalls) {
304
+ if (!Array.isArray(toolCalls) || toolCalls.length === 0) return void 0;
305
+ return toolCalls.map((toolCall) => {
306
+ const fn = toolCall.function;
307
+ if (!fn || typeof fn.arguments !== "string") return toolCall;
308
+ try {
309
+ return {
310
+ ...toolCall,
311
+ function: { ...fn, arguments: JSON.parse(fn.arguments) }
312
+ };
313
+ } catch {
314
+ return toolCall;
315
+ }
316
+ });
317
+ }
303
318
  function toNativeMessage(message) {
304
319
  const raw = message;
305
320
  const toolCalls = raw["tool_calls"];
306
- if (!Array.isArray(toolCalls) || toolCalls.length === 0) {
307
- return raw;
308
- }
309
- return {
310
- ...raw,
311
- tool_calls: toolCalls.map((toolCall) => {
312
- const fn = toolCall.function;
313
- if (!fn || typeof fn.arguments !== "string") return toolCall;
314
- try {
315
- return {
316
- ...toolCall,
317
- function: { ...fn, arguments: JSON.parse(fn.arguments) }
318
- };
319
- } catch {
320
- return toolCall;
321
+ const content = raw["content"];
322
+ if (Array.isArray(content)) {
323
+ const textParts = [];
324
+ const imageParts = [];
325
+ for (const part of content) {
326
+ if (part.type === "text") {
327
+ textParts.push(part.text);
328
+ } else if (part.type === "image_url") {
329
+ const match = part.image_url.url.match(/^data:image\/[^;]+;base64,(.+)$/);
330
+ if (match && match[1]) {
331
+ imageParts.push(match[1]);
332
+ }
321
333
  }
322
- })
323
- };
334
+ }
335
+ const result = {
336
+ ...raw,
337
+ content: textParts.join("\n")
338
+ };
339
+ if (imageParts.length > 0) {
340
+ result["images"] = imageParts;
341
+ }
342
+ const parsedToolCalls2 = parseToolCalls(toolCalls);
343
+ if (parsedToolCalls2 !== void 0) {
344
+ result["tool_calls"] = parsedToolCalls2;
345
+ }
346
+ return result;
347
+ }
348
+ const parsedToolCalls = parseToolCalls(toolCalls);
349
+ if (parsedToolCalls !== void 0) {
350
+ return {
351
+ ...raw,
352
+ tool_calls: parsedToolCalls
353
+ };
354
+ }
355
+ return raw;
324
356
  }
325
357
  function buildOllamaChatRequest(params) {
326
358
  const options = {};
@@ -768,4 +800,4 @@ function createLLMClient(config, initialBackend = config.llm.backend ?? "unknown
768
800
  export {
769
801
  createLLMClient
770
802
  };
771
- //# sourceMappingURL=chunk-ZMK4VX7V.js.map
803
+ //# sourceMappingURL=chunk-64YDOCQR.js.map
@@ -1,21 +1,21 @@
1
1
  import {
2
2
  getAllInstructions,
3
3
  getEnabledSkillMetadata
4
- } from "./chunk-DWA4IE65.js";
4
+ } from "./chunk-Q33DL67W.js";
5
5
  import {
6
6
  buildTopLevelSystemPrompt
7
- } from "./chunk-7QMWYNVF.js";
7
+ } from "./chunk-4LLGI372.js";
8
8
  import {
9
9
  getCurrentContextWindowId,
10
10
  getEventStore
11
- } from "./chunk-QZOV4OVN.js";
11
+ } from "./chunk-2OO46UAW.js";
12
12
  import {
13
13
  findAgentById,
14
14
  getRuntimeConfig,
15
15
  getSubAgents,
16
16
  loadAllAgentsDefault,
17
17
  resolveDefaultAgentId
18
- } from "./chunk-ORCQ3EXQ.js";
18
+ } from "./chunk-BHVR2YS5.js";
19
19
  import {
20
20
  logger
21
21
  } from "./chunk-K44MW7JJ.js";
@@ -223,8 +223,7 @@ async function injectDriftReminders(sessionManager, sessionId, agentDef, options
223
223
  if (!cached) {
224
224
  return { injectedToolReminder: false, injectedPromptReminder: false };
225
225
  }
226
- const { getToolRegistryForAgent } = await import("./tools-E63MOJBO.js");
227
- const liveTools = getToolRegistryForAgent(agentDef, sessionId).definitions;
226
+ const liveTools = await getEffectiveToolDefinitions(agentDef, sessionId, options.modelName);
228
227
  let injectedToolReminder = false;
229
228
  let injectedPromptReminder = false;
230
229
  const liveToolFingerprint = getToolSetFingerprint(liveTools);
@@ -327,10 +326,17 @@ function resolveAgentDef(sessionManager, sessionId) {
327
326
  return findAgentById(session.mode, allAgents) ?? findAgentById(resolveDefaultAgentId(), allAgents);
328
327
  });
329
328
  }
329
+ async function getEffectiveToolDefinitions(agentDef, sessionId, modelName) {
330
+ const { getToolRegistryForAgent } = await import("./tools-WLJJ3ILO.js");
331
+ const { isDescribeImageEligible } = await import("./describe-image-EFHMWGWI.js");
332
+ const all = getToolRegistryForAgent(agentDef, sessionId).definitions;
333
+ const eligible = await isDescribeImageEligible(modelName);
334
+ if (eligible) return all;
335
+ return all.filter((d) => d.function.name !== "describe_image");
336
+ }
330
337
  async function buildCachedPrompt(sessionManager, sessionId, agentDef, modelName) {
331
338
  const { instructionContent, skills } = await loadSessionContext(sessionManager, sessionId);
332
- const { getToolRegistryForAgent } = await import("./tools-E63MOJBO.js");
333
- const tools = getToolRegistryForAgent(agentDef, sessionId).definitions;
339
+ const tools = await getEffectiveToolDefinitions(agentDef, sessionId, modelName);
334
340
  const toolFingerprint = getToolFingerprint(tools);
335
341
  const allAgents = await loadAllAgentsDefault(sessionManager.getProjectWorkdir(sessionId));
336
342
  const subAgentDefs = getSubAgents(allAgents);
@@ -349,8 +355,7 @@ async function buildCachedPrompt(sessionManager, sessionId, agentDef, modelName)
349
355
  async function computeSessionHash(sessionManager, sessionId, modelName) {
350
356
  const { instructionContent, skills } = await loadSessionContext(sessionManager, sessionId);
351
357
  const agentDef = await resolveAgentDef(sessionManager, sessionId);
352
- const { getToolRegistryForAgent } = await import("./tools-E63MOJBO.js");
353
- const tools = getToolRegistryForAgent(agentDef, sessionId).definitions;
358
+ const tools = await getEffectiveToolDefinitions(agentDef, sessionId, modelName);
354
359
  const toolFingerprint = getToolFingerprint(tools);
355
360
  return computeDynamicContextHash(instructionContent, skills, toolFingerprint, modelName);
356
361
  }
@@ -386,8 +391,9 @@ export {
386
391
  checkToolChangesAndInject,
387
392
  injectContextDriftReminders,
388
393
  injectContextDriftRemindersForSessions,
394
+ getEffectiveToolDefinitions,
389
395
  buildCachedPrompt,
390
396
  computeSessionHash,
391
397
  applyDynamicContext
392
398
  };
393
- //# sourceMappingURL=chunk-VHLD6PCZ.js.map
399
+ //# sourceMappingURL=chunk-6TQNTFJW.js.map
@@ -79,6 +79,19 @@ function detectBackendFromUrl(url) {
79
79
  return void 0;
80
80
  }
81
81
  }
82
+ var HOST_PROVIDER_DEFAULTS = {
83
+ // DeepSeek's official API requires reasoning echoed under `reasoning_content`
84
+ // (its own output field) — anything else is ignored or 400s on tool calls.
85
+ "api.deepseek.com": { thinkingField: "reasoning_content" }
86
+ };
87
+ function detectProviderDefaultsFromUrl(url) {
88
+ try {
89
+ const host = new URL(url).hostname.toLowerCase();
90
+ return HOST_PROVIDER_DEFAULTS[host];
91
+ } catch {
92
+ return void 0;
93
+ }
94
+ }
82
95
  function getBackendDisplayName(backend) {
83
96
  switch (backend) {
84
97
  case "vllm":
@@ -105,6 +118,7 @@ function getBackendDisplayName(backend) {
105
118
  export {
106
119
  getBackendCapabilities,
107
120
  detectBackendFromUrl,
121
+ detectProviderDefaultsFromUrl,
108
122
  getBackendDisplayName
109
123
  };
110
- //# sourceMappingURL=chunk-UV6IH6HK.js.map
124
+ //# sourceMappingURL=chunk-AKWJMMEJ.js.map
@@ -7,7 +7,7 @@ import {
7
7
  import {
8
8
  SETTINGS_KEYS,
9
9
  getSetting
10
- } from "./chunk-CTWZPN7G.js";
10
+ } from "./chunk-QUAEH3MP.js";
11
11
  import {
12
12
  logger
13
13
  } from "./chunk-K44MW7JJ.js";
@@ -352,4 +352,4 @@ export {
352
352
  getOverrideAgentIds,
353
353
  resolveDefaultAgentId
354
354
  };
355
- //# sourceMappingURL=chunk-ORCQ3EXQ.js.map
355
+ //# sourceMappingURL=chunk-BHVR2YS5.js.map
@@ -1,6 +1,9 @@
1
1
  import {
2
2
  updateSessionMcpDisabledServers
3
- } from "./chunk-F2MOHHXB.js";
3
+ } from "./chunk-X4PVR6AW.js";
4
+ import {
5
+ getProject
6
+ } from "./chunk-DPFET73G.js";
4
7
  import {
5
8
  getDatabase
6
9
  } from "./chunk-JU757HVI.js";
@@ -51,15 +54,46 @@ function clearSessionOverrides(sessionId) {
51
54
  } catch {
52
55
  }
53
56
  }
54
- function getAllSessionOverrides() {
55
- ensureInitialized();
56
- return sessionOverrides;
57
+ var globalMcpServersProvider = null;
58
+ function setGlobalMcpServersProvider(provider) {
59
+ globalMcpServersProvider = provider;
60
+ }
61
+ function computeDisabledServersForProject(projectOverrides, globalServers) {
62
+ const servers = globalServers ?? globalMcpServersProvider?.() ?? [];
63
+ const disabledSet = /* @__PURE__ */ new Set();
64
+ for (const server of servers) {
65
+ const override = projectOverrides?.[server.name];
66
+ const isDisabled = override?.disabled !== void 0 ? override.disabled : !!server.disabled;
67
+ if (isDisabled) {
68
+ disabledSet.add(server.name);
69
+ }
70
+ }
71
+ if (projectOverrides) {
72
+ for (const [name, override] of Object.entries(projectOverrides)) {
73
+ if (override.disabled) {
74
+ disabledSet.add(name);
75
+ }
76
+ }
77
+ }
78
+ return Array.from(disabledSet);
79
+ }
80
+ function initSessionMcpOverrides(sessionId, projectId, projectOverrides) {
81
+ try {
82
+ const project = projectOverrides !== void 0 ? { mcpOverrides: projectOverrides } : getProject(projectId);
83
+ const disabledServers = computeDisabledServersForProject(project?.mcpOverrides);
84
+ if (disabledServers.length > 0) {
85
+ setSessionDisabledServers(sessionId, disabledServers);
86
+ }
87
+ } catch {
88
+ }
57
89
  }
58
90
 
59
91
  export {
60
92
  getSessionDisabledServers,
61
93
  setSessionDisabledServers,
62
94
  clearSessionOverrides,
63
- getAllSessionOverrides
95
+ setGlobalMcpServersProvider,
96
+ computeDisabledServersForProject,
97
+ initSessionMcpOverrides
64
98
  };
65
- //# sourceMappingURL=chunk-S67WIWUG.js.map
99
+ //# sourceMappingURL=chunk-DG2YSWMC.js.map
@@ -0,0 +1,7 @@
1
+ // src/constants.ts
2
+ var VERSION = "2.0.137";
3
+
4
+ export {
5
+ VERSION
6
+ };
7
+ //# sourceMappingURL=chunk-FG4G4EWB.js.map