openfox 2.0.61 → 2.0.63

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 (40) hide show
  1. package/README.md +14 -0
  2. package/dist/{chat-handler-6DRGMDXZ.js → chat-handler-WNARPARQ.js} +11 -11
  3. package/dist/{chunk-KX4C5Q5J.js → chunk-5OPZLQDV.js} +196 -114
  4. package/dist/{chunk-S5DWUGKZ.js → chunk-FGG4KRFX.js} +6 -6
  5. package/dist/{chunk-ZHSCXD75.js → chunk-IVJYQZSN.js} +65 -6
  6. package/dist/{chunk-LHTVTDQQ.js → chunk-N5JF4RYJ.js} +362 -92
  7. package/dist/{chunk-GJU35MDV.js → chunk-OESYKZCM.js} +2 -2
  8. package/dist/{chunk-JKLPWTUN.js → chunk-QBYQ7KDX.js} +9 -4
  9. package/dist/{chunk-NVPVDDQZ.js → chunk-QJ5FH5DP.js} +14 -10
  10. package/dist/{chunk-H774GQJW.js → chunk-RYIREJAW.js} +234 -40
  11. package/dist/{chunk-AA4G4DGK.js → chunk-W4PUAODY.js} +34 -44
  12. package/dist/{chunk-43UFGATL.js → chunk-WGAAQASA.js} +31 -9
  13. package/dist/{chunk-6VDCH5ML.js → chunk-X5YCWKNS.js} +4 -4
  14. package/dist/cli/dev.js +1 -1
  15. package/dist/cli/index.js +1 -1
  16. package/dist/{client-KRFGMNGN.js → client-LAKW7TA5.js} +3 -3
  17. package/dist/{compactor-Q33AJPCQ.js → compactor-I3N56PSJ.js} +4 -4
  18. package/dist/{config-GMQUPNBY.js → config-EUMVEFHU.js} +2 -2
  19. package/dist/{orchestrator-AHCSLBB3.js → orchestrator-OIBLY5QJ.js} +14 -14
  20. package/dist/package.json +6 -1
  21. package/dist/{processor-45VWLZIV.js → processor-27VCKRGB.js} +13 -12
  22. package/dist/protocol-Cq66hdDX.d.ts +375 -0
  23. package/dist/provider/index.d.ts +129 -0
  24. package/dist/provider/index.js +1 -0
  25. package/dist/{provider-LBYBC5AG.js → provider-GYOW4OWQ.js} +7 -9
  26. package/dist/{provider-manager-ABEUYU3K.js → provider-manager-HRHNF73A.js} +4 -5
  27. package/dist/{serve-V44O2QE6.js → serve-HB222ARV.js} +15 -16
  28. package/dist/server/index.d.ts +5 -87
  29. package/dist/server/index.js +12 -13
  30. package/dist/{server-JDB2QVKP.js → server-XDC7R2IX.js} +10 -14
  31. package/dist/shared/index.d.ts +3 -2
  32. package/dist/{tools-7QUMO5DJ.js → tools-W2FFSF4N.js} +7 -7
  33. package/dist/types-CDZakn7f.d.ts +89 -0
  34. package/dist/{protocol-J7khRG62.d.ts → types-akHmgvBk.d.ts} +17 -373
  35. package/dist/web/assets/{index-BGkyTfuQ.css → index-DvPmgi8F.css} +1 -1
  36. package/dist/web/assets/{index-CETZPQXr.js → index-bSaZSLjg.js} +74 -73
  37. package/dist/web/index.html +2 -2
  38. package/dist/web/sw.js +1 -1
  39. package/package.json +6 -1
  40. package/dist/chunk-M3RB4IF6.js +0 -114
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  COMPACTION_PROMPT,
3
3
  createMessageStartEvent
4
- } from "./chunk-6VDCH5ML.js";
4
+ } from "./chunk-X5YCWKNS.js";
5
5
  import {
6
6
  getCurrentWindowMessageOptions
7
7
  } from "./chunk-AIJE3RYH.js";
@@ -31,4 +31,4 @@ export {
31
31
  shouldCompact,
32
32
  getCompactionTarget
33
33
  };
34
- //# sourceMappingURL=chunk-GJU35MDV.js.map
34
+ //# sourceMappingURL=chunk-OESYKZCM.js.map
@@ -1,3 +1,6 @@
1
+ import {
2
+ getModelProfile
3
+ } from "./chunk-V4IE7HJY.js";
1
4
  import {
2
5
  getBackendCapabilities
3
6
  } from "./chunk-YHEQTVFV.js";
