@fased/fased 0.1.54 → 0.1.55

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 (163) hide show
  1. package/dist/agents/authenticated-model-catalog.js +27 -0
  2. package/dist/agents/current-model-catalog.js +3 -10
  3. package/dist/agents/model-catalog-normalized.js +1 -0
  4. package/dist/agents/model-metadata.js +25 -4
  5. package/dist/agents/pi-embedded-runner/extra-params.js +25 -0
  6. package/dist/agents/pi-embedded-runner/utils.js +1 -1
  7. package/dist/brand.js +1 -1
  8. package/dist/build-info.json +3 -3
  9. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  10. package/dist/cli/providers-cli.js +3 -2
  11. package/dist/commands/auth-choice.apply.api-providers.js +3 -8
  12. package/dist/commands/auth-choice.apply.openai.js +13 -7
  13. package/dist/commands/auth-choice.model-check.js +1 -2
  14. package/dist/commands/configure.gateway-auth.js +14 -16
  15. package/dist/commands/model-picker.js +25 -7
  16. package/dist/commands/models/list.registry.js +12 -17
  17. package/dist/commands/onboard-auth.config-core.js +1 -1
  18. package/dist/commands/onboard-auth.config-litellm.js +21 -21
  19. package/dist/commands/onboard-auth.credentials.js +0 -1
  20. package/dist/commands/onboard-auth.js +0 -1
  21. package/dist/commands/openai-codex-model-default.js +27 -5
  22. package/dist/config/zod-schema.agent-defaults.js +4 -2
  23. package/dist/config/zod-schema.agent-runtime.js +4 -2
  24. package/dist/config/zod-schema.core.js +4 -2
  25. package/dist/control-ui/assets/{app-BKlu6OKz.js → app-D2RaTXoV.js} +1475 -1474
  26. package/dist/control-ui/assets/chat-model-ref-BZFblCeY.js +2 -0
  27. package/dist/control-ui/assets/{index-nrFcGMv-.js → index-D2nC6I-9.js} +3 -3
  28. package/dist/control-ui/assets/{providers-BQFrRqym.js → providers-CyjiG5Jw.js} +4 -4
  29. package/dist/control-ui/index.html +1 -1
  30. package/dist/control-ui/version.json +1 -0
  31. package/dist/gateway/control-ui.js +2 -0
  32. package/dist/gateway/protocol/schema/agents-models-skills.js +5 -2
  33. package/dist/gateway/server-methods/models.js +7 -8
  34. package/dist/gateway/server-model-catalog.js +3 -0
  35. package/dist/infra/update-runner.js +31 -3
  36. package/dist/light-update-status.js +11 -11
  37. package/dist/memory/inventory.js +19 -2
  38. package/dist/plugin-sdk/{accounts-DW9OS5Ll.js → accounts-CeRNo5Ae.js} +1 -1
  39. package/dist/plugin-sdk/{actions-DQUXohRr.js → actions-OMRHtXPj.js} +2 -2
  40. package/dist/plugin-sdk/{active-listener-BZQWZPF7.js → active-listener-BlIkS3iR.js} +1 -1
  41. package/dist/plugin-sdk/{audio-preflight-t4mmHsI2.js → audio-preflight-B2n3a2Tj.js} +26 -26
  42. package/dist/plugin-sdk/{audit-BZk_6Buw.js → audit-Ppg6dR_b.js} +1 -1
  43. package/dist/plugin-sdk/{channel-access-CN5HiWdb.js → channel-access-af8dWWRv.js} +1 -1
  44. package/dist/plugin-sdk/{channel-access-configure-B7Kkvx9K.js → channel-access-configure-B6IAGlE0.js} +1 -1
  45. package/dist/plugin-sdk/channel-plugin-common.d.ts +3 -3
  46. package/dist/plugin-sdk/channel-plugin-common.js +4 -4
  47. package/dist/plugin-sdk/{chunk-B2ffJ-LR.js → chunk-CD76Byie.js} +1 -1
  48. package/dist/plugin-sdk/{chunk-items-jOdkyP53.js → chunk-items-Bu19zrYH.js} +1 -1
  49. package/dist/plugin-sdk/command-status.d.ts +2 -2
  50. package/dist/plugin-sdk/command-status.js +26 -26
  51. package/dist/plugin-sdk/{commands-registry-BWb4NcfW.js → commands-registry-DgS55tNj.js} +2 -2
  52. package/dist/plugin-sdk/{common-C4XrB73N.js → common-CWvfeiX0.js} +1 -1
  53. package/dist/plugin-sdk/{config-rySyVtKs.js → config-CYDETqcF.js} +83 -65
  54. package/dist/plugin-sdk/{config-schema-BaybPPrJ.js → config-schema-CQ4EVcQG.js} +128 -66
  55. package/dist/plugin-sdk/device-pair.d.ts +1 -1
  56. package/dist/plugin-sdk/discord.d.ts +5 -5
  57. package/dist/plugin-sdk/discord.js +19 -19
  58. package/dist/plugin-sdk/{group-mentions-DLOOve8d.d.ts → group-mentions-BxDgHCgj.d.ts} +1 -1
  59. package/dist/plugin-sdk/{handle-action-CGF-Qnp0.js → handle-action-B75UVKxF.js} +13 -13
  60. package/dist/plugin-sdk/{helpers-DgRMfCnT.js → helpers-BuEwju6y.js} +1 -1
  61. package/dist/plugin-sdk/{image-ops-CcBfoMLW.js → image-ops-C66HPeAZ.js} +1 -1
  62. package/dist/plugin-sdk/index.d.ts +8 -8
  63. package/dist/plugin-sdk/index.js +28 -28
  64. package/dist/plugin-sdk/{login-DpDQyM7r.js → login-Amr2DpKU.js} +3 -3
  65. package/dist/plugin-sdk/{login-qr-COaSAPY5.js → login-qr-DMQNEi9m.js} +3 -3
  66. package/dist/plugin-sdk/{manager-Cqz30lA3.js → manager-Bvpq49BI.js} +2 -2
  67. package/dist/plugin-sdk/{markdown-tables-BOG5sSQQ.js → markdown-tables-DmQ7oXOm.js} +1 -1
  68. package/dist/plugin-sdk/{media-Bu-nJpPs.js → media-ByLQbEwJ.js} +2 -2
  69. package/dist/plugin-sdk/{monitor-II_NIq3G.js → monitor-K_u6daGa.js} +30 -30
  70. package/dist/plugin-sdk/{monitor-DL6oEVo8.js → monitor-S_7LrvSj.js} +31 -31
  71. package/dist/plugin-sdk/{openresponses-http-vkHBBpGY.js → openresponses-http-BrDJUZXR.js} +26 -26
  72. package/dist/plugin-sdk/{optional-runtime-dependency-DEojVNfv.js → optional-runtime-dependency-CbYjAC2b.js} +1 -1
  73. package/dist/plugin-sdk/{outbound-mf2y6KuY.js → outbound-BuDafBBI.js} +6 -6
  74. package/dist/plugin-sdk/{outbound-attachment-ivAHpWnn.js → outbound-attachment-DmZmUqFP.js} +2 -2
  75. package/dist/plugin-sdk/{pairing-message-CvJ6Qa1Q.d.ts → pairing-message-D0-UWGFJ.d.ts} +2 -2
  76. package/dist/plugin-sdk/{pairing-message-CqYG12t-.js → pairing-message-e4D4eBDA.js} +1 -1
  77. package/dist/plugin-sdk/{pairing-store-D-21Sphe.js → pairing-store-T3IGoGZg.js} +2 -2
  78. package/dist/plugin-sdk/{pi-model-discovery-B6gD1clF.js → pi-model-discovery-DvAG_Png.js} +1 -1
  79. package/dist/plugin-sdk/{pi-model-discovery-runtime-3yDxS3ro.js → pi-model-discovery-runtime-NjkUgjIf.js} +2 -2
  80. package/dist/plugin-sdk/provider-web-search-config-contract.d.ts +2 -2
  81. package/dist/plugin-sdk/{pw-ai-CMplwiwf.js → pw-ai-D7eW43DL.js} +3 -3
  82. package/dist/plugin-sdk/{replies-wiI4veI7.js → replies-BMIPmEoP.js} +2 -2
  83. package/dist/plugin-sdk/{resolve-outbound-target-bm9RUK5q.js → resolve-outbound-target-CXCqUUPV.js} +1 -1
  84. package/dist/plugin-sdk/{resolve-route-ekGNc6os.js → resolve-route-DJN-SUSt.js} +1 -1
  85. package/dist/plugin-sdk/{retry-policy-BvlC2SPh.js → retry-policy-CY1qY6d7.js} +1 -1
  86. package/dist/plugin-sdk/{runtime-ClSakPxR.js → runtime-CgOkQe0w.js} +3 -3
  87. package/dist/plugin-sdk/{runtime-dependency-yAWxH4El.js → runtime-dependency-DvdRNMvs.js} +2 -2
  88. package/dist/plugin-sdk/sat-runtime.d.ts +3 -3
  89. package/dist/plugin-sdk/sat-runtime.js +5 -5
  90. package/dist/plugin-sdk/{send-CgyS75Av.js → send-2ITqny2W.js} +8 -8
  91. package/dist/plugin-sdk/{send-D264hFVb.js → send-BAz22RZr.js} +5 -5
  92. package/dist/plugin-sdk/{send-C7x6gzSl.js → send-BG3RWyil.js} +7 -7
  93. package/dist/plugin-sdk/{send-D58yEeH4.js → send-Cr-dj6S-.js} +6 -6
  94. package/dist/plugin-sdk/{send-DrAtUGLM.js → send-eTxqFFsw.js} +6 -6
  95. package/dist/plugin-sdk/{session-DyMtb5YQ.js → session-C8nJmmVE.js} +2 -2
  96. package/dist/plugin-sdk/{skill-commands-Q80wCyry.js → skill-commands-Rm5by9S8.js} +2 -2
  97. package/dist/plugin-sdk/{slack-actions-dGE_t_Un.js → slack-actions-BNIALJTA.js} +11 -11
  98. package/dist/plugin-sdk/{slack-C-I6q3NB.js → slack-xvIVvyEM.js} +38 -38
  99. package/dist/plugin-sdk/slack.d.ts +5 -5
  100. package/dist/plugin-sdk/slack.js +9 -9
  101. package/dist/plugin-sdk/{sticker-cache-DCrDTYIi.js → sticker-cache-D3oDiu2u.js} +3 -3
  102. package/dist/plugin-sdk/{tables-0mhUOh5v.js → tables-DS5L7lCA.js} +1 -1
  103. package/dist/plugin-sdk/{targets-znKHngSk.js → targets-D6lUomJc.js} +1 -1
  104. package/dist/plugin-sdk/{telegram-actions-GBYY8-x9.js → telegram-actions-MSFkDn0m.js} +29 -29
  105. package/dist/plugin-sdk/telegram.d.ts +5 -5
  106. package/dist/plugin-sdk/telegram.js +8 -8
  107. package/dist/plugin-sdk/{thread-bindings.lifecycle-ClzPBK70.js → thread-bindings.lifecycle-Ry6Vcgw3.js} +3 -3
  108. package/dist/plugin-sdk/{thread-bindings.state-Ha01nmrq.js → thread-bindings.state-C0stmvNk.js} +2 -2
  109. package/dist/plugin-sdk/{tmp-fased-dir-C_xfeEN9.d.ts → tmp-fased-dir-D91GExk4.d.ts} +2 -2
  110. package/dist/plugin-sdk/{types-CBCtqtMn.d.ts → types-BzadOItY.d.ts} +1 -1
  111. package/dist/plugin-sdk/{types-BI2njxWJ.d.ts → types-DKvBJHfH.d.ts} +14 -5
  112. package/dist/plugin-sdk/{types-DV5TNhMK.d.ts → types-DVTIpopt.d.ts} +2 -2
  113. package/dist/plugin-sdk/{types.plugin-CvUiB3Kh.d.ts → types.plugin-BiHPaDTF.d.ts} +2 -1
  114. package/dist/plugin-sdk/{wallet-status-CyovJojz.js → wallet-status-f0HagNeO.js} +8 -5
  115. package/dist/plugin-sdk/{web-CJMfhGFY.js → web-DRNJxHXA.js} +31 -31
  116. package/dist/plugin-sdk/{whatsapp-actions-0ZbGo5ZV.js → whatsapp-actions-BDXZF2R5.js} +13 -13
  117. package/dist/plugin-sdk/{whatsapp-heartbeat-DGTsuvQ8.js → whatsapp-heartbeat-CKgmwCGr.js} +2 -2
  118. package/dist/plugin-sdk/whatsapp.d.ts +5 -5
  119. package/dist/plugin-sdk/whatsapp.js +12 -12
  120. package/dist/plugin-sdk/{wsl-D5jDUlms.js → wsl-Biw7Mj39.js} +3 -3
  121. package/dist/providers/litellm-models.js +1 -1
  122. package/dist/providers/refresh.js +218 -56
  123. package/dist/providers/registry.js +15 -5
  124. package/dist/providers/runtime-model-catalog.js +181 -0
  125. package/dist/shared/model-thinking.js +41 -2
  126. package/dist/wizard/onboarding.js +24 -6
  127. package/extensions/acpx/package.json +1 -1
  128. package/extensions/bluebubbles/package.json +1 -1
  129. package/extensions/copilot-proxy/package.json +1 -1
  130. package/extensions/diagnostics-otel/package.json +1 -1
  131. package/extensions/fased-federation/package.json +1 -1
  132. package/extensions/google-gemini-cli-auth/package.json +1 -1
  133. package/extensions/imessage/package.json +1 -1
  134. package/extensions/irc/package.json +1 -1
  135. package/extensions/line/package.json +1 -1
  136. package/extensions/llm-task/package.json +1 -1
  137. package/extensions/lobster/package.json +1 -1
  138. package/extensions/matrix/CHANGELOG.md +6 -0
  139. package/extensions/matrix/package.json +1 -1
  140. package/extensions/mattermost/package.json +1 -1
  141. package/extensions/memory-core/package.json +2 -2
  142. package/extensions/memory-lancedb/package.json +1 -1
  143. package/extensions/minimax-portal-auth/package.json +1 -1
  144. package/extensions/msteams/CHANGELOG.md +6 -0
  145. package/extensions/msteams/package.json +1 -1
  146. package/extensions/nextcloud-talk/package.json +1 -1
  147. package/extensions/nostr/CHANGELOG.md +6 -0
  148. package/extensions/nostr/package.json +1 -1
  149. package/extensions/open-prose/package.json +1 -1
  150. package/extensions/sat-mining/package.json +1 -1
  151. package/extensions/signal/package.json +1 -1
  152. package/extensions/synology-chat/package.json +1 -1
  153. package/extensions/tlon/package.json +1 -1
  154. package/extensions/twitch/CHANGELOG.md +6 -0
  155. package/extensions/twitch/package.json +1 -1
  156. package/extensions/voice-call/CHANGELOG.md +6 -0
  157. package/extensions/voice-call/package.json +1 -1
  158. package/extensions/zalo/CHANGELOG.md +6 -0
  159. package/extensions/zalo/package.json +1 -1
  160. package/extensions/zalouser/CHANGELOG.md +6 -0
  161. package/extensions/zalouser/package.json +1 -1
  162. package/package.json +1 -1
  163. package/dist/control-ui/assets/chat-model-ref-B9sWop67.js +0 -2
