@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.
- package/config/capability-catalog.json +12 -0
- package/dist/acp/client.js +2 -2
- package/dist/acp/secret-file.js +2 -2
- package/dist/agents/agent-scope.js +2 -2
- package/dist/agents/apply-patch.js +8 -8
- package/dist/agents/auth-profiles/paths.js +2 -2
- package/dist/agents/auth-profiles/store.js +2 -2
- package/dist/agents/authenticated-model-catalog.js +3 -2
- package/dist/agents/bash-tools.exec-host-node.js +1 -1
- package/dist/agents/bash-tools.exec.js +1 -1
- package/dist/agents/bash-tools.shared.js +2 -2
- package/dist/agents/cli-credentials.js +4 -4
- package/dist/agents/copilot-dynamic-headers.js +37 -0
- package/dist/agents/current-model-catalog.js +6 -3
- package/dist/agents/docs-path.js +3 -3
- package/dist/agents/embedded-pi-mcp.js +4 -4
- package/dist/agents/identity-avatar.js +3 -3
- package/dist/agents/identity-file.js +2 -2
- package/dist/agents/model-catalog-source.js +2 -2
- package/dist/agents/model-catalog.js +1 -1
- package/dist/agents/model-metadata.js +34 -6
- package/dist/agents/openai-codex-app-server.js +499 -0
- package/dist/agents/pi-embedded-runner/compact.js +3 -3
- package/dist/agents/pi-embedded-runner/extra-params.js +159 -95
- package/dist/agents/pi-embedded-runner/model.js +62 -1
- package/dist/agents/pi-embedded-runner/moonshot-stream-wrappers.js +46 -0
- package/dist/agents/pi-embedded-runner/openai-stream-wrappers.js +221 -0
- package/dist/agents/pi-embedded-runner/run/attempt.js +6 -4
- package/dist/agents/pi-embedded-runner/run.js +5 -2
- package/dist/agents/pi-embedded-runner/utils.js +1 -1
- package/dist/agents/pi-embedded-runner.js +1 -1
- package/dist/agents/pi-embedded-subscribe.raw-stream.js +3 -3
- package/dist/agents/pi-extensions/compaction-safeguard.js +3 -3
- package/dist/agents/pi-model-discovery.js +6 -6
- package/dist/agents/pi-project-settings.js +3 -3
- package/dist/agents/pi-tools.js +2 -2
- package/dist/agents/sandbox/fs-bridge.js +2 -2
- package/dist/agents/session-dirs.js +4 -4
- package/dist/agents/session-write-lock.js +13 -13
- package/dist/agents/shell-utils.js +5 -5
- package/dist/agents/skills/bundled-dir.js +4 -4
- package/dist/agents/skills/local-loader.js +6 -6
- package/dist/agents/skills/plugin-skills.js +2 -2
- package/dist/agents/skills/workspace.js +13 -13
- package/dist/agents/skills-install-download.js +7 -7
- package/dist/agents/skills-install-plan.js +2 -2
- package/dist/agents/skills-install.js +2 -2
- package/dist/agents/skills-status.js +2 -2
- package/dist/agents/subagent-depth.js +2 -2
- package/dist/agents/system-prompt-params.js +2 -2
- package/dist/agents/tools/discord-actions-messaging.js +1 -1
- package/dist/agents/tools/message-tool.js +1 -1
- package/dist/agents/tools/session-status-tool.js +3 -3
- package/dist/agents/tools/slack-actions.js +1 -1
- package/dist/agents/tools/tts-tool.js +1 -1
- package/dist/agents/workspace.js +22 -22
- package/dist/auto-reply/reply/agent-runner-execution.js +2 -2
- package/dist/auto-reply/reply/agent-runner.js +2 -2
- package/dist/auto-reply/reply/commands-export-session.js +7 -7
- package/dist/auto-reply/reply/commands-models.js +1 -1
- package/dist/auto-reply/reply/directive-handling.impl.js +4 -1
- package/dist/auto-reply/reply/dispatch-acp.js +1 -1
- package/dist/auto-reply/reply/dispatch-from-config.js +1 -1
- package/dist/auto-reply/reply/get-reply-run.js +20 -2
- package/dist/auto-reply/reply/model-selection.js +1 -1
- package/dist/auto-reply/reply/post-compaction-audit.js +3 -3
- package/dist/auto-reply/reply/post-compaction-context.js +3 -3
- package/dist/auto-reply/reply/session-reset-model.js +1 -1
- package/dist/auto-reply/reply/session.js +3 -3
- package/dist/auto-reply/skill-commands.js +3 -3
- package/dist/auto-reply/status.js +7 -7
- package/dist/auto-reply/thinking.js +1 -1
- package/dist/brand.js +1 -1
- package/dist/browser/cdp.helpers.js +2 -2
- package/dist/browser/chrome.executables.js +3 -3
- package/dist/browser/chrome.js +5 -5
- package/dist/browser/chrome.profile-decoration.js +6 -6
- package/dist/browser/extension-relay.js +7 -7
- package/dist/browser/profiles-service.js +2 -2
- package/dist/browser/server-context.js +2 -2
- package/dist/browser/trash.js +4 -4
- package/dist/build-info.json +3 -3
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/dist/canvas-host/server.js +4 -4
- package/dist/capabilities/catalog.js +3 -3
- package/dist/channels/plugins/catalog.js +3 -3
- package/dist/cli/browser-cli-extension.js +6 -6
- package/dist/cli/command-format.js +2 -2
- package/dist/cli/cron-cli/register.cron-add.js +1 -1
- package/dist/cli/cron-cli/register.cron-simple.js +2 -2
- package/dist/cli/dns-cli.js +9 -9
- package/dist/cli/gateway-cli/dev.js +5 -5
- package/dist/cli/gateway-cli/run.js +2 -2
- package/dist/cli/hooks-cli.js +5 -5
- package/dist/cli/lightweight/gateway-runtime-probe.js +2 -2
- package/dist/cli/memory-cli.js +7 -7
- package/dist/cli/nodes-media-utils.js +2 -2
- package/dist/cli/plugins-cli.js +2 -2
- package/dist/cli/program/register.agent.js +1 -1
- package/dist/cli/secrets-cli.js +3 -3
- package/dist/cli/windows-argv.js +2 -2
- package/dist/commands/agent.js +22 -3
- package/dist/commands/dashboard-link.js +3 -3
- package/dist/commands/doctor-config-flow.js +1 -1
- package/dist/commands/doctor-install.js +5 -5
- package/dist/commands/doctor-memory-search.js +2 -2
- package/dist/commands/doctor-platform-notes.js +2 -2
- package/dist/commands/doctor-sandbox.js +2 -2
- package/dist/commands/doctor-state-integrity.js +23 -23
- package/dist/commands/doctor-workspace.js +3 -3
- package/dist/commands/doctor.js +3 -3
- package/dist/commands/hosted-dashboard-probe.js +3 -3
- package/dist/commands/managed-up.js +2 -2
- package/dist/commands/model-picker.js +4 -3
- package/dist/commands/models/list.probe.js +1 -1
- package/dist/commands/models/list.registry.js +3 -2
- package/dist/commands/models/list.status-command.js +2 -2
- package/dist/commands/onboard-auth.credentials.js +3 -3
- package/dist/commands/onboarding/plugin-install.js +2 -2
- package/dist/commands/openai-codex-model-default.js +3 -2
- package/dist/commands/sessions-cleanup.js +2 -2
- package/dist/commands/signal-install.js +6 -6
- package/dist/commands/status-all/channels.js +2 -2
- package/dist/commands/wallet.js +47 -47
- package/dist/config/cache-utils.js +2 -2
- package/dist/config/includes.js +5 -5
- package/dist/config/io.js +2 -2
- package/dist/config/paths.js +3 -3
- package/dist/config/sat-runtime-ids.js +3 -3
- package/dist/config/sessions/disk-budget.js +6 -6
- package/dist/config/sessions/paths.js +2 -2
- package/dist/config/sessions/store.js +17 -17
- package/dist/config/sessions/transcript.js +4 -4
- package/dist/config/talk.js +2 -2
- package/dist/config/zod-schema.agent-defaults.js +4 -2
- package/dist/config/zod-schema.agent-runtime.js +4 -2
- package/dist/config/zod-schema.core.js +4 -2
- package/dist/control-ui/assets/{app-D2RaTXoV.js → app-D7TXyNRi.js} +390 -383
- package/dist/control-ui/assets/chat-model-ref-Djkv93yn.js +2 -0
- package/dist/control-ui/assets/{index-D2nC6I-9.js → index-BmSBom-w.js} +3 -3
- package/dist/control-ui/assets/{providers-CyjiG5Jw.js → providers-Cc89iMdx.js} +3 -3
- package/dist/control-ui/index.html +1 -1
- package/dist/control-ui/version.json +1 -1
- package/dist/cron/isolated-agent/run.js +6 -2
- package/dist/cron/service/jobs.js +11 -1
- package/dist/cron/service/store.js +2 -2
- package/dist/cron/store.js +6 -6
- package/dist/daemon/systemd-system.js +5 -5
- package/dist/discord/monitor/gateway-plugin.js +2 -2
- package/dist/discord/monitor/thread-bindings.state.js +2 -2
- package/dist/discord/voice/manager.js +1 -1
- package/dist/extensions/sat-mining/src/sat-bond-layout.js +9 -9
- package/dist/gateway/client.js +4 -4
- package/dist/gateway/control-ui-boot-check.js +6 -6
- package/dist/gateway/control-ui-login.js +7 -7
- package/dist/gateway/control-ui.js +9 -9
- package/dist/gateway/hooks-mapping.js +4 -4
- package/dist/gateway/protocol/schema/agents-models-skills.js +63 -4
- package/dist/gateway/server-discovery.js +2 -2
- package/dist/gateway/server-http.js +4 -4
- package/dist/gateway/server-methods/chat.js +3 -3
- package/dist/gateway/server-methods/models.js +4 -3
- package/dist/gateway/server-methods/sessions.js +8 -8
- package/dist/gateway/server-methods/tts.js +2 -2
- package/dist/gateway/server-methods/usage.js +2 -2
- package/dist/gateway/server-model-catalog.js +1 -1
- package/dist/gateway/server.impl.js +3 -3
- package/dist/gateway/session-compaction-checkpoints.js +4 -4
- package/dist/gateway/session-utils.fs.js +24 -24
- package/dist/gateway/session-utils.js +6 -6
- package/dist/gateway/sessions-patch.js +27 -24
- package/dist/hooks/bundled-dir.js +4 -4
- package/dist/hooks/gmail-setup-utils.js +6 -6
- package/dist/hooks/import-url.js +2 -2
- package/dist/hooks/loader.js +4 -4
- package/dist/hooks/workspace.js +7 -7
- package/dist/infra/archive.js +17 -17
- package/dist/infra/boundary-file-read.js +2 -2
- package/dist/infra/boundary-path.js +15 -15
- package/dist/infra/brew.js +2 -2
- package/dist/infra/control-ui-assets.js +14 -14
- package/dist/infra/device-auth-store.js +8 -8
- package/dist/infra/device-identity.js +8 -8
- package/dist/infra/dotenv.js +2 -2
- package/dist/infra/exec-approvals.js +8 -8
- package/dist/infra/exec-command-resolution.js +4 -4
- package/dist/infra/exec-safe-bin-trust.js +2 -2
- package/dist/infra/fased-root.js +5 -5
- package/dist/infra/fs-safe.js +14 -14
- package/dist/infra/gateway-lock.js +11 -11
- package/dist/infra/git-commit.js +5 -5
- package/dist/infra/git-root.js +4 -4
- package/dist/infra/hosted-runtime-artifact.js +3 -3
- package/dist/infra/is-main.js +2 -2
- package/dist/infra/json-file.js +7 -7
- package/dist/infra/outbound/delivery-queue.js +16 -16
- package/dist/infra/path-env.js +3 -3
- package/dist/infra/ports-lsof.js +4 -4
- package/dist/infra/provider-usage.auth.js +3 -3
- package/dist/infra/safe-open-sync.js +2 -2
- package/dist/infra/session-cost-usage.js +9 -9
- package/dist/infra/shell-env.js +2 -2
- package/dist/infra/state-migrations.fs.js +6 -6
- package/dist/infra/state-migrations.js +23 -23
- package/dist/infra/tmp-fased-dir.js +6 -6
- package/dist/infra/widearea-dns.js +3 -3
- package/dist/infra/wsl.js +2 -2
- package/dist/light-update-status.js +11 -11
- package/dist/line/accounts.js +2 -2
- package/dist/line/download.js +2 -2
- package/dist/logging/config.js +3 -3
- package/dist/logging/logger.js +7 -7
- package/dist/managed/federation.js +3 -3
- package/dist/managed/tunnel.js +3 -3
- package/dist/media/store.js +13 -13
- package/dist/media-understanding/runner.js +3 -3
- package/dist/memory/embeddings.js +2 -2
- package/dist/memory/internal.js +10 -10
- package/dist/memory/manager-sync-ops.js +7 -7
- package/dist/memory/repair-executor.js +17 -17
- package/dist/node-host/invoke-system-run-plan.js +8 -8
- package/dist/node-host/invoke.js +2 -2
- package/dist/node-host/runner.js +3 -3
- package/dist/pairing/pairing-store.js +3 -3
- package/dist/plugin-sdk/{accounts-CeRNo5Ae.js → accounts-DzWlKv1U.js} +1 -1
- package/dist/plugin-sdk/{actions-OMRHtXPj.js → actions-BplQVLL6.js} +4 -4
- package/dist/plugin-sdk/{active-listener-BlIkS3iR.js → active-listener-x4MLhYUw.js} +1 -1
- package/dist/plugin-sdk/{allow-list-BYeKk0Sy.js → allow-list-DyAxs4yw.js} +1 -1
- package/dist/plugin-sdk/{audio-preflight-B2n3a2Tj.js → audio-preflight-G8h3Sn8_.js} +43 -47
- package/dist/plugin-sdk/{audit-Ppg6dR_b.js → audit-CWknklvI.js} +1 -1
- package/dist/plugin-sdk/{channel-access-af8dWWRv.js → channel-access-a9Dnfw7-.js} +1 -1
- package/dist/plugin-sdk/{channel-access-configure-B6IAGlE0.js → channel-access-configure-CD4QDN5E.js} +1 -1
- package/dist/plugin-sdk/{channel-adapters.discord-IOZP8Cv5.js → channel-adapters.discord-BS4S4Svh.js} +1 -1
- package/dist/plugin-sdk/channel-plugin-common.d.ts +3 -3
- package/dist/plugin-sdk/channel-plugin-common.js +4 -4
- package/dist/plugin-sdk/{chunk-CD76Byie.js → chunk-B8EZkwiT.js} +1 -1
- package/dist/plugin-sdk/{chunk-items-Bu19zrYH.js → chunk-items-CEPklxGe.js} +1 -1
- package/dist/plugin-sdk/command-status.d.ts +2 -2
- package/dist/plugin-sdk/command-status.js +43 -47
- package/dist/plugin-sdk/{commands-registry-DgS55tNj.js → commands-registry-BfEa4tFA.js} +2 -2
- package/dist/plugin-sdk/{common-CWvfeiX0.js → common-CbfckC19.js} +1 -1
- package/dist/plugin-sdk/{config-CYDETqcF.js → config-Bt5GhnA-.js} +29 -15
- package/dist/plugin-sdk/{config-schema-CQ4EVcQG.js → config-schema-B9DKr6J5.js} +95877 -81287
- package/dist/plugin-sdk/device-pair.d.ts +1 -1
- package/dist/plugin-sdk/device-pair.js +2 -3
- package/dist/plugin-sdk/{diagnostic-Dfn1iERm.js → diagnostic-DLL_zekv.js} +3 -3
- package/dist/plugin-sdk/{directory-live-DatqU-eS.js → directory-live-CSuYxdwk.js} +1 -1
- package/dist/plugin-sdk/{directory-live-ClwN5KKq.js → directory-live-Dw7ZgC9_.js} +1 -1
- package/dist/plugin-sdk/discord.d.ts +5 -5
- package/dist/plugin-sdk/discord.js +31 -32
- package/dist/plugin-sdk/{draft-stream-controls-D4Tb_iS_.js → draft-stream-controls-BqchW1vi.js} +1 -1
- package/dist/plugin-sdk/{fetch-guard-BuYrl6q2.js → fetch-guard-CeG6u6ld.js} +1 -1
- package/dist/plugin-sdk/{filesystem-manager-B9DDPgfU.js → filesystem-manager-BGGGrkiN.js} +2 -2
- package/dist/plugin-sdk/{fs-safe-BG-VzVkL.js → fs-safe-xBqok6yR.js} +1 -1
- package/dist/plugin-sdk/{group-mentions-BxDgHCgj.d.ts → group-mentions-BHRff6j8.d.ts} +1 -1
- package/dist/plugin-sdk/{guilds-BeT3iHHJ.js → guilds-CDhRIX57.js} +1 -1
- package/dist/plugin-sdk/{handle-action-B75UVKxF.js → handle-action-DbzZFYnG.js} +24 -25
- package/dist/plugin-sdk/{helpers-BuEwju6y.js → helpers-CluGKuIV.js} +1 -1
- package/dist/plugin-sdk/{image-ops-C66HPeAZ.js → image-ops-CUaLtIFj.js} +1 -1
- package/dist/plugin-sdk/index.d.ts +7 -7
- package/dist/plugin-sdk/index.js +47 -51
- package/dist/plugin-sdk/json-store.js +6 -6
- package/dist/plugin-sdk/{login-Amr2DpKU.js → login-DJuHYDiK.js} +3 -3
- package/dist/plugin-sdk/{login-qr-DMQNEi9m.js → login-qr-CbHL5ayf.js} +3 -3
- package/dist/plugin-sdk/{manager-Bvpq49BI.js → manager-oHAvZCT3.js} +7 -7
- package/dist/plugin-sdk/{markdown-tables-DmQ7oXOm.js → markdown-tables-Mkx7k92Y.js} +1 -1
- package/dist/plugin-sdk/{media-ByLQbEwJ.js → media-CA8sTmVE.js} +4 -4
- package/dist/plugin-sdk/{monitor-K_u6daGa.js → monitor-CZrN9pev.js} +51 -55
- package/dist/plugin-sdk/{monitor-S_7LrvSj.js → monitor-CmwGqNyV.js} +61 -65
- package/dist/plugin-sdk/{openresponses-http-BrDJUZXR.js → openresponses-http-CWOd4war.js} +43 -47
- package/dist/plugin-sdk/{optional-runtime-dependency-CbYjAC2b.js → optional-runtime-dependency-DKmk9PZa.js} +1 -1
- package/dist/plugin-sdk/{outbound-BuDafBBI.js → outbound-0oN9IfNw.js} +9 -9
- package/dist/plugin-sdk/{outbound-attachment-DmZmUqFP.js → outbound-attachment-DdVkqUzE.js} +2 -2
- package/dist/plugin-sdk/{pairing-message-D0-UWGFJ.d.ts → pairing-message-BMkkS038.d.ts} +2 -2
- package/dist/plugin-sdk/{pairing-message-e4D4eBDA.js → pairing-message-ClqhfCUk.js} +1 -1
- package/dist/plugin-sdk/{pairing-store-T3IGoGZg.js → pairing-store-B01mCSct.js} +2 -2
- package/dist/plugin-sdk/{pi-model-discovery-DvAG_Png.js → pi-model-discovery-Buz0JC1Y.js} +1 -1
- package/dist/plugin-sdk/{pi-model-discovery-runtime-NjkUgjIf.js → pi-model-discovery-runtime-DuwuoteY.js} +2 -2
- package/dist/plugin-sdk/{probe-Cyb-DGA3.js → probe--7xtfzMm.js} +3 -3
- package/dist/plugin-sdk/{probe-Dlk0Jxpw.js → probe-BFroeK3g.js} +1 -1
- package/dist/plugin-sdk/{probe-D8JAILir.js → probe-l_whvGLY.js} +1 -1
- package/dist/plugin-sdk/{resolve-channels-zEnvugag.js → probe-xY3Ky0Tx.js} +3 -4
- package/dist/plugin-sdk/provider-web-search-config-contract.d.ts +2 -2
- package/dist/plugin-sdk/{pw-ai-D7eW43DL.js → pw-ai-B0domrii.js} +6 -8
- package/dist/plugin-sdk/{qmd-manager-DCUE21Kj.js → qmd-manager-CFFeM4Fl.js} +3 -3
- package/dist/plugin-sdk/{query-expansion-Zr9qQixm.js → query-expansion-CAI2kKLQ.js} +1 -1
- package/dist/plugin-sdk/{replies-BMIPmEoP.js → replies-1macZ1mZ.js} +4 -4
- package/dist/plugin-sdk/{resolve-channels-ChWKWtA9.js → resolve-channels-87LZrFk_.js} +2 -2
- package/dist/plugin-sdk/resolve-channels-CwB2_019.js +4 -0
- package/dist/plugin-sdk/{resolve-outbound-target-CXCqUUPV.js → resolve-outbound-target-BdH6LUoW.js} +2 -2
- package/dist/plugin-sdk/{resolve-route-DJN-SUSt.js → resolve-route-CkNIKKEW.js} +1 -1
- package/dist/plugin-sdk/{resolve-users-BTvjQuui.js → resolve-users-Cxb5wpAQ.js} +1 -1
- package/dist/plugin-sdk/{resolve-users-CTzoruIZ.js → resolve-users-V6dHh_2B.js} +2 -2
- package/dist/plugin-sdk/{retry-policy-CY1qY6d7.js → retry-policy-9ybIh4Fq.js} +1 -1
- package/dist/plugin-sdk/{runtime-CgOkQe0w.js → runtime-Dy420wBu.js} +3 -3
- package/dist/plugin-sdk/{runtime-dependency-DvdRNMvs.js → runtime-dependency-CIw9t7-k.js} +123 -15
- package/dist/plugin-sdk/{sandbox-paths-lj7_EVuA.js → sandbox-paths-w64tYl0v.js} +1 -1
- package/dist/plugin-sdk/sat-runtime.d.ts +3 -3
- package/dist/plugin-sdk/sat-runtime.js +44 -10
- package/dist/plugin-sdk/{send-BAz22RZr.js → send-2VcOMTN5.js} +9 -9
- package/dist/plugin-sdk/{send-2ITqny2W.js → send-BQUtCJFW.js} +10 -10
- package/dist/plugin-sdk/{send-Cr-dj6S-.js → send-DPJIIYAs.js} +6 -6
- package/dist/plugin-sdk/{send-BG3RWyil.js → send-Dqes9tdU.js} +13 -13
- package/dist/plugin-sdk/{send-eTxqFFsw.js → send-J4JWKP62.js} +8 -8
- package/dist/plugin-sdk/{session-C8nJmmVE.js → session-C_n2S5ub.js} +3 -3
- package/dist/plugin-sdk/{skill-commands-Rm5by9S8.js → skill-commands-B7wx9ax8.js} +102 -102
- package/dist/plugin-sdk/{slack-xvIVvyEM.js → slack-BouRQG-W.js} +64 -68
- package/dist/plugin-sdk/{slack-actions-BNIALJTA.js → slack-actions-CasHVtiq.js} +20 -21
- package/dist/plugin-sdk/slack.d.ts +5 -5
- package/dist/plugin-sdk/slack.js +13 -13
- package/dist/plugin-sdk/{ssrf-BZG8Ztod.js → ssrf-fG4UHKBw.js} +180 -2
- package/dist/plugin-sdk/{sticker-cache-D3oDiu2u.js → sticker-cache-BvGEUas3.js} +3 -3
- package/dist/plugin-sdk/{tables-DS5L7lCA.js → tables-CjlQJV4r.js} +2 -2
- package/dist/plugin-sdk/{device-pairing-D2Yq-_U6.js → tailscale-status-DwpNdO3Z.js} +104 -2
- package/dist/plugin-sdk/{targets-D6lUomJc.js → targets-QfP164Dh.js} +2 -2
- package/dist/plugin-sdk/{telegram-actions-MSFkDn0m.js → telegram-actions-CwYjV6Db.js} +48 -52
- package/dist/plugin-sdk/telegram.d.ts +5 -5
- package/dist/plugin-sdk/telegram.js +11 -11
- package/dist/plugin-sdk/{thread-bindings.lifecycle-Ry6Vcgw3.js → thread-bindings.lifecycle-DU4iX_Jr.js} +3 -3
- package/dist/plugin-sdk/{thread-bindings.state-C0stmvNk.js → thread-bindings.state-BgYWFjNF.js} +2 -2
- package/dist/plugin-sdk/{tmp-fased-dir-D91GExk4.d.ts → tmp-fased-dir-BdFQvrvw.d.ts} +2 -2
- package/dist/plugin-sdk/{types-DVTIpopt.d.ts → types-BYDL6dQj.d.ts} +2 -2
- package/dist/plugin-sdk/{types-DKvBJHfH.d.ts → types-CLIvQaVg.d.ts} +26 -1
- package/dist/plugin-sdk/{types-BzadOItY.d.ts → types-DyhXnYUr.d.ts} +1 -1
- package/dist/plugin-sdk/{types.plugin-BiHPaDTF.d.ts → types.plugin-_fbu40Re.d.ts} +7 -5
- package/dist/plugin-sdk/{web-DRNJxHXA.js → web-D0yENDve.js} +52 -56
- package/dist/plugin-sdk/{whatsapp-actions-BDXZF2R5.js → whatsapp-actions-BT2nPLyo.js} +18 -19
- package/dist/plugin-sdk/{whatsapp-heartbeat-CKgmwCGr.js → whatsapp-heartbeat-CiABSZ6G.js} +2 -2
- package/dist/plugin-sdk/whatsapp.d.ts +5 -5
- package/dist/plugin-sdk/whatsapp.js +14 -14
- package/dist/plugin-sdk/{wsl-Biw7Mj39.js → wsl-B_ojyEtC.js} +53 -53
- package/dist/plugins/bundled-dir.js +3 -3
- package/dist/plugins/discovery.js +11 -11
- package/dist/plugins/loader.js +13 -13
- package/dist/plugins/manifest-registry.js +2 -2
- package/dist/plugins/manifest.js +4 -4
- package/dist/plugins/path-safety.js +3 -3
- package/dist/plugins/runtime/index.js +1 -1
- package/dist/plugins/status-cache.js +9 -9
- package/dist/plugins/update.js +3 -3
- package/dist/plugins/web-search-install-catalog.js +3 -3
- package/dist/providers/github-copilot-model-discovery.js +51 -0
- package/dist/providers/openai-codex-model-discovery.js +166 -0
- package/dist/providers/refresh.js +116 -34
- package/dist/providers/registry.js +2 -2
- package/dist/providers/runtime-model-catalog.js +97 -28
- package/dist/secrets/apply.js +16 -16
- package/dist/secrets/audit.js +11 -11
- package/dist/secrets/shared.js +9 -9
- package/dist/security/scan-paths.js +2 -2
- package/dist/shared/config-eval.js +2 -2
- package/dist/shared/model-thinking.js +13 -2
- package/dist/shared/pid-alive.js +2 -2
- package/dist/tasks/standing-orders.js +5 -5
- package/dist/tasks/task-flow-registry.js +5 -5
- package/dist/tasks/task-registry.js +5 -5
- package/dist/tasks/workflow-definitions.js +6 -6
- package/dist/telegram/bot-message-context.js +1 -1
- package/dist/telegram/token.js +5 -5
- package/dist/utils.js +5 -5
- package/dist/wallet/local-socket-signer-broker.js +16 -16
- package/dist/wallet/providers/embedded-keystore-adapter.js +5 -5
- package/dist/wallet/providers/local-socket-signer-adapter.js +2 -2
- package/dist/wallet/wallet-approval-auth.js +5 -5
- package/dist/wallet/wallet-audit-log.js +5 -5
- package/dist/wallet/wallet-custody.js +21 -21
- package/dist/wallet/wallet-inbound-events.js +5 -5
- package/dist/wallet/wallet-observability.js +5 -5
- package/dist/wallet/wallet-policy.js +9 -9
- package/dist/wallet/wallet-provider-registry.js +7 -7
- package/dist/wallet/wallet-runtime-config.js +3 -3
- package/dist/wallet/wallet-secrets-store.js +22 -22
- package/dist/wallet/wallet-send-approvals.js +5 -5
- package/dist/wallet/wallet-settlement-links.js +5 -5
- package/dist/web/accounts.js +3 -3
- package/dist/web/auth-store.js +18 -18
- package/dist/web/session.js +4 -4
- package/dist/wizard/host-security-capability.js +2 -2
- package/dist/wizard/onboarding.host-security.js +7 -7
- package/dist/wizard/onboarding.js +7 -7
- package/dist/wizard/onboarding.wallet.js +44 -44
- package/extensions/acpx/package.json +1 -1
- package/extensions/bluebubbles/package.json +1 -1
- package/extensions/copilot-proxy/package.json +1 -1
- package/extensions/diagnostics-otel/package.json +1 -1
- package/extensions/fased-federation/package.json +1 -1
- package/extensions/google-gemini-cli-auth/package.json +1 -1
- package/extensions/imessage/package.json +1 -1
- package/extensions/irc/package.json +1 -1
- package/extensions/line/package.json +1 -1
- package/extensions/llm-task/package.json +1 -1
- package/extensions/lobster/package.json +1 -1
- package/extensions/matrix/CHANGELOG.md +6 -0
- package/extensions/matrix/package.json +1 -1
- package/extensions/mattermost/package.json +1 -1
- package/extensions/memory-core/package.json +2 -2
- package/extensions/memory-lancedb/package.json +1 -1
- package/extensions/minimax-portal-auth/package.json +1 -1
- package/extensions/msteams/CHANGELOG.md +6 -0
- package/extensions/msteams/package.json +1 -1
- package/extensions/nextcloud-talk/package.json +1 -1
- package/extensions/nostr/CHANGELOG.md +6 -0
- package/extensions/nostr/package.json +1 -1
- package/extensions/open-prose/package.json +1 -1
- package/extensions/sat-mining/package.json +1 -1
- package/extensions/signal/package.json +1 -1
- package/extensions/synology-chat/package.json +1 -1
- package/extensions/tlon/package.json +1 -1
- package/extensions/twitch/CHANGELOG.md +6 -0
- package/extensions/twitch/package.json +1 -1
- package/extensions/voice-call/CHANGELOG.md +6 -0
- package/extensions/voice-call/package.json +1 -1
- package/extensions/zalo/CHANGELOG.md +6 -0
- package/extensions/zalo/package.json +1 -1
- package/extensions/zalouser/CHANGELOG.md +6 -0
- package/extensions/zalouser/package.json +1 -1
- package/package.json +2 -1
- package/dist/control-ui/assets/chat-model-ref-BZFblCeY.js +0 -2
- package/dist/plugin-sdk/ip-C70a-YlD.js +0 -181
- package/dist/plugin-sdk/tailscale-status-ClsquRGs.js +0 -104
- package/dist/plugin-sdk/wallet-status-f0HagNeO.js +0 -11947
- package/dist/plugin-sdk/ws-CocpWGhl.js +0 -114
- /package/dist/plugin-sdk/{blocks-input-Dcitfh7h.js → blocks-input-Bg-8S2pl.js} +0 -0
- /package/dist/plugin-sdk/{channel-activity-Cg1xRoc2.js → channel-activity-DBDMQ3yI.js} +0 -0
- /package/dist/plugin-sdk/{channel-core-BOkyXXLa.js → channel-core-CFRs8LPy.js} +0 -0
- /package/dist/plugin-sdk/{client-D2N7hqVu.js → client-pI228AVT.js} +0 -0
- /package/dist/plugin-sdk/{command-poll-backoff-NAePk3eL.js → command-poll-backoff-yJU83wEq.js} +0 -0
- /package/dist/plugin-sdk/{date-time-CE3Uer3C.js → date-time-uUevHscU.js} +0 -0
- /package/dist/plugin-sdk/{diagnostic-session-state-HO94DMou.js → diagnostic-session-state-DqgfGYqZ.js} +0 -0
- /package/dist/plugin-sdk/{draft-stream-loop-CKyHn8IX.js → draft-stream-loop-CrOPfV3F.js} +0 -0
- /package/dist/plugin-sdk/{fetch-Cu-ahkie.js → fetch-BtmoPIlf.js} +0 -0
- /package/dist/plugin-sdk/{gateway-registry-DFsoY6C0.js → gateway-registry-DZDsqicG.js} +0 -0
- /package/dist/plugin-sdk/{inbound-context-BFnIdcqI.js → inbound-context-DrAcXE0y.js} +0 -0
- /package/dist/plugin-sdk/{internal-qo16nNU1.js → internal-CG_nHo-2.js} +0 -0
- /package/dist/plugin-sdk/{memory-search-C3C0bD2H.js → memory-search-VFll-AIb.js} +0 -0
- /package/dist/plugin-sdk/{pairing-token-N_6Jbt1L.js → pairing-token-Cs3BRKc0.js} +0 -0
- /package/dist/plugin-sdk/{path-alias-guards-Dg3gU-MA.js → path-alias-guards-BJZD5JMJ.js} +0 -0
- /package/dist/plugin-sdk/{polls-DQrR-qT3.js → polls-DKQXVfJp.js} +0 -0
- /package/dist/plugin-sdk/{proxy-7xs_rsnV.js → proxy-DWpYcsvR.js} +0 -0
- /package/dist/plugin-sdk/{qmd-scope-D1sSG_Rx.js → qmd-scope-CdX34VCV.js} +0 -0
- /package/dist/plugin-sdk/{redact-identifier-Q3tkvxhm.js → redact-identifier-Lt7t3l7S.js} +0 -0
- /package/dist/plugin-sdk/{redact-sensitive-url-dPvnFFsK.js → redact-sensitive-url-g-ukZjwA.js} +0 -0
- /package/dist/plugin-sdk/{render-Bwu_WxwA.js → render-e7fENCYH.js} +0 -0
- /package/dist/plugin-sdk/{reply-prefix-Bqzm6DC1.js → reply-prefix-ClpxvL_w.js} +0 -0
- /package/dist/plugin-sdk/{reply-reference-BkbK_DWT.js → reply-reference-Bqk-7HXE.js} +0 -0
- /package/dist/plugin-sdk/{secure-random-Bl-AVLVb.js → secure-random-BIkG-k4s.js} +0 -0
- /package/dist/plugin-sdk/{shared-clhhbWN3.js → shared-CBgp_GBw.js} +0 -0
- /package/dist/plugin-sdk/{target-errors-C_SVKoEv.js → target-errors-Ckufe179.js} +0 -0
- /package/dist/plugin-sdk/{targets-BDvvnlph.js → targets-CoMJ1ry1.js} +0 -0
- /package/dist/plugin-sdk/{tokens-BvtlOzVP.js → tokens-BbnqfVuu.js} +0 -0
- /package/dist/plugin-sdk/{tool-loop-detection-CWphm1k_.js → tool-loop-detection-Bp8bPJLs.js} +0 -0
- /package/dist/plugin-sdk/{ui-e020ouhJ.js → ui-Be8cLHIS.js} +0 -0
- /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",
|
|
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",
|
|
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",
|
|
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
|
|
1135
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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: "
|
|
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":
|
|
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
|
-
|
|
2047
|
-
|
|
2048
|
-
|
|
2049
|
-
const
|
|
2050
|
-
|
|
2051
|
-
|
|
2052
|
-
|
|
2053
|
-
|
|
2054
|
-
|
|
2055
|
-
|
|
2056
|
-
|
|
2057
|
-
|
|
2058
|
-
|
|
2059
|
-
|
|
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
|
-
|
|
2063
|
-
|
|
2064
|
-
|
|
2065
|
-
|
|
2066
|
-
|
|
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: "
|
|
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,
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
|
17
|
-
|
|
18
|
-
|
|
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
|
|
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
|
|
136
|
-
const providerApiRoutes = [...requestedRoutes].filter((route) => !
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
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
|
|
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
|
|
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 (
|
|
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
|
});
|
package/dist/secrets/apply.js
CHANGED
|
@@ -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
|
|
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 (
|
|
129
|
-
for (const entry of
|
|
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 (!
|
|
149
|
+
if (!syncFs.existsSync(agentsRoot)) {
|
|
150
150
|
return out;
|
|
151
151
|
}
|
|
152
|
-
for (const entry of
|
|
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 (
|
|
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 (!
|
|
252
|
+
if (!syncFs.existsSync(authStorePath)) {
|
|
253
253
|
continue;
|
|
254
254
|
}
|
|
255
|
-
const raw =
|
|
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 =
|
|
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 (
|
|
337
|
-
const current =
|
|
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 (!
|
|
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 =
|
|
397
|
+
const stat = syncFs.statSync(pathname);
|
|
398
398
|
return {
|
|
399
399
|
existed: true,
|
|
400
|
-
content:
|
|
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 (
|
|
407
|
-
|
|
406
|
+
if (syncFs.existsSync(pathname)) {
|
|
407
|
+
syncFs.rmSync(pathname, { force: true });
|
|
408
408
|
}
|
|
409
409
|
return;
|
|
410
410
|
}
|