openfox 2.0.62 → 2.0.64

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-TRAITVLO.js → chat-handler-LI4R4Z2E.js} +11 -11
  3. package/dist/{chunk-L4WACPUX.js → chunk-73N5CJH3.js} +5 -5
  4. package/dist/{chunk-BKTBHEPY.js → chunk-HZNY77HZ.js} +32 -42
  5. package/dist/{chunk-QZRS2RF5.js → chunk-JFQSQO2N.js} +362 -92
  6. package/dist/{chunk-3WL5YCP6.js → chunk-O3G6X5CT.js} +6 -6
  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-WEB4WBUF.js → chunk-WD75RSGR.js} +149 -117
  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-TQ23BAFQ.js → orchestrator-PFN7C5JI.js} +14 -14
  20. package/dist/package.json +5 -1
  21. package/dist/{processor-3ZOFGZP5.js → processor-AYYXP5NS.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-CNA5NKOR.js → serve-54KALE6R.js} +15 -16
  28. package/dist/server/index.d.ts +6 -87
  29. package/dist/server/index.js +12 -13
  30. package/dist/{server-CI5IEBOC.js → server-Z2A5YZM6.js} +10 -14
  31. package/dist/shared/index.d.ts +3 -2
  32. package/dist/{tools-33FQNFKC.js → tools-R6LPK6OS.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-CETZPQXr.js → index-CkE65FP4.js} +74 -73
  36. package/dist/web/assets/{index-BGkyTfuQ.css → index-DvPmgi8F.css} +1 -1
  37. package/dist/web/index.html +2 -2
  38. package/dist/web/sw.js +1 -1
  39. package/package.json +5 -1
  40. package/dist/chunk-M3RB4IF6.js +0 -114
@@ -39,7 +39,7 @@ Options:
39
39
  }
40
40
  async function runNetworkSetup(mode) {
41
41
  const { loadAuthConfig, saveAuthConfig, encryptPassword } = await import("./auth-YY5PJYSC.js");
42
- const { saveGlobalConfig } = await import("./config-GMQUPNBY.js");
42
+ const { saveGlobalConfig } = await import("./config-EUMVEFHU.js");
43
43
  const { getAuthKeyPath } = await import("./paths-F27V3S4I.js");
44
44
  const existingAuth = await loadAuthConfig(mode);
45
45
  if (existingAuth) {
@@ -106,7 +106,7 @@ async function runNetworkSetup(mode) {
106
106
  console.log("\u2713 Configuration saved!\n");
107
107
  }
108
108
  async function runConfig(mode) {
109
- const { loadGlobalConfig, getActiveProvider, getDefaultModel } = await import("./config-GMQUPNBY.js");
109
+ const { loadGlobalConfig, getActiveProvider, getDefaultModel } = await import("./config-EUMVEFHU.js");
110
110
  const { getGlobalConfigPath } = await import("./paths-F27V3S4I.js");
111
111
  const config = await loadGlobalConfig(mode);
112
112
  const configPath = getGlobalConfigPath(mode);
@@ -164,7 +164,7 @@ async function runCli(options) {
164
164
  break;
165
165
  }
166
166
  case "provider": {
167
- const { runProviderCommand } = await import("./provider-LBYBC5AG.js");
167
+ const { runProviderCommand } = await import("./provider-GYOW4OWQ.js");
168
168
  const [, subcommand] = positionals;
169
169
  await runProviderCommand(mode, subcommand);
170
170
  break;
@@ -203,12 +203,12 @@ async function runCli(options) {
203
203
  break;
204
204
  }
205
205
  default: {
206
- const { configFileExists } = await import("./config-GMQUPNBY.js");
206
+ const { configFileExists } = await import("./config-EUMVEFHU.js");
207
207
  const configExists = await configFileExists(mode);
208
208
  if (!configExists) {
209
209
  await runNetworkSetup(mode);
210
210
  }
211
- const { runServe } = await import("./serve-CNA5NKOR.js");
211
+ const { runServe } = await import("./serve-54KALE6R.js");
212
212
  const serveOptions = { mode };
213
213
  if (values.port) serveOptions.port = parseInt(values.port);
214
214
  if (values["no-browser"] === true) serveOptions.openBrowser = false;
@@ -220,4 +220,4 @@ async function runCli(options) {
220
220
  export {
221
221
  runCli
222
222
  };
223
- //# sourceMappingURL=chunk-3WL5YCP6.js.map
223
+ //# sourceMappingURL=chunk-O3G6X5CT.js.map
@@ -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