@@ -0,0 +1,27 @@
1
+ import { buildCredentialScopedAllowedModelSet } from "./model-catalog-access.js";
2
+ import { applyRuntimeProviderModelDiscovery, filterCatalogToAuthoritativeAvailability } from "../providers/runtime-model-catalog.js";
3
+
4
+ //#region src/agents/authenticated-model-catalog.ts
5
+ async function resolveAuthenticatedModelCatalog(params) {
6
+ const initialScope = buildCredentialScopedAllowedModelSet({
7
+ cfg: params.cfg,
8
+ catalog: params.catalog,
9
+ defaultProvider: params.defaultProvider,
10
+ store: params.store
11
+ });
12
+ const discoveredCatalog = filterCatalogToAuthoritativeAvailability(await applyRuntimeProviderModelDiscovery({
13
+ cfg: params.cfg,
14
+ store: params.store,
15
+ routes: initialScope.usableProviders,
16
+ catalog: initialScope.usableCatalog
17
+ }), params.store);
18
+ return buildCredentialScopedAllowedModelSet({
19
+ cfg: params.cfg,
20
+ catalog: discoveredCatalog,
21
+ defaultProvider: params.defaultProvider,
22
+ storedProviders: initialScope.usableProviders
23
+ });
24
+ }
25
+
26
+ //#endregion
27
+ export { resolveAuthenticatedModelCatalog };
@@ -1,6 +1,5 @@
1
1
  import { CLOUDFLARE_AI_GATEWAY_MODEL_CATALOG, buildCloudflareAiGatewayModelDefinition } from "../providers/cloudflare-ai-gateway-shared.js";
