openfox 2.0.0-beta.9 → 2.0.1

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 (35) hide show
  1. package/README.md +11 -0
  2. package/dist/{chat-handler-6COBLIDR.js → chat-handler-LJMW4OK3.js} +9 -9
  3. package/dist/{chunk-LR5R7EEE.js → chunk-32GQUDLN.js} +22 -18
  4. package/dist/{chunk-DMH6JVPF.js → chunk-7ZMMDZU7.js} +431 -32
  5. package/dist/{chunk-CDDMHSZF.js → chunk-CK6LGE7G.js} +10 -6
  6. package/dist/{chunk-VIIRNJDT.js → chunk-FFEAEPJB.js} +80 -245
  7. package/dist/{chunk-EZUR7OEP.js → chunk-HPCGVAS4.js} +21 -45
  8. package/dist/{chunk-XJEOP6XU.js → chunk-ITWVFGFV.js} +1 -30
  9. package/dist/{chunk-C75I2KZM.js → chunk-LEDG5WAN.js} +29 -35
  10. package/dist/{chunk-KUG27ZUR.js → chunk-MFUPS6UE.js} +6 -6
  11. package/dist/{chunk-NPHYEUYE.js → chunk-XEK3KII6.js} +55 -4
  12. package/dist/{chunk-J2FFLZ5Z.js → chunk-ZDY4WMZJ.js} +184 -71
  13. package/dist/cli/dev.js +1 -1
  14. package/dist/cli/index.js +1 -1
  15. package/dist/{config-TDVA7MQN.js → config-BU66P4KX.js} +2 -7
  16. package/dist/{events-PQ3KTI5H.js → events-ZKWAKWI7.js} +3 -3
  17. package/dist/{folding-CXORTBAU.js → folding-YOCGTZYH.js} +2 -2
  18. package/dist/{orchestrator-ZNGTMZ7W.js → orchestrator-LX6FKB6L.js} +8 -8
  19. package/dist/package.json +2 -1
  20. package/dist/{processor-WMAU4C2N.js → processor-NMYSEBC7.js} +11 -6
  21. package/dist/{protocol-CDOV1pyc.d.ts → protocol-D59sCy9L.d.ts} +15 -6
  22. package/dist/{provider-BGH4MBLH.js → provider-DTNQYCMV.js} +9 -20
  23. package/dist/provider-manager-LMHAHLIF.js +15 -0
  24. package/dist/{serve-N3LBZUVN.js → serve-SGNL43UL.js} +14 -15
  25. package/dist/server/index.d.ts +22 -16
  26. package/dist/server/index.js +9 -10
  27. package/dist/shared/index.d.ts +2 -2
  28. package/dist/{tools-CQGEU3JK.js → tools-BOE5T3KC.js} +7 -7
  29. package/dist/web/assets/index-Bego8SwT.js +299 -0
  30. package/dist/web/assets/{index-CSOB8dwI.css → index-Sdax8ayU.css} +1 -1
  31. package/dist/web/index.html +2 -2
  32. package/dist/web/sw.js +1 -1
  33. package/package.json +2 -1
  34. package/dist/chunk-UKTPL5ZG.js +0 -469
  35. package/dist/web/assets/index-BJuF4wi7.js +0 -299
