@fased/fased 0.1.55 → 0.1.56

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 (453) hide show
  1. package/config/capability-catalog.json +12 -0
  2. package/dist/acp/client.js +2 -2
  3. package/dist/acp/secret-file.js +2 -2
  4. package/dist/agents/agent-scope.js +2 -2
  5. package/dist/agents/apply-patch.js +8 -8
  6. package/dist/agents/auth-profiles/paths.js +2 -2
  7. package/dist/agents/auth-profiles/store.js +2 -2
  8. package/dist/agents/authenticated-model-catalog.js +3 -2
  9. package/dist/agents/bash-tools.exec-host-node.js +1 -1
  10. package/dist/agents/bash-tools.exec.js +1 -1
  11. package/dist/agents/bash-tools.shared.js +2 -2
  12. package/dist/agents/cli-credentials.js +4 -4
  13. package/dist/agents/copilot-dynamic-headers.js +37 -0
  14. package/dist/agents/current-model-catalog.js +6 -3
  15. package/dist/agents/docs-path.js +3 -3
  16. package/dist/agents/embedded-pi-mcp.js +4 -4
  17. package/dist/agents/identity-avatar.js +3 -3
  18. package/dist/agents/identity-file.js +2 -2
  19. package/dist/agents/model-catalog-source.js +2 -2
  20. package/dist/agents/model-catalog.js +1 -1
  21. package/dist/agents/model-metadata.js +34 -6
  22. package/dist/agents/openai-codex-app-server.js +499 -0
  23. package/dist/agents/pi-embedded-runner/compact.js +3 -3
  24. package/dist/agents/pi-embedded-runner/extra-params.js +159 -95
  25. package/dist/agents/pi-embedded-runner/model.js +62 -1
  26. package/dist/agents/pi-embedded-runner/moonshot-stream-wrappers.js +46 -0
  27. package/dist/agents/pi-embedded-runner/openai-stream-wrappers.js +221 -0
  28. package/dist/agents/pi-embedded-runner/run/attempt.js +6 -4
  29. package/dist/agents/pi-embedded-runner/run.js +5 -2
  30. package/dist/agents/pi-embedded-runner/utils.js +1 -1
  31. package/dist/agents/pi-embedded-runner.js +1 -1
  32. package/dist/agents/pi-embedded-subscribe.raw-stream.js +3 -3
  33. package/dist/agents/pi-extensions/compaction-safeguard.js +3 -3
  34. package/dist/agents/pi-model-discovery.js +6 -6
  35. package/dist/agents/pi-project-settings.js +3 -3
  36. package/dist/agents/pi-tools.js +2 -2
  37. package/dist/agents/sandbox/fs-bridge.js +2 -2
  38. package/dist/agents/session-dirs.js +4 -4
  39. package/dist/agents/session-write-lock.js +13 -13
  40. package/dist/agents/shell-utils.js +5 -5
  41. package/dist/agents/skills/bundled-dir.js +4 -4
  42. package/dist/agents/skills/local-loader.js +6 -6
  43. package/dist/agents/skills/plugin-skills.js +2 -2
  44. package/dist/agents/skills/workspace.js +13 -13
  45. package/dist/agents/skills-install-download.js +7 -7
  46. package/dist/agents/skills-install-plan.js +2 -2
  47. package/dist/agents/skills-install.js +2 -2
  48. package/dist/agents/skills-status.js +2 -2
  49. package/dist/agents/subagent-depth.js +2 -2
  50. package/dist/agents/system-prompt-params.js +2 -2
  51. package/dist/agents/tools/discord-actions-messaging.js +1 -1
  52. package/dist/agents/tools/message-tool.js +1 -1
  53. package/dist/agents/tools/session-status-tool.js +3 -3
  54. package/dist/agents/tools/slack-actions.js +1 -1
  55. package/dist/agents/tools/tts-tool.js +1 -1
  56. package/dist/agents/workspace.js +22 -22
  57. package/dist/auto-reply/reply/agent-runner-execution.js +2 -2
  58. package/dist/auto-reply/reply/agent-runner.js +2 -2
  59. package/dist/auto-reply/reply/commands-export-session.js +7 -7
  60. package/dist/auto-reply/reply/commands-models.js +1 -1
  61. package/dist/auto-reply/reply/directive-handling.impl.js +4 -1
  62. package/dist/auto-reply/reply/dispatch-acp.js +1 -1
  63. package/dist/auto-reply/reply/dispatch-from-config.js +1 -1
  64. package/dist/auto-reply/reply/get-reply-run.js +20 -2
  65. package/dist/auto-reply/reply/model-selection.js +1 -1
  66. package/dist/auto-reply/reply/post-compaction-audit.js +3 -3
  67. package/dist/auto-reply/reply/post-compaction-context.js +3 -3
  68. package/dist/auto-reply/reply/session-reset-model.js +1 -1
  69. package/dist/auto-reply/reply/session.js +3 -3
  70. package/dist/auto-reply/skill-commands.js +3 -3
  71. package/dist/auto-reply/status.js +7 -7
  72. package/dist/auto-reply/thinking.js +1 -1
  73. package/dist/brand.js +1 -1
  74. package/dist/browser/cdp.helpers.js +2 -2
  75. package/dist/browser/chrome.executables.js +3 -3
  76. package/dist/browser/chrome.js +5 -5
  77. package/dist/browser/chrome.profile-decoration.js +6 -6
  78. package/dist/browser/extension-relay.js +7 -7
  79. package/dist/browser/profiles-service.js +2 -2
  80. package/dist/browser/server-context.js +2 -2
  81. package/dist/browser/trash.js +4 -4
  82. package/dist/build-info.json +3 -3
  83. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  84. package/dist/canvas-host/server.js +4 -4
  85. package/dist/capabilities/catalog.js +3 -3
  86. package/dist/channels/plugins/catalog.js +3 -3
  87. package/dist/cli/browser-cli-extension.js +6 -6
  88. package/dist/cli/command-format.js +2 -2
  89. package/dist/cli/cron-cli/register.cron-add.js +1 -1
  90. package/dist/cli/cron-cli/register.cron-simple.js +2 -2
  91. package/dist/cli/dns-cli.js +9 -9
  92. package/dist/cli/gateway-cli/dev.js +5 -5
  93. package/dist/cli/gateway-cli/run.js +2 -2
  94. package/dist/cli/hooks-cli.js +5 -5
  95. package/dist/cli/lightweight/gateway-runtime-probe.js +2 -2
  96. package/dist/cli/memory-cli.js +7 -7
  97. package/dist/cli/nodes-media-utils.js +2 -2
  98. package/dist/cli/plugins-cli.js +2 -2
  99. package/dist/cli/program/register.agent.js +1 -1
  100. package/dist/cli/secrets-cli.js +3 -3
  101. package/dist/cli/windows-argv.js +2 -2
  102. package/dist/commands/agent.js +22 -3
  103. package/dist/commands/dashboard-link.js +3 -3
  104. package/dist/commands/doctor-config-flow.js +1 -1
  105. package/dist/commands/doctor-install.js +5 -5
  106. package/dist/commands/doctor-memory-search.js +2 -2
  107. package/dist/commands/doctor-platform-notes.js +2 -2
  108. package/dist/commands/doctor-sandbox.js +2 -2
  109. package/dist/commands/doctor-state-integrity.js +23 -23
  110. package/dist/commands/doctor-workspace.js +3 -3
  111. package/dist/commands/doctor.js +3 -3
  112. package/dist/commands/hosted-dashboard-probe.js +3 -3
  113. package/dist/commands/managed-up.js +2 -2
  114. package/dist/commands/model-picker.js +4 -3
  115. package/dist/commands/models/list.probe.js +1 -1
  116. package/dist/commands/models/list.registry.js +3 -2
  117. package/dist/commands/models/list.status-command.js +2 -2
  118. package/dist/commands/onboard-auth.credentials.js +3 -3
  119. package/dist/commands/onboarding/plugin-install.js +2 -2
  120. package/dist/commands/openai-codex-model-default.js +3 -2
  121. package/dist/commands/sessions-cleanup.js +2 -2
  122. package/dist/commands/signal-install.js +6 -6
  123. package/dist/commands/status-all/channels.js +2 -2
  124. package/dist/commands/wallet.js +47 -47
  125. package/dist/config/cache-utils.js +2 -2
  126. package/dist/config/includes.js +5 -5
  127. package/dist/config/io.js +2 -2
  128. package/dist/config/paths.js +3 -3
  129. package/dist/config/sat-runtime-ids.js +3 -3
  130. package/dist/config/sessions/disk-budget.js +6 -6
  131. package/dist/config/sessions/paths.js +2 -2
  132. package/dist/config/sessions/store.js +17 -17
  133. package/dist/config/sessions/transcript.js +4 -4
  134. package/dist/config/talk.js +2 -2
  135. package/dist/config/zod-schema.agent-defaults.js +4 -2
  136. package/dist/config/zod-schema.agent-runtime.js +4 -2
  137. package/dist/config/zod-schema.core.js +4 -2
  138. package/dist/control-ui/assets/{app-D2RaTXoV.js → app-D7TXyNRi.js} +390 -383
  139. package/dist/control-ui/assets/chat-model-ref-Djkv93yn.js +2 -0
  140. package/dist/control-ui/assets/{index-D2nC6I-9.js → index-BmSBom-w.js} +3 -3
  141. package/dist/control-ui/assets/{providers-CyjiG5Jw.js → providers-Cc89iMdx.js} +3 -3
  142. package/dist/control-ui/index.html +1 -1
  143. package/dist/control-ui/version.json +1 -1
  144. package/dist/cron/isolated-agent/run.js +6 -2
  145. package/dist/cron/service/jobs.js +11 -1
  146. package/dist/cron/service/store.js +2 -2
  147. package/dist/cron/store.js +6 -6
  148. package/dist/daemon/systemd-system.js +5 -5
  149. package/dist/discord/monitor/gateway-plugin.js +2 -2
  150. package/dist/discord/monitor/thread-bindings.state.js +2 -2
  151. package/dist/discord/voice/manager.js +1 -1
  152. package/dist/extensions/sat-mining/src/sat-bond-layout.js +9 -9
  153. package/dist/gateway/client.js +4 -4
  154. package/dist/gateway/control-ui-boot-check.js +6 -6
  155. package/dist/gateway/control-ui-login.js +7 -7
  156. package/dist/gateway/control-ui.js +9 -9
  157. package/dist/gateway/hooks-mapping.js +4 -4
  158. package/dist/gateway/protocol/schema/agents-models-skills.js +63 -4
  159. package/dist/gateway/server-discovery.js +2 -2
  160. package/dist/gateway/server-http.js +4 -4
  161. package/dist/gateway/server-methods/chat.js +3 -3
  162. package/dist/gateway/server-methods/models.js +4 -3
  163. package/dist/gateway/server-methods/sessions.js +8 -8
  164. package/dist/gateway/server-methods/tts.js +2 -2
  165. package/dist/gateway/server-methods/usage.js +2 -2
  166. package/dist/gateway/server-model-catalog.js +1 -1
  167. package/dist/gateway/server.impl.js +3 -3
  168. package/dist/gateway/session-compaction-checkpoints.js +4 -4
  169. package/dist/gateway/session-utils.fs.js +24 -24
  170. package/dist/gateway/session-utils.js +6 -6
  171. package/dist/gateway/sessions-patch.js +27 -24
  172. package/dist/hooks/bundled-dir.js +4 -4
  173. package/dist/hooks/gmail-setup-utils.js +6 -6
  174. package/dist/hooks/import-url.js +2 -2
  175. package/dist/hooks/loader.js +4 -4
  176. package/dist/hooks/workspace.js +7 -7
  177. package/dist/infra/archive.js +17 -17
  178. package/dist/infra/boundary-file-read.js +2 -2
  179. package/dist/infra/boundary-path.js +15 -15
  180. package/dist/infra/brew.js +2 -2
  181. package/dist/infra/control-ui-assets.js +14 -14
  182. package/dist/infra/device-auth-store.js +8 -8
  183. package/dist/infra/device-identity.js +8 -8
  184. package/dist/infra/dotenv.js +2 -2
  185. package/dist/infra/exec-approvals.js +8 -8
  186. package/dist/infra/exec-command-resolution.js +4 -4
  187. package/dist/infra/exec-safe-bin-trust.js +2 -2
  188. package/dist/infra/fased-root.js +5 -5
  189. package/dist/infra/fs-safe.js +14 -14
  190. package/dist/infra/gateway-lock.js +11 -11
  191. package/dist/infra/git-commit.js +5 -5
  192. package/dist/infra/git-root.js +4 -4
  193. package/dist/infra/hosted-runtime-artifact.js +3 -3
  194. package/dist/infra/is-main.js +2 -2
  195. package/dist/infra/json-file.js +7 -7
  196. package/dist/infra/outbound/delivery-queue.js +16 -16
  197. package/dist/infra/path-env.js +3 -3
  198. package/dist/infra/ports-lsof.js +4 -4
  199. package/dist/infra/provider-usage.auth.js +3 -3
  200. package/dist/infra/safe-open-sync.js +2 -2
  201. package/dist/infra/session-cost-usage.js +9 -9
  202. package/dist/infra/shell-env.js +2 -2
  203. package/dist/infra/state-migrations.fs.js +6 -6
  204. package/dist/infra/state-migrations.js +23 -23
  205. package/dist/infra/tmp-fased-dir.js +6 -6
  206. package/dist/infra/widearea-dns.js +3 -3
  207. package/dist/infra/wsl.js +2 -2
  208. package/dist/light-update-status.js +11 -11
  209. package/dist/line/accounts.js +2 -2
  210. package/dist/line/download.js +2 -2
  211. package/dist/logging/config.js +3 -3
  212. package/dist/logging/logger.js +7 -7
  213. package/dist/managed/federation.js +3 -3
  214. package/dist/managed/tunnel.js +3 -3
  215. package/dist/media/store.js +13 -13
  216. package/dist/media-understanding/runner.js +3 -3
  217. package/dist/memory/embeddings.js +2 -2
  218. package/dist/memory/internal.js +10 -10
  219. package/dist/memory/manager-sync-ops.js +7 -7
  220. package/dist/memory/repair-executor.js +17 -17
  221. package/dist/node-host/invoke-system-run-plan.js +8 -8
  222. package/dist/node-host/invoke.js +2 -2
  223. package/dist/node-host/runner.js +3 -3
  224. package/dist/pairing/pairing-store.js +3 -3
  225. package/dist/plugin-sdk/{accounts-CeRNo5Ae.js → accounts-DzWlKv1U.js} +1 -1
  226. package/dist/plugin-sdk/{actions-OMRHtXPj.js → actions-BplQVLL6.js} +4 -4
  227. package/dist/plugin-sdk/{active-listener-BlIkS3iR.js → active-listener-x4MLhYUw.js} +1 -1
  228. package/dist/plugin-sdk/{allow-list-BYeKk0Sy.js → allow-list-DyAxs4yw.js} +1 -1
  229. package/dist/plugin-sdk/{audio-preflight-B2n3a2Tj.js → audio-preflight-G8h3Sn8_.js} +43 -47
  230. package/dist/plugin-sdk/{audit-Ppg6dR_b.js → audit-CWknklvI.js} +1 -1
  231. package/dist/plugin-sdk/{channel-access-af8dWWRv.js → channel-access-a9Dnfw7-.js} +1 -1
  232. package/dist/plugin-sdk/{channel-access-configure-B6IAGlE0.js → channel-access-configure-CD4QDN5E.js} +1 -1
  233. package/dist/plugin-sdk/{channel-adapters.discord-IOZP8Cv5.js → channel-adapters.discord-BS4S4Svh.js} +1 -1
  234. package/dist/plugin-sdk/channel-plugin-common.d.ts +3 -3
  235. package/dist/plugin-sdk/channel-plugin-common.js +4 -4
  236. package/dist/plugin-sdk/{chunk-CD76Byie.js → chunk-B8EZkwiT.js} +1 -1
  237. package/dist/plugin-sdk/{chunk-items-Bu19zrYH.js → chunk-items-CEPklxGe.js} +1 -1
  238. package/dist/plugin-sdk/command-status.d.ts +2 -2
  239. package/dist/plugin-sdk/command-status.js +43 -47
  240. package/dist/plugin-sdk/{commands-registry-DgS55tNj.js → commands-registry-BfEa4tFA.js} +2 -2
  241. package/dist/plugin-sdk/{common-CWvfeiX0.js → common-CbfckC19.js} +1 -1
  242. package/dist/plugin-sdk/{config-CYDETqcF.js → config-Bt5GhnA-.js} +29 -15
  243. package/dist/plugin-sdk/{config-schema-CQ4EVcQG.js → config-schema-B9DKr6J5.js} +95877 -81287
  244. package/dist/plugin-sdk/device-pair.d.ts +1 -1
  245. package/dist/plugin-sdk/device-pair.js +2 -3
  246. package/dist/plugin-sdk/{diagnostic-Dfn1iERm.js → diagnostic-DLL_zekv.js} +3 -3
  247. package/dist/plugin-sdk/{directory-live-DatqU-eS.js → directory-live-CSuYxdwk.js} +1 -1
  248. package/dist/plugin-sdk/{directory-live-ClwN5KKq.js → directory-live-Dw7ZgC9_.js} +1 -1
  249. package/dist/plugin-sdk/discord.d.ts +5 -5
  250. package/dist/plugin-sdk/discord.js +31 -32
  251. package/dist/plugin-sdk/{draft-stream-controls-D4Tb_iS_.js → draft-stream-controls-BqchW1vi.js} +1 -1
  252. package/dist/plugin-sdk/{fetch-guard-BuYrl6q2.js → fetch-guard-CeG6u6ld.js} +1 -1
  253. package/dist/plugin-sdk/{filesystem-manager-B9DDPgfU.js → filesystem-manager-BGGGrkiN.js} +2 -2
  254. package/dist/plugin-sdk/{fs-safe-BG-VzVkL.js → fs-safe-xBqok6yR.js} +1 -1
  255. package/dist/plugin-sdk/{group-mentions-BxDgHCgj.d.ts → group-mentions-BHRff6j8.d.ts} +1 -1
  256. package/dist/plugin-sdk/{guilds-BeT3iHHJ.js → guilds-CDhRIX57.js} +1 -1
  257. package/dist/plugin-sdk/{handle-action-B75UVKxF.js → handle-action-DbzZFYnG.js} +24 -25
  258. package/dist/plugin-sdk/{helpers-BuEwju6y.js → helpers-CluGKuIV.js} +1 -1
  259. package/dist/plugin-sdk/{image-ops-C66HPeAZ.js → image-ops-CUaLtIFj.js} +1 -1
  260. package/dist/plugin-sdk/index.d.ts +7 -7
  261. package/dist/plugin-sdk/index.js +47 -51
  262. package/dist/plugin-sdk/json-store.js +6 -6
  263. package/dist/plugin-sdk/{login-Amr2DpKU.js → login-DJuHYDiK.js} +3 -3
  264. package/dist/plugin-sdk/{login-qr-DMQNEi9m.js → login-qr-CbHL5ayf.js} +3 -3
  265. package/dist/plugin-sdk/{manager-Bvpq49BI.js → manager-oHAvZCT3.js} +7 -7
  266. package/dist/plugin-sdk/{markdown-tables-DmQ7oXOm.js → markdown-tables-Mkx7k92Y.js} +1 -1
  267. package/dist/plugin-sdk/{media-ByLQbEwJ.js → media-CA8sTmVE.js} +4 -4
  268. package/dist/plugin-sdk/{monitor-K_u6daGa.js → monitor-CZrN9pev.js} +51 -55
  269. package/dist/plugin-sdk/{monitor-S_7LrvSj.js → monitor-CmwGqNyV.js} +61 -65
  270. package/dist/plugin-sdk/{openresponses-http-BrDJUZXR.js → openresponses-http-CWOd4war.js} +43 -47
  271. package/dist/plugin-sdk/{optional-runtime-dependency-CbYjAC2b.js → optional-runtime-dependency-DKmk9PZa.js} +1 -1
  272. package/dist/plugin-sdk/{outbound-BuDafBBI.js → outbound-0oN9IfNw.js} +9 -9
  273. package/dist/plugin-sdk/{outbound-attachment-DmZmUqFP.js → outbound-attachment-DdVkqUzE.js} +2 -2
  274. package/dist/plugin-sdk/{pairing-message-D0-UWGFJ.d.ts → pairing-message-BMkkS038.d.ts} +2 -2
  275. package/dist/plugin-sdk/{pairing-message-e4D4eBDA.js → pairing-message-ClqhfCUk.js} +1 -1
  276. package/dist/plugin-sdk/{pairing-store-T3IGoGZg.js → pairing-store-B01mCSct.js} +2 -2
  277. package/dist/plugin-sdk/{pi-model-discovery-DvAG_Png.js → pi-model-discovery-Buz0JC1Y.js} +1 -1
  278. package/dist/plugin-sdk/{pi-model-discovery-runtime-NjkUgjIf.js → pi-model-discovery-runtime-DuwuoteY.js} +2 -2
  279. package/dist/plugin-sdk/{probe-Cyb-DGA3.js → probe--7xtfzMm.js} +3 -3
  280. package/dist/plugin-sdk/{probe-Dlk0Jxpw.js → probe-BFroeK3g.js} +1 -1
  281. package/dist/plugin-sdk/{probe-D8JAILir.js → probe-l_whvGLY.js} +1 -1
  282. package/dist/plugin-sdk/{resolve-channels-zEnvugag.js → probe-xY3Ky0Tx.js} +3 -4
  283. package/dist/plugin-sdk/provider-web-search-config-contract.d.ts +2 -2
  284. package/dist/plugin-sdk/{pw-ai-D7eW43DL.js → pw-ai-B0domrii.js} +6 -8
  285. package/dist/plugin-sdk/{qmd-manager-DCUE21Kj.js → qmd-manager-CFFeM4Fl.js} +3 -3
  286. package/dist/plugin-sdk/{query-expansion-Zr9qQixm.js → query-expansion-CAI2kKLQ.js} +1 -1
  287. package/dist/plugin-sdk/{replies-BMIPmEoP.js → replies-1macZ1mZ.js} +4 -4
  288. package/dist/plugin-sdk/{resolve-channels-ChWKWtA9.js → resolve-channels-87LZrFk_.js} +2 -2
  289. package/dist/plugin-sdk/resolve-channels-CwB2_019.js +4 -0
  290. package/dist/plugin-sdk/{resolve-outbound-target-CXCqUUPV.js → resolve-outbound-target-BdH6LUoW.js} +2 -2
  291. package/dist/plugin-sdk/{resolve-route-DJN-SUSt.js → resolve-route-CkNIKKEW.js} +1 -1
  292. package/dist/plugin-sdk/{resolve-users-BTvjQuui.js → resolve-users-Cxb5wpAQ.js} +1 -1
  293. package/dist/plugin-sdk/{resolve-users-CTzoruIZ.js → resolve-users-V6dHh_2B.js} +2 -2
  294. package/dist/plugin-sdk/{retry-policy-CY1qY6d7.js → retry-policy-9ybIh4Fq.js} +1 -1
  295. package/dist/plugin-sdk/{runtime-CgOkQe0w.js → runtime-Dy420wBu.js} +3 -3
  296. package/dist/plugin-sdk/{runtime-dependency-DvdRNMvs.js → runtime-dependency-CIw9t7-k.js} +123 -15
  297. package/dist/plugin-sdk/{sandbox-paths-lj7_EVuA.js → sandbox-paths-w64tYl0v.js} +1 -1
  298. package/dist/plugin-sdk/sat-runtime.d.ts +3 -3
  299. package/dist/plugin-sdk/sat-runtime.js +44 -10
  300. package/dist/plugin-sdk/{send-BAz22RZr.js → send-2VcOMTN5.js} +9 -9
  301. package/dist/plugin-sdk/{send-2ITqny2W.js → send-BQUtCJFW.js} +10 -10
  302. package/dist/plugin-sdk/{send-Cr-dj6S-.js → send-DPJIIYAs.js} +6 -6
  303. package/dist/plugin-sdk/{send-BG3RWyil.js → send-Dqes9tdU.js} +13 -13
  304. package/dist/plugin-sdk/{send-eTxqFFsw.js → send-J4JWKP62.js} +8 -8
  305. package/dist/plugin-sdk/{session-C8nJmmVE.js → session-C_n2S5ub.js} +3 -3
  306. package/dist/plugin-sdk/{skill-commands-Rm5by9S8.js → skill-commands-B7wx9ax8.js} +102 -102
  307. package/dist/plugin-sdk/{slack-xvIVvyEM.js → slack-BouRQG-W.js} +64 -68
  308. package/dist/plugin-sdk/{slack-actions-BNIALJTA.js → slack-actions-CasHVtiq.js} +20 -21
  309. package/dist/plugin-sdk/slack.d.ts +5 -5
  310. package/dist/plugin-sdk/slack.js +13 -13
  311. package/dist/plugin-sdk/{ssrf-BZG8Ztod.js → ssrf-fG4UHKBw.js} +180 -2
  312. package/dist/plugin-sdk/{sticker-cache-D3oDiu2u.js → sticker-cache-BvGEUas3.js} +3 -3
  313. package/dist/plugin-sdk/{tables-DS5L7lCA.js → tables-CjlQJV4r.js} +2 -2
  314. package/dist/plugin-sdk/{device-pairing-D2Yq-_U6.js → tailscale-status-DwpNdO3Z.js} +104 -2
  315. package/dist/plugin-sdk/{targets-D6lUomJc.js → targets-QfP164Dh.js} +2 -2
  316. package/dist/plugin-sdk/{telegram-actions-MSFkDn0m.js → telegram-actions-CwYjV6Db.js} +48 -52
  317. package/dist/plugin-sdk/telegram.d.ts +5 -5
  318. package/dist/plugin-sdk/telegram.js +11 -11
  319. package/dist/plugin-sdk/{thread-bindings.lifecycle-Ry6Vcgw3.js → thread-bindings.lifecycle-DU4iX_Jr.js} +3 -3
  320. package/dist/plugin-sdk/{thread-bindings.state-C0stmvNk.js → thread-bindings.state-BgYWFjNF.js} +2 -2
  321. package/dist/plugin-sdk/{tmp-fased-dir-D91GExk4.d.ts → tmp-fased-dir-BdFQvrvw.d.ts} +2 -2
  322. package/dist/plugin-sdk/{types-DVTIpopt.d.ts → types-BYDL6dQj.d.ts} +2 -2
  323. package/dist/plugin-sdk/{types-DKvBJHfH.d.ts → types-CLIvQaVg.d.ts} +26 -1
  324. package/dist/plugin-sdk/{types-BzadOItY.d.ts → types-DyhXnYUr.d.ts} +1 -1
  325. package/dist/plugin-sdk/{types.plugin-BiHPaDTF.d.ts → types.plugin-_fbu40Re.d.ts} +7 -5
  326. package/dist/plugin-sdk/{web-DRNJxHXA.js → web-D0yENDve.js} +52 -56
  327. package/dist/plugin-sdk/{whatsapp-actions-BDXZF2R5.js → whatsapp-actions-BT2nPLyo.js} +18 -19
  328. package/dist/plugin-sdk/{whatsapp-heartbeat-CKgmwCGr.js → whatsapp-heartbeat-CiABSZ6G.js} +2 -2
  329. package/dist/plugin-sdk/whatsapp.d.ts +5 -5
  330. package/dist/plugin-sdk/whatsapp.js +14 -14
  331. package/dist/plugin-sdk/{wsl-Biw7Mj39.js → wsl-B_ojyEtC.js} +53 -53
  332. package/dist/plugins/bundled-dir.js +3 -3
  333. package/dist/plugins/discovery.js +11 -11
  334. package/dist/plugins/loader.js +13 -13
  335. package/dist/plugins/manifest-registry.js +2 -2
  336. package/dist/plugins/manifest.js +4 -4
  337. package/dist/plugins/path-safety.js +3 -3
  338. package/dist/plugins/runtime/index.js +1 -1
  339. package/dist/plugins/status-cache.js +9 -9
  340. package/dist/plugins/update.js +3 -3
  341. package/dist/plugins/web-search-install-catalog.js +3 -3
  342. package/dist/providers/github-copilot-model-discovery.js +51 -0
  343. package/dist/providers/openai-codex-model-discovery.js +166 -0
  344. package/dist/providers/refresh.js +116 -34
  345. package/dist/providers/registry.js +2 -2
  346. package/dist/providers/runtime-model-catalog.js +97 -28
  347. package/dist/secrets/apply.js +16 -16
  348. package/dist/secrets/audit.js +11 -11
  349. package/dist/secrets/shared.js +9 -9
  350. package/dist/security/scan-paths.js +2 -2
  351. package/dist/shared/config-eval.js +2 -2
  352. package/dist/shared/model-thinking.js +13 -2
  353. package/dist/shared/pid-alive.js +2 -2
  354. package/dist/tasks/standing-orders.js +5 -5
  355. package/dist/tasks/task-flow-registry.js +5 -5
  356. package/dist/tasks/task-registry.js +5 -5
  357. package/dist/tasks/workflow-definitions.js +6 -6
  358. package/dist/telegram/bot-message-context.js +1 -1
  359. package/dist/telegram/token.js +5 -5
  360. package/dist/utils.js +5 -5
  361. package/dist/wallet/local-socket-signer-broker.js +16 -16
  362. package/dist/wallet/providers/embedded-keystore-adapter.js +5 -5
  363. package/dist/wallet/providers/local-socket-signer-adapter.js +2 -2
  364. package/dist/wallet/wallet-approval-auth.js +5 -5
  365. package/dist/wallet/wallet-audit-log.js +5 -5
  366. package/dist/wallet/wallet-custody.js +21 -21
  367. package/dist/wallet/wallet-inbound-events.js +5 -5
  368. package/dist/wallet/wallet-observability.js +5 -5
  369. package/dist/wallet/wallet-policy.js +9 -9
  370. package/dist/wallet/wallet-provider-registry.js +7 -7
  371. package/dist/wallet/wallet-runtime-config.js +3 -3
  372. package/dist/wallet/wallet-secrets-store.js +22 -22
  373. package/dist/wallet/wallet-send-approvals.js +5 -5
  374. package/dist/wallet/wallet-settlement-links.js +5 -5
  375. package/dist/web/accounts.js +3 -3
  376. package/dist/web/auth-store.js +18 -18
  377. package/dist/web/session.js +4 -4
  378. package/dist/wizard/host-security-capability.js +2 -2
  379. package/dist/wizard/onboarding.host-security.js +7 -7
  380. package/dist/wizard/onboarding.js +7 -7
  381. package/dist/wizard/onboarding.wallet.js +44 -44
  382. package/extensions/acpx/package.json +1 -1
  383. package/extensions/bluebubbles/package.json +1 -1
  384. package/extensions/copilot-proxy/package.json +1 -1
  385. package/extensions/diagnostics-otel/package.json +1 -1
  386. package/extensions/fased-federation/package.json +1 -1
  387. package/extensions/google-gemini-cli-auth/package.json +1 -1
  388. package/extensions/imessage/package.json +1 -1
  389. package/extensions/irc/package.json +1 -1
  390. package/extensions/line/package.json +1 -1
  391. package/extensions/llm-task/package.json +1 -1
  392. package/extensions/lobster/package.json +1 -1
  393. package/extensions/matrix/CHANGELOG.md +6 -0
  394. package/extensions/matrix/package.json +1 -1
  395. package/extensions/mattermost/package.json +1 -1
  396. package/extensions/memory-core/package.json +2 -2
  397. package/extensions/memory-lancedb/package.json +1 -1
  398. package/extensions/minimax-portal-auth/package.json +1 -1
  399. package/extensions/msteams/CHANGELOG.md +6 -0
  400. package/extensions/msteams/package.json +1 -1
  401. package/extensions/nextcloud-talk/package.json +1 -1
  402. package/extensions/nostr/CHANGELOG.md +6 -0
  403. package/extensions/nostr/package.json +1 -1
  404. package/extensions/open-prose/package.json +1 -1
  405. package/extensions/sat-mining/package.json +1 -1
  406. package/extensions/signal/package.json +1 -1
  407. package/extensions/synology-chat/package.json +1 -1
  408. package/extensions/tlon/package.json +1 -1
  409. package/extensions/twitch/CHANGELOG.md +6 -0
  410. package/extensions/twitch/package.json +1 -1
  411. package/extensions/voice-call/CHANGELOG.md +6 -0
  412. package/extensions/voice-call/package.json +1 -1
  413. package/extensions/zalo/CHANGELOG.md +6 -0
  414. package/extensions/zalo/package.json +1 -1
  415. package/extensions/zalouser/CHANGELOG.md +6 -0
  416. package/extensions/zalouser/package.json +1 -1
  417. package/package.json +2 -1
  418. package/dist/control-ui/assets/chat-model-ref-BZFblCeY.js +0 -2
  419. package/dist/plugin-sdk/ip-C70a-YlD.js +0 -181
  420. package/dist/plugin-sdk/tailscale-status-ClsquRGs.js +0 -104
  421. package/dist/plugin-sdk/wallet-status-f0HagNeO.js +0 -11947
  422. package/dist/plugin-sdk/ws-CocpWGhl.js +0 -114
  423. /package/dist/plugin-sdk/{blocks-input-Dcitfh7h.js → blocks-input-Bg-8S2pl.js} +0 -0
  424. /package/dist/plugin-sdk/{channel-activity-Cg1xRoc2.js → channel-activity-DBDMQ3yI.js} +0 -0
  425. /package/dist/plugin-sdk/{channel-core-BOkyXXLa.js → channel-core-CFRs8LPy.js} +0 -0
  426. /package/dist/plugin-sdk/{client-D2N7hqVu.js → client-pI228AVT.js} +0 -0
  427. /package/dist/plugin-sdk/{command-poll-backoff-NAePk3eL.js → command-poll-backoff-yJU83wEq.js} +0 -0
  428. /package/dist/plugin-sdk/{date-time-CE3Uer3C.js → date-time-uUevHscU.js} +0 -0
  429. /package/dist/plugin-sdk/{diagnostic-session-state-HO94DMou.js → diagnostic-session-state-DqgfGYqZ.js} +0 -0
  430. /package/dist/plugin-sdk/{draft-stream-loop-CKyHn8IX.js → draft-stream-loop-CrOPfV3F.js} +0 -0
  431. /package/dist/plugin-sdk/{fetch-Cu-ahkie.js → fetch-BtmoPIlf.js} +0 -0
  432. /package/dist/plugin-sdk/{gateway-registry-DFsoY6C0.js → gateway-registry-DZDsqicG.js} +0 -0
  433. /package/dist/plugin-sdk/{inbound-context-BFnIdcqI.js → inbound-context-DrAcXE0y.js} +0 -0
  434. /package/dist/plugin-sdk/{internal-qo16nNU1.js → internal-CG_nHo-2.js} +0 -0
  435. /package/dist/plugin-sdk/{memory-search-C3C0bD2H.js → memory-search-VFll-AIb.js} +0 -0
  436. /package/dist/plugin-sdk/{pairing-token-N_6Jbt1L.js → pairing-token-Cs3BRKc0.js} +0 -0
  437. /package/dist/plugin-sdk/{path-alias-guards-Dg3gU-MA.js → path-alias-guards-BJZD5JMJ.js} +0 -0
  438. /package/dist/plugin-sdk/{polls-DQrR-qT3.js → polls-DKQXVfJp.js} +0 -0
  439. /package/dist/plugin-sdk/{proxy-7xs_rsnV.js → proxy-DWpYcsvR.js} +0 -0
  440. /package/dist/plugin-sdk/{qmd-scope-D1sSG_Rx.js → qmd-scope-CdX34VCV.js} +0 -0
  441. /package/dist/plugin-sdk/{redact-identifier-Q3tkvxhm.js → redact-identifier-Lt7t3l7S.js} +0 -0
  442. /package/dist/plugin-sdk/{redact-sensitive-url-dPvnFFsK.js → redact-sensitive-url-g-ukZjwA.js} +0 -0
  443. /package/dist/plugin-sdk/{render-Bwu_WxwA.js → render-e7fENCYH.js} +0 -0
  444. /package/dist/plugin-sdk/{reply-prefix-Bqzm6DC1.js → reply-prefix-ClpxvL_w.js} +0 -0
  445. /package/dist/plugin-sdk/{reply-reference-BkbK_DWT.js → reply-reference-Bqk-7HXE.js} +0 -0
  446. /package/dist/plugin-sdk/{secure-random-Bl-AVLVb.js → secure-random-BIkG-k4s.js} +0 -0
  447. /package/dist/plugin-sdk/{shared-clhhbWN3.js → shared-CBgp_GBw.js} +0 -0
  448. /package/dist/plugin-sdk/{target-errors-C_SVKoEv.js → target-errors-Ckufe179.js} +0 -0
  449. /package/dist/plugin-sdk/{targets-BDvvnlph.js → targets-CoMJ1ry1.js} +0 -0
  450. /package/dist/plugin-sdk/{tokens-BvtlOzVP.js → tokens-BbnqfVuu.js} +0 -0
  451. /package/dist/plugin-sdk/{tool-loop-detection-CWphm1k_.js → tool-loop-detection-Bp8bPJLs.js} +0 -0
  452. /package/dist/plugin-sdk/{ui-e020ouhJ.js → ui-Be8cLHIS.js} +0 -0
  453. /package/dist/plugin-sdk/{with-timeout-BYrRAYFV.js → with-timeout-ckWB8rTo.js} +0 -0