2
2
  import { HUGGINGFACE_BASE_URL, HUGGINGFACE_MODEL_CATALOG, buildHuggingfaceModelDefinition } from "../providers/huggingface-models.js";
3
- import { LITELLM_BASE_URL, LITELLM_MODEL_CATALOG, buildLitellmModelDefinition } from "../providers/litellm-models.js";
4
3
  import { SYNTHETIC_BASE_URL, SYNTHETIC_MODEL_CATALOG, buildSyntheticModelDefinition } from "../providers/synthetic-models.js";
5
4
  import { TOGETHER_BASE_URL, TOGETHER_MODEL_CATALOG, buildTogetherModelDefinition } from "../providers/together-models.js";
6
5
  import { VENICE_BASE_URL, VENICE_MODEL_CATALOG, buildVeniceModelDefinition } from "../providers/venice-models.js";
@@ -876,22 +875,16 @@ const CURRENT_MODEL_PROVIDER_CATALOG = {
876
875
  models: CLOUDFLARE_AI_GATEWAY_MODEL_CATALOG.map((entry) => buildCloudflareAiGatewayModelDefinition({ id: entry.id }))
877
876
  },
878
877
  litellm: {
879
- baseUrl: LITELLM_BASE_URL,
878
+ baseUrl: "http://localhost:4000/v1",
880
879
  api: "openai-completions",
881
880
  request: { allowPrivateNetwork: true },
882
- models: LITELLM_MODEL_CATALOG.map(buildLitellmModelDefinition)
881
+ models: []
883
882
  },
884
883
  vllm: {
885
884
  baseUrl: "http://127.0.0.1:8000/v1",
886
885
  api: "openai-completions",
887
886
  request: { allowPrivateNetwork: true },
888
- models: [model({
889
- id: "local",
890
- name: "Local model",
891
- input: ["text", "image"],
892
- contextWindow: 128e3,
893
- maxTokens: 8192
894
- })]
887
+ models: []
895
888
  },
