openfox 2.0.0-beta.8 → 2.0.0

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-XIAY7O5X.js → chat-handler-LJMW4OK3.js} +9 -9
  3. package/dist/{chunk-QN5ST54E.js → chunk-32GQUDLN.js} +118 -97
  4. package/dist/{chunk-IGSZUXQP.js → chunk-7ZMMDZU7.js} +435 -33
  5. package/dist/{chunk-CDDMHSZF.js → chunk-CK6LGE7G.js} +10 -6
  6. package/dist/{chunk-7FDY3EOH.js → chunk-FFEAEPJB.js} +80 -226
  7. package/dist/{chunk-2ZS2B5HW.js → chunk-HPCGVAS4.js} +21 -45
  8. package/dist/{chunk-XJEOP6XU.js → chunk-ITWVFGFV.js} +1 -30
  9. package/dist/{chunk-DFITQ75T.js → chunk-LEDG5WAN.js} +29 -35
  10. package/dist/{chunk-GJ47CMZM.js → chunk-MFUPS6UE.js} +6 -6
  11. package/dist/{chunk-NPHYEUYE.js → chunk-XEK3KII6.js} +55 -4
  12. package/dist/{chunk-GJ34YIOL.js → chunk-ZDY4WMZJ.js} +185 -71
  13. package/dist/cli/dev.js +1 -1
  14. package/dist/cli/index.js +1 -1
  15. package/dist/{config-QUT7YZQ7.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-GAOENX5Q.js → orchestrator-LX6FKB6L.js} +8 -8
  19. package/dist/package.json +2 -1
  20. package/dist/{processor-6VIYGURD.js → processor-NMYSEBC7.js} +11 -6
  21. package/dist/{protocol-CDOV1pyc.d.ts → protocol-D59sCy9L.d.ts} +15 -6
  22. package/dist/{provider-4T6BVPMD.js → provider-DTNQYCMV.js} +9 -20
  23. package/dist/provider-manager-LMHAHLIF.js +15 -0
  24. package/dist/{serve-2V7T6GDG.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-SDXWIYSA.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-EMJGF3A7.js +0 -466
  35. package/dist/web/assets/index-BJuF4wi7.js +0 -299
@@ -1,175 +1,8 @@
1
- import {
2
- logger
3
- } from "./chunk-K44MW7JJ.js";
4
-
5
- // src/server/llm/backend.ts
6
- var BACKEND_CAPABILITIES = {
7
- vllm: {
8
- supportsReasoningField: true,
9
- supportsChatTemplateKwargs: true,
10
- supportsTopK: true
11
- },
12
- sglang: {
13
- supportsReasoningField: true,
14
- supportsChatTemplateKwargs: true,
15
- supportsTopK: true
16
- },
17
- ollama: {
18
- supportsReasoningField: false,
19
- supportsChatTemplateKwargs: false,
20
- supportsTopK: false
21
- },
22
- llamacpp: {
23
- supportsReasoningField: false,
24
- supportsChatTemplateKwargs: false,
25
- supportsTopK: true
26
- },
27
- "opencode-go": {
28
- supportsReasoningField: false,
29
- supportsChatTemplateKwargs: false,
30
- supportsTopK: true
31
- },
32
- unknown: {
33
- // Assume vLLM-like for unknown backends
34
- supportsReasoningField: true,
35
- supportsChatTemplateKwargs: true,
36
- supportsTopK: true
37
- }
38
- };
39
- function getBackendCapabilities(backend) {
40
- return BACKEND_CAPABILITIES[backend];
41
- }
42
- async function detectBackend(baseUrl, explicitBackend, silent = false) {
43
- if (explicitBackend && explicitBackend !== "unknown") {
44
- if (silent) {
45
- logger.debug("Using explicit backend", { backend: explicitBackend });
46
- } else {
47
- logger.info("Using explicit backend", { backend: explicitBackend });
48
- }
49
- return explicitBackend;
50
- }
51
- const probeUrl = baseUrl.replace(/\/v1\/?$/, "");
52
- try {
53
- if (await probeOllama(probeUrl)) {
54
- if (silent) {
55
- logger.debug("Detected Ollama backend", { url: probeUrl });
56
- } else {
57
- logger.info("Detected Ollama backend", { url: probeUrl });
58
- }
59
- return "ollama";
60
- }
61
- if (await probeLlamaCpp(probeUrl)) {
62
- if (silent) {
63
- logger.debug("Detected llama.cpp backend", { url: probeUrl });
64
- } else {
65
- logger.info("Detected llama.cpp backend", { url: probeUrl });
66
- }
67
- return "llamacpp";
68
- }
69
- if (await probeSGLang(probeUrl)) {
70
- if (silent) {
71
- logger.debug("Detected SGLang backend", { url: probeUrl });
72
- } else {
73
- logger.info("Detected SGLang backend", { url: probeUrl });
74
- }
75
- return "sglang";
76
- }
77
- if (await probeOpenAI(baseUrl)) {
78
- if (silent) {
79
- logger.debug("Detected vLLM backend (OpenAI-compatible)", { url: baseUrl });
80
- } else {
81
- logger.info("Detected vLLM backend (OpenAI-compatible)", { url: baseUrl });
82
- }
83
- return "vllm";
84
- }
85
- if (silent) {
86
- logger.debug("Could not detect backend, using unknown", { url: baseUrl });
87
- } else {
88
- logger.warn("Could not detect backend, using unknown", { url: baseUrl });
89
- }
90
- return "unknown";
91
- } catch (error) {
92
- if (silent) {
93
- logger.debug("Backend detection failed", {
94
- url: baseUrl,
95
- error: error instanceof Error ? error.message : String(error)
96
- });
97
- } else {
98
- logger.warn("Backend detection failed", {
99
- url: baseUrl,
100
- error: error instanceof Error ? error.message : String(error)
101
- });
102
- }
103
- return "unknown";
104
- }
105
- }
106
- async function probeOllama(baseUrl) {
107
- try {
108
- const response = await fetch(`${baseUrl}/api/tags`, {
109
- signal: AbortSignal.timeout(5e3)
110
- });
111
- return response.ok;
112
- } catch {
113
- return false;
114
- }
115
- }
116
- async function probeLlamaCpp(baseUrl) {
117
- try {
118
- const response = await fetch(`${baseUrl}/health`, {
119
- signal: AbortSignal.timeout(5e3)
120
- });
121
- if (!response.ok) return false;
122
- const data = await response.json();
123
- return "slots_idle" in data || "slots_processing" in data;
124
- } catch {
125
- return false;
126
- }
127
- }
128
- async function probeSGLang(baseUrl) {
129
- try {
130
- const response = await fetch(`${baseUrl}/get_model_info`, {
131
- signal: AbortSignal.timeout(5e3)
132
- });
133
- return response.ok;
134
- } catch {
135
- return false;
136
- }
137
- }
138
- async function probeOpenAI(baseUrl) {
139
- try {
140
- const url = baseUrl.includes("/v1") ? baseUrl : `${baseUrl}/v1`;
141
- const response = await fetch(`${url}/models`, {
142
- signal: AbortSignal.timeout(5e3)
143
- });
144
- return response.ok;
145
- } catch {
146
- return false;
147
- }
148
- }
149
- function getBackendDisplayName(backend) {
150
- switch (backend) {
151
- case "vllm":
152
- return "vLLM";
153
- case "sglang":
154
- return "SGLang";
155
- case "ollama":
156
- return "Ollama";
157
- case "llamacpp":
158
- return "llama.cpp";
159
- case "opencode-go":
160
- return "OpenCode Go";
161
- case "unknown":
162
- return "Unknown";
163
- }
164
- }
165
-
166
1
  // src/server/llm/profiles.ts
167
2
  var DEFAULT_PROFILE = {
168
3
  name: "default",
169
4
  temperature: 0.7,
170
5
  topP: 0.9,
171
- supportsReasoning: false,
172
- reasoningAsContent: false,
173
6
  defaultMaxTokens: 4096,
174
7
  supportsVision: true
175
8
  };
@@ -177,8 +10,6 @@ var MOCK_PROFILE = {
177
10
  name: "mock",
178
11
  temperature: 0.7,
179
12
  topP: 0.9,
180
- supportsReasoning: false,
181
- reasoningAsContent: false,
182
13
  defaultMaxTokens: 1024,
183
14
  supportsVision: false
184
15
  };
@@ -189,8 +20,6 @@ var MODEL_PROFILES = [
189
20
  name: "Mistral",
190
21
  temperature: 0.7,
191
22
  topP: 0.9,
192
- supportsReasoning: false,
193
- reasoningAsContent: false,
194
23
  defaultMaxTokens: 16384,
195
24
  supportsVision: false
196
25
  }
@@ -204,8 +33,6 @@ var MODEL_PROFILES = [
204
33
  topP: 0.95,
205
34
  topK: 40,
206
35
  // "This model supports only non-thinking mode and does not generate <think></think> blocks"
207
- supportsReasoning: false,
208
- reasoningAsContent: false,
209
36
  defaultMaxTokens: 16384,
210
37
  supportsVision: false
211
38
  }
@@ -216,8 +43,6 @@ var MODEL_PROFILES = [
216
43
  name: "Qwen3",
217
44
  temperature: 0.7,
218
45
  topP: 0.9,
219
- supportsReasoning: true,
220
- reasoningAsContent: false,
221
46
  defaultMaxTokens: 16384,
222
47
  supportsVision: false
223
48
  }
@@ -228,8 +53,6 @@ var MODEL_PROFILES = [
228
53
  name: "Qwen3-VL",
229
54
  temperature: 0.7,
230
55
  topP: 0.9,
231
- supportsReasoning: true,
232
- reasoningAsContent: false,
233
56
  defaultMaxTokens: 16384,
234
57
  supportsVision: true
235
58
  }
@@ -240,8 +63,6 @@ var MODEL_PROFILES = [
240
63
  name: "DeepSeek",
241
64
  temperature: 0.6,
242
65
  topP: 0.95,
243
- supportsReasoning: true,
244
- reasoningAsContent: false,
245
66
  defaultMaxTokens: 16384,
246
67
  supportsVision: false
247
68
  }
@@ -253,8 +74,6 @@ var MODEL_PROFILES = [
253
74
  temperature: 1,
254
75
  topP: 0.95,
255
76
  topK: 40,
256
- supportsReasoning: true,
257
- reasoningAsContent: false,
258
77
  defaultMaxTokens: 16384,
259
78
  supportsVision: false
260
79
  }
@@ -266,8 +85,6 @@ var MODEL_PROFILES = [
266
85
  temperature: 1,
267
86
  topP: 0.95,
268
87
  topK: 40,
269
- supportsReasoning: true,
270
- reasoningAsContent: false,
271
88
  defaultMaxTokens: 16384,
272
89
  supportsVision: false
273
90
  }
@@ -279,8 +96,6 @@ var MODEL_PROFILES = [
279
96
  temperature: 1,
280
97
  topP: 0.95,
281
98
  topK: 40,
282
- supportsReasoning: true,
283
- reasoningAsContent: false,
284
99
  defaultMaxTokens: 16384,
285
100
  supportsVision: false
286
101
  }
@@ -292,8 +107,6 @@ var MODEL_PROFILES = [
292
107
  temperature: 1,
293
108
  topP: 0.95,
294
109
  topK: 40,
295
- supportsReasoning: true,
296
- reasoningAsContent: false,
297
110
  defaultMaxTokens: 16384,
298
111
  supportsVision: true
299
112
  }
@@ -304,8 +117,6 @@ var MODEL_PROFILES = [
304
117
  name: "LLaVA",
305
118
  temperature: 0.7,
306
119
  topP: 0.9,
307
- supportsReasoning: false,
308
- reasoningAsContent: false,
309
120
  defaultMaxTokens: 16384,
310
121
  supportsVision: true
311
122
  }
@@ -316,8 +127,6 @@ var MODEL_PROFILES = [
316
127
  name: "Llama",
317
128
  temperature: 0.7,
318
129
  topP: 0.9,
319
- supportsReasoning: false,
320
- reasoningAsContent: false,
321
130
  defaultMaxTokens: 16384,
322
131
  supportsVision: false
323
132
  }
@@ -328,8 +137,6 @@ var MODEL_PROFILES = [
328
137
  name: "Claude",
329
138
  temperature: 0.7,
330
139
  topP: 0.9,
331
- supportsReasoning: true,
332
- reasoningAsContent: false,
333
140
  defaultMaxTokens: 16384,
334
141
  supportsVision: false
335
142
  }
@@ -340,8 +147,6 @@ var MODEL_PROFILES = [
340
147
  name: "Gemma 4",
341
148
  temperature: 0.7,
342
149
  topP: 0.9,
343
- supportsReasoning: true,
344
- reasoningAsContent: false,
345
150
  defaultMaxTokens: 16384,
346
151
  supportsVision: true
347
152
  }
@@ -363,6 +168,53 @@ function modelSupportsVision(modelName) {
363
168
  return getModelProfile(modelName).supportsVision;
364
169
  }
365
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
+
366
218
  // src/server/llm/client-pure.ts
367
219
  function buildModelParams(params) {
368
220
  return {
@@ -392,7 +244,14 @@ function convertToolCalls(toolCalls) {
392
244
  }
393
245
  }));