@@ -10,6 +10,7 @@ import { XIAOMI_MODEL_IDS } from "./xiaomi-models.js";
10
10
  import { LITELLM_BASE_URL } from "./litellm-models.js";
11
11
  import { ANTHROPIC_MODEL_IDS, ANTHROPIC_PROVIDER_BRAND_ID, ANTHROPIC_ROUTE_ID, BYTEPLUS_CODING_MODEL_IDS, BYTEPLUS_CODING_ROUTE_ID, BYTEPLUS_MODEL_IDS, BYTEPLUS_PLAN_ROUTE_ID, BYTEPLUS_PROVIDER_BRAND_ID, BYTEPLUS_ROUTE_ID, CHUTES_MODEL_IDS, CHUTES_PROVIDER_BRAND_ID, CHUTES_ROUTE_ID, COPILOT_PROVIDER_BRAND_ID, COPILOT_PROXY_MODEL_IDS, COPILOT_PROXY_ROUTE_ID, CUSTOM_PROVIDER_BRAND_ID, CUSTOM_PROVIDER_ROUTE_ID, GITHUB_COPILOT_ROUTE_ID, GOOGLE_API_ROUTE_ID, GOOGLE_GEMINI_CLI_ROUTE_ID, GOOGLE_GEMINI_MODEL_IDS, GOOGLE_PROVIDER_BRAND_ID, HUGGINGFACE_PROVIDER_BRAND_ID, HUGGINGFACE_ROUTE_ID, KIMI_CODING_MODEL_IDS, KIMI_CODING_ROUTE_ID, LITELLM_PROVIDER_BRAND_ID, LITELLM_ROUTE_ID, LMSTUDIO_PROVIDER_BRAND_ID, LMSTUDIO_ROUTE_ID, MINIMAX_API_ROUTE_ID, MINIMAX_CN_ROUTE_ID, MINIMAX_MODEL_IDS, MINIMAX_PORTAL_ROUTE_ID, MINIMAX_PROVIDER_BRAND_ID, MISTRAL_MODEL_IDS, MISTRAL_PROVIDER_BRAND_ID, MISTRAL_ROUTE_ID, MOONSHOT_MODEL_IDS, MOONSHOT_PROVIDER_BRAND_ID, MOONSHOT_ROUTE_ID, OLLAMA_PROVIDER_BRAND_ID, OLLAMA_ROUTE_ID, OPENAI_API_MODEL_IDS, OPENAI_API_ROUTE_ID, OPENAI_CODEX_ROUTE_ID, OPENAI_PROVIDER_BRAND_ID, OPENAI_SIGN_IN_MODEL_IDS, OPENCODE_ZEN_PROVIDER_BRAND_ID, OPENCODE_ZEN_ROUTE_ID, OPENROUTER_MODEL_IDS, OPENROUTER_PROVIDER_BRAND_ID, OPENROUTER_ROUTE_ID, QIANFAN_MODEL_IDS, QIANFAN_PROVIDER_BRAND_ID, QIANFAN_ROUTE_ID, QWEN_API_MODEL_IDS, QWEN_API_ROUTE_ID, QWEN_CODING_PLAN_MODEL_IDS, QWEN_CODING_PLAN_ROUTE_ID, QWEN_PROVIDER_BRAND_ID, SYNTHETIC_PROVIDER_BRAND_ID, SYNTHETIC_ROUTE_ID, TOGETHER_PROVIDER_BRAND_ID, TOGETHER_ROUTE_ID, VENICE_PROVIDER_BRAND_ID, VENICE_ROUTE_ID, VERCEL_AI_GATEWAY_PROVIDER_BRAND_ID, VERCEL_AI_GATEWAY_ROUTE_ID, VLLM_PROVIDER_BRAND_ID, VLLM_ROUTE_ID, VOLCENGINE_CODING_MODEL_IDS, VOLCENGINE_CODING_ROUTE_ID, VOLCENGINE_MODEL_IDS, VOLCENGINE_PLAN_ROUTE_ID, VOLCENGINE_PROVIDER_BRAND_ID, VOLCENGINE_ROUTE_ID, XAI_MODEL_IDS, XAI_PROVIDER_BRAND_ID, XAI_ROUTE_ID, XIAOMI_PROVIDER_BRAND_ID, XIAOMI_ROUTE_ID, ZAI_MODEL_IDS, ZAI_PROVIDER_BRAND_ID, ZAI_ROUTE_ID, listProviderBrandManifests, lookupProviderManifestModelCapability, resolveProviderRouteModelCapability } from "./registry.js";
