cartethyia 2.7.4 → 2.7.6
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 +5 -0
- package/README.md +18 -6
- package/dist/dashboard/assets/BannedPage-B1N603cM.js +1 -0
- package/dist/dashboard/assets/BannedPage-B1N603cM.js.gz +0 -0
- package/dist/dashboard/assets/CliToolDetailPage-9q4_4NoK.js +3 -0
- package/dist/dashboard/assets/CliToolDetailPage-9q4_4NoK.js.gz +0 -0
- package/dist/dashboard/assets/CliToolsPage-DwshGtK-.js +1 -0
- package/dist/dashboard/assets/CliToolsPage-DwshGtK-.js.gz +0 -0
- package/dist/dashboard/assets/CombosPage-D762MIkp.js +1 -0
- package/dist/dashboard/assets/CombosPage-D762MIkp.js.gz +0 -0
- package/dist/dashboard/assets/ConsoleLogPage-KRYjHZsX.js +1 -0
- package/dist/dashboard/assets/ConsoleLogPage-KRYjHZsX.js.gz +0 -0
- package/dist/dashboard/assets/CustomizationPage-DXsxk5uM.js +1 -0
- package/dist/dashboard/assets/CustomizationPage-DXsxk5uM.js.gz +0 -0
- package/dist/dashboard/assets/HealthEventsModal-BEjAjD4F.js +1 -0
- package/dist/dashboard/assets/HealthEventsModal-BEjAjD4F.js.gz +0 -0
- package/dist/dashboard/assets/InjectSystemPromptPanel-d5v3K_Yc.js +899 -0
- package/dist/dashboard/assets/InjectSystemPromptPanel-d5v3K_Yc.js.gz +0 -0
- package/dist/dashboard/assets/LoginPage-Ccv4tjNS.js +1 -0
- package/dist/dashboard/assets/LoginPage-Ccv4tjNS.js.gz +0 -0
- package/dist/dashboard/assets/{ModelPicker-BMS2t8BA.js → ModelPicker-C6WlpU5E.js} +1 -1
- package/dist/dashboard/assets/ModelPicker-C6WlpU5E.js.gz +0 -0
- package/dist/dashboard/assets/OverviewPage-DN9fYNWA.js +1 -0
- package/dist/dashboard/assets/OverviewPage-DN9fYNWA.js.gz +0 -0
- package/dist/dashboard/assets/ProviderDetailPage-BY0ieUgz.js +5 -0
- package/dist/dashboard/assets/ProviderDetailPage-BY0ieUgz.js.gz +0 -0
- package/dist/dashboard/assets/ProviderIcon-jjqXJDA3.js +1 -0
- package/dist/dashboard/assets/ProviderIcon-jjqXJDA3.js.gz +0 -0
- package/dist/dashboard/assets/ProvidersPage-DNsbfea2.js +1 -0
- package/dist/dashboard/assets/ProvidersPage-DNsbfea2.js.gz +0 -0
- package/dist/dashboard/assets/{ProxyPage-lsrx7NYg.js → ProxyPage-DxjvUzSD.js} +1 -1
- package/dist/dashboard/assets/ProxyPage-DxjvUzSD.js.gz +0 -0
- package/dist/dashboard/assets/QuotaPage-OaHScjpX.js +1 -0
- package/dist/dashboard/assets/QuotaPage-OaHScjpX.js.gz +0 -0
- package/dist/dashboard/assets/SettingsPage-BW4AKj2H.js +1 -0
- package/dist/dashboard/assets/SettingsPage-BW4AKj2H.js.gz +0 -0
- package/dist/dashboard/assets/SetupPage-44BZrxFC.js +1 -0
- package/dist/dashboard/assets/SetupPage-44BZrxFC.js.gz +0 -0
- package/dist/dashboard/assets/{StudioPage-Cq5tW7hW.js → StudioPage-DRPavCdU.js} +4 -4
- package/dist/dashboard/assets/StudioPage-DRPavCdU.js.gz +0 -0
- package/dist/dashboard/assets/ToolIcon-CfeLA-Z_.js +1 -0
- package/dist/dashboard/assets/ToolIcon-CfeLA-Z_.js.gz +0 -0
- package/dist/dashboard/assets/UsagePage-B7M7LvMM.js +56 -0
- package/dist/dashboard/assets/UsagePage-B7M7LvMM.js.gz +0 -0
- package/dist/dashboard/assets/api-keys-KvX83mRe.js +1 -0
- package/dist/dashboard/assets/api-keys-KvX83mRe.js.gz +0 -0
- package/dist/dashboard/assets/app-DRnQLhsc.js +9 -0
- package/dist/dashboard/assets/app-DRnQLhsc.js.gz +0 -0
- package/dist/dashboard/assets/app-mweRcsKp.css +2 -0
- package/dist/dashboard/assets/app-mweRcsKp.css.gz +0 -0
- package/dist/dashboard/assets/assert-CidQVoNo.js +1 -0
- package/dist/dashboard/assets/assert-CidQVoNo.js.gz +0 -0
- package/dist/dashboard/assets/{badge-D9CS6dZk.js → badge-BaX2GTrn.js} +1 -1
- package/dist/dashboard/assets/badge-BaX2GTrn.js.gz +0 -0
- package/dist/dashboard/assets/{banner-DympBNq4.js → banner-DFH4Bkte.js} +1 -1
- package/dist/dashboard/assets/banner-DFH4Bkte.js.gz +0 -0
- package/dist/dashboard/assets/brand/login_register.jpg +0 -0
- package/dist/dashboard/assets/brand/login_register_initial.jpg +0 -0
- package/dist/dashboard/assets/brand/og_bansos.jpg +0 -0
- package/dist/dashboard/assets/brand/og_image.jpg +0 -0
- package/dist/dashboard/assets/{card-ibRWU_uT.js → card-CxDw0lK6.js} +1 -1
- package/dist/dashboard/assets/card-CxDw0lK6.js.gz +0 -0
- package/dist/dashboard/assets/chevron-left-Bf6CaTSJ.js +1 -0
- package/dist/dashboard/assets/chevron-left-Bf6CaTSJ.js.gz +0 -0
- package/dist/dashboard/assets/circle-question-mark-Cz4un8sH.js +1 -0
- package/dist/dashboard/assets/circle-question-mark-Cz4un8sH.js.gz +0 -0
- package/dist/dashboard/assets/cli-tools-Bwv5-zGZ.js +1 -0
- package/dist/dashboard/assets/cli-tools-Bwv5-zGZ.js.gz +0 -0
- package/dist/dashboard/assets/{clipboard-button-DJm-9pz7.js → clipboard-button-DfS1ntiq.js} +1 -1
- package/dist/dashboard/assets/clipboard-button-DfS1ntiq.js.gz +0 -0
- package/dist/dashboard/assets/dialog-BK-NRr5u.js +1 -0
- package/dist/dashboard/assets/dialog-BK-NRr5u.js.gz +0 -0
- package/dist/dashboard/assets/{drawer-CqGYeOrd.js → drawer-QqPul6sC.js} +1 -1
- package/dist/dashboard/assets/drawer-QqPul6sC.js.gz +0 -0
- package/dist/dashboard/assets/entry-BMlYJVFj.js +1 -0
- package/dist/dashboard/assets/entry-BMlYJVFj.js.gz +0 -0
- package/dist/dashboard/assets/entry-D6WvojeD.js +4 -0
- package/dist/dashboard/assets/entry-D6WvojeD.js.gz +0 -0
- package/dist/dashboard/assets/entry-Dmx7gBiN.js +1 -0
- package/dist/dashboard/assets/entry-Dmx7gBiN.js.gz +0 -0
- package/dist/dashboard/assets/{formatters-D-MTJxMr.js → formatters-u7JPB5BX.js} +1 -1
- package/dist/dashboard/assets/formatters-u7JPB5BX.js.gz +0 -0
- package/dist/dashboard/assets/house-h9AZlJuT.js +1 -0
- package/dist/dashboard/assets/house-h9AZlJuT.js.gz +0 -0
- package/dist/dashboard/assets/{index-DBNPOfhV.js → index-Ko4dLRnV.js} +2 -2
- package/dist/dashboard/assets/index-Ko4dLRnV.js.gz +0 -0
- package/dist/dashboard/assets/{inline-BT0zntEr.js → inline-CHJQwxLa.js} +1 -1
- package/dist/dashboard/assets/inline-CHJQwxLa.js.gz +0 -0
- package/dist/dashboard/assets/{input-Da2ZViWg.js → input-BlmlizVV.js} +1 -1
- package/dist/dashboard/assets/input-BlmlizVV.js.gz +0 -0
- package/dist/dashboard/assets/{layout-BXNeLw6M.js → layout-Bz93I-yE.js} +1 -1
- package/dist/dashboard/assets/layout-Bz93I-yE.js.gz +0 -0
- package/dist/dashboard/assets/{list-row-BycOrrIV.js → list-row-Ml16KCfu.js} +1 -1
- package/dist/dashboard/assets/list-row-Ml16KCfu.js.gz +0 -0
- package/dist/dashboard/assets/live-7_QpnYGu.js +1 -0
- package/dist/dashboard/assets/live-7_QpnYGu.js.gz +0 -0
- package/dist/dashboard/assets/{mutation-Rr0TIvcj.js → mutation-GU7XdEjz.js} +1 -1
- package/dist/dashboard/assets/mutation-GU7XdEjz.js.gz +0 -0
- package/dist/dashboard/assets/network-CuMDaTzT.js +1 -0
- package/dist/dashboard/assets/network-CuMDaTzT.js.gz +0 -0
- package/dist/dashboard/assets/numbers-CoqpaDMx.js +2 -0
- package/dist/dashboard/assets/numbers-CoqpaDMx.js.gz +0 -0
- package/dist/dashboard/assets/pagination-B5aOoweZ.js +1 -0
- package/dist/dashboard/assets/pagination-B5aOoweZ.js.gz +0 -0
- package/dist/dashboard/assets/providers/zai.webp +0 -0
- package/dist/dashboard/assets/providers/zcode.webp +0 -0
- package/dist/dashboard/assets/{query-keys-BloKtaXJ.js → query-keys-YSoQOUh6.js} +1 -1
- package/dist/dashboard/assets/{query-keys-BloKtaXJ.js.gz → query-keys-YSoQOUh6.js.gz} +0 -0
- package/dist/dashboard/assets/quota-DJ1QlAOq.js +1 -0
- package/dist/dashboard/assets/quota-DJ1QlAOq.js.gz +0 -0
- package/dist/dashboard/assets/routing-fnCsxgNO.js +1 -0
- package/dist/dashboard/assets/routing-fnCsxgNO.js.gz +0 -0
- package/dist/dashboard/assets/{select-BIYIBkMU.js → select-BHqpd-bg.js} +2 -2
- package/dist/dashboard/assets/select-BHqpd-bg.js.gz +0 -0
- package/dist/dashboard/assets/settings-BxslsErn.js +1 -0
- package/dist/dashboard/assets/settings-BxslsErn.js.gz +0 -0
- package/dist/dashboard/assets/shield-BMQNxORh.js +1 -0
- package/dist/dashboard/assets/shield-BMQNxORh.js.gz +0 -0
- package/dist/dashboard/assets/{stack-DfgnFDWY.js → stack-j7cXjgYX.js} +1 -1
- package/dist/dashboard/assets/stack-j7cXjgYX.js.gz +0 -0
- package/dist/dashboard/assets/{state-CkfdYWel.js → state-DHmEnLa2.js} +1 -1
- package/dist/dashboard/assets/state-DHmEnLa2.js.gz +0 -0
- package/dist/dashboard/assets/{switch-SYm237HG.js → switch-DmZcyTIC.js} +1 -1
- package/dist/dashboard/assets/switch-DmZcyTIC.js.gz +0 -0
- package/dist/dashboard/assets/{useMutation-BQqCRNIi.js → useMutation-CbCP4w1o.js} +1 -1
- package/dist/dashboard/assets/useMutation-CbCP4w1o.js.gz +0 -0
- package/dist/dashboard/console-backgrounds.jpg +0 -0
- package/dist/dashboard/console-backgrounds_initial.jpg +0 -0
- package/dist/dashboard/index.html +2 -2
- package/dist/dashboard/index.html.gz +0 -0
- package/dist/dashboard/precompressed-assets.json +60 -59
- package/migrations/full-postgres/0036_system_prompt_presets_refs.sql +10 -0
- package/migrations/full-postgres/0037_share_concurrency_scope.sql +3 -0
- package/migrations/full-postgres/0038_add_accounts_quota_snapshot.sql +7 -0
- package/migrations/full-postgres/0039_add_telemetry_provider_model_indexes.sql +13 -0
- package/migrations/full-postgres/0040_add_models_dialect.sql +3 -0
- package/migrations/full-postgres/0041_add_daily_checkin_ledger_account_fk.sql +7 -0
- package/migrations/full-postgres/0042_add_telemetry_degenerate_stop.sql +14 -0
- package/migrations/lite-sqlite3/0036_system_prompt_presets_refs.sql +14 -0
- package/migrations/lite-sqlite3/0037_share_concurrency_scope.sql +3 -0
- package/migrations/lite-sqlite3/0038_add_accounts_quota_snapshot.sql +4 -0
- package/migrations/lite-sqlite3/0039_add_telemetry_provider_model_indexes.sql +6 -0
- package/migrations/lite-sqlite3/0040_add_models_dialect.sql +3 -0
- package/migrations/lite-sqlite3/0041_add_daily_checkin_ledger_account_fk.sql +26 -0
- package/migrations/lite-sqlite3/0042_add_telemetry_degenerate_stop.sql +12 -0
- package/package.json +4 -6
- package/scripts/cli/update.ts +15 -41
- package/src/boot/app.ts +58 -2
- package/src/boot/dependencies.ts +794 -732
- package/src/boot/lifecycle.ts +11 -12
- package/src/config/cooldowns.ts +34 -55
- package/src/config/network.ts +1 -1
- package/src/config/package-paths.ts +1 -1
- package/src/config/providers.ts +19 -14
- package/src/config/resources.ts +0 -5
- package/src/config/runtime.ts +2 -5
- package/src/config/spec.ts +33 -6
- package/src/config/usage.ts +27 -0
- package/src/console/api-keys/ban-constants.ts +38 -0
- package/src/console/api-keys/contracts.ts +71 -62
- package/src/console/api-keys/routes.ts +56 -24
- package/src/console/auth/access.ts +4 -4
- package/src/console/auth/account-reset.ts +1 -1
- package/src/console/auth/audit-recorder.ts +1 -1
- package/src/console/auth/lockout.ts +7 -3
- package/src/console/auth/row-coercion.ts +57 -12
- package/src/console/auth/session-resolver.ts +1 -1
- package/src/console/auth/session-service.ts +8 -2
- package/src/console/auth/session.ts +37 -31
- package/src/console/auth/setup-service.ts +4 -3
- package/src/console/auth/user-store.ts +1 -1
- package/src/console/backup/9router-map.ts +0 -3
- package/src/console/backup/contracts.ts +9 -9
- package/src/console/backup/export-endpoint.ts +5 -6
- package/src/console/backup/nine-router.ts +1 -7
- package/src/console/backup/routes.ts +29 -33
- package/src/console/backup/service.ts +468 -468
- package/src/console/backup/store.ts +47 -29
- package/src/console/backup/validate.ts +11 -1
- package/src/console/cli-tools/contracts.ts +43 -299
- package/src/console/cli-tools/fs-ops.ts +29 -0
- package/src/console/cli-tools/injectors/claude.ts +3 -3
- package/src/console/cli-tools/injectors/codex.ts +181 -181
- package/src/console/cli-tools/injectors/driver.ts +150 -247
- package/src/console/cli-tools/injectors/kilo.ts +146 -21
- package/src/console/cli-tools/injectors/opencode.ts +176 -153
- package/src/console/cli-tools/routes.ts +7 -1
- package/src/console/cli-tools/service.ts +8 -7
- package/src/console/cli-tools/store.ts +2 -2
- package/src/console/console-router.ts +32 -0
- package/src/console/dashboard-assets.ts +9 -9
- package/src/console/domain-registration.ts +16 -2
- package/src/console/inferhub/client.ts +0 -7
- package/src/console/inferhub/key-store.ts +1 -1
- package/src/console/inferhub/normalize.ts +2 -2
- package/src/console/inferhub/routes.ts +1 -1
- package/src/console/inferhub/types.ts +1 -1
- package/src/console/observability/contracts.ts +7 -1
- package/src/console/observability/live.ts +31 -18
- package/src/console/observability/logs.ts +1 -1
- package/src/console/observability/sse.ts +62 -8
- package/src/console/observability/store.ts +23 -4
- package/src/console/providers/catalog/catalog-projections.ts +1 -1
- package/src/console/providers/catalog/contracts.ts +39 -0
- package/src/console/providers/catalog/model-operations.ts +1 -1
- package/src/console/providers/catalog/provider-operations.ts +95 -17
- package/src/console/providers/catalog/public-model-store.ts +0 -0
- package/src/console/providers/catalog/routes.ts +27 -3
- package/src/console/providers/catalog/store.ts +147 -8
- package/src/console/providers/detail/routes.ts +1 -1
- package/src/console/providers/oauth/callback-listener.ts +100 -18
- package/src/console/providers/oauth/routes.ts +92 -13
- package/src/console/quota/account-quota-global.ts +41 -3
- package/src/console/quota/account-quota-shared.ts +10 -3
- package/src/console/quota/account-quota-tenant.ts +259 -66
- package/src/console/quota/daily-growth-job.ts +308 -0
- package/src/console/quota/native-identity.ts +2 -2
- package/src/console/quota/quota-view.ts +1 -1
- package/src/console/remote-support/routes.ts +1 -1
- package/src/console/remote-support/service.ts +2 -2
- package/src/console/routing/model/contracts.ts +1 -1
- package/src/console/routing/pools/contracts.ts +2 -2
- package/src/console/routing/pools/import-parse.ts +3 -3
- package/src/console/routing/pools/relay-deploy.ts +3 -3
- package/src/console/settings/contracts.ts +29 -2
- package/src/console/settings/store.ts +20 -0
- package/src/console/share/share-router.ts +100 -32
- package/src/console/share/share-stats.ts +11 -13
- package/src/console/share/share-usage.ts +1 -1
- package/src/console/shared/errors.ts +2 -2
- package/src/console/shared/object.ts +18 -0
- package/src/console/shared/read-through-cache.ts +4 -4
- package/src/console/shared/transaction.ts +14 -0
- package/src/console/system-prompt/contracts.ts +89 -12
- package/src/console/system-prompt/routes.ts +98 -45
- package/src/console/updates/apply-update.ts +244 -0
- package/src/console/updates/routes.ts +252 -97
- package/src/main.ts +11 -5
- package/src/network/http2-bidi.ts +1 -1
- package/src/network/ip-utils.ts +298 -0
- package/src/network/outbound-fetch.ts +1 -1
- package/src/network/pool/agent.ts +7 -6
- package/src/network/pool/byte-accounting.ts +1 -1
- package/src/network/pool/resolver.ts +16 -12
- package/src/network/pool/selector.ts +150 -136
- package/src/network/pool-health-machine.ts +1 -1
- package/src/network/rate-limit-verdict.ts +1 -1
- package/src/network/retry.ts +1 -1
- package/src/network/ssrf.ts +20 -71
- package/src/observability/event-log.ts +9 -2
- package/src/observability/event-query.ts +61 -291
- package/src/observability/log-sanitize.ts +1 -1
- package/src/observability/metrics.ts +4 -4
- package/src/observability/payload-capture.ts +6 -5
- package/src/observability/payload-store.ts +1 -1
- package/src/observability/runtime-metrics.ts +1 -1
- package/src/observability/telemetry-buffer.ts +19 -3
- package/src/observability/telemetry-reconciliation.ts +3 -3
- package/src/observability/token-speed.ts +1 -1
- package/src/persistence/connection-url.ts +1 -1
- package/src/persistence/db-handle.ts +1 -1
- package/src/persistence/db-pg.ts +2 -2
- package/src/persistence/db-sqlite.ts +3 -3
- package/src/persistence/dialect.ts +5 -1
- package/src/persistence/readiness.ts +1 -1
- package/src/persistence/redis.ts +1 -1
- package/src/persistence/schema.ts +121 -40
- package/src/persistence/shared-cache.ts +2 -2
- package/src/persistence/sort-order.ts +1 -1
- package/src/persistence/stores/api-key-store.ts +29 -2
- package/src/persistence/stores/share-store.ts +20 -8
- package/src/persistence/system-prompt-store.ts +63 -18
- package/src/persistence/tenant-preferences.ts +1 -1
- package/src/persistence/ttl-cache.ts +3 -3
- package/src/persistence/usage-flush.ts +7 -2
- package/src/protocol/canonical-model.ts +1 -1
- package/src/protocol/codecs.ts +6 -10
- package/src/protocol/dsml.ts +8 -125
- package/src/protocol/image-clamp.ts +2 -2
- package/src/protocol/reasoning-text.ts +1 -1
- package/src/protocol/reasoning.ts +7 -52
- package/src/protocol/registry.ts +50 -15
- package/src/protocol/request/chat.ts +46 -19
- package/src/protocol/request/codex.ts +1 -1
- package/src/protocol/request/messages.ts +46 -14
- package/src/protocol/request/responses.ts +19 -10
- package/src/protocol/response/chat.ts +25 -10
- package/src/protocol/response/codex.ts +1 -1
- package/src/protocol/response/messages.ts +1 -1
- package/src/protocol/response/omp-tool-call-markup.ts +1 -1
- package/src/protocol/response/responses.ts +1 -1
- package/src/protocol/sse-decoder.ts +50 -1
- package/src/protocol/stop-reason.ts +2 -2
- package/src/protocol/think-split.ts +347 -0
- package/src/protocol/translation/attachment-integrity.ts +3 -3
- package/src/protocol/translation/cache-controls.ts +8 -20
- package/src/protocol/translation/capabilities.ts +6 -6
- package/src/protocol/translation/dialect/deepseek.ts +10 -0
- package/src/protocol/translation/dialect/inband.ts +39 -0
- package/src/protocol/translation/dialect/model-thinking.ts +89 -0
- package/src/protocol/translation/dialect/qwen.ts +114 -0
- package/src/protocol/translation/dialect/resolver.ts +83 -0
- package/src/protocol/translation/dialect/rules.ts +93 -0
- package/src/protocol/translation/dialect/thinking-ladder.ts +245 -0
- package/src/protocol/translation/dialect/types.ts +58 -0
- package/src/protocol/translation/quirks.ts +18 -4
- package/src/protocol/translation/thinking.ts +12 -252
- package/src/protocol/translation/tool-id.ts +3 -3
- package/src/protocol/translation/tool-repair.ts +1 -1
- package/src/protocol/upstream/post-json.ts +6 -1
- package/src/providers/adapters/compatible-adapter.ts +71 -4
- package/src/providers/authentication/jwt-validator.ts +0 -5
- package/src/providers/authentication/oauth-client.ts +254 -253
- package/src/providers/authentication/oauth-flow-store.ts +42 -7
- package/src/providers/bundled-discovery-providers.ts +6 -30
- package/src/providers/configured-openai-providers.ts +82 -97
- package/src/providers/default-registry.ts +35 -37
- package/src/providers/discovery/catalog/catalog-format.ts +13 -2
- package/src/providers/discovery/discovery-types.ts +0 -1
- package/src/providers/discovery/openai-model-discovery.ts +2 -2
- package/src/providers/discovery/probe-phases.ts +48 -13
- package/src/providers/discovery/probing-service.ts +6 -8
- package/src/providers/integrations/agentrouter/agentrouter.ts +12 -2
- package/src/providers/integrations/antigravity/antigravity-oauth.ts +0 -1
- package/src/providers/integrations/antigravity/antigravity-protocol.ts +88 -28
- package/src/providers/integrations/antigravity/antigravity-quota.ts +18 -6
- package/src/providers/integrations/antigravity/antigravity.ts +22 -13
- package/src/providers/integrations/buddy/buddy-catalog-shared.ts +1 -1
- package/src/providers/integrations/buddy/buddy-chat-shared.ts +20 -4
- package/src/providers/integrations/buddy/buddy-cli-headers.ts +19 -52
- package/src/providers/integrations/buddy/buddy-identity.ts +86 -0
- package/src/providers/integrations/buddy/buddy-oauth-shared.ts +1 -1
- package/src/providers/integrations/buddy/codebuddy/cn-provider.ts +1 -2
- package/src/providers/integrations/buddy/codebuddy/provider.ts +4 -15
- package/src/providers/integrations/buddy/codebuddy/shared.ts +30 -9
- package/src/providers/integrations/buddy/workbuddy/provider.ts +5 -9
- package/src/providers/integrations/buddy/workbuddy/shared.ts +21 -3
- package/src/providers/integrations/claude/claude-cch.ts +148 -148
- package/src/providers/integrations/claude/fallback-credit.ts +3 -7
- package/src/providers/integrations/cline/cline.ts +1 -1
- package/src/providers/integrations/codex/codex-device-code.ts +101 -101
- package/src/providers/integrations/codex/codex-oauth.ts +0 -1
- package/src/providers/integrations/commandcode/commandcode.ts +75 -115
- package/src/providers/integrations/commandcode/quota.ts +131 -51
- package/src/providers/integrations/cursor/cursor-http2.ts +0 -3
- package/src/providers/integrations/cursor/cursor-quota.ts +2 -6
- package/src/providers/integrations/cursor/cursor-request.ts +0 -87
- package/src/providers/integrations/cursor/cursor-shared.ts +0 -4
- package/src/providers/integrations/cursor/cursor.ts +35 -3
- package/src/providers/integrations/cursor/protocol/framing.ts +0 -56
- package/src/providers/integrations/cursor/protocol/messages.ts +0 -96
- package/src/providers/integrations/factory/factory.ts +9 -9
- package/src/providers/integrations/github/github-discovery.ts +70 -12
- package/src/providers/integrations/github/github-oauth.ts +184 -14
- package/src/providers/integrations/github/github.ts +134 -26
- package/src/providers/integrations/grok/grok-oauth.ts +261 -261
- package/src/providers/integrations/grok/grok-quota-frame.ts +1 -1
- package/src/providers/integrations/grok/grok-quota.ts +16 -7
- package/src/providers/integrations/grok/grok-ratelimit-store.ts +0 -5
- package/src/providers/integrations/grok/grok-ratelimit.ts +3 -0
- package/src/providers/integrations/grok/grok.ts +86 -36
- package/src/providers/integrations/kilo/kilo-oauth.ts +1 -1
- package/src/providers/integrations/kiro/kiro-cache.ts +31 -0
- package/src/providers/integrations/kiro/kiro-catalog.ts +31 -5
- package/src/providers/integrations/kiro/kiro-discovery.ts +47 -43
- package/src/providers/integrations/kiro/kiro-machine-id.ts +6 -3
- package/src/providers/integrations/kiro/kiro-oauth.ts +523 -255
- package/src/providers/integrations/kiro/kiro-quota.ts +35 -47
- package/src/providers/integrations/kiro/kiro-request.ts +8 -11
- package/src/providers/integrations/kiro/kiro-stream.ts +13 -0
- package/src/providers/integrations/kiro/kiro.ts +80 -68
- package/src/providers/integrations/muse/muse-oauth.ts +0 -1
- package/src/providers/integrations/muse/muse-quota.ts +0 -4
- package/src/providers/integrations/opencode/fingerprint.ts +7 -5
- package/src/providers/integrations/opencode/provider.ts +17 -24
- package/src/providers/integrations/qoder/qoder-catalog.ts +94 -11
- package/src/providers/integrations/qoder/qoder-oauth.ts +165 -25
- package/src/providers/integrations/qoder/qoder-quota.ts +48 -6
- package/src/providers/integrations/qoder/qoder-realm.ts +10 -31
- package/src/providers/integrations/qoder/qoder-sse.ts +159 -0
- package/src/providers/integrations/qoder/qoder-umid.ts +21 -25
- package/src/providers/integrations/qoder/qoder-virtual.ts +12 -0
- package/src/providers/integrations/qoder/qoder.ts +422 -71
- package/src/providers/integrations/shared/connect.ts +0 -54
- package/src/providers/integrations/shared/hash.ts +15 -0
- package/src/providers/integrations/shared/session-cache.ts +136 -0
- package/src/providers/integrations/trae/trae-cache.ts +7 -87
- package/src/providers/integrations/trae/trae-catalog.ts +1 -6
- package/src/providers/integrations/trae/trae-protocol.ts +17 -8
- package/src/providers/integrations/trae/trae-realm.ts +0 -7
- package/src/providers/integrations/trae/trae.ts +51 -8
- package/src/providers/integrations/xai/xai-oauth.ts +5 -5
- package/src/providers/integrations/zcode-start-plan/gifts.ts +265 -0
- package/src/providers/integrations/zcode-start-plan/oauth.ts +154 -0
- package/src/providers/integrations/zcode-start-plan/provider.ts +131 -0
- package/src/providers/integrations/zcode-start-plan/quota.ts +152 -0
- package/src/providers/integrations/zcode-start-plan/zcode_prompt.json +10 -0
- package/src/providers/operations/account-error-classification.ts +198 -133
- package/src/providers/operations/account-health-service.ts +31 -39
- package/src/providers/operations/account-reset-service.ts +58 -1
- package/src/providers/operations/byok-wire-profile.ts +19 -15
- package/src/providers/operations/cli-platform.ts +31 -5
- package/src/providers/operations/client-version-resolver.ts +4 -6
- package/src/providers/operations/client-versions.ts +10 -7
- package/src/providers/operations/provider-catalog-seeder.ts +2 -0
- package/src/providers/operations/provider-catalog-service.ts +18 -2
- package/src/providers/operations/provider-credential-service.ts +19 -2
- package/src/providers/provider-contracts.ts +18 -7
- package/src/providers/provider-metadata.ts +17 -2
- package/src/providers/provider-model-definition.ts +22 -1
- package/src/providers/provider-probe.ts +4 -2
- package/src/providers/provider-usage.ts +50 -19
- package/src/providers/quota/cache.ts +29 -0
- package/src/providers/quota/quota-contracts.ts +4 -0
- package/src/providers/quota/refresh.ts +27 -4
- package/src/providers/quota/snapshot.ts +94 -0
- package/src/providers/search/search-provider.ts +1 -3
- package/src/providers/search/search-providers.ts +2 -1
- package/src/security/abuse.ts +4 -4
- package/src/security/admission/service.ts +13 -6
- package/src/security/admission/ttl.ts +61 -61
- package/src/security/api-key-auth.ts +17 -3
- package/src/security/client-router-fingerprint.ts +4 -4
- package/src/security/credential-codec.ts +3 -3
- package/src/security/csrf.ts +2 -2
- package/src/security/ip-boundary.ts +16 -189
- package/src/security/model-access-rule.ts +1 -1
- package/src/security/outbound-headers.ts +18 -0
- package/src/shared/invoke-guard.ts +47 -0
- package/src/transport/contracts.ts +13 -4
- package/src/transport/dispatch/attempt-finalize.ts +70 -22
- package/src/transport/dispatch/attempt-loop.ts +22 -0
- package/src/transport/dispatch/capture-policy.ts +34 -37
- package/src/transport/dispatch/empty-stream.ts +23 -20
- package/src/transport/dispatch/generation.ts +25 -45
- package/src/transport/dispatch/native-shared.ts +127 -0
- package/src/transport/dispatch/proxy-request.ts +3 -1
- package/src/transport/dispatch/responses-compact.ts +25 -46
- package/src/transport/dispatch/streaming/encoder.ts +18 -72
- package/src/transport/dispatch/streaming/finalize.ts +2 -2
- package/src/transport/dispatch/streaming/stream.ts +7 -3
- package/src/transport/dispatch/streaming/thinking-loop.ts +1 -1
- package/src/transport/dispatch/systemone.ts +20 -48
- package/src/transport/dispatch/token-count.ts +41 -38
- package/src/transport/dispatch/websearch.ts +19 -45
- package/src/transport/drain-endpoint.ts +1 -1
- package/src/transport/failure-policy.ts +21 -1
- package/src/transport/guards/auth-guard.ts +0 -6
- package/src/transport/guards/body-policy.ts +3 -3
- package/src/transport/guards/error-lifecycle.ts +4 -0
- package/src/transport/guards/headroom-guard.ts +1 -1
- package/src/transport/guards/pipeline.ts +1 -1
- package/src/transport/guards/request-context.ts +12 -17
- package/src/transport/request/preparer.ts +286 -7
- package/src/transport/request/rtk/compress-request.ts +3 -3
- package/src/transport/request/rtk/rtk-constants.ts +2 -2
- package/src/transport/request/rtk/rtk-filters.ts +8 -8
- package/src/transport/request/state.ts +7 -13
- package/src/transport/request/system-prompt-injection.ts +74 -11
- package/src/transport/request/tenant-preferences.ts +22 -0
- package/src/transport/routing/candidate-index.ts +2 -2
- package/src/transport/routing/round-robin.ts +1 -1
- package/src/transport/routing/route-catalog.ts +17 -18
- package/src/transport/routing/route-model.ts +126 -33
- package/src/transport/routing/router.ts +159 -37
- package/src/transport/shutdown-notice.ts +2 -2
- package/src/transport/surface/adapters.ts +3 -3
- package/src/transport/surface/chat/encode.ts +7 -7
- package/src/transport/surface/chat/parse.ts +7 -7
- package/src/transport/surface/completion.ts +2 -2
- package/src/transport/surface/content-parts.ts +1 -1
- package/src/transport/surface/dialects.ts +2 -2
- package/src/transport/surface/messages/parse.ts +3 -3
- package/src/transport/surface/reasoning-summary.ts +9 -14
- package/src/transport/surface/responses/adapter.ts +1 -1
- package/src/transport/surface/responses/errors.ts +0 -9
- package/src/transport/vision-handoff-cache.ts +58 -0
- package/src/transport/vision-handoff.ts +431 -0
- package/src/workers/account-identity-sweep.ts +2 -2
- package/src/workers/buddy-growth-tasks.ts +392 -346
- package/src/workers/daily-checkin.ts +102 -49
- package/src/workers/maintenance-lease.ts +2 -35
- package/src/workers/oauth-refresh-sweep.ts +8 -1
- package/src/workers/quota-refresh-sweep.ts +120 -82
- package/src/workers/scheduler.ts +67 -4
- package/src/workers/sweep-runner.ts +24 -5
- package/src/workers/zcode-gift-claim.ts +108 -0
- package/dist/dashboard/assets/AccountCooldown-Bjo92Qat.js +0 -1
- package/dist/dashboard/assets/AccountCooldown-Bjo92Qat.js.gz +0 -0
- package/dist/dashboard/assets/BannedPage-ChG5svFb.js +0 -1
- package/dist/dashboard/assets/BannedPage-ChG5svFb.js.gz +0 -0
- package/dist/dashboard/assets/CliToolDetailPage-BIcWQun7.js +0 -1
- package/dist/dashboard/assets/CliToolDetailPage-BIcWQun7.js.gz +0 -0
- package/dist/dashboard/assets/CliToolsPage-Bf2VelDe.js +0 -1
- package/dist/dashboard/assets/CliToolsPage-Bf2VelDe.js.gz +0 -0
- package/dist/dashboard/assets/CombosPage-DCgm5g6g.js +0 -1
- package/dist/dashboard/assets/CombosPage-DCgm5g6g.js.gz +0 -0
- package/dist/dashboard/assets/ConsoleLogPage-a8mD0QF1.js +0 -1
- package/dist/dashboard/assets/ConsoleLogPage-a8mD0QF1.js.gz +0 -0
- package/dist/dashboard/assets/CustomizationPage-ggeMSjte.js +0 -1
- package/dist/dashboard/assets/CustomizationPage-ggeMSjte.js.gz +0 -0
- package/dist/dashboard/assets/HealthEventsModal-DzSWzE_j.js +0 -1
- package/dist/dashboard/assets/HealthEventsModal-DzSWzE_j.js.gz +0 -0
- package/dist/dashboard/assets/LoginPage-U6AKaJcF.js +0 -1
- package/dist/dashboard/assets/LoginPage-U6AKaJcF.js.gz +0 -0
- package/dist/dashboard/assets/ModelPicker-BMS2t8BA.js.gz +0 -0
- package/dist/dashboard/assets/OverviewPage-D2D4IiHl.js +0 -1
- package/dist/dashboard/assets/OverviewPage-D2D4IiHl.js.gz +0 -0
- package/dist/dashboard/assets/ProviderDetailPage-CrNf7j_X.js +0 -5
- package/dist/dashboard/assets/ProviderDetailPage-CrNf7j_X.js.gz +0 -0
- package/dist/dashboard/assets/ProviderIcon-FB6yS4v1.js +0 -1
- package/dist/dashboard/assets/ProviderIcon-FB6yS4v1.js.gz +0 -0
- package/dist/dashboard/assets/ProvidersPage-BSDbquc1.js +0 -1
- package/dist/dashboard/assets/ProvidersPage-BSDbquc1.js.gz +0 -0
- package/dist/dashboard/assets/ProxyPage-lsrx7NYg.js.gz +0 -0
- package/dist/dashboard/assets/QuotaPage-L0skzML8.js +0 -1
- package/dist/dashboard/assets/QuotaPage-L0skzML8.js.gz +0 -0
- package/dist/dashboard/assets/SettingsPage-CmAbjRHW.js +0 -1
- package/dist/dashboard/assets/SettingsPage-CmAbjRHW.js.gz +0 -0
- package/dist/dashboard/assets/SetupPage-f0DE1h0-.js +0 -1
- package/dist/dashboard/assets/SetupPage-f0DE1h0-.js.gz +0 -0
- package/dist/dashboard/assets/SortableList-ClzpwyET.js +0 -1
- package/dist/dashboard/assets/SortableList-ClzpwyET.js.gz +0 -0
- package/dist/dashboard/assets/StudioPage-Cq5tW7hW.js.gz +0 -0
- package/dist/dashboard/assets/ToolIcon-K1ckcDKg.js +0 -1
- package/dist/dashboard/assets/ToolIcon-K1ckcDKg.js.gz +0 -0
- package/dist/dashboard/assets/UsagePage-Dfc9rWQn.js +0 -56
- package/dist/dashboard/assets/UsagePage-Dfc9rWQn.js.gz +0 -0
- package/dist/dashboard/assets/api-keys-C38iXoO4.js +0 -1
- package/dist/dashboard/assets/api-keys-C38iXoO4.js.gz +0 -0
- package/dist/dashboard/assets/app-BayTTy01.js +0 -9
- package/dist/dashboard/assets/app-BayTTy01.js.gz +0 -0
- package/dist/dashboard/assets/app-a159k0ub.css +0 -2
- package/dist/dashboard/assets/app-a159k0ub.css.gz +0 -0
- package/dist/dashboard/assets/assert-DbRA8EG2.js +0 -15
- package/dist/dashboard/assets/assert-DbRA8EG2.js.gz +0 -0
- package/dist/dashboard/assets/badge-D9CS6dZk.js.gz +0 -0
- package/dist/dashboard/assets/banner-DympBNq4.js.gz +0 -0
- package/dist/dashboard/assets/card-ibRWU_uT.js.gz +0 -0
- package/dist/dashboard/assets/cli-tools-63qBGaRw.js +0 -1
- package/dist/dashboard/assets/cli-tools-63qBGaRw.js.gz +0 -0
- package/dist/dashboard/assets/clipboard-button-DJm-9pz7.js.gz +0 -0
- package/dist/dashboard/assets/dialog-8fiE6tec.js +0 -1
- package/dist/dashboard/assets/dialog-8fiE6tec.js.gz +0 -0
- package/dist/dashboard/assets/drawer-CqGYeOrd.js.gz +0 -0
- package/dist/dashboard/assets/entry-BSAsYsmV.js +0 -1
- package/dist/dashboard/assets/entry-BSAsYsmV.js.gz +0 -0
- package/dist/dashboard/assets/entry-CiIQULZD.js +0 -4
- package/dist/dashboard/assets/entry-CiIQULZD.js.gz +0 -0
- package/dist/dashboard/assets/entry-Daz0lJ-W.js +0 -1
- package/dist/dashboard/assets/entry-Daz0lJ-W.js.gz +0 -0
- package/dist/dashboard/assets/formatters-D-MTJxMr.js.gz +0 -0
- package/dist/dashboard/assets/github-badge-CPK47xQx.js +0 -1
- package/dist/dashboard/assets/github-badge-CPK47xQx.js.gz +0 -0
- package/dist/dashboard/assets/index-DBNPOfhV.js.gz +0 -0
- package/dist/dashboard/assets/inline-BT0zntEr.js.gz +0 -0
- package/dist/dashboard/assets/input-Da2ZViWg.js.gz +0 -0
- package/dist/dashboard/assets/layout-BXNeLw6M.js.gz +0 -0
- package/dist/dashboard/assets/list-row-BycOrrIV.js.gz +0 -0
- package/dist/dashboard/assets/live-DCQNZpF7.js +0 -1
- package/dist/dashboard/assets/live-DCQNZpF7.js.gz +0 -0
- package/dist/dashboard/assets/mutation-Rr0TIvcj.js.gz +0 -0
- package/dist/dashboard/assets/network-9Yj2ZyLo.js +0 -1
- package/dist/dashboard/assets/network-9Yj2ZyLo.js.gz +0 -0
- package/dist/dashboard/assets/numbers-CEagj6ZZ.js +0 -2
- package/dist/dashboard/assets/numbers-CEagj6ZZ.js.gz +0 -0
- package/dist/dashboard/assets/providers/zai-coding-plan.svg +0 -6
- package/dist/dashboard/assets/providers/zai-coding-plan.svg.gz +0 -0
- package/dist/dashboard/assets/quota-Caw7wqci.js +0 -1
- package/dist/dashboard/assets/quota-Caw7wqci.js.gz +0 -0
- package/dist/dashboard/assets/routing-CO9zCUus.js +0 -1
- package/dist/dashboard/assets/routing-CO9zCUus.js.gz +0 -0
- package/dist/dashboard/assets/select-BIYIBkMU.js.gz +0 -0
- package/dist/dashboard/assets/settings-jS3-PNSA.js +0 -1
- package/dist/dashboard/assets/settings-jS3-PNSA.js.gz +0 -0
- package/dist/dashboard/assets/stack-DfgnFDWY.js.gz +0 -0
- package/dist/dashboard/assets/state-CkfdYWel.js.gz +0 -0
- package/dist/dashboard/assets/stream-retry-5QnVuSSo.js +0 -1
- package/dist/dashboard/assets/stream-retry-5QnVuSSo.js.gz +0 -0
- package/dist/dashboard/assets/switch-SYm237HG.js.gz +0 -0
- package/dist/dashboard/assets/useMutation-BQqCRNIi.js.gz +0 -0
- package/src/console/cli-tools/injectors/cline.ts +0 -110
- package/src/console/cli-tools/injectors/copilot.ts +0 -108
- package/src/console/cli-tools/injectors/cowork.ts +0 -64
- package/src/console/cli-tools/injectors/deepseek-tui.ts +0 -85
- package/src/console/cli-tools/injectors/droid.ts +0 -96
- package/src/console/cli-tools/injectors/grok-build.ts +0 -70
- package/src/console/cli-tools/injectors/hermes.ts +0 -101
- package/src/console/cli-tools/injectors/jcode.ts +0 -115
- package/src/console/cli-tools/injectors/openclaw.ts +0 -161
- package/src/network/response-headers.ts +0 -39
- package/src/protocol/response/dsml.ts +0 -38
- package/src/providers/integrations/xiaomi-mimo/think-stream.ts +0 -229
- /package/dist/dashboard/assets/brand/{og_bansos.webp → og_bansos_initial.webp} +0 -0
- /package/dist/dashboard/assets/brand/{og_image.webp → og_image_initial.webp} +0 -0
|
@@ -5,24 +5,6 @@
|
|
|
5
5
|
// end-of-stream trailer. Compression and trailer semantics stay at the call
|
|
6
6
|
// sites; this module owns only the envelope arithmetic.
|
|
7
7
|
|
|
8
|
-
/** Payload is gzip-compressed. */
|
|
9
|
-
export const CONNECT_COMPRESSED_FLAG = 0x01;
|
|
10
|
-
/** Frame carries the end-of-stream trailer rather than a message. */
|
|
11
|
-
export const CONNECT_END_STREAM_FLAG = 0x02;
|
|
12
|
-
|
|
13
|
-
/** One decoded Connect envelope. */
|
|
14
|
-
interface ConnectFrame {
|
|
15
|
-
readonly flags: number;
|
|
16
|
-
readonly payload: Uint8Array;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
interface ConsumeConnectFramesOptions {
|
|
20
|
-
/** Reject frames whose declared payload exceeds this many bytes. */
|
|
21
|
-
readonly maxPayloadBytes?: number;
|
|
22
|
-
/** Builds the error thrown for an oversized frame; defaults to a plain `Error`. */
|
|
23
|
-
readonly oversizeError?: (declaredLength: number) => Error;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
8
|
/** Initial allocation for a frame buffer that has not received a chunk yet. */
|
|
27
9
|
const FRAME_BUFFER_MIN_BYTES = 4096;
|
|
28
10
|
/** Ceiling on the spare capacity kept above the live length when growing. */
|
|
@@ -84,39 +66,3 @@ export class FrameBuffer {
|
|
|
84
66
|
this.start = 0;
|
|
85
67
|
}
|
|
86
68
|
}
|
|
87
|
-
|
|
88
|
-
/** Wraps `payload` in a 5-byte Connect envelope. */
|
|
89
|
-
export function frameConnectMessage(payload: Uint8Array, flags = 0) {
|
|
90
|
-
const frame = Buffer.alloc(5 + payload.length);
|
|
91
|
-
frame.writeUInt8(flags, 0);
|
|
92
|
-
frame.writeUInt32BE(payload.length, 1);
|
|
93
|
-
frame.set(payload, 5);
|
|
94
|
-
return frame;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* Splits every complete Connect frame out of `buffer`, in order. Returns the
|
|
99
|
-
* trailing bytes that do not yet form a complete frame so a streaming caller
|
|
100
|
-
* can prepend them to the next chunk and call again.
|
|
101
|
-
*/
|
|
102
|
-
export function consumeConnectFrames(
|
|
103
|
-
buffer: Buffer,
|
|
104
|
-
options: ConsumeConnectFramesOptions = {},
|
|
105
|
-
): { frames: ConnectFrame[]; rest: Buffer } {
|
|
106
|
-
const frames: ConnectFrame[] = [];
|
|
107
|
-
let pending = buffer;
|
|
108
|
-
while (pending.length >= 5) {
|
|
109
|
-
const flags = pending[0] ?? 0;
|
|
110
|
-
const length = pending.readUInt32BE(1);
|
|
111
|
-
if (options.maxPayloadBytes !== undefined && length > options.maxPayloadBytes) {
|
|
112
|
-
throw (
|
|
113
|
-
options.oversizeError?.(length) ??
|
|
114
|
-
new Error(`Connect frame length ${length} exceeds cap`)
|
|
115
|
-
);
|
|
116
|
-
}
|
|
117
|
-
if (pending.length < 5 + length) break;
|
|
118
|
-
frames.push({ flags, payload: pending.subarray(5, 5 + length) });
|
|
119
|
-
pending = pending.subarray(5 + length);
|
|
120
|
-
}
|
|
121
|
-
return { frames, rest: pending };
|
|
122
|
-
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 32-bit FNV-1a hash.
|
|
3
|
+
*
|
|
4
|
+
* Single source for the two former inline copies (claude `hashBody`,
|
|
5
|
+
* cursor `cursorAccountTag`). Fast, deterministic, sufficient for cache
|
|
6
|
+
* identity / short display tags — not a cryptographic hash.
|
|
7
|
+
*/
|
|
8
|
+
export function fnv1a32(input: string): number {
|
|
9
|
+
let hash = 0x811c9dc5;
|
|
10
|
+
for (let index = 0; index < input.length; index += 1) {
|
|
11
|
+
hash ^= input.charCodeAt(index);
|
|
12
|
+
hash = Math.imul(hash, 0x01000193) >>> 0;
|
|
13
|
+
}
|
|
14
|
+
return hash >>> 0;
|
|
15
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
// Shared session-cache estimation factory.
|
|
2
|
+
//
|
|
3
|
+
// The Kiro and Trae adapters both need to ESTIMATE prompt-cache hits locally
|
|
4
|
+
// because their upstream surfaces never report them. Their logic is
|
|
5
|
+
// byte-identical modulo the provider header comment, so it lives here once —
|
|
6
|
+
// but the state must stay per-provider: a factory call creates a private Map
|
|
7
|
+
// per integration, so cross-provider session-id collisions can never
|
|
8
|
+
// contaminate each other's estimates. Call each provider's wrapper
|
|
9
|
+
// (kiro-cache.ts / trae-cache.ts); do not import this module directly.
|
|
10
|
+
|
|
11
|
+
import { createHash } from "node:crypto";
|
|
12
|
+
import type { CanonicalMessage, UsageRecord } from "../../../protocol/canonical-model";
|
|
13
|
+
|
|
14
|
+
/** Bounded in-memory tracker: one entry per session, oldest evicted first. */
|
|
15
|
+
export const SESSION_CACHE_MAX_SESSIONS = 512;
|
|
16
|
+
|
|
17
|
+
interface SessionCacheEntry {
|
|
18
|
+
/** hash(full messages) -> reported input tokens for that exact list. */
|
|
19
|
+
readonly seen: Map<string, number>;
|
|
20
|
+
/** Insertion order for bounded eviction. */
|
|
21
|
+
readonly order: string[];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface SessionCache {
|
|
25
|
+
estimate(
|
|
26
|
+
record: UsageRecord,
|
|
27
|
+
sessionId: string | undefined,
|
|
28
|
+
messages: readonly CanonicalMessage[] | undefined,
|
|
29
|
+
): UsageRecord;
|
|
30
|
+
resetForTesting(): void;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function hashOf(messages: readonly CanonicalMessage[]): string {
|
|
34
|
+
return createHash("sha256").update(JSON.stringify(messages)).digest("hex");
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Creates an isolated session-cache estimator: its own private session Map,
|
|
39
|
+
* bounded at SESSION_CACHE_MAX_SESSIONS with per-entry oldest-first eviction.
|
|
40
|
+
*/
|
|
41
|
+
export function createSessionCache(): SessionCache {
|
|
42
|
+
const sessions = new Map<string, SessionCacheEntry>();
|
|
43
|
+
|
|
44
|
+
function sessionFor(sessionId: string): SessionCacheEntry {
|
|
45
|
+
let entry = sessions.get(sessionId);
|
|
46
|
+
if (!entry) {
|
|
47
|
+
entry = { seen: new Map(), order: [] };
|
|
48
|
+
sessions.set(sessionId, entry);
|
|
49
|
+
}
|
|
50
|
+
return entry;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function remember(sessionId: string, fullHash: string, inputTokens: number): void {
|
|
54
|
+
const entry = sessionFor(sessionId);
|
|
55
|
+
if (!entry.seen.has(fullHash)) {
|
|
56
|
+
entry.order.push(fullHash);
|
|
57
|
+
if (entry.order.length > SESSION_CACHE_MAX_SESSIONS) {
|
|
58
|
+
const oldest = entry.order.shift();
|
|
59
|
+
if (oldest !== undefined) entry.seen.delete(oldest);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
entry.seen.set(fullHash, inputTokens);
|
|
63
|
+
if (sessions.size > SESSION_CACHE_MAX_SESSIONS) {
|
|
64
|
+
const oldestSession = sessions.keys().next().value;
|
|
65
|
+
if (oldestSession !== undefined) sessions.delete(oldestSession);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return {
|
|
70
|
+
estimate(record, sessionId, messages) {
|
|
71
|
+
if (!sessionId || !messages || messages.length === 0) return record;
|
|
72
|
+
const upstreamReported =
|
|
73
|
+
typeof record.cached_input_tokens === "number" && record.cached_input_tokens > 0;
|
|
74
|
+
if (upstreamReported) return record;
|
|
75
|
+
|
|
76
|
+
const fullHash = hashOf(messages);
|
|
77
|
+
const entry = sessions.get(sessionId);
|
|
78
|
+
|
|
79
|
+
if (entry) {
|
|
80
|
+
// Longest prefix that matches a previously sent complete request.
|
|
81
|
+
for (let len = messages.length; len >= 1; len -= 1) {
|
|
82
|
+
const prefix = messages.slice(0, len);
|
|
83
|
+
const tokens = entry.seen.get(hashOf(prefix));
|
|
84
|
+
if (tokens === undefined) continue;
|
|
85
|
+
if (len === messages.length) {
|
|
86
|
+
// Byte-identical request: the whole input came from cache.
|
|
87
|
+
return {
|
|
88
|
+
...record,
|
|
89
|
+
cached_input_tokens: record.input_tokens,
|
|
90
|
+
uncached_input_tokens: 0,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
const cached = Math.min(tokens, record.input_tokens);
|
|
94
|
+
return {
|
|
95
|
+
...record,
|
|
96
|
+
cached_input_tokens: cached,
|
|
97
|
+
uncached_input_tokens: Math.max(0, record.input_tokens - cached),
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
remember(sessionId, fullHash, record.input_tokens);
|
|
103
|
+
return record;
|
|
104
|
+
},
|
|
105
|
+
|
|
106
|
+
resetForTesting() {
|
|
107
|
+
sessions.clear();
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Estimates how much of this request's input was served from cache.
|
|
114
|
+
*
|
|
115
|
+
* The longest prefix of `messages` that was ever sent as a complete request in
|
|
116
|
+
* this session is considered cached, and its recorded token count is the
|
|
117
|
+
* cached portion — if that prefix is the whole request, everything was cached.
|
|
118
|
+
* This models how upstream prompt caching actually behaves (byte-identical
|
|
119
|
+
* prefix reuse) without trusting a counter the upstream never reports.
|
|
120
|
+
*
|
|
121
|
+
* Returns the record unchanged when there is nothing to estimate (no session,
|
|
122
|
+
* no history, or upstream already reported a real hit).
|
|
123
|
+
*/
|
|
124
|
+
export function estimateSessionCache(
|
|
125
|
+
cache: SessionCache,
|
|
126
|
+
record: UsageRecord,
|
|
127
|
+
sessionId: string | undefined,
|
|
128
|
+
messages: readonly CanonicalMessage[] | undefined,
|
|
129
|
+
): UsageRecord {
|
|
130
|
+
return cache.estimate(record, sessionId, messages);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** Drops all tracked sessions in this cache. Test-only. */
|
|
134
|
+
export function resetSessionCacheForTesting(cache: SessionCache): void {
|
|
135
|
+
cache.resetForTesting();
|
|
136
|
+
}
|
|
@@ -7,104 +7,24 @@
|
|
|
7
7
|
// conversation we ESTIMATE the hit locally. This only fills the gap when
|
|
8
8
|
// upstream reports nothing (0 or unavailable); a genuine upstream report (>0)
|
|
9
9
|
// is trusted and left untouched.
|
|
10
|
+
//
|
|
11
|
+
// The state lives in a factory-created instance, so Trae's sessions are fully
|
|
12
|
+
// isolated from Kiro's (and any other consumer of the shared factory).
|
|
10
13
|
|
|
11
|
-
import { createHash } from "node:crypto";
|
|
12
14
|
import type { CanonicalMessage, UsageRecord } from "../../../protocol/canonical-model";
|
|
15
|
+
import { createSessionCache, estimateSessionCache, resetSessionCacheForTesting } from "../shared/session-cache";
|
|
13
16
|
|
|
14
|
-
|
|
15
|
-
const MAX_SESSIONS = 512;
|
|
16
|
-
|
|
17
|
-
interface TraeSessionCacheEntry {
|
|
18
|
-
/** hash(full messages) -> reported input tokens for that exact list. */
|
|
19
|
-
readonly seen: Map<string, number>;
|
|
20
|
-
/** Insertion order for bounded eviction. */
|
|
21
|
-
readonly order: string[];
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
const sessions = new Map<string, TraeSessionCacheEntry>();
|
|
17
|
+
const cache = createSessionCache();
|
|
25
18
|
|
|
26
|
-
function hashOf(messages: readonly CanonicalMessage[]): string {
|
|
27
|
-
return createHash("sha256").update(JSON.stringify(messages)).digest("hex");
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
function sessionFor(sessionId: string): TraeSessionCacheEntry {
|
|
31
|
-
let entry = sessions.get(sessionId);
|
|
32
|
-
if (!entry) {
|
|
33
|
-
entry = { seen: new Map(), order: [] };
|
|
34
|
-
sessions.set(sessionId, entry);
|
|
35
|
-
}
|
|
36
|
-
return entry;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
function remember(sessionId: string, fullHash: string, inputTokens: number): void {
|
|
40
|
-
const entry = sessionFor(sessionId);
|
|
41
|
-
if (!entry.seen.has(fullHash)) {
|
|
42
|
-
entry.order.push(fullHash);
|
|
43
|
-
if (entry.order.length > MAX_SESSIONS) {
|
|
44
|
-
const oldest = entry.order.shift();
|
|
45
|
-
if (oldest !== undefined) entry.seen.delete(oldest);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
entry.seen.set(fullHash, inputTokens);
|
|
49
|
-
if (sessions.size > MAX_SESSIONS) {
|
|
50
|
-
const oldestSession = sessions.keys().next().value;
|
|
51
|
-
if (oldestSession !== undefined) sessions.delete(oldestSession);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Estimates how much of this request's input was served from cache.
|
|
57
|
-
*
|
|
58
|
-
* The longest prefix of `messages` that was ever sent as a complete request in
|
|
59
|
-
* this session is considered cached, and its recorded token count is the
|
|
60
|
-
* cached portion — if that prefix is the whole request, everything was cached.
|
|
61
|
-
* This models how upstream prompt caching actually behaves (byte-identical
|
|
62
|
-
* prefix reuse) without trusting a counter the upstream never reports.
|
|
63
|
-
*
|
|
64
|
-
* Returns the record unchanged when there is nothing to estimate (no session,
|
|
65
|
-
* no history, or upstream already reported a real hit).
|
|
66
|
-
*/
|
|
67
19
|
export function estimateTraeSessionCache(
|
|
68
20
|
record: UsageRecord,
|
|
69
21
|
sessionId: string | undefined,
|
|
70
22
|
messages: readonly CanonicalMessage[] | undefined,
|
|
71
23
|
): UsageRecord {
|
|
72
|
-
|
|
73
|
-
const upstreamReported =
|
|
74
|
-
typeof record.cached_input_tokens === "number" && record.cached_input_tokens > 0;
|
|
75
|
-
if (upstreamReported) return record;
|
|
76
|
-
|
|
77
|
-
const fullHash = hashOf(messages);
|
|
78
|
-
const entry = sessions.get(sessionId);
|
|
79
|
-
|
|
80
|
-
if (entry) {
|
|
81
|
-
// Longest prefix that matches a previously sent complete request.
|
|
82
|
-
for (let len = messages.length; len >= 1; len -= 1) {
|
|
83
|
-
const prefix = messages.slice(0, len);
|
|
84
|
-
const tokens = entry.seen.get(hashOf(prefix));
|
|
85
|
-
if (tokens === undefined) continue;
|
|
86
|
-
if (len === messages.length) {
|
|
87
|
-
// Byte-identical request: the whole input came from cache.
|
|
88
|
-
return {
|
|
89
|
-
...record,
|
|
90
|
-
cached_input_tokens: record.input_tokens,
|
|
91
|
-
uncached_input_tokens: 0,
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
const cached = Math.min(tokens, record.input_tokens);
|
|
95
|
-
return {
|
|
96
|
-
...record,
|
|
97
|
-
cached_input_tokens: cached,
|
|
98
|
-
uncached_input_tokens: Math.max(0, record.input_tokens - cached),
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
remember(sessionId, fullHash, record.input_tokens);
|
|
104
|
-
return record;
|
|
24
|
+
return estimateSessionCache(cache, record, sessionId, messages);
|
|
105
25
|
}
|
|
106
26
|
|
|
107
27
|
/** Drops all tracked sessions. Test-only. */
|
|
108
28
|
export function resetTraeSessionCacheForTesting(): void {
|
|
109
|
-
|
|
29
|
+
resetSessionCacheForTesting(cache);
|
|
110
30
|
}
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
// intl stays on its static roster and says so via `modelListSupported`.
|
|
13
13
|
|
|
14
14
|
import { defineModel, type ModelDefinition } from "../../provider-model-definition";
|
|
15
|
-
import { TRAE_AGENT_CHAT_PATH, TRAE_CHAT_PATH
|
|
15
|
+
import { TRAE_AGENT_CHAT_PATH, TRAE_CHAT_PATH } from "./trae-realm";
|
|
16
16
|
|
|
17
17
|
/** One roster row, as upstream describes it. */
|
|
18
18
|
export interface TraeModelRow {
|
|
@@ -135,11 +135,6 @@ function traeModels(rows: readonly TraeModelRow[], providerId: string): readonly
|
|
|
135
135
|
export const TRAE_CN_MODELS: readonly ModelDefinition[] = traeModels(TRAE_CN_ROWS, "traecn");
|
|
136
136
|
export const TRAE_INTL_MODELS: readonly ModelDefinition[] = traeModels(TRAE_INTL_ROWS, "trae");
|
|
137
137
|
|
|
138
|
-
/** Roster for a realm. */
|
|
139
|
-
export function traeStaticModels(realm: TraeRealm): readonly ModelDefinition[] {
|
|
140
|
-
return realm === "cn" ? TRAE_CN_MODELS : TRAE_INTL_MODELS;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
138
|
/**
|
|
144
139
|
* Reads the largest context window out of one upstream model object.
|
|
145
140
|
*
|
|
@@ -13,11 +13,11 @@
|
|
|
13
13
|
// `iter_events` in `trae_client.py`).
|
|
14
14
|
|
|
15
15
|
import type { CanonicalRequest, ContentPart } from "../../../protocol/canonical-model";
|
|
16
|
+
import { resolveWireMaxTokens } from "../../../protocol/translation/quirks";
|
|
16
17
|
import {
|
|
17
18
|
TRAE_AGENT_CHAT_PATH,
|
|
18
19
|
TRAE_AGENT_FUNCTION,
|
|
19
20
|
TRAE_CHAT_PATH,
|
|
20
|
-
TRAE_MODEL_LIST_PATH,
|
|
21
21
|
TRAE_REALMS,
|
|
22
22
|
type TraeRealm,
|
|
23
23
|
} from "./trae-realm";
|
|
@@ -161,6 +161,7 @@ export function buildTraeChatBody(
|
|
|
161
161
|
request: CanonicalRequest,
|
|
162
162
|
realm: TraeRealm,
|
|
163
163
|
sessionId?: string,
|
|
164
|
+
maxOutputTokens?: number,
|
|
164
165
|
): TraeChatBody {
|
|
165
166
|
if (modelId.length === 0) throw new Error("trae model name is required");
|
|
166
167
|
|
|
@@ -257,13 +258,26 @@ export function buildTraeChatBody(
|
|
|
257
258
|
},
|
|
258
259
|
}));
|
|
259
260
|
}
|
|
261
|
+
const requestedMaxTokens =
|
|
262
|
+
typeof controls.max_tokens === "number" && Number.isFinite(controls.max_tokens)
|
|
263
|
+
? controls.max_tokens
|
|
264
|
+
: undefined;
|
|
260
265
|
const options: Record<string, unknown> = {
|
|
261
266
|
temperature: controls.temperature,
|
|
262
267
|
top_p: controls.top_p,
|
|
263
|
-
max_tokens: controls.max_tokens,
|
|
264
268
|
stop: controls.stop,
|
|
265
|
-
|
|
266
269
|
};
|
|
270
|
+
// Route a numeric `max_tokens` through the shared chat-wire bound so it is
|
|
271
|
+
// floored to the wire minimum and clamped to the model's roster output limit
|
|
272
|
+
// — it must never balloon unboundedly (the roster's `out` is the ceiling).
|
|
273
|
+
// Non-numeric values keep the previous verbatim passthrough, and an absent
|
|
274
|
+
// value still omits the field (the chat bound must not invent a default here).
|
|
275
|
+
options["max_tokens"] =
|
|
276
|
+
requestedMaxTokens === undefined
|
|
277
|
+
? controls.max_tokens
|
|
278
|
+
: resolveWireMaxTokens("chat", { max_tokens: requestedMaxTokens }, {
|
|
279
|
+
...(maxOutputTokens === undefined ? {} : { maxOutputTokens }),
|
|
280
|
+
});
|
|
267
281
|
for (const key of PASSTHROUGH_OPTIONS) {
|
|
268
282
|
const value = options[key];
|
|
269
283
|
if (value !== undefined && value !== null) body[key] = value;
|
|
@@ -272,13 +286,8 @@ export function buildTraeChatBody(
|
|
|
272
286
|
}
|
|
273
287
|
|
|
274
288
|
/** Body for the live model list. Upstream requires a body even to list. */
|
|
275
|
-
export function buildTraeModelListBody(): Record<string, unknown> {
|
|
276
|
-
return { type: "chat" };
|
|
277
|
-
}
|
|
278
|
-
|
|
279
289
|
export const TRAE_CHAT_ENDPOINT = TRAE_CHAT_PATH;
|
|
280
290
|
export const TRAE_AGENT_ENDPOINT = TRAE_AGENT_CHAT_PATH;
|
|
281
|
-
export const TRAE_MODEL_LIST_ENDPOINT = TRAE_MODEL_LIST_PATH;
|
|
282
291
|
|
|
283
292
|
/**
|
|
284
293
|
* Rewrites a chat-surface body into the agent surface's shape.
|
|
@@ -88,7 +88,6 @@ export const TRAE_AUTH_CODE_EXCHANGE_PATHS: readonly string[] = [
|
|
|
88
88
|
"/trae/api/v3/oauth/ExchangeToken",
|
|
89
89
|
"/cloudide/api/v3/public/oauth/ExchangeToken",
|
|
90
90
|
];
|
|
91
|
-
export const TRAE_TEMP_TOKEN_PATH = "/cloudide/api/v3/trae/GenerateTempToken";
|
|
92
91
|
export const TRAE_GET_USER_INFO_PATH = "/cloudide/api/v3/trae/GetUserInfo";
|
|
93
92
|
|
|
94
93
|
/** Browser-login path on the host `GetLoginGuidance` names. */
|
|
@@ -123,13 +122,7 @@ export const TRAE_LOGIN_GUIDANCE_URLS: readonly string[] = [
|
|
|
123
122
|
|
|
124
123
|
/** Usage / entitlement paths, relative to the realm's `pay` host. */
|
|
125
124
|
export const TRAE_SESSION_USAGE_PATH = "/api/v1/commercial/get_session_usage";
|
|
126
|
-
export const TRAE_ACTIVITY_PATH = "/api/v1/commercial/get_user_activity";
|
|
127
125
|
export const TRAE_ENT_USAGE_PATH = "/trae/api/v1/pay/ide_user_ent_usage";
|
|
128
|
-
export const TRAE_PAY_STATUS_PATH = "/trae/api/v1/pay/ide_user_pay_status";
|
|
129
|
-
|
|
130
|
-
/** Growth paths, relative to the realm's `ug` host. CN-only upstream. */
|
|
131
|
-
export const TRAE_CHECKIN_STATUS_PATH = "/trae/api/v2/ug/checkin_credits/status";
|
|
132
|
-
export const TRAE_CHECKIN_CLAIM_PATH = "/trae/api/v2/ug/checkin_credits/claim";
|
|
133
126
|
|
|
134
127
|
/**
|
|
135
128
|
* Realm → deployment.
|
|
@@ -103,7 +103,11 @@ function extractToken(secret: string): string | undefined {
|
|
|
103
103
|
* `quota_exceeded` 429, not a platform fault.
|
|
104
104
|
* - Everything else is a platform fault (`platform_unavailable`).
|
|
105
105
|
*/
|
|
106
|
-
function throwTraeUpstreamError(
|
|
106
|
+
function throwTraeUpstreamError(
|
|
107
|
+
codeRaw: unknown,
|
|
108
|
+
messageRaw: unknown,
|
|
109
|
+
providerId?: string,
|
|
110
|
+
): never {
|
|
107
111
|
const code =
|
|
108
112
|
typeof codeRaw === "number" || typeof codeRaw === "string" ? String(codeRaw) : undefined;
|
|
109
113
|
const message =
|
|
@@ -118,7 +122,12 @@ function throwTraeUpstreamError(codeRaw: unknown, messageRaw: unknown): never {
|
|
|
118
122
|
"authentication_failed",
|
|
119
123
|
401,
|
|
120
124
|
`Trae could not authenticate the account (upstream code 1001): ${message} (request {requestId}). Wrong key, right door — check the credential 🔑`,
|
|
121
|
-
{
|
|
125
|
+
{
|
|
126
|
+
providerCode: "1001",
|
|
127
|
+
providerStatus: 1001,
|
|
128
|
+
credentialEvidence: true,
|
|
129
|
+
...(providerId ? { providerId } : {}),
|
|
130
|
+
},
|
|
122
131
|
"upstream",
|
|
123
132
|
);
|
|
124
133
|
}
|
|
@@ -129,12 +138,38 @@ function throwTraeUpstreamError(codeRaw: unknown, messageRaw: unknown): never {
|
|
|
129
138
|
"quota_exceeded",
|
|
130
139
|
429,
|
|
131
140
|
`Trae quota exceeded (upstream code ${code ?? "unknown"}): ${message} (request {requestId}). You've maxed this window — pace yourself ⏳`,
|
|
132
|
-
{
|
|
141
|
+
{
|
|
142
|
+
providerCode: code ?? "4008",
|
|
143
|
+
providerStatus: code === "4008" ? 4008 : 429,
|
|
144
|
+
...(providerId ? { providerId } : {}),
|
|
145
|
+
},
|
|
133
146
|
"upstream",
|
|
134
147
|
);
|
|
135
148
|
}
|
|
136
149
|
|
|
137
|
-
|
|
150
|
+
// Trae answers `4013 "AI service is not available in the current region now."`
|
|
151
|
+
// when the upstream does not serve the account's region. That is a durable
|
|
152
|
+
// verdict, not a transient transport fault: the account reproduces it on
|
|
153
|
+
// every request until the region opens, so it must cool hard rather than be
|
|
154
|
+
// re-dialled every thirty seconds. The classifier scopes this to the account
|
|
155
|
+
// (`trae-region-unavailable`) — never the proxy pool.
|
|
156
|
+
if (code === "4013" || lower.includes("not available in the current region")) {
|
|
157
|
+
throw new GatewayError(
|
|
158
|
+
"platform_unavailable",
|
|
159
|
+
502,
|
|
160
|
+
message,
|
|
161
|
+
{ providerCode: "4013", ...(providerId ? { providerId } : {}) },
|
|
162
|
+
"upstream",
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
throw new GatewayError(
|
|
167
|
+
"platform_unavailable",
|
|
168
|
+
502,
|
|
169
|
+
message,
|
|
170
|
+
{ ...(providerId ? { providerId } : {}) },
|
|
171
|
+
"upstream",
|
|
172
|
+
);
|
|
138
173
|
}
|
|
139
174
|
|
|
140
175
|
class TraeAdapter implements ProviderAdapter {
|
|
@@ -172,7 +207,13 @@ class TraeAdapter implements ProviderAdapter {
|
|
|
172
207
|
* hash) and thread it through.
|
|
173
208
|
*/
|
|
174
209
|
const sessionId = request.session_id ?? resolvePromptCacheKey(request, context);
|
|
175
|
-
const body = buildTraeChatBody(
|
|
210
|
+
const body = buildTraeChatBody(
|
|
211
|
+
modelId,
|
|
212
|
+
request,
|
|
213
|
+
this.realm,
|
|
214
|
+
sessionId,
|
|
215
|
+
candidate.output_limit ?? undefined,
|
|
216
|
+
);
|
|
176
217
|
// The cache estimator is scoped per (session, model): upstream cache keys
|
|
177
218
|
// are model-specific, so two models sharing a conversation id must not
|
|
178
219
|
// treat each other's identical prefixes as hits.
|
|
@@ -267,7 +308,7 @@ class TraeAdapter implements ProviderAdapter {
|
|
|
267
308
|
}
|
|
268
309
|
if (frame.event === "error") {
|
|
269
310
|
const data = frame.data as { message?: unknown; code?: unknown };
|
|
270
|
-
throwTraeUpstreamError(data.code, data.message);
|
|
311
|
+
throwTraeUpstreamError(data.code, data.message, this.provider_id);
|
|
271
312
|
}
|
|
272
313
|
if (typeof frame.data !== "object" || frame.data === null) continue;
|
|
273
314
|
const record = frame.data as Record<string, unknown>;
|
|
@@ -280,7 +321,7 @@ class TraeAdapter implements ProviderAdapter {
|
|
|
280
321
|
const nested = record["error"] as Record<string, unknown> | undefined;
|
|
281
322
|
const code = record["code"] ?? nested?.["code"];
|
|
282
323
|
const message = record["message"] ?? nested?.["message"];
|
|
283
|
-
throwTraeUpstreamError(code, message);
|
|
324
|
+
throwTraeUpstreamError(code, message, this.provider_id);
|
|
284
325
|
}
|
|
285
326
|
/**
|
|
286
327
|
* Two frame layouts reach here and both are live.
|
|
@@ -438,7 +479,9 @@ class TraeAdapter implements ProviderAdapter {
|
|
|
438
479
|
const record = usageFromProvider(usage);
|
|
439
480
|
if (record === undefined) return undefined;
|
|
440
481
|
// Trae's agent surface never reports prompt-cache hits; for repeated
|
|
441
|
-
// prefixes we estimate them locally (see trae-cache.ts).
|
|
482
|
+
// prefixes we estimate them locally (see trae-cache.ts). Then the
|
|
483
|
+
// operator's cache mode decides whether a hit makes the whole input count
|
|
484
|
+
// as cached.
|
|
442
485
|
return estimateTraeSessionCache(record, sessionId, messages);
|
|
443
486
|
}
|
|
444
487
|
|
|
@@ -44,10 +44,10 @@ const XAI_AUTH_SERVER = {
|
|
|
44
44
|
} as const;
|
|
45
45
|
|
|
46
46
|
export { XAI_AUTH_SERVER };
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
47
|
+
const XAI_CLIENT_ID = XAI_AUTH_SERVER.clientId;
|
|
48
|
+
const XAI_DEVICE_URL = XAI_AUTH_SERVER.deviceUrl;
|
|
49
|
+
const XAI_TOKEN_URL = XAI_AUTH_SERVER.tokenUrl;
|
|
50
|
+
const XAI_USERINFO_URL = XAI_AUTH_SERVER.userinfoUrl;
|
|
51
51
|
|
|
52
52
|
/**
|
|
53
53
|
* Scopes the subscription token needs.
|
|
@@ -56,7 +56,7 @@ export const XAI_USERINFO_URL = XAI_AUTH_SERVER.userinfoUrl;
|
|
|
56
56
|
* what admits the token to `api.x.ai`. The rest are the OIDC identity scopes the
|
|
57
57
|
* userinfo label is read from.
|
|
58
58
|
*/
|
|
59
|
-
|
|
59
|
+
const XAI_SCOPE = [
|
|
60
60
|
"openid",
|
|
61
61
|
"profile",
|
|
62
62
|
"email",
|