cartethyia 2.5.2 → 2.5.4
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/dist/dashboard/assets/{BannedPage-MsQaeQTs.js → BannedPage-C2orBsI2.js} +1 -1
- package/dist/dashboard/assets/BannedPage-C2orBsI2.js.gz +0 -0
- package/dist/dashboard/assets/CliToolDetailPage-DUcZ6pMB.js +1 -0
- package/dist/dashboard/assets/CliToolDetailPage-DUcZ6pMB.js.gz +0 -0
- package/dist/dashboard/assets/{CliToolsPage-DfWHTJ7v.js → CliToolsPage-BV6pxVQo.js} +1 -1
- package/dist/dashboard/assets/CliToolsPage-BV6pxVQo.js.gz +0 -0
- package/dist/dashboard/assets/{CombosPage-BrCBQDAc.js → CombosPage-Bsan4679.js} +1 -1
- package/dist/dashboard/assets/CombosPage-Bsan4679.js.gz +0 -0
- package/dist/dashboard/assets/{ConsoleLogPage-C6Uh33er.js → ConsoleLogPage-CW-wPmJ6.js} +1 -1
- package/dist/dashboard/assets/ConsoleLogPage-CW-wPmJ6.js.gz +0 -0
- package/dist/dashboard/assets/{CustomizationPage-8aS9hyJu.js → CustomizationPage-0p8uX7vB.js} +1 -1
- package/dist/dashboard/assets/CustomizationPage-0p8uX7vB.js.gz +0 -0
- package/dist/dashboard/assets/HealthEventsModal-BjqSMfko.js +1 -0
- package/dist/dashboard/assets/HealthEventsModal-BjqSMfko.js.gz +0 -0
- package/dist/dashboard/assets/{LoginPage-C8hKyXBe.js → LoginPage-BvzCx8Kr.js} +1 -1
- package/dist/dashboard/assets/LoginPage-BvzCx8Kr.js.gz +0 -0
- package/dist/dashboard/assets/{ModelPicker-CWkTUtpX.js → ModelPicker-BY1aKEkP.js} +1 -1
- package/dist/dashboard/assets/ModelPicker-BY1aKEkP.js.gz +0 -0
- package/dist/dashboard/assets/OverviewPage-DOQpy1y0.js +1 -0
- package/dist/dashboard/assets/OverviewPage-DOQpy1y0.js.gz +0 -0
- package/dist/dashboard/assets/ProviderDetailPage-ecxyUMzt.js +3 -0
- package/dist/dashboard/assets/ProviderDetailPage-ecxyUMzt.js.gz +0 -0
- package/dist/dashboard/assets/ProvidersPage-Js9jUPSb.js +1 -0
- package/dist/dashboard/assets/ProvidersPage-Js9jUPSb.js.gz +0 -0
- package/dist/dashboard/assets/ProxyPage-J3TBi3Kx.js +7 -0
- package/dist/dashboard/assets/ProxyPage-J3TBi3Kx.js.gz +0 -0
- package/dist/dashboard/assets/QuotaPage-C1gZS6xr.js +1 -0
- package/dist/dashboard/assets/QuotaPage-C1gZS6xr.js.gz +0 -0
- package/dist/dashboard/assets/SettingsPage-CS86ho5X.js +1 -0
- package/dist/dashboard/assets/SettingsPage-CS86ho5X.js.gz +0 -0
- package/dist/dashboard/assets/{SetupPage-CXjUlfqr.js → SetupPage-DDbMQsoo.js} +1 -1
- package/dist/dashboard/assets/SetupPage-DDbMQsoo.js.gz +0 -0
- package/dist/dashboard/assets/{SortableList-C-_oD3F2.js → SortableList-CB3Z7VTf.js} +1 -1
- package/dist/dashboard/assets/SortableList-CB3Z7VTf.js.gz +0 -0
- package/dist/dashboard/assets/{StudioPage-u9IxmYOI.js → StudioPage-D95UCPHI.js} +3 -3
- package/dist/dashboard/assets/StudioPage-D95UCPHI.js.gz +0 -0
- package/dist/dashboard/assets/{UsagePage-BEVLVrwP.js → UsagePage-Cnae9SWA.js} +13 -13
- package/dist/dashboard/assets/UsagePage-Cnae9SWA.js.gz +0 -0
- package/dist/dashboard/assets/{api-keys-uNywYlfv.js → api-keys-VY68Mhd1.js} +1 -1
- package/dist/dashboard/assets/api-keys-VY68Mhd1.js.gz +0 -0
- package/dist/dashboard/assets/app-COlK95oi.css +2 -0
- package/dist/dashboard/assets/app-COlK95oi.css.gz +0 -0
- package/dist/dashboard/assets/{assert-NHwYq95t.js → assert-Chi7pCnt.js} +1 -1
- package/dist/dashboard/assets/assert-Chi7pCnt.js.gz +0 -0
- package/dist/dashboard/assets/{badge-6uzDDvqs.js → badge-D4pQapKj.js} +1 -1
- package/dist/dashboard/assets/badge-D4pQapKj.js.gz +0 -0
- package/dist/dashboard/assets/{banner-4_WNg2WZ.js → banner-DH6cg-_B.js} +1 -1
- package/dist/dashboard/assets/banner-DH6cg-_B.js.gz +0 -0
- package/dist/dashboard/assets/{card--AtFedAq.js → card-BKqlUOe4.js} +1 -1
- package/dist/dashboard/assets/card-BKqlUOe4.js.gz +0 -0
- package/dist/dashboard/assets/{cli-tools-B3e7dx3N.js → cli-tools-fTgljTGA.js} +1 -1
- package/dist/dashboard/assets/cli-tools-fTgljTGA.js.gz +0 -0
- package/dist/dashboard/assets/{clipboard-button-NreUx6c8.js → clipboard-button-D5Ys_sM0.js} +1 -1
- package/dist/dashboard/assets/clipboard-button-D5Ys_sM0.js.gz +0 -0
- package/dist/dashboard/assets/database-Dz9N3zGd.js +1 -0
- package/dist/dashboard/assets/database-Dz9N3zGd.js.gz +0 -0
- package/dist/dashboard/assets/{dialog-BtpsJU98.js → dialog-BYj-8WuK.js} +1 -1
- package/dist/dashboard/assets/dialog-BYj-8WuK.js.gz +0 -0
- package/dist/dashboard/assets/{drawer-WwwtzihF.js → drawer-CmXIZ6H1.js} +1 -1
- package/dist/dashboard/assets/drawer-CmXIZ6H1.js.gz +0 -0
- package/dist/dashboard/assets/entry-CBg5zeu8.js +1 -0
- package/dist/dashboard/assets/entry-CBg5zeu8.js.gz +0 -0
- package/dist/dashboard/assets/entry-CQBr6U9c.js +1 -0
- package/dist/dashboard/assets/entry-CQBr6U9c.js.gz +0 -0
- package/dist/dashboard/assets/entry-CgdSAzEV.js +4 -0
- package/dist/dashboard/assets/entry-CgdSAzEV.js.gz +0 -0
- package/dist/dashboard/assets/{github-badge-D_eM3IgG.js → github-badge-BlptL8Uf.js} +1 -1
- package/dist/dashboard/assets/github-badge-BlptL8Uf.js.gz +0 -0
- package/dist/dashboard/assets/{index-DCBtROoK.js → index-js6TJvdr.js} +2 -2
- package/dist/dashboard/assets/index-js6TJvdr.js.gz +0 -0
- package/dist/dashboard/assets/{inline-BcNGF8Gr.js → inline-DUWDSmDV.js} +1 -1
- package/dist/dashboard/assets/inline-DUWDSmDV.js.gz +0 -0
- package/dist/dashboard/assets/{input-BG41et9G.js → input-LVjgZq4f.js} +1 -1
- package/dist/dashboard/assets/input-LVjgZq4f.js.gz +0 -0
- package/dist/dashboard/assets/{layout-C8mer_Ak.js → layout-CPfxpsfy.js} +1 -1
- package/dist/dashboard/assets/layout-CPfxpsfy.js.gz +0 -0
- package/dist/dashboard/assets/{list-row-Gh_W4OR_.js → list-row-DupvLfDx.js} +1 -1
- package/dist/dashboard/assets/list-row-DupvLfDx.js.gz +0 -0
- package/dist/dashboard/assets/{live-BJGYRBnR.js → live-C4pEJUqI.js} +1 -1
- package/dist/dashboard/assets/live-C4pEJUqI.js.gz +0 -0
- package/dist/dashboard/assets/model-bans-BRiuufkB.js +1 -0
- package/dist/dashboard/assets/model-bans-BRiuufkB.js.gz +0 -0
- package/dist/dashboard/assets/{mutation-BkoLM5Ba.js → mutation-B4ROwk8L.js} +1 -1
- package/dist/dashboard/assets/mutation-B4ROwk8L.js.gz +0 -0
- package/dist/dashboard/assets/numbers-YNcHvRY7.js +2 -0
- package/dist/dashboard/assets/numbers-YNcHvRY7.js.gz +0 -0
- package/dist/dashboard/assets/{query-keys-D7wX2vM5.js → query-keys-gmjzC3RS.js} +1 -1
- package/dist/dashboard/assets/{query-keys-D7wX2vM5.js.gz → query-keys-gmjzC3RS.js.gz} +0 -0
- package/dist/dashboard/assets/{routing-CcusqXA7.js → routing-C7tBT5o-.js} +1 -1
- package/dist/dashboard/assets/routing-C7tBT5o-.js.gz +0 -0
- package/dist/dashboard/assets/{select-DsX5QT8K.js → select-WUCXorXw.js} +2 -2
- package/dist/dashboard/assets/select-WUCXorXw.js.gz +0 -0
- package/dist/dashboard/assets/{settings-mpmXTgUa.js → settings-C_zKl1GS.js} +1 -1
- package/dist/dashboard/assets/settings-C_zKl1GS.js.gz +0 -0
- package/dist/dashboard/assets/{stack-DwLmjUFK.js → stack-_3O0F8Xn.js} +1 -1
- package/dist/dashboard/assets/stack-_3O0F8Xn.js.gz +0 -0
- package/dist/dashboard/assets/{state-DYdQmdAl.js → state-BgTxHcJS.js} +1 -1
- package/dist/dashboard/assets/state-BgTxHcJS.js.gz +0 -0
- package/dist/dashboard/assets/switch-DEjTtOWf.js +1 -0
- package/dist/dashboard/assets/switch-DEjTtOWf.js.gz +0 -0
- package/dist/dashboard/assets/terminal-0_IjPWTk.js +1 -0
- package/dist/dashboard/assets/terminal-0_IjPWTk.js.gz +0 -0
- package/dist/dashboard/assets/{useMutation-w4u4CVue.js → useMutation-BWSC0UAS.js} +1 -1
- package/dist/dashboard/assets/useMutation-BWSC0UAS.js.gz +0 -0
- package/dist/dashboard/assets/zap-C4EeVW4q.js +1 -0
- package/dist/dashboard/assets/zap-C4EeVW4q.js.gz +0 -0
- package/dist/dashboard/donation/qris-risun-marke.png +0 -0
- package/dist/dashboard/index.html +1 -1
- package/dist/dashboard/index.html.gz +0 -0
- package/dist/dashboard/precompressed-assets.json +54 -54
- package/package.json +1 -1
- package/scripts/cli/autostart.ts +237 -0
- package/scripts/cli/command/console-menu.ts +244 -246
- package/scripts/cli/command/tray.ts +208 -204
- package/scripts/cli/command/update.ts +27 -10
- package/scripts/cli/main.ts +28 -1
- package/src/boot/app.ts +693 -693
- package/src/boot/dependencies.ts +646 -616
- package/src/config/spec.ts +81 -2
- package/src/config/telemetry.ts +46 -0
- package/src/console/api-keys/bucket-spend.ts +15 -4
- package/src/console/backup/contracts.ts +15 -2
- package/src/console/backup/routes.ts +52 -1
- package/src/console/backup/service.ts +60 -4
- package/src/console/console-router.ts +8 -0
- package/src/console/data-management/contracts.ts +93 -0
- package/src/console/data-management/operations.ts +229 -0
- package/src/console/data-management/routes.ts +104 -0
- package/src/console/domain-registration.ts +39 -0
- package/src/console/observability/contracts.ts +524 -485
- package/src/console/observability/store.ts +1115 -1018
- package/src/console/providers/catalog/contracts.ts +6 -0
- package/src/console/providers/catalog/provider-operations.ts +20 -0
- package/src/console/providers/catalog/routes.ts +7 -0
- package/src/console/providers/catalog/store.ts +22 -1
- package/src/console/quota/account-quota-shared.ts +52 -39
- package/src/console/quota/refresh.ts +441 -429
- package/src/console/routing/pools/import-parse.ts +206 -0
- package/src/console/routing/pools/operations.ts +543 -501
- package/src/console/routing/pools/routes.ts +181 -164
- package/src/console/settings/contracts.ts +37 -0
- package/src/console/settings/store.ts +51 -0
- package/src/console/share/share-router.ts +6 -9
- package/src/console/updates/routes.ts +16 -0
- package/src/main.ts +10 -0
- package/src/observability/event-compaction.ts +315 -0
- package/src/observability/event-day-index.ts +442 -0
- package/src/observability/event-log.ts +152 -3
- package/src/observability/payload-capture.ts +373 -344
- package/src/observability/payload-store.ts +440 -366
- package/src/observability/telemetry-status.ts +28 -16
- package/src/persistence/health-event-flush.ts +36 -0
- package/src/persistence/schema.ts +1402 -1360
- package/src/persistence/stores/api-key-store.ts +6 -0
- package/src/persistence/stores/share-store.ts +583 -556
- package/src/persistence/stores/telemetry-store.ts +237 -214
- package/src/protocol/codecs.ts +1 -2
- package/src/protocol/image-clamp.ts +19 -1
- package/src/protocol/registry.ts +8 -0
- package/src/protocol/request/gemini.ts +9 -2
- package/src/protocol/request/messages.ts +14 -2
- package/src/protocol/response/gemini.ts +18 -4
- package/src/providers/adapters/compatible-adapter.ts +3 -0
- package/src/providers/bundled-discovery-providers.ts +122 -119
- package/src/providers/configured-openai-providers.ts +136 -134
- package/src/providers/default-registry.ts +5 -4
- package/src/providers/discovery/openai-model-discovery.ts +5 -0
- package/src/providers/discovery/openrouter-free-roster.ts +15 -17
- package/src/providers/integrations/antigravity/antigravity-quota.ts +11 -3
- package/src/providers/integrations/buddy/buddy-catalog-shared.ts +4 -4
- package/src/providers/integrations/buddy/workbuddy/shared.ts +201 -200
- package/src/providers/integrations/cline/cline-quota.ts +132 -128
- package/src/providers/integrations/codex/codex-headers.ts +25 -39
- package/src/providers/integrations/codex/codex.ts +2 -29
- package/src/providers/integrations/cursor/cursor-quota.ts +310 -0
- package/src/providers/integrations/cursor/cursor-request.ts +616 -471
- package/src/providers/integrations/cursor/cursor-session-manager.ts +319 -281
- package/src/providers/integrations/cursor/cursor.ts +1485 -960
- package/src/providers/integrations/cursor/protocol/messages.ts +25 -0
- package/src/providers/integrations/factory/factory.ts +8 -1
- package/src/providers/integrations/gemini.ts +6 -1
- package/src/providers/integrations/grok/grok-quota.ts +279 -177
- package/src/providers/integrations/grok/grok-ratelimit-store.ts +73 -0
- package/src/providers/integrations/grok/grok-ratelimit.ts +218 -0
- package/src/providers/integrations/opencode/provider.ts +531 -532
- package/src/providers/integrations/qoder/qoder-quota.ts +192 -0
- package/src/providers/integrations/tokenharbor.ts +2 -2
- package/src/providers/integrations/trae/trae-catalog.ts +5 -3
- package/src/providers/integrations/trae/trae-quota.ts +384 -0
- package/src/providers/operations/account-health-service.ts +1523 -1457
- package/src/providers/operations/client-versions.ts +9 -2
- package/src/providers/provider-contracts.ts +7 -0
- package/src/providers/provider-metadata.ts +13 -1
- package/src/providers/quota/quota-support.ts +8 -0
- package/src/security/api-key-auth.ts +504 -494
- package/src/transport/dispatch/attempt-finalize.ts +46 -5
- package/src/transport/dispatch/generation.ts +6 -0
- package/src/transport/dispatch/proxy-request.ts +33 -1
- package/src/transport/dispatch/ratelimit-capture.ts +37 -0
- package/src/transport/dispatch/streaming/stream.ts +30 -2
- package/src/transport/dispatch/upstream.ts +9 -0
- package/src/transport/request/preparer.ts +7 -6
- package/src/transport/request/state.ts +9 -0
- package/src/transport/request/tenant-preferences.ts +60 -0
- package/src/transport/routing/route-catalog.ts +854 -799
- package/dist/dashboard/assets/BannedPage-MsQaeQTs.js.gz +0 -0
- package/dist/dashboard/assets/CliToolDetailPage-BO9nKg9w.js +0 -1
- package/dist/dashboard/assets/CliToolDetailPage-BO9nKg9w.js.gz +0 -0
- package/dist/dashboard/assets/CliToolsPage-DfWHTJ7v.js.gz +0 -0
- package/dist/dashboard/assets/CombosPage-BrCBQDAc.js.gz +0 -0
- package/dist/dashboard/assets/ConsoleLogPage-C6Uh33er.js.gz +0 -0
- package/dist/dashboard/assets/CustomizationPage-8aS9hyJu.js.gz +0 -0
- package/dist/dashboard/assets/HealthEventsModal-qomXThxX.js +0 -1
- package/dist/dashboard/assets/HealthEventsModal-qomXThxX.js.gz +0 -0
- package/dist/dashboard/assets/LoginPage-C8hKyXBe.js.gz +0 -0
- package/dist/dashboard/assets/ModelPicker-CWkTUtpX.js.gz +0 -0
- package/dist/dashboard/assets/OverviewPage-C-ExCy1V.js +0 -1
- package/dist/dashboard/assets/OverviewPage-C-ExCy1V.js.gz +0 -0
- package/dist/dashboard/assets/ProviderDetailPage-tr811uaF.js +0 -3
- package/dist/dashboard/assets/ProviderDetailPage-tr811uaF.js.gz +0 -0
- package/dist/dashboard/assets/ProvidersPage-BS9IEpvv.js +0 -1
- package/dist/dashboard/assets/ProvidersPage-BS9IEpvv.js.gz +0 -0
- package/dist/dashboard/assets/ProxyPage-Rn_qXScb.js +0 -7
- package/dist/dashboard/assets/ProxyPage-Rn_qXScb.js.gz +0 -0
- package/dist/dashboard/assets/QuotaPage-BihkgQSq.js +0 -1
- package/dist/dashboard/assets/QuotaPage-BihkgQSq.js.gz +0 -0
- package/dist/dashboard/assets/SettingsPage-DhiEjm6T.js +0 -1
- package/dist/dashboard/assets/SettingsPage-DhiEjm6T.js.gz +0 -0
- package/dist/dashboard/assets/SetupPage-CXjUlfqr.js.gz +0 -0
- package/dist/dashboard/assets/SortableList-C-_oD3F2.js.gz +0 -0
- package/dist/dashboard/assets/StudioPage-u9IxmYOI.js.gz +0 -0
- package/dist/dashboard/assets/UsagePage-BEVLVrwP.js.gz +0 -0
- package/dist/dashboard/assets/api-keys-uNywYlfv.js.gz +0 -0
- package/dist/dashboard/assets/app-DxivpfYG.css +0 -2
- package/dist/dashboard/assets/app-DxivpfYG.css.gz +0 -0
- package/dist/dashboard/assets/assert-NHwYq95t.js.gz +0 -0
- package/dist/dashboard/assets/badge-6uzDDvqs.js.gz +0 -0
- package/dist/dashboard/assets/banner-4_WNg2WZ.js.gz +0 -0
- package/dist/dashboard/assets/card--AtFedAq.js.gz +0 -0
- package/dist/dashboard/assets/cli-tools-B3e7dx3N.js.gz +0 -0
- package/dist/dashboard/assets/clipboard-button-NreUx6c8.js.gz +0 -0
- package/dist/dashboard/assets/dialog-BtpsJU98.js.gz +0 -0
- package/dist/dashboard/assets/download-A0SW9OCW.js +0 -1
- package/dist/dashboard/assets/download-A0SW9OCW.js.gz +0 -0
- package/dist/dashboard/assets/drawer-WwwtzihF.js.gz +0 -0
- package/dist/dashboard/assets/entry-Dj9AR0gY.js +0 -4
- package/dist/dashboard/assets/entry-Dj9AR0gY.js.gz +0 -0
- package/dist/dashboard/assets/entry-TJIye_jT.js +0 -1
- package/dist/dashboard/assets/entry-TJIye_jT.js.gz +0 -0
- package/dist/dashboard/assets/entry-jy9_4-Ke.js +0 -1
- package/dist/dashboard/assets/entry-jy9_4-Ke.js.gz +0 -0
- package/dist/dashboard/assets/github-badge-D_eM3IgG.js.gz +0 -0
- package/dist/dashboard/assets/index-DCBtROoK.js.gz +0 -0
- package/dist/dashboard/assets/inline-BcNGF8Gr.js.gz +0 -0
- package/dist/dashboard/assets/input-BG41et9G.js.gz +0 -0
- package/dist/dashboard/assets/layout-C8mer_Ak.js.gz +0 -0
- package/dist/dashboard/assets/list-row-Gh_W4OR_.js.gz +0 -0
- package/dist/dashboard/assets/live-BJGYRBnR.js.gz +0 -0
- package/dist/dashboard/assets/model-bans-DeVLDA7I.js +0 -1
- package/dist/dashboard/assets/model-bans-DeVLDA7I.js.gz +0 -0
- package/dist/dashboard/assets/mutation-BkoLM5Ba.js.gz +0 -0
- package/dist/dashboard/assets/numbers-Bs4LOOuf.js +0 -2
- package/dist/dashboard/assets/numbers-Bs4LOOuf.js.gz +0 -0
- package/dist/dashboard/assets/routing-CcusqXA7.js.gz +0 -0
- package/dist/dashboard/assets/select-DsX5QT8K.js.gz +0 -0
- package/dist/dashboard/assets/settings-mpmXTgUa.js.gz +0 -0
- package/dist/dashboard/assets/sparkles-BRaRUxAU.js +0 -1
- package/dist/dashboard/assets/sparkles-BRaRUxAU.js.gz +0 -0
- package/dist/dashboard/assets/stack-DwLmjUFK.js.gz +0 -0
- package/dist/dashboard/assets/state-DYdQmdAl.js.gz +0 -0
- package/dist/dashboard/assets/switch-CidSfbG7.js +0 -1
- package/dist/dashboard/assets/switch-CidSfbG7.js.gz +0 -0
- package/dist/dashboard/assets/terminal-Bd4ee8TA.js +0 -1
- package/dist/dashboard/assets/terminal-Bd4ee8TA.js.gz +0 -0
- package/dist/dashboard/assets/useMutation-w4u4CVue.js.gz +0 -0
- /package/dist/dashboard/assets/{app-CafWtVXA.js → app-DCQZRmHY.js} +0 -0
- /package/dist/dashboard/assets/{app-CafWtVXA.js.gz → app-DCQZRmHY.js.gz} +0 -0
|
@@ -792,6 +792,12 @@ export interface ProviderCatalogStore {
|
|
|
792
792
|
providerId: string,
|
|
793
793
|
accountId: string,
|
|
794
794
|
): Promise<readonly AccountHealthEventRecord[]>;
|
|
795
|
+
/** Deletes this account's stored health & error rows; returns the count. */
|
|
796
|
+
purgeAccountHealthEvents(
|
|
797
|
+
tenantId: string,
|
|
798
|
+
providerId: string,
|
|
799
|
+
accountId: string,
|
|
800
|
+
): Promise<number>;
|
|
795
801
|
listBuddyGrowthTasks(
|
|
796
802
|
tenantId: string,
|
|
797
803
|
providerId: string,
|
|
@@ -23,6 +23,7 @@ import { getProviderClientVersion, getRouteIdentityVersions } from "../../../pro
|
|
|
23
23
|
import type { OAuthLoginField } from "../../../providers/authentication/oauth-flow-store";
|
|
24
24
|
import { providerCredentialHint, providerCredentialUrl, providerDisplayName, providerHasAdapterUserAgent, providerOperatorNotice, providerServiceKinds, type CompatibilityProfile } from "../../../providers/provider-metadata";
|
|
25
25
|
import type { AccountHealthEventRecord } from "../../../providers/operations/account-health-service";
|
|
26
|
+
import { healthEventBuffer } from "../../../persistence/health-event-flush";
|
|
26
27
|
import { CREDENTIAL_MODES, PROVIDER_READ_SCOPES, PROVIDER_WRITE_SCOPES, type BuddyGrowthTaskLedgerEntry } from "./contracts";
|
|
27
28
|
import { enqueueCheckin } from "../../../workers/daily-checkin";
|
|
28
29
|
import {
|
|
@@ -569,6 +570,25 @@ export function createProviderCatalogOperations(config: ProviderCatalogConfig) {
|
|
|
569
570
|
const a = requireTenantAnyScope(access, PROVIDER_READ_SCOPES);
|
|
570
571
|
return config.store.listAccountHealthEvents(a.tenantId, providerId, accountId);
|
|
571
572
|
},
|
|
573
|
+
async purgeAccountHealthEvents(
|
|
574
|
+
access: AccessDecision | undefined,
|
|
575
|
+
providerId: string,
|
|
576
|
+
accountId: string,
|
|
577
|
+
): Promise<{ deleted: number }> {
|
|
578
|
+
const a = requireTenantAnyScope(access, PROVIDER_WRITE_SCOPES);
|
|
579
|
+
// Barrier before the delete: buffered rows for this account must not
|
|
580
|
+
// land after the purge counted them gone, or the modal refetch shows
|
|
581
|
+
// ghost history the operator just purged.
|
|
582
|
+
await healthEventBuffer()?.drain(accountId);
|
|
583
|
+
const deleted = await config.store.purgeAccountHealthEvents(a.tenantId, providerId, accountId);
|
|
584
|
+
await config.auditSink?.record({
|
|
585
|
+
access: a,
|
|
586
|
+
action: "provider_account.health_events_purged",
|
|
587
|
+
target: accountId,
|
|
588
|
+
detail: { providerId, deleted },
|
|
589
|
+
});
|
|
590
|
+
return { deleted };
|
|
591
|
+
},
|
|
572
592
|
async listBuddyGrowthTasks(
|
|
573
593
|
access: AccessDecision | undefined,
|
|
574
594
|
providerId: string,
|
|
@@ -346,6 +346,13 @@ export function createProviderCatalogRoutes(config: ProviderCatalogConfig): Elys
|
|
|
346
346
|
params.accountId,
|
|
347
347
|
);
|
|
348
348
|
})
|
|
349
|
+
.delete("/:providerId/accounts/:accountId/health-events", async ({ request, params }) => {
|
|
350
|
+
return await factory.purgeAccountHealthEvents(
|
|
351
|
+
config.accessResolver(request),
|
|
352
|
+
params.providerId,
|
|
353
|
+
params.accountId,
|
|
354
|
+
);
|
|
355
|
+
})
|
|
349
356
|
.get("/:providerId/accounts/:accountId/growth-tasks", async ({ request, params }) => {
|
|
350
357
|
const dayKey = buddyDayKey();
|
|
351
358
|
return await factory.listBuddyGrowthTasks(
|
|
@@ -13,7 +13,7 @@ import { buddyTaskLedger, models, providerAccounts, providerOauthStates, provide
|
|
|
13
13
|
import { queryTelemetryEvents } from "../../../observability/event-log";
|
|
14
14
|
import { isGatewayError } from "../../../observability/telemetry-status";
|
|
15
15
|
import type { WireFamily } from "../../../protocol/canonical-model";
|
|
16
|
-
import { listAccountHealthEvents, recoverAccount, type AccountHealthEventRecord } from "../../../providers/operations/account-health-service";
|
|
16
|
+
import { listAccountHealthEvents, recoverAccount, deleteAccountHealthEvents, type AccountHealthEventRecord } from "../../../providers/operations/account-health-service";
|
|
17
17
|
import { invalidateCredentialCache } from "../../../providers/operations/provider-credential-service";
|
|
18
18
|
import { encryptCredential, hashSecret } from "../../../security/crypto";
|
|
19
19
|
import type { TelemetryBatchBuffer } from "../../../observability/telemetry-buffer";
|
|
@@ -1467,6 +1467,27 @@ export class DrizzleProviderCatalogStore implements ProviderCatalogStore {
|
|
|
1467
1467
|
if (owned.length === 0) return [];
|
|
1468
1468
|
return listAccountHealthEvents(this.db, accountId);
|
|
1469
1469
|
}
|
|
1470
|
+
|
|
1471
|
+
/** Deletes one account's stored health & error rows, for the modal's purge. */
|
|
1472
|
+
async purgeAccountHealthEvents(
|
|
1473
|
+
tenantId: string,
|
|
1474
|
+
providerId: string,
|
|
1475
|
+
accountId: string,
|
|
1476
|
+
): Promise<number> {
|
|
1477
|
+
const owned = await this.db
|
|
1478
|
+
.select({ id: providerAccounts.id })
|
|
1479
|
+
.from(providerAccounts)
|
|
1480
|
+
.where(
|
|
1481
|
+
and(
|
|
1482
|
+
eq(providerAccounts.id, accountId),
|
|
1483
|
+
eq(providerAccounts.providerId, providerId),
|
|
1484
|
+
globalOrOwnedBy(providerAccounts.tenantId, tenantId),
|
|
1485
|
+
),
|
|
1486
|
+
)
|
|
1487
|
+
.limit(1);
|
|
1488
|
+
if (owned.length === 0) return 0;
|
|
1489
|
+
return deleteAccountHealthEvents(this.db, accountId);
|
|
1490
|
+
}
|
|
1470
1491
|
async listBuddyGrowthTasks(
|
|
1471
1492
|
tenantId: string,
|
|
1472
1493
|
providerId: string,
|
|
@@ -1,39 +1,52 @@
|
|
|
1
|
-
import type { ConsoleAccessResolver } from "../auth/access";
|
|
2
|
-
import type { AuditRecorder } from "../auth/audit-recorder";
|
|
3
|
-
import { markClineApiKeyCredential } from "../../providers/integrations/cline/cline-quota";
|
|
4
|
-
import { type QuotaRefreshDeps } from "./refresh";
|
|
5
|
-
import type { AccountTestEgressDeps } from "./account-test-egress";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Dependencies shared by the tenant-scoped and global-admin account/quota route
|
|
9
|
-
* groups. Both groups are composed onto one Elysia instance by
|
|
10
|
-
* `createAccountQuotaRoutes`.
|
|
11
|
-
*/
|
|
12
|
-
export interface AccountQuotaRoutesDeps extends QuotaRefreshDeps {
|
|
13
|
-
readonly poolSelector?: AccountTestEgressDeps["poolSelector"];
|
|
14
|
-
readonly networkBindingFactory?: AccountTestEgressDeps["networkBindingFactory"];
|
|
15
|
-
readonly accessResolver: ConsoleAccessResolver;
|
|
16
|
-
readonly snapshotInvalidator?: { invalidate(): Promise<number> };
|
|
17
|
-
/** Records privileged account mutations (e.g. hard deletion) to `admin_audit_log`. */
|
|
18
|
-
readonly auditRecorder?: AuditRecorder | undefined;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export const ACCOUNT_STATUSES = ["active", "cooldown", "disabled"] as const;
|
|
22
|
-
export type AccountStatus = (typeof ACCOUNT_STATUSES)[number];
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
1
|
+
import type { ConsoleAccessResolver } from "../auth/access";
|
|
2
|
+
import type { AuditRecorder } from "../auth/audit-recorder";
|
|
3
|
+
import { markClineApiKeyCredential } from "../../providers/integrations/cline/cline-quota";
|
|
4
|
+
import { type QuotaRefreshDeps } from "./refresh";
|
|
5
|
+
import type { AccountTestEgressDeps } from "./account-test-egress";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Dependencies shared by the tenant-scoped and global-admin account/quota route
|
|
9
|
+
* groups. Both groups are composed onto one Elysia instance by
|
|
10
|
+
* `createAccountQuotaRoutes`.
|
|
11
|
+
*/
|
|
12
|
+
export interface AccountQuotaRoutesDeps extends QuotaRefreshDeps {
|
|
13
|
+
readonly poolSelector?: AccountTestEgressDeps["poolSelector"];
|
|
14
|
+
readonly networkBindingFactory?: AccountTestEgressDeps["networkBindingFactory"];
|
|
15
|
+
readonly accessResolver: ConsoleAccessResolver;
|
|
16
|
+
readonly snapshotInvalidator?: { invalidate(): Promise<number> };
|
|
17
|
+
/** Records privileged account mutations (e.g. hard deletion) to `admin_audit_log`. */
|
|
18
|
+
readonly auditRecorder?: AuditRecorder | undefined;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export const ACCOUNT_STATUSES = ["active", "cooldown", "disabled"] as const;
|
|
22
|
+
export type AccountStatus = (typeof ACCOUNT_STATUSES)[number];
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Wraps a stored api_key credential in the envelope its collector expects.
|
|
26
|
+
*
|
|
27
|
+
* Exported because every refresh path needs it, and the ones that omit it
|
|
28
|
+
* fail in a way that looks like the credential is dead: an unmarked `cline`
|
|
29
|
+
* `sk_...` key takes the OAuth branch, gets `workos:` prepended, and is
|
|
30
|
+
* refused with a message naming a version problem. The scheduled sweep once
|
|
31
|
+
* omitted it, so a working account was cooled with `quota_fetch_failed` every
|
|
32
|
+
* minute while refreshing fine from the console.
|
|
33
|
+
*/
|
|
34
|
+
export function markProviderApiKeyCredential(providerId: string, credential: string): string {
|
|
35
|
+
return providerId === "cline" ? markClineApiKeyCredential(credential) : credential;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Builds the refresh dependency bundle from the route deps, binding the
|
|
40
|
+
* provider-specific credential normalisation (`cline` API keys) once so every
|
|
41
|
+
* caller refreshes through the same wiring.
|
|
42
|
+
*/
|
|
43
|
+
export function createQuotaRefreshDeps(deps: AccountQuotaRoutesDeps): QuotaRefreshDeps {
|
|
44
|
+
return {
|
|
45
|
+
db: deps.db,
|
|
46
|
+
redis: deps.redis,
|
|
47
|
+
providerRegistry: deps.providerRegistry,
|
|
48
|
+
resolveCredential: deps.resolveCredential,
|
|
49
|
+
...(deps.snapshotInvalidator ? { snapshotInvalidator: deps.snapshotInvalidator } : {}),
|
|
50
|
+
markApiKeyCredential: markProviderApiKeyCredential,
|
|
51
|
+
};
|
|
52
|
+
}
|