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.
Files changed (625) hide show
  1. package/.env.example +2 -0
  2. package/README.md +17 -5
  3. package/dist/dashboard/assets/{BannedPage-2TJD37Hb.js → BannedPage-Cj15GsMp.js} +1 -1
  4. package/dist/dashboard/assets/BannedPage-Cj15GsMp.js.gz +0 -0
  5. package/dist/dashboard/assets/ClaimGiftsButton-D83pBJ6J.js +1 -0
  6. package/dist/dashboard/assets/ClaimGiftsButton-D83pBJ6J.js.gz +0 -0
  7. package/dist/dashboard/assets/{CliToolDetailPage-xefJNRmJ.js → CliToolDetailPage-DZKmVuJN.js} +1 -1
  8. package/dist/dashboard/assets/CliToolDetailPage-DZKmVuJN.js.gz +0 -0
  9. package/dist/dashboard/assets/{CliToolsPage-Rj9iHQ3F.js → CliToolsPage-BIccZmeL.js} +1 -1
  10. package/dist/dashboard/assets/CliToolsPage-BIccZmeL.js.gz +0 -0
  11. package/dist/dashboard/assets/CombosPage-DEEKkYD-.js +1 -0
  12. package/dist/dashboard/assets/CombosPage-DEEKkYD-.js.gz +0 -0
  13. package/dist/dashboard/assets/ConsoleLogPage-D5rol2j2.js +1 -0
  14. package/dist/dashboard/assets/ConsoleLogPage-D5rol2j2.js.gz +0 -0
  15. package/dist/dashboard/assets/CustomizationPage-BKj_r0rp.js +1 -0
  16. package/dist/dashboard/assets/CustomizationPage-BKj_r0rp.js.gz +0 -0
  17. package/dist/dashboard/assets/InjectSystemPromptPanel-B5nZvmf0.js +656 -0
  18. package/dist/dashboard/assets/InjectSystemPromptPanel-B5nZvmf0.js.gz +0 -0
  19. package/dist/dashboard/assets/{LoginPage-C4w7vea-.js → LoginPage-DkXb6dx-.js} +1 -1
  20. package/dist/dashboard/assets/LoginPage-DkXb6dx-.js.gz +0 -0
  21. package/dist/dashboard/assets/{ModelPicker-BtPcAfot.js → ModelPicker-DnQPSIA8.js} +1 -1
  22. package/dist/dashboard/assets/ModelPicker-DnQPSIA8.js.gz +0 -0
  23. package/dist/dashboard/assets/OverviewPage-Ci2wQKUz.js +1 -0
  24. package/dist/dashboard/assets/OverviewPage-Ci2wQKUz.js.gz +0 -0
  25. package/dist/dashboard/assets/ProviderDetailPage-odlgYrOg.js +5 -0
  26. package/dist/dashboard/assets/ProviderDetailPage-odlgYrOg.js.gz +0 -0
  27. package/dist/dashboard/assets/ProviderIcon-EfeloBn4.js +1 -0
  28. package/dist/dashboard/assets/ProviderIcon-EfeloBn4.js.gz +0 -0
  29. package/dist/dashboard/assets/ProvidersPage-CqFBQEB8.js +1 -0
  30. package/dist/dashboard/assets/ProvidersPage-CqFBQEB8.js.gz +0 -0
  31. package/dist/dashboard/assets/ProxyPage-5SnUSy3j.js +9 -0
  32. package/dist/dashboard/assets/ProxyPage-5SnUSy3j.js.gz +0 -0
  33. package/dist/dashboard/assets/QuotaPage-CmnMDzhP.js +1 -0
  34. package/dist/dashboard/assets/QuotaPage-CmnMDzhP.js.gz +0 -0
  35. package/dist/dashboard/assets/SettingsPage-BJtRZ4qD.js +1 -0
  36. package/dist/dashboard/assets/SettingsPage-BJtRZ4qD.js.gz +0 -0
  37. package/dist/dashboard/assets/{SetupPage-BQS0Rx_u.js → SetupPage-WTa0sktC.js} +1 -1
  38. package/dist/dashboard/assets/SetupPage-WTa0sktC.js.gz +0 -0
  39. package/dist/dashboard/assets/{StudioPage-TP7voAQ0.js → StudioPage-BfAb5-o_.js} +3 -3
  40. package/dist/dashboard/assets/StudioPage-BfAb5-o_.js.gz +0 -0
  41. package/dist/dashboard/assets/UsagePage-BNzeZ2Vk.js +56 -0
  42. package/dist/dashboard/assets/UsagePage-BNzeZ2Vk.js.gz +0 -0
  43. package/dist/dashboard/assets/api-keys-l29JROPv.js +1 -0
  44. package/dist/dashboard/assets/api-keys-l29JROPv.js.gz +0 -0
  45. package/dist/dashboard/assets/app--PJWq8_C.css +2 -0
  46. package/dist/dashboard/assets/app--PJWq8_C.css.gz +0 -0
  47. package/dist/dashboard/assets/{assert-C0YYuZJ4.js → assert-C0K-c4eo.js} +1 -1
  48. package/dist/dashboard/assets/assert-C0K-c4eo.js.gz +0 -0
  49. package/dist/dashboard/assets/{badge-B_DMpMJN.js → badge-DfbhQU4k.js} +1 -1
  50. package/dist/dashboard/assets/badge-DfbhQU4k.js.gz +0 -0
  51. package/dist/dashboard/assets/{banner-DMrMPmth.js → banner-BllT4LcF.js} +1 -1
  52. package/dist/dashboard/assets/banner-BllT4LcF.js.gz +0 -0
  53. package/dist/dashboard/assets/brand/login_register.jpg +0 -0
  54. package/dist/dashboard/assets/brand/login_register_initial.jpg +0 -0
  55. package/dist/dashboard/assets/brand/og_bansos.jpg +0 -0
  56. package/dist/dashboard/assets/brand/og_image.jpg +0 -0
  57. package/dist/dashboard/assets/{card-Be5Uzamx.js → card-CtkX66Wd.js} +1 -1
  58. package/dist/dashboard/assets/card-CtkX66Wd.js.gz +0 -0
  59. package/dist/dashboard/assets/chevron-left-Bf6CaTSJ.js +1 -0
  60. package/dist/dashboard/assets/chevron-left-Bf6CaTSJ.js.gz +0 -0
  61. package/dist/dashboard/assets/{cli-tools-muFRphDu.js → cli-tools-CQXVMn4P.js} +1 -1
  62. package/dist/dashboard/assets/cli-tools-CQXVMn4P.js.gz +0 -0
  63. package/dist/dashboard/assets/{clipboard-button-DOfrVmsi.js → clipboard-button-BQqBQd2n.js} +1 -1
  64. package/dist/dashboard/assets/clipboard-button-BQqBQd2n.js.gz +0 -0
  65. package/dist/dashboard/assets/{dialog-C9omdjQt.js → dialog-BEK7KP0H.js} +1 -1
  66. package/dist/dashboard/assets/dialog-BEK7KP0H.js.gz +0 -0
  67. package/dist/dashboard/assets/{drawer-Bm8WKaGY.js → drawer-BrTEZ8zu.js} +1 -1
  68. package/dist/dashboard/assets/drawer-BrTEZ8zu.js.gz +0 -0
  69. package/dist/dashboard/assets/entry-CHWxbS56.js +1 -0
  70. package/dist/dashboard/assets/entry-CHWxbS56.js.gz +0 -0
  71. package/dist/dashboard/assets/{entry-q5HwZ8nN.js → entry-EBHJ3DrE.js} +1 -1
  72. package/dist/dashboard/assets/entry-EBHJ3DrE.js.gz +0 -0
  73. package/dist/dashboard/assets/entry-LCS85hiq.js +4 -0
  74. package/dist/dashboard/assets/entry-LCS85hiq.js.gz +0 -0
  75. package/dist/dashboard/assets/{formatters-BTScrQpe.js → formatters-BAACA727.js} +1 -1
  76. package/dist/dashboard/assets/formatters-BAACA727.js.gz +0 -0
  77. package/dist/dashboard/assets/{github-badge-Orjuzemr.js → github-badge-YSCE4UC2.js} +1 -1
  78. package/dist/dashboard/assets/github-badge-YSCE4UC2.js.gz +0 -0
  79. package/dist/dashboard/assets/{index-cPrX5vn6.js → index-FQlj0HUT.js} +2 -2
  80. package/dist/dashboard/assets/index-FQlj0HUT.js.gz +0 -0
  81. package/dist/dashboard/assets/{inline-Dvux8w-0.js → inline-C4gU5iOL.js} +1 -1
  82. package/dist/dashboard/assets/inline-C4gU5iOL.js.gz +0 -0
  83. package/dist/dashboard/assets/{input-CU1Rgf3p.js → input-BHHX_Tmm.js} +1 -1
  84. package/dist/dashboard/assets/input-BHHX_Tmm.js.gz +0 -0
  85. package/dist/dashboard/assets/{layout-C_7A6H55.js → layout-CajrYUnD.js} +1 -1
  86. package/dist/dashboard/assets/{layout-C_7A6H55.js.gz → layout-CajrYUnD.js.gz} +0 -0
  87. package/dist/dashboard/assets/{list-row-CzFvogbj.js → list-row-Bx2I7XUe.js} +1 -1
  88. package/dist/dashboard/assets/list-row-Bx2I7XUe.js.gz +0 -0
  89. package/dist/dashboard/assets/live-DNNqRbj2.js +1 -0
  90. package/dist/dashboard/assets/live-DNNqRbj2.js.gz +0 -0
  91. package/dist/dashboard/assets/minimize-2-BTmMTK4o.js +1 -0
  92. package/dist/dashboard/assets/minimize-2-BTmMTK4o.js.gz +0 -0
  93. package/dist/dashboard/assets/{mutation-JJGQm8TD.js → mutation-Rr0TIvcj.js} +1 -1
  94. package/dist/dashboard/assets/mutation-Rr0TIvcj.js.gz +0 -0
  95. package/dist/dashboard/assets/network-C5UBACrJ.js +1 -0
  96. package/dist/dashboard/assets/network-C5UBACrJ.js.gz +0 -0
  97. package/dist/dashboard/assets/numbers-CUWAZK4J.js +2 -0
  98. package/dist/dashboard/assets/numbers-CUWAZK4J.js.gz +0 -0
  99. package/dist/dashboard/assets/pagination-Xsi9Qx04.js +1 -0
  100. package/dist/dashboard/assets/pagination-Xsi9Qx04.js.gz +0 -0
  101. package/dist/dashboard/assets/{query-keys-CLaNz8Xz.js → query-keys-BloKtaXJ.js} +1 -1
  102. package/dist/dashboard/assets/query-keys-BloKtaXJ.js.gz +0 -0
  103. package/dist/dashboard/assets/quota-DvQbD_sr.js +1 -0
  104. package/dist/dashboard/assets/quota-DvQbD_sr.js.gz +0 -0
  105. package/dist/dashboard/assets/{routing-BEH32QOC.js → routing-in0f_IfK.js} +1 -1
  106. package/dist/dashboard/assets/routing-in0f_IfK.js.gz +0 -0
  107. package/dist/dashboard/assets/{select-B3iTetHN.js → select-BLULNqTp.js} +2 -2
  108. package/dist/dashboard/assets/select-BLULNqTp.js.gz +0 -0
  109. package/dist/dashboard/assets/settings-CcGczj6I.js +1 -0
  110. package/dist/dashboard/assets/settings-CcGczj6I.js.gz +0 -0
  111. package/dist/dashboard/assets/shield-BMQNxORh.js +1 -0
  112. package/dist/dashboard/assets/shield-BMQNxORh.js.gz +0 -0
  113. package/dist/dashboard/assets/{stack-KrOrm7JZ.js → stack-D2lIR0tg.js} +1 -1
  114. package/dist/dashboard/assets/stack-D2lIR0tg.js.gz +0 -0
  115. package/dist/dashboard/assets/{state-DLS7IDMy.js → state-DTARjfiW.js} +1 -1
  116. package/dist/dashboard/assets/state-DTARjfiW.js.gz +0 -0
  117. package/dist/dashboard/assets/{switch-42ItvbAs.js → switch-c0oPSnqW.js} +1 -1
  118. package/dist/dashboard/assets/switch-c0oPSnqW.js.gz +0 -0
  119. package/dist/dashboard/assets/{useMutation-Dmnfh1Ue.js → useMutation-m8WGNPrz.js} +1 -1
  120. package/dist/dashboard/assets/useMutation-m8WGNPrz.js.gz +0 -0
  121. package/dist/dashboard/console-backgrounds.jpg +0 -0
  122. package/dist/dashboard/console-backgrounds_initial.jpg +0 -0
  123. package/dist/dashboard/index.html +2 -2
  124. package/dist/dashboard/index.html.gz +0 -0
  125. package/dist/dashboard/precompressed-assets.json +59 -57
  126. package/migrations/full-postgres/0027_qoder_identity_genuine_seed.sql +9 -10
  127. package/migrations/full-postgres/0032_add_provider_pool_accounts.sql +53 -0
  128. package/migrations/full-postgres/0033_add_api_key_ban.sql +9 -0
  129. package/migrations/full-postgres/0034_add_api_key_ban_until.sql +7 -0
  130. package/migrations/full-postgres/0035_align_pool_account_status_enum.sql +21 -0
  131. package/migrations/full-postgres/0036_system_prompt_presets_refs.sql +10 -0
  132. package/migrations/full-postgres/0037_share_concurrency_scope.sql +3 -0
  133. package/migrations/full-postgres/0038_add_accounts_quota_snapshot.sql +7 -0
  134. package/migrations/full-postgres/0039_add_telemetry_provider_model_indexes.sql +13 -0
  135. package/migrations/full-postgres/0040_add_models_dialect.sql +3 -0
  136. package/migrations/full-postgres/0041_add_daily_checkin_ledger_account_fk.sql +7 -0
  137. package/migrations/lite-sqlite3/0027_qoder_identity_genuine_seed.sql +9 -10
  138. package/migrations/lite-sqlite3/0032_add_provider_pool_accounts.sql +44 -0
  139. package/migrations/lite-sqlite3/0033_add_api_key_ban.sql +8 -0
  140. package/migrations/lite-sqlite3/0034_add_api_key_ban_until.sql +5 -0
  141. package/migrations/lite-sqlite3/0035_align_pool_account_status_enum.sql +6 -0
  142. package/migrations/lite-sqlite3/0036_system_prompt_presets_refs.sql +14 -0
  143. package/migrations/lite-sqlite3/0037_share_concurrency_scope.sql +3 -0
  144. package/migrations/lite-sqlite3/0038_add_accounts_quota_snapshot.sql +4 -0
  145. package/migrations/lite-sqlite3/0039_add_telemetry_provider_model_indexes.sql +6 -0
  146. package/migrations/lite-sqlite3/0040_add_models_dialect.sql +3 -0
  147. package/migrations/lite-sqlite3/0041_add_daily_checkin_ledger_account_fk.sql +26 -0
  148. package/package.json +4 -5
  149. package/scripts/cli/update.ts +15 -41
  150. package/src/boot/app.ts +67 -10
  151. package/src/boot/dependencies.ts +786 -732
  152. package/src/boot/lifecycle.ts +11 -12
  153. package/src/config/cooldowns.ts +34 -55
  154. package/src/config/network.ts +8 -4
  155. package/src/config/package-paths.ts +1 -1
  156. package/src/config/providers.ts +13 -14
  157. package/src/config/resources.ts +0 -5
  158. package/src/config/runtime.ts +2 -5
  159. package/src/config/spec.ts +26 -6
  160. package/src/console/api-keys/ban-constants.ts +38 -0
  161. package/src/console/api-keys/contracts.ts +92 -31
  162. package/src/console/api-keys/routes.ts +131 -6
  163. package/src/console/audit/routes.ts +3 -3
  164. package/src/console/auth/access.ts +4 -4
  165. package/src/console/auth/account-reset.ts +5 -5
  166. package/src/console/auth/audit-recorder.ts +1 -1
  167. package/src/console/auth/lockout.ts +7 -3
  168. package/src/console/auth/row-coercion.ts +57 -12
  169. package/src/console/auth/session-resolver.ts +1 -1
  170. package/src/console/auth/session-service.ts +8 -2
  171. package/src/console/auth/session.ts +40 -34
  172. package/src/console/auth/setup-service.ts +4 -3
  173. package/src/console/auth/user-store.ts +1 -1
  174. package/src/console/backup/9router-map.ts +0 -3
  175. package/src/console/backup/contracts.ts +11 -9
  176. package/src/console/backup/export-endpoint.ts +11 -12
  177. package/src/console/backup/nine-router.ts +1 -7
  178. package/src/console/backup/routes.ts +32 -36
  179. package/src/console/backup/service.ts +468 -468
  180. package/src/console/backup/store.ts +47 -29
  181. package/src/console/backup/validate.ts +11 -1
  182. package/src/console/cli-tools/contracts.ts +7 -7
  183. package/src/console/cli-tools/injectors/cline.ts +110 -110
  184. package/src/console/cli-tools/injectors/codex.ts +181 -181
  185. package/src/console/cli-tools/injectors/copilot.ts +108 -108
  186. package/src/console/cli-tools/injectors/driver.ts +247 -247
  187. package/src/console/cli-tools/injectors/jcode.ts +115 -115
  188. package/src/console/cli-tools/injectors/openclaw.ts +161 -161
  189. package/src/console/cli-tools/injectors/opencode.ts +153 -153
  190. package/src/console/cli-tools/routes.ts +4 -4
  191. package/src/console/cli-tools/service.ts +1 -1
  192. package/src/console/cli-tools/store.ts +2 -2
  193. package/src/console/console-router-guards.ts +2 -2
  194. package/src/console/console-router.ts +36 -4
  195. package/src/console/dashboard-assets.ts +9 -9
  196. package/src/console/data-management/routes.ts +3 -3
  197. package/src/console/domain-registration.ts +18 -4
  198. package/src/console/inferhub/client.ts +0 -7
  199. package/src/console/inferhub/key-store.ts +1 -1
  200. package/src/console/inferhub/normalize.ts +2 -2
  201. package/src/console/inferhub/routes.ts +1 -1
  202. package/src/console/inferhub/types.ts +1 -1
  203. package/src/console/observability/contracts.ts +5 -1
  204. package/src/console/observability/live.ts +34 -21
  205. package/src/console/observability/logs.ts +4 -4
  206. package/src/console/observability/performance.ts +3 -3
  207. package/src/console/observability/routes.ts +3 -3
  208. package/src/console/observability/sse.ts +62 -8
  209. package/src/console/observability/store.ts +36 -20
  210. package/src/console/providers/catalog/catalog-projections.ts +1 -1
  211. package/src/console/providers/catalog/contracts.ts +82 -22
  212. package/src/console/providers/catalog/model-operations.ts +1 -1
  213. package/src/console/providers/catalog/provider-operations.ts +110 -17
  214. package/src/console/providers/catalog/public-model-store.ts +0 -0
  215. package/src/console/providers/catalog/routes.ts +30 -6
  216. package/src/console/providers/catalog/store-helpers.ts +349 -326
  217. package/src/console/providers/catalog/store.ts +1662 -1292
  218. package/src/console/providers/detail/routes.ts +4 -4
  219. package/src/console/providers/oauth/callback-listener.ts +100 -18
  220. package/src/console/providers/oauth/routes.ts +95 -16
  221. package/src/console/quota/account-quota-global.ts +41 -3
  222. package/src/console/quota/account-quota-shared.ts +10 -3
  223. package/src/console/quota/account-quota-tenant.ts +285 -67
  224. package/src/console/quota/account-test-egress.ts +4 -4
  225. package/src/console/quota/daily-growth-job.ts +308 -0
  226. package/src/console/quota/native-identity.ts +2 -2
  227. package/src/console/quota/quota-view.ts +1 -1
  228. package/src/console/remote-support/routes.ts +1 -1
  229. package/src/console/remote-support/service.ts +2 -2
  230. package/src/console/routing/model/contracts.ts +1 -1
  231. package/src/console/routing/model/routes.ts +3 -3
  232. package/src/console/routing/pools/contracts.ts +13 -10
  233. package/src/console/routing/pools/import-parse.ts +3 -3
  234. package/src/console/routing/pools/operations.ts +14 -7
  235. package/src/console/routing/pools/probe-verdict.ts +8 -3
  236. package/src/console/routing/pools/relay-deploy.ts +12 -12
  237. package/src/console/routing/pools/routes.ts +3 -3
  238. package/src/console/routing/pools/store.ts +21 -1
  239. package/src/console/settings/contracts.ts +29 -2
  240. package/src/console/settings/routes.ts +3 -3
  241. package/src/console/settings/store.ts +20 -0
  242. package/src/console/share/share-router.ts +112 -44
  243. package/src/console/share/share-stats.ts +109 -39
  244. package/src/console/share/share-usage.ts +1 -1
  245. package/src/console/shared/errors.ts +2 -2
  246. package/src/console/shared/object.ts +18 -0
  247. package/src/console/shared/read-through-cache.ts +42 -6
  248. package/src/console/shared/transaction.ts +14 -0
  249. package/src/console/system-prompt/contracts.ts +89 -12
  250. package/src/console/system-prompt/routes.ts +98 -45
  251. package/src/console/updates/apply-update.ts +244 -0
  252. package/src/console/updates/routes.ts +256 -98
  253. package/src/main.ts +11 -5
  254. package/src/network/http2-bidi.ts +1 -1
  255. package/src/network/ip-utils.ts +298 -0
  256. package/src/network/outbound-fetch.ts +76 -5
  257. package/src/network/pool/agent.ts +7 -6
  258. package/src/network/pool/byte-accounting.ts +1 -1
  259. package/src/network/pool/resolver.ts +55 -51
  260. package/src/network/pool/selector.ts +150 -136
  261. package/src/network/pool-cooldown-store.ts +71 -16
  262. package/src/network/pool-health-machine.ts +22 -2
  263. package/src/network/rate-limit-verdict.ts +68 -0
  264. package/src/network/retry.ts +1 -1
  265. package/src/network/ssrf.ts +24 -75
  266. package/src/observability/event-log.ts +2 -2
  267. package/src/observability/event-query.ts +286 -214
  268. package/src/observability/log-sanitize.ts +1 -1
  269. package/src/observability/metrics.ts +4 -4
  270. package/src/observability/payload-capture.ts +6 -5
  271. package/src/observability/payload-store.ts +1 -1
  272. package/src/observability/runtime-metrics.ts +1 -1
  273. package/src/observability/telemetry-buffer.ts +12 -3
  274. package/src/observability/telemetry-reconciliation.ts +3 -3
  275. package/src/observability/telemetry-status.ts +1 -1
  276. package/src/observability/token-speed.ts +1 -1
  277. package/src/persistence/connection-url.ts +1 -1
  278. package/src/persistence/db-handle.ts +1 -1
  279. package/src/persistence/db-pg.ts +2 -2
  280. package/src/persistence/db-sqlite.ts +10 -5
  281. package/src/persistence/dialect.ts +5 -1
  282. package/src/persistence/readiness.ts +19 -7
  283. package/src/persistence/redis.ts +1 -1
  284. package/src/persistence/schema.ts +177 -45
  285. package/src/persistence/shared-cache.ts +2 -2
  286. package/src/persistence/sort-order.ts +1 -1
  287. package/src/persistence/stores/api-key-store.ts +109 -4
  288. package/src/persistence/stores/share-store.ts +20 -8
  289. package/src/persistence/stores/telemetry-store.ts +1 -1
  290. package/src/persistence/system-prompt-store.ts +63 -18
  291. package/src/persistence/tenant-preferences.ts +1 -1
  292. package/src/persistence/ttl-cache.ts +3 -3
  293. package/src/persistence/usage-flush.ts +7 -2
  294. package/src/protocol/canonical-model.ts +1 -1
  295. package/src/protocol/codecs.ts +12 -16
  296. package/src/protocol/dsml.ts +3 -49
  297. package/src/protocol/gateway-error.ts +6 -3
  298. package/src/protocol/image-clamp.ts +2 -2
  299. package/src/protocol/image-generation.ts +2 -2
  300. package/src/protocol/reasoning-text.ts +1 -1
  301. package/src/protocol/reasoning.ts +7 -52
  302. package/src/protocol/registry.ts +50 -15
  303. package/src/protocol/request/chat.ts +46 -19
  304. package/src/protocol/request/codex.ts +1 -1
  305. package/src/protocol/request/messages.ts +46 -14
  306. package/src/protocol/request/responses.ts +19 -10
  307. package/src/protocol/response/chat.ts +27 -12
  308. package/src/protocol/response/codex.ts +2 -2
  309. package/src/protocol/response/gemini.ts +1 -1
  310. package/src/protocol/response/messages.ts +6 -6
  311. package/src/protocol/response/omp-tool-call-markup.ts +1 -1
  312. package/src/protocol/response/responses.ts +3 -3
  313. package/src/protocol/sse-decoder.ts +64 -4
  314. package/src/protocol/stop-reason.ts +2 -2
  315. package/src/protocol/think-split.ts +347 -0
  316. package/src/protocol/translation/attachment-integrity.ts +3 -3
  317. package/src/protocol/translation/cache-controls.ts +8 -20
  318. package/src/protocol/translation/capabilities.ts +8 -8
  319. package/src/protocol/translation/dialect/deepseek.ts +10 -0
  320. package/src/protocol/translation/dialect/inband.ts +39 -0
  321. package/src/protocol/translation/dialect/model-thinking.ts +89 -0
  322. package/src/protocol/translation/dialect/qwen.ts +114 -0
  323. package/src/protocol/translation/dialect/resolver.ts +83 -0
  324. package/src/protocol/translation/dialect/rules.ts +93 -0
  325. package/src/protocol/translation/dialect/thinking-ladder.ts +245 -0
  326. package/src/protocol/translation/dialect/types.ts +58 -0
  327. package/src/protocol/translation/quirks.ts +18 -4
  328. package/src/protocol/translation/thinking.ts +12 -252
  329. package/src/protocol/translation/tool-id.ts +3 -3
  330. package/src/protocol/translation/tool-repair.ts +1 -1
  331. package/src/protocol/upstream/post-json.ts +6 -1
  332. package/src/protocol/upstream/send-claude-messages.ts +3 -3
  333. package/src/providers/adapters/base-adapter.ts +1 -1
  334. package/src/providers/adapters/compatible-adapter.ts +44 -5
  335. package/src/providers/authentication/jwt-validator.ts +0 -5
  336. package/src/providers/authentication/oauth-client.ts +254 -253
  337. package/src/providers/authentication/oauth-flow-store.ts +42 -7
  338. package/src/providers/authentication/oauth-refresh-service.ts +2 -2
  339. package/src/providers/bundled-discovery-providers.ts +6 -30
  340. package/src/providers/configured-openai-providers.ts +82 -97
  341. package/src/providers/configured-provider.ts +1 -1
  342. package/src/providers/default-registry.ts +23 -35
  343. package/src/providers/discovery/catalog/catalog-format.ts +13 -2
  344. package/src/providers/discovery/discovery-types.ts +0 -1
  345. package/src/providers/discovery/openai-model-discovery.ts +2 -2
  346. package/src/providers/discovery/probe-phases.ts +50 -15
  347. package/src/providers/discovery/probing-service.ts +18 -20
  348. package/src/providers/integrations/agentrouter/agentrouter.ts +14 -5
  349. package/src/providers/integrations/alibabacp/alibabacp.ts +2 -2
  350. package/src/providers/integrations/anthropic.ts +4 -11
  351. package/src/providers/integrations/antigravity/antigravity-oauth.ts +0 -1
  352. package/src/providers/integrations/antigravity/antigravity-protocol.ts +0 -14
  353. package/src/providers/integrations/antigravity/antigravity.ts +15 -26
  354. package/src/providers/integrations/buddy/buddy-catalog-shared.ts +2 -2
  355. package/src/providers/integrations/buddy/buddy-chat-shared.ts +20 -4
  356. package/src/providers/integrations/buddy/buddy-cli-headers.ts +19 -52
  357. package/src/providers/integrations/buddy/buddy-discovery-shared.ts +37 -6
  358. package/src/providers/integrations/buddy/buddy-identity.ts +108 -1
  359. package/src/providers/integrations/buddy/buddy-media.ts +16 -16
  360. package/src/providers/integrations/buddy/buddy-oauth-shared.ts +1 -1
  361. package/src/providers/integrations/buddy/codebuddy/cn-provider.ts +1 -2
  362. package/src/providers/integrations/buddy/codebuddy/provider.ts +5 -16
  363. package/src/providers/integrations/buddy/codebuddy/shared.ts +30 -9
  364. package/src/providers/integrations/buddy/workbuddy/provider.ts +6 -10
  365. package/src/providers/integrations/buddy/workbuddy/shared.ts +21 -3
  366. package/src/providers/integrations/claude/claude-betas.ts +1 -1
  367. package/src/providers/integrations/claude/claude-cch.ts +148 -148
  368. package/src/providers/integrations/claude/claude-credentials.ts +1 -1
  369. package/src/providers/integrations/claude/claude-slow-lane-retry.ts +1 -1
  370. package/src/providers/integrations/claude/claude.ts +3 -10
  371. package/src/providers/integrations/claude/fallback-credit.ts +3 -7
  372. package/src/providers/integrations/cline/cline.ts +2 -2
  373. package/src/providers/integrations/cloudflareai/cloudflareai.ts +4 -7
  374. package/src/providers/integrations/codex/codex-device-code.ts +101 -101
  375. package/src/providers/integrations/codex/codex-errors.ts +1 -1
  376. package/src/providers/integrations/codex/codex-oauth.ts +0 -1
  377. package/src/providers/integrations/codex/codex.ts +14 -15
  378. package/src/providers/integrations/commandcode/commandcode.ts +76 -116
  379. package/src/providers/integrations/commandcode/quota.ts +132 -48
  380. package/src/providers/integrations/cursor/cursor-http2.ts +11 -14
  381. package/src/providers/integrations/cursor/cursor-quota.ts +2 -6
  382. package/src/providers/integrations/cursor/cursor-request.ts +0 -87
  383. package/src/providers/integrations/cursor/cursor-shared.ts +0 -4
  384. package/src/providers/integrations/cursor/cursor.ts +53 -20
  385. package/src/providers/integrations/cursor/protocol/framing.ts +0 -56
  386. package/src/providers/integrations/cursor/protocol/messages.ts +0 -96
  387. package/src/providers/integrations/factory/factory.ts +13 -13
  388. package/src/providers/integrations/gemini.ts +11 -11
  389. package/src/providers/integrations/github/github-discovery.ts +55 -10
  390. package/src/providers/integrations/github/github-oauth.ts +6 -5
  391. package/src/providers/integrations/github/github.ts +47 -20
  392. package/src/providers/integrations/grok/grok-oauth.ts +261 -261
  393. package/src/providers/integrations/grok/grok-quota-frame.ts +1 -1
  394. package/src/providers/integrations/grok/grok-quota.ts +16 -7
  395. package/src/providers/integrations/grok/grok-ratelimit-store.ts +0 -5
  396. package/src/providers/integrations/grok/grok-ratelimit.ts +3 -0
  397. package/src/providers/integrations/grok/grok.ts +88 -42
  398. package/src/providers/integrations/inferhub.ts +4 -11
  399. package/src/providers/integrations/kilo/kilo-oauth.ts +1 -1
  400. package/src/providers/integrations/kimi/kimi.ts +4 -11
  401. package/src/providers/integrations/kiro/kiro-cache.ts +31 -0
  402. package/src/providers/integrations/kiro/kiro-catalog.ts +31 -5
  403. package/src/providers/integrations/kiro/kiro-discovery.ts +47 -43
  404. package/src/providers/integrations/kiro/kiro-machine-id.ts +6 -3
  405. package/src/providers/integrations/kiro/kiro-oauth.ts +523 -255
  406. package/src/providers/integrations/kiro/kiro-quota.ts +35 -47
  407. package/src/providers/integrations/kiro/kiro-request.ts +8 -11
  408. package/src/providers/integrations/kiro/kiro-stream.ts +13 -0
  409. package/src/providers/integrations/kiro/kiro.ts +91 -78
  410. package/src/providers/integrations/muse/muse-oauth.ts +0 -1
  411. package/src/providers/integrations/muse/muse-quota.ts +0 -4
  412. package/src/providers/integrations/muse/muse.ts +6 -9
  413. package/src/providers/integrations/opencode/fingerprint.ts +7 -5
  414. package/src/providers/integrations/opencode/provider.ts +17 -24
  415. package/src/providers/integrations/perplexity.ts +2 -2
  416. package/src/providers/integrations/qoder/qoder-catalog.ts +132 -17
  417. package/src/providers/integrations/qoder/qoder-checkin.ts +26 -8
  418. package/src/providers/integrations/qoder/qoder-native-identity-store.ts +9 -8
  419. package/src/providers/integrations/qoder/qoder-oauth.ts +165 -25
  420. package/src/providers/integrations/qoder/qoder-quota.ts +48 -6
  421. package/src/providers/integrations/qoder/qoder-realm.ts +22 -28
  422. package/src/providers/integrations/qoder/qoder-sse.ts +159 -0
  423. package/src/providers/integrations/qoder/qoder-umid.ts +33 -38
  424. package/src/providers/integrations/qoder/qoder-virtual.ts +14 -2
  425. package/src/providers/integrations/qoder/qoder.ts +521 -63
  426. package/src/providers/integrations/shared/connect.ts +0 -54
  427. package/src/providers/integrations/shared/hash.ts +15 -0
  428. package/src/providers/integrations/shared/session-cache.ts +136 -0
  429. package/src/providers/integrations/tokenharbor.ts +2 -2
  430. package/src/providers/integrations/trae/trae-cache.ts +7 -87
  431. package/src/providers/integrations/trae/trae-catalog.ts +1 -6
  432. package/src/providers/integrations/trae/trae-protocol.ts +17 -8
  433. package/src/providers/integrations/trae/trae-realm.ts +0 -7
  434. package/src/providers/integrations/trae/trae.ts +59 -19
  435. package/src/providers/integrations/xai/xai-oauth.ts +5 -5
  436. package/src/providers/integrations/zcode/oauth.ts +1 -1
  437. package/src/providers/integrations/zcode-start-plan/gifts.ts +265 -0
  438. package/src/providers/integrations/zcode-start-plan/oauth.ts +154 -0
  439. package/src/providers/integrations/zcode-start-plan/provider.ts +131 -0
  440. package/src/providers/integrations/zcode-start-plan/quota.ts +152 -0
  441. package/src/providers/integrations/zcode-start-plan/zcode_prompt.json +10 -0
  442. package/src/providers/operations/account-error-classification.ts +131 -116
  443. package/src/providers/operations/account-health-service.ts +31 -39
  444. package/src/providers/operations/account-reset-service.ts +58 -1
  445. package/src/providers/operations/cli-platform.ts +31 -5
  446. package/src/providers/operations/client-version-resolver.ts +4 -6
  447. package/src/providers/operations/client-versions.ts +10 -7
  448. package/src/providers/operations/provider-catalog-seeder.ts +2 -0
  449. package/src/providers/operations/provider-catalog-service.ts +22 -6
  450. package/src/providers/operations/provider-credential-service.ts +35 -6
  451. package/src/providers/operations/upstream-deadline.ts +3 -3
  452. package/src/providers/provider-contracts.ts +65 -10
  453. package/src/providers/provider-credential-resolver.ts +1 -1
  454. package/src/providers/provider-metadata.ts +17 -2
  455. package/src/providers/provider-model-definition.ts +22 -1
  456. package/src/providers/provider-probe.ts +4 -2
  457. package/src/providers/provider-registry.ts +4 -4
  458. package/src/providers/provider-usage.ts +81 -16
  459. package/src/providers/quota/cache.ts +29 -0
  460. package/src/providers/quota/quota-contracts.ts +28 -10
  461. package/src/providers/quota/refresh.ts +29 -6
  462. package/src/providers/quota/snapshot.ts +94 -0
  463. package/src/providers/search/search-provider.ts +6 -8
  464. package/src/providers/search/search-providers.ts +2 -1
  465. package/src/security/abuse.ts +8 -8
  466. package/src/security/admission/reasons.ts +17 -17
  467. package/src/security/admission/service.ts +2 -2
  468. package/src/security/admission/ttl.ts +61 -61
  469. package/src/security/api-key-auth.ts +20 -8
  470. package/src/security/client-router-fingerprint.ts +4 -4
  471. package/src/security/credential-codec.ts +3 -3
  472. package/src/security/csrf.ts +2 -2
  473. package/src/security/ip-boundary.ts +16 -189
  474. package/src/security/model-access-rule.ts +1 -1
  475. package/src/security/outbound-headers.ts +18 -0
  476. package/src/shared/coerce.ts +19 -0
  477. package/src/shared/invoke-guard.ts +47 -0
  478. package/src/transport/contracts.ts +13 -4
  479. package/src/transport/dispatch/attempt-finalize.ts +5 -4
  480. package/src/transport/dispatch/attempt-loop.ts +10 -7
  481. package/src/transport/dispatch/capture-policy.ts +34 -37
  482. package/src/transport/dispatch/empty-stream.ts +28 -25
  483. package/src/transport/dispatch/generation.ts +33 -53
  484. package/src/transport/dispatch/leases.ts +8 -8
  485. package/src/transport/dispatch/native-shared.ts +127 -0
  486. package/src/transport/dispatch/proxy-request.ts +10 -8
  487. package/src/transport/dispatch/responses-compact.ts +35 -56
  488. package/src/transport/dispatch/retry-policy.ts +4 -67
  489. package/src/transport/dispatch/stream-bridge.ts +1 -1
  490. package/src/transport/dispatch/streaming/encoder.ts +18 -72
  491. package/src/transport/dispatch/streaming/finalize.ts +11 -10
  492. package/src/transport/dispatch/streaming/stream.ts +7 -3
  493. package/src/transport/dispatch/streaming/thinking-loop.ts +1 -1
  494. package/src/transport/dispatch/systemone.ts +27 -55
  495. package/src/transport/dispatch/token-count.ts +49 -46
  496. package/src/transport/dispatch/websearch.ts +24 -50
  497. package/src/transport/drain-endpoint.ts +3 -3
  498. package/src/transport/failure-policy.ts +19 -6
  499. package/src/transport/guards/auth-guard.ts +6 -11
  500. package/src/transport/guards/body-policy.ts +7 -7
  501. package/src/transport/guards/error-lifecycle.ts +18 -3
  502. package/src/transport/guards/guard-errors.ts +7 -3
  503. package/src/transport/guards/headroom-guard.ts +2 -2
  504. package/src/transport/guards/pipeline.ts +7 -7
  505. package/src/transport/guards/readiness-guard.ts +16 -2
  506. package/src/transport/guards/request-context.ts +15 -20
  507. package/src/transport/request/preparer.ts +306 -27
  508. package/src/transport/request/rtk/compress-request.ts +3 -3
  509. package/src/transport/request/rtk/rtk-constants.ts +2 -2
  510. package/src/transport/request/rtk/rtk-filters.ts +8 -8
  511. package/src/transport/request/state.ts +5 -20
  512. package/src/transport/request/system-prompt-injection.ts +74 -11
  513. package/src/transport/request/tenant-preferences.ts +22 -0
  514. package/src/transport/routing/candidate-index.ts +2 -2
  515. package/src/transport/routing/round-robin.ts +1 -1
  516. package/src/transport/routing/route-catalog.ts +113 -19
  517. package/src/transport/routing/route-model.ts +131 -38
  518. package/src/transport/routing/router.ts +154 -39
  519. package/src/transport/shutdown-notice.ts +21 -9
  520. package/src/transport/surface/adapters.ts +3 -3
  521. package/src/transport/surface/chat/encode.ts +7 -7
  522. package/src/transport/surface/chat/parse.ts +7 -7
  523. package/src/transport/surface/completion.ts +3 -3
  524. package/src/transport/surface/content-parts.ts +1 -1
  525. package/src/transport/surface/dialects.ts +2 -2
  526. package/src/transport/surface/messages/encode.ts +1 -1
  527. package/src/transport/surface/messages/parse.ts +3 -3
  528. package/src/transport/surface/responses/adapter.ts +1 -1
  529. package/src/transport/surface/responses/errors.ts +0 -9
  530. package/src/transport/vision-handoff-cache.ts +58 -0
  531. package/src/transport/vision-handoff.ts +376 -0
  532. package/src/workers/account-identity-sweep.ts +2 -2
  533. package/src/workers/buddy-growth-tasks.ts +392 -346
  534. package/src/workers/daily-checkin.ts +102 -49
  535. package/src/workers/maintenance-lease.ts +2 -35
  536. package/src/workers/oauth-refresh-sweep.ts +8 -1
  537. package/src/workers/quota-refresh-sweep.ts +120 -82
  538. package/src/workers/scheduler.ts +67 -4
  539. package/src/workers/sweep-runner.ts +24 -5
  540. package/src/workers/zcode-gift-claim.ts +108 -0
  541. package/dist/dashboard/assets/AccountCooldown-Bjo92Qat.js +0 -1
  542. package/dist/dashboard/assets/AccountCooldown-Bjo92Qat.js.gz +0 -0
  543. package/dist/dashboard/assets/BannedPage-2TJD37Hb.js.gz +0 -0
  544. package/dist/dashboard/assets/CliToolDetailPage-xefJNRmJ.js.gz +0 -0
  545. package/dist/dashboard/assets/CliToolsPage-Rj9iHQ3F.js.gz +0 -0
  546. package/dist/dashboard/assets/CombosPage-JEbYJFxw.js +0 -1
  547. package/dist/dashboard/assets/CombosPage-JEbYJFxw.js.gz +0 -0
  548. package/dist/dashboard/assets/ConsoleLogPage-C3xx_inM.js +0 -1
  549. package/dist/dashboard/assets/ConsoleLogPage-C3xx_inM.js.gz +0 -0
  550. package/dist/dashboard/assets/CustomizationPage-Dw306gJU.js +0 -1
  551. package/dist/dashboard/assets/CustomizationPage-Dw306gJU.js.gz +0 -0
  552. package/dist/dashboard/assets/HealthEventsModal-jaBo1TWV.js +0 -1
  553. package/dist/dashboard/assets/HealthEventsModal-jaBo1TWV.js.gz +0 -0
  554. package/dist/dashboard/assets/LoginPage-C4w7vea-.js.gz +0 -0
  555. package/dist/dashboard/assets/ModelPicker-BtPcAfot.js.gz +0 -0
  556. package/dist/dashboard/assets/OverviewPage-CGC5gNs1.js +0 -1
  557. package/dist/dashboard/assets/OverviewPage-CGC5gNs1.js.gz +0 -0
  558. package/dist/dashboard/assets/ProviderDetailPage-DQcthNGt.js +0 -4
  559. package/dist/dashboard/assets/ProviderDetailPage-DQcthNGt.js.gz +0 -0
  560. package/dist/dashboard/assets/ProviderIcon-FB6yS4v1.js +0 -1
  561. package/dist/dashboard/assets/ProviderIcon-FB6yS4v1.js.gz +0 -0
  562. package/dist/dashboard/assets/ProvidersPage-0OsXRGXe.js +0 -1
  563. package/dist/dashboard/assets/ProvidersPage-0OsXRGXe.js.gz +0 -0
  564. package/dist/dashboard/assets/ProxyPage-DdPc8slb.js +0 -9
  565. package/dist/dashboard/assets/ProxyPage-DdPc8slb.js.gz +0 -0
  566. package/dist/dashboard/assets/QuotaPage-Ci5O4BnH.js +0 -1
  567. package/dist/dashboard/assets/QuotaPage-Ci5O4BnH.js.gz +0 -0
  568. package/dist/dashboard/assets/SettingsPage-CDZjTt87.js +0 -1
  569. package/dist/dashboard/assets/SettingsPage-CDZjTt87.js.gz +0 -0
  570. package/dist/dashboard/assets/SetupPage-BQS0Rx_u.js.gz +0 -0
  571. package/dist/dashboard/assets/SortableList-BAL5npBC.js +0 -1
  572. package/dist/dashboard/assets/SortableList-BAL5npBC.js.gz +0 -0
  573. package/dist/dashboard/assets/StudioPage-TP7voAQ0.js.gz +0 -0
  574. package/dist/dashboard/assets/UsagePage-Cj_fEzhg.js +0 -56
  575. package/dist/dashboard/assets/UsagePage-Cj_fEzhg.js.gz +0 -0
  576. package/dist/dashboard/assets/api-keys-MbI7e7rt.js +0 -1
  577. package/dist/dashboard/assets/api-keys-MbI7e7rt.js.gz +0 -0
  578. package/dist/dashboard/assets/app-B2vyPoII.css +0 -2
  579. package/dist/dashboard/assets/app-B2vyPoII.css.gz +0 -0
  580. package/dist/dashboard/assets/assert-C0YYuZJ4.js.gz +0 -0
  581. package/dist/dashboard/assets/badge-B_DMpMJN.js.gz +0 -0
  582. package/dist/dashboard/assets/banner-DMrMPmth.js.gz +0 -0
  583. package/dist/dashboard/assets/card-Be5Uzamx.js.gz +0 -0
  584. package/dist/dashboard/assets/cli-tools-muFRphDu.js.gz +0 -0
  585. package/dist/dashboard/assets/clipboard-button-DOfrVmsi.js.gz +0 -0
  586. package/dist/dashboard/assets/dialog-C9omdjQt.js.gz +0 -0
  587. package/dist/dashboard/assets/drawer-Bm8WKaGY.js.gz +0 -0
  588. package/dist/dashboard/assets/entry-DS90gUks.js +0 -1
  589. package/dist/dashboard/assets/entry-DS90gUks.js.gz +0 -0
  590. package/dist/dashboard/assets/entry-j40LJotO.js +0 -4
  591. package/dist/dashboard/assets/entry-j40LJotO.js.gz +0 -0
  592. package/dist/dashboard/assets/entry-q5HwZ8nN.js.gz +0 -0
  593. package/dist/dashboard/assets/formatters-BTScrQpe.js.gz +0 -0
  594. package/dist/dashboard/assets/github-badge-Orjuzemr.js.gz +0 -0
  595. package/dist/dashboard/assets/index-cPrX5vn6.js.gz +0 -0
  596. package/dist/dashboard/assets/inline-Dvux8w-0.js.gz +0 -0
  597. package/dist/dashboard/assets/input-CU1Rgf3p.js.gz +0 -0
  598. package/dist/dashboard/assets/list-row-CzFvogbj.js.gz +0 -0
  599. package/dist/dashboard/assets/live-KaG15HLQ.js +0 -1
  600. package/dist/dashboard/assets/live-KaG15HLQ.js.gz +0 -0
  601. package/dist/dashboard/assets/minimize-2-D-MN8W8a.js +0 -1
  602. package/dist/dashboard/assets/minimize-2-D-MN8W8a.js.gz +0 -0
  603. package/dist/dashboard/assets/mutation-JJGQm8TD.js.gz +0 -0
  604. package/dist/dashboard/assets/numbers-BNDZnsUE.js +0 -2
  605. package/dist/dashboard/assets/numbers-BNDZnsUE.js.gz +0 -0
  606. package/dist/dashboard/assets/query-keys-CLaNz8Xz.js.gz +0 -0
  607. package/dist/dashboard/assets/quota-DZGyp0N5.js +0 -1
  608. package/dist/dashboard/assets/quota-DZGyp0N5.js.gz +0 -0
  609. package/dist/dashboard/assets/routing-BEH32QOC.js.gz +0 -0
  610. package/dist/dashboard/assets/select-B3iTetHN.js.gz +0 -0
  611. package/dist/dashboard/assets/settings-Dt3Eqbnq.js +0 -1
  612. package/dist/dashboard/assets/settings-Dt3Eqbnq.js.gz +0 -0
  613. package/dist/dashboard/assets/stack-KrOrm7JZ.js.gz +0 -0
  614. package/dist/dashboard/assets/state-DLS7IDMy.js.gz +0 -0
  615. package/dist/dashboard/assets/stream-retry-5QnVuSSo.js +0 -1
  616. package/dist/dashboard/assets/stream-retry-5QnVuSSo.js.gz +0 -0
  617. package/dist/dashboard/assets/switch-42ItvbAs.js.gz +0 -0
  618. package/dist/dashboard/assets/useMutation-Dmnfh1Ue.js.gz +0 -0
  619. package/src/network/response-headers.ts +0 -39
  620. package/src/protocol/response/dsml.ts +0 -38
  621. package/src/providers/integrations/xiaomi-mimo/think-stream.ts +0 -229
  622. /package/dist/dashboard/assets/{app-wvwCi4Eh.js → app-Bgd3zANQ.js} +0 -0
  623. /package/dist/dashboard/assets/{app-wvwCi4Eh.js.gz → app-Bgd3zANQ.js.gz} +0 -0
  624. /package/dist/dashboard/assets/brand/{og_bansos.webp → og_bansos_initial.webp} +0 -0
  625. /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