394
246
  }
395
- 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) {
396
255
  const result = {
397
256
  role: "assistant",
398
257
  content: msg.content || null
@@ -401,7 +260,7 @@ function buildAssistantMessage(msg) {
401
260
  result["tool_calls"] = convertToolCalls(msg.toolCalls);
402
261
  }
403
262
  if (msg.thinkingContent) {
404
- result["reasoning_content"] = msg.thinkingContent;
263
+ result[thinkingField ?? "reasoning"] = msg.thinkingContent;
405
264
  }
406
265
  return result;
407
266
  }
@@ -417,7 +276,7 @@ function convertAttachmentSync(attachment, modelSupportsVision2) {
417
276
  text: `[Image: ${attachment.filename || "image"}] (vision not supported, cannot describe)`
418
277
  };
419
278
  }
420
- function convertMessages(messages, modelSupportsVision2) {
279
+ function convertMessages(messages, modelSupportsVision2, thinkingField) {
421
280
  const filtered = messages.filter((msg) => {
422
281
  return !(msg.role === "assistant" && !msg.content?.trim() && (!msg.toolCalls || msg.toolCalls.length === 0));
423
282
  });
@@ -438,7 +297,7 @@ function convertMessages(messages, modelSupportsVision2) {
438
297
  };
439
298
  }
440
299
  if (msg.role === "assistant") {
441
- return buildAssistantMessage(msg);
300
+ return buildAssistantMessage(msg, thinkingField);
442
301
  }
443
302
  if (msg.role === "user" && msg.attachments && msg.attachments.length > 0) {
444
303
  const content = buildAttachmentContent(msg.content, msg.attachments, modelSupportsVision2);
@@ -463,10 +322,10 @@ function convertTools(tools) {
463
322
  }
464
323
  }));
