cartethyia 0.0.0-stage → 2.3.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 +124 -0
- package/LICENSE +674 -0
- package/README.md +79 -2
- package/dist/dashboard/assets/AccountCooldown-ChpdzxRH.js +1 -0
- package/dist/dashboard/assets/BannedPage-ClPA4nQv.js +1 -0
- package/dist/dashboard/assets/CliToolDetailPage-Bevb0yY1.js +1 -0
- package/dist/dashboard/assets/CliToolsPage-DsryPzyc.js +1 -0
- package/dist/dashboard/assets/CombosPage-B7ETkfVH.js +1 -0
- package/dist/dashboard/assets/ConsoleLogPage-CTzqdm6k.js +1 -0
- package/dist/dashboard/assets/CustomizationPage-CMxyDZej.js +1 -0
- package/dist/dashboard/assets/HealthEventsModal-CxkQ4JaG.js +1 -0
- package/dist/dashboard/assets/LoginPage-CL2GR7wU.js +1 -0
- package/dist/dashboard/assets/ModelPicker-CAiPR5Vd.js +1 -0
- package/dist/dashboard/assets/OverviewPage-b0Ggk2qb.js +1 -0
- package/dist/dashboard/assets/ProviderDetailPage-Y1Q4UPbO.js +3 -0
- package/dist/dashboard/assets/ProviderIcon-paOCq8I0.js +1 -0
- package/dist/dashboard/assets/ProvidersPage-C-GI5Qrf.js +1 -0
- package/dist/dashboard/assets/ProxyPage-d7vbm79h.js +7 -0
- package/dist/dashboard/assets/QuotaPage-BmLGXSiw.js +1 -0
- package/dist/dashboard/assets/SettingsPage-YxRml8AT.js +1 -0
- package/dist/dashboard/assets/SetupPage-BZ2NsM8f.js +1 -0
- package/dist/dashboard/assets/SortableList-Bol1ASmI.js +1 -0
- package/dist/dashboard/assets/StudioPage-txsvSOwb.js +31 -0
- package/dist/dashboard/assets/ToolIcon-K1ckcDKg.js +1 -0
- package/dist/dashboard/assets/UsagePage-D8C_HZBY.js +56 -0
- package/dist/dashboard/assets/api-keys-CjIGQhe7.js +1 -0
- package/dist/dashboard/assets/app-BDJWMThu.js +9 -0
- package/dist/dashboard/assets/app-Cjgo4-Lf.css +2 -0
- package/dist/dashboard/assets/arrow-left-CpBxkoxI.js +1 -0
- package/dist/dashboard/assets/arrow-right-Dl5yKnp8.js +1 -0
- package/dist/dashboard/assets/assert-Bwh6DJTK.js +1 -0
- package/dist/dashboard/assets/backup-file-gdKIlg8U.js +1 -0
- package/dist/dashboard/assets/badge-BwmwEOgA.js +1 -0
- package/dist/dashboard/assets/banner-BKBfKTqn.js +1 -0
- package/dist/dashboard/assets/brain-Cwed_72z.js +1 -0
- package/dist/dashboard/assets/brand/bansos_page.png +0 -0
- package/dist/dashboard/assets/brand/denia_bansos.jpg +0 -0
- package/dist/dashboard/assets/brand/favicon.jpg +0 -0
- package/dist/dashboard/assets/brand/login_register.jpg +0 -0
- package/dist/dashboard/assets/brand/og_bansos.webp +0 -0
- package/dist/dashboard/assets/brand/og_image.webp +0 -0
- package/dist/dashboard/assets/brand/sidebar_ico.jpg +0 -0
- package/dist/dashboard/assets/card-BTdbRFFg.js +1 -0
- package/dist/dashboard/assets/check-D69FzdvC.js +1 -0
- package/dist/dashboard/assets/chevron-right-BXIy5l3h.js +1 -0
- package/dist/dashboard/assets/circle-alert-CntYHV5v.js +1 -0
- package/dist/dashboard/assets/circle-check-BU3v_mFW.js +1 -0
- package/dist/dashboard/assets/cli-tools-DccaOfhX.js +1 -0
- package/dist/dashboard/assets/clipboard-button-DQmMikNQ.js +1 -0
- package/dist/dashboard/assets/cog-CdWhsajs.js +1 -0
- package/dist/dashboard/assets/copy-ngmQ9zcZ.js +1 -0
- package/dist/dashboard/assets/dialog-actions-B1axpEg7.js +1 -0
- package/dist/dashboard/assets/dialog-iocKA3jr.js +1 -0
- package/dist/dashboard/assets/download-A0SW9OCW.js +1 -0
- package/dist/dashboard/assets/download-dRFo5_Wu.js +1 -0
- package/dist/dashboard/assets/drawer-CDKOTZdY.js +1 -0
- package/dist/dashboard/assets/entry-DcX5sMzh.js +4 -0
- package/dist/dashboard/assets/entry-Dm3PpDCO.js +1 -0
- package/dist/dashboard/assets/entry-keNDZ_Wz.js +1 -0
- package/dist/dashboard/assets/eye-C_hawfH4.js +1 -0
- package/dist/dashboard/assets/eye-off-Bk5g2luF.js +1 -0
- package/dist/dashboard/assets/fingerprint-pattern-BWuHtbW4.js +1 -0
- package/dist/dashboard/assets/gauge-BbIMy7MB.js +1 -0
- package/dist/dashboard/assets/github-badge-BuAJr8oU.js +1 -0
- package/dist/dashboard/assets/image-BPaouViG.js +1 -0
- package/dist/dashboard/assets/index-By44uTGZ.js +2 -0
- package/dist/dashboard/assets/inline-DCejSLlA.js +1 -0
- package/dist/dashboard/assets/input-Bn4_kNav.js +1 -0
- package/dist/dashboard/assets/jsx-runtime-CXUMngI_.js +1 -0
- package/dist/dashboard/assets/key-round-UkavsGxp.js +1 -0
- package/dist/dashboard/assets/layers-2-glBbjl.js +1 -0
- package/dist/dashboard/assets/layout-Bv-NxqZ5.js +1 -0
- package/dist/dashboard/assets/list-row-BLA0sldD.js +1 -0
- package/dist/dashboard/assets/live-YlifPYox.js +1 -0
- package/dist/dashboard/assets/log-in-BmRjy60c.js +1 -0
- package/dist/dashboard/assets/message-circle-CCxGwRvv.js +1 -0
- package/dist/dashboard/assets/model-bans-CVvHZ-qz.js +1 -0
- package/dist/dashboard/assets/mutation-BIizFZav.js +1 -0
- package/dist/dashboard/assets/numbers-CFL4_Dqc.js +1 -0
- package/dist/dashboard/assets/pencil-768ysRAr.js +1 -0
- package/dist/dashboard/assets/plus-DIdX_g-x.js +1 -0
- package/dist/dashboard/assets/privacy-mode-CQjbZ3xk.js +1 -0
- package/dist/dashboard/assets/providers/agentrouter.svg +6 -0
- package/dist/dashboard/assets/providers/aihubmix.svg +1 -0
- package/dist/dashboard/assets/providers/alibaba-coding-plan.svg +6 -0
- package/dist/dashboard/assets/providers/alibaba.svg +1 -0
- package/dist/dashboard/assets/providers/amp.webp +0 -0
- package/dist/dashboard/assets/providers/anthropics.webp +0 -0
- package/dist/dashboard/assets/providers/antigravity.svg +20 -0
- package/dist/dashboard/assets/providers/bai.svg +6 -0
- package/dist/dashboard/assets/providers/blackbox.svg +1 -0
- package/dist/dashboard/assets/providers/cerebras.webp +0 -0
- package/dist/dashboard/assets/providers/claude-code.svg +1 -0
- package/dist/dashboard/assets/providers/claude.webp +0 -0
- package/dist/dashboard/assets/providers/cline.webp +0 -0
- package/dist/dashboard/assets/providers/codebuddy.webp +0 -0
- package/dist/dashboard/assets/providers/codex.webp +0 -0
- package/dist/dashboard/assets/providers/commandcode.webp +0 -0
- package/dist/dashboard/assets/providers/continue.webp +0 -0
- package/dist/dashboard/assets/providers/copilot.webp +0 -0
- package/dist/dashboard/assets/providers/deepseek-tui.webp +0 -0
- package/dist/dashboard/assets/providers/deepseek.webp +0 -0
- package/dist/dashboard/assets/providers/droid.webp +0 -0
- package/dist/dashboard/assets/providers/exa.svg +4 -0
- package/dist/dashboard/assets/providers/fireworks.webp +0 -0
- package/dist/dashboard/assets/providers/gemini.webp +0 -0
- package/dist/dashboard/assets/providers/github.webp +0 -0
- package/dist/dashboard/assets/providers/gmi-cloud.svg +6 -0
- package/dist/dashboard/assets/providers/grok-build.webp +0 -0
- package/dist/dashboard/assets/providers/hermes.webp +0 -0
- package/dist/dashboard/assets/providers/inferhub.svg +17 -0
- package/dist/dashboard/assets/providers/jcode.webp +0 -0
- package/dist/dashboard/assets/providers/kilocode-gateway.webp +0 -0
- package/dist/dashboard/assets/providers/kilocode.webp +0 -0
- package/dist/dashboard/assets/providers/kimchi.webp +0 -0
- package/dist/dashboard/assets/providers/kimi-code.webp +0 -0
- package/dist/dashboard/assets/providers/kiro.webp +0 -0
- package/dist/dashboard/assets/providers/mimo.webp +0 -0
- package/dist/dashboard/assets/providers/mistral.webp +0 -0
- package/dist/dashboard/assets/providers/muse.svg +6 -0
- package/dist/dashboard/assets/providers/nous-research.svg +1 -0
- package/dist/dashboard/assets/providers/nvidia.webp +0 -0
- package/dist/dashboard/assets/providers/ollama-cloud.webp +0 -0
- package/dist/dashboard/assets/providers/ollama.webp +0 -0
- package/dist/dashboard/assets/providers/openai-light.svg +1 -0
- package/dist/dashboard/assets/providers/openclaw.webp +0 -0
- package/dist/dashboard/assets/providers/opencode-go.webp +0 -0
- package/dist/dashboard/assets/providers/opencode.webp +0 -0
- package/dist/dashboard/assets/providers/openrouter.webp +0 -0
- package/dist/dashboard/assets/providers/parallel.svg +6 -0
- package/dist/dashboard/assets/providers/perplexity.webp +0 -0
- package/dist/dashboard/assets/providers/qoder.webp +0 -0
- package/dist/dashboard/assets/providers/qwen.webp +0 -0
- package/dist/dashboard/assets/providers/roo.webp +0 -0
- package/dist/dashboard/assets/providers/tokenharbor.svg +27 -0
- package/dist/dashboard/assets/providers/zai-coding-plan.svg +6 -0
- package/dist/dashboard/assets/query-keys-ROf-g1Wi.js +1 -0
- package/dist/dashboard/assets/quota-DZGyp0N5.js +1 -0
- package/dist/dashboard/assets/refresh-cw-BqJFk4sU.js +1 -0
- package/dist/dashboard/assets/rotate-ccw-CufcqITi.js +1 -0
- package/dist/dashboard/assets/route-CNSNj9Zm.js +1 -0
- package/dist/dashboard/assets/routing-jntw9-Ui.js +1 -0
- package/dist/dashboard/assets/scaling-nWE4Cx8f.js +1 -0
- package/dist/dashboard/assets/search-JOKus9rb.js +1 -0
- package/dist/dashboard/assets/select-CGUuTQmj.js +41 -0
- package/dist/dashboard/assets/settings-BAS6QbmJ.js +1 -0
- package/dist/dashboard/assets/shield-check-DVS0Foqh.js +1 -0
- package/dist/dashboard/assets/sliders-horizontal-ClG7dBeJ.js +1 -0
- package/dist/dashboard/assets/sparkles-BRaRUxAU.js +1 -0
- package/dist/dashboard/assets/stack-C1kTcOmP.js +1 -0
- package/dist/dashboard/assets/state-DHKdg-pm.js +1 -0
- package/dist/dashboard/assets/story/25817331.webp +0 -0
- package/dist/dashboard/assets/story/Shorekeeper.webp +0 -0
- package/dist/dashboard/assets/story/cartethyia-god.webp +0 -0
- package/dist/dashboard/assets/story/fleurdelys_plus.webp +0 -0
- package/dist/dashboard/assets/story/jinhsi-blossom.webp +0 -0
- package/dist/dashboard/assets/story/phrolova-a.webp +0 -0
- package/dist/dashboard/assets/story/requestdeniawokkjpg.webp +0 -0
- package/dist/dashboard/assets/story/wuthering-waves-hiyuki-aemeath-hiyuki-rover.webp +0 -0
- package/dist/dashboard/assets/stream-retry-5QnVuSSo.js +1 -0
- package/dist/dashboard/assets/switch-DIDeAiz9.js +1 -0
- package/dist/dashboard/assets/terminal-C9mZ4Ugm.js +1 -0
- package/dist/dashboard/assets/toast-DKAdP2mo.js +2 -0
- package/dist/dashboard/assets/tokens-DDxMbSRL.js +1 -0
- package/dist/dashboard/assets/trash-Cppn5c3R.js +1 -0
- package/dist/dashboard/assets/use-clipboard-B0Sy03fE.js +1 -0
- package/dist/dashboard/assets/use-presence-BSZEBx7U.js +1 -0
- package/dist/dashboard/assets/use-reduced-motion-C4B0R6Sz.js +1 -0
- package/dist/dashboard/assets/use-timeout-BwcBBRrT.js +1 -0
- package/dist/dashboard/assets/useMutation-DVmwOKU-.js +1 -0
- package/dist/dashboard/assets/wrench-B6E1oEuY.js +1 -0
- package/dist/dashboard/console-backgrounds.jpg +0 -0
- package/dist/dashboard/index.html +100 -0
- package/migrations/README.md +52 -0
- package/migrations/full-postgres/0000_baseline.sql +510 -0
- package/migrations/full-postgres/0001_allow_multiple_shared_keys_per_ip.sql +1 -0
- package/migrations/full-postgres/0002_add_gemini_wire_family.sql +29 -0
- package/migrations/full-postgres/0003_add_models_model_id_index.sql +16 -0
- package/migrations/full-postgres/0004_add_model_block_hits.sql +17 -0
- package/migrations/full-postgres/0005_add_buddy_usage_snapshots.sql +25 -0
- package/migrations/full-postgres/0006_add_buddy_task_ledger.sql +24 -0
- package/migrations/full-postgres/0007_add_telemetry_payload_capture_state.sql +17 -0
- package/migrations/full-postgres/0008_add_models_route_unique_index.sql +8 -0
- package/migrations/full-postgres/0009_rename_opencode_provider_ids.sql +232 -0
- package/migrations/full-postgres/0010_add_provider_max_inflight_per_proxy.sql +14 -0
- package/migrations/full-postgres/0011_add_pool_provider_probe.sql +21 -0
- package/migrations/full-postgres/0012_add_reported_model.sql +13 -0
- package/migrations/lite-sqlite3/0000_baseline.sql +559 -0
- package/migrations/lite-sqlite3/0001_allow_multiple_shared_keys_per_ip.sql +1 -0
- package/migrations/lite-sqlite3/0002_add_gemini_wire_family.sql +67 -0
- package/migrations/lite-sqlite3/0003_add_models_model_id_index.sql +4 -0
- package/migrations/lite-sqlite3/0004_add_model_block_hits.sql +11 -0
- package/migrations/lite-sqlite3/0005_add_buddy_usage_snapshots.sql +24 -0
- package/migrations/lite-sqlite3/0006_add_buddy_task_ledger.sql +21 -0
- package/migrations/lite-sqlite3/0007_add_telemetry_payload_capture_state.sql +12 -0
- package/migrations/lite-sqlite3/0008_add_models_route_unique_index.sql +8 -0
- package/migrations/lite-sqlite3/0009_rename_opencode_provider_ids.sql +229 -0
- package/migrations/lite-sqlite3/0010_add_provider_max_inflight_per_proxy.sql +14 -0
- package/migrations/lite-sqlite3/0011_add_pool_provider_probe.sql +27 -0
- package/migrations/lite-sqlite3/0012_add_reported_model.sql +13 -0
- package/package.json +96 -4
- package/scripts/cli/carte-launcher.cjs +4 -0
- package/scripts/cli/cli-launcher.cjs +102 -0
- package/scripts/cli/cli.ts +576 -0
- package/scripts/cli/doctor.ts +258 -0
- package/scripts/cli/setup.ts +443 -0
- package/scripts/operations/probe-egress.ts +335 -0
- package/scripts/operations/restart.ts +120 -0
- package/scripts/shared/env.ts +269 -0
- package/src/boot/app.ts +637 -0
- package/src/boot/dependencies.ts +574 -0
- package/src/boot/lifecycle.ts +244 -0
- package/src/boot/timeout.ts +48 -0
- package/src/config/cooldowns.ts +138 -0
- package/src/config/network.ts +126 -0
- package/src/config/package-paths.ts +40 -0
- package/src/config/providers.ts +70 -0
- package/src/config/runtime.ts +60 -0
- package/src/config/security.ts +58 -0
- package/src/config/spec.ts +288 -0
- package/src/config/telemetry.ts +21 -0
- package/src/config/timeouts.ts +114 -0
- package/src/console/admin/model-abuse/contracts.ts +16 -0
- package/src/console/admin/model-abuse/routes.ts +44 -0
- package/src/console/api-keys/bucket-spend.ts +45 -0
- package/src/console/api-keys/contracts.ts +391 -0
- package/src/console/api-keys/routes.ts +870 -0
- package/src/console/api-keys/share-popup-image.ts +71 -0
- package/src/console/audit/contracts.ts +77 -0
- package/src/console/audit/routes.ts +32 -0
- package/src/console/audit/store.ts +139 -0
- package/src/console/auth/access.ts +4 -0
- package/src/console/auth/audit-recorder.ts +82 -0
- package/src/console/auth/credentials.ts +53 -0
- package/src/console/auth/lockout.ts +154 -0
- package/src/console/auth/row-coercion.ts +76 -0
- package/src/console/auth/session-resolver.ts +86 -0
- package/src/console/auth/session-service.ts +175 -0
- package/src/console/auth/session.ts +536 -0
- package/src/console/auth/setup-service.ts +272 -0
- package/src/console/auth/user-store.ts +41 -0
- package/src/console/backup/9router-map.ts +172 -0
- package/src/console/backup/contracts.ts +534 -0
- package/src/console/backup/nine-router.ts +528 -0
- package/src/console/backup/routes.ts +210 -0
- package/src/console/backup/service.ts +403 -0
- package/src/console/backup/store.ts +773 -0
- package/src/console/backup/validate.ts +484 -0
- package/src/console/cli-tools/contracts.ts +746 -0
- package/src/console/cli-tools/fs-ops.ts +487 -0
- package/src/console/cli-tools/injectors/claude.ts +130 -0
- package/src/console/cli-tools/injectors/cline.ts +110 -0
- package/src/console/cli-tools/injectors/codex.ts +181 -0
- package/src/console/cli-tools/injectors/copilot.ts +108 -0
- package/src/console/cli-tools/injectors/cowork.ts +64 -0
- package/src/console/cli-tools/injectors/deepseek-tui.ts +85 -0
- package/src/console/cli-tools/injectors/driver.ts +247 -0
- package/src/console/cli-tools/injectors/droid.ts +96 -0
- package/src/console/cli-tools/injectors/grok-build.ts +70 -0
- package/src/console/cli-tools/injectors/hermes.ts +101 -0
- package/src/console/cli-tools/injectors/jcode.ts +115 -0
- package/src/console/cli-tools/injectors/kilo.ts +90 -0
- package/src/console/cli-tools/injectors/openclaw.ts +161 -0
- package/src/console/cli-tools/injectors/opencode.ts +153 -0
- package/src/console/cli-tools/routes.ts +339 -0
- package/src/console/cli-tools/secret-source.ts +101 -0
- package/src/console/cli-tools/service.ts +336 -0
- package/src/console/cli-tools/store.ts +179 -0
- package/src/console/console-router-guards.ts +111 -0
- package/src/console/console-router.ts +223 -0
- package/src/console/dashboard-assets.ts +340 -0
- package/src/console/domain-registration.ts +318 -0
- package/src/console/observability/contracts.ts +423 -0
- package/src/console/observability/live.ts +158 -0
- package/src/console/observability/logs.ts +87 -0
- package/src/console/observability/performance-contracts.ts +5 -0
- package/src/console/observability/performance.ts +23 -0
- package/src/console/observability/routes.ts +93 -0
- package/src/console/observability/sse.ts +97 -0
- package/src/console/observability/store.ts +912 -0
- package/src/console/observability/usage-dimensions.ts +19 -0
- package/src/console/observability/usage-periods.ts +13 -0
- package/src/console/providers/catalog/catalog-projections.ts +104 -0
- package/src/console/providers/catalog/contracts.ts +846 -0
- package/src/console/providers/catalog/model-operations.ts +342 -0
- package/src/console/providers/catalog/provider-operations.ts +655 -0
- package/src/console/providers/catalog/public-model-store.ts +676 -0
- package/src/console/providers/catalog/routes.ts +377 -0
- package/src/console/providers/catalog/store.ts +1521 -0
- package/src/console/providers/detail/contracts.ts +34 -0
- package/src/console/providers/detail/routes.ts +195 -0
- package/src/console/providers/detail/store.ts +159 -0
- package/src/console/providers/oauth/callback-listener.ts +328 -0
- package/src/console/providers/oauth/routes.ts +707 -0
- package/src/console/quota/account-quota-global.ts +154 -0
- package/src/console/quota/account-quota-shared.ts +39 -0
- package/src/console/quota/account-quota-tenant.ts +1096 -0
- package/src/console/quota/account-quota.ts +22 -0
- package/src/console/quota/account-test-egress.ts +182 -0
- package/src/console/quota/cache.ts +358 -0
- package/src/console/quota/quota-view.ts +190 -0
- package/src/console/quota/refresh.ts +410 -0
- package/src/console/response-compression.ts +162 -0
- package/src/console/routing/model/contracts.ts +202 -0
- package/src/console/routing/model/operations.ts +455 -0
- package/src/console/routing/model/routes.ts +136 -0
- package/src/console/routing/model/store.ts +430 -0
- package/src/console/routing/pools/contracts.ts +508 -0
- package/src/console/routing/pools/operations.ts +501 -0
- package/src/console/routing/pools/probe-result.ts +59 -0
- package/src/console/routing/pools/probe-verdict.ts +60 -0
- package/src/console/routing/pools/relay-deploy.ts +325 -0
- package/src/console/routing/pools/relay-regions.ts +97 -0
- package/src/console/routing/pools/routes.ts +164 -0
- package/src/console/routing/pools/speed-test-sizes.ts +16 -0
- package/src/console/routing/pools/store.ts +778 -0
- package/src/console/settings/contracts.ts +153 -0
- package/src/console/settings/routes.ts +30 -0
- package/src/console/settings/store.ts +152 -0
- package/src/console/share/share-router.ts +457 -0
- package/src/console/share/share-stats.ts +341 -0
- package/src/console/share/share-usage.ts +266 -0
- package/src/console/shared/cursor.ts +151 -0
- package/src/console/shared/day.ts +27 -0
- package/src/console/shared/elysia-schema.ts +19 -0
- package/src/console/shared/errors.ts +174 -0
- package/src/console/shared/ip-privacy.ts +14 -0
- package/src/console/shared/query.ts +22 -0
- package/src/console/shared/read-through-cache.ts +49 -0
- package/src/console/updates/repository-updates.ts +34 -0
- package/src/console/updates/routes.ts +17 -0
- package/src/console/updates/version-compare.ts +73 -0
- package/src/main.ts +142 -0
- package/src/network/backoff.ts +31 -0
- package/src/network/deduplication.ts +37 -0
- package/src/network/outbound-fetch.ts +302 -0
- package/src/network/pool/agent.ts +460 -0
- package/src/network/pool/byte-accounting.ts +146 -0
- package/src/network/pool/loader.ts +56 -0
- package/src/network/pool/pool-scripts.ts +110 -0
- package/src/network/pool/pool-state.ts +169 -0
- package/src/network/pool/resolver.ts +544 -0
- package/src/network/pool/selector.ts +844 -0
- package/src/network/pool-health-machine.ts +247 -0
- package/src/network/pool-health.ts +183 -0
- package/src/network/response-headers.ts +39 -0
- package/src/network/retry.ts +53 -0
- package/src/network/ssrf.ts +253 -0
- package/src/network/types.ts +55 -0
- package/src/observability/event-log.ts +267 -0
- package/src/observability/log-ring.ts +136 -0
- package/src/observability/logger.ts +178 -0
- package/src/observability/metrics.ts +395 -0
- package/src/observability/payload-capture.ts +324 -0
- package/src/observability/payload-store.ts +366 -0
- package/src/observability/performance-metrics.ts +81 -0
- package/src/observability/redaction.ts +83 -0
- package/src/observability/runtime-metrics.ts +177 -0
- package/src/observability/telemetry-buffer.ts +385 -0
- package/src/observability/telemetry-status.ts +133 -0
- package/src/observability/token-speed.ts +78 -0
- package/src/persistence/boot.ts +168 -0
- package/src/persistence/connection-url.ts +78 -0
- package/src/persistence/db-handle.ts +47 -0
- package/src/persistence/db-mode.ts +63 -0
- package/src/persistence/db-pg.ts +246 -0
- package/src/persistence/db-sqlite.ts +495 -0
- package/src/persistence/dialect.ts +148 -0
- package/src/persistence/migrate.ts +129 -0
- package/src/persistence/readiness.ts +209 -0
- package/src/persistence/redis.ts +187 -0
- package/src/persistence/schema.ts +1257 -0
- package/src/persistence/settings-revision.ts +23 -0
- package/src/persistence/sort-order.ts +85 -0
- package/src/persistence/stores/api-key-store.ts +563 -0
- package/src/persistence/stores/share-store.ts +528 -0
- package/src/persistence/stores/telemetry-store.ts +214 -0
- package/src/persistence/tenant-preferences.ts +96 -0
- package/src/persistence/tenant-scope.ts +42 -0
- package/src/persistence/ttl-cache.ts +181 -0
- package/src/persistence/usage-flush.ts +164 -0
- package/src/protocol/canonical-model.ts +658 -0
- package/src/protocol/codecs.ts +948 -0
- package/src/protocol/gateway-error.ts +231 -0
- package/src/protocol/image-clamp.ts +126 -0
- package/src/protocol/image-generation.ts +117 -0
- package/src/protocol/messages-errors.ts +91 -0
- package/src/protocol/registry.ts +202 -0
- package/src/protocol/request/chat.ts +548 -0
- package/src/protocol/request/codex.ts +696 -0
- package/src/protocol/request/gemini.ts +314 -0
- package/src/protocol/request/messages.ts +892 -0
- package/src/protocol/request/responses.ts +400 -0
- package/src/protocol/response/chat.ts +430 -0
- package/src/protocol/response/codex.ts +754 -0
- package/src/protocol/response/dsml.ts +47 -0
- package/src/protocol/response/gemini.ts +155 -0
- package/src/protocol/response/messages.ts +508 -0
- package/src/protocol/response/responses.ts +743 -0
- package/src/protocol/sse-decoder.ts +210 -0
- package/src/protocol/sse-frame.ts +36 -0
- package/src/protocol/stop-reason.ts +62 -0
- package/src/protocol/stream-error-frames.ts +78 -0
- package/src/protocol/tool-identity.ts +191 -0
- package/src/protocol/upstream/post-json.ts +34 -0
- package/src/protocol/upstream/send-claude-messages.ts +88 -0
- package/src/providers/adapters/base-adapter.ts +80 -0
- package/src/providers/adapters/compatible-adapter.ts +429 -0
- package/src/providers/authentication/jwt-validator.ts +446 -0
- package/src/providers/authentication/oauth-client.ts +253 -0
- package/src/providers/authentication/oauth-device-flow.ts +107 -0
- package/src/providers/authentication/oauth-flow-store.ts +732 -0
- package/src/providers/authentication/oauth-refresh-service.ts +643 -0
- package/src/providers/authentication/static-token-detection.ts +48 -0
- package/src/providers/bundled-discovery-providers.ts +119 -0
- package/src/providers/configured-openai-providers.ts +135 -0
- package/src/providers/configured-provider.ts +100 -0
- package/src/providers/default-registry.ts +695 -0
- package/src/providers/discovery/catalog/catalog-blob.ts +18 -0
- package/src/providers/discovery/catalog/catalog-format.ts +460 -0
- package/src/providers/discovery/discovery-types.ts +149 -0
- package/src/providers/discovery/models-dev-catalog.ts +337 -0
- package/src/providers/discovery/openai-model-discovery.ts +163 -0
- package/src/providers/discovery/probe-phases.ts +712 -0
- package/src/providers/discovery/probe-wire.ts +213 -0
- package/src/providers/discovery/probing-service.ts +1001 -0
- package/src/providers/integrations/.codegen-stamp +1 -0
- package/src/providers/integrations/agentrouter/agentrouter.ts +131 -0
- package/src/providers/integrations/aihubmix.ts +27 -0
- package/src/providers/integrations/alibabacp/alibabacp-models.ts +66 -0
- package/src/providers/integrations/alibabacp/alibabacp-oauth.ts +127 -0
- package/src/providers/integrations/alibabacp/alibabacp.ts +112 -0
- package/src/providers/integrations/anthropic.ts +171 -0
- package/src/providers/integrations/antigravity/antigravity-oauth.ts +215 -0
- package/src/providers/integrations/antigravity/antigravity-protocol.ts +788 -0
- package/src/providers/integrations/antigravity/antigravity-quota.ts +326 -0
- package/src/providers/integrations/antigravity/antigravity.ts +1012 -0
- package/src/providers/integrations/bai.ts +40 -0
- package/src/providers/integrations/buddy/buddy-catalog-shared.ts +258 -0
- package/src/providers/integrations/buddy/buddy-chat-shared.ts +914 -0
- package/src/providers/integrations/buddy/buddy-checkin.ts +546 -0
- package/src/providers/integrations/buddy/buddy-conversation-headers.ts +94 -0
- package/src/providers/integrations/buddy/buddy-discovery-shared.ts +175 -0
- package/src/providers/integrations/buddy/buddy-growth-shared.ts +578 -0
- package/src/providers/integrations/buddy/buddy-media.ts +424 -0
- package/src/providers/integrations/buddy/buddy-oauth-shared.ts +305 -0
- package/src/providers/integrations/buddy/buddy-quota-shared.ts +415 -0
- package/src/providers/integrations/buddy/buddy-usage-shared.ts +223 -0
- package/src/providers/integrations/buddy/buddy-usage-store.ts +147 -0
- package/src/providers/integrations/buddy/capabilities.ts +83 -0
- package/src/providers/integrations/buddy/codebuddy/cn-provider.ts +179 -0
- package/src/providers/integrations/buddy/codebuddy/oauth.ts +47 -0
- package/src/providers/integrations/buddy/codebuddy/provider.ts +175 -0
- package/src/providers/integrations/buddy/codebuddy/quota.ts +165 -0
- package/src/providers/integrations/buddy/codebuddy/shared.ts +73 -0
- package/src/providers/integrations/buddy/workbuddy/cn-oauth.ts +30 -0
- package/src/providers/integrations/buddy/workbuddy/cn-provider.ts +55 -0
- package/src/providers/integrations/buddy/workbuddy/oauth.ts +31 -0
- package/src/providers/integrations/buddy/workbuddy/provider.ts +204 -0
- package/src/providers/integrations/buddy/workbuddy/quota.ts +159 -0
- package/src/providers/integrations/buddy/workbuddy/shared.ts +171 -0
- package/src/providers/integrations/cerebras.ts +44 -0
- package/src/providers/integrations/claude/claude-betas.ts +255 -0
- package/src/providers/integrations/claude/claude-cch.ts +148 -0
- package/src/providers/integrations/claude/claude-compatibility.ts +208 -0
- package/src/providers/integrations/claude/claude-credentials.ts +236 -0
- package/src/providers/integrations/claude/claude-fingerprint.ts +29 -0
- package/src/providers/integrations/claude/claude-oauth.ts +228 -0
- package/src/providers/integrations/claude/claude-quota.ts +163 -0
- package/src/providers/integrations/claude/claude-slow-lane-retry.ts +100 -0
- package/src/providers/integrations/claude/claude-slow-lane.ts +522 -0
- package/src/providers/integrations/claude/claude-user-profiles.ts +380 -0
- package/src/providers/integrations/claude/claude.ts +582 -0
- package/src/providers/integrations/claude/fallback-credit.ts +237 -0
- package/src/providers/integrations/cline/cline-oauth.ts +219 -0
- package/src/providers/integrations/cline/cline-quota.ts +126 -0
- package/src/providers/integrations/cline/cline.ts +468 -0
- package/src/providers/integrations/cloudflareai/cloudflareai-models.ts +65 -0
- package/src/providers/integrations/cloudflareai/cloudflareai-oauth.ts +108 -0
- package/src/providers/integrations/cloudflareai/cloudflareai.ts +137 -0
- package/src/providers/integrations/codex/codex-device-code.ts +101 -0
- package/src/providers/integrations/codex/codex-errors.ts +174 -0
- package/src/providers/integrations/codex/codex-headers.ts +155 -0
- package/src/providers/integrations/codex/codex-identity.ts +68 -0
- package/src/providers/integrations/codex/codex-oauth.ts +275 -0
- package/src/providers/integrations/codex/codex-quota.ts +68 -0
- package/src/providers/integrations/codex/codex.ts +1214 -0
- package/src/providers/integrations/commandcode/commandcode.ts +541 -0
- package/src/providers/integrations/dashscope-models.ts +52 -0
- package/src/providers/integrations/deepseek.ts +60 -0
- package/src/providers/integrations/factory/factory-models.ts +124 -0
- package/src/providers/integrations/factory/factory-oauth.ts +238 -0
- package/src/providers/integrations/factory/factory.ts +639 -0
- package/src/providers/integrations/gemini.ts +449 -0
- package/src/providers/integrations/github/github-discovery.ts +163 -0
- package/src/providers/integrations/github/github-oauth.ts +354 -0
- package/src/providers/integrations/github/github-quota.ts +127 -0
- package/src/providers/integrations/github/github.ts +668 -0
- package/src/providers/integrations/grok/grok-install-id.ts +13 -0
- package/src/providers/integrations/grok/grok-oauth.ts +261 -0
- package/src/providers/integrations/grok/grok-quota-frame.ts +214 -0
- package/src/providers/integrations/grok/grok-quota.ts +177 -0
- package/src/providers/integrations/grok/grok-turn-index.ts +82 -0
- package/src/providers/integrations/grok/grok.ts +541 -0
- package/src/providers/integrations/hermes.ts +149 -0
- package/src/providers/integrations/inferhub.ts +581 -0
- package/src/providers/integrations/kilo/kilo-discovery.ts +139 -0
- package/src/providers/integrations/kilo/kilo-oauth.ts +188 -0
- package/src/providers/integrations/kilo/kilo.ts +146 -0
- package/src/providers/integrations/kimi/kimi-oauth.ts +245 -0
- package/src/providers/integrations/kimi/kimi-quota.ts +184 -0
- package/src/providers/integrations/kimi/kimi.ts +264 -0
- package/src/providers/integrations/kiro/aws-event-stream.ts +293 -0
- package/src/providers/integrations/kiro/kiro-catalog.ts +106 -0
- package/src/providers/integrations/kiro/kiro-discovery.ts +164 -0
- package/src/providers/integrations/kiro/kiro-machine-id.ts +107 -0
- package/src/providers/integrations/kiro/kiro-oauth.ts +1132 -0
- package/src/providers/integrations/kiro/kiro-profile.ts +66 -0
- package/src/providers/integrations/kiro/kiro-quota.ts +238 -0
- package/src/providers/integrations/kiro/kiro-request.ts +748 -0
- package/src/providers/integrations/kiro/kiro-stream.ts +358 -0
- package/src/providers/integrations/kiro/kiro.ts +661 -0
- package/src/providers/integrations/meta.ts +38 -0
- package/src/providers/integrations/mistral.ts +52 -0
- package/src/providers/integrations/muse/muse-oauth.ts +202 -0
- package/src/providers/integrations/muse/muse-quota.ts +136 -0
- package/src/providers/integrations/muse/muse.ts +177 -0
- package/src/providers/integrations/ollamacloud-quota.ts +57 -0
- package/src/providers/integrations/openai.ts +39 -0
- package/src/providers/integrations/opencode/fingerprint.ts +155 -0
- package/src/providers/integrations/opencode/provider.ts +499 -0
- package/src/providers/integrations/opencode/tool-definitions.ts +389 -0
- package/src/providers/integrations/openrouter/oauth.ts +96 -0
- package/src/providers/integrations/openrouter/provider.ts +281 -0
- package/src/providers/integrations/perplexity.ts +143 -0
- package/src/providers/integrations/qoder/qoder-oauth.ts +263 -0
- package/src/providers/integrations/qoder/qoder.ts +730 -0
- package/src/providers/integrations/shared/claude-messages.ts +155 -0
- package/src/providers/integrations/shared/connect.ts +122 -0
- package/src/providers/integrations/shared/install-id.ts +133 -0
- package/src/providers/integrations/tokenharbor.ts +94 -0
- package/src/providers/integrations/xai/xai-discovery.ts +25 -0
- package/src/providers/integrations/xai/xai-oauth.ts +246 -0
- package/src/providers/integrations/xai/xai.ts +108 -0
- package/src/providers/integrations/xiaomi-mimo/think-stream.ts +153 -0
- package/src/providers/integrations/xiaomi-mimo/xiaomi.ts +44 -0
- package/src/providers/integrations/zcode/oauth.ts +257 -0
- package/src/providers/integrations/zcode/provider.ts +77 -0
- package/src/providers/operations/account-health-service.ts +1360 -0
- package/src/providers/operations/account-reset-service.ts +666 -0
- package/src/providers/operations/byok-wire-profile.ts +148 -0
- package/src/providers/operations/cli-platform.ts +144 -0
- package/src/providers/operations/client-version-resolver.ts +253 -0
- package/src/providers/operations/client-versions.ts +607 -0
- package/src/providers/operations/custom-cli-headers.ts +72 -0
- package/src/providers/operations/gateway-user-agent.ts +15 -0
- package/src/providers/operations/model-catalog-cache.ts +84 -0
- package/src/providers/operations/model-discovery-cache.ts +34 -0
- package/src/providers/operations/oauth-refresh-lead.ts +45 -0
- package/src/providers/operations/probe-fetch.ts +15 -0
- package/src/providers/operations/provider-catalog-seeder.ts +86 -0
- package/src/providers/operations/provider-catalog-service.ts +346 -0
- package/src/providers/operations/provider-credential-service.ts +307 -0
- package/src/providers/operations/provider-version-cache.ts +30 -0
- package/src/providers/operations/reported-model.ts +119 -0
- package/src/providers/operations/session-resolution.ts +83 -0
- package/src/providers/operations/upstream-deadline.ts +62 -0
- package/src/providers/provider-capabilities.ts +33 -0
- package/src/providers/provider-contracts.ts +293 -0
- package/src/providers/provider-credential-envelope.ts +43 -0
- package/src/providers/provider-credential-resolver.ts +81 -0
- package/src/providers/provider-metadata.ts +623 -0
- package/src/providers/provider-model-definition.ts +349 -0
- package/src/providers/provider-probe.ts +120 -0
- package/src/providers/provider-reasoning.ts +181 -0
- package/src/providers/provider-registry.ts +349 -0
- package/src/providers/provider-sanitize.ts +86 -0
- package/src/providers/provider-usage.ts +482 -0
- package/src/providers/quota/quota-contracts.ts +261 -0
- package/src/providers/quota/quota-limit-windows.ts +93 -0
- package/src/providers/quota/quota-support.ts +82 -0
- package/src/providers/quota/quota-window-parser.ts +165 -0
- package/src/providers/search/search-catalog.ts +24 -0
- package/src/providers/search/search-provider.ts +168 -0
- package/src/providers/search/search-providers.ts +229 -0
- package/src/security/abuse.ts +564 -0
- package/src/security/access-control.ts +146 -0
- package/src/security/admission/buckets.ts +33 -0
- package/src/security/admission/contracts.ts +104 -0
- package/src/security/admission/in-memory-store.ts +385 -0
- package/src/security/admission/lease-sweep.ts +62 -0
- package/src/security/admission/lua.ts +182 -0
- package/src/security/admission/reasons.ts +99 -0
- package/src/security/admission/redis-store.ts +210 -0
- package/src/security/admission/service.ts +165 -0
- package/src/security/admission/ttl.ts +61 -0
- package/src/security/api-key-auth.ts +353 -0
- package/src/security/cli-client-fingerprint.ts +81 -0
- package/src/security/client-router-fingerprint.ts +218 -0
- package/src/security/credential-codec.ts +252 -0
- package/src/security/crypto.ts +89 -0
- package/src/security/csrf.ts +114 -0
- package/src/security/ip-boundary.ts +261 -0
- package/src/security/model-abuse.ts +432 -0
- package/src/security/model-access-rule.ts +106 -0
- package/src/security/outbound-headers.ts +145 -0
- package/src/transport/contracts.ts +111 -0
- package/src/transport/dispatch/attempt-finalize.ts +752 -0
- package/src/transport/dispatch/attempt-loop.ts +513 -0
- package/src/transport/dispatch/empty-stream.ts +226 -0
- package/src/transport/dispatch/generation.ts +350 -0
- package/src/transport/dispatch/leases.ts +235 -0
- package/src/transport/dispatch/proxy-request.ts +336 -0
- package/src/transport/dispatch/responses-compact.ts +199 -0
- package/src/transport/dispatch/retry-policy.ts +100 -0
- package/src/transport/dispatch/stream-bridge.ts +68 -0
- package/src/transport/dispatch/streaming/encoder.ts +350 -0
- package/src/transport/dispatch/streaming/finalize.ts +566 -0
- package/src/transport/dispatch/streaming/stream.ts +436 -0
- package/src/transport/dispatch/systemone.ts +226 -0
- package/src/transport/dispatch/token-count.ts +413 -0
- package/src/transport/dispatch/upstream.ts +100 -0
- package/src/transport/dispatch/websearch.ts +199 -0
- package/src/transport/drain-endpoint.ts +70 -0
- package/src/transport/failure-policy.ts +906 -0
- package/src/transport/guards/abuse-guard.ts +92 -0
- package/src/transport/guards/auth-guard.ts +83 -0
- package/src/transport/guards/body-policy.ts +145 -0
- package/src/transport/guards/concurrency-guard.ts +54 -0
- package/src/transport/guards/early-rejection-capture.ts +74 -0
- package/src/transport/guards/error-lifecycle.ts +419 -0
- package/src/transport/guards/headroom-guard.ts +68 -0
- package/src/transport/guards/pipeline.ts +190 -0
- package/src/transport/guards/readiness-guard.ts +28 -0
- package/src/transport/guards/request-context.ts +311 -0
- package/src/transport/pathname.ts +24 -0
- package/src/transport/request/degradation.ts +277 -0
- package/src/transport/request/inflight.ts +102 -0
- package/src/transport/request/preparer.ts +482 -0
- package/src/transport/request/rtk/compress-request.ts +159 -0
- package/src/transport/request/rtk/ponytail-prompt.ts +33 -0
- package/src/transport/request/rtk/rtk-constants.ts +93 -0
- package/src/transport/request/rtk/rtk-filters.ts +373 -0
- package/src/transport/request/state.ts +373 -0
- package/src/transport/request/tenant-preferences.ts +72 -0
- package/src/transport/request/token-estimate.ts +82 -0
- package/src/transport/routing/admission.ts +178 -0
- package/src/transport/routing/reservations.ts +53 -0
- package/src/transport/routing/round-robin.ts +50 -0
- package/src/transport/routing/route-catalog.ts +738 -0
- package/src/transport/routing/route-model.ts +465 -0
- package/src/transport/routing/router.ts +786 -0
- package/src/transport/shutdown-notice.ts +68 -0
- package/src/transport/surface/adapters.ts +169 -0
- package/src/transport/surface/chat/adapter.ts +104 -0
- package/src/transport/surface/chat/encode.ts +530 -0
- package/src/transport/surface/chat/parse.ts +353 -0
- package/src/transport/surface/completion.ts +229 -0
- package/src/transport/surface/content-parts.ts +49 -0
- package/src/transport/surface/dialects.ts +272 -0
- package/src/transport/surface/messages/adapter.ts +185 -0
- package/src/transport/surface/messages/encode.ts +273 -0
- package/src/transport/surface/messages/errors.ts +12 -0
- package/src/transport/surface/messages/parse.ts +569 -0
- package/src/transport/surface/messages/stream.ts +473 -0
- package/src/transport/surface/reasoning-summary.ts +78 -0
- package/src/transport/surface/responses/adapter.ts +60 -0
- package/src/transport/surface/responses/contracts.ts +50 -0
- package/src/transport/surface/responses/encode.ts +733 -0
- package/src/transport/surface/responses/errors.ts +28 -0
- package/src/transport/surface/responses/parse.ts +681 -0
- package/src/transport/surface/responses/wire-output.ts +93 -0
- package/src/transport/surface/stream-frame.ts +30 -0
- package/src/transport/translation/attachment-integrity.ts +248 -0
- package/src/transport/translation/cache-controls.ts +119 -0
- package/src/transport/translation/capabilities.ts +433 -0
- package/src/transport/translation/normalize.ts +27 -0
- package/src/transport/translation/quirks.ts +224 -0
- package/src/transport/translation/search.ts +15 -0
- package/src/transport/translation/thinking.ts +509 -0
- package/src/transport/translation/tool-id.ts +93 -0
- package/src/transport/translation/tool-repair.ts +288 -0
- package/src/version.ts +11 -0
- package/src/workers/account-identity-sweep.ts +157 -0
- package/src/workers/buddy-growth-tasks.ts +430 -0
- package/src/workers/daily-checkin.ts +433 -0
- package/src/workers/oauth-refresh-sweep.ts +79 -0
- package/src/workers/quota-refresh-sweep.ts +487 -0
- package/src/workers/scheduler.ts +169 -0
- package/src/workers/sweep-runner.ts +181 -0
- package/tray-assets/cartethyia.ico +0 -0
- package/tray-assets/cartethyia.png +0 -0
|
@@ -0,0 +1,607 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Central client-version sources and resolvers for provider integrations.
|
|
3
|
+
*
|
|
4
|
+
* Every entry follows the same discovered → pinned fallback order.
|
|
5
|
+
* Provider-specific header builders remain next to their integrations, while
|
|
6
|
+
* the network source and resolver state live in this table.
|
|
7
|
+
*/
|
|
8
|
+
import {
|
|
9
|
+
createClientVersionResolver,
|
|
10
|
+
isSemverish,
|
|
11
|
+
type ClientVersionResolver,
|
|
12
|
+
type ClientVersionSnapshot,
|
|
13
|
+
} from "./client-version-resolver";
|
|
14
|
+
import {
|
|
15
|
+
buildGrokAuthUserAgent as buildGrokAuthUserAgentString,
|
|
16
|
+
buildGrokShellUserAgent,
|
|
17
|
+
} from "./cli-platform";
|
|
18
|
+
|
|
19
|
+
async function qoderVersion(response: Response): Promise<string | null> {
|
|
20
|
+
try {
|
|
21
|
+
const parsed = (await response.json()) as { version?: unknown };
|
|
22
|
+
return isSemverish(parsed.version) ? parsed.version.trim() : null;
|
|
23
|
+
} catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
async function clineClientVersion(response: Response): Promise<string | null> {
|
|
29
|
+
const data = (await response.json()) as { version?: unknown };
|
|
30
|
+
return isSemverish(data.version) ? data.version.trim() : null;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async function clineSdkVersion(response: Response): Promise<string | null> {
|
|
34
|
+
const data = (await response.json()) as {
|
|
35
|
+
version?: unknown;
|
|
36
|
+
"dist-tags"?: { latest?: unknown };
|
|
37
|
+
};
|
|
38
|
+
const candidate = data.version ?? data["dist-tags"]?.latest;
|
|
39
|
+
return isSemverish(candidate) ? candidate.trim() : null;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
async function kimiVersion(response: Response): Promise<string | null> {
|
|
43
|
+
const data = (await response.json()) as { info?: { version?: unknown } };
|
|
44
|
+
return isSemverish(data.info?.version) ? data.info.version.trim() : null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async function workbuddyDesktopVersion(response: Response): Promise<string | null> {
|
|
48
|
+
try {
|
|
49
|
+
const data = (await response.json()) as { version?: unknown; productVersion?: unknown };
|
|
50
|
+
const candidate = data.productVersion ?? data.version;
|
|
51
|
+
return typeof candidate === "string" && /^\d+\.\d+\.\d+(?:\.\d+)?(?:[-+][\w.-]+)?$/.test(candidate.trim())
|
|
52
|
+
? candidate.trim()
|
|
53
|
+
: null;
|
|
54
|
+
} catch {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async function kiroCaskVersion(response: Response): Promise<string | null> {
|
|
60
|
+
try {
|
|
61
|
+
const data = (await response.json()) as { version?: unknown };
|
|
62
|
+
return isSemverish(data.version) ? data.version.trim() : null;
|
|
63
|
+
} catch {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
async function codeBuddyCnVersion(response: Response): Promise<string | null> {
|
|
69
|
+
try {
|
|
70
|
+
const data = (await response.json()) as { version?: unknown };
|
|
71
|
+
if (typeof data.version !== "string") return null;
|
|
72
|
+
const match = /^\d+\.\d+\.\d+\.\d+/.exec(data.version.trim());
|
|
73
|
+
return match?.[0] ?? null;
|
|
74
|
+
} catch {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async function kiroVersion(response: Response): Promise<string | null> {
|
|
80
|
+
const body = await response.text();
|
|
81
|
+
const version =
|
|
82
|
+
/currentVersion["\\]*\s*:\s*["\\]*([\d.]+)/.exec(body)?.[1] ??
|
|
83
|
+
/\bIDE\s+([\d.]+)[^<]*Latest/.exec(body)?.[1];
|
|
84
|
+
return isSemverish(version) ? version : null;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
async function antigravityVersion(response: Response): Promise<string | null> {
|
|
88
|
+
const body = await response.text();
|
|
89
|
+
for (const line of body.split(/\r?\n/)) {
|
|
90
|
+
const match = /^\s*version\s*:\s*(?:"([^"]*)"|'([^']*)'|([^\s#]+))\s*(?:#.*)?$/.exec(line);
|
|
91
|
+
if (!match) continue;
|
|
92
|
+
const version = (match[1] ?? match[2] ?? match[3] ?? "").trim();
|
|
93
|
+
return isSemverish(version) ? version : null;
|
|
94
|
+
}
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* GitHub release tag (`v3.14.3` → `3.14.3`). Tags carry the leading `v`
|
|
99
|
+
* by convention while the gateway stamps bare versions, so the prefix is
|
|
100
|
+
* stripped rather than rejected by the semver check.
|
|
101
|
+
*/
|
|
102
|
+
async function githubReleaseVersion(response: Response): Promise<string | null> {
|
|
103
|
+
try {
|
|
104
|
+
const data = (await response.json()) as { tag_name?: unknown; name?: unknown };
|
|
105
|
+
const raw = data.tag_name ?? data.name;
|
|
106
|
+
const candidate = typeof raw === "string" && raw.startsWith("v") ? raw.slice(1) : raw;
|
|
107
|
+
return isSemverish(candidate) ? (candidate as string).trim() : null;
|
|
108
|
+
} catch {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Runtime SDK version stamped into the Kiro data-plane User-Agent.
|
|
115
|
+
*
|
|
116
|
+
* Pinned rather than discovered: the generation surface is served by the client
|
|
117
|
+
* the IDE ships, not by a release we can track, so the shipped build is the
|
|
118
|
+
* only source of truth. The agent compiles its generation client from
|
|
119
|
+
* `@aws/codewhisperer-streaming-client`, and that package's own version is the
|
|
120
|
+
* value the client stamps.
|
|
121
|
+
*
|
|
122
|
+
* How to rediscover it — take it from the shipped build, never from guesswork:
|
|
123
|
+
* 1. The IDE installer is published on the vendor's download feed under a
|
|
124
|
+
* path that repeats the version:
|
|
125
|
+
* `https://prod.download.desktop.kiro.dev/releases/stable/win32-x64/signed/<v>/kiro-ide-<v>-stable-win32-x64.exe`
|
|
126
|
+
* 2. Unpack it. The exe's payload is an LZMA stream behind a 4-byte tag:
|
|
127
|
+
* `7z x` the exe, drop the 4-byte tag from the extracted `[0]`, then
|
|
128
|
+
* `7z x` that as LZMA.
|
|
129
|
+
* 3. In the unpacked payload, locate the agent bundle — the region defining
|
|
130
|
+
* `getCodeWhispererStreamingClient` — and read the aliased package
|
|
131
|
+
* metadata inside it: `"@aws/codewhisperer-streaming-client" … version:"x.y.z"`.
|
|
132
|
+
* Use that one. One installer also embeds other bundles carrying older
|
|
133
|
+
* copies of the same package, so a bare version match is not evidence.
|
|
134
|
+
*
|
|
135
|
+
* The discovery source below only supplies the *IDE* version that follows the
|
|
136
|
+
* `KiroIDE` device marker.
|
|
137
|
+
*/
|
|
138
|
+
const KIRO_RUNTIME_SDK_VERSION = "1.0.39";
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* AWS SSO OIDC SDK version stamped into login and token-refresh User-Agents.
|
|
142
|
+
*
|
|
143
|
+
* Distinct from the runtime SDK above because the upstream sees them as two
|
|
144
|
+
* different AWS SDK clients: `oidc.{region}.amazonaws.com` is served by
|
|
145
|
+
* `aws-sdk-js` sso-oidc, while the generation surface reports the
|
|
146
|
+
* `codewhispererstreaming` client.
|
|
147
|
+
*/
|
|
148
|
+
const KIRO_SSO_SDK_VERSION = "3.980.0";
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Runtime segments the observed Kiro client reports.
|
|
152
|
+
*
|
|
153
|
+
* `win32#<build>` is the host Windows release, so it varies by machine and this
|
|
154
|
+
* is the shape a Windows 11 client produces.
|
|
155
|
+
*
|
|
156
|
+
* The `md/nodejs#` segment is the runtime the client executes under, not the
|
|
157
|
+
* host's Node: the IDE is an Electron app, so it is Electron's bundled Node.
|
|
158
|
+
* Rediscover both from the same unpacked payload — the app's `package.json`
|
|
159
|
+
* pins `"electron": "<version>"`, and that Electron release's metadata gives
|
|
160
|
+
* the Node version to stamp here.
|
|
161
|
+
*/
|
|
162
|
+
const KIRO_SYSTEM_VERSION = "win32#10.0.22631";
|
|
163
|
+
/** Node version the observed Kiro client reports (Electron's bundled Node). */
|
|
164
|
+
const KIRO_NODE_VERSION = "24.18.0";
|
|
165
|
+
|
|
166
|
+
/** Ordered upstream sources and pinned fallbacks for every client version. */
|
|
167
|
+
export const VERSION_SOURCES = {
|
|
168
|
+
antigravity: {
|
|
169
|
+
key: "antigravity",
|
|
170
|
+
fallback: "2.24.0",
|
|
171
|
+
sources: [
|
|
172
|
+
{
|
|
173
|
+
url: "https://antigravity-hub-auto-updater-974169037036.us-central1.run.app/manifest/latest-arm64-mac.yml",
|
|
174
|
+
extract: antigravityVersion,
|
|
175
|
+
},
|
|
176
|
+
],
|
|
177
|
+
},
|
|
178
|
+
qoder: {
|
|
179
|
+
key: "qoder",
|
|
180
|
+
fallback: "1.1.73",
|
|
181
|
+
sources: [
|
|
182
|
+
{
|
|
183
|
+
url: "https://registry.npmjs.org/@qoder-ai/qodercli/latest",
|
|
184
|
+
extract: qoderVersion,
|
|
185
|
+
},
|
|
186
|
+
],
|
|
187
|
+
},
|
|
188
|
+
opencode: {
|
|
189
|
+
key: "opencode",
|
|
190
|
+
// The v1 package (`opencode-ai`) stopped at 1.18. The v2 line publishes
|
|
191
|
+
// under `@opencode/cli`, and this feed is what its own installer reads.
|
|
192
|
+
fallback: "2.0.32",
|
|
193
|
+
minVersion: "2.0.0",
|
|
194
|
+
sources: [{ url: "https://opencode.ai/update/api/latest/cli/npm" }],
|
|
195
|
+
},
|
|
196
|
+
commandcode: {
|
|
197
|
+
key: "commandcode",
|
|
198
|
+
fallback: "1.84.0",
|
|
199
|
+
sources: [{ url: "https://registry.npmjs.org/command-code/latest" }],
|
|
200
|
+
},
|
|
201
|
+
grok: {
|
|
202
|
+
key: "grok",
|
|
203
|
+
fallback: "1.0.62",
|
|
204
|
+
sources: [
|
|
205
|
+
{ url: "https://storage.googleapis.com/grok-build-public-artifacts/cli/stable" },
|
|
206
|
+
{ url: "https://registry.npmjs.org/@xai-official/grok/latest" },
|
|
207
|
+
],
|
|
208
|
+
},
|
|
209
|
+
clineClient: {
|
|
210
|
+
key: "cline-client",
|
|
211
|
+
fallback: "4.1.25",
|
|
212
|
+
minVersion: "4.1.23",
|
|
213
|
+
sources: [
|
|
214
|
+
{
|
|
215
|
+
url: "https://raw.githubusercontent.com/cline/cline/main/apps/vscode/package.json",
|
|
216
|
+
extract: clineClientVersion,
|
|
217
|
+
},
|
|
218
|
+
],
|
|
219
|
+
},
|
|
220
|
+
clineSdk: {
|
|
221
|
+
key: "cline-sdk",
|
|
222
|
+
fallback: "0.0.95",
|
|
223
|
+
sources: [{ url: "https://registry.npmjs.org/@cline/sdk/latest", extract: clineSdkVersion }],
|
|
224
|
+
},
|
|
225
|
+
codex: {
|
|
226
|
+
key: "codex",
|
|
227
|
+
fallback: "0.163.0",
|
|
228
|
+
sources: [{ url: "https://registry.npmjs.org/@openai/codex/latest" }],
|
|
229
|
+
},
|
|
230
|
+
workbuddyClient: {
|
|
231
|
+
key: "workbuddy-client",
|
|
232
|
+
fallback: "5.8.4.41366630",
|
|
233
|
+
sources: [
|
|
234
|
+
{
|
|
235
|
+
url: "https://www.workbuddy.ai/v2/update?platform=workbuddy-win32-x64-user",
|
|
236
|
+
extract: workbuddyDesktopVersion,
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
url: "https://www.workbuddy.ai/v2/update?platform=workbuddy-darwin-arm64",
|
|
240
|
+
extract: workbuddyDesktopVersion,
|
|
241
|
+
},
|
|
242
|
+
],
|
|
243
|
+
},
|
|
244
|
+
workbuddyCnClient: {
|
|
245
|
+
key: "workbuddy-cn-client",
|
|
246
|
+
fallback: "5.8.3.41334564",
|
|
247
|
+
sources: [
|
|
248
|
+
{
|
|
249
|
+
url: "https://www.workbuddy.cn/v2/update?platform=workbuddy-win32-x64-user",
|
|
250
|
+
extract: workbuddyDesktopVersion,
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
url: "https://www.workbuddy.cn/v2/update?platform=workbuddy-darwin-arm64",
|
|
254
|
+
extract: workbuddyDesktopVersion,
|
|
255
|
+
},
|
|
256
|
+
],
|
|
257
|
+
},
|
|
258
|
+
workbuddyCli: {
|
|
259
|
+
key: "workbuddy",
|
|
260
|
+
fallback: "2.168.2",
|
|
261
|
+
sources: [
|
|
262
|
+
{ url: "https://registry.npmjs.org/@tencent-ai/codebuddy-code/latest" },
|
|
263
|
+
{ url: "https://registry.npmmirror.com/@tencent-ai/codebuddy-code/latest" },
|
|
264
|
+
],
|
|
265
|
+
},
|
|
266
|
+
kimiCli: {
|
|
267
|
+
key: "kimi-cli",
|
|
268
|
+
fallback: "1.52.0",
|
|
269
|
+
sources: [{ url: "https://pypi.org/pypi/kimi-cli/json", extract: kimiVersion }],
|
|
270
|
+
},
|
|
271
|
+
kiro: {
|
|
272
|
+
key: "kiro",
|
|
273
|
+
fallback: "1.3.11",
|
|
274
|
+
sources: [
|
|
275
|
+
{
|
|
276
|
+
// Kiro's downloads page no longer exposes a stable version string.
|
|
277
|
+
// Homebrew tracks the official installer URL and exposes its version
|
|
278
|
+
// as JSON; keep the product page parser as a fallback.
|
|
279
|
+
url: "https://formulae.brew.sh/api/cask/kiro.json",
|
|
280
|
+
extract: kiroCaskVersion,
|
|
281
|
+
},
|
|
282
|
+
{ url: "https://kiro.dev/downloads/", extract: kiroVersion },
|
|
283
|
+
],
|
|
284
|
+
},
|
|
285
|
+
codebuddy: {
|
|
286
|
+
key: "codebuddy",
|
|
287
|
+
fallback: "2.168.2",
|
|
288
|
+
sources: [
|
|
289
|
+
{ url: "https://registry.npmjs.org/@tencent-ai/codebuddy-code/latest" },
|
|
290
|
+
{ url: "https://registry.npmmirror.com/@tencent-ai/codebuddy-code/latest" },
|
|
291
|
+
],
|
|
292
|
+
},
|
|
293
|
+
codebuddyCn: {
|
|
294
|
+
key: "codebuddy-cn",
|
|
295
|
+
fallback: "4.12.2.41207131",
|
|
296
|
+
sources: [
|
|
297
|
+
{
|
|
298
|
+
// Official CN builds are listed by Homebrew's maintained cask feed;
|
|
299
|
+
// its version points at the current Tencent CN desktop artifact.
|
|
300
|
+
url: "https://formulae.brew.sh/api/cask/codebuddy-cn.json",
|
|
301
|
+
extract: codeBuddyCnVersion,
|
|
302
|
+
},
|
|
303
|
+
],
|
|
304
|
+
},
|
|
305
|
+
claudeCli: {
|
|
306
|
+
key: "claude-cli",
|
|
307
|
+
// Current `@anthropic-ai/claude-code` release, so the billing
|
|
308
|
+
// `cc_version=` suffix and the `claude-cli/` User-Agent stay on what
|
|
309
|
+
// upstream ships.
|
|
310
|
+
fallback: "2.1.302",
|
|
311
|
+
sources: [{ url: "https://registry.npmjs.org/@anthropic-ai/claude-code/latest" }],
|
|
312
|
+
},
|
|
313
|
+
claudeSdk: {
|
|
314
|
+
key: "claude-sdk",
|
|
315
|
+
// The `@anthropic-ai/sdk` version *bundled inside the Claude Code
|
|
316
|
+
// release* — the value stamped into the OAuth refresh User-Agent template
|
|
317
|
+
// (`anthropic-sdk-typescript/{claude_code_sdk_version} userOAuthProvider`).
|
|
318
|
+
// npm's standalone SDK is a different release line and is deliberately not
|
|
319
|
+
// discovered: it would advertise a version Claude Code never bundled. Bump
|
|
320
|
+
// alongside the CLI. Read it from the shipped native binary, which defines
|
|
321
|
+
// the version string the template interpolates — never from guesswork.
|
|
322
|
+
fallback: "0.128.0",
|
|
323
|
+
sources: [],
|
|
324
|
+
},
|
|
325
|
+
github: {
|
|
326
|
+
key: "github-copilot-chat",
|
|
327
|
+
fallback: "0.43.0",
|
|
328
|
+
sources: [
|
|
329
|
+
{
|
|
330
|
+
url: "https://api.github.com/repos/microsoft/vscode-copilot-chat/releases/latest",
|
|
331
|
+
extract: githubReleaseVersion,
|
|
332
|
+
},
|
|
333
|
+
],
|
|
334
|
+
},
|
|
335
|
+
kilo: {
|
|
336
|
+
key: "kilo-code",
|
|
337
|
+
fallback: "7.8.14",
|
|
338
|
+
sources: [{ url: "https://open-vsx.org/api/kilocode/kilo-code" }],
|
|
339
|
+
},
|
|
340
|
+
muse: {
|
|
341
|
+
key: "muse-code",
|
|
342
|
+
fallback: "1.4.10-R6427.1",
|
|
343
|
+
sources: [{ url: "https://api.meta.ai/muse-code/channels/muse-stable" }],
|
|
344
|
+
},
|
|
345
|
+
zcode: {
|
|
346
|
+
key: "zcode",
|
|
347
|
+
fallback: "3.14.3",
|
|
348
|
+
sources: [
|
|
349
|
+
{
|
|
350
|
+
url: "https://api.github.com/repos/zai-org/ZCode/releases/latest",
|
|
351
|
+
extract: githubReleaseVersion,
|
|
352
|
+
},
|
|
353
|
+
],
|
|
354
|
+
},
|
|
355
|
+
} as const;
|
|
356
|
+
|
|
357
|
+
const resolvers = {
|
|
358
|
+
antigravity: createClientVersionResolver({ ...VERSION_SOURCES.antigravity, client: "antigravity" }),
|
|
359
|
+
qoder: createClientVersionResolver({ ...VERSION_SOURCES.qoder, client: "qoder" }),
|
|
360
|
+
opencode: createClientVersionResolver({ ...VERSION_SOURCES.opencode, client: "opencode" }),
|
|
361
|
+
commandcode: createClientVersionResolver({ ...VERSION_SOURCES.commandcode, client: "command-code" }),
|
|
362
|
+
grok: createClientVersionResolver({ ...VERSION_SOURCES.grok, client: "grok" }),
|
|
363
|
+
clineClient: createClientVersionResolver({ ...VERSION_SOURCES.clineClient, client: "cline" }),
|
|
364
|
+
clineSdk: createClientVersionResolver({ ...VERSION_SOURCES.clineSdk, client: "cline-sdk" }),
|
|
365
|
+
codex: createClientVersionResolver({ ...VERSION_SOURCES.codex, client: "codex" }),
|
|
366
|
+
workbuddyClient: createClientVersionResolver({ ...VERSION_SOURCES.workbuddyClient, client: "workbuddy" }),
|
|
367
|
+
workbuddyCnClient: createClientVersionResolver({ ...VERSION_SOURCES.workbuddyCnClient, client: "workbuddy-cn" }),
|
|
368
|
+
workbuddyCli: createClientVersionResolver({ ...VERSION_SOURCES.workbuddyCli, client: "codebuddy" }),
|
|
369
|
+
kimiCli: createClientVersionResolver({ ...VERSION_SOURCES.kimiCli, client: "kimi" }),
|
|
370
|
+
codebuddy: createClientVersionResolver({ ...VERSION_SOURCES.codebuddy, client: "codebuddy" }),
|
|
371
|
+
codebuddyCn: createClientVersionResolver({ ...VERSION_SOURCES.codebuddyCn, client: "codebuddy" }),
|
|
372
|
+
claudeCli: createClientVersionResolver({ ...VERSION_SOURCES.claudeCli, client: "claude" }),
|
|
373
|
+
claudeSdk: createClientVersionResolver({ ...VERSION_SOURCES.claudeSdk, client: "claude-sdk" }),
|
|
374
|
+
kiro: createClientVersionResolver({ ...VERSION_SOURCES.kiro, client: "kiro" }),
|
|
375
|
+
github: createClientVersionResolver({ ...VERSION_SOURCES.github, client: "github-copilot" }),
|
|
376
|
+
kilo: createClientVersionResolver({ ...VERSION_SOURCES.kilo, client: "kilo" }),
|
|
377
|
+
muse: createClientVersionResolver({ ...VERSION_SOURCES.muse, client: "muse" }),
|
|
378
|
+
zcode: createClientVersionResolver({ ...VERSION_SOURCES.zcode, client: "zcode" }),
|
|
379
|
+
} satisfies Record<keyof typeof VERSION_SOURCES, ClientVersionResolver>;
|
|
380
|
+
const PROVIDER_VERSION_RESOLVERS: Readonly<Record<string, ClientVersionResolver>> = {
|
|
381
|
+
antigravity: resolvers.antigravity,
|
|
382
|
+
grok: resolvers.grok,
|
|
383
|
+
xai: resolvers.grok,
|
|
384
|
+
opencode: resolvers.opencode,
|
|
385
|
+
"opencode-zen": resolvers.opencode,
|
|
386
|
+
"opencode-go": resolvers.opencode,
|
|
387
|
+
cline: resolvers.clineClient,
|
|
388
|
+
codex: resolvers.codex,
|
|
389
|
+
qoder: resolvers.qoder,
|
|
390
|
+
commandcode: resolvers.commandcode,
|
|
391
|
+
workbuddy: resolvers.workbuddyClient,
|
|
392
|
+
workbuddycn: resolvers.workbuddyCnClient,
|
|
393
|
+
cb: resolvers.codebuddy,
|
|
394
|
+
cbcn: resolvers.codebuddyCn,
|
|
395
|
+
kimi: resolvers.kimiCli,
|
|
396
|
+
kiro: resolvers.kiro,
|
|
397
|
+
anthropic: resolvers.claudeCli,
|
|
398
|
+
claude: resolvers.claudeCli,
|
|
399
|
+
github: resolvers.github,
|
|
400
|
+
kilo: resolvers.kilo,
|
|
401
|
+
muse: resolvers.muse,
|
|
402
|
+
zcode: resolvers.zcode,
|
|
403
|
+
};
|
|
404
|
+
|
|
405
|
+
/** Returns the current client version without performing network I/O. */
|
|
406
|
+
export function getProviderClientVersion(providerId: string): ClientVersionSnapshot | undefined {
|
|
407
|
+
return PROVIDER_VERSION_RESOLVERS[providerId.trim().toLowerCase()]?.snapshot();
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
/** Live Codex and Claude CLI versions for route-identity choices. */
|
|
411
|
+
export function getRouteIdentityVersions(): {
|
|
412
|
+
readonly codex: string;
|
|
413
|
+
readonly claude: string;
|
|
414
|
+
} {
|
|
415
|
+
return { codex: getCodexVersion(), claude: getClaudeCliVersion() };
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
/** Refreshes every provider version resolver in parallel; failures keep fallbacks. */
|
|
419
|
+
export async function refreshProviderClientVersions(): Promise<void> {
|
|
420
|
+
const resolversToRefresh = [...new Set(Object.values(PROVIDER_VERSION_RESOLVERS))];
|
|
421
|
+
await Promise.allSettled(resolversToRefresh.map((resolver) => resolver.ensure()));
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
/** One client identity still running on its pinned fallback. */
|
|
425
|
+
export interface PinnedClientVersion {
|
|
426
|
+
readonly client: string;
|
|
427
|
+
/** The fallback in force, which is what every request is currently sending. */
|
|
428
|
+
readonly version: string;
|
|
429
|
+
/** The lowest version the upstream accepted when it last answered. */
|
|
430
|
+
readonly minVersion?: string;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
/**
|
|
434
|
+
* Client identities whose version discovery has not succeeded.
|
|
435
|
+
*
|
|
436
|
+
* Every header this module builds is version-aware, and a provider that starts
|
|
437
|
+
* gating on it refuses with wording indistinguishable from a dead credential —
|
|
438
|
+
* Cline's is "please make sure you're using the latest version and
|
|
439
|
+
* re-authenticate". That makes a stuck fallback an operational fact an operator
|
|
440
|
+
* needs *before* it presents as an auth failure, and until now nothing could
|
|
441
|
+
* tell a pinned fallback from a discovered version: only the synchronous getter
|
|
442
|
+
* was exported, so the `source` the resolver already tracked was unreadable
|
|
443
|
+
* outside this module.
|
|
444
|
+
*
|
|
445
|
+
* Read-only and never fetched: this reports what is in force right now, for the
|
|
446
|
+
* same reason the getters never fetch. An empty list is the healthy answer.
|
|
447
|
+
*/
|
|
448
|
+
export function pinnedClientVersions(): readonly PinnedClientVersion[] {
|
|
449
|
+
const pinned: PinnedClientVersion[] = [];
|
|
450
|
+
for (const resolver of new Set(Object.values(PROVIDER_VERSION_RESOLVERS))) {
|
|
451
|
+
const snapshot = resolver.snapshot();
|
|
452
|
+
if (snapshot.source !== "fallback") continue;
|
|
453
|
+
pinned.push({
|
|
454
|
+
client: snapshot.client,
|
|
455
|
+
version: snapshot.version,
|
|
456
|
+
...(resolver.minVersion === undefined ? {} : { minVersion: resolver.minVersion }),
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
return pinned;
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
/**
|
|
463
|
+
* The accessors every table entry needs, generated from its resolver.
|
|
464
|
+
*
|
|
465
|
+
* Request paths only use the synchronous getter. Network discovery belongs to
|
|
466
|
+
* `refreshProviderClientVersions`, so dispatch and OAuth flows never wait on a
|
|
467
|
+
* version endpoint.
|
|
468
|
+
*/
|
|
469
|
+
function accessor<K extends keyof typeof resolvers>(name: K): {
|
|
470
|
+
readonly get: () => string;
|
|
471
|
+
readonly adopt: (version: string) => void;
|
|
472
|
+
readonly reset: (version?: string | null) => void;
|
|
473
|
+
} {
|
|
474
|
+
const resolver = resolvers[name];
|
|
475
|
+
return {
|
|
476
|
+
get: () => resolver.get(),
|
|
477
|
+
adopt: (version: string) => {
|
|
478
|
+
resolver.adopt(version);
|
|
479
|
+
},
|
|
480
|
+
reset: (version?: string | null) => {
|
|
481
|
+
resolver.reset(version);
|
|
482
|
+
},
|
|
483
|
+
};
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
export const getQoderVersion = accessor("qoder").get;
|
|
487
|
+
export const getAntigravityVersion = accessor("antigravity").get;
|
|
488
|
+
|
|
489
|
+
export const getOpenCodeVersion = accessor("opencode").get;
|
|
490
|
+
|
|
491
|
+
export const getCommandCodeVersion = accessor("commandcode").get;
|
|
492
|
+
|
|
493
|
+
export const getGrokVersion = accessor("grok").get;
|
|
494
|
+
|
|
495
|
+
export function buildGrokUserAgent(version = getGrokVersion()): string {
|
|
496
|
+
return buildGrokShellUserAgent(version);
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
export function buildGrokAuthUserAgent(version = getGrokVersion()): string {
|
|
500
|
+
return buildGrokAuthUserAgentString(version);
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
|
|
504
|
+
export const getClineClientVersion = accessor("clineClient").get;
|
|
505
|
+
export const getClineSdkVersion = accessor("clineSdk").get;
|
|
506
|
+
export const _resetClineClientVersionCache = accessor("clineClient").reset;
|
|
507
|
+
export const _resetClineSdkVersionCache = accessor("clineSdk").reset;
|
|
508
|
+
|
|
509
|
+
export const getCodexVersion = accessor("codex").get;
|
|
510
|
+
|
|
511
|
+
export const getWorkBuddyClientVersion = accessor("workbuddyClient").get;
|
|
512
|
+
export const getWorkBuddyCnClientVersion = accessor("workbuddyCnClient").get;
|
|
513
|
+
export const getWorkBuddyCliVersion = accessor("workbuddyCli").get;
|
|
514
|
+
|
|
515
|
+
export function buildWorkBuddyUserAgent(
|
|
516
|
+
clientVersion = getWorkBuddyClientVersion(),
|
|
517
|
+
cliVersion = getWorkBuddyCliVersion(),
|
|
518
|
+
): string {
|
|
519
|
+
return `WorkBuddy/${clientVersion} WorkBuddy AI/${clientVersion} CLI/${cliVersion}`;
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
export const _resetWorkBuddyCnClientVersionCache = accessor("workbuddyCnClient").reset;
|
|
523
|
+
|
|
524
|
+
export const getKimiCliVersion = accessor("kimiCli").get;
|
|
525
|
+
|
|
526
|
+
export const getCodeBuddyVersion = accessor("codebuddy").get;
|
|
527
|
+
export const getCodeBuddyCnVersion = accessor("codebuddyCn").get;
|
|
528
|
+
export function buildCodeBuddyUserAgent(
|
|
529
|
+
identity: "IDE" | "CLI",
|
|
530
|
+
version = identity === "CLI" ? getCodeBuddyCnVersion() : getCodeBuddyVersion(),
|
|
531
|
+
): string {
|
|
532
|
+
return `${identity}/${version} CodeBuddy/${version}`;
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
export const _resetCodeBuddyVersionCache = accessor("codebuddy").reset;
|
|
536
|
+
export const _resetCodeBuddyCnVersionCache = accessor("codebuddyCn").reset;
|
|
537
|
+
|
|
538
|
+
export const getClaudeCliVersion = accessor("claudeCli").get;
|
|
539
|
+
export const adoptClaudeCliVersion = accessor("claudeCli").adopt;
|
|
540
|
+
export const _resetClaudeCliVersionCache = accessor("claudeCli").reset;
|
|
541
|
+
export const getClaudeSdkVersion = accessor("claudeSdk").get;
|
|
542
|
+
|
|
543
|
+
export const getKiroVersion = accessor("kiro").get;
|
|
544
|
+
|
|
545
|
+
/**
|
|
546
|
+
* Builds the `x-amz-user-agent` companion header for the generation surface.
|
|
547
|
+
*
|
|
548
|
+
* The upstream pairs this with `user-agent` on every generation request; the
|
|
549
|
+
* short form carries the SDK identity and the `KiroIDE-{version}-{machineId}`
|
|
550
|
+
* device marker and nothing else.
|
|
551
|
+
*/
|
|
552
|
+
export function buildKiroAmzUserAgent(version = getKiroVersion(), machineId = ""): string {
|
|
553
|
+
return `aws-sdk-js/${KIRO_RUNTIME_SDK_VERSION} KiroIDE-${version}-${machineId}`;
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
/**
|
|
557
|
+
* Builds the full data-plane `user-agent`.
|
|
558
|
+
*
|
|
559
|
+
* Shape: SDK version, `ua/2.1`, the OS and node segments, the API and module
|
|
560
|
+
* markers, and the `KiroIDE-{version}-{machineId}` device marker. The device
|
|
561
|
+
* marker is the part the upstream correlates on, so it is never omitted — a
|
|
562
|
+
* blank machine id advertises the account as a device with no identity, which
|
|
563
|
+
* is a shape no real client produces.
|
|
564
|
+
*/
|
|
565
|
+
export function buildKiroUserAgent(version = getKiroVersion(), machineId = ""): string {
|
|
566
|
+
return (
|
|
567
|
+
`aws-sdk-js/${KIRO_RUNTIME_SDK_VERSION} ua/2.1 ` +
|
|
568
|
+
`os/${KIRO_SYSTEM_VERSION} lang/js md/nodejs#${KIRO_NODE_VERSION} ` +
|
|
569
|
+
`api/codewhispererstreaming#${KIRO_RUNTIME_SDK_VERSION} m/E ` +
|
|
570
|
+
`KiroIDE-${version}-${machineId}`
|
|
571
|
+
);
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
/**
|
|
575
|
+
* Builds the `x-amz-user-agent` companion for an AWS SSO OIDC request.
|
|
576
|
+
*
|
|
577
|
+
* The login and token-refresh surfaces are served by a different AWS SDK
|
|
578
|
+
* client, so they carry that client's version and no device marker — the
|
|
579
|
+
* observed client does not send one there.
|
|
580
|
+
*/
|
|
581
|
+
export function buildKiroSsoAmzUserAgent(): string {
|
|
582
|
+
return `aws-sdk-js/${KIRO_SSO_SDK_VERSION} KiroIDE`;
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
/** Builds the full `user-agent` for an AWS SSO OIDC request. */
|
|
586
|
+
export function buildKiroSsoUserAgent(): string {
|
|
587
|
+
return (
|
|
588
|
+
`aws-sdk-js/${KIRO_SSO_SDK_VERSION} ua/2.1 ` +
|
|
589
|
+
`os/${KIRO_SYSTEM_VERSION} lang/js md/nodejs#${KIRO_NODE_VERSION} ` +
|
|
590
|
+
`api/sso-oidc#${KIRO_SSO_SDK_VERSION} m/E KiroIDE`
|
|
591
|
+
);
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
/**
|
|
595
|
+
* Builds the `user-agent` the model-catalog and usage surfaces expect.
|
|
596
|
+
*
|
|
597
|
+
* Their observed client identifies as `codewhispererruntime` rather than
|
|
598
|
+
* `codewhispererstreaming`, and carries the `m/N,E` module marker.
|
|
599
|
+
*/
|
|
600
|
+
export function buildKiroRuntimeUserAgent(version = getKiroVersion(), machineId = ""): string {
|
|
601
|
+
return (
|
|
602
|
+
`aws-sdk-js/${KIRO_RUNTIME_SDK_VERSION} ua/2.1 ` +
|
|
603
|
+
`os/${KIRO_SYSTEM_VERSION} lang/js md/nodejs#${KIRO_NODE_VERSION} ` +
|
|
604
|
+
`api/codewhispererruntime#${KIRO_RUNTIME_SDK_VERSION} m/N,E ` +
|
|
605
|
+
`KiroIDE-${version}-${machineId}`
|
|
606
|
+
);
|
|
607
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom provider CLI identity headers.
|
|
3
|
+
*
|
|
4
|
+
* Emits official CLI headers for OpenAI-compatible (Codex CLI) and
|
|
5
|
+
* Anthropic-compatible (Claude Code CLI) endpoints so upstream requests
|
|
6
|
+
* reflect realistic first-party tooling instead of naked node/bun user agents.
|
|
7
|
+
*
|
|
8
|
+
* Both sides read their version from the live resolver getters rather than the
|
|
9
|
+
* frozen `claude-fingerprint` constants: those constants are evaluated once at
|
|
10
|
+
* module load from the pinned fallback and never move, so a custom Anthropic
|
|
11
|
+
* endpoint would have shipped the pinned Claude CLI version forever even after
|
|
12
|
+
* discovery resolved a newer one. The getters are synchronous and TTL-cached,
|
|
13
|
+
* so this costs a cache read per dispatch.
|
|
14
|
+
*/
|
|
15
|
+
import {
|
|
16
|
+
getClaudeCliVersion,
|
|
17
|
+
getClaudeSdkVersion,
|
|
18
|
+
getCodexVersion,
|
|
19
|
+
} from "./client-versions";
|
|
20
|
+
import { buildCodexUserAgent } from "./cli-platform";
|
|
21
|
+
import type { WireFamily } from "../../protocol/canonical-model";
|
|
22
|
+
|
|
23
|
+
/** Builds Codex CLI identity headers for OpenAI-compatible wire families. */
|
|
24
|
+
export function buildCustomCodexCliHeaders(): Record<string, string> {
|
|
25
|
+
const version = getCodexVersion();
|
|
26
|
+
return {
|
|
27
|
+
"user-agent": buildCodexUserAgent(version),
|
|
28
|
+
originator: "codex_cli_rs",
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* The Claude Code User-Agent, on the live CLI version.
|
|
34
|
+
*
|
|
35
|
+
* This is the route-level default for a provider whose operator set no client
|
|
36
|
+
* identity of their own: a bare API key identifies as the Claude Code CLI
|
|
37
|
+
* rather than as nothing. It used to be the Codex CLI identity
|
|
38
|
+
* (`codex_cli_rs/…`), which named a different vendor's client on requests that
|
|
39
|
+
* most often reached neither — an upstream that keys on the client string
|
|
40
|
+
* would act on it.
|
|
41
|
+
*
|
|
42
|
+
* The version comes from the live getter for the same reason
|
|
43
|
+
* {@link buildCustomClaudeCliHeaders} does: the pinned `claude-fingerprint`
|
|
44
|
+
* constants are evaluated once at module load and never move, so a default
|
|
45
|
+
* built from them would send a Claude CLI version the client stopped shipping
|
|
46
|
+
* and still answer to.
|
|
47
|
+
*/
|
|
48
|
+
export function buildClaudeCliUserAgent(): string {
|
|
49
|
+
return `claude-cli/${getClaudeCliVersion()} (external, cli)`;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Builds Claude Code CLI identity headers for Anthropic-compatible wire families. */
|
|
53
|
+
export function buildCustomClaudeCliHeaders(): Record<string, string> {
|
|
54
|
+
return {
|
|
55
|
+
"User-Agent": buildClaudeCliUserAgent(),
|
|
56
|
+
"x-app": "cli",
|
|
57
|
+
"X-Stainless-Package-Version": getClaudeSdkVersion(),
|
|
58
|
+
"X-Stainless-Runtime": "node",
|
|
59
|
+
"X-Stainless-Retry-Count": "0",
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Returns the appropriate CLI headers based on target wire family.
|
|
65
|
+
* Messages wire family gets Claude CLI headers; chat / responses get Codex CLI headers.
|
|
66
|
+
*/
|
|
67
|
+
export function resolveCustomCliHeaders(wireFamily: WireFamily): Record<string, string> {
|
|
68
|
+
if (wireFamily === "messages") {
|
|
69
|
+
return buildCustomClaudeCliHeaders();
|
|
70
|
+
}
|
|
71
|
+
return buildCustomCodexCliHeaders();
|
|
72
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { CARTETHYIA_VERSION } from "../../version";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Gateway identity stamped on outbound upstream traffic.
|
|
5
|
+
*
|
|
6
|
+
* `Cartethyia/<version>` rides the dispatch path only for providers that
|
|
7
|
+
* explicitly opt in (`gatewayUserAgent: true` on their spec/registration).
|
|
8
|
+
* Providers with their own first-party identity — Codex (`codex_cli_rs`),
|
|
9
|
+
* Claude Code (`claude-cli`), and any adapter stamping bespoke headers —
|
|
10
|
+
* are never touched: cloaking those would break the identity the upstream
|
|
11
|
+
* expects. BYOK custom providers keep their official CLI cloaking unless
|
|
12
|
+
* the operator explicitly provisions the gateway agent instead.
|
|
13
|
+
*/
|
|
14
|
+
export const GATEWAY_USER_AGENT = `Cartethyia/${CARTETHYIA_VERSION}` as const;
|
|
15
|
+
|