@@ -1,191 +1,8 @@
1
- import {
2
- logger
3
- } from "./chunk-K44MW7JJ.js";
4
-
5
- // src/server/llm/url-utils.ts
6
- var VERSION_PREFIX_REGEX = /\/v\d+(\/|$)/;
7
- function hasVersionPrefix(url) {
8
- return VERSION_PREFIX_REGEX.test(url);
9
- }
10
- function ensureVersionPrefix(url, defaultVersion = "/v1") {
11
- if (hasVersionPrefix(url)) return url;
12
- return `${url.replace(/\/+$/, "")}${defaultVersion}`;
13
- }
14
- function stripVersionPrefix(url) {
15
- return url.replace(/\/v\d+\/?$/, "");
16
- }
17
- function buildModelsUrl(baseUrl) {
18
- return `${ensureVersionPrefix(baseUrl)}/models`;
19
- }
20
-
21
- // src/server/llm/backend.ts
22
- var BACKEND_CAPABILITIES = {
23
- vllm: {
24
- supportsReasoningField: true,
25
- supportsChatTemplateKwargs: true,
26
- supportsTopK: true
27
- },
28
- sglang: {
29
- supportsReasoningField: true,
30
- supportsChatTemplateKwargs: true,
31
- supportsTopK: true
32
- },
33
- ollama: {
34
- supportsReasoningField: false,
35
- supportsChatTemplateKwargs: false,
36
- supportsTopK: false
37
- },
38
- llamacpp: {
39
- supportsReasoningField: false,
40
- supportsChatTemplateKwargs: false,
41
- supportsTopK: true
42
- },
43
- "opencode-go": {
44
- supportsReasoningField: false,
45
- supportsChatTemplateKwargs: false,
46
- supportsTopK: true
47
- },
48
- unknown: {
49
- // Assume vLLM-like for unknown backends
50
- supportsReasoningField: true,
51
- supportsChatTemplateKwargs: true,
52
- supportsTopK: true
53
- }
54
- };
55
- function getBackendCapabilities(backend) {
56
- return BACKEND_CAPABILITIES[backend];
57
- }
58
- async function detectBackend(baseUrl, explicitBackend, silent = false) {
59
- if (explicitBackend && explicitBackend !== "unknown") {
60
- if (silent) {
61
- logger.debug("Using explicit backend", { backend: explicitBackend });
62
- } else {
63
- logger.info("Using explicit backend", { backend: explicitBackend });
64
- }
65
- return explicitBackend;
66
- }
67
- const probeUrl = stripVersionPrefix(baseUrl);
68
- try {
69
- if (await probeOllama(probeUrl)) {
70
- if (silent) {
71
- logger.debug("Detected Ollama backend", { url: probeUrl });
72
- } else {
73
- logger.info("Detected Ollama backend", { url: probeUrl });
74
- }
75
- return "ollama";
76
- }
77
- if (await probeLlamaCpp(probeUrl)) {
78
- if (silent) {
79
- logger.debug("Detected llama.cpp backend", { url: probeUrl });
80
- } else {
81
- logger.info("Detected llama.cpp backend", { url: probeUrl });
82
- }
83
- return "llamacpp";
84
- }
85
- if (await probeSGLang(probeUrl)) {
86
- if (silent) {
87
- logger.debug("Detected SGLang backend", { url: probeUrl });
88
- } else {
89
- logger.info("Detected SGLang backend", { url: probeUrl });
90
- }
91
- return "sglang";
92
- }
93
- if (await probeOpenAI(baseUrl)) {
94
- if (silent) {
95
- logger.debug("Detected vLLM backend (OpenAI-compatible)", { url: baseUrl });
96
- } else {
97
- logger.info("Detected vLLM backend (OpenAI-compatible)", { url: baseUrl });
98
- }
99
- return "vllm";
100
- }
101
- if (silent) {
102
- logger.debug("Could not detect backend, using unknown", { url: baseUrl });
103
- } else {
104
- logger.warn("Could not detect backend, using unknown", { url: baseUrl });
105
- }
106
- return "unknown";
107
- } catch (error) {
108
- if (silent) {
109
- logger.debug("Backend detection failed", {
110
- url: baseUrl,
111
- error: error instanceof Error ? error.message : String(error)
112
- });
113
- } else {
114
- logger.warn("Backend detection failed", {
115
- url: baseUrl,
116
- error: error instanceof Error ? error.message : String(error)
117
- });
118
- }
119
- return "unknown";
120
- }
121
- }
122
- async function probeOllama(baseUrl) {
123
- try {
124
- const response = await fetch(`${baseUrl}/api/tags`, {
125
- signal: AbortSignal.timeout(5e3)
126
- });
127
- return response.ok;
128
- } catch {
129
- return false;
130
- }
131
- }
132
- async function probeLlamaCpp(baseUrl) {
133
- try {
134
- const response = await fetch(`${baseUrl}/health`, {
135
- signal: AbortSignal.timeout(5e3)
136
- });
137
- if (!response.ok) return false;
138
- const data = await response.json();
139
- return "slots_idle" in data || "slots_processing" in data;
140
- } catch {
141
- return false;
142
- }
143
- }
144
- async function probeSGLang(baseUrl) {
145
- try {
146
- const response = await fetch(`${baseUrl}/get_model_info`, {
147
- signal: AbortSignal.timeout(5e3)
148
- });
149
- return response.ok;
150
- } catch {
151
- return false;
152
- }
153
- }
154
- async function probeOpenAI(baseUrl) {
155
- try {
156
- const url = ensureVersionPrefix(baseUrl);
157
- const response = await fetch(`${url}/models`, {
158
- signal: AbortSignal.timeout(5e3)
159
- });
160
- return response.ok;
161
- } catch {
162
- return false;
163
- }
164
- }
165
- function getBackendDisplayName(backend) {
166
- switch (backend) {
167
- case "vllm":
168
- return "vLLM";
169
- case "sglang":
170
- return "SGLang";
171
- case "ollama":
172
- return "Ollama";
173
- case "llamacpp":
174
- return "llama.cpp";
175
- case "opencode-go":
176
- return "OpenCode Go";
177
- case "unknown":
178
- return "Unknown";
179
- }
180
- }
181
-
182
1
  // src/server/llm/profiles.ts