465
324
  }
466
- async function buildChatCompletionCreateParams(model, request, profile, capabilities, disableThinking, isStreaming) {
325
+ async function buildChatCompletionCreateParams(model, request, profile, capabilities, reasoningEffort, isStreaming, thinkingField) {
467
326
  const userVisionOverride = request.modelSettings?.supportsVision;
468
327
  const modelSupportsVision2 = userVisionOverride ?? profile.supportsVision ?? false;
469
- const convertedMessages = convertMessages(request.messages, modelSupportsVision2);
328
+ const convertedMessages = convertMessages(request.messages, modelSupportsVision2, thinkingField);
470
329
  const temperature = request.modelSettings?.temperature ?? request.temperature ?? profile.temperature;
471
330
  const maxTokens = request.modelSettings?.maxTokens ?? request.maxTokens ?? profile.defaultMaxTokens;
472
331
  const topP = request.modelSettings?.topP ?? profile.topP;
@@ -486,23 +345,34 @@ async function buildChatCompletionCreateParams(model, request, profile, capabili
486
345
  ;
487
346
  params["top_k"] = topK;
488
347
  }
489
- const shouldDisableThinking = disableThinking || request.disableThinking;
490
- if (capabilities.supportsChatTemplateKwargs && profile.supportsReasoning && shouldDisableThinking) {
348
+ const resolvedEffort = reasoningEffort ?? request.reasoningEffort;
349
+ if (resolvedEffort) {
491
350
  ;
492
- 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
+ }
493
362
  }
494
363
  const modelParams = buildModelParams({ temperature, topP, topK, maxTokens });
495
364
  return { params, modelParams };
496
365
  }
497
366
  async function buildCreateParamsFromInput(input, isStreaming) {
498
- const { model, request, profile, capabilities, disableThinking } = input;
367
+ const { model, request, profile, capabilities, reasoningEffort, thinkingField } = input;
499
368
  return buildChatCompletionCreateParams(
500
369
  model,
501
370
  request,
502
371
  profile,
503
372
  capabilities,
504
- !!disableThinking,
505
- isStreaming
373
+ reasoningEffort,
374
+ isStreaming,
375
+ thinkingField
506
376
  );
507
377
  }
508
378
  var buildNonStreamingCreateParams = (input) => buildCreateParamsFromInput(input, false);
@@ -521,20 +391,6 @@ function mapFinishReason(reason) {
521
391
  return "stop";
522
392
  }
523
393
  }
