@fased/fased 0.1.53 → 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 (179) hide show
  1. package/dist/agents/authenticated-model-catalog.js +27 -0
  2. package/dist/agents/current-model-catalog.js +30 -10
  3. package/dist/agents/model-catalog-normalized.js +1 -0
  4. package/dist/agents/model-catalog-source.js +4 -4
  5. package/dist/agents/model-forward-compat.js +19 -1
  6. package/dist/agents/model-metadata.js +37 -8
  7. package/dist/agents/pi-embedded-runner/agent-messages.js +15 -0
  8. package/dist/agents/pi-embedded-runner/compact.js +2 -1
  9. package/dist/agents/pi-embedded-runner/extra-params.js +25 -0
  10. package/dist/agents/pi-embedded-runner/model.js +2 -7
  11. package/dist/agents/pi-embedded-runner/run/attempt.js +4 -5
  12. package/dist/agents/pi-embedded-runner/utils.js +1 -1
  13. package/dist/brand.js +1 -1
  14. package/dist/build-info.json +3 -3
  15. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  16. package/dist/cli/program/register.agent.js +17 -0
  17. package/dist/cli/providers-cli.js +3 -2
  18. package/dist/commands/agents.commands.models.js +63 -0
  19. package/dist/commands/agents.js +1 -0
  20. package/dist/commands/auth-choice.apply.api-providers.js +3 -8
  21. package/dist/commands/auth-choice.apply.openai.js +13 -7
  22. package/dist/commands/auth-choice.model-check.js +1 -2
  23. package/dist/commands/configure.gateway-auth.js +14 -16
  24. package/dist/commands/model-picker.js +25 -7
  25. package/dist/commands/models/list.registry.js +13 -18
  26. package/dist/commands/onboard-auth.config-core.js +1 -1
  27. package/dist/commands/onboard-auth.config-litellm.js +21 -21
  28. package/dist/commands/onboard-auth.credentials.js +0 -1
  29. package/dist/commands/onboard-auth.js +0 -1
  30. package/dist/commands/openai-codex-model-default.js +26 -4
  31. package/dist/config/defaults.js +1 -1
  32. package/dist/config/zod-schema.agent-defaults.js +4 -2
  33. package/dist/config/zod-schema.agent-runtime.js +4 -2
  34. package/dist/config/zod-schema.core.js +4 -2
  35. package/dist/control-ui/assets/{app-WIDYwhr-.js → app-D2RaTXoV.js} +1788 -1755
  36. package/dist/control-ui/assets/chat-model-ref-BZFblCeY.js +2 -0
  37. package/dist/control-ui/assets/{index-K3ysLeTN.js → index-D2nC6I-9.js} +3 -3
  38. package/dist/control-ui/assets/{providers-rQMhp1fb.js → providers-CyjiG5Jw.js} +4 -4
  39. package/dist/control-ui/index.html +1 -1
  40. package/dist/control-ui/version.json +1 -0
  41. package/dist/cron/isolated-agent/run.js +9 -3
  42. package/dist/cron/normalize.js +10 -0
  43. package/dist/gateway/control-ui.js +2 -0
  44. package/dist/gateway/protocol/schema/agents-models-skills.js +6 -2
  45. package/dist/gateway/protocol/schema/cron.js +7 -0
  46. package/dist/gateway/server-methods/models.js +8 -9
  47. package/dist/gateway/server-model-catalog.js +3 -0
  48. package/dist/infra/update-runner.js +31 -3
  49. package/dist/light-update-status.js +10 -10
  50. package/dist/memory/inventory.js +19 -2
  51. package/dist/plugin-sdk/{accounts-BZrfqJmO.js → accounts-CeRNo5Ae.js} +1 -1
  52. package/dist/plugin-sdk/{actions-7_zTh8zC.js → actions-OMRHtXPj.js} +2 -2
  53. package/dist/plugin-sdk/{active-listener-D8NVRD8J.js → active-listener-BlIkS3iR.js} +1 -1
  54. package/dist/plugin-sdk/{audio-preflight-BrVWUkoP.js → audio-preflight-B2n3a2Tj.js} +26 -26
  55. package/dist/plugin-sdk/{audit-2iRlVyQF.js → audit-Ppg6dR_b.js} +1 -1
  56. package/dist/plugin-sdk/{channel-access-BCf1rJsn.js → channel-access-af8dWWRv.js} +1 -1
  57. package/dist/plugin-sdk/{channel-access-configure-B-Z51Qsd.js → channel-access-configure-B6IAGlE0.js} +1 -1
  58. package/dist/plugin-sdk/channel-plugin-common.d.ts +3 -3
  59. package/dist/plugin-sdk/channel-plugin-common.js +4 -4
  60. package/dist/plugin-sdk/{chunk-BREC9ijl.js → chunk-CD76Byie.js} +1 -1
  61. package/dist/plugin-sdk/{chunk-items-BLRCltGL.js → chunk-items-Bu19zrYH.js} +1 -1
  62. package/dist/plugin-sdk/command-status.d.ts +2 -2
  63. package/dist/plugin-sdk/command-status.js +26 -26
  64. package/dist/plugin-sdk/{commands-registry-D3-bFLsz.js → commands-registry-DgS55tNj.js} +2 -2
  65. package/dist/plugin-sdk/{common-BlqMqEqn.js → common-CWvfeiX0.js} +1 -1
  66. package/dist/plugin-sdk/{config-442EDe7Z.js → config-CYDETqcF.js} +130 -134
  67. package/dist/plugin-sdk/{config-schema-DV0zctd2.js → config-schema-CQ4EVcQG.js} +164 -78
  68. package/dist/plugin-sdk/device-pair.d.ts +1 -1
  69. package/dist/plugin-sdk/discord.d.ts +5 -5
  70. package/dist/plugin-sdk/discord.js +19 -19
  71. package/dist/plugin-sdk/{group-mentions-DLOOve8d.d.ts → group-mentions-BxDgHCgj.d.ts} +1 -1
  72. package/dist/plugin-sdk/{handle-action-pNaP87Dr.js → handle-action-B75UVKxF.js} +13 -13
  73. package/dist/plugin-sdk/{helpers-B994qqVW.js → helpers-BuEwju6y.js} +1 -1
  74. package/dist/plugin-sdk/{image-ops-Doq8nZQw.js → image-ops-C66HPeAZ.js} +1 -1
  75. package/dist/plugin-sdk/index.d.ts +8 -8
  76. package/dist/plugin-sdk/index.js +28 -28
  77. package/dist/plugin-sdk/{login-CK2zTIJA.js → login-Amr2DpKU.js} +3 -3
  78. package/dist/plugin-sdk/{login-qr-u8Mn1mCp.js → login-qr-DMQNEi9m.js} +3 -3
  79. package/dist/plugin-sdk/{manager-CeJNf2bH.js → manager-Bvpq49BI.js} +2 -2
  80. package/dist/plugin-sdk/{markdown-tables-DeZztrY6.js → markdown-tables-DmQ7oXOm.js} +1 -1
  81. package/dist/plugin-sdk/{media-CgUAEfhs.js → media-ByLQbEwJ.js} +2 -2
  82. package/dist/plugin-sdk/{monitor-CEtMJuFX.js → monitor-K_u6daGa.js} +30 -30
  83. package/dist/plugin-sdk/{monitor-D-APtCpn.js → monitor-S_7LrvSj.js} +31 -31
  84. package/dist/plugin-sdk/{openresponses-http-g1Iz0xB2.js → openresponses-http-BrDJUZXR.js} +26 -26
  85. package/dist/plugin-sdk/{optional-runtime-dependency-D0BdXz1C.js → optional-runtime-dependency-CbYjAC2b.js} +1 -1
  86. package/dist/plugin-sdk/{outbound-DXGuFrdx.js → outbound-BuDafBBI.js} +6 -6
  87. package/dist/plugin-sdk/{outbound-attachment-oxhGO33g.js → outbound-attachment-DmZmUqFP.js} +2 -2
  88. package/dist/plugin-sdk/{pairing-message-D3WPVg_j.d.ts → pairing-message-D0-UWGFJ.d.ts} +2 -2
  89. package/dist/plugin-sdk/{pairing-message-C29ixrvn.js → pairing-message-e4D4eBDA.js} +1 -1
  90. package/dist/plugin-sdk/{pairing-store-1kcsOWRs.js → pairing-store-T3IGoGZg.js} +2 -2
  91. package/dist/plugin-sdk/{pi-model-discovery-l-xqaEd0.js → pi-model-discovery-DvAG_Png.js} +1 -1
  92. package/dist/plugin-sdk/{pi-model-discovery-runtime-CibV8F8G.js → pi-model-discovery-runtime-NjkUgjIf.js} +2 -2
  93. package/dist/plugin-sdk/provider-web-search-config-contract.d.ts +2 -2
  94. package/dist/plugin-sdk/{pw-ai-9qEBW5-k.js → pw-ai-D7eW43DL.js} +3 -3
  95. package/dist/plugin-sdk/{replies-BX3L8fX7.js → replies-BMIPmEoP.js} +2 -2
  96. package/dist/plugin-sdk/{resolve-outbound-target-D0AK10E7.js → resolve-outbound-target-CXCqUUPV.js} +1 -1
  97. package/dist/plugin-sdk/{resolve-route-UO6XLYH3.js → resolve-route-DJN-SUSt.js} +1 -1
  98. package/dist/plugin-sdk/{retry-policy-C5N8JiHL.js → retry-policy-CY1qY6d7.js} +1 -1
  99. package/dist/plugin-sdk/{runtime-Dnzwux3G.js → runtime-CgOkQe0w.js} +3 -3
  100. package/dist/plugin-sdk/{runtime-dependency-BDDpVKBO.js → runtime-dependency-DvdRNMvs.js} +2 -2
  101. package/dist/plugin-sdk/sat-runtime.d.ts +3 -3
  102. package/dist/plugin-sdk/sat-runtime.js +5 -5
  103. package/dist/plugin-sdk/{send-bcKv8F5E.js → send-2ITqny2W.js} +8 -8
  104. package/dist/plugin-sdk/{send-DGEgo_6f.js → send-BAz22RZr.js} +5 -5
  105. package/dist/plugin-sdk/{send-DcsYRH2f.js → send-BG3RWyil.js} +7 -7
  106. package/dist/plugin-sdk/{send-D5rgCP1r.js → send-Cr-dj6S-.js} +6 -6
  107. package/dist/plugin-sdk/{send-B4XLsTL0.js → send-eTxqFFsw.js} +6 -6
  108. package/dist/plugin-sdk/{session-BoGNOlwv.js → session-C8nJmmVE.js} +2 -2
  109. package/dist/plugin-sdk/{skill-commands-Be8s4TGQ.js → skill-commands-Rm5by9S8.js} +2 -2
  110. package/dist/plugin-sdk/{slack-actions-TNnAXiUx.js → slack-actions-BNIALJTA.js} +11 -11
  111. package/dist/plugin-sdk/{slack-74qForpW.js → slack-xvIVvyEM.js} +38 -38
  112. package/dist/plugin-sdk/slack.d.ts +5 -5
  113. package/dist/plugin-sdk/slack.js +9 -9
  114. package/dist/plugin-sdk/{sticker-cache-CrYayLff.js → sticker-cache-D3oDiu2u.js} +3 -3
  115. package/dist/plugin-sdk/{tables-Ch4js2qy.js → tables-DS5L7lCA.js} +1 -1
  116. package/dist/plugin-sdk/{targets-BGfRUJPE.js → targets-D6lUomJc.js} +1 -1
  117. package/dist/plugin-sdk/{telegram-actions-BGy4AEvF.js → telegram-actions-MSFkDn0m.js} +29 -29
  118. package/dist/plugin-sdk/telegram.d.ts +5 -5
  119. package/dist/plugin-sdk/telegram.js +8 -8
  120. package/dist/plugin-sdk/{thread-bindings.lifecycle-_uQ2EF17.js → thread-bindings.lifecycle-Ry6Vcgw3.js} +3 -3
  121. package/dist/plugin-sdk/{thread-bindings.state-DUg0s_1X.js → thread-bindings.state-C0stmvNk.js} +2 -2
  122. package/dist/plugin-sdk/{tmp-fased-dir-BrbXGSkl.d.ts → tmp-fased-dir-D91GExk4.d.ts} +2 -2
  123. package/dist/plugin-sdk/{types-CBCtqtMn.d.ts → types-BzadOItY.d.ts} +1 -1
  124. package/dist/plugin-sdk/{types-DlKIHIqA.d.ts → types-DKvBJHfH.d.ts} +16 -6
  125. package/dist/plugin-sdk/{types-BJdDoTQF.d.ts → types-DVTIpopt.d.ts} +2 -2
  126. package/dist/plugin-sdk/{types.plugin-CvUiB3Kh.d.ts → types.plugin-BiHPaDTF.d.ts} +2 -1
  127. package/dist/plugin-sdk/{wallet-status-M6aK3abH.js → wallet-status-f0HagNeO.js} +31 -13
  128. package/dist/plugin-sdk/{web-r1KFR44s.js → web-DRNJxHXA.js} +31 -31
  129. package/dist/plugin-sdk/{whatsapp-actions-CID_tqAX.js → whatsapp-actions-BDXZF2R5.js} +13 -13
  130. package/dist/plugin-sdk/{whatsapp-heartbeat-Bk-aZVMa.js → whatsapp-heartbeat-CKgmwCGr.js} +2 -2
  131. package/dist/plugin-sdk/whatsapp.d.ts +5 -5
  132. package/dist/plugin-sdk/whatsapp.js +12 -12
  133. package/dist/plugin-sdk/{wsl-C_STtED7.js → wsl-Biw7Mj39.js} +3 -3
  134. package/dist/providers/huggingface-models.js +0 -30
  135. package/dist/providers/litellm-models.js +1 -1
  136. package/dist/providers/opencode-zen-shared.js +0 -1
  137. package/dist/providers/refresh.js +221 -62
  138. package/dist/providers/registry.js +31 -7
  139. package/dist/providers/runtime-model-catalog.js +181 -0
  140. package/dist/providers/vercel-ai-gateway-models.js +0 -35
  141. package/dist/shared/model-thinking.js +44 -2
  142. package/dist/wizard/onboarding.js +24 -6
  143. package/extensions/acpx/package.json +1 -1
  144. package/extensions/bluebubbles/package.json +1 -1
  145. package/extensions/copilot-proxy/package.json +1 -1
  146. package/extensions/diagnostics-otel/package.json +1 -1
  147. package/extensions/fased-federation/package.json +1 -1
  148. package/extensions/google-gemini-cli-auth/package.json +1 -1
  149. package/extensions/imessage/package.json +1 -1
  150. package/extensions/irc/package.json +1 -1
  151. package/extensions/line/package.json +1 -1
  152. package/extensions/llm-task/package.json +1 -1
  153. package/extensions/lobster/package.json +1 -1
  154. package/extensions/matrix/CHANGELOG.md +12 -0
  155. package/extensions/matrix/package.json +1 -1
  156. package/extensions/mattermost/package.json +1 -1
  157. package/extensions/memory-core/package.json +2 -2
  158. package/extensions/memory-lancedb/package.json +1 -1
  159. package/extensions/minimax-portal-auth/package.json +1 -1
  160. package/extensions/msteams/CHANGELOG.md +12 -0
  161. package/extensions/msteams/package.json +1 -1
  162. package/extensions/nextcloud-talk/package.json +1 -1
  163. package/extensions/nostr/CHANGELOG.md +12 -0
  164. package/extensions/nostr/package.json +1 -1
  165. package/extensions/open-prose/package.json +1 -1
  166. package/extensions/sat-mining/package.json +1 -1
  167. package/extensions/signal/package.json +1 -1
  168. package/extensions/synology-chat/package.json +1 -1
  169. package/extensions/tlon/package.json +1 -1
  170. package/extensions/twitch/CHANGELOG.md +12 -0
  171. package/extensions/twitch/package.json +1 -1
  172. package/extensions/voice-call/CHANGELOG.md +12 -0
  173. package/extensions/voice-call/package.json +1 -1
  174. package/extensions/zalo/CHANGELOG.md +12 -0
  175. package/extensions/zalo/package.json +1 -1
  176. package/extensions/zalouser/CHANGELOG.md +12 -0
  177. package/extensions/zalouser/package.json +1 -1
  178. package/package.json +1 -1
  179. package/dist/control-ui/assets/chat-model-ref-NT82zapt.js +0 -2