12
12
  import { readFile } from "node:fs/promises";
13
+ import { AsyncLocalStorage } from "node:async_hooks";
13
14
 
14
15
  //#region src/providers/refresh.ts
15
16
  const OPENAI_DOCS_MODELS_URL = "https://developers.openai.com/api/docs/models/all";
@@ -46,6 +47,7 @@ const VLLM_DEFAULT_BASE_URL = "http://127.0.0.1:8000/v1";
46
47
  const OLLAMA_DEFAULT_BASE_URL = "http://127.0.0.1:11434";
47
48
  const LMSTUDIO_DEFAULT_BASE_URL = "http://127.0.0.1:1234/v1";
48
49
  const LITELLM_DEFAULT_BASE_URL = LITELLM_BASE_URL;
50
+ const providerCatalogView = new AsyncLocalStorage();
49
51
  function normalizeModelIds(values, options = {}) {
50
52
  const seen = new Set();
51
53
  const result = [];
@@ -107,15 +109,19 @@ function metadataString(metadata, key) {
107
109
  function setProviderRefreshEnvFromProfile(params) {
108
110
  const provider = params.profile.provider.trim();
109
111
  const apiKey = resolveApiKeyProfileValue(params.profile, params.env);
112
+ const token = resolveTokenProfileValue(params.profile, params.env);
110
113
  switch (provider) {
111
114
  case "openai":
112
115
  setProviderRefreshEnvValue(params.target, "OPENAI_API_KEY", apiKey);
113
116
  break;
114
117
  case "chutes":
115
- setProviderRefreshEnvValue(params.target, "CHUTES_API_KEY", apiKey);
118
+ setProviderRefreshEnvValue(params.target, "CHUTES_API_KEY", token);
116
119
  break;
117
120
  case "anthropic":
118
121
  setProviderRefreshEnvValue(params.target, "ANTHROPIC_API_KEY", apiKey);
122
+ if (params.profile.type !== "api_key") {
123
+ setProviderRefreshEnvValue(params.target, "ANTHROPIC_OAUTH_TOKEN", token);
124
+ }
119
125
  break;
120
126
  case "google":
121
127
  case "gemini":
@@ -129,7 +135,7 @@ function setProviderRefreshEnvFromProfile(params) {
129
135
  break;
130
136
  }
131
137
  case "xai":
132
- setProviderRefreshEnvValue(params.target, "XAI_API_KEY", apiKey);
138
+ setProviderRefreshEnvValue(params.target, "XAI_API_KEY", token);
133
139
  break;
134
140
  case "mistral":
135
141
  setProviderRefreshEnvValue(params.target, "MISTRAL_API_KEY", apiKey);
@@ -193,7 +199,7 @@ function setProviderRefreshEnvFromProfile(params) {
193
199
  setProviderRefreshEnvValue(params.target, "TOGETHER_API_KEY", apiKey);
194
200
  break;
195
201
  case "openrouter":
196
- setProviderRefreshEnvValue(params.target, "OPENROUTER_API_KEY", apiKey);
202
+ setProviderRefreshEnvValue(params.target, "OPENROUTER_API_KEY", token);
197
203
  break;
198
204
  case "vercel-ai-gateway":
199
205
  case "ai-gateway":
@@ -322,6 +328,7 @@ function normalizeProviderRefreshModelEntry(entry) {
322
328
  }
323
329
  return {
324
330
  id,
331
+ ...entry.name ? { name: entry.name } : {},
325
332
  ...entry.input ? { input: entry.input } : {},
326
333
  ...entry.reasoning !== undefined ? { reasoning: entry.reasoning } : {},
327
334
  ...entry.tools !== undefined ? { tools: entry.tools } : {},
@@ -335,6 +342,7 @@ function normalizeProviderRefreshModelEntry(entry) {
335
342
  ...entry.reasoningBudgetSupported !== undefined ? { reasoningBudgetSupported: entry.reasoningBudgetSupported } : {},
336
343
  ...typeof entry.contextWindow === "number" && entry.contextWindow > 0 ? { contextWindow: entry.contextWindow } : {},
337
344
  ...typeof entry.maxTokens === "number" && entry.maxTokens > 0 ? { maxTokens: entry.maxTokens } : {},
345
+ ...entry.price ? { price: entry.price } : {},
338
346
  ...entry.source ? { source: entry.source } : {}
339
347
  };
340
348
  }
@@ -788,6 +796,57 @@ function readPositiveNumber(value) {
788
796
  }
789
797
  return undefined;
790
798
  }
799
+ function readNonNegativeNumber(value) {
800
+ if (typeof value === "number" && Number.isFinite(value) && value >= 0) {
801
+ return value;
802
+ }
803
+ if (typeof value === "string") {
804
+ const parsed = Number(value);
805
+ return Number.isFinite(parsed) && parsed >= 0 ? parsed : undefined;
806
+ }
807
+ return undefined;
808
+ }
809
+ function readNonNegativeNumberFrom(record, keys) {
810
+ for (const key of keys) {
811
+ const value = readNonNegativeNumber(record[key]);
812
+ if (value !== undefined) {
813
+ return value;
814
+ }
815
+ }
816
+ return undefined;
817
+ }
818
+ function readModelPrice(record) {
819
+ const pricing = asRecord(record.pricing);
820
+ const perTokenInput = readNonNegativeNumberFrom(pricing, ["prompt", "input"]);
821
+ const perTokenOutput = readNonNegativeNumberFrom(pricing, ["completion", "output"]);
822
+ if (perTokenInput !== undefined || perTokenOutput !== undefined) {
823
+ return {
824
+ input: (perTokenInput ?? 0) * 1e6,
825
+ output: (perTokenOutput ?? 0) * 1e6,
826
+ cacheRead: (readNonNegativeNumberFrom(pricing, ["input_cache_read", "cache_read"]) ?? 0) * 1e6,
827
+ cacheWrite: (readNonNegativeNumberFrom(pricing, ["input_cache_write", "cache_write"]) ?? 0) * 1e6
828
+ };
829
+ }
830
+ const input = readNonNegativeNumberFrom(record, [
831
+ "input_price_per_million",
832
+ "inputPricePerMillion",
833
+ "prompt_price_per_million"
834
+ ]);
835
+ const output = readNonNegativeNumberFrom(record, [
836
+ "output_price_per_million",
837
+ "outputPricePerMillion",
838
+ "completion_price_per_million"
839
+ ]);
840
+ if (input === undefined && output === undefined) {
841
+ return undefined;
842
+ }
843
+ return {
844
+ input: input ?? 0,
845
+ output: output ?? 0,
846
+ cacheRead: readNonNegativeNumberFrom(record, ["cache_read_price_per_million", "cacheReadPerMillion"]) ?? 0,
847
+ cacheWrite: readNonNegativeNumberFrom(record, ["cache_write_price_per_million", "cacheWritePerMillion"]) ?? 0
848
+ };
849
+ }
791
850
  function asRecord(value) {
792
851
  return value && typeof value === "object" ? value : {};
793
852
  }
@@ -919,8 +978,10 @@ function parseOpenRouterModelSnapshotsFromModelsResponse(payload) {
919
978
  const speech = outputModalities.has("audio");
920
979
  const contextWindow = readPositiveNumber(record.context_length) ?? readPositiveNumber(record.context_window) ?? readPositiveNumber(record.contextWindow);
921
980
  const maxTokens = readPositiveNumber(topProvider.max_completion_tokens) ?? readPositiveNumber(record.max_tokens) ?? readPositiveNumber(record.maxTokens);
981
+ const price = readModelPrice(record);
922
982
  return [{
923
983
  id: entry.id,
984
+ ...readString(record.name) ? { name: readString(record.name) } : {},
924
985
  ...input.length > 0 ? { input } : {},
925
986
  ...reasoning ? { reasoning } : {},
926
987
  ...tools ? { tools } : {},
@@ -930,6 +991,7 @@ function parseOpenRouterModelSnapshotsFromModelsResponse(payload) {
930
991
  ...speech ? { speech } : {},
931
992
  ...contextWindow ? { contextWindow } : {},
932
993
  ...maxTokens ? { maxTokens } : {},
994
+ ...price ? { price } : {},
933
995
  source: "catalog"
934
996
  }];
935
997
  }
@@ -1009,8 +1071,11 @@ function parseGenericModelSnapshotsFromModelsResponse(payload) {
1009
1071
  "outputTokenLimit",
1010
1072
  "max_completion_tokens"
1011
1073
  ]);
1074
+ const price = readModelPrice(record);
1075
+ const displayName = readString(record.display_name) ?? readString(record.displayName) ?? (readString(record.id) || readString(record.key) || readString(record.model) ? readString(record.name) : undefined);
1012
1076
  return [{
1013
1077
  id: normalizeProviderModelId(id),
1078
+ ...displayName ? { name: displayName } : {},
1014
1079
  ...input ? { input } : {},
1015
1080
  ...reasoning !== undefined ? { reasoning } : {},
1016
1081
  ...tools !== undefined ? { tools } : {},
@@ -1024,6 +1089,7 @@ function parseGenericModelSnapshotsFromModelsResponse(payload) {
1024
1089
  ...thinking.reasoningBudgetSupported !== undefined ? { reasoningBudgetSupported: thinking.reasoningBudgetSupported } : {},
1025
1090
  ...contextWindow ? { contextWindow } : {},
1026
1091
  ...maxTokens ? { maxTokens } : {},
1092
+ ...price ? { price } : {},
1027
1093
  source: "catalog"
1028
1094
  }];
1029
1095
  });
@@ -1131,8 +1197,12 @@ function selectModelSnapshotsByIds(entries, selectedIds, route) {
1131
1197
  });
1132
1198
  }
1133
1199
  function selectManifestModelsForNormalUi(modelIds, preferred) {
1134
- const allowed = new Set(preferred.map((id) => id.toLowerCase()));
1135
- return sortWithPreferredOrder(normalizeModelIds(modelIds).filter((id) => allowed.has(id.toLowerCase())), preferred);
1200
+ const normalized = normalizeModelIds(modelIds);
1201
+ if (providerCatalogView.getStore() === "available") {
1202
+ return sortWithPreferredOrder(normalized, preferred);
1203
+ }
1204
+ const recommended = new Set(preferred.map((id) => id.toLowerCase()));
1205
+ return sortWithPreferredOrder(normalized.filter((id) => recommended.has(id.toLowerCase())), preferred);
1136
1206
  }
1137
1207
  function selectOpenAIApiModelsForNormalUi(modelIds) {
1138
1208
  return selectManifestModelsForNormalUi(modelIds, OPENAI_API_MODEL_IDS);
@@ -1219,12 +1289,10 @@ function selectOpencodeZenModelsForNormalUi(modelIds) {
1219
1289
  return selectManifestModelsForNormalUi(modelIds, OPENCODE_ZEN_MODEL_IDS);
1220
1290
  }
1221
1291
  function selectHuggingfaceModelsForNormalUi(modelIds) {
1222
- const allowed = new Set(HUGGINGFACE_MODEL_IDS);
1223
- return sortWithPreferredOrder(normalizeModelIds(modelIds).filter((id) => allowed.has(id)), HUGGINGFACE_MODEL_IDS);
1292
+ return selectManifestModelsForNormalUi(modelIds, HUGGINGFACE_MODEL_IDS);
1224
1293
  }
1225
1294
  function selectVeniceModelsForNormalUi(modelIds) {
1226
- const allowed = new Set(VENICE_MODEL_IDS);
1227
- return sortWithPreferredOrder(normalizeModelIds(modelIds).filter((id) => allowed.has(id)), VENICE_MODEL_IDS);
1295
+ return selectManifestModelsForNormalUi(modelIds, VENICE_MODEL_IDS);
1228
1296
  }
1229
1297
  function readEnv(env, names) {
1230
1298
  for (const name of names) {
@@ -1363,19 +1431,28 @@ async function fetchChutesProviderRefreshSnapshot(params = {}) {
1363
1431
  return { providers: { [CHUTES_PROVIDER_BRAND_ID]: { routes: { [CHUTES_ROUTE_ID]: selectModelSnapshotsByIds(models, selectChutesModelsForNormalUi(ids), CHUTES_ROUTE_ID) } } } };
1364
1432
  }
1365
1433
  async function fetchAnthropicProviderRefreshSnapshot(params = {}) {
1366
- const token = readEnv(params.env ?? process.env, ["ANTHROPIC_API_KEY"]);
1434
+ const env = params.env ?? process.env;
1435
+ const apiKey = readEnv(env, ["ANTHROPIC_API_KEY"]);
1436
+ const oauthToken = readEnv(env, ["ANTHROPIC_OAUTH_TOKEN"]);
1437
+ const token = apiKey ?? oauthToken;
1367
1438
  if (!token) {
1368
1439
  return missingProviderRoutes(ANTHROPIC_PROVIDER_BRAND_ID, { [ANTHROPIC_ROUTE_ID]: {
1369
1440
  reason: "credential-missing",
1370
- detail: "Set ANTHROPIC_API_KEY or configure an Anthropic API-key auth profile."
1441
+ detail: "Configure Anthropic sign-in, setup-token, or API-key credentials before model discovery."
1371
1442
  } });
1372
1443
  }
1373
1444
  const payload = await fetchJsonCatalog({
1374
1445
  fetch: params.fetch ?? fetch,
1375
1446
  url: ANTHROPIC_MODELS_URL,
1376
- headers: {
1377
- "x-api-key": token,
1447
+ headers: apiKey ? {
1448
+ "x-api-key": apiKey,
1378
1449
  "anthropic-version": "2023-06-01"
1450
+ } : {
1451
+ Authorization: `Bearer ${oauthToken}`,
1452
+ "anthropic-version": "2023-06-01",
1453
+ "anthropic-beta": "claude-code-20250219,oauth-2025-04-20",
1454
+ "user-agent": "fased-agent",
1455
+ "x-app": "cli"
1379
1456
  },
1380
1457
  label: "Anthropic"
1381
1458
  });
@@ -2042,28 +2119,33 @@ function providerRefreshFetcherForBrand(brandId) {
2042
2119
  default: return undefined;
2043
2120
  }
2044
2121
  }
2122
+ function listProviderRefreshContractGaps(manifests = listProviderBrandManifests()) {
2123
+ return manifests.flatMap((manifest) => providerRefreshFetcherForBrand(manifest.id) ? [] : [`${manifest.id}: no authenticated or operator catalog fetcher`]);
2124
+ }
2045
2125
  async function fetchProviderRefreshSnapshotForRoutes(params) {
2046
- const requestedRoutes = new Set([...params.routes].map((route) => route.trim().toLowerCase()).filter(Boolean));
2047
- const fetchers = new Set();
2048
- for (const manifest of listProviderBrandManifests()) {
2049
- const routes = new Set([
2050
- ...manifest.methods.map((method) => method.route.trim().toLowerCase()),
2051
- ...(manifest.modelProviderIds ?? []).map((route) => route.trim().toLowerCase()),
2052
- ...(manifest.routeAliases ?? []).map((route) => route.trim().toLowerCase())
2053
- ]);
2054
- if (![...routes].some((route) => requestedRoutes.has(route))) {
2055
- continue;
2056
- }
2057
- const fetcher = providerRefreshFetcherForBrand(manifest.id);
2058
- if (fetcher) {
2059
- fetchers.add(fetcher);
2126
+ return await providerCatalogView.run("available", async () => {
2127
+ const requestedRoutes = new Set([...params.routes].map((route) => route.trim().toLowerCase()).filter(Boolean));
2128
+ const fetchers = new Set();
2129
+ for (const manifest of listProviderBrandManifests()) {
2130
+ const routes = new Set([
2131
+ ...manifest.methods.map((method) => method.route.trim().toLowerCase()),
2132
+ ...(manifest.modelProviderIds ?? []).map((route) => route.trim().toLowerCase()),
2133
+ ...(manifest.routeAliases ?? []).map((route) => route.trim().toLowerCase())
2134
+ ]);
2135
+ if (![...routes].some((route) => requestedRoutes.has(route))) {
2136
+ continue;
2137
+ }
2138
+ const fetcher = providerRefreshFetcherForBrand(manifest.id);
2139
+ if (fetcher) {
2140
+ fetchers.add(fetcher);
2141
+ }
2060
2142
  }
2061
- }
2062
- const results = await Promise.allSettled([...fetchers].map((fetcher) => fetcher({
2063
- fetch: params.fetch,
2064
- env: params.env
2065
- })));
2066
- return mergeProviderRefreshSnapshots(results.flatMap((result) => result.status === "fulfilled" ? [result.value] : []));
2143
+ const results = await Promise.allSettled([...fetchers].map((fetcher) => fetcher({
2144
+ fetch: params.fetch,
2145
+ env: params.env
2146
+ })));
2147
+ return mergeProviderRefreshSnapshots(results.flatMap((result) => result.status === "fulfilled" ? [result.value] : []));
2148
+ });
2067
2149
  }
2068
2150
  function mergeProviderRefreshSnapshots(snapshots) {
2069
2151
  const providers = {};
@@ -2237,4 +2319,4 @@ async function fetchOfficialProviderRefreshSnapshot(params = {}) {
2237
2319
  }
2238
2320
 
2239
2321
  //#endregion
2240
- export { applyProviderRefreshToRegistrySource, buildProviderCapabilityOverridesSource, buildProviderRefreshEnvFromCredentials, buildProviderRefreshReport, buildProviderRegistryReviewPatch, fetchOfficialProviderRefreshSnapshot, fetchProviderRefreshSnapshotForRoutes, loadProviderRefreshSnapshotFromFile };
2322
+ export { applyProviderRefreshToRegistrySource, buildProviderCapabilityOverridesSource, buildProviderRefreshEnvFromCredentials, buildProviderRefreshReport, buildProviderRegistryReviewPatch, fetchOfficialProviderRefreshSnapshot, fetchProviderRefreshSnapshotForRoutes, loadProviderRefreshSnapshotFromFile, parseGenericModelSnapshotsFromModelsResponse };
@@ -763,7 +763,7 @@ const OPENAI_PROVIDER_MANIFEST = {
763
763
  id: "openai-codex",
764
764
  route: OPENAI_CODEX_ROUTE_ID,
765
765
  kind: "oauth",
766
- label: "Sign in",
766
+ label: "ChatGPT sign-in",
767
767
  hint: "Open the OpenAI sign-in URL, finish login in the browser, then Fased completes the OAuth flow."
768
768
  }, {
769
769
  id: "openai-api-key",
@@ -1601,4 +1601,4 @@ function isStandardProviderCatalogEntry(entry) {
1601
1601
  }
1602
1602
 
1603
1603
  //#endregion
1604
- export { ANTHROPIC_MODEL_IDS, ANTHROPIC_PROVIDER_BRAND_ID, ANTHROPIC_PROVIDER_MANIFEST, ANTHROPIC_ROUTE_ID, BYTEPLUS_CODING_MODEL_IDS, BYTEPLUS_CODING_MODEL_REFS, BYTEPLUS_CODING_ROUTE_ID, BYTEPLUS_MODEL_IDS, BYTEPLUS_MODEL_REFS, BYTEPLUS_PLAN_ROUTE_ID, BYTEPLUS_PROVIDER_BRAND_ID, BYTEPLUS_ROUTE_ID, CHUTES_MODEL_IDS, CHUTES_PROVIDER_BRAND_ID, CHUTES_ROUTE_ID, COPILOT_PROVIDER_BRAND_ID, COPILOT_PROXY_MODEL_IDS, COPILOT_PROXY_MODEL_REFS, COPILOT_PROXY_ROUTE_ID, CUSTOM_PROVIDER_BRAND_ID, CUSTOM_PROVIDER_ROUTE_ID, GITHUB_COPILOT_DEFAULT_MODEL_REF, GITHUB_COPILOT_MODEL_IDS, GITHUB_COPILOT_MODEL_REFS, GITHUB_COPILOT_ROUTE_ID, GOOGLE_API_MODEL_REFS, GOOGLE_API_ROUTE_ID, GOOGLE_GEMINI_CLI_MODEL_REFS, GOOGLE_GEMINI_CLI_ROUTE_ID, GOOGLE_GEMINI_MODEL_IDS, GOOGLE_PROVIDER_BRAND_ID, HUGGINGFACE_PROVIDER_BRAND_ID, HUGGINGFACE_ROUTE_ID, KIMI_CODING_MODEL_IDS, KIMI_CODING_ROUTE_ID, LITELLM_PROVIDER_BRAND_ID, LITELLM_ROUTE_ID, LMSTUDIO_PROVIDER_BRAND_ID, LMSTUDIO_ROUTE_ID, MINIMAX_API_ROUTE_ID, MINIMAX_CN_ROUTE_ID, MINIMAX_MODEL_IDS, MINIMAX_PORTAL_ROUTE_ID, MINIMAX_PROVIDER_BRAND_ID, MISTRAL_MODEL_IDS, MISTRAL_MODEL_REFS, MISTRAL_PROVIDER_BRAND_ID, MISTRAL_ROUTE_ID, MOONSHOT_MODEL_IDS, MOONSHOT_PROVIDER_BRAND_ID, MOONSHOT_ROUTE_ID, OLLAMA_PROVIDER_BRAND_ID, OLLAMA_ROUTE_ID, OPENAI_API_MODEL_IDS, OPENAI_API_MODEL_REFS, OPENAI_API_ROUTE_ID, OPENAI_CODEX_ROUTE_ID, OPENAI_PROVIDER_BRAND_ID, OPENAI_SIGN_IN_MODEL_IDS, OPENAI_SIGN_IN_MODEL_REFS, OPENCODE_ZEN_PROVIDER_BRAND_ID, OPENCODE_ZEN_ROUTE_ID, OPENROUTER_MODEL_IDS, OPENROUTER_MODEL_REFS, OPENROUTER_PROVIDER_BRAND_ID, OPENROUTER_ROUTE_ID, PROVIDER_BRAND_ORDER, QIANFAN_MODEL_IDS, QIANFAN_MODEL_REFS, QIANFAN_PROVIDER_BRAND_ID, QIANFAN_ROUTE_ID, QWEN_API_MODEL_IDS, QWEN_API_ROUTE_ID, QWEN_CODING_PLAN_MODEL_IDS, QWEN_CODING_PLAN_ROUTE_ID, QWEN_PROVIDER_BRAND_ID, SYNTHETIC_MODEL_REFS, SYNTHETIC_PROVIDER_BRAND_ID, SYNTHETIC_ROUTE_ID, TOGETHER_PROVIDER_BRAND_ID, TOGETHER_ROUTE_ID, VENICE_PROVIDER_BRAND_ID, VENICE_ROUTE_ID, VERCEL_AI_GATEWAY_PROVIDER_BRAND_ID, VERCEL_AI_GATEWAY_ROUTE_ID, VLLM_PROVIDER_BRAND_ID, VLLM_ROUTE_ID, VOLCENGINE_CODING_MODEL_IDS, VOLCENGINE_CODING_MODEL_REFS, VOLCENGINE_CODING_ROUTE_ID, VOLCENGINE_MODEL_IDS, VOLCENGINE_MODEL_REFS, VOLCENGINE_PLAN_ROUTE_ID, VOLCENGINE_PROVIDER_BRAND_ID, VOLCENGINE_ROUTE_ID, XAI_MODEL_IDS, XAI_MODEL_REFS, XAI_PROVIDER_BRAND_ID, XAI_ROUTE_ID, XIAOMI_MODEL_REFS, XIAOMI_PROVIDER_BRAND_ID, XIAOMI_ROUTE_ID, ZAI_MODEL_IDS, ZAI_MODEL_REFS, ZAI_PROVIDER_BRAND_ID, ZAI_ROUTE_ID, getProviderBrandManifestForRoute, isOpenAISignInCatalogModel, isOpenAISignInRuntimeModelSupported, isStandardProviderCatalogEntry, isStandardProviderModelRef, listProviderBrandManifests, lookupProviderManifestModelCapability, providerModelRecommendationRank, resolveProviderRouteModelCapability };
1604
+ export { ANTHROPIC_MODEL_IDS, ANTHROPIC_PROVIDER_BRAND_ID, ANTHROPIC_PROVIDER_MANIFEST, ANTHROPIC_ROUTE_ID, BYTEPLUS_CODING_MODEL_IDS, BYTEPLUS_CODING_MODEL_REFS, BYTEPLUS_CODING_ROUTE_ID, BYTEPLUS_MODEL_IDS, BYTEPLUS_MODEL_REFS, BYTEPLUS_PLAN_ROUTE_ID, BYTEPLUS_PROVIDER_BRAND_ID, BYTEPLUS_ROUTE_ID, CHUTES_MODEL_IDS, CHUTES_PROVIDER_BRAND_ID, CHUTES_ROUTE_ID, COPILOT_PROVIDER_BRAND_ID, COPILOT_PROXY_MODEL_IDS, COPILOT_PROXY_MODEL_REFS, COPILOT_PROXY_ROUTE_ID, CUSTOM_PROVIDER_BRAND_ID, CUSTOM_PROVIDER_ROUTE_ID, GITHUB_COPILOT_DEFAULT_MODEL_REF, GITHUB_COPILOT_MODEL_IDS, GITHUB_COPILOT_MODEL_REFS, GITHUB_COPILOT_ROUTE_ID, GOOGLE_API_MODEL_REFS, GOOGLE_API_ROUTE_ID, GOOGLE_GEMINI_CLI_MODEL_REFS, GOOGLE_GEMINI_CLI_ROUTE_ID, GOOGLE_GEMINI_MODEL_IDS, GOOGLE_PROVIDER_BRAND_ID, HUGGINGFACE_PROVIDER_BRAND_ID, HUGGINGFACE_ROUTE_ID, KIMI_CODING_MODEL_IDS, KIMI_CODING_ROUTE_ID, LITELLM_PROVIDER_BRAND_ID, LITELLM_ROUTE_ID, LMSTUDIO_PROVIDER_BRAND_ID, LMSTUDIO_ROUTE_ID, MINIMAX_API_ROUTE_ID, MINIMAX_CN_ROUTE_ID, MINIMAX_MODEL_IDS, MINIMAX_PORTAL_ROUTE_ID, MINIMAX_PROVIDER_BRAND_ID, MISTRAL_MODEL_IDS, MISTRAL_MODEL_REFS, MISTRAL_PROVIDER_BRAND_ID, MISTRAL_ROUTE_ID, MOONSHOT_MODEL_IDS, MOONSHOT_PROVIDER_BRAND_ID, MOONSHOT_ROUTE_ID, OLLAMA_PROVIDER_BRAND_ID, OLLAMA_ROUTE_ID, OPENAI_API_MODEL_IDS, OPENAI_API_MODEL_REFS, OPENAI_API_ROUTE_ID, OPENAI_CODEX_ROUTE_ID, OPENAI_PROVIDER_BRAND_ID, OPENAI_SIGN_IN_MODEL_IDS, OPENAI_SIGN_IN_MODEL_REFS, OPENCODE_ZEN_PROVIDER_BRAND_ID, OPENCODE_ZEN_ROUTE_ID, OPENROUTER_MODEL_IDS, OPENROUTER_MODEL_REFS, OPENROUTER_PROVIDER_BRAND_ID, OPENROUTER_ROUTE_ID, PROVIDER_BRAND_ORDER, QIANFAN_MODEL_IDS, QIANFAN_MODEL_REFS, QIANFAN_PROVIDER_BRAND_ID, QIANFAN_ROUTE_ID, QWEN_API_MODEL_IDS, QWEN_API_ROUTE_ID, QWEN_CODING_PLAN_MODEL_IDS, QWEN_CODING_PLAN_ROUTE_ID, QWEN_PROVIDER_BRAND_ID, SYNTHETIC_MODEL_REFS, SYNTHETIC_PROVIDER_BRAND_ID, SYNTHETIC_ROUTE_ID, TOGETHER_PROVIDER_BRAND_ID, TOGETHER_ROUTE_ID, VENICE_PROVIDER_BRAND_ID, VENICE_ROUTE_ID, VERCEL_AI_GATEWAY_PROVIDER_BRAND_ID, VERCEL_AI_GATEWAY_ROUTE_ID, VLLM_PROVIDER_BRAND_ID, VLLM_ROUTE_ID, VOLCENGINE_CODING_MODEL_IDS, VOLCENGINE_CODING_MODEL_REFS, VOLCENGINE_CODING_ROUTE_ID, VOLCENGINE_MODEL_IDS, VOLCENGINE_MODEL_REFS, VOLCENGINE_PLAN_ROUTE_ID, VOLCENGINE_PROVIDER_BRAND_ID, VOLCENGINE_ROUTE_ID, XAI_MODEL_IDS, XAI_MODEL_REFS, XAI_PROVIDER_BRAND_ID, XAI_ROUTE_ID, XIAOMI_MODEL_REFS, XIAOMI_PROVIDER_BRAND_ID, XIAOMI_ROUTE_ID, ZAI_MODEL_IDS, ZAI_MODEL_REFS, ZAI_PROVIDER_BRAND_ID, ZAI_ROUTE_ID, getProviderBrandManifestForRoute, isOpenAISignInRuntimeModelSupported, isStandardProviderCatalogEntry, isStandardProviderModelRef, listProviderBrandManifests, lookupProviderManifestModelCapability, providerModelRecommendationRank, resolveProviderRouteModelCapability };
@@ -1,23 +1,58 @@
1
+ import { getProviderBrandManifestForRoute } from "./registry.js";
1
2
  import { buildModelCatalogMergeKey } from "../agents/model-catalog-normalized.js";
2
3
  import { deriveModelMetadata } from "../agents/model-metadata.js";
3
4
  import { buildProviderRefreshEnvFromCredentials, fetchProviderRefreshSnapshotForRoutes } from "./refresh.js";
5
+ import { discoverGitHubCopilotModels } from "./github-copilot-model-discovery.js";
6
+ import { discoverOpenAICodexModels } from "./openai-codex-model-discovery.js";
4
7
  import { createHash } from "node:crypto";
5
8
 
6
9
  //#region src/providers/runtime-model-catalog.ts
7
10
  const DISCOVERY_TTL_MS = 5 * 6e4;
8
11
  let cache = null;
9
- function interactiveRuntimeProviders(store) {
10
- const credentialTypesByProvider = new Map();
11
- for (const credential of Object.values(store.profiles ?? {})) {
12
- const provider = credential.provider.trim().toLowerCase();
13
- if (!provider) {
12
+ const SPECIALIZED_DISCOVERY_ROUTES = new Set(["openai-codex", "github-copilot"]);
13
+ function authModeForProfileType(type) {
14
+ return type === "api_key" ? "api-key" : type;
15
+ }
16
+ function methodMatchesAuthMode(method, authMode) {
17
+ const methodMode = method.kind === "api-key" || method.kind === "manual" ? "api-key" : method.kind === "token" ? "token" : "oauth";
18
+ return methodMode === authMode;
19
+ }
20
+ function methodRouteIds(method) {
21
+ return [
22
+ method.route,
23
+ method.statusRoute,
24
+ method.configProviderId
25
+ ].map((value) => value?.trim().toLowerCase()).filter((value) => Boolean(value));
26
+ }
27
+ function credentialRoutesForProvider(store, route) {
28
+ const normalizedRoute = route.trim().toLowerCase();
29
+ const manifest = getProviderBrandManifestForRoute(normalizedRoute);
30
+ const routes = [];
31
+ const seen = new Set();
32
+ for (const profile of Object.values(store.profiles ?? {})) {
33
+ const profileProvider = profile.provider.trim().toLowerCase();
34
+ if (!profileProvider) {
35
+ continue;
36
+ }
37
+ const profileManifest = getProviderBrandManifestForRoute(profileProvider);
38
+ if (profileProvider !== normalizedRoute && profileManifest?.id !== manifest?.id) {
14
39
  continue;
15
40
  }
16
- const types = credentialTypesByProvider.get(provider) ?? new Set();
17
- types.add(credential.type);
18
- credentialTypesByProvider.set(provider, types);
41
+ const authMode = authModeForProfileType(profile.type);
42
+ const method = manifest?.methods.find((candidate) => methodMatchesAuthMode(candidate, authMode) && (methodRouteIds(candidate).includes(profileProvider) || methodRouteIds(candidate).includes(normalizedRoute)));
43
+ const id = method?.id ?? `${normalizedRoute}:${authMode}`;
44
+ const key = `${id}:${authMode}`;
45
+ if (seen.has(key)) {
46
+ continue;
47
+ }
48
+ seen.add(key);
49
+ routes.push({
50
+ id,
51
+ label: method?.label ?? manifest?.label ?? normalizedRoute,
52
+ authMode
53
+ });
19
54
  }
20
- return new Set([...credentialTypesByProvider.entries()].flatMap(([provider, types]) => !types.has("api_key") && (types.has("oauth") || types.has("token")) ? [provider] : []));
55
+ return routes;
21
56
  }
22
57
  function resetRuntimeProviderModelCatalogCache() {
23
58
  cache = null;
@@ -66,6 +101,24 @@ async function loadSnapshot(params) {
66
101
  throw error;
67
102
  }
68
103
  }
104
+ async function discoverInteractiveRoutes(params) {
105
+ const discovered = new Map();
106
+ if (params.routes.has("openai-codex")) {
107
+ discovered.set("openai-codex", await discoverOpenAICodexModels({
108
+ cfg: params.cfg,
109
+ store: params.store,
110
+ agentDir: params.agentDir
111
+ }));
112
+ }
113
+ if (params.routes.has("github-copilot")) {
114
+ discovered.set("github-copilot", await discoverGitHubCopilotModels({
115
+ cfg: params.cfg,
116
+ store: params.store,
117
+ agentDir: params.agentDir
118
+ }));
119
+ }
120
+ return discovered;
121
+ }
69
122
  function snapshotCapabilities(model) {
70
123
  return {
71
124
  ...model.tools !== undefined ? { tools: model.tools } : {},
@@ -94,12 +147,13 @@ function snapshotRoutes(snapshot) {
94
147
  function mergeDiscoveredRoute(params) {
95
148
  const baseByKey = new Map(params.catalog.map((model) => [buildModelCatalogMergeKey(model.provider, model.id), model]));
96
149
  const providerConfig = params.cfg.models?.providers?.[params.route];
150
+ const credentialRoutes = credentialRoutesForProvider(params.store, params.route);
97
151
  return params.discovered.map((model) => {
98
152
  const base = baseByKey.get(buildModelCatalogMergeKey(params.route, model.id));
99
153
  const capabilities = snapshotCapabilities(model);
100
154
  const entry = {
101
155
  id: model.id,
102
- name: base?.name ?? model.id,
156
+ name: model.name ?? base?.name ?? model.id,
103
157
  provider: params.route,
104
158
  ...model.contextWindow ?? base?.contextWindow ? { contextWindow: model.contextWindow ?? base?.contextWindow } : {},
105
159
  ...model.maxTokens ?? base?.maxTokens ? { maxTokens: model.maxTokens ?? base?.maxTokens } : {},
@@ -107,16 +161,23 @@ function mergeDiscoveredRoute(params) {
107
161
  input: model.input ?? base?.input ?? ["text"],
108
162
  ...base?.baseUrl ?? providerConfig?.baseUrl ? { baseUrl: base?.baseUrl ?? providerConfig?.baseUrl } : {},
109
163
  ...base?.api ?? providerConfig?.api ? { api: base?.api ?? providerConfig?.api } : {},
164
+ ...model.price ?? base?.cost ? { cost: model.price ?? base?.cost } : {},
110
165
  ...Object.keys(capabilities).length > 0 ? { capabilities } : {},
166
+ ...model.responsesLite !== undefined ? { compat: {
167
+ ...base?.compat,
168
+ responsesLite: model.responsesLite
169
+ } } : base?.compat ? { compat: base.compat } : {},
111
170
  catalogSource: "provider-api"
112
171
  };
113
172
  return {
114
173
  ...entry,
115
174
  metadata: {
175
+ ...base?.metadata,
116
176
  ...deriveModelMetadata({
117
177
  model: entry,
118
178
  cfg: params.cfg,
119
179
  providerConfig,
180
+ ...credentialRoutes.length > 0 ? { credentialRoutes } : {},
120
181
  ...snapshotHasCapabilityMetadata(model) ? {
121
182
  capabilitySource: "provider-api",
122
183
  capabilityRetrievedAt: params.retrievedAt
@@ -132,35 +193,43 @@ async function applyRuntimeProviderModelDiscovery(params) {
132
193
  if (requestedRoutes.size === 0) {
133
194
  return [];
134
195
  }
135
- const runtimeProviders = interactiveRuntimeProviders(params.store);
136
- const providerApiRoutes = [...requestedRoutes].filter((route) => !runtimeProviders.has(route));
137
- if (providerApiRoutes.length === 0) {
138
- return params.catalog;
139
- }
140
- let snapshot;
141
- try {
142
- snapshot = await loadSnapshot({
143
- ...params,
144
- routes: providerApiRoutes
145
- });
146
- } catch {
147
- return params.catalog.filter((model) => !providerApiRoutes.includes(model.provider.trim().toLowerCase()));
196
+ const specializedRoutes = new Set([...requestedRoutes].filter((route) => SPECIALIZED_DISCOVERY_ROUTES.has(route)));
197
+ const providerApiRoutes = [...requestedRoutes].filter((route) => !specializedRoutes.has(route));
198
+ const interactiveRoutes = await discoverInteractiveRoutes({
199
+ routes: requestedRoutes,
200
+ cfg: params.cfg,
201
+ store: params.store,
202
+ agentDir: params.agentDir
203
+ }).catch(() => new Map());
204
+ let discoveredRoutes = new Map(interactiveRoutes);
205
+ if (providerApiRoutes.length > 0) {
206
+ try {
207
+ const snapshot = await loadSnapshot({
208
+ ...params,
209
+ routes: providerApiRoutes
210
+ });
211
+ discoveredRoutes = new Map([...discoveredRoutes, ...snapshotRoutes(snapshot)]);
212
+ } catch {}
148
213
  }
149
- const discoveredRoutes = snapshotRoutes(snapshot);
150
214
  const retrievedAt = new Date().toISOString();
151
215
  const authoritativeRoutes = new Set([...discoveredRoutes.keys()].filter((route) => requestedRoutes.has(route)));
152
- const retained = params.catalog.filter((model) => !providerApiRoutes.includes(model.provider.trim().toLowerCase()));
216
+ const replacedRoutes = new Set(providerApiRoutes);
217
+ for (const route of specializedRoutes) {
218
+ replacedRoutes.add(route);
219
+ }
220
+ const retained = params.catalog.filter((model) => !replacedRoutes.has(model.provider.trim().toLowerCase()));
153
221
  const discovered = [...authoritativeRoutes].flatMap((route) => mergeDiscoveredRoute({
154
222
  route,
155
223
  discovered: discoveredRoutes.get(route) ?? [],
156
224
  catalog: params.catalog,
157
225
  cfg: params.cfg,
226
+ store: params.store,
158
227
  retrievedAt
159
228
  }));
160
229
  return [...retained, ...discovered].toSorted((left, right) => left.provider.localeCompare(right.provider) || (left.metadata?.recommendationRank ?? Number.MAX_SAFE_INTEGER) - (right.metadata?.recommendationRank ?? Number.MAX_SAFE_INTEGER) || left.name.localeCompare(right.name));
161
230
  }
162
231
  function filterCatalogToAuthoritativeAvailability(catalog, store) {
163
- const runtimeProviders = store ? interactiveRuntimeProviders(store) : new Set();
232
+ const specializedProviders = store ? new Set(Object.values(store.profiles ?? {}).map((profile) => profile.provider.trim().toLowerCase()).filter((provider) => SPECIALIZED_DISCOVERY_ROUTES.has(provider))) : new Set();
164
233
  const byProvider = new Map();
165
234
  for (const model of catalog) {
166
235
  const provider = model.provider.trim().toLowerCase();
@@ -170,8 +239,8 @@ function filterCatalogToAuthoritativeAvailability(catalog, store) {
170
239
  if (models.some((model) => model.catalogSource === "provider-api")) {
171
240
  return models.filter((model) => model.catalogSource === "provider-api");
172
241
  }
173
- if (runtimeProviders.has(provider)) {
174
- return models.filter((model) => model.catalogSource === "runtime");
242
+ if (specializedProviders.has(provider)) {
243
+ return models.filter((model) => model.catalogSource === "runtime" || model.catalogSource === "provider-api");
175
244
  }
176
245
  return models;
177
246
  });
@@ -12,7 +12,7 @@ import { listKnownSecretEnvVarNames } from "./provider-env-vars.js";
12
12
  import { createSecretsConfigIO } from "./config-io.js";
13
13
  import { normalizeSecretsPlanOptions, resolveValidatedTargetPathSegments } from "./plan.js";
14
14
  import { prepareSecretsRuntimeSnapshot } from "./runtime.js";
15
- import fs from "node:fs";
15
+ import syncFs from "node:fs";
16
16
  import os from "node:os";
17
17
  import path from "node:path";
18
18
  import { isDeepStrictEqual } from "node:util";
@@ -125,8 +125,8 @@ function collectAuthStorePaths(config, stateDir) {
125
125
  const paths = new Set();
126
126
  paths.add(path.join(resolveUserPath(stateDir), "agents", "main", "agent", "auth-profiles.json"));
127
127
  const agentsRoot = path.join(resolveUserPath(stateDir), "agents");
128
- if (fs.existsSync(agentsRoot)) {
129
- for (const entry of fs.readdirSync(agentsRoot, { withFileTypes: true })) {
128
+ if (syncFs.existsSync(agentsRoot)) {
129
+ for (const entry of syncFs.readdirSync(agentsRoot, { withFileTypes: true })) {
130
130
  if (!entry.isDirectory()) {
131
131
  continue;
132
132
  }
@@ -146,15 +146,15 @@ function collectAuthStorePaths(config, stateDir) {
146
146
  function collectAuthJsonPaths(stateDir) {
147
147
  const out = [];
148
148
  const agentsRoot = path.join(resolveUserPath(stateDir), "agents");
149
- if (!fs.existsSync(agentsRoot)) {
149
+ if (!syncFs.existsSync(agentsRoot)) {
150
150
  return out;
151
151
  }
152
- for (const entry of fs.readdirSync(agentsRoot, { withFileTypes: true })) {
152
+ for (const entry of syncFs.readdirSync(agentsRoot, { withFileTypes: true })) {
153
153
  if (!entry.isDirectory()) {
154
154
  continue;
155
155
  }
156
156
  const candidate = path.join(agentsRoot, entry.name, "agent", "auth.json");
157
- if (fs.existsSync(candidate)) {
157
+ if (syncFs.existsSync(candidate)) {
158
158
  out.push(candidate);
159
159
  }
160
160
  }
@@ -249,10 +249,10 @@ async function projectPlanState(params) {
249
249
  const authStoreByPath = new Map();
250
250
  if (options.scrubAuthProfilesForProviderTargets && providerTargets.size > 0) {
251
251
  for (const authStorePath of collectAuthStorePaths(nextConfig, stateDir)) {
252
- if (!fs.existsSync(authStorePath)) {
252
+ if (!syncFs.existsSync(authStorePath)) {
253
253
  continue;
254
254
  }
255
- const raw = fs.readFileSync(authStorePath, "utf8");
255
+ const raw = syncFs.readFileSync(authStorePath, "utf8");
256
256
  const parsed = JSON.parse(raw);
257
257
  if (!isRecord(parsed) || !isRecord(parsed.profiles)) {
258
258
  continue;
@@ -308,7 +308,7 @@ async function projectPlanState(params) {
308
308
  const authJsonByPath = new Map();
309
309
  if (options.scrubLegacyAuthJson) {
310
310
  for (const authJsonPath of collectAuthJsonPaths(stateDir)) {
311
- const raw = fs.readFileSync(authJsonPath, "utf8");
311
+ const raw = syncFs.readFileSync(authJsonPath, "utf8");
312
312
  const parsed = JSON.parse(raw);
313
313
  if (!isRecord(parsed)) {
314
314
  continue;
@@ -333,8 +333,8 @@ async function projectPlanState(params) {
333
333
  const envRawByPath = new Map();
334
334
  if (options.scrubEnv && scrubbedValues.size > 0) {
335
335
  const envPath = path.join(resolveConfigDir(params.env, os.homedir), ".env");
336
- if (fs.existsSync(envPath)) {
337
- const current = fs.readFileSync(envPath, "utf8");
336
+ if (syncFs.existsSync(envPath)) {
337
+ const current = syncFs.readFileSync(envPath, "utf8");
338
338
  const scrubbed = scrubEnvRaw(current, scrubbedValues, new Set(listKnownSecretEnvVarNames()));
339
339
  if (scrubbed.removed > 0 && scrubbed.nextRaw !== current) {
340
340
  envRawByPath.set(envPath, scrubbed.nextRaw);
@@ -387,24 +387,24 @@ async function projectPlanState(params) {
387
387
  };
388
388
  }
389
389
  function captureFileSnapshot(pathname) {
390
- if (!fs.existsSync(pathname)) {
390
+ if (!syncFs.existsSync(pathname)) {
391
391
  return {
392
392
  existed: false,
393
393
  content: "",
394
394
  mode: 384
395
395
  };
396
396
  }
397
- const stat = fs.statSync(pathname);
397
+ const stat = syncFs.statSync(pathname);
398
398
  return {
399
399
  existed: true,
400
- content: fs.readFileSync(pathname, "utf8"),
400
+ content: syncFs.readFileSync(pathname, "utf8"),
401
401
  mode: stat.mode & 511
402
402
  };
403
403
  }
404
404
  function restoreFileSnapshot(pathname, snapshot) {
405
405
  if (!snapshot.existed) {
406
- if (fs.existsSync(pathname)) {
407
- fs.rmSync(pathname, { force: true });
406
+ if (syncFs.existsSync(pathname)) {
407
+ syncFs.rmSync(pathname, { force: true });
408
408
  }
409
409
  return;
410
410
  }