524
- function extractThinking(content) {
525
- const thinkRegex = /<think>([\s\S]*?)<\/think>/g;
526
- let thinkingContent = "";
527
- let cleanContent = content;
528
- let match;
529
- while ((match = thinkRegex.exec(content)) !== null) {
530
- thinkingContent += match[1];
531
- cleanContent = cleanContent.replace(match[0], "");
532
- }
533
- return {
534
- content: cleanContent.trim(),
535
- thinkingContent: thinkingContent.trim() || null
536
- };
537
- }
538
394
 
539
395
  // src/server/llm/streaming.ts
540
396
  async function* streamWithSegments(client, request) {
@@ -614,10 +470,9 @@ async function* streamWithSegments(client, request) {
614
470
  const ttft = ((firstTokenTime ?? endTime) - startTime) / 1e3;
615
471
  const completionTime = (endTime - (firstTokenTime ?? startTime)) / 1e3;
616
472
  const { promptTokens, completionTokens } = response.usage;
617
- const effectiveThinkingContent = thinkingContent || content === "" && response.reasoning_content || "";
618
473
  return {
619
474
  content,
620
- thinkingContent: effectiveThinkingContent,
475
+ thinkingContent,
621
476
  toolCalls,
622
477
  response,
623
478
  segments,
@@ -634,13 +489,12 @@ export {
634
489
  getModelProfile,
635
490
  modelSupportsVision,
636
491
  getBackendCapabilities,
637
- detectBackend,
638
492
  getBackendDisplayName,
639
493
  buildModelParams,
494
+ getThinking,
640
495
  buildNonStreamingCreateParams,
641
496
  buildStreamingCreateParams,
642
497
  mapFinishReason,
643
- extractThinking,
644
498
  streamWithSegments
645
499
  };
646
- //# sourceMappingURL=chunk-7FDY3EOH.js.map
500
+ //# sourceMappingURL=chunk-FFEAEPJB.js.map
@@ -1,9 +1,3 @@
1
- import {
2
- detectModel
3
- } from "./chunk-EMJGF3A7.js";
4
- import {
5
- detectBackend
6
- } from "./chunk-7FDY3EOH.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-2ZS2B5HW.js.map
422
+ //# sourceMappingURL=chunk-HPCGVAS4.js.map
@@ -621,30 +621,12 @@ function foldSessionState(events, initialWindowId, maxTokens, initialMessages) {
621
621
  dynamicContextChanged: false
622
622
  };
623
623
  const contextState = baseContextState.compactionCount !== contextResult.compactionCount || baseContextState.maxTokens !== maxTokens ? { ...baseContextState, compactionCount: contextResult.compactionCount, maxTokens } : { ...baseContextState, maxTokens };
624
- let messageReminderMode;
625
- let snapshotReminderMode;
626
624
  let cachedSystemPrompt;
627
625
  let dynamicContextHash;
628
626
  for (let i = events.length - 1; i >= 0; i--) {
629
627
  const event = events[i];
630
- if (event.type === "message.start") {
631
- const data = event.data;
632
- if (data.role === "user" && data.messageKind === "auto-prompt" && data.content?.includes("<system-reminder>")) {
633
- if (data.content.includes("Plan Mode")) {
634
- messageReminderMode = { seq: event.seq, mode: "planner" };
635
- } else if (data.content.includes("Build Mode")) {
636
- messageReminderMode = { seq: event.seq, mode: "builder" };
637
- }
638
- }
639
- }
640
628
  if (event.type === "turn.snapshot") {
641
629
  const snapshotData = event.data;
642
- if (snapshotData.lastModeWithReminder) {
643
- snapshotReminderMode = {
644
- seq: event.seq,
645
- mode: snapshotData.lastModeWithReminder
646
- };
647
- }
648
630
  if (snapshotData.cachedSystemPrompt && !cachedSystemPrompt) {
649
631
  cachedSystemPrompt = snapshotData.cachedSystemPrompt;
650
632
  }
@@ -656,14 +638,6 @@ function foldSessionState(events, initialWindowId, maxTokens, initialMessages) {
656
638
  }
657
639
  }
658
640
  }
659
- let lastModeWithReminder;
660
- if (messageReminderMode && snapshotReminderMode) {
661
- lastModeWithReminder = messageReminderMode.seq > snapshotReminderMode.seq ? messageReminderMode.mode : snapshotReminderMode.mode;
662
- } else if (snapshotReminderMode) {
663
- lastModeWithReminder = snapshotReminderMode.mode;
664
- } else if (messageReminderMode) {
665
- lastModeWithReminder = messageReminderMode.mode;
666
- }
667
641
  let sessionInit;
668
642
  let sessionTitle;
669
643
  const visionFallbacks = [];
@@ -758,7 +732,6 @@ function foldSessionState(events, initialWindowId, maxTokens, initialMessages) {
758
732
  contextState,
759
733
  currentContextWindowId: contextResult.currentContextWindowId,
760
734
  readFiles: contextResult.readFiles,
761
- ...lastModeWithReminder !== void 0 && { lastModeWithReminder },
762
735
  ...cachedSystemPrompt !== void 0 && { cachedSystemPrompt },
763
736
  ...dynamicContextHash !== void 0 && { dynamicContextHash },
764
737
  pendingConfirmations,
@@ -784,7 +757,6 @@ function buildSnapshot(foldedState, latestSeq, snapshotAt = Date.now()) {
784
757
  currentContextWindowId: foldedState.currentContextWindowId,
785
758
  todos: foldedState.todos,
786
759
  readFiles: foldedState.readFiles,
787
- ...foldedState.lastModeWithReminder !== void 0 && { lastModeWithReminder: foldedState.lastModeWithReminder },
788
760
  ...foldedState.cachedSystemPrompt !== void 0 && { cachedSystemPrompt: foldedState.cachedSystemPrompt },
789
761
  ...foldedState.dynamicContextHash !== void 0 && { dynamicContextHash: foldedState.dynamicContextHash },
790
762
  snapshotSeq: latestSeq,
@@ -841,7 +813,6 @@ function buildSnapshotFromSessionState(input) {
841
813
  snapshotSeq: latestSeq,
842
814
  snapshotAt,
843
815
  ...foldedState.sessionInit !== void 0 && { sessionInit: foldedState.sessionInit },
844
- ...foldedState.lastModeWithReminder !== void 0 && { lastModeWithReminder: foldedState.lastModeWithReminder },
845
816
  ...input.cachedSystemPrompt !== void 0 ? { cachedSystemPrompt: input.cachedSystemPrompt } : foldedState.cachedSystemPrompt !== void 0 ? { cachedSystemPrompt: foldedState.cachedSystemPrompt } : {},
846
817
  ...input.dynamicContextHash !== void 0 ? { dynamicContextHash: input.dynamicContextHash } : foldedState.dynamicContextHash !== void 0 ? { dynamicContextHash: foldedState.dynamicContextHash } : {}
847
818
  };
@@ -885,4 +856,4 @@ export {
885
856
  getMessagesForWindow,
886
857
  buildContextMessagesFromMessages
887
858
  };
888
- //# sourceMappingURL=chunk-XJEOP6XU.js.map
859
+ //# sourceMappingURL=chunk-ITWVFGFV.js.map