cartethyia 2.7.8 → 2.7.9
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 +0 -1
- package/README.md +29 -59
- package/dist/dashboard/assets/BannedPage-BxoG1MrL.js +1 -0
- package/dist/dashboard/assets/BannedPage-BxoG1MrL.js.gz +0 -0
- package/dist/dashboard/assets/{CliToolDetailPage-BRWKPQPf.js → CliToolDetailPage-ixwgKk53.js} +1 -1
- package/dist/dashboard/assets/CliToolDetailPage-ixwgKk53.js.gz +0 -0
- package/dist/dashboard/assets/{CliToolsPage-BP-Y5iHN.js → CliToolsPage-BmttNV3U.js} +1 -1
- package/dist/dashboard/assets/CliToolsPage-BmttNV3U.js.gz +0 -0
- package/dist/dashboard/assets/CombosPage-BE3qwwfC.js +1 -0
- package/dist/dashboard/assets/CombosPage-BE3qwwfC.js.gz +0 -0
- package/dist/dashboard/assets/ConsoleLogPage-CRZdmMIX.js +1 -0
- package/dist/dashboard/assets/ConsoleLogPage-CRZdmMIX.js.gz +0 -0
- package/dist/dashboard/assets/CustomizationPage-Dv_FJ6Er.js +1 -0
- package/dist/dashboard/assets/CustomizationPage-Dv_FJ6Er.js.gz +0 -0
- package/dist/dashboard/assets/HealthEventsModal-CoVrw2sM.js +1 -0
- package/dist/dashboard/assets/HealthEventsModal-CoVrw2sM.js.gz +0 -0
- package/dist/dashboard/assets/{InjectSystemPromptPanel-Cv-2Ol_K.js → InjectSystemPromptPanel-BOoO8rpz.js} +2 -2
- package/dist/dashboard/assets/InjectSystemPromptPanel-BOoO8rpz.js.gz +0 -0
- package/dist/dashboard/assets/{LoginPage-bKfz_b1K.js → LoginPage-ChJuNNVN.js} +1 -1
- package/dist/dashboard/assets/LoginPage-ChJuNNVN.js.gz +0 -0
- package/dist/dashboard/assets/{ModelPicker-B-WQxx_H.js → ModelPicker-BZAJtPg1.js} +1 -1
- package/dist/dashboard/assets/ModelPicker-BZAJtPg1.js.gz +0 -0
- package/dist/dashboard/assets/OverviewPage-BE40s3u5.js +1 -0
- package/dist/dashboard/assets/OverviewPage-BE40s3u5.js.gz +0 -0
- package/dist/dashboard/assets/ProviderDetailPage-sfLoQtPV.js +8 -0
- package/dist/dashboard/assets/ProviderDetailPage-sfLoQtPV.js.gz +0 -0
- package/dist/dashboard/assets/ProviderIcon-CQ6bPUf_.js +1 -0
- package/dist/dashboard/assets/ProviderIcon-CQ6bPUf_.js.gz +0 -0
- package/dist/dashboard/assets/ProvidersPage-DcepmPWo.js +1 -0
- package/dist/dashboard/assets/ProvidersPage-DcepmPWo.js.gz +0 -0
- package/dist/dashboard/assets/{ProxyPage-emlTuxz6.js → ProxyPage-BJ87Pp0U.js} +1 -1
- package/dist/dashboard/assets/ProxyPage-BJ87Pp0U.js.gz +0 -0
- package/dist/dashboard/assets/{QuotaPage-CMJKNYWb.js → QuotaPage-gkSyRAKa.js} +1 -1
- package/dist/dashboard/assets/QuotaPage-gkSyRAKa.js.gz +0 -0
- package/dist/dashboard/assets/SettingsPage-C5HPWqEv.js +1 -0
- package/dist/dashboard/assets/SettingsPage-C5HPWqEv.js.gz +0 -0
- package/dist/dashboard/assets/{SetupPage-CUZrKs9r.js → SetupPage-CFNcATJJ.js} +1 -1
- package/dist/dashboard/assets/SetupPage-CFNcATJJ.js.gz +0 -0
- package/dist/dashboard/assets/{StudioPage-jWmUdDpy.js → StudioPage-YoD4tY5l.js} +1 -1
- package/dist/dashboard/assets/StudioPage-YoD4tY5l.js.gz +0 -0
- package/dist/dashboard/assets/UsagePage-DxjaAhb_.js +56 -0
- package/dist/dashboard/assets/UsagePage-DxjaAhb_.js.gz +0 -0
- package/dist/dashboard/assets/api-keys-BTlkq_Uk.js +1 -0
- package/dist/dashboard/assets/api-keys-BTlkq_Uk.js.gz +0 -0
- package/dist/dashboard/assets/app-BX2nnKqs.css +2 -0
- package/dist/dashboard/assets/app-BX2nnKqs.css.gz +0 -0
- package/dist/dashboard/assets/assert-CndthXFQ.js +1 -0
- package/dist/dashboard/assets/assert-CndthXFQ.js.gz +0 -0
- package/dist/dashboard/assets/{badge-DyI_mJfi.js → badge-DdbT_7Am.js} +1 -1
- package/dist/dashboard/assets/badge-DdbT_7Am.js.gz +0 -0
- package/dist/dashboard/assets/ban-durations-B58FyRxC.js +1 -0
- package/dist/dashboard/assets/ban-durations-B58FyRxC.js.gz +0 -0
- package/dist/dashboard/assets/{banner-B-yXtCqb.js → banner-CsGN-nbm.js} +1 -1
- package/dist/dashboard/assets/banner-CsGN-nbm.js.gz +0 -0
- package/dist/dashboard/assets/brand/bansos_page.webp +0 -0
- package/dist/dashboard/assets/brand/denia_bansos.webp +0 -0
- package/dist/dashboard/assets/brand/favicon.webp +0 -0
- package/dist/dashboard/assets/brand/login_register.webp +0 -0
- package/dist/dashboard/assets/brand/login_register_initial.webp +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.webp +0 -0
- package/dist/dashboard/assets/{card-_HwAEqFF.js → card-mgZ_TLLZ.js} +1 -1
- package/dist/dashboard/assets/card-mgZ_TLLZ.js.gz +0 -0
- package/dist/dashboard/assets/cli-tools-A1-v8-03.js +1 -0
- package/dist/dashboard/assets/cli-tools-A1-v8-03.js.gz +0 -0
- package/dist/dashboard/assets/{clipboard-button-ByjCk0o9.js → clipboard-button-CJ4Zty89.js} +1 -1
- package/dist/dashboard/assets/clipboard-button-CJ4Zty89.js.gz +0 -0
- package/dist/dashboard/assets/{dialog-BZhOlfz-.js → dialog-B5L2jPQ_.js} +1 -1
- package/dist/dashboard/assets/dialog-B5L2jPQ_.js.gz +0 -0
- package/dist/dashboard/assets/{drawer-BADqIRYP.js → drawer-DkjUouAj.js} +1 -1
- package/dist/dashboard/assets/drawer-DkjUouAj.js.gz +0 -0
- package/dist/dashboard/assets/{entry-COaC-irN.js → entry-B-LVLV6o.js} +1 -1
- package/dist/dashboard/assets/entry-B-LVLV6o.js.gz +0 -0
- package/dist/dashboard/assets/entry-CAhdYl3B.js +1 -0
- package/dist/dashboard/assets/entry-CAhdYl3B.js.gz +0 -0
- package/dist/dashboard/assets/entry-D2xD0Tmd.js +4 -0
- package/dist/dashboard/assets/entry-D2xD0Tmd.js.gz +0 -0
- package/dist/dashboard/assets/{formatters-DcHJyRiu.js → formatters-CrsdLVsn.js} +1 -1
- package/dist/dashboard/assets/formatters-CrsdLVsn.js.gz +0 -0
- package/dist/dashboard/assets/{index-CgKmFngv.js → index-BU64Lqvp.js} +2 -2
- package/dist/dashboard/assets/index-BU64Lqvp.js.gz +0 -0
- package/dist/dashboard/assets/{inline-B2BirKry.js → inline-B2aDLyyg.js} +1 -1
- package/dist/dashboard/assets/inline-B2aDLyyg.js.gz +0 -0
- package/dist/dashboard/assets/{input-D-qV9dKY.js → input-BCVkdR9d.js} +1 -1
- package/dist/dashboard/assets/input-BCVkdR9d.js.gz +0 -0
- package/dist/dashboard/assets/{layout-B7tVWhtV.js → layout-DNcAdMK-.js} +1 -1
- package/dist/dashboard/assets/layout-DNcAdMK-.js.gz +0 -0
- package/dist/dashboard/assets/{list-row-CtkGE3bF.js → list-row-DgrIH0hw.js} +1 -1
- package/dist/dashboard/assets/list-row-DgrIH0hw.js.gz +0 -0
- package/dist/dashboard/assets/{live-DGizF06-.js → live-Cae01iu8.js} +1 -1
- package/dist/dashboard/assets/live-Cae01iu8.js.gz +0 -0
- package/dist/dashboard/assets/{mutation-GU7XdEjz.js → mutation-BQ0ccH_A.js} +1 -1
- package/dist/dashboard/assets/mutation-BQ0ccH_A.js.gz +0 -0
- package/dist/dashboard/assets/{network-C9UE-bOr.js → network-CRib7H_2.js} +1 -1
- package/dist/dashboard/assets/network-CRib7H_2.js.gz +0 -0
- package/dist/dashboard/assets/{numbers-BnAd22a_.js → numbers-BKQE8Xpz.js} +1 -1
- package/dist/dashboard/assets/numbers-BKQE8Xpz.js.gz +0 -0
- package/dist/dashboard/assets/{pagination-BAywyMzS.js → pagination-ecPvG_8g.js} +1 -1
- package/dist/dashboard/assets/pagination-ecPvG_8g.js.gz +0 -0
- package/dist/dashboard/assets/providers/devin.svg +9 -0
- package/dist/dashboard/assets/providers/devin.svg.gz +0 -0
- package/dist/dashboard/assets/providers/windsurf.svg +10 -0
- package/dist/dashboard/assets/providers/windsurf.svg.gz +0 -0
- package/dist/dashboard/assets/{query-keys-YSoQOUh6.js → query-keys-IKLh0YFd.js} +1 -1
- package/dist/dashboard/assets/query-keys-IKLh0YFd.js.gz +0 -0
- package/dist/dashboard/assets/routing-Ckm1UXuC.js +1 -0
- package/dist/dashboard/assets/routing-Ckm1UXuC.js.gz +0 -0
- package/dist/dashboard/assets/{select-BCOcv8WK.js → select-ChoFWyKz.js} +1 -1
- package/dist/dashboard/assets/select-ChoFWyKz.js.gz +0 -0
- package/dist/dashboard/assets/settings-CKjFPlKW.js +1 -0
- package/dist/dashboard/assets/settings-CKjFPlKW.js.gz +0 -0
- package/dist/dashboard/assets/{stack-ByKt3Q1g.js → stack-DWCwU3fh.js} +1 -1
- package/dist/dashboard/assets/stack-DWCwU3fh.js.gz +0 -0
- package/dist/dashboard/assets/{state-DXbGTx7N.js → state-Cg3VL5J_.js} +1 -1
- package/dist/dashboard/assets/state-Cg3VL5J_.js.gz +0 -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/{switch-ZeTsW623.js → switch-Db70BMix.js} +1 -1
- package/dist/dashboard/assets/switch-Db70BMix.js.gz +0 -0
- package/dist/dashboard/assets/{useMutation-CbCP4w1o.js → useMutation-BqdE0LuM.js} +1 -1
- package/dist/dashboard/assets/useMutation-BqdE0LuM.js.gz +0 -0
- package/dist/dashboard/console-backgrounds.webp +0 -0
- package/dist/dashboard/console-backgrounds_initial.webp +0 -0
- package/dist/dashboard/donation/qris-risun-marke.webp +0 -0
- package/dist/dashboard/index.html +3 -3
- package/dist/dashboard/index.html.gz +0 -0
- package/dist/dashboard/precompressed-assets.json +57 -55
- package/migrations/full-postgres/0044_add_models_warning_metadata.sql +10 -0
- package/migrations/full-postgres/0045_migrate_workbuddy_to_codebuddy.sql +156 -0
- package/migrations/lite-sqlite3/0044_add_models_warning_metadata.sql +11 -0
- package/migrations/lite-sqlite3/0045_migrate_workbuddy_to_codebuddy.sql +156 -0
- package/package.json +1 -1
- package/src/boot/dependencies.ts +11 -3
- package/src/config/cooldowns.ts +1 -1
- package/src/config/spec.ts +0 -6
- package/src/console/api-keys/routes.ts +11 -4
- package/src/console/console-router.ts +7 -0
- package/src/console/dashboard-assets.ts +5 -5
- package/src/console/domain-registration.ts +27 -0
- package/src/console/ip-bans/routes.ts +99 -0
- package/src/console/providers/catalog/catalog-projections.ts +5 -2
- package/src/console/providers/catalog/contracts.ts +123 -0
- package/src/console/providers/catalog/model-operations.ts +122 -10
- package/src/console/providers/catalog/provider-operations.ts +116 -8
- package/src/console/providers/catalog/public-model-store.ts +0 -0
- package/src/console/providers/catalog/routes.ts +64 -4
- package/src/console/providers/catalog/store-helpers.ts +30 -1
- package/src/console/providers/catalog/store.ts +243 -3
- package/src/console/quota/account-quota-global.ts +89 -1
- package/src/console/quota/native-identity.ts +2 -0
- package/src/console/settings/contracts.ts +18 -0
- package/src/console/settings/store.ts +32 -0
- package/src/console/system-prompt/contracts.ts +0 -1
- package/src/main.ts +1 -0
- package/src/observability/event-query.ts +18 -4
- package/src/persistence/dialect.ts +12 -0
- package/src/persistence/schema.ts +20 -2
- package/src/protocol/dsml.ts +1 -1
- package/src/protocol/gateway-error.ts +1 -0
- package/src/protocol/reasoning.ts +1 -1
- package/src/protocol/request/chat.ts +4 -4
- package/src/protocol/request/messages.ts +1 -1
- package/src/protocol/response/gemini.ts +6 -1
- package/src/protocol/sse-decoder.ts +25 -8
- package/src/protocol/stream-error-frames.ts +13 -3
- package/src/protocol/translation/quirks.ts +1 -1
- package/src/protocol/translation/tool-repair.ts +2 -2
- package/src/protocol/upstream/send-claude-messages.ts +15 -4
- package/src/protocol/upstream-parsing.ts +1 -1
- package/src/providers/adapters/compatible-adapter.ts +7 -5
- package/src/providers/authentication/oauth-refresh-service.ts +149 -36
- package/src/providers/default-registry.ts +68 -3
- package/src/providers/discovery/discovery-types.ts +12 -0
- package/src/providers/discovery/probe-phases.ts +61 -30
- package/src/providers/discovery/probing-service.ts +279 -164
- package/src/providers/integrations/antigravity/antigravity-protocol.ts +117 -2
- package/src/providers/integrations/antigravity/antigravity.ts +13 -2
- package/src/providers/integrations/buddy/buddy-catalog-shared.ts +72 -34
- package/src/providers/integrations/buddy/buddy-chat-shared.ts +18 -18
- package/src/providers/integrations/buddy/buddy-checkin.ts +17 -39
- package/src/providers/integrations/buddy/buddy-conversation-headers.ts +2 -2
- package/src/providers/integrations/buddy/buddy-discovery-shared.ts +5 -5
- package/src/providers/integrations/buddy/buddy-identity.ts +70 -0
- package/src/providers/integrations/buddy/buddy-media.ts +4 -5
- package/src/providers/integrations/buddy/buddy-oauth-shared.ts +2 -2
- package/src/providers/integrations/buddy/buddy-quota-shared.ts +1 -1
- package/src/providers/integrations/buddy/buddy-usage-shared.ts +1 -3
- package/src/providers/integrations/buddy/capabilities.ts +4 -41
- package/src/providers/integrations/buddy/codebuddy/cn-catalog.ts +2 -1
- package/src/providers/integrations/buddy/codebuddy/cn-provider.ts +20 -1
- package/src/providers/integrations/buddy/codebuddy/provider.ts +2 -2
- package/src/providers/integrations/buddy/codebuddy/shared.ts +6 -10
- package/src/providers/integrations/cursor/cursor-catalog.ts +2 -0
- package/src/providers/integrations/cursor/cursor-exec.ts +738 -0
- package/src/providers/integrations/cursor/cursor-http2.ts +2 -0
- package/src/providers/integrations/cursor/cursor-request.ts +9 -8
- package/src/providers/integrations/cursor/cursor-shared.ts +19 -1
- package/src/providers/integrations/cursor/cursor.ts +50 -30
- package/src/providers/integrations/cursor/protocol/tool-canonical.ts +26 -100
- package/src/providers/integrations/devin/devin-auth.ts +353 -0
- package/src/providers/integrations/devin/devin-catalog.ts +207 -0
- package/src/providers/integrations/devin/devin-http.ts +91 -0
- package/src/providers/integrations/devin/devin-quota.ts +214 -0
- package/src/providers/integrations/devin/devin-shared.ts +111 -0
- package/src/providers/integrations/devin/devin.ts +539 -0
- package/src/providers/integrations/devin/protocol/devin-proto.ts +584 -0
- package/src/providers/integrations/devin/protocol/framing.ts +124 -0
- package/src/providers/integrations/factory/factory.ts +2 -2
- package/src/providers/integrations/freepi/freepi-catalog.ts +60 -0
- package/src/providers/integrations/freepi/freepi-discovery.ts +82 -0
- package/src/providers/integrations/freepi/freepi-headers.ts +21 -0
- package/src/providers/integrations/freepi/freepi-oauth.ts +142 -0
- package/src/providers/integrations/freepi/freepi-protocol.ts +242 -0
- package/src/providers/integrations/freepi/freepi-quota.ts +126 -0
- package/src/providers/integrations/freepi/freepi-realm.ts +35 -0
- package/src/providers/integrations/freepi/freepi.ts +292 -0
- package/src/providers/integrations/gemini.ts +2 -2
- package/src/providers/integrations/hermes/hermes-oauth.ts +94 -0
- package/src/providers/integrations/hermes.ts +4 -12
- package/src/providers/integrations/opencode/fingerprint.ts +1 -1
- package/src/providers/integrations/perch/perch-catalog.ts +105 -0
- package/src/providers/integrations/perch/perch-oauth.ts +170 -0
- package/src/providers/integrations/perch/perch-protocol.ts +211 -0
- package/src/providers/integrations/perch/perch-quota.ts +137 -0
- package/src/providers/integrations/perch/perch-realm.ts +82 -0
- package/src/providers/integrations/perch/perch-system-prompt.ts +13 -0
- package/src/providers/integrations/perch/perch.ts +315 -0
- package/src/providers/integrations/perch/saffron-system-prompt.txt +8 -0
- package/src/providers/integrations/qoder/chat-proto.ts +328 -328
- package/src/providers/integrations/qoder/claim-qoder-credits.ts +1 -1
- package/src/providers/integrations/qoder/qoder-adapter.ts +89 -28
- package/src/providers/integrations/qoder/qoder-cache.ts +32 -0
- package/src/providers/integrations/qoder/qoder-catalog.ts +6 -1
- package/src/providers/integrations/qoder/qoder-checkin.ts +2 -2
- package/src/providers/integrations/qoder/qoder-grpc.ts +210 -6
- package/src/providers/integrations/qoder/qoder-ide.ts +5 -1
- package/src/providers/integrations/qoder/qoder-identity-cache.ts +184 -0
- package/src/providers/integrations/qoder/qoder-native-identity-store.ts +83 -18
- package/src/providers/integrations/qoder/qoder-realm.ts +9 -6
- package/src/providers/integrations/qoder/qoder-umid.ts +109 -342
- package/src/providers/integrations/qoder/qoder-virtual.ts +33 -1
- package/src/providers/integrations/qoder/qoder.ts +3 -6
- package/src/providers/integrations/trae/trae-catalog.ts +9 -14
- package/src/providers/integrations/trae/trae-headers.ts +36 -11
- package/src/providers/integrations/trae/trae-oauth.ts +14 -17
- package/src/providers/integrations/trae/trae-protocol.ts +3 -6
- package/src/providers/integrations/trae/trae-quota.ts +103 -21
- package/src/providers/integrations/trae/trae-realm.ts +36 -15
- package/src/providers/integrations/trae/trae.ts +97 -7
- package/src/providers/operations/account-error-classification.ts +66 -1
- package/src/providers/operations/account-health-service.ts +192 -26
- package/src/providers/operations/account-refresh-status.ts +284 -0
- package/src/providers/operations/account-tier.ts +67 -0
- package/src/providers/operations/client-versions.ts +37 -99
- package/src/providers/operations/cooldown-rules.ts +61 -0
- package/src/providers/operations/provider-catalog-seeder.ts +4 -0
- package/src/providers/provider-contracts.ts +29 -0
- package/src/providers/provider-metadata.ts +59 -4
- package/src/providers/provider-model-definition.ts +36 -0
- package/src/providers/quota/refresh.ts +21 -0
- package/src/security/abuse.ts +71 -0
- package/src/transport/dispatch/proxy-request.ts +1 -0
- package/src/transport/dispatch/streaming/stream.ts +1 -0
- package/src/transport/dispatch/upstream.ts +4 -1
- package/src/transport/failure-policy.ts +113 -7
- package/src/transport/routing/router.ts +25 -1
- package/src/transport/surface/messages/adapter.ts +2 -1
- package/src/transport/surface/responses/encode.ts +12 -1
- package/src/workers/daily-checkin.ts +1 -1
- package/src/workers/quota-refresh-sweep.ts +1 -1
- package/src/workers/scheduler.ts +22 -4
- package/dist/dashboard/assets/BannedPage-DeIbIiBU.js +0 -1
- package/dist/dashboard/assets/BannedPage-DeIbIiBU.js.gz +0 -0
- package/dist/dashboard/assets/CliToolDetailPage-BRWKPQPf.js.gz +0 -0
- package/dist/dashboard/assets/CliToolsPage-BP-Y5iHN.js.gz +0 -0
- package/dist/dashboard/assets/CombosPage-B7JHozVa.js +0 -1
- package/dist/dashboard/assets/CombosPage-B7JHozVa.js.gz +0 -0
- package/dist/dashboard/assets/ConsoleLogPage-GX7iGGcu.js +0 -1
- package/dist/dashboard/assets/ConsoleLogPage-GX7iGGcu.js.gz +0 -0
- package/dist/dashboard/assets/CustomizationPage-HVonbGEa.js +0 -1
- package/dist/dashboard/assets/CustomizationPage-HVonbGEa.js.gz +0 -0
- package/dist/dashboard/assets/HealthEventsModal-xaut4OJ9.js +0 -1
- package/dist/dashboard/assets/HealthEventsModal-xaut4OJ9.js.gz +0 -0
- package/dist/dashboard/assets/InjectSystemPromptPanel-Cv-2Ol_K.js.gz +0 -0
- package/dist/dashboard/assets/LoginPage-bKfz_b1K.js.gz +0 -0
- package/dist/dashboard/assets/ModelPicker-B-WQxx_H.js.gz +0 -0
- package/dist/dashboard/assets/OverviewPage-Z9pJZFo8.js +0 -1
- package/dist/dashboard/assets/OverviewPage-Z9pJZFo8.js.gz +0 -0
- package/dist/dashboard/assets/ProviderDetailPage-CMeDBxR1.js +0 -7
- package/dist/dashboard/assets/ProviderDetailPage-CMeDBxR1.js.gz +0 -0
- package/dist/dashboard/assets/ProviderIcon-jjqXJDA3.js +0 -1
- package/dist/dashboard/assets/ProviderIcon-jjqXJDA3.js.gz +0 -0
- package/dist/dashboard/assets/ProvidersPage-BXPdOpG4.js +0 -1
- package/dist/dashboard/assets/ProvidersPage-BXPdOpG4.js.gz +0 -0
- package/dist/dashboard/assets/ProxyPage-emlTuxz6.js.gz +0 -0
- package/dist/dashboard/assets/QuotaPage-CMJKNYWb.js.gz +0 -0
- package/dist/dashboard/assets/SettingsPage-BSy7EwGo.js +0 -1
- package/dist/dashboard/assets/SettingsPage-BSy7EwGo.js.gz +0 -0
- package/dist/dashboard/assets/SetupPage-CUZrKs9r.js.gz +0 -0
- package/dist/dashboard/assets/StudioPage-jWmUdDpy.js.gz +0 -0
- package/dist/dashboard/assets/UsagePage-5F9tGVGG.js +0 -56
- package/dist/dashboard/assets/UsagePage-5F9tGVGG.js.gz +0 -0
- package/dist/dashboard/assets/api-keys-KvX83mRe.js +0 -1
- package/dist/dashboard/assets/api-keys-KvX83mRe.js.gz +0 -0
- package/dist/dashboard/assets/app-BEsU8hKs.css +0 -2
- package/dist/dashboard/assets/app-BEsU8hKs.css.gz +0 -0
- package/dist/dashboard/assets/assert-CidQVoNo.js +0 -1
- package/dist/dashboard/assets/assert-CidQVoNo.js.gz +0 -0
- package/dist/dashboard/assets/badge-DyI_mJfi.js.gz +0 -0
- package/dist/dashboard/assets/banner-B-yXtCqb.js.gz +0 -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/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/brand/sidebar_ico.jpg +0 -0
- package/dist/dashboard/assets/card-_HwAEqFF.js.gz +0 -0
- package/dist/dashboard/assets/cli-tools-Bwv5-zGZ.js +0 -1
- package/dist/dashboard/assets/cli-tools-Bwv5-zGZ.js.gz +0 -0
- package/dist/dashboard/assets/clipboard-button-ByjCk0o9.js.gz +0 -0
- package/dist/dashboard/assets/dialog-BZhOlfz-.js.gz +0 -0
- package/dist/dashboard/assets/drawer-BADqIRYP.js.gz +0 -0
- package/dist/dashboard/assets/entry-COaC-irN.js.gz +0 -0
- package/dist/dashboard/assets/entry-Ca7LSCet.js +0 -4
- package/dist/dashboard/assets/entry-Ca7LSCet.js.gz +0 -0
- package/dist/dashboard/assets/entry-PDd27uCd.js +0 -1
- package/dist/dashboard/assets/entry-PDd27uCd.js.gz +0 -0
- package/dist/dashboard/assets/formatters-DcHJyRiu.js.gz +0 -0
- package/dist/dashboard/assets/index-CgKmFngv.js.gz +0 -0
- package/dist/dashboard/assets/inline-B2BirKry.js.gz +0 -0
- package/dist/dashboard/assets/input-D-qV9dKY.js.gz +0 -0
- package/dist/dashboard/assets/layout-B7tVWhtV.js.gz +0 -0
- package/dist/dashboard/assets/list-row-CtkGE3bF.js.gz +0 -0
- package/dist/dashboard/assets/live-DGizF06-.js.gz +0 -0
- package/dist/dashboard/assets/minimize-2-BTmMTK4o.js +0 -1
- package/dist/dashboard/assets/minimize-2-BTmMTK4o.js.gz +0 -0
- package/dist/dashboard/assets/mutation-GU7XdEjz.js.gz +0 -0
- package/dist/dashboard/assets/network-C9UE-bOr.js.gz +0 -0
- package/dist/dashboard/assets/numbers-BnAd22a_.js.gz +0 -0
- package/dist/dashboard/assets/pagination-BAywyMzS.js.gz +0 -0
- package/dist/dashboard/assets/query-keys-YSoQOUh6.js.gz +0 -0
- package/dist/dashboard/assets/routing-fnCsxgNO.js +0 -1
- package/dist/dashboard/assets/routing-fnCsxgNO.js.gz +0 -0
- package/dist/dashboard/assets/select-BCOcv8WK.js.gz +0 -0
- package/dist/dashboard/assets/settings-BxslsErn.js +0 -1
- package/dist/dashboard/assets/settings-BxslsErn.js.gz +0 -0
- package/dist/dashboard/assets/stack-ByKt3Q1g.js.gz +0 -0
- package/dist/dashboard/assets/state-DXbGTx7N.js.gz +0 -0
- package/dist/dashboard/assets/switch-ZeTsW623.js.gz +0 -0
- 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/donation/qris-risun-marke.png +0 -0
- package/src/providers/integrations/buddy/turing-device-token.ts +0 -262
- package/src/providers/integrations/buddy/workbuddy/cn-oauth.ts +0 -30
- package/src/providers/integrations/buddy/workbuddy/cn-provider.ts +0 -58
- package/src/providers/integrations/buddy/workbuddy/oauth.ts +0 -31
- package/src/providers/integrations/buddy/workbuddy/provider.ts +0 -209
- package/src/providers/integrations/buddy/workbuddy/quota.ts +0 -161
- package/src/providers/integrations/buddy/workbuddy/shared.ts +0 -285
- /package/dist/dashboard/assets/{app-CTxoqyYB.js → app-B7kIWFm5.js} +0 -0
- /package/dist/dashboard/assets/{app-CTxoqyYB.js.gz → app-B7kIWFm5.js.gz} +0 -0
|
@@ -1,77 +1,77 @@
|
|
|
1
1
|
{
|
|
2
|
-
"count":
|
|
2
|
+
"count": 121,
|
|
3
3
|
"assets": [
|
|
4
|
-
"assets/BannedPage-
|
|
5
|
-
"assets/CliToolDetailPage-
|
|
6
|
-
"assets/CliToolsPage-
|
|
7
|
-
"assets/CombosPage-
|
|
8
|
-
"assets/ConsoleLogPage-
|
|
9
|
-
"assets/CustomizationPage-
|
|
10
|
-
"assets/HealthEventsModal-
|
|
11
|
-
"assets/InjectSystemPromptPanel-
|
|
12
|
-
"assets/LoginPage-
|
|
13
|
-
"assets/ModelPicker-
|
|
14
|
-
"assets/OverviewPage-
|
|
15
|
-
"assets/ProviderDetailPage-
|
|
16
|
-
"assets/ProviderIcon-
|
|
17
|
-
"assets/ProvidersPage-
|
|
18
|
-
"assets/ProxyPage-
|
|
19
|
-
"assets/QuotaPage-
|
|
20
|
-
"assets/SettingsPage-
|
|
21
|
-
"assets/SetupPage-
|
|
22
|
-
"assets/StudioPage-
|
|
4
|
+
"assets/BannedPage-BxoG1MrL.js",
|
|
5
|
+
"assets/CliToolDetailPage-ixwgKk53.js",
|
|
6
|
+
"assets/CliToolsPage-BmttNV3U.js",
|
|
7
|
+
"assets/CombosPage-BE3qwwfC.js",
|
|
8
|
+
"assets/ConsoleLogPage-CRZdmMIX.js",
|
|
9
|
+
"assets/CustomizationPage-Dv_FJ6Er.js",
|
|
10
|
+
"assets/HealthEventsModal-CoVrw2sM.js",
|
|
11
|
+
"assets/InjectSystemPromptPanel-BOoO8rpz.js",
|
|
12
|
+
"assets/LoginPage-ChJuNNVN.js",
|
|
13
|
+
"assets/ModelPicker-BZAJtPg1.js",
|
|
14
|
+
"assets/OverviewPage-BE40s3u5.js",
|
|
15
|
+
"assets/ProviderDetailPage-sfLoQtPV.js",
|
|
16
|
+
"assets/ProviderIcon-CQ6bPUf_.js",
|
|
17
|
+
"assets/ProvidersPage-DcepmPWo.js",
|
|
18
|
+
"assets/ProxyPage-BJ87Pp0U.js",
|
|
19
|
+
"assets/QuotaPage-gkSyRAKa.js",
|
|
20
|
+
"assets/SettingsPage-C5HPWqEv.js",
|
|
21
|
+
"assets/SetupPage-CFNcATJJ.js",
|
|
22
|
+
"assets/StudioPage-YoD4tY5l.js",
|
|
23
23
|
"assets/ToolIcon-CfeLA-Z_.js",
|
|
24
|
-
"assets/UsagePage-
|
|
25
|
-
"assets/api-keys-
|
|
26
|
-
"assets/app-
|
|
27
|
-
"assets/app-
|
|
24
|
+
"assets/UsagePage-DxjaAhb_.js",
|
|
25
|
+
"assets/api-keys-BTlkq_Uk.js",
|
|
26
|
+
"assets/app-B7kIWFm5.js",
|
|
27
|
+
"assets/app-BX2nnKqs.css",
|
|
28
28
|
"assets/arrow-left-CpBxkoxI.js",
|
|
29
29
|
"assets/arrow-right-Dl5yKnp8.js",
|
|
30
30
|
"assets/arrow-up-59ms1iiT.js",
|
|
31
|
-
"assets/assert-
|
|
31
|
+
"assets/assert-CndthXFQ.js",
|
|
32
32
|
"assets/backup-file-gdKIlg8U.js",
|
|
33
|
-
"assets/badge-
|
|
34
|
-
"assets/
|
|
33
|
+
"assets/badge-DdbT_7Am.js",
|
|
34
|
+
"assets/ban-durations-B58FyRxC.js",
|
|
35
|
+
"assets/banner-CsGN-nbm.js",
|
|
35
36
|
"assets/brain-Cwed_72z.js",
|
|
36
|
-
"assets/card-
|
|
37
|
+
"assets/card-mgZ_TLLZ.js",
|
|
37
38
|
"assets/chevron-left-Bf6CaTSJ.js",
|
|
38
39
|
"assets/chevron-right-BXIy5l3h.js",
|
|
39
40
|
"assets/circle-alert-CntYHV5v.js",
|
|
40
41
|
"assets/circle-check-BU3v_mFW.js",
|
|
41
42
|
"assets/circle-question-mark-Cz4un8sH.js",
|
|
42
|
-
"assets/cli-tools-
|
|
43
|
-
"assets/clipboard-button-
|
|
43
|
+
"assets/cli-tools-A1-v8-03.js",
|
|
44
|
+
"assets/clipboard-button-CJ4Zty89.js",
|
|
44
45
|
"assets/database-Dz9N3zGd.js",
|
|
45
|
-
"assets/dialog-
|
|
46
|
+
"assets/dialog-B5L2jPQ_.js",
|
|
46
47
|
"assets/dialog-actions-B1axpEg7.js",
|
|
47
48
|
"assets/download-dRFo5_Wu.js",
|
|
48
|
-
"assets/drawer-
|
|
49
|
-
"assets/entry-
|
|
50
|
-
"assets/entry-
|
|
51
|
-
"assets/entry-
|
|
49
|
+
"assets/drawer-DkjUouAj.js",
|
|
50
|
+
"assets/entry-B-LVLV6o.js",
|
|
51
|
+
"assets/entry-CAhdYl3B.js",
|
|
52
|
+
"assets/entry-D2xD0Tmd.js",
|
|
52
53
|
"assets/eye-C_hawfH4.js",
|
|
53
54
|
"assets/eye-off-Bk5g2luF.js",
|
|
54
55
|
"assets/fingerprint-pattern-BWuHtbW4.js",
|
|
55
|
-
"assets/formatters-
|
|
56
|
+
"assets/formatters-CrsdLVsn.js",
|
|
56
57
|
"assets/gauge-BbIMy7MB.js",
|
|
57
58
|
"assets/house-h9AZlJuT.js",
|
|
58
59
|
"assets/image-BPaouViG.js",
|
|
59
|
-
"assets/index-
|
|
60
|
-
"assets/inline-
|
|
61
|
-
"assets/input-
|
|
60
|
+
"assets/index-BU64Lqvp.js",
|
|
61
|
+
"assets/inline-B2aDLyyg.js",
|
|
62
|
+
"assets/input-BCVkdR9d.js",
|
|
62
63
|
"assets/jsx-runtime-CXUMngI_.js",
|
|
63
64
|
"assets/key-round-UkavsGxp.js",
|
|
64
65
|
"assets/layers-2-glBbjl.js",
|
|
65
|
-
"assets/layout-
|
|
66
|
-
"assets/list-row-
|
|
67
|
-
"assets/live-
|
|
66
|
+
"assets/layout-DNcAdMK-.js",
|
|
67
|
+
"assets/list-row-DgrIH0hw.js",
|
|
68
|
+
"assets/live-Cae01iu8.js",
|
|
68
69
|
"assets/log-in-BmRjy60c.js",
|
|
69
70
|
"assets/message-circle-CCxGwRvv.js",
|
|
70
|
-
"assets/
|
|
71
|
-
"assets/
|
|
72
|
-
"assets/
|
|
73
|
-
"assets/
|
|
74
|
-
"assets/pagination-BAywyMzS.js",
|
|
71
|
+
"assets/mutation-BQ0ccH_A.js",
|
|
72
|
+
"assets/network-CRib7H_2.js",
|
|
73
|
+
"assets/numbers-BKQE8Xpz.js",
|
|
74
|
+
"assets/pagination-ecPvG_8g.js",
|
|
75
75
|
"assets/pencil-768ysRAr.js",
|
|
76
76
|
"assets/plus-DIdX_g-x.js",
|
|
77
77
|
"assets/power-off-Yjw9GMJh.js",
|
|
@@ -84,6 +84,7 @@
|
|
|
84
84
|
"assets/providers/bai.svg",
|
|
85
85
|
"assets/providers/blackbox.svg",
|
|
86
86
|
"assets/providers/claude-code.svg",
|
|
87
|
+
"assets/providers/devin.svg",
|
|
87
88
|
"assets/providers/exa.svg",
|
|
88
89
|
"assets/providers/gmi-cloud.svg",
|
|
89
90
|
"assets/providers/inception.svg",
|
|
@@ -93,22 +94,23 @@
|
|
|
93
94
|
"assets/providers/openai-light.svg",
|
|
94
95
|
"assets/providers/parallel.svg",
|
|
95
96
|
"assets/providers/tokenharbor.svg",
|
|
96
|
-
"assets/
|
|
97
|
+
"assets/providers/windsurf.svg",
|
|
98
|
+
"assets/query-keys-IKLh0YFd.js",
|
|
97
99
|
"assets/quota-DJ1QlAOq.js",
|
|
98
100
|
"assets/refresh-cw-BqJFk4sU.js",
|
|
99
101
|
"assets/rotate-ccw-CufcqITi.js",
|
|
100
102
|
"assets/route-CNSNj9Zm.js",
|
|
101
|
-
"assets/routing-
|
|
103
|
+
"assets/routing-Ckm1UXuC.js",
|
|
102
104
|
"assets/scaling-nWE4Cx8f.js",
|
|
103
105
|
"assets/search-JOKus9rb.js",
|
|
104
|
-
"assets/select-
|
|
106
|
+
"assets/select-ChoFWyKz.js",
|
|
105
107
|
"assets/settings-2-Ds9DQp0t.js",
|
|
106
|
-
"assets/settings-
|
|
108
|
+
"assets/settings-CKjFPlKW.js",
|
|
107
109
|
"assets/shield-BMQNxORh.js",
|
|
108
110
|
"assets/shield-check-DVS0Foqh.js",
|
|
109
|
-
"assets/stack-
|
|
110
|
-
"assets/state-
|
|
111
|
-
"assets/switch-
|
|
111
|
+
"assets/stack-DWCwU3fh.js",
|
|
112
|
+
"assets/state-Cg3VL5J_.js",
|
|
113
|
+
"assets/switch-Db70BMix.js",
|
|
112
114
|
"assets/terminal-0_IjPWTk.js",
|
|
113
115
|
"assets/tokens-COzario9.js",
|
|
114
116
|
"assets/trash-Cppn5c3R.js",
|
|
@@ -116,7 +118,7 @@
|
|
|
116
118
|
"assets/use-modal-focus-By7oJoGd.js",
|
|
117
119
|
"assets/use-reduced-motion-C4B0R6Sz.js",
|
|
118
120
|
"assets/use-timeout-BwcBBRrT.js",
|
|
119
|
-
"assets/useMutation-
|
|
121
|
+
"assets/useMutation-BqdE0LuM.js",
|
|
120
122
|
"assets/wrench-B6E1oEuY.js",
|
|
121
123
|
"assets/zap-C4EeVW4q.js",
|
|
122
124
|
"index.html"
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
-- Adds `models.warning_metadata` (jsonb, nullable) — display-only warning
|
|
2
|
+
-- metadata for a model row, carried as `{ warnings: [{ kind, message,
|
|
3
|
+
-- severity?, updatedAt? }] }`. NULL means "no warnings"; the column is not
|
|
4
|
+
-- read by routing. Part of the provider-account model-update proposal §3.4
|
|
5
|
+
-- (area 06).
|
|
6
|
+
--
|
|
7
|
+
-- Idempotency comes from the migration ledger plus `ADD COLUMN IF NOT EXISTS`:
|
|
8
|
+
-- a database built from a newer baseline that already carries the column must
|
|
9
|
+
-- not fail startup.
|
|
10
|
+
ALTER TABLE "models" ADD COLUMN IF NOT EXISTS "warning_metadata" jsonb;
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
-- Migrate WorkBuddy provider data onto the CodeBuddy providers, then drop
|
|
2
|
+
-- the WorkBuddy providers entirely.
|
|
3
|
+
--
|
|
4
|
+
-- workbuddy -> cb (CodeBuddy intl)
|
|
5
|
+
-- workbuddycn -> cbcn (CodeBuddy CN)
|
|
6
|
+
--
|
|
7
|
+
-- This mirrors the opencode rename pattern: the parent `providers` row is
|
|
8
|
+
-- copied under the new id, every dependent table is repointed, and the old
|
|
9
|
+
-- row is dropped last. Inside the migration transaction this is atomic.
|
|
10
|
+
--
|
|
11
|
+
-- A database that never had the WorkBuddy ids is unaffected — every statement
|
|
12
|
+
-- matches zero rows. If a deployment somehow carries both spellings, the
|
|
13
|
+
-- repoint merges them onto the new id, which is the correct outcome for one
|
|
14
|
+
-- provider with two names.
|
|
15
|
+
|
|
16
|
+
-- ── workbuddy -> cb ────────────────────────────────────────────────────────
|
|
17
|
+
|
|
18
|
+
INSERT INTO "providers" (
|
|
19
|
+
"id", "tenant_id", "wire_family_default", "capability_profile", "base_url",
|
|
20
|
+
"compatibility_profile", "enabled", "requires_account"
|
|
21
|
+
)
|
|
22
|
+
SELECT
|
|
23
|
+
'cb', "tenant_id", "wire_family_default", "capability_profile", "base_url",
|
|
24
|
+
"compatibility_profile", "enabled", "requires_account"
|
|
25
|
+
FROM "providers"
|
|
26
|
+
WHERE "id" = 'workbuddy'
|
|
27
|
+
ON CONFLICT ("id") DO NOTHING;
|
|
28
|
+
|
|
29
|
+
-- Drop rows the repoint would collide with on a unique index.
|
|
30
|
+
DELETE FROM "models"
|
|
31
|
+
WHERE "provider_id" = 'workbuddy'
|
|
32
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb')
|
|
33
|
+
AND EXISTS (
|
|
34
|
+
SELECT 1 FROM "models" AS keep
|
|
35
|
+
WHERE keep."provider_id" = 'cb'
|
|
36
|
+
AND keep."model_id" = "models"."model_id"
|
|
37
|
+
AND keep."endpoint_path" = "models"."endpoint_path"
|
|
38
|
+
);
|
|
39
|
+
DELETE FROM "tenant_disabled_models"
|
|
40
|
+
WHERE "provider_id" = 'workbuddy'
|
|
41
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb')
|
|
42
|
+
AND EXISTS (
|
|
43
|
+
SELECT 1 FROM "tenant_disabled_models" AS keep
|
|
44
|
+
WHERE keep."provider_id" = 'cb'
|
|
45
|
+
AND keep."tenant_id" = "tenant_disabled_models"."tenant_id"
|
|
46
|
+
AND keep."model_id" = "tenant_disabled_models"."model_id"
|
|
47
|
+
AND keep."endpoint_path" = "tenant_disabled_models"."endpoint_path"
|
|
48
|
+
);
|
|
49
|
+
DELETE FROM "provider_accounts"
|
|
50
|
+
WHERE "provider_id" = 'workbuddy'
|
|
51
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb')
|
|
52
|
+
AND EXISTS (
|
|
53
|
+
SELECT 1 FROM "provider_accounts" AS keep
|
|
54
|
+
WHERE keep."provider_id" = 'cb'
|
|
55
|
+
AND keep."tenant_id" IS NOT DISTINCT FROM "provider_accounts"."tenant_id"
|
|
56
|
+
AND keep."credential_fingerprint" IS NOT DISTINCT FROM "provider_accounts"."credential_fingerprint"
|
|
57
|
+
);
|
|
58
|
+
DELETE FROM "provider_routing_settings"
|
|
59
|
+
WHERE "provider_id" = 'workbuddy'
|
|
60
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb')
|
|
61
|
+
AND EXISTS (
|
|
62
|
+
SELECT 1 FROM "provider_routing_settings" AS keep
|
|
63
|
+
WHERE keep."provider_id" = 'cb'
|
|
64
|
+
AND keep."tenant_id" IS NOT DISTINCT FROM "provider_routing_settings"."tenant_id"
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
UPDATE "provider_accounts" SET "provider_id" = 'cb'
|
|
68
|
+
WHERE "provider_id" = 'workbuddy'
|
|
69
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb');
|
|
70
|
+
UPDATE "models" SET "provider_id" = 'cb'
|
|
71
|
+
WHERE "provider_id" = 'workbuddy'
|
|
72
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb');
|
|
73
|
+
UPDATE "tenant_disabled_models" SET "provider_id" = 'cb'
|
|
74
|
+
WHERE "provider_id" = 'workbuddy'
|
|
75
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb');
|
|
76
|
+
UPDATE "provider_routing_settings" SET "provider_id" = 'cb'
|
|
77
|
+
WHERE "provider_id" = 'workbuddy'
|
|
78
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb');
|
|
79
|
+
UPDATE "telemetry_events" SET "provider_id" = 'cb'
|
|
80
|
+
WHERE "provider_id" = 'workbuddy'
|
|
81
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb');
|
|
82
|
+
|
|
83
|
+
DELETE FROM "providers"
|
|
84
|
+
WHERE "id" = 'workbuddy'
|
|
85
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb');
|
|
86
|
+
|
|
87
|
+
-- ── workbuddycn -> cbcn ──────────────────────────────────────────────────────
|
|
88
|
+
|
|
89
|
+
INSERT INTO "providers" (
|
|
90
|
+
"id", "tenant_id", "wire_family_default", "capability_profile", "base_url",
|
|
91
|
+
"compatibility_profile", "enabled", "requires_account"
|
|
92
|
+
)
|
|
93
|
+
SELECT
|
|
94
|
+
'cbcn', "tenant_id", "wire_family_default", "capability_profile", "base_url",
|
|
95
|
+
"compatibility_profile", "enabled", "requires_account"
|
|
96
|
+
FROM "providers"
|
|
97
|
+
WHERE "id" = 'workbuddycn'
|
|
98
|
+
ON CONFLICT ("id") DO NOTHING;
|
|
99
|
+
|
|
100
|
+
-- Drop rows the repoint would collide with on a unique index.
|
|
101
|
+
DELETE FROM "models"
|
|
102
|
+
WHERE "provider_id" = 'workbuddycn'
|
|
103
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn')
|
|
104
|
+
AND EXISTS (
|
|
105
|
+
SELECT 1 FROM "models" AS keep
|
|
106
|
+
WHERE keep."provider_id" = 'cbcn'
|
|
107
|
+
AND keep."model_id" = "models"."model_id"
|
|
108
|
+
AND keep."endpoint_path" = "models"."endpoint_path"
|
|
109
|
+
);
|
|
110
|
+
DELETE FROM "tenant_disabled_models"
|
|
111
|
+
WHERE "provider_id" = 'workbuddycn'
|
|
112
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn')
|
|
113
|
+
AND EXISTS (
|
|
114
|
+
SELECT 1 FROM "tenant_disabled_models" AS keep
|
|
115
|
+
WHERE keep."provider_id" = 'cbcn'
|
|
116
|
+
AND keep."tenant_id" = "tenant_disabled_models"."tenant_id"
|
|
117
|
+
AND keep."model_id" = "tenant_disabled_models"."model_id"
|
|
118
|
+
AND keep."endpoint_path" = "tenant_disabled_models"."endpoint_path"
|
|
119
|
+
);
|
|
120
|
+
DELETE FROM "provider_accounts"
|
|
121
|
+
WHERE "provider_id" = 'workbuddycn'
|
|
122
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn')
|
|
123
|
+
AND EXISTS (
|
|
124
|
+
SELECT 1 FROM "provider_accounts" AS keep
|
|
125
|
+
WHERE keep."provider_id" = 'cbcn'
|
|
126
|
+
AND keep."tenant_id" IS NOT DISTINCT FROM "provider_accounts"."tenant_id"
|
|
127
|
+
AND keep."credential_fingerprint" IS NOT DISTINCT FROM "provider_accounts"."credential_fingerprint"
|
|
128
|
+
);
|
|
129
|
+
DELETE FROM "provider_routing_settings"
|
|
130
|
+
WHERE "provider_id" = 'workbuddycn'
|
|
131
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn')
|
|
132
|
+
AND EXISTS (
|
|
133
|
+
SELECT 1 FROM "provider_routing_settings" AS keep
|
|
134
|
+
WHERE keep."provider_id" = 'cbcn'
|
|
135
|
+
AND keep."tenant_id" IS NOT DISTINCT FROM "provider_routing_settings"."tenant_id"
|
|
136
|
+
);
|
|
137
|
+
|
|
138
|
+
UPDATE "provider_accounts" SET "provider_id" = 'cbcn'
|
|
139
|
+
WHERE "provider_id" = 'workbuddycn'
|
|
140
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn');
|
|
141
|
+
UPDATE "models" SET "provider_id" = 'cbcn'
|
|
142
|
+
WHERE "provider_id" = 'workbuddycn'
|
|
143
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn');
|
|
144
|
+
UPDATE "tenant_disabled_models" SET "provider_id" = 'cbcn'
|
|
145
|
+
WHERE "provider_id" = 'workbuddycn'
|
|
146
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn');
|
|
147
|
+
UPDATE "provider_routing_settings" SET "provider_id" = 'cbcn'
|
|
148
|
+
WHERE "provider_id" = 'workbuddycn'
|
|
149
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn');
|
|
150
|
+
UPDATE "telemetry_events" SET "provider_id" = 'cbcn'
|
|
151
|
+
WHERE "provider_id" = 'workbuddycn'
|
|
152
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn');
|
|
153
|
+
|
|
154
|
+
DELETE FROM "providers"
|
|
155
|
+
WHERE "id" = 'workbuddycn'
|
|
156
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn');
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
-- Adds `models.warning_metadata` (text, nullable) — display-only warning
|
|
2
|
+
-- metadata for a model row, stored as a JSON string in SQLite (the dialect's
|
|
3
|
+
-- jsonb analogue; Postgres keeps the same column as jsonb). NULL means "no
|
|
4
|
+
-- warnings"; the column is not read by routing. Part of the provider-account
|
|
5
|
+
-- model-update proposal §3.4 (area 06).
|
|
6
|
+
--
|
|
7
|
+
-- Idempotency comes from the migration ledger, not from the statement: the
|
|
8
|
+
-- runner records the file inside the same transaction, so a file that has
|
|
9
|
+
-- already run is never re-executed. The baseline is generated from
|
|
10
|
+
-- `0000_baseline.sql` alone and does not carry this column.
|
|
11
|
+
ALTER TABLE "models" ADD COLUMN "warning_metadata" text;
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
-- Migrate WorkBuddy provider data onto the CodeBuddy providers, then drop
|
|
2
|
+
-- the WorkBuddy providers entirely.
|
|
3
|
+
--
|
|
4
|
+
-- workbuddy -> cb (CodeBuddy intl)
|
|
5
|
+
-- workbuddycn -> cbcn (CodeBuddy CN)
|
|
6
|
+
--
|
|
7
|
+
-- This mirrors the opencode rename pattern: the parent `providers` row is
|
|
8
|
+
-- copied under the new id, every dependent table is repointed, and the old
|
|
9
|
+
-- row is dropped last. Inside the migration transaction this is atomic.
|
|
10
|
+
--
|
|
11
|
+
-- A database that never had the WorkBuddy ids is unaffected — every statement
|
|
12
|
+
-- matches zero rows. If a deployment somehow carries both spellings, the
|
|
13
|
+
-- repoint merges them onto the new id, which is the correct outcome for one
|
|
14
|
+
-- provider with two names.
|
|
15
|
+
|
|
16
|
+
-- ── workbuddy -> cb ────────────────────────────────────────────────────────
|
|
17
|
+
|
|
18
|
+
INSERT INTO "providers" (
|
|
19
|
+
"id", "tenant_id", "wire_family_default", "capability_profile", "base_url",
|
|
20
|
+
"compatibility_profile", "enabled", "requires_account"
|
|
21
|
+
)
|
|
22
|
+
SELECT
|
|
23
|
+
'cb', "tenant_id", "wire_family_default", "capability_profile", "base_url",
|
|
24
|
+
"compatibility_profile", "enabled", "requires_account"
|
|
25
|
+
FROM "providers"
|
|
26
|
+
WHERE "id" = 'workbuddy'
|
|
27
|
+
ON CONFLICT ("id") DO NOTHING;
|
|
28
|
+
|
|
29
|
+
-- Drop rows the repoint would collide with on a unique index.
|
|
30
|
+
DELETE FROM "models"
|
|
31
|
+
WHERE "provider_id" = 'workbuddy'
|
|
32
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb')
|
|
33
|
+
AND EXISTS (
|
|
34
|
+
SELECT 1 FROM "models" AS keep
|
|
35
|
+
WHERE keep."provider_id" = 'cb'
|
|
36
|
+
AND keep."model_id" = "models"."model_id"
|
|
37
|
+
AND keep."endpoint_path" = "models"."endpoint_path"
|
|
38
|
+
);
|
|
39
|
+
DELETE FROM "tenant_disabled_models"
|
|
40
|
+
WHERE "provider_id" = 'workbuddy'
|
|
41
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb')
|
|
42
|
+
AND EXISTS (
|
|
43
|
+
SELECT 1 FROM "tenant_disabled_models" AS keep
|
|
44
|
+
WHERE keep."provider_id" = 'cb'
|
|
45
|
+
AND keep."tenant_id" = "tenant_disabled_models"."tenant_id"
|
|
46
|
+
AND keep."model_id" = "tenant_disabled_models"."model_id"
|
|
47
|
+
AND keep."endpoint_path" = "tenant_disabled_models"."endpoint_path"
|
|
48
|
+
);
|
|
49
|
+
DELETE FROM "provider_accounts"
|
|
50
|
+
WHERE "provider_id" = 'workbuddy'
|
|
51
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb')
|
|
52
|
+
AND EXISTS (
|
|
53
|
+
SELECT 1 FROM "provider_accounts" AS keep
|
|
54
|
+
WHERE keep."provider_id" = 'cb'
|
|
55
|
+
AND keep."tenant_id" IS NOT DISTINCT FROM "provider_accounts"."tenant_id"
|
|
56
|
+
AND keep."credential_fingerprint" IS NOT DISTINCT FROM "provider_accounts"."credential_fingerprint"
|
|
57
|
+
);
|
|
58
|
+
DELETE FROM "provider_routing_settings"
|
|
59
|
+
WHERE "provider_id" = 'workbuddy'
|
|
60
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb')
|
|
61
|
+
AND EXISTS (
|
|
62
|
+
SELECT 1 FROM "provider_routing_settings" AS keep
|
|
63
|
+
WHERE keep."provider_id" = 'cb'
|
|
64
|
+
AND keep."tenant_id" IS NOT DISTINCT FROM "provider_routing_settings"."tenant_id"
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
UPDATE "provider_accounts" SET "provider_id" = 'cb'
|
|
68
|
+
WHERE "provider_id" = 'workbuddy'
|
|
69
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb');
|
|
70
|
+
UPDATE "models" SET "provider_id" = 'cb'
|
|
71
|
+
WHERE "provider_id" = 'workbuddy'
|
|
72
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb');
|
|
73
|
+
UPDATE "tenant_disabled_models" SET "provider_id" = 'cb'
|
|
74
|
+
WHERE "provider_id" = 'workbuddy'
|
|
75
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb');
|
|
76
|
+
UPDATE "provider_routing_settings" SET "provider_id" = 'cb'
|
|
77
|
+
WHERE "provider_id" = 'workbuddy'
|
|
78
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb');
|
|
79
|
+
UPDATE "telemetry_events" SET "provider_id" = 'cb'
|
|
80
|
+
WHERE "provider_id" = 'workbuddy'
|
|
81
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb');
|
|
82
|
+
|
|
83
|
+
DELETE FROM "providers"
|
|
84
|
+
WHERE "id" = 'workbuddy'
|
|
85
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb');
|
|
86
|
+
|
|
87
|
+
-- ── workbuddycn -> cbcn ──────────────────────────────────────────────────────
|
|
88
|
+
|
|
89
|
+
INSERT INTO "providers" (
|
|
90
|
+
"id", "tenant_id", "wire_family_default", "capability_profile", "base_url",
|
|
91
|
+
"compatibility_profile", "enabled", "requires_account"
|
|
92
|
+
)
|
|
93
|
+
SELECT
|
|
94
|
+
'cbcn', "tenant_id", "wire_family_default", "capability_profile", "base_url",
|
|
95
|
+
"compatibility_profile", "enabled", "requires_account"
|
|
96
|
+
FROM "providers"
|
|
97
|
+
WHERE "id" = 'workbuddycn'
|
|
98
|
+
ON CONFLICT ("id") DO NOTHING;
|
|
99
|
+
|
|
100
|
+
-- Drop rows the repoint would collide with on a unique index.
|
|
101
|
+
DELETE FROM "models"
|
|
102
|
+
WHERE "provider_id" = 'workbuddycn'
|
|
103
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn')
|
|
104
|
+
AND EXISTS (
|
|
105
|
+
SELECT 1 FROM "models" AS keep
|
|
106
|
+
WHERE keep."provider_id" = 'cbcn'
|
|
107
|
+
AND keep."model_id" = "models"."model_id"
|
|
108
|
+
AND keep."endpoint_path" = "models"."endpoint_path"
|
|
109
|
+
);
|
|
110
|
+
DELETE FROM "tenant_disabled_models"
|
|
111
|
+
WHERE "provider_id" = 'workbuddycn'
|
|
112
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn')
|
|
113
|
+
AND EXISTS (
|
|
114
|
+
SELECT 1 FROM "tenant_disabled_models" AS keep
|
|
115
|
+
WHERE keep."provider_id" = 'cbcn'
|
|
116
|
+
AND keep."tenant_id" = "tenant_disabled_models"."tenant_id"
|
|
117
|
+
AND keep."model_id" = "tenant_disabled_models"."model_id"
|
|
118
|
+
AND keep."endpoint_path" = "tenant_disabled_models"."endpoint_path"
|
|
119
|
+
);
|
|
120
|
+
DELETE FROM "provider_accounts"
|
|
121
|
+
WHERE "provider_id" = 'workbuddycn'
|
|
122
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn')
|
|
123
|
+
AND EXISTS (
|
|
124
|
+
SELECT 1 FROM "provider_accounts" AS keep
|
|
125
|
+
WHERE keep."provider_id" = 'cbcn'
|
|
126
|
+
AND keep."tenant_id" IS NOT DISTINCT FROM "provider_accounts"."tenant_id"
|
|
127
|
+
AND keep."credential_fingerprint" IS NOT DISTINCT FROM "provider_accounts"."credential_fingerprint"
|
|
128
|
+
);
|
|
129
|
+
DELETE FROM "provider_routing_settings"
|
|
130
|
+
WHERE "provider_id" = 'workbuddycn'
|
|
131
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn')
|
|
132
|
+
AND EXISTS (
|
|
133
|
+
SELECT 1 FROM "provider_routing_settings" AS keep
|
|
134
|
+
WHERE keep."provider_id" = 'cbcn'
|
|
135
|
+
AND keep."tenant_id" IS NOT DISTINCT FROM "provider_routing_settings"."tenant_id"
|
|
136
|
+
);
|
|
137
|
+
|
|
138
|
+
UPDATE "provider_accounts" SET "provider_id" = 'cbcn'
|
|
139
|
+
WHERE "provider_id" = 'workbuddycn'
|
|
140
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn');
|
|
141
|
+
UPDATE "models" SET "provider_id" = 'cbcn'
|
|
142
|
+
WHERE "provider_id" = 'workbuddycn'
|
|
143
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn');
|
|
144
|
+
UPDATE "tenant_disabled_models" SET "provider_id" = 'cbcn'
|
|
145
|
+
WHERE "provider_id" = 'workbuddycn'
|
|
146
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn');
|
|
147
|
+
UPDATE "provider_routing_settings" SET "provider_id" = 'cbcn'
|
|
148
|
+
WHERE "provider_id" = 'workbuddycn'
|
|
149
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn');
|
|
150
|
+
UPDATE "telemetry_events" SET "provider_id" = 'cbcn'
|
|
151
|
+
WHERE "provider_id" = 'workbuddycn'
|
|
152
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn');
|
|
153
|
+
|
|
154
|
+
DELETE FROM "providers"
|
|
155
|
+
WHERE "id" = 'workbuddycn'
|
|
156
|
+
AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn');
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cartethyia",
|
|
3
|
-
"version": "2.7.
|
|
3
|
+
"version": "2.7.9",
|
|
4
4
|
"description": "A powerful, self-hosted reverse proxy for OpenAI- and Anthropic-compatible AI clients, powered by native Bun and Elysia. It serves both protocols from a single server, routes every model across any configured provider, and translates requests and responses in real time — streaming and prompt caching included. Underneath it runs a full delivery engine: per-account health tracking, quota and cooldown enforcement, automatic failover across pools and providers, usage accounting, and telemetry. Point OpenCode, Cline, Claude Code, Codex, or any compatible client at Cartethyia and it keeps its native protocol while the gateway absorbs every provider-specific difference behind it. Runs on embedded SQLite or external PostgreSQL with optional Redis coordination, ships as a global CLI with a system-tray console, and needs only Bun 1.4+ alongside Node.js/npm.",
|
|
5
5
|
"license": "GPL-3.0-only",
|
|
6
6
|
"type": "module",
|
package/src/boot/dependencies.ts
CHANGED
|
@@ -39,7 +39,7 @@ import { setPendingUsageSource } from "../security/api-key-auth";
|
|
|
39
39
|
import { HealthEventFlushBuffer, setHealthEventBuffer } from "../persistence/health-event-flush";
|
|
40
40
|
import { subscribePeerSettingsRevisions } from "../persistence/settings-revision";
|
|
41
41
|
import { deleteExpiredSessions } from "../console/auth/session-service";
|
|
42
|
-
import { InMemoryIpAbuseStore, IpAbuseProtectionService, RedisIpAbuseStore } from "../security/abuse";
|
|
42
|
+
import { InMemoryIpAbuseStore, IpAbuseProtectionService, RedisIpAbuseStore, type IpAbuseStore } from "../security/abuse";
|
|
43
43
|
import { checkReadiness } from "../persistence/readiness";
|
|
44
44
|
import { ProxyRequestPreparer } from "../transport/request/preparer";
|
|
45
45
|
import { DrizzleNetworkPoolLoader } from "../network/pool/loader";
|
|
@@ -104,6 +104,8 @@ export interface ProductionDeps {
|
|
|
104
104
|
proxyPreparer: ProxyRequestPreparer;
|
|
105
105
|
networkBindingFactory: ValidatedNetworkBindingFactory;
|
|
106
106
|
ipAbuseProtection: IpAbuseProtectionService;
|
|
107
|
+
/** The abuse store backing manual IP bans and the ban list. */
|
|
108
|
+
ipAbuseStore: IpAbuseStore;
|
|
107
109
|
readiness: () => Promise<ReadinessCheckResult>;
|
|
108
110
|
scheduledTasks: ScheduledTaskRegistry;
|
|
109
111
|
poolAgentResolver: PoolAgentResolver;
|
|
@@ -593,6 +595,11 @@ export async function buildProductionDeps(): Promise<ProductionDeps> {
|
|
|
593
595
|
name: "client-version-monitor",
|
|
594
596
|
intervalMs: CLIENT_VERSION_MONITOR_INTERVAL_MS,
|
|
595
597
|
initialDelayMs: CLIENT_VERSION_INITIAL_DELAY_MS,
|
|
598
|
+
// Pure outbound reads with no shared rows/files: they must not be gated
|
|
599
|
+
// by the process-wide busy latch, or a nearly-continuous heavy sweep
|
|
600
|
+
// (quota-refresh) starves this monitor at its single initial tick and
|
|
601
|
+
// every 30-minute interval after it.
|
|
602
|
+
skipGate: true,
|
|
596
603
|
run: refreshProviderClientVersions,
|
|
597
604
|
});
|
|
598
605
|
|
|
@@ -606,13 +613,13 @@ export async function buildProductionDeps(): Promise<ProductionDeps> {
|
|
|
606
613
|
// first open after an expiry always blocks on the provider.
|
|
607
614
|
//
|
|
608
615
|
// It also carries the daily check-in ride-along: each account refreshed
|
|
609
|
-
// here gets its once-per-day
|
|
616
|
+
// here gets its once-per-day CodeBuddy credit grant claimed in
|
|
610
617
|
// the same pass (one attempt per account per day, guarded by a day
|
|
611
618
|
// marker), so no second timer duplicates the credential resolution.
|
|
612
619
|
//
|
|
613
620
|
// Registered in **every** mode, not only when Redis is present: gating it on
|
|
614
621
|
// Redis would cost Lite proactive quota warming and the check-in ride-along
|
|
615
|
-
// above that claims the once-per-day
|
|
622
|
+
// above that claims the once-per-day CodeBuddy credit grant. The
|
|
616
623
|
// whole sweep chain accepts `RedisClient | undefined` and falls back to the
|
|
617
624
|
// in-process TTL cache and an in-process day marker, so Redis is an
|
|
618
625
|
// optimization here rather than a precondition — which is exactly what
|
|
@@ -739,6 +746,7 @@ export async function buildProductionDeps(): Promise<ProductionDeps> {
|
|
|
739
746
|
}),
|
|
740
747
|
networkBindingFactory,
|
|
741
748
|
ipAbuseProtection,
|
|
749
|
+
ipAbuseStore: ipStore,
|
|
742
750
|
readiness,
|
|
743
751
|
scheduledTasks,
|
|
744
752
|
poolAgentResolver,
|
package/src/config/cooldowns.ts
CHANGED
|
@@ -119,7 +119,7 @@ export function resolveAccountAuthRejectedCooldownMs(): number {
|
|
|
119
119
|
* Deliberately a *base*, not the 24h flat penalty it replaced. `11140` has two
|
|
120
120
|
* documented causes our classifier cannot separate from the response alone: the
|
|
121
121
|
* user's prompt failed a safety review, **and** sending the wrong desktop
|
|
122
|
-
* `User-Agent` brand (`
|
|
122
|
+
* `User-Agent` brand (`codebuddy/shared.ts`). A flat 24h meant that after we
|
|
123
123
|
* fixed a header regression every buddy account stayed dead for up to a further
|
|
124
124
|
* day, and one unsafe prompt cost a whole account a day.
|
|
125
125
|
*
|
package/src/config/spec.ts
CHANGED
|
@@ -173,12 +173,6 @@ export const CONFIG_SPEC = {
|
|
|
173
173
|
*/
|
|
174
174
|
CARTETHYIA_DISABLED_TASKS: { kind: "list" },
|
|
175
175
|
|
|
176
|
-
/**
|
|
177
|
-
* Force the Qoder UMID bridge to the mini-ELF bundle on Linux
|
|
178
|
-
* (`1` = always mini, `0` = never mini; absent = auto-detect containers).
|
|
179
|
-
*/
|
|
180
|
-
CARTETHYIA_QODER_UMID_MINI: { kind: "int", default: 0, min: 0, max: 1 },
|
|
181
|
-
|
|
182
176
|
/**
|
|
183
177
|
* How long a day's telemetry is kept, in days.
|
|
184
178
|
*
|
|
@@ -80,18 +80,24 @@ function parseSharedChildrenQuery(query: URLSearchParams): SharedChildrenPageOpt
|
|
|
80
80
|
|
|
81
81
|
export function createApiKeyOperations(config: ApiKeyConfig) {
|
|
82
82
|
const operations = {
|
|
83
|
-
async listKeys(access: AccessDecision | undefined): Promise<ApiKeyResponse[]> {
|
|
83
|
+
async listKeys(access: AccessDecision | undefined, includeChildren = false): Promise<ApiKeyResponse[]> {
|
|
84
84
|
const authorized = requireTenantScope(access, "dashboard:read");
|
|
85
85
|
const records = await config.store.list(authorized.tenantId);
|
|
86
86
|
const topLevel = records.filter(
|
|
87
87
|
(record) => record.revokedAt === undefined && record.parentKeyId === undefined,
|
|
88
88
|
);
|
|
89
|
+
// Share children are omitted from the main key list (they belong to a
|
|
90
|
+
// template), but the Banned Users search wants them so a child can be
|
|
91
|
+
// found and banned by hand.
|
|
92
|
+
const visible = includeChildren
|
|
93
|
+
? records.filter((record) => record.revokedAt === undefined)
|
|
94
|
+
: topLevel;
|
|
89
95
|
// A share template's own counter is the live family accumulator now:
|
|
90
96
|
// every recipient commit adds to it (see ApiKeyAdmissionService
|
|
91
97
|
// commitUsage), so reporting it raw gives the enforced family total.
|
|
92
98
|
// No telemetry add-on is needed, and adding it here would double-count.
|
|
93
99
|
return Promise.all(
|
|
94
|
-
|
|
100
|
+
visible.map(async (record) => {
|
|
95
101
|
const response = sanitizeApiKeyResponse(record);
|
|
96
102
|
if (record.keyMode !== "share") return response;
|
|
97
103
|
return response;
|
|
@@ -921,9 +927,10 @@ function jsonNull(): Response {
|
|
|
921
927
|
export function createApiKeyRoutes(config: ApiKeyConfig): AnyElysia {
|
|
922
928
|
const factory = createApiKeyOperations(config);
|
|
923
929
|
return new Elysia({ prefix: "/api-keys" })
|
|
924
|
-
.get("/", async ({ request, set }) => {
|
|
930
|
+
.get("/", async ({ request, set, query }) => {
|
|
925
931
|
try {
|
|
926
|
-
|
|
932
|
+
const includeChildren = query?.["includeChildren"] === "1" || query?.["includeChildren"] === "true";
|
|
933
|
+
return await factory.listKeys(config.accessResolver(request), includeChildren);
|
|
927
934
|
} catch (error) {
|
|
928
935
|
return errorResponse(error, set, "API-key operation failed");
|
|
929
936
|
}
|