@@ -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 {
@@ -133,7 +128,7 @@ function toModelRow(params) {
133
128
  cfg,
134
129
  authStore
135
130
  }) : undefined);
136
- const available = availableKeys !== undefined ? availableKeys.has(modelKey(model.provider, model.id)) : authIndex?.hasProviderAuth(model.provider) ?? false;
131
+ const available = availableKeys !== undefined ? availableKeys.has(modelKey(model.provider, model.id)) || model.catalogSource !== "runtime" && (authIndex?.hasProviderAuth(model.provider) ?? false) : authIndex?.hasProviderAuth(model.provider) ?? false;
137
132
  const aliasTags = aliases.length > 0 ? [`alias:${aliases.join(",")}`] : [];
138
133
  const mergedTags = new Set(tags);
139
134
  if (aliasTags.length > 0) {
@@ -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";
@@ -1,5 +1,27 @@
1
+ import { DEFAULT_PROVIDER } from "../agents/defaults.js";
2
+ import { ensureAuthProfileStore } from "../agents/auth-profiles/store.js";
3
+ import "../agents/auth-profiles.js";
4
+ import { loadModelCatalog } from "../agents/model-catalog.js";
5
+ import { resolveAuthenticatedModelCatalog } from "../agents/authenticated-model-catalog.js";
6
+
1
7
  //#region src/commands/openai-codex-model-default.ts
2
8
  const OPENAI_CODEX_DEFAULT_MODEL = "openai-codex/gpt-5.5";
9
+ async function discoverOpenAICodexDefaultModel(params) {
10
+ const catalog = await loadModelCatalog({
11
+ config: params.config,
12
+ useCache: false,
13
+ includeMetadata: true
14
+ });
15
+ const store = ensureAuthProfileStore(params.agentDir, { allowKeychainPrompt: false });
16
+ const authenticated = await resolveAuthenticatedModelCatalog({
17
+ cfg: params.config,
18
+ store,
19
+ catalog,
20
+ defaultProvider: DEFAULT_PROVIDER
21
+ });
22
+ const model = authenticated.usableCatalog.filter((entry) => entry.provider === "openai-codex").toSorted((left, right) => (left.metadata?.recommendationRank ?? Number.MAX_SAFE_INTEGER) - (right.metadata?.recommendationRank ?? Number.MAX_SAFE_INTEGER) || left.name.localeCompare(right.name))[0];
23
+ return model ? `${model.provider}/${model.id}` : undefined;
24
+ }
3
25
  function shouldSetOpenAICodexModel(model) {
4
26
  const trimmed = model?.trim();
5
27
  if (!trimmed) {
@@ -23,7 +45,7 @@ function resolvePrimaryModel(model) {
23
45
  }
24
46
  return undefined;
25
47
  }
26
- function applyOpenAICodexModelDefault(cfg) {
48
+ function applyOpenAICodexModelDefault(cfg, model = OPENAI_CODEX_DEFAULT_MODEL) {
27
49
  const current = resolvePrimaryModel(cfg.agents?.defaults?.model);
28
50
  if (!shouldSetOpenAICodexModel(current)) {
29
51
  return {
@@ -40,8 +62,8 @@ function applyOpenAICodexModelDefault(cfg) {
40
62
  ...cfg.agents?.defaults,
41
63
  model: cfg.agents?.defaults?.model && typeof cfg.agents.defaults.model === "object" ? {
42
64
  ...cfg.agents.defaults.model,
43
- primary: OPENAI_CODEX_DEFAULT_MODEL
44
- } : { primary: OPENAI_CODEX_DEFAULT_MODEL }
65
+ primary: model
66
+ } : { primary: model }
45
67
  }
46
68
  }
47
69
  },
@@ -50,4 +72,4 @@ function applyOpenAICodexModelDefault(cfg) {
50
72
  }
51
73
 
52
74
  //#endregion
53
- export { OPENAI_CODEX_DEFAULT_MODEL, applyOpenAICodexModelDefault };
75
+ export { OPENAI_CODEX_DEFAULT_MODEL, applyOpenAICodexModelDefault, discoverOpenAICodexDefaultModel };
@@ -9,7 +9,7 @@ let defaultWarnState = { warned: false };
9
9
  const DEFAULT_MODEL_ALIASES = {
10
10
  opus: "anthropic/claude-opus-4-8",
11
11
  sonnet: "anthropic/claude-sonnet-5",
12
- gpt: "openai/gpt-5.5",
12
+ gpt: "openai/gpt-5.6",
13
13
  "gpt-mini": "openai/gpt-5.4-mini",
14
14
  gemini: "google/gemini-3.5-flash",
15
15
  "gemini-flash": "google/gemini-3-flash-preview",
@@ -89,7 +89,8 @@ const AgentDefaultsSchema = z.object({
89
89
  z.literal("low"),
90
90
  z.literal("medium"),
91
91
  z.literal("high"),
92
- z.literal("xhigh")
92
+ z.literal("xhigh"),
93
+ z.literal("max")
93
94
  ]).optional(),
94
95
  reasoningDefault: z.union([
95
96
  z.literal("off"),
@@ -97,7 +98,8 @@ const AgentDefaultsSchema = z.object({
97
98
  z.literal("low"),
98
99
  z.literal("medium"),
99
100
  z.literal("high"),
100
- z.literal("xhigh")
101
+ z.literal("xhigh"),
102
+ z.literal("max")
101
103
  ]).optional(),
102
104
  fastModeDefault: z.boolean().optional(),
103
105
  verboseDefault: z.union([
@@ -541,7 +541,8 @@ const AgentEntrySchema = z.object({
541
541
  z.literal("low"),
542
542
  z.literal("medium"),
543
543
  z.literal("high"),
544
- z.literal("xhigh")
544
+ z.literal("xhigh"),
545
+ z.literal("max")
545
546
  ]).optional(),
546
547
  reasoningDefault: z.union([
547
548
  z.literal("off"),
@@ -549,7 +550,8 @@ const AgentEntrySchema = z.object({
549
550
  z.literal("low"),
550
551
  z.literal("medium"),
551
552
  z.literal("high"),
552
- z.literal("xhigh")
553
+ z.literal("xhigh"),
554
+ z.literal("max")
553
555
  ]).optional(),
554
556
  fastModeDefault: z.boolean().optional(),
555
557
  skills: z.array(z.string()).optional(),
@@ -110,7 +110,8 @@ const ModelCapabilitySchema = z.object({
110
110
  z.literal("low"),
111
111
  z.literal("medium"),
112
112
  z.literal("high"),
113
- z.literal("xhigh")
113
+ z.literal("xhigh"),
114
+ z.literal("max")
114
115
  ])).optional(),
115
116
  defaultThinkingLevel: z.union([
116
117
  z.literal("off"),
@@ -118,7 +119,8 @@ const ModelCapabilitySchema = z.object({
118
119
  z.literal("low"),
119
120
  z.literal("medium"),
120
121
  z.literal("high"),
121
- z.literal("xhigh")
122
+ z.literal("xhigh"),
123
+ z.literal("max")
122
124
  ]).optional(),
123
125
  thinkingMode: z.union([
124
126
  z.literal("openai-reasoning-effort"),