896
889
  "github-copilot": {
897
890
  baseUrl: "https://api.individual.githubcopilot.com",
@@ -3,6 +3,7 @@ import { normalizeProviderId } from "./provider-id.js";
3
3
  //#region src/agents/model-catalog-normalized.ts
4
4
  const SOURCE_AUTHORITY = {
5
5
  configured: 500,
6
+ "provider-api": 450,
6
7
  runtime: 400,
7
8
  manifest: 300,
8
9
  "provider-index": 200,
@@ -1,9 +1,20 @@
1
1
  import { resolveModelThinkingCapability } from "../shared/model-thinking.js";
2
- import { getProviderBrandManifestForRoute, lookupProviderManifestModelCapability } from "../providers/registry.js";
2
+ import { getProviderBrandManifestForRoute, lookupProviderManifestModelCapability, providerModelRecommendationRank } from "../providers/registry.js";
3
3
  import { isPrivateNetworkBaseUrl } from "../utils/private-network-url.js";
4
4
  import { lookupRefreshedModelCapability } from "../providers/refreshed-model-capabilities.js";
5
5
 
6
6
  //#region src/agents/model-metadata.ts
7
+ function availabilitySourceForCatalogSource(source) {
8
+ switch (source) {
9
+ case "provider-api": return "provider-api";
10
+ case "runtime": return "runtime-catalog";
11
+ case "configured": return "configured";
12
+ case "provider-index": return "provider-plugin";
13
+ case "manifest": return "curated-recommendation";
14
+ case "current-preview":
15
+ default: return "reviewed-catalog";
16
+ }
17
+ }
7
18
  const FEATURE_LABELS = {
8
19
  text: "text",
9
20
  vision: "vision",
@@ -32,8 +43,10 @@ const JSON_CAPABLE_APIS = new Set([
32
43
  const LOCAL_DYNAMIC_PROVIDERS = new Set([
33
44
  "ollama",
34
45
  "lmstudio",
35
- "vllm"
46
+ "vllm",
47
+ "litellm"
36
48
  ]);
49
+ const CURATED_CATALOG_REVIEWED_AT = "2026-07-12T00:00:00.000Z";
37
50
  function resolveProviderConfig(cfg, provider) {
38
51
  return cfg?.models?.providers?.[provider];
39
52
  }
@@ -70,8 +83,9 @@ function deriveModelMetadata(params) {
70
83
  ...manifestCapabilities,
71
84
  ...params.model.capabilities
72
85
  } : undefined;
73
- const capabilityConfidence = capabilities || refreshed || manifestCapabilities ? "declared" : "unknown";
74
- const shouldInferApiCapabilities = !(LOCAL_DYNAMIC_PROVIDERS.has(provider) && capabilityConfidence === "unknown");
86
+ const capabilitySource = params.capabilitySource ?? (params.model.capabilities ? params.model.catalogSource === "configured" ? "configured" : "runtime" : refreshed ? refreshed.source === "catalog" || refreshed.source === "provider-api" ? "provider-api" : "official-docs" : manifestCapabilities ? "official-docs" : api && !LOCAL_DYNAMIC_PROVIDERS.has(provider) ? "inferred" : "unknown");
87
+ const capabilityConfidence = capabilitySource === "provider-api" || capabilitySource === "official-docs" ? "verified" : capabilitySource === "runtime" || capabilitySource === "configured" ? "declared" : capabilitySource === "inferred" ? "inferred" : "unknown";
88
+ const shouldInferApiCapabilities = !LOCAL_DYNAMIC_PROVIDERS.has(provider);
75
89
  const reasoning = params.model.reasoning ?? refreshed?.reasoning;
76
90
  const thinking = resolveModelThinkingCapability({
77
91
  provider,
@@ -95,6 +109,7 @@ function deriveModelMetadata(params) {
95
109
  label: params.model.name?.trim() || modelId,
96
110
  contextWindow: typeof refreshed?.contextWindow === "number" && refreshed.contextWindow > 0 ? refreshed.contextWindow : typeof params.model.contextWindow === "number" && params.model.contextWindow > 0 ? params.model.contextWindow : undefined,
97
111
  maxTokens: typeof refreshed?.maxTokens === "number" && refreshed.maxTokens > 0 ? refreshed.maxTokens : typeof params.model.maxTokens === "number" && params.model.maxTokens > 0 ? params.model.maxTokens : undefined,
112
+ ...typeof api === "string" && api.trim() ? { apiRoute: api.trim() } : {},
98
113
  features,
99
114
  ...thinking ? {
100
115
  thinkingLevels: thinking.thinkingLevels,
@@ -104,6 +119,11 @@ function deriveModelMetadata(params) {
104
119
  } : {},
105
120
  streaming: capabilities?.streaming !== false,
106
121
  capabilityConfidence,
122
+ capabilitySource,
123
+ ...params.capabilityRetrievedAt ?? refreshed?.refreshedAt ?? (capabilitySource === "official-docs" ? CURATED_CATALOG_REVIEWED_AT : undefined) ? { capabilityRetrievedAt: params.capabilityRetrievedAt ?? refreshed?.refreshedAt ?? CURATED_CATALOG_REVIEWED_AT } : {},
124
+ retrievedAt: refreshed?.refreshedAt ?? CURATED_CATALOG_REVIEWED_AT,
125
+ availabilitySource: availabilitySourceForCatalogSource(params.model.catalogSource),
126
+ authRoute: provider,
107
127
  authMode: resolveAuthMode({
108
128
  provider,
109
129
  providerConfig
@@ -111,6 +131,7 @@ function deriveModelMetadata(params) {
111
131
  privateNetwork,
112
132
  privateNetworkAllowed: privateNetwork ? providerConfig?.request?.allowPrivateNetwork === true : false,
113
133
  ...params.recommended ? { recommended: true } : {},
134
+ ...providerModelRecommendationRank(provider, modelId) ? { recommendationRank: providerModelRecommendationRank(provider, modelId) } : {},
114
135
  ...params.default ? { default: true } : {}
115
136
  };
116
137
  }
@@ -348,6 +348,30 @@ function createOpenAIResponsesContextManagementWrapper(baseStreamFn, extraParams
348
348
  });
349
349
  };
350
350
  }
351
+ function createOpenAIReasoningEffortWrapper(baseStreamFn, reasoningEffort) {
352
+ const underlying = baseStreamFn ?? streamSimple;
353
+ return (model, context, options) => {
354
+ const supportsReasoningEffort = model.api === "openai-codex-responses" || model.api === "openai-responses" && model.provider === "openai" && (model.baseUrl === undefined || isDirectOpenAIBaseUrl(model.baseUrl));
355
+ if (!reasoningEffort || !supportsReasoningEffort) {
356
+ return underlying(model, context, options);
357
+ }
358
+ const originalOnPayload = options?.onPayload;
359
+ return underlying(model, context, {
360
+ ...options,
361
+ onPayload: (payload) => {
362
+ if (payload && typeof payload === "object") {
363
+ const payloadObj = payload;
364
+ const reasoning = payloadObj.reasoning;
365
+ payloadObj.reasoning = {
366
+ ...reasoning && typeof reasoning === "object" ? reasoning : {},
367
+ effort: reasoningEffort === "off" ? "none" : reasoningEffort
368
+ };
369
+ }
370
+ originalOnPayload?.(payload);
371
+ }
372
+ });
373
+ };
374
+ }
351
375
  function createCodexDefaultTransportWrapper(baseStreamFn) {
352
376
  const underlying = baseStreamFn ?? streamSimple;
353
377
  return (model, context, options) => underlying(model, context, {
@@ -814,6 +838,7 @@ function applyExtraParamsToAgent(agent, cfg, provider, modelId, extraParamsOverr
814
838
  }
815
839
  agent.streamFn = createGoogleThinkingPayloadWrapper(agent.streamFn, thinkingLevel);
816
840
  agent.streamFn = createOpenAIResponsesContextManagementWrapper(agent.streamFn, merged);
841
+ agent.streamFn = createOpenAIReasoningEffortWrapper(agent.streamFn, thinkingLevel);
817
842
  }
818
843
 
819
844
  //#endregion
@@ -3,7 +3,7 @@ function mapThinkingLevel(level) {
3
3
  if (!level) {
4
4
  return "off";
5
5
  }
6
- return level;
6
+ return level === "max" ? "xhigh" : level;
7
7
  }
8
8
  function describeUnknownError(error) {
9
9
  if (error instanceof Error) {
package/dist/brand.js CHANGED
@@ -2,7 +2,7 @@
2
2
  const FASED_BRAND_NAME = "Fased";
3
3
  const FASED_AGENT_NAME = "Fased Agent";
4
4
  const FASED_CONTROL_NAME = "Fased Control";
5
- const FASED_PRODUCT_VERSION = "0.1.54";
5
+ const FASED_PRODUCT_VERSION = "0.1.55";
6
6
  const FASED_DISPLAY_VERSION = `v${FASED_PRODUCT_VERSION}`;
7
7
  function formatFasedDisplayLine() {
8
8
  return `${FASED_AGENT_NAME} ${FASED_DISPLAY_VERSION}`;
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.1.54",
3
- "commit": "0e4f7276a6ff611b7a7c084cbdbac6246a020621",
4
- "builtAt": "2026-07-12T17:54:54.055Z"
2
+ "version": "0.1.55",
3
+ "commit": "c850bc2e9c5030a16672d753fdf92c14cfe8832e",
4
+ "builtAt": "2026-07-12T22:55:14.749Z"
5
5
  }
@@ -1 +1 @@
1
- f0c7aea72356480469af9d337d9985c17460e758b57c1538c6f2e6cd058015ac
1
+ c4a6e3e507ccfdd8b130a370232c38876b21dcd70184d986652833ecac14bd0a
@@ -5,8 +5,8 @@ import { loadAuthProfileStoreForRuntime } from "../agents/auth-profiles/store.js
5
5
  import { loadConfig, writeConfigFile } from "../config/io.js";
6
6
  import "../config/config.js";
7
7
  import "../agents/auth-profiles.js";
8
- import { createClackPrompter } from "../wizard/clack-prompter.js";
9
8
  import { applyProviderRefreshToRegistrySource, buildProviderCapabilityOverridesSource, buildProviderRefreshEnvFromCredentials, buildProviderRefreshReport, buildProviderRegistryReviewPatch, fetchOfficialProviderRefreshSnapshot, loadProviderRefreshSnapshotFromFile } from "../providers/refresh.js";
9
+ import { createClackPrompter } from "../wizard/clack-prompter.js";
10
10
  import path from "node:path";
11
11
  import { mkdir, readFile, writeFile } from "node:fs/promises";
12
12
 
@@ -284,7 +284,8 @@ async function applyRegistryRefresh(report) {
284
284
  } catch {
285
285
  existingCapabilities = "";
286
286
  }
287
- const capabilitiesChanged = capabilitiesSource !== existingCapabilities;
287
+ const normalizeCapabilityTimestamps = (source) => source.replace(/refreshedAt: "[^"]+",/g, "refreshedAt: \"<reviewed-at>\",");
288
+ const capabilitiesChanged = normalizeCapabilityTimestamps(capabilitiesSource) !== normalizeCapabilityTimestamps(existingCapabilities);
288
289
  if (capabilitiesChanged) {
289
290
  await writeFile(CAPABILITIES_PATH, capabilitiesSource, "utf8");
290
291
  }
@@ -1,5 +1,4 @@
1
1
  import { CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF } from "../providers/cloudflare-ai-gateway-shared.js";
2
- import { LITELLM_DEFAULT_MODEL_REF } from "../providers/litellm-models.js";
3
2
  import { SYNTHETIC_DEFAULT_MODEL_REF } from "../providers/synthetic-models.js";
4
3
  import { TOGETHER_DEFAULT_MODEL_REF } from "../providers/together-models.js";
5
4
  import { VENICE_DEFAULT_MODEL_REF } from "../providers/venice-models.js";
@@ -14,7 +13,7 @@ import { createAuthChoiceAgentModelNoter, createAuthChoiceDefaultModelApplier, c
14
13
  import { KIMI_CODING_MODEL_REF, MISTRAL_DEFAULT_MODEL_REF, MOONSHOT_DEFAULT_MODEL_REF, QIANFAN_DEFAULT_MODEL_REF } from "./onboard-auth.models.js";
15
14
  import { XIAOMI_DEFAULT_MODEL_REF, ZAI_DEFAULT_MODEL_REF, setChutesApiKey, setCloudflareAiGatewayConfig, setGeminiApiKey, setKimiCodingApiKey, setLitellmApiKey, setMistralApiKey, setMoonshotApiKey, setOpencodeZenApiKey, setQianfanApiKey, setQwenApiKey, setQwenCodingPlanApiKey, setSyntheticApiKey, setTogetherApiKey, setVeniceApiKey, setVercelAiGatewayApiKey, setXiaomiApiKey, setZaiApiKey } from "./onboard-auth.credentials.js";
16
15
  import { applyCloudflareAiGatewayConfig, applyCloudflareAiGatewayProviderConfig, applyVercelAiGatewayConfig, applyVercelAiGatewayProviderConfig } from "./onboard-auth.config-gateways.js";
17
- import { applyLitellmConfig, applyLitellmProviderConfig } from "./onboard-auth.config-litellm.js";
16
+ import { applyLitellmProviderConfig } from "./onboard-auth.config-litellm.js";
18
17
  import { applyAuthProfileConfig, applyChutesConfig, applyChutesProviderConfig, applyKimiCodeConfig, applyKimiCodeProviderConfig, applyMistralConfig, applyMistralProviderConfig, applyMoonshotConfig, applyMoonshotConfigCn, applyMoonshotProviderConfig, applyMoonshotProviderConfigCn, applyQianfanConfig, applyQianfanProviderConfig, applyQwenCodingPlanConfig, applyQwenCodingPlanProviderConfig, applyQwenConfig, applyQwenProviderConfig, applySyntheticConfig, applySyntheticProviderConfig, applyTogetherConfig, applyTogetherProviderConfig, applyVeniceConfig, applyVeniceProviderConfig, applyXiaomiConfig, applyXiaomiProviderConfig, applyZaiConfig, applyZaiProviderConfig } from "./onboard-auth.config-core.js";
19
18
  import { applyOpencodeZenConfig, applyOpencodeZenProviderConfig } from "./onboard-auth.config-opencode.js";
20
19
  import "./onboard-auth.js";
@@ -342,12 +341,8 @@ async function applyAuthChoiceApiProviders(params) {
342
341
  mode: "api_key"
343
342
  });
344
343
  }
345
- await applyProviderDefaultModel({
346
- defaultModel: LITELLM_DEFAULT_MODEL_REF,
347
- applyDefaultConfig: applyLitellmConfig,
348
- applyProviderConfig: applyLitellmProviderConfig,
349
- noteDefault: LITELLM_DEFAULT_MODEL_REF
350
- });
344
+ nextConfig = applyLitellmProviderConfig(nextConfig);
345
+ await params.prompter.note("LiteLLM is connected. Choose a model returned by this proxy after discovery completes.", "LiteLLM model discovery");
351
346
  return {
352
347
  config: nextConfig,
353
348
  agentModelOverride
@@ -6,7 +6,7 @@ import { isRemoteEnvironment } from "./oauth-env.js";
6
6
  import { setOpenaiApiKey, writeOAuthCredentials } from "./onboard-auth.credentials.js";
7
7
  import { applyAuthProfileConfig } from "./onboard-auth.config-core.js";
8
8
  import "./onboard-auth.js";
9
- import { OPENAI_CODEX_DEFAULT_MODEL, applyOpenAICodexModelDefault } from "./openai-codex-model-default.js";
9
+ import { applyOpenAICodexModelDefault, discoverOpenAICodexDefaultModel } from "./openai-codex-model-default.js";
10
10
  import { loginOpenAICodexOAuth } from "./openai-codex-oauth.js";
11
11
  import { OPENAI_DEFAULT_MODEL, applyOpenAIConfig, applyOpenAIProviderConfig } from "./openai-model-default.js";
12
12
 
@@ -88,15 +88,21 @@ async function applyAuthChoiceOpenAI(params) {
88
88
  provider: "openai-codex",
89
89
  mode: "oauth"
90
90
  });
91
- if (params.setDefaultModel) {
92
- const applied = applyOpenAICodexModelDefault(nextConfig);
91
+ const discoveredModel = await discoverOpenAICodexDefaultModel({
92
+ config: nextConfig,
93
+ agentDir: params.agentDir
94
+ });
95
+ if (params.setDefaultModel && discoveredModel) {
96
+ const applied = applyOpenAICodexModelDefault(nextConfig, discoveredModel);
93
97
  nextConfig = applied.next;
94
98
  if (applied.changed) {
95
- await params.prompter.note(`Default model set to ${OPENAI_CODEX_DEFAULT_MODEL}`, "Model configured");
99
+ await params.prompter.note(`Default model set to ${discoveredModel}`, "Model configured");
96
100
  }
97
- } else {
98
- agentModelOverride = OPENAI_CODEX_DEFAULT_MODEL;
99
- await noteAgentModel(OPENAI_CODEX_DEFAULT_MODEL);
101
+ } else if (!params.setDefaultModel && discoveredModel) {
102
+ agentModelOverride = discoveredModel;
103
+ await noteAgentModel(discoveredModel);
104
+ } else if (!discoveredModel) {
105
+ await params.prompter.note("Sign-in completed, but the authenticated runtime did not return an executable model. Refresh Agent > Models or run `fased models list --all --provider openai-codex`.", "No sign-in model available");
100
106
  }
101
107
  }
102
108
  return {
@@ -4,7 +4,6 @@ import "../agents/auth-profiles.js";
4
4
  import { getCustomProviderApiKey, resolveEnvApiKey } from "../agents/model-auth.js";
5
5
  import { resolveDefaultModelForAgent } from "../agents/model-selection.js";
6
6
  import { loadModelCatalog } from "../agents/model-catalog.js";
7
- import { OPENAI_CODEX_DEFAULT_MODEL } from "./openai-codex-model-default.js";
8
7
 
9
8
  //#region src/commands/auth-choice.model-check.ts
10
9
  async function warnIfModelConfigLooksOff(config, prompter, options) {
@@ -33,7 +32,7 @@ async function warnIfModelConfigLooksOff(config, prompter, options) {
33
32
  if (ref.provider === "openai") {
34
33
  const hasCodex = listProfilesForProvider(store, "openai-codex").length > 0;
35
34
  if (hasCodex) {
36
- warnings.push(`Detected OpenAI sign-in. Consider setting agents.defaults.model to ${OPENAI_CODEX_DEFAULT_MODEL}.`);
35
+ warnings.push("Detected OpenAI sign-in. Choose a model returned by `fased models list --all --provider openai-codex`.");
37
36
  }
38
37
  }
39
38
  if (warnings.length > 0) {
@@ -1,8 +1,9 @@
1
+ import { resolveFasedAgentAgentDir } from "../agents/agent-paths.js";
1
2
  import { ensureAuthProfileStore } from "../agents/auth-profiles/store.js";
2
3
  import "../agents/auth-profiles.js";
3
4
  import { randomToken } from "./onboard-helpers.js";
4
5
  import { promptAuthChoiceGrouped } from "./auth-choice-prompt.js";
5
- import { applyModelAllowlist, applyModelFallbacksFromSelection, promptModelAllowlist } from "./model-picker.js";
6
+ import { applyModelAllowlist, applyModelFallbacksFromSelection, applyPrimaryModel, promptModelAllowlist } from "./model-picker.js";
6
7
  import { applyAuthChoice } from "./auth-choice.apply.js";
7
8
  import { resolvePreferredProviderForAuthChoice } from "./auth-choice.preferred-provider.js";
8
9
  import "./auth-choice.js";
@@ -20,12 +21,6 @@ function sanitizeTokenValue(value) {
20
21
  }
21
22
  return trimmed;
22
23
  }
23
- const ANTHROPIC_OAUTH_MODEL_KEYS = [
24
- "anthropic/claude-fable-5",
25
- "anthropic/claude-opus-4-8",
26
- "anthropic/claude-sonnet-5",
27
- "anthropic/claude-haiku-4-5"
28
- ];
29
24
  function buildGatewayAuthConfig(params) {
30
25
  const allowTailscale = params.existing?.allowTailscale;
31
26
  const base = {};
@@ -61,9 +56,10 @@ function buildGatewayAuthConfig(params) {
61
56
  return base;
62
57
  }
63
58
  async function promptAuthConfig(cfg, runtime, prompter) {
59
+ const agentDir = resolveFasedAgentAgentDir();
64
60
  const authChoice = await promptAuthChoiceGrouped({
65
61
  prompter,
66
- store: ensureAuthProfileStore(undefined, { allowKeychainPrompt: false }),
62
+ store: ensureAuthProfileStore(agentDir, { allowKeychainPrompt: false }),
67
63
  includeSkip: true
68
64
  });
69
65
  let next = cfg;
@@ -82,24 +78,26 @@ async function promptAuthConfig(cfg, runtime, prompter) {
82
78
  config: next,
83
79
  prompter,
84
80
  runtime,
85
- setDefaultModel: true
81
+ setDefaultModel: false,
82
+ agentDir
86
83
  });
87
84
  next = applied.config;
88
85
  }
89
- const anthropicOAuth = authChoice === "anthropic-oauth" || authChoice === "setup-token" || authChoice === "token" || authChoice === "oauth";
90
86
  const preferredProvider = authChoice !== "custom-api-key" ? resolvePreferredProviderForAuthChoice(authChoice, { config: next }) : undefined;
91
87
  if (authChoice !== "custom-api-key" && authChoice !== "skip") {
92
88
  const allowlistSelection = await promptModelAllowlist({
93
89
  config: next,
94
90
  prompter,
95
- allowedKeys: anthropicOAuth ? ANTHROPIC_OAUTH_MODEL_KEYS : undefined,
96
- initialSelections: anthropicOAuth ? ["anthropic/claude-sonnet-5"] : undefined,
97
- message: anthropicOAuth ? "Anthropic OAuth models" : undefined,
98
- preferredProvider
91
+ preferredProvider,
92
+ agentDir
99
93
  });
100
94
  if (allowlistSelection.models) {
101
- next = applyModelAllowlist(next, allowlistSelection.models);
102
- next = applyModelFallbacksFromSelection(next, allowlistSelection.models);
95
+ const selectedModels = allowlistSelection.models;
96
+ if (selectedModels[0]) {
97
+ next = applyPrimaryModel(next, selectedModels[0]);
98
+ }
99
+ next = applyModelAllowlist(next, selectedModels);
100
+ next = applyModelFallbacksFromSelection(next, selectedModels);
103
101
  }
104
102
  }
105
103
  return next;
@@ -1,11 +1,11 @@
1
1
  import { resolveAgentModelPrimaryValue } from "../config/model-input.js";
2
2
  import { CLOUDFLARE_AI_GATEWAY_MODEL_REFS } from "../providers/cloudflare-ai-gateway-shared.js";
3
3
  import { HUGGINGFACE_MODEL_REFS } from "../providers/huggingface-models.js";
4
- import { LITELLM_MODEL_REFS } from "../providers/litellm-models.js";
5
4
  import { OPENCODE_ZEN_MODEL_REFS } from "../providers/opencode-zen-shared.js";
6
5
  import { TOGETHER_MODEL_REFS } from "../providers/together-models.js";
7
6
  import { VENICE_MODEL_REFS } from "../providers/venice-models.js";
8
7
  import { VERCEL_AI_GATEWAY_MODEL_REFS } from "../providers/vercel-ai-gateway-models.js";
8
+ import { LITELLM_MODEL_REFS } from "../providers/litellm-models.js";
9
9
  import { BYTEPLUS_CODING_MODEL_REFS, BYTEPLUS_MODEL_REFS, COPILOT_PROXY_MODEL_REFS, GITHUB_COPILOT_MODEL_REFS, GOOGLE_API_MODEL_REFS, GOOGLE_GEMINI_CLI_MODEL_REFS, MISTRAL_MODEL_REFS, OPENAI_API_MODEL_REFS, OPENAI_SIGN_IN_MODEL_REFS, OPENROUTER_MODEL_REFS, QIANFAN_MODEL_REFS, SYNTHETIC_MODEL_REFS, VOLCENGINE_CODING_MODEL_REFS, VOLCENGINE_MODEL_REFS, XAI_MODEL_REFS, XIAOMI_MODEL_REFS, ZAI_MODEL_REFS, isStandardProviderCatalogEntry, isStandardProviderModelRef } from "../providers/registry.js";
10
10
  import { DEFAULT_MODEL, DEFAULT_PROVIDER } from "../agents/defaults.js";
11
11
  import { ensureAuthProfileStore } from "../agents/auth-profiles/store.js";
@@ -16,6 +16,7 @@ import { buildAllowedModelSet, buildModelAliasIndex, modelKey, normalizeProvider
16
16
  import { buildCredentialScopedAllowedModelSet } from "../agents/model-catalog-access.js";
17
17
  import { formatModelFeatureList } from "../agents/model-metadata.js";
18
18
  import { loadModelCatalog } from "../agents/model-catalog.js";
19
+ import { resolveAuthenticatedModelCatalog } from "../agents/authenticated-model-catalog.js";
19
20
  import { loadPreviewModelListSources } from "./models/list.preview-catalog.js";
20
21
  import { formatTokenK } from "./models/shared.js";
21
22
  import { OPENAI_CODEX_DEFAULT_MODEL } from "./openai-codex-model-default.js";
@@ -205,14 +206,31 @@ function loadModelPickerPreviewCatalog(cfg) {
205
206
  catalogSource: "current-preview"
206
207
  }));
207
208
  }
208
- async function loadModelPickerCatalog(cfg) {
209
+ async function loadModelPickerCatalog(cfg, agentDir) {
209
210
  const catalog = await loadModelCatalog({
210
211
  config: cfg,
211
212
  useCache: false,
212
213
  includeMetadata: true
213
214
  });
214
215
  const models = catalog.length > 0 ? catalog : loadModelPickerPreviewCatalog(cfg);
215
- return models.filter(isStandardProviderCatalogEntry);
216
+ const standardModels = models.filter(isStandardProviderCatalogEntry);
217
+ if (!agentDir) {
218
+ return standardModels;
219
+ }
220
+ const store = ensureAuthProfileStore(agentDir, { allowKeychainPrompt: false });
221
+ const authenticated = await resolveAuthenticatedModelCatalog({
222
+ cfg,
223
+ store,
224
+ catalog: standardModels,
225
+ defaultProvider: DEFAULT_PROVIDER
226
+ });
227
+ return authenticated.allowedCatalog.length > 0 ? authenticated.allowedCatalog : authenticated.usableCatalog;
228
+ }
229
+ async function resolveAuthenticatedDefaultModel(params) {
230
+ const catalog = await loadModelPickerCatalog(params.config, params.agentDir);
231
+ const preferredProvider = normalizeProviderId(params.preferredProvider ?? "");
232
+ const candidate = (preferredProvider ? catalog.find((entry) => normalizeProviderId(entry.provider) === preferredProvider) : undefined) ?? catalog[0];
233
+ return candidate ? modelKey(candidate.provider, candidate.id) : undefined;
216
234
  }
217
235
  async function promptManualModel(params) {
218
236
  const modelInput = await params.prompter.text({
@@ -244,7 +262,7 @@ async function promptDefaultModel(params) {
244
262
  const resolvedKey = modelKey(resolved.provider, resolved.model);
245
263
  const configuredKey = configuredRaw ? resolvedKey : "";
246
264
  const allowKeep = allowKeepRequested && !isHiddenRouterModelRef(configuredRaw);
247
- const catalog = await loadModelPickerCatalog(cfg);
265
+ const catalog = await loadModelPickerCatalog(cfg, params.ignoreAllowlist ? undefined : params.agentDir);
248
266
  if (catalog.length === 0) {
249
267
  return promptManualModel({
250
268
  prompter: params.prompter,
@@ -464,7 +482,7 @@ async function promptModelAllowlist(params) {
464
482
  ...params.initialSelections ?? []
465
483
  ]);
466
484
  const initialKeys = allowedKeySet ? initialSeeds.filter((key) => allowedKeySet.has(key)) : initialSeeds;
467
- const catalog = await loadModelPickerCatalog(cfg);
485
+ const catalog = await loadModelPickerCatalog(cfg, params.agentDir);
468
486
  if (catalog.length === 0 && allowedKeys.length === 0) {
469
487
  const raw = await params.prompter.text({
470
488
  message: params.message ?? "Allowlist models (comma-separated provider/model; blank to keep current)",
@@ -503,7 +521,7 @@ async function promptModelAllowlist(params) {
503
521
  hasAuth
504
522
  });
505
523
  }
506
- const supplementalKeys = allowedKeySet ? allowedKeys : existingKeys;
524
+ const supplementalKeys = allowedKeySet ? allowedKeys : params.agentDir ? [] : existingKeys;
507
525
  for (const key of supplementalKeys) {
508
526
  if (seen.has(key)) {
509
527
  continue;
@@ -630,4 +648,4 @@ function applyModelFallbacksFromSelection(cfg, selection) {
630
648
  }
631
649
 
632
650
  //#endregion
633
- export { applyModelAllowlist, applyModelFallbacksFromSelection, applyPrimaryModel, promptModelAllowlist };
651
+ export { applyModelAllowlist, applyModelFallbacksFromSelection, applyPrimaryModel, promptModelAllowlist, resolveAuthenticatedDefaultModel };
@@ -1,9 +1,13 @@
1
+ import { DEFAULT_PROVIDER } from "../../agents/defaults.js";
1
2
  import { resolveFasedAgentAgentDir } from "../../agents/agent-paths.js";
3
+ import { ensureAuthProfileStore } from "../../agents/auth-profiles/store.js";
4
+ import "../../agents/auth-profiles.js";
2
5
  import { modelKey } from "../../agents/model-selection.js";
3
6
  import { ensureFasedAgentModelsJson } from "../../agents/models-config.js";
4
7
  import { discoverAuthStorage, discoverModels } from "../../agents/pi-model-discovery.js";
5
8
  import { deriveModelMetadata, formatModelFeatureList } from "../../agents/model-metadata.js";
6
9
  import { loadModelCatalog } from "../../agents/model-catalog.js";
10
+ import { resolveAuthenticatedModelCatalog } from "../../agents/authenticated-model-catalog.js";
7
11
  import { isLocalBaseUrl } from "./shared.js";
8
12
  import { createModelListAuthIndex } from "./list.auth-index.js";
9
13
  import { MODEL_AVAILABILITY_UNAVAILABLE_CODE, formatErrorWithStack, shouldFallbackToAuthHeuristics } from "./list.errors.js";
@@ -58,34 +62,25 @@ function normalizeModelListSource(model) {
58
62
  metadata: "metadata" in model ? model.metadata : undefined
59
63
  };
60
64
  }
61
- function mergeModelCatalogEntries(params) {
62
- const models = params.registryModels.map((model) => normalizeModelListSource(model));
63
- const seen = new Set(models.map((model) => modelKey(model.provider, model.id)));
64
- for (const entry of params.catalog) {
65
- const key = modelKey(entry.provider, entry.id);
66
- if (seen.has(key)) {
67
- continue;
68
- }
69
- models.push(normalizeModelListSource(entry));
70
- seen.add(key);
71
- }
72
- return models;
73
- }
74
65
  async function loadModelRegistry(cfg) {
75
66
  await ensureFasedAgentModelsJson(cfg);
76
67
  const agentDir = resolveFasedAgentAgentDir();
77
68
  const authStorage = discoverAuthStorage(agentDir);
78
69
  const registry = discoverModels(authStorage, agentDir);
79
- const registryModels = registry.getAll();
70
+ registry.getAll();
80
71
  const catalog = await loadModelCatalog({
81
72
  config: cfg,
82
73
  useCache: false,
83
74
  includeMetadata: true
84
75
  });
85
- const models = mergeModelCatalogEntries({
86
- registryModels,
87
- catalog
76
+ const store = ensureAuthProfileStore(agentDir, { allowKeychainPrompt: false });
77
+ const authenticated = await resolveAuthenticatedModelCatalog({
78
+ cfg,
79
+ store,
80
+ catalog,
81
+ defaultProvider: DEFAULT_PROVIDER
88
82
  });
83
+ const models = authenticated.usableCatalog.map((model) => normalizeModelListSource(model));
89
84
  let availableKeys;
90
85
  let availabilityErrorMessage;
91
86
  try {
@@ -1,8 +1,8 @@
1
1
  import { HUGGINGFACE_BASE_URL, HUGGINGFACE_DEFAULT_MODEL_REF, HUGGINGFACE_MODEL_CATALOG, buildHuggingfaceModelDefinition } from "../providers/huggingface-models.js";
2
- import { LITELLM_BASE_URL, LITELLM_DEFAULT_MODEL_ID } from "../providers/litellm-models.js";
3
2
  import { SYNTHETIC_BASE_URL, SYNTHETIC_DEFAULT_MODEL_REF, SYNTHETIC_MODEL_CATALOG, buildSyntheticModelDefinition } from "../providers/synthetic-models.js";
4
3
  import { TOGETHER_BASE_URL, TOGETHER_DEFAULT_MODEL_REF, TOGETHER_MODEL_CATALOG, buildTogetherModelDefinition } from "../providers/together-models.js";
5
4
  import { VENICE_BASE_URL, VENICE_DEFAULT_MODEL_REF, VENICE_MODEL_CATALOG, buildVeniceModelDefinition } from "../providers/venice-models.js";
5
+ import { LITELLM_BASE_URL, LITELLM_DEFAULT_MODEL_ID } from "../providers/litellm-models.js";
6
6
  import { CHUTES_BASE_URL, CHUTES_DEFAULT_MODEL_REF, CHUTES_MODEL_CATALOG, buildChutesModelDefinition } from "../agents/chutes-models.js";
7
7
  import "../agents/huggingface-models.js";
8
8
  import "../agents/synthetic-models.js";
@@ -1,31 +1,31 @@
1
- import { LITELLM_BASE_URL, LITELLM_DEFAULT_MODEL_ID, LITELLM_DEFAULT_MODEL_REF, LITELLM_MODEL_CATALOG, buildLitellmModelDefinition as buildLitellmModelDefinition$1 } from "../providers/litellm-models.js";
2
- import { applyAgentDefaultModelPrimary, applyProviderConfigWithDefaultModel } from "./onboard-auth.config-shared.js";
1
+ import { LITELLM_BASE_URL, LITELLM_DEFAULT_MODEL_ID } from "../providers/litellm-models.js";
3
2
 
4
3
  //#region src/commands/onboard-auth.config-litellm.ts
5
- function buildLitellmModelDefinition() {
6
- return buildLitellmModelDefinition$1(LITELLM_MODEL_CATALOG[0]);
7
- }
8
4
  function applyLitellmProviderConfig(cfg) {
9
- const models = { ...cfg.agents?.defaults?.models };
10
- models[LITELLM_DEFAULT_MODEL_REF] = {
11
- ...models[LITELLM_DEFAULT_MODEL_REF],
12
- alias: models[LITELLM_DEFAULT_MODEL_REF]?.alias ?? "LiteLLM proxy default"
13
- };
14
- const defaultModel = buildLitellmModelDefinition();
15
- const existingProvider = cfg.models?.providers?.litellm;
5
+ const providers = { ...cfg.models?.providers };
6
+ const existingProvider = providers.litellm;
16
7
  const resolvedBaseUrl = typeof existingProvider?.baseUrl === "string" ? existingProvider.baseUrl.trim() : "";
17
- return applyProviderConfigWithDefaultModel(cfg, {
18
- agentModels: models,
19
- providerId: "litellm",
20
- api: "openai-completions",
8
+ providers.litellm = {
9
+ ...existingProvider,
10
+ ...typeof existingProvider?.apiKey === "string" && existingProvider.apiKey.trim() ? { apiKey: existingProvider.apiKey.trim() } : {},
21
11
  baseUrl: resolvedBaseUrl || LITELLM_BASE_URL,
22
- defaultModel,
23
- defaultModelId: LITELLM_DEFAULT_MODEL_ID
24
- });
12
+ api: "openai-completions",
13
+ request: {
14
+ ...existingProvider?.request,
15
+ allowPrivateNetwork: true
16
+ },
17
+ models: existingProvider?.models ?? []
18
+ };
19
+ return {
20
+ ...cfg,
21
+ models: {
22
+ mode: cfg.models?.mode ?? "merge",
23
+ providers
24
+ }
25
+ };
25
26
  }
26
27
  function applyLitellmConfig(cfg) {
27
- const next = applyLitellmProviderConfig(cfg);
28
- return applyAgentDefaultModelPrimary(next, LITELLM_DEFAULT_MODEL_REF);
28
+ return applyLitellmProviderConfig(cfg);
29
29
  }
30
30
 
31
31
  //#endregion
@@ -1,7 +1,6 @@
1
1
  import { resolveStateDir } from "../config/paths.js";
2
2
  import { CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF } from "../providers/cloudflare-ai-gateway-shared.js";
3
3
  import { HUGGINGFACE_DEFAULT_MODEL_REF } from "../providers/huggingface-models.js";
4
- import { LITELLM_DEFAULT_MODEL_REF } from "../providers/litellm-models.js";
5
4
  import { TOGETHER_DEFAULT_MODEL_REF } from "../providers/together-models.js";
6
5
  import { VERCEL_AI_GATEWAY_DEFAULT_MODEL_REF } from "../providers/vercel-ai-gateway-models.js";
7
6
  import "../providers/registry.js";
@@ -1,6 +1,5 @@
1
1
  import { CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF } from "../providers/cloudflare-ai-gateway-shared.js";
2
2
  import { HUGGINGFACE_DEFAULT_MODEL_REF } from "../providers/huggingface-models.js";
3
- import { LITELLM_DEFAULT_MODEL_REF } from "../providers/litellm-models.js";
4
3
  import { SYNTHETIC_DEFAULT_MODEL_ID, SYNTHETIC_DEFAULT_MODEL_REF } from "../providers/synthetic-models.js";
5
4
  import { TOGETHER_DEFAULT_MODEL_REF } from "../providers/together-models.js";
6
5
  import { VENICE_DEFAULT_MODEL_ID, VENICE_DEFAULT_MODEL_REF } from "../providers/venice-models.js";