- export const TENANT_STATUSES = ["active", "suspended", "deleted"] as const;
9
- export type TenantStatus = (typeof TENANT_STATUSES)[number];
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
- export function tenantRefNullable() {
43
+ function tenantRefNullable() {
30
44
  return uuid("tenant_id").references(() => tenants.id, { onDelete: "cascade" });
31
45
  }
32
46
 
33
- export function tenantRefRequired() {
47
+ function tenantRefRequired() {
34
48
  return uuid("tenant_id")
35
49
  .notNull()
36
50
  .references(() => tenants.id, { onDelete: "cascade" });
37
51
  }
38
52
 
39
- export function tenantRefPrimaryKey() {
53
+ function tenantRefPrimaryKey() {
40
54
  return uuid("tenant_id")
41
55
  .primaryKey()
42
56
  .references(() => tenants.id, { onDelete: "cascade" });
43
57
  }
44
58
 
45
- export function tenantCascadeSetNull() {
59
+ function tenantCascadeSetNull() {
46
60
  return uuid("tenant_id").references(() => tenants.id, { onDelete: "set null" });
47
61
  }
48
62
 
49
- export function createdAtColumn() {
63
+ function createdAtColumn() {
50
64
  return timestamp("created_at", { withTimezone: true }).notNull().defaultNow();
51
65
  }
52
66
 
53
- export function updatedAtColumn() {
67
+ function updatedAtColumn() {
54
68
  return timestamp("updated_at", { withTimezone: true }).notNull().defaultNow();
55
69
  }
56
70
 
57
- export function timestampColumns() {
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
- export function healthColumns() {
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 server gates the
192
- * daily 100-credit campaign on a *genuine, non-VM* device identity, so each
193
- * account gets its own minted seed (a distinct "device").
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 the per-account device material
198
- * and must never be shared between accounts. `machineToken` is the unique
199
- * device key: two accounts sharing a token are the same device to the server.
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
- * `.skills/cartethyia-reverse-engineering/references/codebuddy-dispatch-headers.md`.
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
- export const SHARE_LINK_KINDS = ["enroll", "handoff"] as const;
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 keyed by
1187
- // providerId and `providerId::modelId` respectively — see
1188
- // `src/console/system-prompt/contracts.ts` for the value shapes and the
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").PromptSetting | null>(),
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").ProviderPromptEntry>>(),
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").PromptSetting>>(),
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
- export const TELEMETRY_USAGE_IDENTITY_TYPES = ["account", "api_key"] as const;
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").notNull(),
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
- export type SharedCacheNamespace = "auth" | "preferences" | "credential" | "routing" | "public-models";
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
- export interface InvalidationNotice {
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
- export interface SortOrderTable {
30
+ interface SortOrderTable {
31
31
  readonly table: PgTable;
32
32
  readonly idColumn: AnyColumn;
33
33
  readonly sortIndexColumn: AnyColumn;