183
2
  var DEFAULT_PROFILE = {
184
3
  name: "default",
185
4
  temperature: 0.7,
186
5
  topP: 0.9,
187
- supportsReasoning: false,
188
- reasoningAsContent: false,
189
6
  defaultMaxTokens: 4096,
190
7
  supportsVision: true
191
8
  };
@@ -193,8 +10,6 @@ var MOCK_PROFILE = {
193
10
  name: "mock",
194
11
  temperature: 0.7,
195
12
  topP: 0.9,
196
- supportsReasoning: false,
197
- reasoningAsContent: false,
198
13
  defaultMaxTokens: 1024,
199
14
  supportsVision: false
200
15
  };
@@ -205,8 +20,6 @@ var MODEL_PROFILES = [
205
20
  name: "Mistral",
206
21
  temperature: 0.7,
207
22
  topP: 0.9,
208
- supportsReasoning: false,
209
- reasoningAsContent: false,
210
23
  defaultMaxTokens: 16384,
211
24
  supportsVision: false
212
25
  }
@@ -220,8 +33,6 @@ var MODEL_PROFILES = [
220
33
  topP: 0.95,
221
34
  topK: 40,
222
35
  // "This model supports only non-thinking mode and does not generate <think></think> blocks"
223
- supportsReasoning: false,
224
- reasoningAsContent: false,
225
36
  defaultMaxTokens: 16384,
226
37
  supportsVision: false
227
38
  }
@@ -232,8 +43,6 @@ var MODEL_PROFILES = [
232
43
  name: "Qwen3",
233
44
  temperature: 0.7,
234
45
  topP: 0.9,
235
- supportsReasoning: true,
236
- reasoningAsContent: false,
237
46
  defaultMaxTokens: 16384,
238
47
  supportsVision: false
239
48
  }
@@ -244,8 +53,6 @@ var MODEL_PROFILES = [
244
53
  name: "Qwen3-VL",
245
54
  temperature: 0.7,
246
55
  topP: 0.9,
247
- supportsReasoning: true,
248
- reasoningAsContent: false,
249
56
  defaultMaxTokens: 16384,
250
57
  supportsVision: true
251
58
  }
@@ -256,8 +63,6 @@ var MODEL_PROFILES = [
256
63
  name: "DeepSeek",
257
64
  temperature: 0.6,
258
65
  topP: 0.95,
259
- supportsReasoning: true,
260
- reasoningAsContent: false,
261
66
  defaultMaxTokens: 16384,
262
67
  supportsVision: false
263
68
  }
@@ -269,8 +74,6 @@ var MODEL_PROFILES = [
269
74
  temperature: 1,
270
75
  topP: 0.95,
271
76
  topK: 40,
272
- supportsReasoning: true,
273
- reasoningAsContent: false,
274
77
  defaultMaxTokens: 16384,
275
78
  supportsVision: false
276
79
  }
@@ -282,8 +85,6 @@ var MODEL_PROFILES = [
282
85
  temperature: 1,
283
86
  topP: 0.95,
284
87
  topK: 40,
285
- supportsReasoning: true,
286
- reasoningAsContent: false,
287
88
  defaultMaxTokens: 16384,
288
89
  supportsVision: false
289
90
  }
