cartethyia 2.4.5 → 2.5.0
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/.env.example +4 -1
- package/README.md +63 -13
- package/dist/dashboard/assets/AccountCooldown-ChpdzxRH.js.gz +0 -0
- package/dist/dashboard/assets/BannedPage-9igfctfZ.js +1 -0
- package/dist/dashboard/assets/BannedPage-9igfctfZ.js.gz +0 -0
- package/dist/dashboard/assets/{CliToolDetailPage-BzGevuql.js → CliToolDetailPage-ZRr2K2sF.js} +1 -1
- package/dist/dashboard/assets/CliToolDetailPage-ZRr2K2sF.js.gz +0 -0
- package/dist/dashboard/assets/{CliToolsPage-BaRM_7We.js → CliToolsPage-D3xqZbN-.js} +1 -1
- package/dist/dashboard/assets/CliToolsPage-D3xqZbN-.js.gz +0 -0
- package/dist/dashboard/assets/CombosPage-CVnQPBBz.js +1 -0
- package/dist/dashboard/assets/CombosPage-CVnQPBBz.js.gz +0 -0
- package/dist/dashboard/assets/ConsoleLogPage-u6W1UXSc.js +1 -0
- package/dist/dashboard/assets/ConsoleLogPage-u6W1UXSc.js.gz +0 -0
- package/dist/dashboard/assets/{CustomizationPage-DqUGcoH0.js → CustomizationPage-CTTpCb25.js} +1 -1
- package/dist/dashboard/assets/CustomizationPage-CTTpCb25.js.gz +0 -0
- package/dist/dashboard/assets/HealthEventsModal-C5XpWlvy.js +1 -0
- package/dist/dashboard/assets/HealthEventsModal-C5XpWlvy.js.gz +0 -0
- package/dist/dashboard/assets/{LoginPage-DbhTGfhb.js → LoginPage-DHoB3Agn.js} +1 -1
- package/dist/dashboard/assets/LoginPage-DHoB3Agn.js.gz +0 -0
- package/dist/dashboard/assets/ModelPicker-oQ-SDXp8.js +1 -0
- package/dist/dashboard/assets/ModelPicker-oQ-SDXp8.js.gz +0 -0
- package/dist/dashboard/assets/OverviewPage-BrY4SgIt.js +1 -0
- package/dist/dashboard/assets/OverviewPage-BrY4SgIt.js.gz +0 -0
- package/dist/dashboard/assets/ProviderDetailPage-D9VSt7T_.js +3 -0
- package/dist/dashboard/assets/ProviderDetailPage-D9VSt7T_.js.gz +0 -0
- package/dist/dashboard/assets/ProviderIcon-CmfzxpVM.js +1 -0
- package/dist/dashboard/assets/ProviderIcon-CmfzxpVM.js.gz +0 -0
- package/dist/dashboard/assets/ProvidersPage-Df77V5I5.js +1 -0
- package/dist/dashboard/assets/ProvidersPage-Df77V5I5.js.gz +0 -0
- package/dist/dashboard/assets/ProxyPage-CDfxP7AC.js +7 -0
- package/dist/dashboard/assets/ProxyPage-CDfxP7AC.js.gz +0 -0
- package/dist/dashboard/assets/QuotaPage-CY4o2t4p.js +1 -0
- package/dist/dashboard/assets/QuotaPage-CY4o2t4p.js.gz +0 -0
- package/dist/dashboard/assets/{SettingsPage-YxRml8AT.js → SettingsPage-CvjZxHE4.js} +1 -1
- package/dist/dashboard/assets/SettingsPage-CvjZxHE4.js.gz +0 -0
- package/dist/dashboard/assets/SetupPage-D3nza7LH.js +1 -0
- package/dist/dashboard/assets/SetupPage-D3nza7LH.js.gz +0 -0
- package/dist/dashboard/assets/{SortableList-Bol1ASmI.js → SortableList-Dtt12WT1.js} +1 -1
- package/dist/dashboard/assets/SortableList-Dtt12WT1.js.gz +0 -0
- package/dist/dashboard/assets/StudioPage-CbK3hXvU.js +31 -0
- package/dist/dashboard/assets/StudioPage-CbK3hXvU.js.gz +0 -0
- package/dist/dashboard/assets/ToolIcon-K1ckcDKg.js.gz +0 -0
- package/dist/dashboard/assets/UsagePage-BQlWbWg2.js +56 -0
- package/dist/dashboard/assets/UsagePage-BQlWbWg2.js.gz +0 -0
- package/dist/dashboard/assets/api-keys-BmDbsior.js +1 -0
- package/dist/dashboard/assets/api-keys-BmDbsior.js.gz +0 -0
- package/dist/dashboard/assets/app-BbpSarVV.css +2 -0
- package/dist/dashboard/assets/app-BbpSarVV.css.gz +0 -0
- package/dist/dashboard/assets/{app-BDJWMThu.js → app-C-Y4oZT0.js} +3 -3
- package/dist/dashboard/assets/app-C-Y4oZT0.js.gz +0 -0
- package/dist/dashboard/assets/arrow-left-CpBxkoxI.js.gz +0 -0
- package/dist/dashboard/assets/arrow-right-Dl5yKnp8.js.gz +0 -0
- package/dist/dashboard/assets/assert-BHfaei-X.js +1 -0
- package/dist/dashboard/assets/assert-BHfaei-X.js.gz +0 -0
- package/dist/dashboard/assets/backup-file-gdKIlg8U.js.gz +0 -0
- package/dist/dashboard/assets/{badge-BwmwEOgA.js → badge-DpXT4Ixt.js} +1 -1
- package/dist/dashboard/assets/badge-DpXT4Ixt.js.gz +0 -0
- package/dist/dashboard/assets/{banner-BKBfKTqn.js → banner-CSAAWLJv.js} +1 -1
- package/dist/dashboard/assets/banner-CSAAWLJv.js.gz +0 -0
- package/dist/dashboard/assets/brain-Cwed_72z.js.gz +0 -0
- package/dist/dashboard/assets/{card-BTdbRFFg.js → card-DEhRXXw4.js} +1 -1
- package/dist/dashboard/assets/card-DEhRXXw4.js.gz +0 -0
- package/dist/dashboard/assets/check-D69FzdvC.js.gz +0 -0
- package/dist/dashboard/assets/chevron-right-BXIy5l3h.js.gz +0 -0
- package/dist/dashboard/assets/circle-alert-CntYHV5v.js.gz +0 -0
- package/dist/dashboard/assets/circle-check-BU3v_mFW.js.gz +0 -0
- package/dist/dashboard/assets/cli-tools-B0wBq-RL.js +1 -0
- package/dist/dashboard/assets/cli-tools-B0wBq-RL.js.gz +0 -0
- package/dist/dashboard/assets/clipboard-button-DOo6EU8O.js +1 -0
- package/dist/dashboard/assets/clipboard-button-DOo6EU8O.js.gz +0 -0
- package/dist/dashboard/assets/cog-CdWhsajs.js.gz +0 -0
- package/dist/dashboard/assets/copy-ngmQ9zcZ.js.gz +0 -0
- package/dist/dashboard/assets/{dialog-iocKA3jr.js → dialog-BvQeBMfP.js} +1 -1
- package/dist/dashboard/assets/dialog-BvQeBMfP.js.gz +0 -0
- package/dist/dashboard/assets/dialog-actions-B1axpEg7.js.gz +0 -0
- package/dist/dashboard/assets/download-A0SW9OCW.js.gz +0 -0
- package/dist/dashboard/assets/download-dRFo5_Wu.js.gz +0 -0
- package/dist/dashboard/assets/{drawer-CDKOTZdY.js → drawer-CMwPXwQB.js} +1 -1
- package/dist/dashboard/assets/drawer-CMwPXwQB.js.gz +0 -0
- package/dist/dashboard/assets/entry-D4O2229X.js +1 -0
- package/dist/dashboard/assets/entry-D4O2229X.js.gz +0 -0
- package/dist/dashboard/assets/entry-DKvr5Q9K.js +1 -0
- package/dist/dashboard/assets/entry-DKvr5Q9K.js.gz +0 -0
- package/dist/dashboard/assets/entry-FQCejoDY.js +4 -0
- package/dist/dashboard/assets/entry-FQCejoDY.js.gz +0 -0
- package/dist/dashboard/assets/eye-C_hawfH4.js.gz +0 -0
- package/dist/dashboard/assets/eye-off-Bk5g2luF.js.gz +0 -0
- package/dist/dashboard/assets/fingerprint-pattern-BWuHtbW4.js.gz +0 -0
- package/dist/dashboard/assets/gauge-BbIMy7MB.js.gz +0 -0
- package/dist/dashboard/assets/github-badge-zliLvBwr.js +1 -0
- package/dist/dashboard/assets/github-badge-zliLvBwr.js.gz +0 -0
- package/dist/dashboard/assets/image-BPaouViG.js.gz +0 -0
- package/dist/dashboard/assets/{index-C4hXfAMs.js → index-CXm3FIyt.js} +2 -2
- package/dist/dashboard/assets/index-CXm3FIyt.js.gz +0 -0
- package/dist/dashboard/assets/{inline-DCejSLlA.js → inline-D1IlZZ8H.js} +1 -1
- package/dist/dashboard/assets/inline-D1IlZZ8H.js.gz +0 -0
- package/dist/dashboard/assets/{input-Bn4_kNav.js → input-BpVZdrbc.js} +1 -1
- package/dist/dashboard/assets/input-BpVZdrbc.js.gz +0 -0
- package/dist/dashboard/assets/jsx-runtime-CXUMngI_.js.gz +0 -0
- package/dist/dashboard/assets/key-round-UkavsGxp.js.gz +0 -0
- package/dist/dashboard/assets/layers-2-glBbjl.js.gz +0 -0
- package/dist/dashboard/assets/{layout-Bv-NxqZ5.js → layout-BioLW7gN.js} +1 -1
- package/dist/dashboard/assets/layout-BioLW7gN.js.gz +0 -0
- package/dist/dashboard/assets/{list-row-BLA0sldD.js → list-row-CwVcGAIc.js} +1 -1
- package/dist/dashboard/assets/list-row-CwVcGAIc.js.gz +0 -0
- package/dist/dashboard/assets/{live-YlifPYox.js → live-yfEJFF9T.js} +1 -1
- package/dist/dashboard/assets/live-yfEJFF9T.js.gz +0 -0
- package/dist/dashboard/assets/log-in-BmRjy60c.js.gz +0 -0
- package/dist/dashboard/assets/message-circle-CCxGwRvv.js.gz +0 -0
- package/dist/dashboard/assets/model-bans-CT-TxSNX.js +1 -0
- package/dist/dashboard/assets/model-bans-CT-TxSNX.js.gz +0 -0
- package/dist/dashboard/assets/mutation-BkoLM5Ba.js +1 -0
- package/dist/dashboard/assets/mutation-BkoLM5Ba.js.gz +0 -0
- package/dist/dashboard/assets/numbers-CFL4_Dqc.js.gz +0 -0
- package/dist/dashboard/assets/pencil-768ysRAr.js.gz +0 -0
- package/dist/dashboard/assets/plus-DIdX_g-x.js.gz +0 -0
- package/dist/dashboard/assets/power-off-Yjw9GMJh.js +1 -0
- package/dist/dashboard/assets/power-off-Yjw9GMJh.js.gz +0 -0
- package/dist/dashboard/assets/privacy-mode-GM8bej85.js +1 -0
- package/dist/dashboard/assets/privacy-mode-GM8bej85.js.gz +0 -0
- package/dist/dashboard/assets/providers/agentrouter.svg.gz +0 -0
- package/dist/dashboard/assets/providers/aihubmix.svg.gz +0 -0
- package/dist/dashboard/assets/providers/alibaba-coding-plan.svg.gz +0 -0
- package/dist/dashboard/assets/providers/alibaba.svg.gz +0 -0
- package/dist/dashboard/assets/providers/antigravity.svg.gz +0 -0
- package/dist/dashboard/assets/providers/bai.svg.gz +0 -0
- package/dist/dashboard/assets/providers/blackbox.svg.gz +0 -0
- package/dist/dashboard/assets/providers/claude-code.svg.gz +0 -0
- package/dist/dashboard/assets/providers/cursor.webp +0 -0
- package/dist/dashboard/assets/providers/exa.svg.gz +0 -0
- package/dist/dashboard/assets/providers/gmi-cloud.svg.gz +0 -0
- package/dist/dashboard/assets/providers/inferhub.svg.gz +0 -0
- package/dist/dashboard/assets/providers/muse.svg.gz +0 -0
- package/dist/dashboard/assets/providers/nous-research.svg.gz +0 -0
- package/dist/dashboard/assets/providers/openai-light.svg.gz +0 -0
- package/dist/dashboard/assets/providers/parallel.svg.gz +0 -0
- package/dist/dashboard/assets/providers/tokenharbor.svg.gz +0 -0
- package/dist/dashboard/assets/providers/trae.webp +0 -0
- package/dist/dashboard/assets/providers/zai-coding-plan.svg.gz +0 -0
- package/dist/dashboard/assets/{query-keys-ROf-g1Wi.js → query-keys-D7wX2vM5.js} +1 -1
- package/dist/dashboard/assets/query-keys-D7wX2vM5.js.gz +0 -0
- package/dist/dashboard/assets/quota-DZGyp0N5.js.gz +0 -0
- package/dist/dashboard/assets/refresh-cw-BqJFk4sU.js.gz +0 -0
- package/dist/dashboard/assets/rotate-ccw-CufcqITi.js.gz +0 -0
- package/dist/dashboard/assets/route-CNSNj9Zm.js.gz +0 -0
- package/dist/dashboard/assets/routing-Cs6jl49L.js +1 -0
- package/dist/dashboard/assets/routing-Cs6jl49L.js.gz +0 -0
- package/dist/dashboard/assets/scaling-nWE4Cx8f.js.gz +0 -0
- package/dist/dashboard/assets/search-JOKus9rb.js.gz +0 -0
- package/dist/dashboard/assets/select-C0Rer3gF.js +41 -0
- package/dist/dashboard/assets/select-C0Rer3gF.js.gz +0 -0
- package/dist/dashboard/assets/settings-CfcTcOyU.js +1 -0
- package/dist/dashboard/assets/settings-CfcTcOyU.js.gz +0 -0
- package/dist/dashboard/assets/shield-check-DVS0Foqh.js.gz +0 -0
- package/dist/dashboard/assets/sparkles-BRaRUxAU.js.gz +0 -0
- package/dist/dashboard/assets/{stack-C1kTcOmP.js → stack-C9_uUjaA.js} +1 -1
- package/dist/dashboard/assets/stack-C9_uUjaA.js.gz +0 -0
- package/dist/dashboard/assets/{state-DHKdg-pm.js → state-DA0B95UQ.js} +1 -1
- package/dist/dashboard/assets/state-DA0B95UQ.js.gz +0 -0
- package/dist/dashboard/assets/stream-retry-5QnVuSSo.js.gz +0 -0
- package/dist/dashboard/assets/{switch-DIDeAiz9.js → switch-Cittxy-x.js} +1 -1
- package/dist/dashboard/assets/switch-Cittxy-x.js.gz +0 -0
- package/dist/dashboard/assets/terminal-Bd4ee8TA.js +1 -0
- package/dist/dashboard/assets/terminal-Bd4ee8TA.js.gz +0 -0
- package/dist/dashboard/assets/toast-CNt_jzO4.js +2 -0
- package/dist/dashboard/assets/toast-CNt_jzO4.js.gz +0 -0
- package/dist/dashboard/assets/tokens-DDxMbSRL.js.gz +0 -0
- package/dist/dashboard/assets/trash-Cppn5c3R.js.gz +0 -0
- package/dist/dashboard/assets/use-clipboard-B0Sy03fE.js.gz +0 -0
- package/dist/dashboard/assets/use-presence-BSZEBx7U.js.gz +0 -0
- package/dist/dashboard/assets/use-reduced-motion-C4B0R6Sz.js.gz +0 -0
- package/dist/dashboard/assets/use-timeout-BwcBBRrT.js.gz +0 -0
- package/dist/dashboard/assets/{useMutation-DVmwOKU-.js → useMutation-BQKMcJ1H.js} +1 -1
- package/dist/dashboard/assets/useMutation-BQKMcJ1H.js.gz +0 -0
- package/dist/dashboard/assets/wrench-B6E1oEuY.js.gz +0 -0
- package/dist/dashboard/index.html +1 -1
- package/dist/dashboard/index.html.gz +0 -0
- package/dist/dashboard/precompressed-assets.json +122 -0
- package/migrations/full-postgres/0013_add_providers_tenant_id_index.sql +22 -0
- package/migrations/full-postgres/0014_add_provider_accounts_tenant_id_index.sql +21 -0
- package/migrations/full-postgres/0015_add_payload_stages.sql +18 -0
- package/migrations/full-postgres/0016_add_share_link_slug.sql +20 -0
- package/migrations/full-postgres/0017_add_models_pro_only.sql +18 -0
- package/migrations/full-postgres/0018_add_accounts_quota_plan.sql +18 -0
- package/migrations/full-postgres/0019_add_models_free_tier.sql +15 -0
- package/migrations/lite-sqlite3/0000_baseline.sql +4 -2
- package/migrations/lite-sqlite3/0013_add_providers_tenant_id_index.sql +4 -0
- package/migrations/lite-sqlite3/0014_add_provider_accounts_tenant_id_index.sql +4 -0
- package/migrations/lite-sqlite3/0015_add_payload_stages.sql +18 -0
- package/migrations/lite-sqlite3/0016_add_share_link_slug.sql +20 -0
- package/migrations/lite-sqlite3/0017_add_models_pro_only.sql +18 -0
- package/migrations/lite-sqlite3/0018_add_accounts_quota_plan.sql +18 -0
- package/migrations/lite-sqlite3/0019_add_models_free_tier.sql +15 -0
- package/package.json +26 -30
- package/scripts/cli/{carte-launcher.cjs → bin/carte.cjs} +8 -8
- package/scripts/cli/{cli-launcher.cjs → bin/cartethyia.cjs} +167 -134
- package/scripts/cli/command/admin.ts +65 -0
- package/scripts/cli/command/console-menu.ts +246 -0
- package/scripts/cli/{doctor.ts → command/doctor.ts} +257 -258
- package/scripts/cli/{setup.ts → command/setup.ts} +8 -12
- package/scripts/cli/command/start.ts +77 -0
- package/scripts/cli/command/tray.ts +165 -0
- package/scripts/cli/command/update.ts +23 -0
- package/scripts/cli/{runtime-state.ts → gateway/drain-token.ts} +78 -78
- package/scripts/cli/gateway/instance-lock.ts +105 -0
- package/scripts/cli/gateway/spawn.ts +173 -0
- package/scripts/cli/gateway/stop.ts +51 -0
- package/scripts/cli/main.ts +94 -0
- package/scripts/cli/support/bun.ts +27 -0
- package/scripts/cli/support/env.ts +99 -0
- package/scripts/cli/support/platform.ts +64 -0
- package/scripts/cli/support/services.ts +88 -0
- package/scripts/cli/support/startup-signal.ts +23 -0
- package/scripts/cli/{version.ts → support/version.ts} +1 -1
- package/scripts/cli/tray/hidden-window.vbs +28 -0
- package/scripts/cli/{tray.ts → tray/index.ts} +3 -3
- package/scripts/cli/{tray.ps1 → tray/windows.ps1} +107 -98
- package/scripts/cli/ui/background.ts +110 -0
- package/src/boot/app.ts +23 -7
- package/src/boot/dependencies.ts +55 -13
- package/src/boot/elysia-typebox-bridge.ts +37 -0
- package/src/boot/lifecycle.ts +2 -0
- package/src/config/cooldowns.ts +138 -138
- package/src/config/providers.ts +31 -5
- package/src/config/runtime.ts +19 -3
- package/src/config/spec.ts +20 -0
- package/src/console/api-keys/contracts.ts +414 -391
- package/src/console/api-keys/routes.ts +880 -870
- package/src/console/auth/account-reset-store.ts +14 -0
- package/src/console/auth/account-reset.ts +3 -2
- package/src/console/auth/setup-service.ts +6 -3
- package/src/console/backup/routes.ts +8 -0
- package/src/console/cli-tools/contracts.ts +6 -6
- package/src/console/console-router.ts +5 -3
- package/src/console/dashboard-assets.ts +81 -11
- package/src/console/domain-registration.ts +9 -2
- package/src/console/observability/contracts.ts +475 -423
- package/src/console/observability/routes.ts +31 -6
- package/src/console/observability/store.ts +1015 -912
- package/src/console/providers/catalog/contracts.ts +31 -0
- package/src/console/providers/catalog/provider-operations.ts +8 -0
- package/src/console/providers/catalog/public-model-store.ts +91 -60
- package/src/console/providers/catalog/store.ts +1532 -1521
- package/src/console/providers/oauth/callback-listener.ts +18 -3
- package/src/console/providers/oauth/routes.ts +38 -15
- package/src/console/quota/account-quota-tenant.ts +9 -6
- package/src/console/quota/refresh.ts +19 -0
- package/src/console/response-compression.ts +69 -2
- package/src/console/routing/pools/probe-verdict.ts +72 -0
- package/src/console/share/share-router.ts +7 -4
- package/src/console/share/share-stats.ts +12 -5
- package/src/console/shared/read-through-cache.ts +133 -7
- package/src/console/updates/repository-updates.ts +39 -34
- package/src/console/updates/routes.ts +162 -4
- package/src/main.ts +3 -0
- package/src/network/http2-bidi.ts +85 -0
- package/src/network/outbound-fetch.ts +87 -24
- package/src/network/pool/agent.ts +478 -460
- package/src/network/pool/resolver.ts +1104 -544
- package/src/network/pool-health-machine.ts +12 -5
- package/src/observability/event-log.ts +29 -8
- package/src/observability/metrics.ts +40 -13
- package/src/observability/payload-capture.ts +344 -324
- package/src/observability/runtime-metrics.ts +7 -0
- package/src/persistence/db-pg.ts +9 -3
- package/src/persistence/db-sqlite.ts +497 -495
- package/src/persistence/health-event-flush.ts +137 -0
- package/src/persistence/migrate.ts +181 -129
- package/src/persistence/schema.ts +1360 -1257
- package/src/persistence/settings-revision.ts +25 -0
- package/src/persistence/shared-cache.ts +217 -0
- package/src/persistence/stores/share-store.ts +556 -528
- package/src/persistence/usage-flush.ts +61 -1
- package/src/protocol/canonical-model.ts +23 -1
- package/src/protocol/response/chat.ts +143 -10
- package/src/protocol/response/codex.ts +9 -75
- package/src/protocol/response/omp-tool-call-markup.ts +221 -0
- package/src/protocol/tool-identity.ts +43 -9
- package/src/providers/authentication/jwt-validator.ts +130 -187
- package/src/providers/authentication/oauth-flow-store.ts +16 -9
- package/src/providers/default-registry.ts +177 -1
- package/src/providers/discovery/catalog/catalog-format.ts +20 -0
- package/src/providers/discovery/models-dev-catalog.ts +39 -22
- package/src/providers/discovery/openai-model-discovery.ts +39 -3
- package/src/providers/discovery/openrouter-free-roster.ts +98 -0
- package/src/providers/discovery/probe-wire.ts +29 -5
- package/src/providers/discovery/probing-service.ts +1022 -1001
- package/src/providers/integrations/buddy/buddy-catalog-shared.ts +42 -2
- package/src/providers/integrations/buddy/buddy-chat-shared.ts +913 -914
- package/src/providers/integrations/buddy/buddy-cli-headers.ts +88 -0
- package/src/providers/integrations/buddy/buddy-conversation-headers.ts +22 -5
- package/src/providers/integrations/buddy/buddy-discovery-shared.ts +33 -1
- package/src/providers/integrations/buddy/buddy-identity.ts +46 -0
- package/src/providers/integrations/buddy/buddy-oauth-shared.ts +37 -1
- package/src/providers/integrations/buddy/buddy-usage-store.ts +40 -5
- package/src/providers/integrations/buddy/codebuddy/cn-provider.ts +4 -0
- package/src/providers/integrations/buddy/codebuddy/provider.ts +180 -175
- package/src/providers/integrations/buddy/codebuddy/shared.ts +115 -73
- package/src/providers/integrations/buddy/workbuddy/cn-provider.ts +5 -2
- package/src/providers/integrations/buddy/workbuddy/provider.ts +206 -204
- package/src/providers/integrations/buddy/workbuddy/quota.ts +172 -159
- package/src/providers/integrations/buddy/workbuddy/shared.ts +200 -171
- package/src/providers/integrations/claude/claude.ts +606 -582
- package/src/providers/integrations/cline/cline-quota.ts +18 -16
- package/src/providers/integrations/cline/cline.ts +539 -468
- package/src/providers/integrations/codex/codex.ts +5 -8
- package/src/providers/integrations/commandcode/commandcode.ts +675 -541
- package/src/providers/integrations/commandcode/discovery.ts +116 -0
- package/src/providers/integrations/commandcode/quota.ts +160 -0
- package/src/providers/integrations/cursor/cursor-auth.ts +418 -0
- package/src/providers/integrations/cursor/cursor-catalog.ts +368 -0
- package/src/providers/integrations/cursor/cursor-http2.ts +300 -0
- package/src/providers/integrations/cursor/cursor-identity.ts +92 -0
- package/src/providers/integrations/cursor/cursor-request.ts +471 -0
- package/src/providers/integrations/cursor/cursor-session-manager.ts +281 -0
- package/src/providers/integrations/cursor/cursor-shared.ts +108 -0
- package/src/providers/integrations/cursor/cursor.ts +960 -0
- package/src/providers/integrations/cursor/protocol/framing.ts +129 -0
- package/src/providers/integrations/cursor/protocol/messages.ts +2355 -0
- package/src/providers/integrations/cursor/protocol/struct.ts +305 -0
- package/src/providers/integrations/factory/factory-oauth.ts +7 -11
- package/src/providers/integrations/github/github.ts +4 -4
- package/src/providers/integrations/hermes.ts +79 -8
- package/src/providers/integrations/kilo/kilo-discovery.ts +10 -1
- package/src/providers/integrations/kilo/kilo.ts +153 -146
- package/src/providers/integrations/opencode/opencode-go-quota.ts +130 -0
- package/src/providers/integrations/opencode/provider.ts +532 -499
- package/src/providers/integrations/openrouter/provider.ts +139 -281
- package/src/providers/integrations/qoder/qoder-catalog.ts +450 -0
- package/src/providers/integrations/qoder/qoder-oauth.ts +310 -263
- package/src/providers/integrations/qoder/qoder-realm.ts +106 -0
- package/src/providers/integrations/qoder/qoder-virtual.ts +77 -0
- package/src/providers/integrations/qoder/qoder.ts +865 -730
- package/src/providers/integrations/shared/install-id.ts +29 -2
- package/src/providers/integrations/trae/trae-catalog.ts +190 -0
- package/src/providers/integrations/trae/trae-headers.ts +149 -0
- package/src/providers/integrations/trae/trae-oauth.ts +773 -0
- package/src/providers/integrations/trae/trae-protocol.ts +400 -0
- package/src/providers/integrations/trae/trae-realm.ts +220 -0
- package/src/providers/integrations/trae/trae.ts +458 -0
- package/src/providers/operations/account-health-service.ts +107 -10
- package/src/providers/operations/client-versions.ts +143 -6
- package/src/providers/operations/model-catalog-cache.ts +18 -3
- package/src/providers/operations/provider-catalog-seeder.ts +95 -86
- package/src/providers/operations/provider-catalog-service.ts +76 -0
- package/src/providers/operations/provider-credential-service.ts +46 -7
- package/src/providers/provider-contracts.ts +76 -0
- package/src/providers/provider-metadata.ts +78 -6
- package/src/providers/provider-model-definition.ts +373 -349
- package/src/security/api-key-auth.ts +126 -8
- package/src/transport/contracts.ts +3 -0
- package/src/transport/dispatch/attempt-finalize.ts +39 -2
- package/src/transport/dispatch/attempt-loop.ts +530 -513
- package/src/transport/dispatch/empty-stream.ts +17 -26
- package/src/transport/dispatch/generation.ts +88 -21
- package/src/transport/dispatch/leases.ts +99 -2
- package/src/transport/dispatch/proxy-request.ts +60 -3
- package/src/transport/dispatch/streaming/finalize.ts +16 -1
- package/src/transport/dispatch/streaming/stream.ts +22 -2
- package/src/transport/dispatch/upstream.ts +19 -1
- package/src/transport/failure-policy.ts +20 -0
- package/src/transport/guards/auth-guard.ts +26 -1
- package/src/transport/guards/body-policy.ts +5 -4
- package/src/transport/request/preparer.ts +103 -0
- package/src/transport/request/state.ts +14 -0
- package/src/transport/routing/plan-gate.ts +45 -0
- package/src/transport/routing/route-catalog.ts +799 -738
- package/src/transport/routing/route-model.ts +52 -1
- package/src/transport/routing/router.ts +51 -0
- package/src/transport/surface/chat/encode.ts +18 -31
- package/src/transport/surface/messages/stream.ts +3 -2
- package/src/transport/translation/tool-repair.ts +37 -16
- package/src/workers/account-identity-sweep.ts +14 -12
- package/src/workers/daily-checkin.ts +62 -0
- package/src/workers/quota-refresh-sweep.ts +27 -2
- package/dist/dashboard/assets/BannedPage-DUrXpp-X.js +0 -1
- package/dist/dashboard/assets/CombosPage-B7ETkfVH.js +0 -1
- package/dist/dashboard/assets/ConsoleLogPage-AisQzCI1.js +0 -1
- package/dist/dashboard/assets/HealthEventsModal-BNflDm_f.js +0 -1
- package/dist/dashboard/assets/ModelPicker-CAiPR5Vd.js +0 -1
- package/dist/dashboard/assets/OverviewPage-C3NIzsDx.js +0 -1
- package/dist/dashboard/assets/ProviderDetailPage-BK8i5B5X.js +0 -3
- package/dist/dashboard/assets/ProviderIcon-paOCq8I0.js +0 -1
- package/dist/dashboard/assets/ProvidersPage-CvCVgm1e.js +0 -1
- package/dist/dashboard/assets/ProxyPage-DjabkuzP.js +0 -7
- package/dist/dashboard/assets/QuotaPage-Dxe0B0iu.js +0 -1
- package/dist/dashboard/assets/SetupPage-BaD4P_jW.js +0 -1
- package/dist/dashboard/assets/StudioPage-CLP4le3U.js +0 -31
- package/dist/dashboard/assets/UsagePage-Djes-Epy.js +0 -56
- package/dist/dashboard/assets/api-keys-CjIGQhe7.js +0 -1
- package/dist/dashboard/assets/app-Cjgo4-Lf.css +0 -2
- package/dist/dashboard/assets/assert-Bwh6DJTK.js +0 -1
- package/dist/dashboard/assets/cli-tools-DccaOfhX.js +0 -1
- package/dist/dashboard/assets/clipboard-button-DQmMikNQ.js +0 -1
- package/dist/dashboard/assets/entry-Cpi0rph1.js +0 -4
- package/dist/dashboard/assets/entry-Dm3PpDCO.js +0 -1
- package/dist/dashboard/assets/entry-keNDZ_Wz.js +0 -1
- package/dist/dashboard/assets/github-badge-BuAJr8oU.js +0 -1
- package/dist/dashboard/assets/model-bans-CVvHZ-qz.js +0 -1
- package/dist/dashboard/assets/mutation-BIizFZav.js +0 -1
- package/dist/dashboard/assets/privacy-mode-CQjbZ3xk.js +0 -1
- package/dist/dashboard/assets/routing-jntw9-Ui.js +0 -1
- package/dist/dashboard/assets/select-CGUuTQmj.js +0 -41
- package/dist/dashboard/assets/settings-BAS6QbmJ.js +0 -1
- package/dist/dashboard/assets/sliders-horizontal-ClG7dBeJ.js +0 -1
- package/dist/dashboard/assets/terminal-C9mZ4Ugm.js +0 -1
- package/dist/dashboard/assets/toast-DKAdP2mo.js +0 -2
- package/scripts/cli/cli.ts +0 -771
- package/scripts/operations/probe-egress.ts +0 -335
- package/scripts/operations/restart.ts +0 -120
- package/scripts/shared/env.ts +0 -269
- /package/{tray-assets → scripts/cli/tray/assets}/cartethyia.ico +0 -0
- /package/{tray-assets → scripts/cli/tray/assets}/cartethyia.png +0 -0
- /package/scripts/cli/{menu.ts → ui/prompt.ts} +0 -0
- /package/scripts/cli/{wordmark.ts → ui/wordmark.ts} +0 -0
|
@@ -1,175 +1,180 @@
|
|
|
1
|
-
// CodeBuddy International adapter — exact provider contract.
|
|
2
|
-
// Canonical provider ID: cb
|
|
3
|
-
// Base (manifest-owned CODEBUDDY_BASE_URL) → Chat: base + /chat/completions
|
|
4
|
-
// Auth: Authorization Bearer for both api_key and oauth
|
|
5
|
-
// Stream: force stream=true upstream, factory reaggregates for non-stream callers
|
|
6
|
-
// Headers: per-provider CodeBuddy headers with fresh correlation IDs per dispatch
|
|
7
|
-
// Payload: leading CodeBuddy system prompt + typed user content, reasoning_summary auto only when reasoning_effort
|
|
8
|
-
|
|
9
|
-
import { BuddyMediaAdapter } from "../buddy-media";
|
|
10
|
-
import type { ProviderDispatchContext, ProviderDispatchTarget, ProviderAdapter } from "../../../provider-contracts";
|
|
11
|
-
import type { ModelDefinition } from "../../../provider-model-definition";
|
|
12
|
-
import type { DiscoveryInput } from "../../../discovery/discovery-types";
|
|
13
|
-
import { GatewayError } from "../../../../protocol/gateway-error";
|
|
14
|
-
import type { CanonicalRequest } from "../../../../protocol/canonical-model";
|
|
15
|
-
import { providerBaseUrl } from "../../../provider-metadata";
|
|
16
|
-
import {
|
|
17
|
-
codebuddyAdapterConfig,
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
import {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
export const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
//
|
|
43
|
-
// -
|
|
44
|
-
// -
|
|
45
|
-
// -
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
"
|
|
65
|
-
"
|
|
66
|
-
"
|
|
67
|
-
"
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
*
|
|
98
|
-
*
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
"
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
*
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
"
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
*
|
|
123
|
-
*
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
...
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
-
*
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
...(input.
|
|
153
|
-
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
//
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
1
|
+
// CodeBuddy International adapter — exact provider contract.
|
|
2
|
+
// Canonical provider ID: cb
|
|
3
|
+
// Base (manifest-owned CODEBUDDY_BASE_URL) → Chat: base + /chat/completions
|
|
4
|
+
// Auth: Authorization Bearer for both api_key and oauth
|
|
5
|
+
// Stream: force stream=true upstream, factory reaggregates for non-stream callers
|
|
6
|
+
// Headers: per-provider CodeBuddy headers with fresh correlation IDs per dispatch
|
|
7
|
+
// Payload: leading CodeBuddy system prompt + typed user content, reasoning_summary auto only when reasoning_effort
|
|
8
|
+
|
|
9
|
+
import { BuddyMediaAdapter } from "../buddy-media";
|
|
10
|
+
import type { ProviderDispatchContext, ProviderDispatchTarget, ProviderAdapter } from "../../../provider-contracts";
|
|
11
|
+
import type { ModelDefinition } from "../../../provider-model-definition";
|
|
12
|
+
import type { DiscoveryInput } from "../../../discovery/discovery-types";
|
|
13
|
+
import { GatewayError } from "../../../../protocol/gateway-error";
|
|
14
|
+
import type { CanonicalRequest } from "../../../../protocol/canonical-model";
|
|
15
|
+
import { providerBaseUrl } from "../../../provider-metadata";
|
|
16
|
+
import {
|
|
17
|
+
codebuddyAdapterConfig,
|
|
18
|
+
codebuddyHeaders,
|
|
19
|
+
} from "./shared";
|
|
20
|
+
import {
|
|
21
|
+
BUDDY_SHARED_RAW,
|
|
22
|
+
BUDDY_IMAGE_MODEL_ID_SET,
|
|
23
|
+
BUDDY_VIDEO_MODEL_ID_SET,
|
|
24
|
+
makeBuddyModel,
|
|
25
|
+
makeBuddyImageModels,
|
|
26
|
+
makeBuddyVideoModels,
|
|
27
|
+
type BuddyRawEntry,
|
|
28
|
+
} from "../buddy-catalog-shared";
|
|
29
|
+
import { BUDDY_INTL_MODELS_PATH, fetchBuddyDirectoryModels } from "../buddy-discovery-shared";
|
|
30
|
+
import {
|
|
31
|
+
applyBuddySystemPrompt,
|
|
32
|
+
buddyPrePayloadCommon,
|
|
33
|
+
normalizeBuddyToolNames,
|
|
34
|
+
} from "../buddy-chat-shared";
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
// Constants — public contract
|
|
38
|
+
export const CODEBUDDY_PROVIDER_ID = "cb" as const;
|
|
39
|
+
export const CODEBUDDY_BASE_URL = providerBaseUrl("cb");
|
|
40
|
+
// Upstream model translation — preserve provider mapping
|
|
41
|
+
|
|
42
|
+
// Payload hook — provider intl semantics
|
|
43
|
+
// - force stream=true
|
|
44
|
+
// - reasoning_summary auto only when reasoning_effort requested
|
|
45
|
+
// - upstreamId translation
|
|
46
|
+
// - leading CodeBuddy system prompt + typed user content normalization
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Leading system turn for this variant.
|
|
50
|
+
*
|
|
51
|
+
* The upstream validates that the wire *opens* with a `system` turn (code
|
|
52
|
+
* `11128`) but does not check its text — the CN variant installs a plain
|
|
53
|
+
* engineering-assistant sentence in the same slot and the gateway accepts it.
|
|
54
|
+
* So this text is a product choice rather than a wire contract, and the
|
|
55
|
+
* previous vendor-branded line ("You are CodeBuddy Code.") made every request
|
|
56
|
+
* claim an identity the caller never chose, while also discarding whatever
|
|
57
|
+
* system prompt the caller actually sent.
|
|
58
|
+
*
|
|
59
|
+
* The prompt is therefore a neutral assistant identity with an explicit
|
|
60
|
+
* persona: pragmatic, direct, and honest — no sycophancy, no hedging, no
|
|
61
|
+
* invented certainty.
|
|
62
|
+
*/
|
|
63
|
+
export const CODEBUDDY_SYSTEM_PROMPT =
|
|
64
|
+
"You are a pragmatic and direct software engineering assistant. " +
|
|
65
|
+
"Be honest and truthful: state what you know, say plainly when you are unsure " +
|
|
66
|
+
"or do not know, and never claim to have done something you have not done. " +
|
|
67
|
+
"Prefer concrete answers over filler, and say so when a request is ambiguous " +
|
|
68
|
+
"instead of guessing silently.";
|
|
69
|
+
|
|
70
|
+
function codeBuddyIntlPrePayload(
|
|
71
|
+
payload: Record<string, unknown>,
|
|
72
|
+
request: CanonicalRequest,
|
|
73
|
+
candidate: ProviderDispatchTarget,
|
|
74
|
+
context?: ProviderDispatchContext,
|
|
75
|
+
): void {
|
|
76
|
+
// International ladder: DeepSeek Flash and friends serve only `high`.
|
|
77
|
+
buddyPrePayloadCommon(payload, request, "intl", context);
|
|
78
|
+
const rawModel = payload["model"];
|
|
79
|
+
const source =
|
|
80
|
+
typeof rawModel === "string" && rawModel.length > 0
|
|
81
|
+
? rawModel
|
|
82
|
+
: candidate.model_id;
|
|
83
|
+
if (!source) throw new GatewayError("invalid_request", 400, "CodeBuddy model is required");
|
|
84
|
+
const messages = payload["messages"];
|
|
85
|
+
if (Array.isArray(messages)) {
|
|
86
|
+
applyBuddySystemPrompt(messages as Array<Record<string, unknown>>, CODEBUDDY_SYSTEM_PROMPT);
|
|
87
|
+
}
|
|
88
|
+
normalizeBuddyToolNames(payload);
|
|
89
|
+
void request;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Model catalog — shared CodeBuddy / WorkBuddy international roster
|
|
93
|
+
|
|
94
|
+
const CODEBUDDY_INTL_RAW: readonly BuddyRawEntry[] = BUDDY_SHARED_RAW;
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* CodeBuddy's image generation rows.
|
|
98
|
+
*
|
|
99
|
+
* These ids also sit on the shared chat roster as ordinary `llm` rows, which is
|
|
100
|
+
* why they were unreachable as image models: nothing downstream could tell a
|
|
101
|
+
* chat model from one that returns an image, so `mediaGeneration` was false for
|
|
102
|
+
* every catalog row. The roster and the declared capabilities come from
|
|
103
|
+
* {@link makeBuddyImageModels} so cb and WorkBuddy cannot drift.
|
|
104
|
+
*/
|
|
105
|
+
export const CODEBUDDY_IMAGE_MODELS: readonly ModelDefinition[] = makeBuddyImageModels(
|
|
106
|
+
"cb",
|
|
107
|
+
"/images/generations",
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* CodeBuddy's video-generation rows (`seedance-2.5`).
|
|
112
|
+
*
|
|
113
|
+
* Reached through `/videos/generations` on the `/v2` base, so the endpoint is
|
|
114
|
+
* the upstream video path rather than a chat-completions path.
|
|
115
|
+
*/
|
|
116
|
+
export const CODEBUDDY_VIDEO_MODELS: readonly ModelDefinition[] = makeBuddyVideoModels(
|
|
117
|
+
"cb",
|
|
118
|
+
"/videos/generations",
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* The full cb catalog the registry loads: chat roster plus image and video rows.
|
|
123
|
+
*
|
|
124
|
+
* The image and video ids are filtered out of the chat pass so one id never
|
|
125
|
+
* appears under two service kinds. Exported as a single list so
|
|
126
|
+
* `default-registry.ts` keeps one import for this provider.
|
|
127
|
+
*/
|
|
128
|
+
export const CODEBUDDY_MODELS: readonly ModelDefinition[] = [
|
|
129
|
+
...CODEBUDDY_INTL_RAW.filter(
|
|
130
|
+
(entry) => !BUDDY_IMAGE_MODEL_ID_SET.has(entry[0]) && !BUDDY_VIDEO_MODEL_ID_SET.has(entry[0]),
|
|
131
|
+
).map((entry) => makeBuddyModel(entry, "cb")),
|
|
132
|
+
...CODEBUDDY_IMAGE_MODELS,
|
|
133
|
+
...CODEBUDDY_VIDEO_MODELS,
|
|
134
|
+
];
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Reads the CodeBuddy intl console directory.
|
|
138
|
+
*
|
|
139
|
+
* The static `CODEBUDDY_MODELS` above stays the fallback — this console is
|
|
140
|
+
* documented to answer 500 intermittently — while discovery carries the
|
|
141
|
+
* upstream's own limits and capability flags.
|
|
142
|
+
*/
|
|
143
|
+
export async function discoverCodeBuddyModels(
|
|
144
|
+
input: DiscoveryInput,
|
|
145
|
+
): Promise<readonly ModelDefinition[] | null> {
|
|
146
|
+
return fetchBuddyDirectoryModels({
|
|
147
|
+
siteUrl: CODEBUDDY_BASE_URL,
|
|
148
|
+
providerId: CODEBUDDY_PROVIDER_ID,
|
|
149
|
+
credential: input.credential,
|
|
150
|
+
modelsPath: BUDDY_INTL_MODELS_PATH,
|
|
151
|
+
endpoint: undefined,
|
|
152
|
+
...(input.signal ? { signal: input.signal } : {}),
|
|
153
|
+
...(input.fetcher ? { fetcher: input.fetcher } : {}),
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Public factory — uses OpenAI-compatible factory but forces provider semantics
|
|
158
|
+
// Supports both api_key and oauth via Authorization Bearer (factory handles both)
|
|
159
|
+
|
|
160
|
+
export function createCodeBuddyAdapter(fetchImpl?: typeof fetch): ProviderAdapter {
|
|
161
|
+
return new BuddyMediaAdapter(
|
|
162
|
+
codebuddyAdapterConfig({
|
|
163
|
+
providerId: CODEBUDDY_PROVIDER_ID,
|
|
164
|
+
baseUrl: CODEBUDDY_BASE_URL,
|
|
165
|
+
variant: "IDE",
|
|
166
|
+
cliIdentity: true,
|
|
167
|
+
prePayload: codeBuddyIntlPrePayload,
|
|
168
|
+
...(fetchImpl ? { fetchImpl } : {}),
|
|
169
|
+
}),
|
|
170
|
+
{
|
|
171
|
+
variant: "IDE",
|
|
172
|
+
// BuddyMediaConfig has no `cliIdentity`; the CLI identity is selected by
|
|
173
|
+
// supplying the builder that takes it.
|
|
174
|
+
buildHeaders: (context, request) => codebuddyHeaders("IDE", context, request, true),
|
|
175
|
+
systemPrompt: CODEBUDDY_SYSTEM_PROMPT,
|
|
176
|
+
baseUrl: CODEBUDDY_BASE_URL,
|
|
177
|
+
imageGenerationPath: "/images/generations",
|
|
178
|
+
},
|
|
179
|
+
);
|
|
180
|
+
}
|
|
@@ -1,73 +1,115 @@
|
|
|
1
|
-
import { withBearerAuthentication, type OpenAICompatibleAdapterConfig } from "../../../adapters/compatible-adapter";
|
|
2
|
-
import type { CanonicalRequest } from "../../../../protocol/canonical-model";
|
|
3
|
-
import type { ProviderDispatchContext, ProviderDispatchTarget, ProviderId } from "../../../provider-contracts";
|
|
4
|
-
import { resolveInboundSessionId } from "../../../operations/session-resolution";
|
|
5
|
-
import { buddyConversationHeaders } from "../buddy-conversation-headers";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
export
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
*
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
}
|
|
66
|
-
return
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
1
|
+
import { withBearerAuthentication, type OpenAICompatibleAdapterConfig } from "../../../adapters/compatible-adapter";
|
|
2
|
+
import type { CanonicalRequest } from "../../../../protocol/canonical-model";
|
|
3
|
+
import type { ProviderDispatchContext, ProviderDispatchTarget, ProviderId } from "../../../provider-contracts";
|
|
4
|
+
import { resolveInboundSessionId } from "../../../operations/session-resolution";
|
|
5
|
+
import { buddyConversationHeaders } from "../buddy-conversation-headers";
|
|
6
|
+
import { buddyUserId, resolveBuddyIdentity } from "../buddy-identity";
|
|
7
|
+
import { buildCodeBuddyUserAgent, getCodeBuddyCnVersion, getCodeBuddyVersion } from "../../../operations/client-versions";
|
|
8
|
+
import { readBuddyDeviceToken } from "../workbuddy/shared";
|
|
9
|
+
import { buddyCliHeaders, buddyCliTraceHeaders } from "../buddy-cli-headers";
|
|
10
|
+
|
|
11
|
+
/** Client identity variant behind the per-request CodeBuddy headers. */
|
|
12
|
+
export type CodeBuddyVariant = "IDE" | "CLI";
|
|
13
|
+
|
|
14
|
+
export function codebuddyDomain(variant: CodeBuddyVariant): string {
|
|
15
|
+
return variant === "IDE" ? "www.codebuddy.ai" : "copilot.tencent.com";
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Per-request CodeBuddy headers — exact provider contract shared by the
|
|
21
|
+
* international (IDE identity) and CN (CLI identity). The stable conversation
|
|
22
|
+
* header is preserved from the client when available; request IDs rotate.
|
|
23
|
+
*
|
|
24
|
+
* `cliIdentity` selects the real CLI contract rather than today's hybrid: the
|
|
25
|
+
* reference CLI is issued by the OpenAI Node SDK, so it carries no browser
|
|
26
|
+
* headers and no device token, and it adds the agent envelope. Left unset it
|
|
27
|
+
* keeps the current behaviour for every provider.
|
|
28
|
+
*/
|
|
29
|
+
export async function codebuddyHeaders(
|
|
30
|
+
variant: CodeBuddyVariant,
|
|
31
|
+
context?: ProviderDispatchContext,
|
|
32
|
+
request?: CanonicalRequest,
|
|
33
|
+
cliIdentity?: boolean,
|
|
34
|
+
): Promise<Record<string, string>> {
|
|
35
|
+
const identity = variant === "IDE" ? "IDE" : "CLI";
|
|
36
|
+
const ua = buildCodeBuddyUserAgent(identity);
|
|
37
|
+
const deviceToken = readBuddyDeviceToken(context);
|
|
38
|
+
const conversationId = resolveInboundSessionId(context, request);
|
|
39
|
+
const conversation = buddyConversationHeaders({
|
|
40
|
+
...(conversationId === undefined ? {} : { conversationId }),
|
|
41
|
+
});
|
|
42
|
+
if (resolveBuddyIdentity(context, cliIdentity) === "cli") {
|
|
43
|
+
return {
|
|
44
|
+
// The CLI sends `Accept: application/json` and no device token. The
|
|
45
|
+
// browser-shaped pair (`X-Requested-With`, `x-codebuddy-request`) stays
|
|
46
|
+
// off this branch: a request carrying both halves is a hybrid no real
|
|
47
|
+
// client produces, and that is a fidelity choice, not a requirement —
|
|
48
|
+
// the live API answers either way.
|
|
49
|
+
accept: "application/json",
|
|
50
|
+
"User-Agent": `CLI/${getCodeBuddyVersion()} CodeBuddy/${getCodeBuddyVersion()}`,
|
|
51
|
+
"X-Product": "SaaS",
|
|
52
|
+
"X-IDE-Type": "CLI",
|
|
53
|
+
"X-IDE-Name": "CLI",
|
|
54
|
+
"X-IDE-Version": getCodeBuddyVersion(),
|
|
55
|
+
"X-Domain": codebuddyDomain(variant),
|
|
56
|
+
// The conversation purpose the reference client states. Not required —
|
|
57
|
+
// verified against the live API that a request succeeds without it — but
|
|
58
|
+
// it is part of the client's real request, and matching the client is the
|
|
59
|
+
// defence against a channel check tightening later.
|
|
60
|
+
"X-Agent-Purpose": "conversation",
|
|
61
|
+
...conversation,
|
|
62
|
+
...buddyCliTraceHeaders(conversation),
|
|
63
|
+
...buddyCliHeaders({ userId: buddyUserId(context) }),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
accept: "text/event-stream",
|
|
68
|
+
"User-Agent": ua,
|
|
69
|
+
"X-Product": "SaaS",
|
|
70
|
+
"X-IDE-Type": identity,
|
|
71
|
+
"X-IDE-Name": identity,
|
|
72
|
+
// Every reference branch sends this, in both the desktop and the CLI
|
|
73
|
+
// product; its absence here is what made a CodeBuddy dispatch the only
|
|
74
|
+
// buddy caller with no client version on the wire.
|
|
75
|
+
"X-IDE-Version": identity === "CLI" ? getCodeBuddyCnVersion() : getCodeBuddyVersion(),
|
|
76
|
+
"X-Domain": codebuddyDomain(variant),
|
|
77
|
+
"x-requested-with": "XMLHttpRequest",
|
|
78
|
+
"x-codebuddy-request": "1",
|
|
79
|
+
// Same value the CLI branch sends, for the same reason: part of the
|
|
80
|
+
// client's real request, harmless when the channel check does not read it.
|
|
81
|
+
"X-Agent-Purpose": "conversation",
|
|
82
|
+
// Same family WorkBuddy sends: the upstream's channel check reads the
|
|
83
|
+
// turn-level aggregation key, and a chat request without it is refused for a
|
|
84
|
+
// missing conversation id.
|
|
85
|
+
...conversation,
|
|
86
|
+
...(deviceToken === undefined ? {} : { "X-Device-Token": deviceToken }),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Shared OpenAI-compatible chat-adapter config for both CodeBuddy variants:
|
|
92
|
+
* bearer auth, chat-only wire contract, per-request identity headers, and the
|
|
93
|
+
* variant's payload hook.
|
|
94
|
+
*/
|
|
95
|
+
export function codebuddyAdapterConfig(args: {
|
|
96
|
+
providerId: ProviderId;
|
|
97
|
+
baseUrl: string;
|
|
98
|
+
variant: CodeBuddyVariant;
|
|
99
|
+
prePayload: (
|
|
100
|
+
payload: Record<string, unknown>,
|
|
101
|
+
request: CanonicalRequest,
|
|
102
|
+
candidate: ProviderDispatchTarget,
|
|
103
|
+
) => void;
|
|
104
|
+
fetchImpl?: typeof fetch;
|
|
105
|
+
cliIdentity?: boolean;
|
|
106
|
+
}): OpenAICompatibleAdapterConfig {
|
|
107
|
+
return withBearerAuthentication({
|
|
108
|
+
provider_id: args.providerId,
|
|
109
|
+
base_url: args.baseUrl,
|
|
110
|
+
buildExtraHeaders: (context, request) =>
|
|
111
|
+
codebuddyHeaders(args.variant, context, request, args.cliIdentity),
|
|
112
|
+
prePayload: args.prePayload,
|
|
113
|
+
...(args.fetchImpl ? { fetchImpl: args.fetchImpl } : {}),
|
|
114
|
+
});
|
|
115
|
+
}
|
|
@@ -5,7 +5,7 @@ import type { DiscoveryInput } from "../../../discovery/discovery-types";
|
|
|
5
5
|
import type { ModelDefinition } from "../../../provider-model-definition";
|
|
6
6
|
import { providerBaseUrl } from "../../../provider-metadata";
|
|
7
7
|
import { getWorkBuddyCnClientVersion } from "../../../operations/client-versions";
|
|
8
|
-
import {
|
|
8
|
+
import { BUDDY_CN_MODELS_PATH, fetchBuddyDirectoryModels } from "../buddy-discovery-shared";
|
|
9
9
|
import { CODEBUDDY_CN_MODELS } from "../codebuddy/cn-provider";
|
|
10
10
|
import { workbuddyPrePayload, WORKBUDDY_SYSTEM_PROMPT } from "./provider";
|
|
11
11
|
import { workbuddyAdapterConfig, workbuddyHeaders, WORKBUDDY_CHAT_PATH } from "./shared";
|
|
@@ -28,7 +28,10 @@ export async function discoverWorkBuddyCnModels(
|
|
|
28
28
|
siteUrl: WORKBUDDY_CN_BASE_URL,
|
|
29
29
|
providerId: WORKBUDDY_CN_PROVIDER_ID,
|
|
30
30
|
credential: input.credential,
|
|
31
|
-
|
|
31
|
+
// The CN host answers the `/console/…` directory, exactly like the CodeBuddy
|
|
32
|
+
// CN host does; the international path was inherited from the intl provider
|
|
33
|
+
// and the CN edge answers it with a 500 rather than a 404.
|
|
34
|
+
modelsPath: BUDDY_CN_MODELS_PATH,
|
|
32
35
|
endpoint: WORKBUDDY_CHAT_PATH,
|
|
33
36
|
...(input.signal ? { signal: input.signal } : {}),
|
|
34
37
|
...(input.fetcher ? { fetcher: input.fetcher } : {}),
|