cartethyia 2.7.3 → 2.7.5
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 +2 -0
- package/README.md +17 -5
- package/dist/dashboard/assets/{BannedPage-2TJD37Hb.js → BannedPage-Cj15GsMp.js} +1 -1
- package/dist/dashboard/assets/BannedPage-Cj15GsMp.js.gz +0 -0
- package/dist/dashboard/assets/ClaimGiftsButton-D83pBJ6J.js +1 -0
- package/dist/dashboard/assets/ClaimGiftsButton-D83pBJ6J.js.gz +0 -0
- package/dist/dashboard/assets/{CliToolDetailPage-xefJNRmJ.js → CliToolDetailPage-DZKmVuJN.js} +1 -1
- package/dist/dashboard/assets/CliToolDetailPage-DZKmVuJN.js.gz +0 -0
- package/dist/dashboard/assets/{CliToolsPage-Rj9iHQ3F.js → CliToolsPage-BIccZmeL.js} +1 -1
- package/dist/dashboard/assets/CliToolsPage-BIccZmeL.js.gz +0 -0
- package/dist/dashboard/assets/CombosPage-DEEKkYD-.js +1 -0
- package/dist/dashboard/assets/CombosPage-DEEKkYD-.js.gz +0 -0
- package/dist/dashboard/assets/ConsoleLogPage-D5rol2j2.js +1 -0
- package/dist/dashboard/assets/ConsoleLogPage-D5rol2j2.js.gz +0 -0
- package/dist/dashboard/assets/CustomizationPage-BKj_r0rp.js +1 -0
- package/dist/dashboard/assets/CustomizationPage-BKj_r0rp.js.gz +0 -0
- package/dist/dashboard/assets/InjectSystemPromptPanel-B5nZvmf0.js +656 -0
- package/dist/dashboard/assets/InjectSystemPromptPanel-B5nZvmf0.js.gz +0 -0
- package/dist/dashboard/assets/{LoginPage-C4w7vea-.js → LoginPage-DkXb6dx-.js} +1 -1
- package/dist/dashboard/assets/LoginPage-DkXb6dx-.js.gz +0 -0
- package/dist/dashboard/assets/{ModelPicker-BtPcAfot.js → ModelPicker-DnQPSIA8.js} +1 -1
- package/dist/dashboard/assets/ModelPicker-DnQPSIA8.js.gz +0 -0
- package/dist/dashboard/assets/OverviewPage-Ci2wQKUz.js +1 -0
- package/dist/dashboard/assets/OverviewPage-Ci2wQKUz.js.gz +0 -0
- package/dist/dashboard/assets/ProviderDetailPage-odlgYrOg.js +5 -0
- package/dist/dashboard/assets/ProviderDetailPage-odlgYrOg.js.gz +0 -0
- package/dist/dashboard/assets/ProviderIcon-EfeloBn4.js +1 -0
- package/dist/dashboard/assets/ProviderIcon-EfeloBn4.js.gz +0 -0
- package/dist/dashboard/assets/ProvidersPage-CqFBQEB8.js +1 -0
- package/dist/dashboard/assets/ProvidersPage-CqFBQEB8.js.gz +0 -0
- package/dist/dashboard/assets/ProxyPage-5SnUSy3j.js +9 -0
- package/dist/dashboard/assets/ProxyPage-5SnUSy3j.js.gz +0 -0
- package/dist/dashboard/assets/QuotaPage-CmnMDzhP.js +1 -0
- package/dist/dashboard/assets/QuotaPage-CmnMDzhP.js.gz +0 -0
- package/dist/dashboard/assets/SettingsPage-BJtRZ4qD.js +1 -0
- package/dist/dashboard/assets/SettingsPage-BJtRZ4qD.js.gz +0 -0
- package/dist/dashboard/assets/{SetupPage-BQS0Rx_u.js → SetupPage-WTa0sktC.js} +1 -1
- package/dist/dashboard/assets/SetupPage-WTa0sktC.js.gz +0 -0
- package/dist/dashboard/assets/{StudioPage-TP7voAQ0.js → StudioPage-BfAb5-o_.js} +3 -3
- package/dist/dashboard/assets/StudioPage-BfAb5-o_.js.gz +0 -0
- package/dist/dashboard/assets/UsagePage-BNzeZ2Vk.js +56 -0
- package/dist/dashboard/assets/UsagePage-BNzeZ2Vk.js.gz +0 -0
- package/dist/dashboard/assets/api-keys-l29JROPv.js +1 -0
- package/dist/dashboard/assets/api-keys-l29JROPv.js.gz +0 -0
- package/dist/dashboard/assets/app--PJWq8_C.css +2 -0
- package/dist/dashboard/assets/app--PJWq8_C.css.gz +0 -0
- package/dist/dashboard/assets/{assert-C0YYuZJ4.js → assert-C0K-c4eo.js} +1 -1
- package/dist/dashboard/assets/assert-C0K-c4eo.js.gz +0 -0
- package/dist/dashboard/assets/{badge-B_DMpMJN.js → badge-DfbhQU4k.js} +1 -1
- package/dist/dashboard/assets/badge-DfbhQU4k.js.gz +0 -0
- package/dist/dashboard/assets/{banner-DMrMPmth.js → banner-BllT4LcF.js} +1 -1
- package/dist/dashboard/assets/banner-BllT4LcF.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-Be5Uzamx.js → card-CtkX66Wd.js} +1 -1
- package/dist/dashboard/assets/card-CtkX66Wd.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/{cli-tools-muFRphDu.js → cli-tools-CQXVMn4P.js} +1 -1
- package/dist/dashboard/assets/cli-tools-CQXVMn4P.js.gz +0 -0
- package/dist/dashboard/assets/{clipboard-button-DOfrVmsi.js → clipboard-button-BQqBQd2n.js} +1 -1
- package/dist/dashboard/assets/clipboard-button-BQqBQd2n.js.gz +0 -0
- package/dist/dashboard/assets/{dialog-C9omdjQt.js → dialog-BEK7KP0H.js} +1 -1
- package/dist/dashboard/assets/dialog-BEK7KP0H.js.gz +0 -0
- package/dist/dashboard/assets/{drawer-Bm8WKaGY.js → drawer-BrTEZ8zu.js} +1 -1
- package/dist/dashboard/assets/drawer-BrTEZ8zu.js.gz +0 -0
- package/dist/dashboard/assets/entry-CHWxbS56.js +1 -0
- package/dist/dashboard/assets/entry-CHWxbS56.js.gz +0 -0
- package/dist/dashboard/assets/{entry-q5HwZ8nN.js → entry-EBHJ3DrE.js} +1 -1
- package/dist/dashboard/assets/entry-EBHJ3DrE.js.gz +0 -0
- package/dist/dashboard/assets/entry-LCS85hiq.js +4 -0
- package/dist/dashboard/assets/entry-LCS85hiq.js.gz +0 -0
- package/dist/dashboard/assets/{formatters-BTScrQpe.js → formatters-BAACA727.js} +1 -1
- package/dist/dashboard/assets/formatters-BAACA727.js.gz +0 -0
- package/dist/dashboard/assets/{github-badge-Orjuzemr.js → github-badge-YSCE4UC2.js} +1 -1
- package/dist/dashboard/assets/github-badge-YSCE4UC2.js.gz +0 -0
- package/dist/dashboard/assets/{index-cPrX5vn6.js → index-FQlj0HUT.js} +2 -2
- package/dist/dashboard/assets/index-FQlj0HUT.js.gz +0 -0
- package/dist/dashboard/assets/{inline-Dvux8w-0.js → inline-C4gU5iOL.js} +1 -1
- package/dist/dashboard/assets/inline-C4gU5iOL.js.gz +0 -0
- package/dist/dashboard/assets/{input-CU1Rgf3p.js → input-BHHX_Tmm.js} +1 -1
- package/dist/dashboard/assets/input-BHHX_Tmm.js.gz +0 -0
- package/dist/dashboard/assets/{layout-C_7A6H55.js → layout-CajrYUnD.js} +1 -1
- package/dist/dashboard/assets/{layout-C_7A6H55.js.gz → layout-CajrYUnD.js.gz} +0 -0
- package/dist/dashboard/assets/{list-row-CzFvogbj.js → list-row-Bx2I7XUe.js} +1 -1
- package/dist/dashboard/assets/list-row-Bx2I7XUe.js.gz +0 -0
- package/dist/dashboard/assets/live-DNNqRbj2.js +1 -0
- package/dist/dashboard/assets/live-DNNqRbj2.js.gz +0 -0
- package/dist/dashboard/assets/minimize-2-BTmMTK4o.js +1 -0
- package/dist/dashboard/assets/minimize-2-BTmMTK4o.js.gz +0 -0
- package/dist/dashboard/assets/{mutation-JJGQm8TD.js → mutation-Rr0TIvcj.js} +1 -1
- package/dist/dashboard/assets/mutation-Rr0TIvcj.js.gz +0 -0
- package/dist/dashboard/assets/network-C5UBACrJ.js +1 -0
- package/dist/dashboard/assets/network-C5UBACrJ.js.gz +0 -0
- package/dist/dashboard/assets/numbers-CUWAZK4J.js +2 -0
- package/dist/dashboard/assets/numbers-CUWAZK4J.js.gz +0 -0
- package/dist/dashboard/assets/pagination-Xsi9Qx04.js +1 -0
- package/dist/dashboard/assets/pagination-Xsi9Qx04.js.gz +0 -0
- package/dist/dashboard/assets/{query-keys-CLaNz8Xz.js → query-keys-BloKtaXJ.js} +1 -1
- package/dist/dashboard/assets/query-keys-BloKtaXJ.js.gz +0 -0
- package/dist/dashboard/assets/quota-DvQbD_sr.js +1 -0
- package/dist/dashboard/assets/quota-DvQbD_sr.js.gz +0 -0
- package/dist/dashboard/assets/{routing-BEH32QOC.js → routing-in0f_IfK.js} +1 -1
- package/dist/dashboard/assets/routing-in0f_IfK.js.gz +0 -0
- package/dist/dashboard/assets/{select-B3iTetHN.js → select-BLULNqTp.js} +2 -2
- package/dist/dashboard/assets/select-BLULNqTp.js.gz +0 -0
- package/dist/dashboard/assets/settings-CcGczj6I.js +1 -0
- package/dist/dashboard/assets/settings-CcGczj6I.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-KrOrm7JZ.js → stack-D2lIR0tg.js} +1 -1
- package/dist/dashboard/assets/stack-D2lIR0tg.js.gz +0 -0
- package/dist/dashboard/assets/{state-DLS7IDMy.js → state-DTARjfiW.js} +1 -1
- package/dist/dashboard/assets/state-DTARjfiW.js.gz +0 -0
- package/dist/dashboard/assets/{switch-42ItvbAs.js → switch-c0oPSnqW.js} +1 -1
- package/dist/dashboard/assets/switch-c0oPSnqW.js.gz +0 -0
- package/dist/dashboard/assets/{useMutation-Dmnfh1Ue.js → useMutation-m8WGNPrz.js} +1 -1
- package/dist/dashboard/assets/useMutation-m8WGNPrz.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 +59 -57
- package/migrations/full-postgres/0027_qoder_identity_genuine_seed.sql +9 -10
- package/migrations/full-postgres/0032_add_provider_pool_accounts.sql +53 -0
- package/migrations/full-postgres/0033_add_api_key_ban.sql +9 -0
- package/migrations/full-postgres/0034_add_api_key_ban_until.sql +7 -0
- package/migrations/full-postgres/0035_align_pool_account_status_enum.sql +21 -0
- 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/lite-sqlite3/0027_qoder_identity_genuine_seed.sql +9 -10
- package/migrations/lite-sqlite3/0032_add_provider_pool_accounts.sql +44 -0
- package/migrations/lite-sqlite3/0033_add_api_key_ban.sql +8 -0
- package/migrations/lite-sqlite3/0034_add_api_key_ban_until.sql +5 -0
- package/migrations/lite-sqlite3/0035_align_pool_account_status_enum.sql +6 -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/package.json +4 -5
- package/scripts/cli/update.ts +15 -41
- package/src/boot/app.ts +67 -10
- package/src/boot/dependencies.ts +786 -732
- package/src/boot/lifecycle.ts +11 -12
- package/src/config/cooldowns.ts +34 -55
- package/src/config/network.ts +8 -4
- package/src/config/package-paths.ts +1 -1
- package/src/config/providers.ts +13 -14
- package/src/config/resources.ts +0 -5
- package/src/config/runtime.ts +2 -5
- package/src/config/spec.ts +26 -6
- package/src/console/api-keys/ban-constants.ts +38 -0
- package/src/console/api-keys/contracts.ts +92 -31
- package/src/console/api-keys/routes.ts +131 -6
- package/src/console/audit/routes.ts +3 -3
- package/src/console/auth/access.ts +4 -4
- package/src/console/auth/account-reset.ts +5 -5
- 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 +40 -34
- 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 +11 -9
- package/src/console/backup/export-endpoint.ts +11 -12
- package/src/console/backup/nine-router.ts +1 -7
- package/src/console/backup/routes.ts +32 -36
- 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 +7 -7
- package/src/console/cli-tools/injectors/cline.ts +110 -110
- package/src/console/cli-tools/injectors/codex.ts +181 -181
- package/src/console/cli-tools/injectors/copilot.ts +108 -108
- package/src/console/cli-tools/injectors/driver.ts +247 -247
- package/src/console/cli-tools/injectors/jcode.ts +115 -115
- package/src/console/cli-tools/injectors/openclaw.ts +161 -161
- package/src/console/cli-tools/injectors/opencode.ts +153 -153
- package/src/console/cli-tools/routes.ts +4 -4
- package/src/console/cli-tools/service.ts +1 -1
- package/src/console/cli-tools/store.ts +2 -2
- package/src/console/console-router-guards.ts +2 -2
- package/src/console/console-router.ts +36 -4
- package/src/console/dashboard-assets.ts +9 -9
- package/src/console/data-management/routes.ts +3 -3
- package/src/console/domain-registration.ts +18 -4
- 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 +5 -1
- package/src/console/observability/live.ts +34 -21
- package/src/console/observability/logs.ts +4 -4
- package/src/console/observability/performance.ts +3 -3
- package/src/console/observability/routes.ts +3 -3
- package/src/console/observability/sse.ts +62 -8
- package/src/console/observability/store.ts +36 -20
- package/src/console/providers/catalog/catalog-projections.ts +1 -1
- package/src/console/providers/catalog/contracts.ts +82 -22
- package/src/console/providers/catalog/model-operations.ts +1 -1
- package/src/console/providers/catalog/provider-operations.ts +110 -17
- package/src/console/providers/catalog/public-model-store.ts +0 -0
- package/src/console/providers/catalog/routes.ts +30 -6
- package/src/console/providers/catalog/store-helpers.ts +349 -326
- package/src/console/providers/catalog/store.ts +1662 -1292
- package/src/console/providers/detail/routes.ts +4 -4
- package/src/console/providers/oauth/callback-listener.ts +100 -18
- package/src/console/providers/oauth/routes.ts +95 -16
- 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 +285 -67
- package/src/console/quota/account-test-egress.ts +4 -4
- 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/model/routes.ts +3 -3
- package/src/console/routing/pools/contracts.ts +13 -10
- package/src/console/routing/pools/import-parse.ts +3 -3
- package/src/console/routing/pools/operations.ts +14 -7
- package/src/console/routing/pools/probe-verdict.ts +8 -3
- package/src/console/routing/pools/relay-deploy.ts +12 -12
- package/src/console/routing/pools/routes.ts +3 -3
- package/src/console/routing/pools/store.ts +21 -1
- package/src/console/settings/contracts.ts +29 -2
- package/src/console/settings/routes.ts +3 -3
- package/src/console/settings/store.ts +20 -0
- package/src/console/share/share-router.ts +112 -44
- package/src/console/share/share-stats.ts +109 -39
- 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 +42 -6
- 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 +256 -98
- 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 +76 -5
- package/src/network/pool/agent.ts +7 -6
- package/src/network/pool/byte-accounting.ts +1 -1
- package/src/network/pool/resolver.ts +55 -51
- package/src/network/pool/selector.ts +150 -136
- package/src/network/pool-cooldown-store.ts +71 -16
- package/src/network/pool-health-machine.ts +22 -2
- package/src/network/rate-limit-verdict.ts +68 -0
- package/src/network/retry.ts +1 -1
- package/src/network/ssrf.ts +24 -75
- package/src/observability/event-log.ts +2 -2
- package/src/observability/event-query.ts +286 -214
- 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 +12 -3
- package/src/observability/telemetry-reconciliation.ts +3 -3
- package/src/observability/telemetry-status.ts +1 -1
- 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 +10 -5
- package/src/persistence/dialect.ts +5 -1
- package/src/persistence/readiness.ts +19 -7
- package/src/persistence/redis.ts +1 -1
- package/src/persistence/schema.ts +177 -45
- package/src/persistence/shared-cache.ts +2 -2
- package/src/persistence/sort-order.ts +1 -1
- package/src/persistence/stores/api-key-store.ts +109 -4
- package/src/persistence/stores/share-store.ts +20 -8
- package/src/persistence/stores/telemetry-store.ts +1 -1
- 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 +12 -16
- package/src/protocol/dsml.ts +3 -49
- package/src/protocol/gateway-error.ts +6 -3
- package/src/protocol/image-clamp.ts +2 -2
- package/src/protocol/image-generation.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 +27 -12
- package/src/protocol/response/codex.ts +2 -2
- package/src/protocol/response/gemini.ts +1 -1
- package/src/protocol/response/messages.ts +6 -6
- package/src/protocol/response/omp-tool-call-markup.ts +1 -1
- package/src/protocol/response/responses.ts +3 -3
- package/src/protocol/sse-decoder.ts +64 -4
- 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 +8 -8
- 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/protocol/upstream/send-claude-messages.ts +3 -3
- package/src/providers/adapters/base-adapter.ts +1 -1
- package/src/providers/adapters/compatible-adapter.ts +44 -5
- 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/authentication/oauth-refresh-service.ts +2 -2
- package/src/providers/bundled-discovery-providers.ts +6 -30
- package/src/providers/configured-openai-providers.ts +82 -97
- package/src/providers/configured-provider.ts +1 -1
- package/src/providers/default-registry.ts +23 -35
- 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 +50 -15
- package/src/providers/discovery/probing-service.ts +18 -20
- package/src/providers/integrations/agentrouter/agentrouter.ts +14 -5
- package/src/providers/integrations/alibabacp/alibabacp.ts +2 -2
- package/src/providers/integrations/anthropic.ts +4 -11
- package/src/providers/integrations/antigravity/antigravity-oauth.ts +0 -1
- package/src/providers/integrations/antigravity/antigravity-protocol.ts +0 -14
- package/src/providers/integrations/antigravity/antigravity.ts +15 -26
- package/src/providers/integrations/buddy/buddy-catalog-shared.ts +2 -2
- 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-discovery-shared.ts +37 -6
- package/src/providers/integrations/buddy/buddy-identity.ts +108 -1
- package/src/providers/integrations/buddy/buddy-media.ts +16 -16
- 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 +5 -16
- package/src/providers/integrations/buddy/codebuddy/shared.ts +30 -9
- package/src/providers/integrations/buddy/workbuddy/provider.ts +6 -10
- package/src/providers/integrations/buddy/workbuddy/shared.ts +21 -3
- package/src/providers/integrations/claude/claude-betas.ts +1 -1
- package/src/providers/integrations/claude/claude-cch.ts +148 -148
- package/src/providers/integrations/claude/claude-credentials.ts +1 -1
- package/src/providers/integrations/claude/claude-slow-lane-retry.ts +1 -1
- package/src/providers/integrations/claude/claude.ts +3 -10
- package/src/providers/integrations/claude/fallback-credit.ts +3 -7
- package/src/providers/integrations/cline/cline.ts +2 -2
- package/src/providers/integrations/cloudflareai/cloudflareai.ts +4 -7
- package/src/providers/integrations/codex/codex-device-code.ts +101 -101
- package/src/providers/integrations/codex/codex-errors.ts +1 -1
- package/src/providers/integrations/codex/codex-oauth.ts +0 -1
- package/src/providers/integrations/codex/codex.ts +14 -15
- package/src/providers/integrations/commandcode/commandcode.ts +76 -116
- package/src/providers/integrations/commandcode/quota.ts +132 -48
- package/src/providers/integrations/cursor/cursor-http2.ts +11 -14
- 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 +53 -20
- 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 +13 -13
- package/src/providers/integrations/gemini.ts +11 -11
- package/src/providers/integrations/github/github-discovery.ts +55 -10
- package/src/providers/integrations/github/github-oauth.ts +6 -5
- package/src/providers/integrations/github/github.ts +47 -20
- 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 +88 -42
- package/src/providers/integrations/inferhub.ts +4 -11
- package/src/providers/integrations/kilo/kilo-oauth.ts +1 -1
- package/src/providers/integrations/kimi/kimi.ts +4 -11
- 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 +91 -78
- package/src/providers/integrations/muse/muse-oauth.ts +0 -1
- package/src/providers/integrations/muse/muse-quota.ts +0 -4
- package/src/providers/integrations/muse/muse.ts +6 -9
- package/src/providers/integrations/opencode/fingerprint.ts +7 -5
- package/src/providers/integrations/opencode/provider.ts +17 -24
- package/src/providers/integrations/perplexity.ts +2 -2
- package/src/providers/integrations/qoder/qoder-catalog.ts +132 -17
- package/src/providers/integrations/qoder/qoder-checkin.ts +26 -8
- package/src/providers/integrations/qoder/qoder-native-identity-store.ts +9 -8
- 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 +22 -28
- package/src/providers/integrations/qoder/qoder-sse.ts +159 -0
- package/src/providers/integrations/qoder/qoder-umid.ts +33 -38
- package/src/providers/integrations/qoder/qoder-virtual.ts +14 -2
- package/src/providers/integrations/qoder/qoder.ts +521 -63
- 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/tokenharbor.ts +2 -2
- 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 +59 -19
- package/src/providers/integrations/xai/xai-oauth.ts +5 -5
- package/src/providers/integrations/zcode/oauth.ts +1 -1
- 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 +131 -116
- package/src/providers/operations/account-health-service.ts +31 -39
- package/src/providers/operations/account-reset-service.ts +58 -1
- 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 +22 -6
- package/src/providers/operations/provider-credential-service.ts +35 -6
- package/src/providers/operations/upstream-deadline.ts +3 -3
- package/src/providers/provider-contracts.ts +65 -10
- package/src/providers/provider-credential-resolver.ts +1 -1
- 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-registry.ts +4 -4
- package/src/providers/provider-usage.ts +81 -16
- package/src/providers/quota/cache.ts +29 -0
- package/src/providers/quota/quota-contracts.ts +28 -10
- package/src/providers/quota/refresh.ts +29 -6
- package/src/providers/quota/snapshot.ts +94 -0
- package/src/providers/search/search-provider.ts +6 -8
- package/src/providers/search/search-providers.ts +2 -1
- package/src/security/abuse.ts +8 -8
- package/src/security/admission/reasons.ts +17 -17
- package/src/security/admission/service.ts +2 -2
- package/src/security/admission/ttl.ts +61 -61
- package/src/security/api-key-auth.ts +20 -8
- 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/coerce.ts +19 -0
- package/src/shared/invoke-guard.ts +47 -0
- package/src/transport/contracts.ts +13 -4
- package/src/transport/dispatch/attempt-finalize.ts +5 -4
- package/src/transport/dispatch/attempt-loop.ts +10 -7
- package/src/transport/dispatch/capture-policy.ts +34 -37
- package/src/transport/dispatch/empty-stream.ts +28 -25
- package/src/transport/dispatch/generation.ts +33 -53
- package/src/transport/dispatch/leases.ts +8 -8
- package/src/transport/dispatch/native-shared.ts +127 -0
- package/src/transport/dispatch/proxy-request.ts +10 -8
- package/src/transport/dispatch/responses-compact.ts +35 -56
- package/src/transport/dispatch/retry-policy.ts +4 -67
- package/src/transport/dispatch/stream-bridge.ts +1 -1
- package/src/transport/dispatch/streaming/encoder.ts +18 -72
- package/src/transport/dispatch/streaming/finalize.ts +11 -10
- 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 +27 -55
- package/src/transport/dispatch/token-count.ts +49 -46
- package/src/transport/dispatch/websearch.ts +24 -50
- package/src/transport/drain-endpoint.ts +3 -3
- package/src/transport/failure-policy.ts +19 -6
- package/src/transport/guards/auth-guard.ts +6 -11
- package/src/transport/guards/body-policy.ts +7 -7
- package/src/transport/guards/error-lifecycle.ts +18 -3
- package/src/transport/guards/guard-errors.ts +7 -3
- package/src/transport/guards/headroom-guard.ts +2 -2
- package/src/transport/guards/pipeline.ts +7 -7
- package/src/transport/guards/readiness-guard.ts +16 -2
- package/src/transport/guards/request-context.ts +15 -20
- package/src/transport/request/preparer.ts +306 -27
- 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 +5 -20
- 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 +113 -19
- package/src/transport/routing/route-model.ts +131 -38
- package/src/transport/routing/router.ts +154 -39
- package/src/transport/shutdown-notice.ts +21 -9
- 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 +3 -3
- package/src/transport/surface/content-parts.ts +1 -1
- package/src/transport/surface/dialects.ts +2 -2
- package/src/transport/surface/messages/encode.ts +1 -1
- package/src/transport/surface/messages/parse.ts +3 -3
- 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 +376 -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-2TJD37Hb.js.gz +0 -0
- package/dist/dashboard/assets/CliToolDetailPage-xefJNRmJ.js.gz +0 -0
- package/dist/dashboard/assets/CliToolsPage-Rj9iHQ3F.js.gz +0 -0
- package/dist/dashboard/assets/CombosPage-JEbYJFxw.js +0 -1
- package/dist/dashboard/assets/CombosPage-JEbYJFxw.js.gz +0 -0
- package/dist/dashboard/assets/ConsoleLogPage-C3xx_inM.js +0 -1
- package/dist/dashboard/assets/ConsoleLogPage-C3xx_inM.js.gz +0 -0
- package/dist/dashboard/assets/CustomizationPage-Dw306gJU.js +0 -1
- package/dist/dashboard/assets/CustomizationPage-Dw306gJU.js.gz +0 -0
- package/dist/dashboard/assets/HealthEventsModal-jaBo1TWV.js +0 -1
- package/dist/dashboard/assets/HealthEventsModal-jaBo1TWV.js.gz +0 -0
- package/dist/dashboard/assets/LoginPage-C4w7vea-.js.gz +0 -0
- package/dist/dashboard/assets/ModelPicker-BtPcAfot.js.gz +0 -0
- package/dist/dashboard/assets/OverviewPage-CGC5gNs1.js +0 -1
- package/dist/dashboard/assets/OverviewPage-CGC5gNs1.js.gz +0 -0
- package/dist/dashboard/assets/ProviderDetailPage-DQcthNGt.js +0 -4
- package/dist/dashboard/assets/ProviderDetailPage-DQcthNGt.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-0OsXRGXe.js +0 -1
- package/dist/dashboard/assets/ProvidersPage-0OsXRGXe.js.gz +0 -0
- package/dist/dashboard/assets/ProxyPage-DdPc8slb.js +0 -9
- package/dist/dashboard/assets/ProxyPage-DdPc8slb.js.gz +0 -0
- package/dist/dashboard/assets/QuotaPage-Ci5O4BnH.js +0 -1
- package/dist/dashboard/assets/QuotaPage-Ci5O4BnH.js.gz +0 -0
- package/dist/dashboard/assets/SettingsPage-CDZjTt87.js +0 -1
- package/dist/dashboard/assets/SettingsPage-CDZjTt87.js.gz +0 -0
- package/dist/dashboard/assets/SetupPage-BQS0Rx_u.js.gz +0 -0
- package/dist/dashboard/assets/SortableList-BAL5npBC.js +0 -1
- package/dist/dashboard/assets/SortableList-BAL5npBC.js.gz +0 -0
- package/dist/dashboard/assets/StudioPage-TP7voAQ0.js.gz +0 -0
- package/dist/dashboard/assets/UsagePage-Cj_fEzhg.js +0 -56
- package/dist/dashboard/assets/UsagePage-Cj_fEzhg.js.gz +0 -0
- package/dist/dashboard/assets/api-keys-MbI7e7rt.js +0 -1
- package/dist/dashboard/assets/api-keys-MbI7e7rt.js.gz +0 -0
- package/dist/dashboard/assets/app-B2vyPoII.css +0 -2
- package/dist/dashboard/assets/app-B2vyPoII.css.gz +0 -0
- package/dist/dashboard/assets/assert-C0YYuZJ4.js.gz +0 -0
- package/dist/dashboard/assets/badge-B_DMpMJN.js.gz +0 -0
- package/dist/dashboard/assets/banner-DMrMPmth.js.gz +0 -0
- package/dist/dashboard/assets/card-Be5Uzamx.js.gz +0 -0
- package/dist/dashboard/assets/cli-tools-muFRphDu.js.gz +0 -0
- package/dist/dashboard/assets/clipboard-button-DOfrVmsi.js.gz +0 -0
- package/dist/dashboard/assets/dialog-C9omdjQt.js.gz +0 -0
- package/dist/dashboard/assets/drawer-Bm8WKaGY.js.gz +0 -0
- package/dist/dashboard/assets/entry-DS90gUks.js +0 -1
- package/dist/dashboard/assets/entry-DS90gUks.js.gz +0 -0
- package/dist/dashboard/assets/entry-j40LJotO.js +0 -4
- package/dist/dashboard/assets/entry-j40LJotO.js.gz +0 -0
- package/dist/dashboard/assets/entry-q5HwZ8nN.js.gz +0 -0
- package/dist/dashboard/assets/formatters-BTScrQpe.js.gz +0 -0
- package/dist/dashboard/assets/github-badge-Orjuzemr.js.gz +0 -0
- package/dist/dashboard/assets/index-cPrX5vn6.js.gz +0 -0
- package/dist/dashboard/assets/inline-Dvux8w-0.js.gz +0 -0
- package/dist/dashboard/assets/input-CU1Rgf3p.js.gz +0 -0
- package/dist/dashboard/assets/list-row-CzFvogbj.js.gz +0 -0
- package/dist/dashboard/assets/live-KaG15HLQ.js +0 -1
- package/dist/dashboard/assets/live-KaG15HLQ.js.gz +0 -0
- package/dist/dashboard/assets/minimize-2-D-MN8W8a.js +0 -1
- package/dist/dashboard/assets/minimize-2-D-MN8W8a.js.gz +0 -0
- package/dist/dashboard/assets/mutation-JJGQm8TD.js.gz +0 -0
- package/dist/dashboard/assets/numbers-BNDZnsUE.js +0 -2
- package/dist/dashboard/assets/numbers-BNDZnsUE.js.gz +0 -0
- package/dist/dashboard/assets/query-keys-CLaNz8Xz.js.gz +0 -0
- package/dist/dashboard/assets/quota-DZGyp0N5.js +0 -1
- package/dist/dashboard/assets/quota-DZGyp0N5.js.gz +0 -0
- package/dist/dashboard/assets/routing-BEH32QOC.js.gz +0 -0
- package/dist/dashboard/assets/select-B3iTetHN.js.gz +0 -0
- package/dist/dashboard/assets/settings-Dt3Eqbnq.js +0 -1
- package/dist/dashboard/assets/settings-Dt3Eqbnq.js.gz +0 -0
- package/dist/dashboard/assets/stack-KrOrm7JZ.js.gz +0 -0
- package/dist/dashboard/assets/state-DLS7IDMy.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-42ItvbAs.js.gz +0 -0
- package/dist/dashboard/assets/useMutation-Dmnfh1Ue.js.gz +0 -0
- 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/{app-wvwCi4Eh.js → app-Bgd3zANQ.js} +0 -0
- /package/dist/dashboard/assets/{app-wvwCi4Eh.js.gz → app-Bgd3zANQ.js.gz} +0 -0
- /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
|
@@ -2,11 +2,25 @@
|
|
|
2
2
|
import { desc, sql } from "drizzle-orm";
|
|
3
3
|
import {
|
|
4
4
|
bigint, boolean, check, customType, index, integer, jsonb, numeric, pgEnum, pgTable,
|
|
5
|
-
primaryKey, text, timestamp, uniqueIndex, uuid, type AnyPgColumn,
|
|
5
|
+
primaryKey, text, timestamp, unique, uniqueIndex, uuid, type AnyPgColumn,
|
|
6
6
|
} from "drizzle-orm/pg-core";
|
|
7
|
+
import type { ProviderQuotaResult } from "../providers/quota/quota-contracts";
|
|
7
8
|
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
/**
|
|
10
|
+
* The persisted copy of one account's last successful quota read.
|
|
11
|
+
*
|
|
12
|
+
* Survives process restarts, which the in-process quota cache does not — so a
|
|
13
|
+
* cold page open can render the last known balance immediately while the sweep
|
|
14
|
+
* refreshes it. Stored only on success; a failed fetch leaves the previous
|
|
15
|
+
* snapshot in place.
|
|
16
|
+
*/
|
|
17
|
+
export interface ProviderQuotaResultSnapshot {
|
|
18
|
+
readonly quota: ProviderQuotaResult;
|
|
19
|
+
readonly fetchedAt: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const TENANT_STATUSES = ["active", "suspended", "deleted"] as const;
|
|
23
|
+
type TenantStatus = (typeof TENANT_STATUSES)[number];
|
|
10
24
|
|
|
11
25
|
export const tenants = pgTable(
|
|
12
26
|
"tenants",
|
|
@@ -26,35 +40,35 @@ export const tenants = pgTable(
|
|
|
26
40
|
|
|
27
41
|
// Canonical tenant/timestamp column definitions shared by every table.
|
|
28
42
|
|
|
29
|
-
|
|
43
|
+
function tenantRefNullable() {
|
|
30
44
|
return uuid("tenant_id").references(() => tenants.id, { onDelete: "cascade" });
|
|
31
45
|
}
|
|
32
46
|
|
|
33
|
-
|
|
47
|
+
function tenantRefRequired() {
|
|
34
48
|
return uuid("tenant_id")
|
|
35
49
|
.notNull()
|
|
36
50
|
.references(() => tenants.id, { onDelete: "cascade" });
|
|
37
51
|
}
|
|
38
52
|
|
|
39
|
-
|
|
53
|
+
function tenantRefPrimaryKey() {
|
|
40
54
|
return uuid("tenant_id")
|
|
41
55
|
.primaryKey()
|
|
42
56
|
.references(() => tenants.id, { onDelete: "cascade" });
|
|
43
57
|
}
|
|
44
58
|
|
|
45
|
-
|
|
59
|
+
function tenantCascadeSetNull() {
|
|
46
60
|
return uuid("tenant_id").references(() => tenants.id, { onDelete: "set null" });
|
|
47
61
|
}
|
|
48
62
|
|
|
49
|
-
|
|
63
|
+
function createdAtColumn() {
|
|
50
64
|
return timestamp("created_at", { withTimezone: true }).notNull().defaultNow();
|
|
51
65
|
}
|
|
52
66
|
|
|
53
|
-
|
|
67
|
+
function updatedAtColumn() {
|
|
54
68
|
return timestamp("updated_at", { withTimezone: true }).notNull().defaultNow();
|
|
55
69
|
}
|
|
56
70
|
|
|
57
|
-
|
|
71
|
+
function timestampColumns() {
|
|
58
72
|
return { createdAt: createdAtColumn(), updatedAt: updatedAtColumn() };
|
|
59
73
|
}
|
|
60
74
|
|
|
@@ -90,7 +104,7 @@ export const healthStatus = pgEnum("health_status", ["active", "cooldown", "disa
|
|
|
90
104
|
* One definition, because the two tables are driven by the same transitions and
|
|
91
105
|
* a column added to one of them by hand is how they drift.
|
|
92
106
|
*/
|
|
93
|
-
|
|
107
|
+
function healthColumns() {
|
|
94
108
|
return {
|
|
95
109
|
status: healthStatus("status").notNull().default("active"),
|
|
96
110
|
consecutiveFailures: integer("consecutive_failures").notNull().default(0),
|
|
@@ -188,15 +202,16 @@ export const providers = pgTable(
|
|
|
188
202
|
*
|
|
189
203
|
* The device identity is a deterministic function of a seed file
|
|
190
204
|
* (`~/.config/.locale_cfg`): the `runtime-info` bridge reads that seed and
|
|
191
|
-
* derives `machineToken`/`machineType`/`machineCode`. The
|
|
192
|
-
*
|
|
193
|
-
*
|
|
205
|
+
* derives `machineToken`/`machineType`/`machineCode`. The daily 100-credit
|
|
206
|
+
* campaign does not gate grants on this identity. A persisted seed allows the
|
|
207
|
+
* vendor bridge to replay the same native identity where another Qoder surface
|
|
208
|
+
* requires it.
|
|
194
209
|
*
|
|
195
210
|
* `seed` is the exact seed-file content the identity was minted from, stored
|
|
196
211
|
* so the same device identity can be replayed (restore seed → bridge → same
|
|
197
|
-
* token). It is not a credential, but it is
|
|
198
|
-
*
|
|
199
|
-
*
|
|
212
|
+
* token). It is not a credential, but it is per-account device material and
|
|
213
|
+
* should not be shared between accounts. Campaign grant eligibility is
|
|
214
|
+
* independent of `machineToken`.
|
|
200
215
|
*/
|
|
201
216
|
export interface NativeIdentityRecord {
|
|
202
217
|
readonly machineToken: string;
|
|
@@ -294,6 +309,18 @@ export const providerAccounts = pgTable("provider_accounts", {
|
|
|
294
309
|
* to an account that may well be refused.
|
|
295
310
|
*/
|
|
296
311
|
quotaPlan: text("quota_plan"),
|
|
312
|
+
/**
|
|
313
|
+
* The last successful quota read for this account, as a JSON snapshot.
|
|
314
|
+
*
|
|
315
|
+
* Persisted rather than left only in the quota cache: that cache is a short
|
|
316
|
+
* in-process TTL and empty on a cold start, so right after a restart the
|
|
317
|
+
* console would show no balance for every account until the sweep re-read
|
|
318
|
+
* them. The row survives the restart, so a cold page open renders the last
|
|
319
|
+
* known numbers immediately (and the sweep refreshes them). Only a
|
|
320
|
+
* *successful* read is stored — a failed fetch leaves the previous snapshot
|
|
321
|
+
* in place, mirroring the plan column's behaviour.
|
|
322
|
+
*/
|
|
323
|
+
quotaSnapshot: jsonb("quota_snapshot").$type<ProviderQuotaResultSnapshot | null>(),
|
|
297
324
|
|
|
298
325
|
/**
|
|
299
326
|
* Qoder native machine identity bound to this account, as one JSON object
|
|
@@ -341,7 +368,6 @@ export const providerAccounts = pgTable("provider_accounts", {
|
|
|
341
368
|
],
|
|
342
369
|
);
|
|
343
370
|
|
|
344
|
-
|
|
345
371
|
// OAuth refresh token + cross-process lease, normalized out of
|
|
346
372
|
// `provider_accounts` into its own 1:0/1 table. The vast majority of
|
|
347
373
|
// provider accounts are `credentialKind: "api_key"`, for which these four
|
|
@@ -380,7 +406,6 @@ export const providerOauthStates = pgTable("provider_oauth_states", {
|
|
|
380
406
|
leaseExpiresAt: timestamp("lease_expires_at", { withTimezone: true }),
|
|
381
407
|
});
|
|
382
408
|
|
|
383
|
-
|
|
384
409
|
// One row per (provider_id, model_id, route), with `endpoint_path`
|
|
385
410
|
// identifying the route — the same model through two providers, or through
|
|
386
411
|
// two routes of one provider, is two rows. `enabled` is a hard routing
|
|
@@ -422,7 +447,7 @@ export const models = pgTable(
|
|
|
422
447
|
* that predicts access — `credits` and `vendor` were both measured against
|
|
423
448
|
* real dispatches and neither correlates. Only the refusal itself is a
|
|
424
449
|
* signal, so the answer has to be recorded. See
|
|
425
|
-
*
|
|
450
|
+
* `documentation/research/codebuddy/2026-10-19-codebuddy-chat-dispatch-headers.md`.
|
|
426
451
|
*/
|
|
427
452
|
proOnly: boolean("pro_only"),
|
|
428
453
|
/**
|
|
@@ -434,6 +459,12 @@ export const models = pgTable(
|
|
|
434
459
|
* provider did not state it, which is not the same as billed.
|
|
435
460
|
*/
|
|
436
461
|
freeTier: boolean("free_tier"),
|
|
462
|
+
/**
|
|
463
|
+
* Explicit wire dialect for this row (nullable). Absent = resolver
|
|
464
|
+
* fallback (heuristic + family default). See
|
|
465
|
+
* `src/protocol/translation/dialect/`.
|
|
466
|
+
*/
|
|
467
|
+
dialect: text("dialect"),
|
|
437
468
|
},
|
|
438
469
|
(table) => [
|
|
439
470
|
uniqueIndex("models_provider_model_route_uidx").on(
|
|
@@ -475,7 +506,6 @@ export const tenantDisabledModels = pgTable(
|
|
|
475
506
|
],
|
|
476
507
|
);
|
|
477
508
|
|
|
478
|
-
|
|
479
509
|
// Tenant-owned HTTP/HTTPS/SOCKS5 pools share the provider-account health state machine.
|
|
480
510
|
export const networkPools = pgTable("network_pools", {
|
|
481
511
|
id: uuid("id").primaryKey().defaultRandom(),
|
|
@@ -569,6 +599,47 @@ export const networkPools = pgTable("network_pools", {
|
|
|
569
599
|
],
|
|
570
600
|
);
|
|
571
601
|
|
|
602
|
+
/**
|
|
603
|
+
* A pool's account-equivalent routing entity for ip-scoped, credential-less
|
|
604
|
+
* providers (OpenCode Free today).
|
|
605
|
+
*
|
|
606
|
+
* These providers own no `provider_accounts` rows — the rate limit belongs to
|
|
607
|
+
* the egress address, not to a credential. Materializing one row per (pool,
|
|
608
|
+
* ip-scoped provider) lets the account health machine, routing eligibility, and
|
|
609
|
+
* the provider-detail accounts UI treat each egress like an account: the row
|
|
610
|
+
* carries the same health state machine and cooldown columns, so a spent egress
|
|
611
|
+
* is excluded from the plan the same way a cooling account is, and the operator
|
|
612
|
+
* sees it in the provider's Accounts card with a "Pool" badge.
|
|
613
|
+
*
|
|
614
|
+
* The row is an *account-equivalent*, not an account: it resolves no credential
|
|
615
|
+
* (`credential_kind` is fixed to `none`-style egress), is skipped by the quota
|
|
616
|
+
* refresh and identity sweeps (they filter on real credential kinds), and is
|
|
617
|
+
* owned by its pool — deleting the pool cascades the row.
|
|
618
|
+
*/
|
|
619
|
+
export const providerPoolAccounts = pgTable(
|
|
620
|
+
"provider_pool_accounts",
|
|
621
|
+
{
|
|
622
|
+
id: uuid("id").primaryKey().defaultRandom(),
|
|
623
|
+
tenantId: tenantRefRequired(),
|
|
624
|
+
networkPoolId: uuid("network_pool_id")
|
|
625
|
+
.notNull()
|
|
626
|
+
.references(() => networkPools.id, { onDelete: "cascade" }),
|
|
627
|
+
providerId: text("provider_id").notNull(),
|
|
628
|
+
label: text("label").notNull(),
|
|
629
|
+
...healthColumns(),
|
|
630
|
+
createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
|
|
631
|
+
updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
|
|
632
|
+
},
|
|
633
|
+
(table) => [
|
|
634
|
+
unique("provider_pool_accounts_pool_provider_uidx").on(
|
|
635
|
+
table.networkPoolId,
|
|
636
|
+
table.providerId,
|
|
637
|
+
table.tenantId,
|
|
638
|
+
),
|
|
639
|
+
index("provider_pool_accounts_tenant_status_idx").on(table.tenantId, table.status),
|
|
640
|
+
index("provider_pool_accounts_provider_status_idx").on(table.providerId, table.status),
|
|
641
|
+
],
|
|
642
|
+
);
|
|
572
643
|
|
|
573
644
|
// Account and network-pool health events share one table. The entity kind
|
|
574
645
|
// selects exactly one owner FK, and the CHECK constraint below preserves
|
|
@@ -609,7 +680,6 @@ export const healthEvents = pgTable(
|
|
|
609
680
|
],
|
|
610
681
|
);
|
|
611
682
|
|
|
612
|
-
|
|
613
683
|
// Model aliasing & combos. Aliases resolve a client-facing name to a
|
|
614
684
|
// real model; combos back a client-facing name with >=1 real models,
|
|
615
685
|
// auto-selected via `fallback` or `round_robin`.
|
|
@@ -762,7 +832,6 @@ export const poolRoutingSettings = pgTable("pool_routing_settings", {
|
|
|
762
832
|
rotateCount: integer("rotate_count").notNull().default(1),
|
|
763
833
|
});
|
|
764
834
|
|
|
765
|
-
|
|
766
835
|
export const API_KEY_MODES = ["personal", "share"] as const;
|
|
767
836
|
export type ApiKeyMode = (typeof API_KEY_MODES)[number];
|
|
768
837
|
|
|
@@ -776,6 +845,10 @@ export type ApiKeyMode = (typeof API_KEY_MODES)[number];
|
|
|
776
845
|
export const API_KEY_MODEL_ACCESS_MODES = ["whitelist", "blacklist"] as const;
|
|
777
846
|
export type ApiKeyModelAccessMode = (typeof API_KEY_MODEL_ACCESS_MODES)[number];
|
|
778
847
|
|
|
848
|
+
/** Share-template concurrency scope — see `apiKeys.concurrencyScope`. */
|
|
849
|
+
export const API_KEY_CONCURRENCY_SCOPES = ["family", "per_key"] as const;
|
|
850
|
+
export type ApiKeyConcurrencyScope = (typeof API_KEY_CONCURRENCY_SCOPES)[number];
|
|
851
|
+
|
|
779
852
|
/**
|
|
780
853
|
* Inbound `/v1/*` keys never store plaintext secrets. Personal keys carry an
|
|
781
854
|
* authentication hash; share templates carry policy and child keys point back
|
|
@@ -814,6 +887,24 @@ export const apiKeys = pgTable(
|
|
|
814
887
|
.notNull()
|
|
815
888
|
.default(0),
|
|
816
889
|
maxConcurrentRequests: integer("max_concurrent_requests"),
|
|
890
|
+
/**
|
|
891
|
+
* How `maxConcurrentRequests` applies to a share family:
|
|
892
|
+
*
|
|
893
|
+
* - `family` (default) — one cap across the whole family: every recipient
|
|
894
|
+
* key shares the same admission counter and budget, so 20 means 20
|
|
895
|
+
* concurrent requests across all children of the template.
|
|
896
|
+
* - `per_key` — each recipient key gets its own independent concurrent
|
|
897
|
+
* window and cap. The cap is copied from the template to each child at
|
|
898
|
+
* issue time (children carry their own `maxConcurrentRequests`), and a
|
|
899
|
+
* child's admission identity is its own id, not the parent's.
|
|
900
|
+
*
|
|
901
|
+
* Only meaningful for `share` keys; personal keys always use their own
|
|
902
|
+
* per-key cap.
|
|
903
|
+
*/
|
|
904
|
+
concurrencyScope: text("concurrency_scope")
|
|
905
|
+
.$type<ApiKeyConcurrencyScope>()
|
|
906
|
+
.notNull()
|
|
907
|
+
.default("family"),
|
|
817
908
|
/**
|
|
818
909
|
* Slot cap for a share template: the maximum number of concurrently
|
|
819
910
|
* active child keys it may mint. `null` = unlimited (legacy behavior).
|
|
@@ -845,6 +936,21 @@ export const apiKeys = pgTable(
|
|
|
845
936
|
createdAt: createdAtColumn(),
|
|
846
937
|
enabled: boolean("enabled").notNull().default(true),
|
|
847
938
|
revokedAt: timestamp("revoked_at", { withTimezone: true }),
|
|
939
|
+
/**
|
|
940
|
+
* Ban state. A ban is distinct from a revoke: it records the operator's
|
|
941
|
+
* reason (`banReason`) so the console can show it, and it is fully
|
|
942
|
+
* reversible — unban clears both columns, leaving no metadata behind.
|
|
943
|
+
* Banned keys are rejected by the auth path exactly like revoked keys.
|
|
944
|
+
*/
|
|
945
|
+
bannedAt: timestamp("banned_at", { withTimezone: true }),
|
|
946
|
+
banReason: text("ban_reason"),
|
|
947
|
+
/**
|
|
948
|
+
* When the ban lifts on its own, if it is not permanent. `null` means the
|
|
949
|
+
* ban does not lapse (until an operator unbans it). The auth path treats a
|
|
950
|
+
* key as banned only while `banned_at` is set and `banned_until` is either
|
|
951
|
+
* null or in the future — so a timed ban expires without SQL.
|
|
952
|
+
*/
|
|
953
|
+
bannedUntil: timestamp("banned_until", { withTimezone: true }),
|
|
848
954
|
/**
|
|
849
955
|
* The tenant's mandatory gateway key. Seeded at first boot whether or not
|
|
850
956
|
* `CARTETHYIA_API_KEY` was configured, and the one key the console refuses
|
|
@@ -925,7 +1031,6 @@ export const sharePopups = pgTable(
|
|
|
925
1031
|
],
|
|
926
1032
|
);
|
|
927
1033
|
|
|
928
|
-
|
|
929
1034
|
// Public bearer links for enrolling one shared key per resolved client IP, and
|
|
930
1035
|
// for handing a personal key to its owner. The hash is the lookup key; the
|
|
931
1036
|
// token is additionally retained encrypted so the owner's console can show the
|
|
@@ -934,12 +1039,11 @@ export const sharePopups = pgTable(
|
|
|
934
1039
|
* Share-link kinds, as a runtime tuple. Route schemas and DTOs project this
|
|
935
1040
|
* list rather than restating it.
|
|
936
1041
|
*/
|
|
937
|
-
|
|
1042
|
+
const SHARE_LINK_KINDS = ["enroll", "handoff"] as const;
|
|
938
1043
|
|
|
939
1044
|
/** One share-link kind. */
|
|
940
1045
|
export type ShareLinkKind = (typeof SHARE_LINK_KINDS)[number];
|
|
941
1046
|
|
|
942
|
-
|
|
943
1047
|
export const shareLinks = pgTable(
|
|
944
1048
|
"share_links",
|
|
945
1049
|
{
|
|
@@ -981,7 +1085,6 @@ export const shareLinks = pgTable(
|
|
|
981
1085
|
],
|
|
982
1086
|
);
|
|
983
1087
|
|
|
984
|
-
|
|
985
1088
|
/**
|
|
986
1089
|
* Console dashboard users — distinct from API-key tenants.
|
|
987
1090
|
*/
|
|
@@ -1054,7 +1157,6 @@ export const consoleLockouts = pgTable(
|
|
|
1054
1157
|
],
|
|
1055
1158
|
);
|
|
1056
1159
|
|
|
1057
|
-
|
|
1058
1160
|
// Configuration-change audit has its own retention lifecycle; it is separate
|
|
1059
1161
|
// from metadata telemetry and short-lived optional payload capture.
|
|
1060
1162
|
export const adminAuditLog = pgTable(
|
|
@@ -1077,7 +1179,6 @@ export const adminAuditLog = pgTable(
|
|
|
1077
1179
|
],
|
|
1078
1180
|
);
|
|
1079
1181
|
|
|
1080
|
-
|
|
1081
1182
|
// Runtime preferences are stored in one validated JSONB bag. The filter
|
|
1082
1183
|
// master toggle remains a typed column because it is read on the proxy path.
|
|
1083
1184
|
export interface ConsoleSettingsPreferences {
|
|
@@ -1173,6 +1274,14 @@ export interface ConsoleSettingsPreferences {
|
|
|
1173
1274
|
* the safer direction and the more common need.
|
|
1174
1275
|
*/
|
|
1175
1276
|
imageClampMaxBytes?: number | null;
|
|
1277
|
+
/**
|
|
1278
|
+
* Ordered list of vision model ids (`provider/model`) used to describe
|
|
1279
|
+
* images when the selected model is not image-capable. The first healthy
|
|
1280
|
+
* model wins; if it fails (cooldown/quota/upstream error), the handoff
|
|
1281
|
+
* falls through to the next entry. Empty/absent = legacy `[image]`
|
|
1282
|
+
* placeholder behavior.
|
|
1283
|
+
*/
|
|
1284
|
+
visionHandoffModels?: readonly string[];
|
|
1176
1285
|
}
|
|
1177
1286
|
|
|
1178
1287
|
export const consoleSettings = pgTable("console_settings", {
|
|
@@ -1183,21 +1292,33 @@ export const consoleSettings = pgTable("console_settings", {
|
|
|
1183
1292
|
|
|
1184
1293
|
// Tenant-scoped system prompt injection (append/override). One row per
|
|
1185
1294
|
// tenant; `global` NULL means never configured, distinct from an explicit
|
|
1186
|
-
// disabled setting. Providers/models are JSON object maps
|
|
1187
|
-
// providerId
|
|
1188
|
-
// `src/console/system-prompt/contracts.ts` for the value
|
|
1189
|
-
// resolution rules implemented by the dispatch-path transform.
|
|
1295
|
+
// disabled setting. Providers/models/combos/aliases are JSON object maps
|
|
1296
|
+
// keyed by providerId, `providerId::modelId`, combo name, and alias name
|
|
1297
|
+
// respectively — see `src/console/system-prompt/contracts.ts` for the value
|
|
1298
|
+
// shapes and the resolution rules implemented by the dispatch-path transform.
|
|
1190
1299
|
export const tenantSystemPrompts = pgTable("tenant_system_prompts", {
|
|
1191
1300
|
tenantId: tenantRefPrimaryKey(),
|
|
1192
|
-
global: jsonb("global").$type<import("../console/system-prompt/contracts").
|
|
1301
|
+
global: jsonb("global").$type<import("../console/system-prompt/contracts").ScopePromptRef | null>(),
|
|
1302
|
+
presets: jsonb("presets")
|
|
1303
|
+
.notNull()
|
|
1304
|
+
.default({})
|
|
1305
|
+
.$type<Record<string, import("../console/system-prompt/contracts").SystemPromptPreset>>(),
|
|
1193
1306
|
providers: jsonb("providers")
|
|
1194
1307
|
.notNull()
|
|
1195
1308
|
.default({})
|
|
1196
|
-
.$type<Record<string, import("../console/system-prompt/contracts").
|
|
1309
|
+
.$type<Record<string, import("../console/system-prompt/contracts").ScopePromptRef>>(),
|
|
1197
1310
|
models: jsonb("models")
|
|
1198
1311
|
.notNull()
|
|
1199
1312
|
.default({})
|
|
1200
|
-
.$type<Record<string, import("../console/system-prompt/contracts").
|
|
1313
|
+
.$type<Record<string, import("../console/system-prompt/contracts").ScopePromptRef>>(),
|
|
1314
|
+
combos: jsonb("combos")
|
|
1315
|
+
.notNull()
|
|
1316
|
+
.default({})
|
|
1317
|
+
.$type<Record<string, import("../console/system-prompt/contracts").ScopePromptRef>>(),
|
|
1318
|
+
aliases: jsonb("aliases")
|
|
1319
|
+
.notNull()
|
|
1320
|
+
.default({})
|
|
1321
|
+
.$type<Record<string, import("../console/system-prompt/contracts").ScopePromptRef>>(),
|
|
1201
1322
|
updatedAt: updatedAtColumn(),
|
|
1202
1323
|
});
|
|
1203
1324
|
|
|
@@ -1217,7 +1338,6 @@ export const inferhubConfigKeys = pgTable("inferhub_config_keys", {
|
|
|
1217
1338
|
updatedAt: updatedAtColumn(),
|
|
1218
1339
|
});
|
|
1219
1340
|
|
|
1220
|
-
|
|
1221
1341
|
// CLI Tools (CLI tool configuration): per-tenant mapping table that lets a coding-agent
|
|
1222
1342
|
// slot (e.g. Claude Code's "opus" slot) target a specific Cartethyia model. Rows
|
|
1223
1343
|
// are opaque strings — validation happens at the API boundary against the
|
|
@@ -1247,7 +1367,6 @@ export const cliToolMappings = pgTable(
|
|
|
1247
1367
|
],
|
|
1248
1368
|
);
|
|
1249
1369
|
|
|
1250
|
-
|
|
1251
1370
|
// Per-(tenant, tool, api_key) settings: whether mappings are active and which
|
|
1252
1371
|
// mode the tool is configured for. Primary key is the composite of all three.
|
|
1253
1372
|
export const cliToolSettings = pgTable(
|
|
@@ -1265,7 +1384,6 @@ export const cliToolSettings = pgTable(
|
|
|
1265
1384
|
(table) => [primaryKey({ columns: [table.tenantId, table.toolId, table.apiKeyId] })],
|
|
1266
1385
|
);
|
|
1267
1386
|
|
|
1268
|
-
|
|
1269
1387
|
// Metadata-only request telemetry. Retention is configured independently of
|
|
1270
1388
|
// payload capture (`CARTETHYIA_TELEMETRY_RETENTION_DAYS`, default 30 days).
|
|
1271
1389
|
// No prompt text, raw body, API key, encrypted-reasoning payload, or generic
|
|
@@ -1414,6 +1532,22 @@ export const telemetryEvents = pgTable(
|
|
|
1414
1532
|
table.accountId,
|
|
1415
1533
|
table.createdAt,
|
|
1416
1534
|
),
|
|
1535
|
+
// Provider usage matrix + `breakdownTelemetry("provider")`: equality on
|
|
1536
|
+
// `provider_id`, range+aggregate on `created_at`. Was served by the
|
|
1537
|
+
// tenant-range index, which scanned every event in the window for one
|
|
1538
|
+
// provider's card.
|
|
1539
|
+
index("telemetry_events_tenant_provider_created_idx").on(
|
|
1540
|
+
table.tenantId,
|
|
1541
|
+
table.providerId,
|
|
1542
|
+
table.createdAt,
|
|
1543
|
+
),
|
|
1544
|
+
// `breakdownTelemetry("model")` (top-model lists): equality on
|
|
1545
|
+
// `requested_model`, range+aggregate on `created_at`.
|
|
1546
|
+
index("telemetry_events_tenant_model_created_idx").on(
|
|
1547
|
+
table.tenantId,
|
|
1548
|
+
table.requestedModel,
|
|
1549
|
+
table.createdAt,
|
|
1550
|
+
),
|
|
1417
1551
|
/**
|
|
1418
1552
|
* Serves the public share page's per-key aggregate (`share-usage.ts`):
|
|
1419
1553
|
* equality on `api_key_id`, range and aggregate on `created_at`. Without
|
|
@@ -1455,7 +1589,7 @@ export const telemetryReconciliationState = pgTable(
|
|
|
1455
1589
|
);
|
|
1456
1590
|
|
|
1457
1591
|
/** Durable aggregates retained after metadata telemetry expires. */
|
|
1458
|
-
|
|
1592
|
+
const TELEMETRY_USAGE_IDENTITY_TYPES = ["account", "api_key"] as const;
|
|
1459
1593
|
export type TelemetryUsageIdentityType = (typeof TELEMETRY_USAGE_IDENTITY_TYPES)[number];
|
|
1460
1594
|
|
|
1461
1595
|
export const telemetryUsageTotals = pgTable(
|
|
@@ -1494,7 +1628,6 @@ export const telemetryUsageTotals = pgTable(
|
|
|
1494
1628
|
],
|
|
1495
1629
|
);
|
|
1496
1630
|
|
|
1497
|
-
|
|
1498
1631
|
export const telemetryPayloads = pgTable(
|
|
1499
1632
|
"telemetry_payloads",
|
|
1500
1633
|
{
|
|
@@ -1537,8 +1670,6 @@ export const telemetryPayloads = pgTable(
|
|
|
1537
1670
|
],
|
|
1538
1671
|
);
|
|
1539
1672
|
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
1673
|
// Daily check-in ledger: one row per (account, calendar day) once the sweep has
|
|
1543
1674
|
// attempted that account's claim.
|
|
1544
1675
|
//
|
|
@@ -1551,7 +1682,9 @@ export const dailyCheckinLedger = pgTable(
|
|
|
1551
1682
|
"daily_checkin_ledger",
|
|
1552
1683
|
{
|
|
1553
1684
|
dayKey: text("day_key").notNull(),
|
|
1554
|
-
accountId: uuid("account_id")
|
|
1685
|
+
accountId: uuid("account_id")
|
|
1686
|
+
.notNull()
|
|
1687
|
+
.references(() => providerAccounts.id, { onDelete: "cascade" }),
|
|
1555
1688
|
claimedAt: timestamp("claimed_at", { withTimezone: true }).notNull().defaultNow(),
|
|
1556
1689
|
},
|
|
1557
1690
|
(table) => [
|
|
@@ -1559,7 +1692,6 @@ export const dailyCheckinLedger = pgTable(
|
|
|
1559
1692
|
],
|
|
1560
1693
|
);
|
|
1561
1694
|
|
|
1562
|
-
|
|
1563
1695
|
/**
|
|
1564
1696
|
* Per-day, per-model credit deductions the buddy billing meter reported.
|
|
1565
1697
|
*
|
|
@@ -33,7 +33,7 @@ const INVALIDATION_CHANNEL = "cartethyia:cache:invalidate";
|
|
|
33
33
|
* collide, and so a `FLUSHDB`-free deploy can drop one namespace without
|
|
34
34
|
* touching another.
|
|
35
35
|
*/
|
|
36
|
-
|
|
36
|
+
type SharedCacheNamespace = "auth" | "preferences" | "credential" | "routing" | "public-models";
|
|
37
37
|
|
|
38
38
|
const NAMESPACE_PREFIX: Readonly<Record<SharedCacheNamespace, string>> = {
|
|
39
39
|
auth: "cartethyia:cache:auth:",
|
|
@@ -50,7 +50,7 @@ const NAMESPACE_PREFIX: Readonly<Record<SharedCacheNamespace, string>> = {
|
|
|
50
50
|
};
|
|
51
51
|
|
|
52
52
|
/** One notice that peers must drop an entry. */
|
|
53
|
-
|
|
53
|
+
interface InvalidationNotice {
|
|
54
54
|
readonly namespace: SharedCacheNamespace;
|
|
55
55
|
/** Omitted means "all keys in the namespace". */
|
|
56
56
|
readonly key?: string;
|
|
@@ -27,7 +27,7 @@ export type SortOrderDb =
|
|
|
27
27
|
* `idColumn`/`sortIndexColumn`, and every caller passes its own schema-typed
|
|
28
28
|
* table plus the two columns.
|
|
29
29
|
*/
|
|
30
|
-
|
|
30
|
+
interface SortOrderTable {
|
|
31
31
|
readonly table: PgTable;
|
|
32
32
|
readonly idColumn: AnyColumn;
|
|
33
33
|
readonly sortIndexColumn: AnyColumn;
|