@@ -295,8 +96,6 @@ var MODEL_PROFILES = [
295
96
  temperature: 1,
296
97
  topP: 0.95,
297
98
  topK: 40,
298
- supportsReasoning: true,
299
- reasoningAsContent: false,
300
99
  defaultMaxTokens: 16384,
301
100
  supportsVision: false
302
101
  }
@@ -308,8 +107,6 @@ var MODEL_PROFILES = [
308
107
  temperature: 1,
309
108
  topP: 0.95,
310
109
  topK: 40,
311
- supportsReasoning: true,
312
- reasoningAsContent: false,
313
110
  defaultMaxTokens: 16384,
314
111
  supportsVision: true
315
112
  }
@@ -320,8 +117,6 @@ var MODEL_PROFILES = [
320
117
  name: "LLaVA",
321
118
  temperature: 0.7,
322
119
  topP: 0.9,
323
- supportsReasoning: false,
324
- reasoningAsContent: false,
325
120
  defaultMaxTokens: 16384,
326
121
  supportsVision: true
327
122
  }
@@ -332,8 +127,6 @@ var MODEL_PROFILES = [
332
127
  name: "Llama",
333
128
  temperature: 0.7,
334
129
  topP: 0.9,
335
- supportsReasoning: false,
336
- reasoningAsContent: false,
337
130
  defaultMaxTokens: 16384,
338
131
  supportsVision: false
339
132
  }
@@ -344,8 +137,6 @@ var MODEL_PROFILES = [
344
137
  name: "Claude",
345
138
  temperature: 0.7,
346
139
  topP: 0.9,
347
- supportsReasoning: true,
348
- reasoningAsContent: false,
349
140
  defaultMaxTokens: 16384,
350
141
  supportsVision: false
351
142
  }
@@ -356,8 +147,6 @@ var MODEL_PROFILES = [
356
147
  name: "Gemma 4",
357
148
  temperature: 0.7,
358
149
  topP: 0.9,
359
- supportsReasoning: true,
360
- reasoningAsContent: false,
361
150
  defaultMaxTokens: 16384,
362
151
  supportsVision: true
363
152
  }
@@ -379,6 +168,53 @@ function modelSupportsVision(modelName) {
379
168
  return getModelProfile(modelName).supportsVision;
380
169
  }
381
170
 
171
+ // src/server/llm/backend.ts
172
+ var BACKEND_CAPABILITIES = {
173
+ vllm: {
174
+ supportsChatTemplateKwargs: true,
175
+ supportsTopK: true
176
+ },
177
+ sglang: {
178
+ supportsChatTemplateKwargs: true,
179
+ supportsTopK: true
180
+ },
181
+ ollama: {
182
+ supportsChatTemplateKwargs: false,
183
+ supportsTopK: false
184
+ },
185
+ llamacpp: {
186
+ supportsChatTemplateKwargs: false,
187
+ supportsTopK: true
188
+ },
189
+ "opencode-go": {
190
+ supportsChatTemplateKwargs: false,
191
+ supportsTopK: true
192
+ },
193
+ unknown: {
194
+ supportsChatTemplateKwargs: true,
195
+ supportsTopK: true
196
+ }
197
+ };
198
+ function getBackendCapabilities(backend) {
199
+ return BACKEND_CAPABILITIES[backend];
200
+ }
201
+ function getBackendDisplayName(backend) {
202
+ switch (backend) {
203
+ case "vllm":
204
+ return "vLLM";
205
+ case "sglang":
206
+ return "SGLang";
207
+ case "ollama":
208
+ return "Ollama";
209
+ case "llamacpp":
210
+ return "llama.cpp";
211
+ case "opencode-go":
212
+ return "OpenCode Go";
213
+ case "unknown":
214
+ return "Unknown";
215
+ }
216
+ }
217
+
382
218
  // src/server/llm/client-pure.ts
383
219
  function buildModelParams(params) {
384
220
  return {
@@ -408,7 +244,14 @@ function convertToolCalls(toolCalls) {
408
244
  }
409
245
  }));
410
246
  }