@@ -17,9 +20,6 @@ import {
17
20
  import {
18
21
  logger
19
22
  } from "./chunk-K44MW7JJ.js";
20
- import {
21
- getModelProfile
22
- } from "./chunk-V4IE7HJY.js";
23
23
 
24
24
  // src/server/llm/client.ts
25
25
  function createLLMClient(config, initialBackend = "unknown") {
@@ -162,6 +162,11 @@ function createLLMClient(config, initialBackend = "unknown") {
162
162
  throw new Error(`LLM stream idle timeout: no chunks received for ${idleTimeout}ms`);
163
163
  }
164
164
  lastChunkTime = Date.now();
165
+ if (!Array.isArray(chunk?.choices)) {
166
+ const streamError = chunk?.error;
167
+ const errorMessage = typeof streamError === "string" ? streamError : streamError && typeof streamError === "object" && "message" in streamError && typeof streamError.message === "string" ? streamError.message : "Invalid LLM stream chunk: missing choices";
168
+ throw new LLMError(errorMessage);
169
+ }
165
170
  responseId = chunk.id;
166
171
  if (chunk.usage) {
167
172
  usage = {
@@ -259,4 +264,4 @@ function createLLMClient(config, initialBackend = "unknown") {
259
264
  export {
260
265
  createLLMClient
261
266
  };
262
- //# sourceMappingURL=chunk-JKLPWTUN.js.map
267
+ //# sourceMappingURL=chunk-QBYQ7KDX.js.map
@@ -1,10 +1,3 @@
1
- import {
2
- createContextStateMessage,
3
- createSessionStateMessage
4
- } from "./chunk-F4PMNP7S.js";
5
- import {
6
- getPendingQuestionsForSession
7
- } from "./chunk-EU3WWTFH.js";
8
1
  import {
9
2
  getEventStore,
10
3
  getRuntimeConfig,
@@ -14,6 +7,13 @@ import {
14
7
  buildMessagesFromStoredEvents,
15
8
  foldPendingConfirmations
16
9
  } from "./chunk-TMUBLQFC.js";
10
+ import {
11
+ createContextStateMessage,
12
+ createSessionStateMessage
13
+ } from "./chunk-F4PMNP7S.js";
14
+ import {
15
+ getPendingQuestionsForSession
16
+ } from "./chunk-EU3WWTFH.js";
17
17
  import {
18
18
  logger
19
19
  } from "./chunk-K44MW7JJ.js";
@@ -127,11 +127,15 @@ async function generateSessionNameForSession(sessionId, userMessage, deps, signa
127
127
  const prompt = SESSION_NAME_PROMPT.replace("{message}", userMessage);
128
128
  try {
129
129
  let client;
130
- if (deps.getLLMClient && providerConfig) {
130
+ if (providerConfig && deps.getLLMClientForProvider) {
131
+ const providerClient = deps.getLLMClientForProvider(providerConfig.providerId, providerConfig.model);
132
+ if (!providerClient) return;
133
+ client = providerClient;
134
+ } else if (deps.getLLMClient && providerConfig) {
131
135
  client = deps.getLLMClient();
132
136
  client.setModel(providerConfig.model);
133
137
  } else if (providerConfig) {
134
- const { createLLMClient } = await import("./client-KRFGMNGN.js");
138
+ const { createLLMClient } = await import("./client-LAKW7TA5.js");
135
139
  client = createLLMClient({
136
140
  llm: {
137
141
  baseUrl: providerConfig.baseUrl,
@@ -180,4 +184,4 @@ export {
180
184
  buildRunChatTurnParams,
181
185
  generateSessionNameForSession
182
186
  };
183
- //# sourceMappingURL=chunk-NVPVDDQZ.js.map
187
+ //# sourceMappingURL=chunk-QJ5FH5DP.js.map
@@ -1,9 +1,12 @@
1
- import {
2
- clearModelCache
3
- } from "./chunk-M3RB4IF6.js";
4
1
  import {
5
2
  createLLMClient
6
- } from "./chunk-JKLPWTUN.js";
3
+ } from "./chunk-QBYQ7KDX.js";
4
+ import {
5
+ getModelProfile
6
+ } from "./chunk-V4IE7HJY.js";
7
+ import {
8
+ getBackendCapabilities
9
+ } from "./chunk-YHEQTVFV.js";
7
10
  import {
8
11
  buildModelsUrl,
9
12
  ensureVersionPrefix,
@@ -12,9 +15,150 @@ import {
12
15
  import {
13
16
  logger
14
17
  } from "./chunk-K44MW7JJ.js";
15
- import {
16
- getModelProfile
17
- } from "./chunk-V4IE7HJY.js";
18
+
19
+ // src/server/providers/adapters/transport-client.ts
20
+ function createTransportLLMClient(provider, modelId, transport) {
21
+ let model = modelId;
22
+ let backend = provider.backend;
23
+ const profileFor = (id) => {
24
+ const base = getModelProfile(id);
25
+ const configured = provider.models.find((item) => item.id === id);
26
+ return {
27
+ ...base,
28
+ ...configured?.defaultTemperature !== void 0 && { temperature: configured.defaultTemperature },
29
+ ...configured?.defaultTopP !== void 0 && { topP: configured.defaultTopP },
30
+ ...configured?.defaultTopK !== void 0 && { topK: configured.defaultTopK },
31
+ ...configured?.defaultMaxTokens !== void 0 && { defaultMaxTokens: configured.defaultMaxTokens },
32
+ ...configured?.supportsVision !== void 0 && { supportsVision: configured.supportsVision }
33
+ };
34
+ };
35
+ let profile = profileFor(model);
36
+ void getBackendCapabilities(backend);
37
+ const context = () => {
38
+ const configured = provider.models.find((item) => item.id === model);
39
+ return {
40
+ providerId: provider.id,
41
+ model: configured?.apiModelId ?? model,
42
+ catalogModel: model,
43
+ ...configured?.requestBody && { requestBody: configured.requestBody },
44
+ ...provider.credentialRef && { credentialRef: provider.credentialRef }
45
+ };
46
+ };
47
+ return {
48
+ getModel: () => model,
49
+ setModel(next) {
50
+ model = next;
51
+ profile = profileFor(next);
52
+ },
53
+ getProfile: () => profile,
54
+ getBackend: () => backend,
55
+ setBackend(next) {
56
+ backend = next;
57
+ },
58
+ complete: (request) => transport.complete(request, context()),
59
+ stream: (request) => transport.stream(request, context())
60
+ };
61
+ }
62
+
63
+ // src/server/llm/models.ts
64
+ var modelCache = /* @__PURE__ */ new Map();
65
+ var llmStatus = "unknown";
66
+ var lastActiveUrl = null;
67
+ var CACHE_TTL_MS = 3e4;
68
+ function getCacheKey(url) {
69
+ return stripVersionPrefix(url);
70
+ }
71
+ async function detectModel(llmBaseUrl, retries = 3, silent = false) {
72
+ const cacheKey = getCacheKey(llmBaseUrl);
73
+ const now = Date.now();
74
+ const cached = modelCache.get(cacheKey);
75
+ if (cached && now - cached.timestamp < CACHE_TTL_MS) {
76
+ lastActiveUrl = cacheKey;
77
+ llmStatus = "connected";
78
+ return cached.model;
79
+ }
80
+ const url = buildModelsUrl(llmBaseUrl);
81
+ for (let attempt = 1; attempt <= retries; attempt++) {
82
+ try {
83
+ if (silent) {
84
+ logger.debug("Fetching models from LLM server", { url, attempt });
85
+ }
86
+ const response = await fetch(url, {
87
+ signal: AbortSignal.timeout(1e4)
88
+ });
89
+ if (!response.ok) {
90
+ if (silent) {
91
+ logger.debug("Failed to fetch models from LLM server", { status: response.status, attempt });
92
+ } else {
93
+ logger.warn("Failed to fetch models from LLM server", { status: response.status, attempt });
94
+ }
95
+ if (attempt < retries) {
96
+ await new Promise((r) => setTimeout(r, 1e3 * attempt));
97
+ continue;
98
+ }
99
+ llmStatus = "disconnected";
100
+ return cached?.model ?? null;
101
+ }
102
+ const data = await response.json();
103
+ if (data.data && data.data.length > 0) {
104
+ const modelData = data.data[0];
105
+ const modelId = modelData.id;
106
+ modelCache.set(cacheKey, {
107
+ model: modelId,
108
+ modelInfo: modelData,
109
+ timestamp: now
110
+ });
111
+ lastActiveUrl = cacheKey;
112
+ llmStatus = "connected";
113
+ if (silent) {
114
+ logger.debug("Detected LLM model", {
115
+ model: modelId,
116
+ maxLen: modelData.max_model_len,
117
+ root: modelData.root
118
+ });
119
+ } else {
120
+ logger.info("Detected LLM model", {
121
+ model: modelId,
122
+ maxLen: modelData.max_model_len,
123
+ root: modelData.root
124
+ });
125
+ }
126
+ return modelId;
127
+ }
128
+ if (silent) {
129
+ logger.debug("LLM server returned empty models list");
130
+ } else {
131
+ logger.warn("LLM server returned empty models list");
132
+ }
133
+ llmStatus = "disconnected";
134
+ return null;
135
+ } catch (error) {
136
+ const errMsg = error instanceof Error ? error.message : String(error);
137
+ if (silent) {
138
+ logger.debug("Could not detect model from LLM server", { error: errMsg, attempt });
139
+ } else {
140
+ logger.warn("Could not detect model from LLM server", { error: errMsg, attempt });
141
+ }
142
+ if (attempt < retries) {
143
+ await new Promise((r) => setTimeout(r, 1e3 * attempt));
144
+ continue;
145
+ }
146
+ }
147
+ }
148
+ llmStatus = "disconnected";
149
+ return cached?.model ?? null;
150
+ }
151
+ function getLlmStatus() {
152
+ return llmStatus;
153
+ }
154
+ function clearModelCache(url) {
155
+ if (url) {
156
+ modelCache.delete(getCacheKey(url));
157
+ } else {
158
+ modelCache.clear();
159
+ }
160
+ llmStatus = "unknown";
161
+ }
18
162
 
19
163
  // src/server/provider-manager.ts
20
164
  function normalizeModelId(s) {
@@ -54,19 +198,21 @@ function enrichWithProfileDefaults(model) {
54
198
  defaultMaxTokens: profile.defaultMaxTokens
55
199
  };
56
200
  }
57
- function mergeModelsWithUserOverrides(backendModels, userModels) {
201
+ function mergeModelsWithUserOverrides(backendModels, userModels, preserveMissingUserModels = true) {
58
202
  const normalizedUserIdMap = new Map(userModels.map((m) => [normalizeModelId(m.id), m]));
59
203
  const updatedModels = backendModels.map((backendModel) => {
60
204
  const existingUserModel = normalizedUserIdMap.get(normalizeModelId(backendModel.id));
61
205
  if (existingUserModel) {
62
- return enrichWithProfileDefaults({ ...existingUserModel, id: backendModel.id });
206
+ return enrichWithProfileDefaults({ ...backendModel, ...existingUserModel, id: backendModel.id });
63
207
  }
64
208
  return enrichWithProfileDefaults(backendModel);
65
209
  });
66
- const normalizedBackendIds = new Set(backendModels.map((m) => normalizeModelId(m.id)));
67
- for (const userModel of userModels) {
68
- if (!normalizedBackendIds.has(normalizeModelId(userModel.id))) {
69
- updatedModels.push(enrichWithProfileDefaults(userModel));
210
+ if (preserveMissingUserModels) {
211
+ const normalizedBackendIds = new Set(backendModels.map((m) => normalizeModelId(m.id)));
212
+ for (const userModel of userModels) {
213
+ if (!normalizedBackendIds.has(normalizeModelId(userModel.id))) {
214
+ updatedModels.push(enrichWithProfileDefaults(userModel));
215
+ }
70
216
  }
71
217
  }
72
218
  return updatedModels;
@@ -214,7 +360,7 @@ function parseDefaultModelSelection(selection) {
214
360
  model: selection.substring(slashIndex + 1)
215
361
  };
216
362
  }
217
- function createProviderManager(config) {
363
+ function createProviderManager(config, options = {}) {
218
364
  let providers = [...config.providers ?? []];
219
365
  providers = providers.map((p) => ({ ...p, models: p.models.map((m) => enrichWithProfileDefaults(m)) }));
220
366
  let defaultModelSelection = config.defaultModelSelection;
@@ -252,14 +398,56 @@ function createProviderManager(config) {
252
398
  }
253
399
  };
254
400
  }
401
+ function resolveTransportAdapter(provider) {
402
+ if (provider.transportAdapter) return provider.transportAdapter;
403
+ return void 0;
404
+ }
405
+ function resolveProviderModel(provider, requestedModel) {
406
+ if (requestedModel && requestedModel !== "auto") return requestedModel;
407
+ const activeSelection = parseDefaultModelSelection(defaultModelSelection);
408
+ if (activeSelection.providerId === provider.id) {
409
+ const activeClientModel = llmClient.getModel();
410
+ if (activeClientModel && activeClientModel !== "auto" && provider.models.some((m) => m.id === activeClientModel)) {
411
+ return activeClientModel;
412
+ }
413
+ if (activeSelection.model && activeSelection.model !== "auto" && provider.models.some((m) => m.id === activeSelection.model)) {
414
+ return activeSelection.model;
415
+ }
416
+ }
417
+ return provider.models.find((m) => m.selected)?.id ?? provider.models[0]?.id ?? requestedModel ?? "auto";
418
+ }
419
+ function createClientForProvider(provider, model) {
420
+ const resolvedModel = resolveProviderModel(provider, model);
421
+ const transport = options.adapters?.getTransport(resolveTransportAdapter(provider));
422
+ return transport ? createTransportLLMClient(provider, resolvedModel, transport) : createLLMClient(createConfigForProvider(provider, resolvedModel));
423
+ }
424
+ async function fetchProviderModels(provider) {
425
+ const transport = options.adapters?.getTransport(resolveTransportAdapter(provider));
426
+ if (transport) {
427
+ return transport.listModels({
428
+ providerId: provider.id,
429
+ ...provider.credentialRef && { credentialRef: provider.credentialRef }
430
+ });
431
+ }
432
+ const backend = provider.backend;
433
+ return fetchModelsWithContext(provider.url, provider.apiKey, backend);
434
+ }
255
435
  const { providerId: activeProviderId, model: activeModel } = parseDefaultModelSelection(defaultModelSelection);
256
436
  if (activeProviderId && activeModel) {
257
437
  const activeProvider = providers.find((p) => p.id === activeProviderId);
258
438
  if (activeProvider) {
259
- llmClient = createLLMClient(createConfigForProvider(activeProvider, activeModel));
439
+ llmClient = createClientForProvider(activeProvider, activeModel);
260
440
  }
261
441
  }
262
442
  return {
443
+ createClient(providerId, model) {
444
+ const provider = providers.find((p) => p.id === providerId);
445
+ return provider ? createClientForProvider(provider, model) : void 0;
446
+ },
447
+ resolveModel(providerId, model) {
448
+ const provider = providers.find((p) => p.id === providerId);
449
+ return provider ? resolveProviderModel(provider, model) : void 0;
450
+ },
263
451
  getProviders() {
264
452
  return providers.map((p) => ({
265
453
  ...p,
@@ -282,18 +470,16 @@ function createProviderManager(config) {
282
470
  getLLMClient() {
283
471
  return llmClient;
284
472
  },
285
- async activateProvider(providerId, options) {
473
+ async activateProvider(providerId, options2) {
286
474
  const provider = providers.find((p) => p.id === providerId);
287
475
  if (!provider) {
288
476
  return { success: false, error: "Provider not found" };
289
477
  }
290
478
  const currentModel = parseDefaultModelSelection(defaultModelSelection).model;
291
- let targetModel = options?.model ?? currentModel;
292
- if (!targetModel || targetModel === "auto") {
293
- targetModel = provider.models?.[0]?.id ?? "auto";
294
- }
295
- const isModelSwitch = providerId === parseDefaultModelSelection(defaultModelSelection).providerId && options?.model && options.model !== currentModel;
296
- if (providerId === parseDefaultModelSelection(defaultModelSelection).providerId && !isModelSwitch) {
479
+ const targetModel = resolveProviderModel(provider, options2?.model ?? currentModel);
480
+ const isModelSwitch = providerId === parseDefaultModelSelection(defaultModelSelection).providerId && options2?.model && options2.model !== currentModel;
481
+ if (providerId === parseDefaultModelSelection(defaultModelSelection).providerId && !isModelSwitch && llmClient.getModel() === targetModel) {
482
+ if (currentModel !== targetModel) defaultModelSelection = `${providerId}/${targetModel}`;
297
483
  return { success: true };
298
484
  }
299
485
  logger.info("Switching provider", {
@@ -303,8 +489,7 @@ function createProviderManager(config) {
303
489
  url: provider.url,
304
490
  model: targetModel
305
491
  });
306
- const providerConfig = createConfigForProvider(provider, targetModel);
307
- const newClient = createLLMClient(providerConfig);
492
+ const newClient = createClientForProvider(provider, targetModel);
308
493
  try {
309
494
  const cacheUrl = stripVersionPrefix(provider.url);
310
495
  clearModelCache(cacheUrl);
@@ -315,7 +500,7 @@ function createProviderManager(config) {
315
500
  url: provider.url,
316
501
  backend
317
502
  });
318
- const modelsWithContext = await fetchModelsWithContext(provider.url, provider.apiKey, backend);
503
+ const modelsWithContext = await fetchProviderModels(provider);
319
504
  const userModels = provider.models.filter((m) => m.source === "user");
320
505
  logger.debug("activateProvider", {
321
506
  providerId,
@@ -323,7 +508,11 @@ function createProviderManager(config) {
323
508
  userModelsCount: userModels.length
324
509
  });
325
510
  if (modelsWithContext.length > 0) {
326
- const updatedModels = mergeModelsWithUserOverrides(modelsWithContext, userModels);
511
+ const updatedModels = mergeModelsWithUserOverrides(
512
+ modelsWithContext,
513
+ userModels,
514
+ !resolveTransportAdapter(provider)
515
+ );
327
516
  providers = providers.map((p) => p.id === providerId ? { ...p, models: updatedModels } : p);
328
517
  } else if (userModels.length > 0) {
329
518
  logger.debug("Backend unavailable during provider switch, preserving user models", {
@@ -389,22 +578,22 @@ function createProviderManager(config) {
389
578
  return true;
390
579
  },
391
580
  setProviders(newProviders, newDefaultModelSelection) {
392
- const wasActiveProviderId = this.getActiveProviderId();
393
581
  providers = [...newProviders];
394
582
  defaultModelSelection = newDefaultModelSelection;
395
583
  providerStatus.clear();
396
584
  for (const p of providers) {
397
585
  providerStatus.set(p.id, "unknown");
398
586
  }
399
- const newActiveProviderId = this.getActiveProviderId();
400
- if (newActiveProviderId && newActiveProviderId !== wasActiveProviderId) {
401
- const activeProvider = providers.find((p) => p.id === newActiveProviderId);
587
+ const activeProviderId2 = this.getActiveProviderId();
588
+ if (activeProviderId2) {
589
+ const activeProvider = providers.find((p) => p.id === activeProviderId2);
402
590
  if (activeProvider) {
403
- const providerConfig = createConfigForProvider(activeProvider, this.getCurrentModel() ?? "auto");
404
- llmClient = createLLMClient(providerConfig);
405
- logger.info("setProviders: recreated LLM client for new active provider", {
406
- providerId: newActiveProviderId,
407
- url: activeProvider.url
591
+ llmClient = createClientForProvider(activeProvider, this.getCurrentModel());
592
+ logger.info("setProviders: recreated LLM client for active provider", {
593
+ providerId: activeProviderId2,
594
+ url: activeProvider.url,
595
+ hasCredential: Boolean(activeProvider.credentialRef),
596
+ transportAdapter: resolveTransportAdapter(activeProvider)
408
597
  });
409
598
  }
410
599
  }
@@ -420,8 +609,7 @@ function createProviderManager(config) {
420
609
  if (provider.models && provider.models.length > 0) {
421
610
  return provider.models;
422
611
  }
423
- const backend = provider.backend;
424
- return fetchModelsWithContext(provider.url, provider.apiKey, backend);
612
+ return fetchProviderModels(provider);
425
613
  },
426
614
  async setDefaultModelSelection(providerId, model) {
427
615
  const provider = providers.find((p) => p.id === providerId);
@@ -559,7 +747,7 @@ function createProviderManager(config) {
559
747
  url: provider.url,
560
748
  backend
561
749
  });
562
- const modelsWithContext = await fetchModelsWithContext(provider.url, provider.apiKey, backend);
750
+ const modelsWithContext = await fetchProviderModels(provider);
563
751
  const userModels = provider.models.filter((m) => m.source === "user");
564
752
  logger.info("refreshProviderModels", {
565
753
  providerId,
@@ -579,7 +767,11 @@ function createProviderManager(config) {
579
767
  return { success: false, error: "No models returned from backend" };
580
768
  }
581
769
  providerStatus.set(providerId, "connected");
582
- const updatedModels = mergeModelsWithUserOverrides(modelsWithContext, userModels);
770
+ const updatedModels = mergeModelsWithUserOverrides(
771
+ modelsWithContext,
772
+ userModels,
773
+ !resolveTransportAdapter(provider)
774
+ );
583
775
  providers = providers.map((p) => p.id === providerId ? { ...p, models: updatedModels } : p);
584
776
  const { providerId: currentProviderId, model: currentModel } = parseDefaultModelSelection(defaultModelSelection);
585
777
  if (currentProviderId === providerId && currentModel) {
@@ -597,9 +789,11 @@ function createProviderManager(config) {
597
789
  }
598
790
 
599
791
  export {
792
+ detectModel,
793
+ getLlmStatus,
600
794
  fetchAvailableModelsFromBackend,
601
795
  fetchModelsWithContext,
602
796
  parseDefaultModelSelection,
603
797
  createProviderManager
604
798
  };
605
- //# sourceMappingURL=chunk-H774GQJW.js.map
799
+ //# sourceMappingURL=chunk-RYIREJAW.js.map
@@ -1,12 +1,15 @@
1
1
  import {
2
+ appendCompactionPrompt
3
+ } from "./chunk-OESYKZCM.js";
4
+ import {
5
+ applyDynamicContext,
6
+ computeSessionHash,
2
7
  injectWorkflowKickoffIfNeeded,
3
8
  runAgentTurn,
4
9
  runChatTurn
5
- } from "./chunk-ZHSCXD75.js";
10
+ } from "./chunk-IVJYQZSN.js";
6
11
  import {
7
- applyDynamicContext,
8
12
  checkAborted,
9
- computeSessionHash,
10
13
  deleteItemFromDir,
11
14
  devServerManager,
12
15
  executeSubAgent,
@@ -16,11 +19,20 @@ import {
16
19
  loadAllAgentsDefault,
17
20
  saveItemToDir,
18
21
  spawnShellProcess
19
- } from "./chunk-KX4C5Q5J.js";
22
+ } from "./chunk-5OPZLQDV.js";
23
+ import {
24
+ TurnMetrics,
25
+ createMessageStartEvent
26
+ } from "./chunk-X5YCWKNS.js";
20
27
  import {
21
28
  getPlatformShell,
22
29
  onProcessEvent
23
30
  } from "./chunk-BGTEIA2S.js";
31
+ import {
32
+ getCurrentContextWindowId,
33
+ getEventStore,
34
+ getRuntimeConfig
35
+ } from "./chunk-AIJE3RYH.js";
24
36
  import {
25
37
  createChatErrorMessage,
26
38
  createChatMessageMessage,
@@ -38,24 +50,6 @@ import {
38
50
  import {
39
51
  provideAnswer
40
52
  } from "./chunk-EU3WWTFH.js";
41
- import {
42
- appendCompactionPrompt
43
- } from "./chunk-GJU35MDV.js";
44
- import {
45
- TurnMetrics,
46
- createMessageStartEvent
47
- } from "./chunk-6VDCH5ML.js";
48
- import {
49
- getCurrentContextWindowId,
50
- getEventStore,
51
- getRuntimeConfig
52
- } from "./chunk-AIJE3RYH.js";
53
- import {
54
- createLLMClient
55
- } from "./chunk-JKLPWTUN.js";
56
- import {
57
- ensureVersionPrefix
58
- } from "./chunk-HNCM3D7Y.js";
59
53
  import {
60
54
  logger
61
55
  } from "./chunk-K44MW7JJ.js";
@@ -1385,7 +1379,7 @@ function processQueueAndRestartTurn(sessionManager, sessionId, drainFn, queueMod
1385
1379
  var activeAgents = /* @__PURE__ */ new Map();
1386
1380
  var abortedSessions = /* @__PURE__ */ new Set();
1387
1381
  var MAX_SEND_QUEUE_SIZE = 1e3;
1388
- function createWebSocketServer(httpServer, config, getLLMClient, getActiveProvider, sessionManager, providerManager) {
1382
+ function createWebSocketServer(httpServer, _config, getLLMClient, getActiveProvider, sessionManager, providerManager) {
1389
1383
  const wss = new WebSocketServer({ server: httpServer });
1390
1384
  const clients = /* @__PURE__ */ new Map();
1391
1385
  moduleClients = clients;
@@ -1395,7 +1389,9 @@ function createWebSocketServer(httpServer, config, getLLMClient, getActiveProvid
1395
1389
  if (!session?.providerId || !session?.providerModel || !providerManager) {
1396
1390
  return getLLMClient();
1397
1391
  }
1398
- const cacheKey = `${session.providerId}:${session.providerModel}`;
1392
+ const resolvedModel = providerManager.resolveModel(session.providerId, session.providerModel);
1393
+ const effectiveModel = resolvedModel ?? session.providerModel;
1394
+ const cacheKey = `${session.providerId}:${effectiveModel}`;
1399
1395
  const cached = sessionLLMClients.get(sessionId);
1400
1396
  if (cached && cached.key === cacheKey) {
1401
1397
  return cached.client;
@@ -1410,26 +1406,20 @@ function createWebSocketServer(httpServer, config, getLLMClient, getActiveProvid
1410
1406
  sessionLLMClients.delete(sessionId);
1411
1407
  return getLLMClient();
1412
1408
  }
1413
- const modelConfig = provider.models.find((m) => m.id === session.providerModel);
1414
- const reasoningEffort = modelConfig?.thinkingEnabled && modelConfig?.thinkingLevel ? modelConfig.thinkingLevel : void 0;
1415
- const baseUrl = ensureVersionPrefix(provider.url);
1416
- const sessionConfig = {
1417
- ...config,
1418
- llm: {
1419
- ...config.llm,
1420
- baseUrl,
1421
- model: session.providerModel,
1422
- ...provider.apiKey && { apiKey: provider.apiKey },
1423
- ...provider.thinkingField && { thinkingField: provider.thinkingField },
1424
- ...reasoningEffort && { reasoningEffort }
1425
- }
1426
- };
1427
- const client = createLLMClient(sessionConfig);
1428
- if (provider.backend !== "unknown") {
1429
- client.setBackend(provider.backend);
1409
+ const client = providerManager.createClient(session.providerId, effectiveModel);
1410
+ if (!client) {
1411
+ logger.warn("Could not create session provider client, falling back to global", {
1412
+ sessionId,
1413
+ providerId: session.providerId,
1414
+ model: session.providerModel
1415
+ });
1416
+ return getLLMClient();
1417
+ }
1418
+ const concreteModel = client.getModel();
1419
+ if (session.providerModel !== concreteModel) {
1420
+ sessionManager.setSessionProvider(sessionId, session.providerId, concreteModel);
1430
1421
  }
1431
- client.setModel(session.providerModel);
1432
- sessionLLMClients.set(sessionId, { key: cacheKey, client });
1422
+ sessionLLMClients.set(sessionId, { key: `${session.providerId}:${concreteModel}`, client });
1433
1423
  return client;
1434
1424
  }
1435
1425
  function getSessionStatsIdentity(sessionId) {
@@ -2102,4 +2092,4 @@ export {
2102
2092
  signalMcpReady,
2103
2093
  createWebSocketServer
2104
2094
  };
2105
- //# sourceMappingURL=chunk-AA4G4DGK.js.map
2095
+ //# sourceMappingURL=chunk-W4PUAODY.js.map
@@ -38,15 +38,37 @@ var modelConfigSchema = z.object({
38
38
  }).passthrough();
39
39
  var providerSchema = z.object({
40
40
  id: z.string(),
41
- name: z.string(),
42
- url: z.string(),
43
- backend: backendSchema,
41
+ preset: z.string().optional(),
42
+ name: z.string().optional(),
43
+ url: z.string().optional(),
44
+ backend: backendSchema.optional(),
44
45
  apiKey: z.string().optional(),
45
- models: z.array(modelConfigSchema).default([]),
46
- isActive: z.boolean(),
47
- createdAt: z.string(),
48
- isLocal: z.boolean().optional()
49
- });
46
+ models: z.array(modelConfigSchema).optional(),
47
+ isActive: z.boolean().optional(),
48
+ createdAt: z.string().optional(),
49
+ isLocal: z.boolean().optional(),
50
+ thinkingField: z.string().optional(),
51
+ authAdapter: z.string().optional(),
52
+ transportAdapter: z.string().optional(),
53
+ credentialRef: z.string().optional()
54
+ }).transform(
55
+ (provider) => ({
56
+ id: provider.id,
57
+ ...provider.preset ? { preset: provider.preset } : {},
58
+ name: provider.name ?? provider.id,
59
+ url: provider.url ?? "",
60
+ backend: provider.backend ?? "unknown",
61
+ ...provider.apiKey ? { apiKey: provider.apiKey } : {},
62
+ models: provider.models ?? [],
63
+ isActive: provider.isActive ?? false,
64
+ createdAt: provider.createdAt ?? (/* @__PURE__ */ new Date()).toISOString(),
65
+ ...provider.isLocal !== void 0 ? { isLocal: provider.isLocal } : {},
66
+ ...provider.thinkingField ? { thinkingField: provider.thinkingField } : {},
67
+ ...provider.authAdapter ? { authAdapter: provider.authAdapter } : {},
68
+ ...provider.transportAdapter ? { transportAdapter: provider.transportAdapter } : {},
69
+ ...provider.credentialRef ? { credentialRef: provider.credentialRef } : {}
70
+ })
71
+ );
50
72
  var serverSchema = z.object({
51
73
  port: z.number().default(10369),
52
74
  host: z.string().default("127.0.0.1"),
@@ -291,4 +313,4 @@ export {
291
313
  removeProvider,
292
314
  activateProvider
293
315
  };
294
- //# sourceMappingURL=chunk-43UFGATL.js.map
316
+ //# sourceMappingURL=chunk-WGAAQASA.js.map