411
- function buildAssistantMessage(msg) {
247
+ function getThinking(msg, override) {
248
+ if (override) {
249
+ const val = msg[override];
250
+ if (val) return val;
251
+ }
252
+ return msg["reasoning"] ?? msg["reasoning_content"] ?? msg["thinking"];
253
+ }
254
+ function buildAssistantMessage(msg, thinkingField) {
412
255
  const result = {
413
256
  role: "assistant",
414
257
  content: msg.content || null
@@ -417,7 +260,7 @@ function buildAssistantMessage(msg) {
417
260
  result["tool_calls"] = convertToolCalls(msg.toolCalls);
418
261
  }
419
262
  if (msg.thinkingContent) {
420
- result["reasoning_content"] = msg.thinkingContent;
263
+ result[thinkingField ?? "reasoning"] = msg.thinkingContent;
421
264
  }
422
265
  return result;
423
266
  }
@@ -433,7 +276,7 @@ function convertAttachmentSync(attachment, modelSupportsVision2) {
433
276
  text: `[Image: ${attachment.filename || "image"}] (vision not supported, cannot describe)`
434
277
  };
435
278
  }
436
- function convertMessages(messages, modelSupportsVision2) {
279
+ function convertMessages(messages, modelSupportsVision2, thinkingField) {
437
280
  const filtered = messages.filter((msg) => {
438
281
  return !(msg.role === "assistant" && !msg.content?.trim() && (!msg.toolCalls || msg.toolCalls.length === 0));
439
282
  });
@@ -454,7 +297,7 @@ function convertMessages(messages, modelSupportsVision2) {
454
297
  };
455
298
  }
456
299
  if (msg.role === "assistant") {
457
- return buildAssistantMessage(msg);
300
+ return buildAssistantMessage(msg, thinkingField);
458
301
  }
459
302
  if (msg.role === "user" && msg.attachments && msg.attachments.length > 0) {
460
303
  const content = buildAttachmentContent(msg.content, msg.attachments, modelSupportsVision2);
@@ -479,10 +322,10 @@ function convertTools(tools) {
479
322
  }
480
323
  }));
481
324
  }
482
- async function buildChatCompletionCreateParams(model, request, profile, capabilities, disableThinking, isStreaming) {
325
+ async function buildChatCompletionCreateParams(model, request, profile, capabilities, reasoningEffort, isStreaming, thinkingField) {
483
326
  const userVisionOverride = request.modelSettings?.supportsVision;
484
327
  const modelSupportsVision2 = userVisionOverride ?? profile.supportsVision ?? false;
485
- const convertedMessages = convertMessages(request.messages, modelSupportsVision2);
328
+ const convertedMessages = convertMessages(request.messages, modelSupportsVision2, thinkingField);
486
329
  const temperature = request.modelSettings?.temperature ?? request.temperature ?? profile.temperature;
487
330
  const maxTokens = request.modelSettings?.maxTokens ?? request.maxTokens ?? profile.defaultMaxTokens;
488
331
  const topP = request.modelSettings?.topP ?? profile.topP;
@@ -502,23 +345,34 @@ async function buildChatCompletionCreateParams(model, request, profile, capabili
502
345
  ;
503
346
  params["top_k"] = topK;
504
347
  }
505
- const shouldDisableThinking = disableThinking || request.disableThinking;
506
- if (capabilities.supportsChatTemplateKwargs && profile.supportsReasoning && shouldDisableThinking) {
348
+ const resolvedEffort = reasoningEffort ?? request.reasoningEffort;
349
+ if (resolvedEffort) {
507
350
  ;
508
- params["chat_template_kwargs"] = { enable_thinking: false };
351
+ params["reasoning_effort"] = resolvedEffort;
352
+ const chatTemplateKwargs = request.modelSettings?.chatTemplateKwargs;
353
+ if (chatTemplateKwargs) {
354
+ ;
355
+ params["chat_template_kwargs"] = chatTemplateKwargs;
356
+ } else if (capabilities.supportsChatTemplateKwargs) {
357
+ ;
358
+ params["chat_template_kwargs"] = {
359
+ enable_thinking: resolvedEffort !== "none"
360
+ };
361
+ }
509
362
  }
510
363
  const modelParams = buildModelParams({ temperature, topP, topK, maxTokens });
511
364
  return { params, modelParams };
512
365
  }
513
366
  async function buildCreateParamsFromInput(input, isStreaming) {
514
- const { model, request, profile, capabilities, disableThinking } = input;
367
+ const { model, request, profile, capabilities, reasoningEffort, thinkingField } = input;
515
368
  return buildChatCompletionCreateParams(
516
369
  model,
517
370
  request,
518
371
  profile,
519
372
  capabilities,
520
- !!disableThinking,
521
- isStreaming
373
+ reasoningEffort,
374
+ isStreaming,
375
+ thinkingField
522
376
  );
523
377
  }
524
378
  var buildNonStreamingCreateParams = (input) => buildCreateParamsFromInput(input, false);
@@ -537,20 +391,6 @@ function mapFinishReason(reason) {
537
391
  return "stop";
538
392
  }
539
393
  }
540
- function extractThinking(content) {
541
- const thinkRegex = /<think>([\s\S]*?)<\/think>/g;
542
- let thinkingContent = "";
543
- let cleanContent = content;
544
- let match;
545
- while ((match = thinkRegex.exec(content)) !== null) {
546
- thinkingContent += match[1];
547
- cleanContent = cleanContent.replace(match[0], "");
548
- }
549
- return {
550
- content: cleanContent.trim(),
551
- thinkingContent: thinkingContent.trim() || null
552
- };
553
- }
554
394
 
555
395
  // src/server/llm/streaming.ts
556
396
  async function* streamWithSegments(client, request) {
@@ -630,10 +470,9 @@ async function* streamWithSegments(client, request) {
630
470
  const ttft = ((firstTokenTime ?? endTime) - startTime) / 1e3;
631
471
  const completionTime = (endTime - (firstTokenTime ?? startTime)) / 1e3;
632
472
  const { promptTokens, completionTokens } = response.usage;
633
- const effectiveThinkingContent = thinkingContent || content === "" && response.reasoning_content || "";
634
473
  return {
635
474
  content,
636
- thinkingContent: effectiveThinkingContent,
475
+ thinkingContent,
637
476
  toolCalls,
638
477
  response,
639
478
  segments,
@@ -649,17 +488,13 @@ async function* streamWithSegments(client, request) {
649
488
  export {
650
489
  getModelProfile,
651
490
  modelSupportsVision,
652
- ensureVersionPrefix,
653
- stripVersionPrefix,
654
- buildModelsUrl,
655
491
  getBackendCapabilities,
656
- detectBackend,
657
492
  getBackendDisplayName,
658
493
  buildModelParams,
494
+ getThinking,
659
495
  buildNonStreamingCreateParams,
660
496
  buildStreamingCreateParams,
661
497
  mapFinishReason,
662
- extractThinking,
663
498
  streamWithSegments
664
499
  };
665
- //# sourceMappingURL=chunk-VIIRNJDT.js.map
500
+ //# sourceMappingURL=chunk-FFEAEPJB.js.map
@@ -1,9 +1,3 @@
1
- import {
2
- detectModel
3
- } from "./chunk-UKTPL5ZG.js";
4
- import {
5
- detectBackend
6
- } from "./chunk-VIIRNJDT.js";
7
1
  import {
8
2
  getGlobalConfigPath
9
3
  } from "./chunk-CQGTEGKL.js";
@@ -13,26 +7,6 @@ import { z } from "zod";
13
7
  import { randomUUID } from "crypto";
14
8
  import { readFile, writeFile, mkdir, access } from "fs/promises";
15
9
  import { dirname } from "path";
16
- var SMART_DEFAULTS = ["http://localhost:8000", "http://localhost:11434", "http://localhost:8080"];
17
- async function trySmartDefaults(_mode) {
18
- const results = await Promise.all(
19
- SMART_DEFAULTS.map(async (url) => {
20
- try {
21
- const [backend, model] = await Promise.all([
22
- detectBackend(url, void 0, true),
23
- detectModel(url, 1, true)
24
- // Only 1 retry attempt
25
- ]);
26
- if (backend !== "unknown" && model) {
27
- return { url, backend, model };
28
- }
29
- } catch {
30
- }
31
- return null;
32
- })
33
- );
34
- return results.find((r) => r !== null) || null;
35
- }
36
10
  async function configFileExists(mode) {
37
11
  const configPath = getGlobalConfigPath(mode);
38
12
  try {
@@ -42,17 +16,7 @@ async function configFileExists(mode) {
42
16
  return false;
43
17
  }
44
18
  }
45
- var backendSchema = z.enum([
46
- "auto",
47
- "vllm",
48
- "sglang",
49
- "ollama",
50
- "llamacpp",
51
- "openai",
52
- "anthropic",
53
- "opencode-go",
54
- "unknown"
55
- ]);
19
+ var backendSchema = z.enum(["vllm", "sglang", "ollama", "llamacpp", "openai", "anthropic", "opencode-go", "unknown"]);
56
20
  var modelConfigSchema = z.object({
57
21
  id: z.string(),
58
22
  contextWindow: z.number(),
@@ -122,10 +86,17 @@ var configSchema = z.object({
122
86
  var oldLlmSchema = z.object({
123
87
  url: z.string().url().default("http://localhost:8000/v1"),
124
88
  model: z.string().default("auto"),
125
- backend: z.enum(["auto", "vllm", "sglang", "ollama", "llamacpp"]).default("auto"),
89
+ backend: z.enum(["vllm", "sglang", "ollama", "llamacpp", "unknown"]).default("unknown"),
126
90
  maxContext: z.number().default(2e5),
127
- disableThinking: z.boolean().default(false),
91
+ // Deprecated: use reasoningEffort instead
92
+ disableThinking: z.boolean().optional(),
93
+ reasoningEffort: z.string().optional(),
128
94
  apiKey: z.string().optional()
95
+ }).transform((data) => {
96
+ if (data.disableThinking && !data.reasoningEffort) {
97
+ return { ...data, reasoningEffort: "none", disableThinking: void 0 };
98
+ }
99
+ return { ...data, disableThinking: void 0 };
129
100
  });
130
101
  var oldConfigSchema = z.object({
131
102
  llm: oldLlmSchema,
@@ -141,7 +112,8 @@ function migrateConfig(raw) {
141
112
  const obj = raw;
142
113
  let migrationOccurred = false;
143
114
  const providers = obj.providers.map((p) => {
144
- const { model, maxContext, models: existingModels, ...rest } = p;
115
+ const { model, maxContext, models: existingModels, backend, ...rest } = p;
116
+ const normalizedBackend = backend === "auto" ? "unknown" : backend;
145
117
  let models = existingModels ?? [];
146
118
  if (maxContext !== void 0 && (existingModels === void 0 || existingModels.length === 0)) {
147
119
  migrationOccurred = true;
@@ -155,6 +127,7 @@ function migrateConfig(raw) {
155
127
  }
156
128
  return {
157
129
  ...rest,
130
+ backend: normalizedBackend,
158
131
  models
159
132
  };
160
133
  });
@@ -189,6 +162,11 @@ function migrateConfig(raw) {
189
162
  };
190
163
  }
191
164
  if (typeof raw === "object" && raw !== null && "llm" in raw) {
165
+ const rawObj = raw;
166
+ const llm = rawObj["llm"];
167
+ if (llm && llm["backend"] === "auto") {
168
+ llm["backend"] = "unknown";
169
+ }
192
170
  const oldConfig = oldConfigSchema.parse(raw);
193
171
  const providerId = randomUUID();
194
172
  const models = [
@@ -415,9 +393,8 @@ function mergeConfigs(...configs) {
415
393
  llm: {
416
394
  url: "http://localhost:8000/v1",
417
395
  model: "auto",
418
- backend: "auto",
419
- maxContext: 2e5,
420
- disableThinking: false
396
+ backend: "unknown",
397
+ maxContext: 2e5
421
398
  },
422
399
  server: { port: 10369, host: "127.0.0.1", openBrowser: true },
423
400
  logging: { level: "error" }
@@ -427,7 +404,6 @@ function mergeConfigs(...configs) {
427
404
  }
428
405
 
429
406
  export {
430
- trySmartDefaults,
431
407
  configFileExists,
432
408
  getVisionFallback,
433
409
  migrateConfig,
@@ -443,4 +419,4 @@ export {
443
419
  activateProvider,
444
420
  mergeConfigs
445
421
  };
446
- //# sourceMappingURL=chunk-EZUR7OEP.js.map
422
+ //# sourceMappingURL=chunk-HPCGVAS4.js.map