@opengeni/api-router 3.0.1 → 3.1.2

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 (546) hide show
  1. package/dist/access-grant-rls.d.ts +8 -1
  2. package/dist/admission-trace.d.ts +8 -0
  3. package/dist/app.d.ts +50 -3
  4. package/dist/app.js +10 -1
  5. package/dist/artifact-catalog-cursor.d.ts +1 -0
  6. package/dist/attached-browser-viewer.d.ts +11 -0
  7. package/dist/auth/managed-auth-attempt-context.d.ts +2 -0
  8. package/dist/auth/managed-auth-rate-limits.d.ts +167 -0
  9. package/dist/auth/managed-auth-session-adapter.d.ts +9 -1
  10. package/dist/auth/managed-auth.d.ts +72 -5
  11. package/dist/auth/managed-sign-in-notifications.d.ts +4 -0
  12. package/dist/auth/new-signups-gate.d.ts +23 -0
  13. package/dist/auth/signup-funnel-metrics.d.ts +44 -0
  14. package/dist/azure-live.d.ts +28 -0
  15. package/dist/browser-action-fences.d.ts +13 -0
  16. package/dist/browser-controller-authority.d.ts +1 -61
  17. package/dist/browser-ephemeral.d.ts +5 -0
  18. package/dist/browser-lost-runtime-end.d.ts +24 -0
  19. package/dist/browser-state-authority.d.ts +1 -27
  20. package/dist/chunk-OGQDXVXY.js +18 -0
  21. package/dist/chunk-OGQDXVXY.js.map +1 -0
  22. package/dist/{chunk-AJ62T5QN.js → chunk-OT56OY4V.js} +80503 -39869
  23. package/dist/chunk-OT56OY4V.js.map +1 -0
  24. package/dist/claude-default-models.d.ts +19 -0
  25. package/dist/claude-subscription-core.d.ts +50 -0
  26. package/dist/claude-subscription-oauth.d.ts +36 -0
  27. package/dist/claude-subscription-profile.d.ts +9 -0
  28. package/dist/claude-subscription-usage.d.ts +6 -0
  29. package/dist/claude-workspace-connection.d.ts +15 -0
  30. package/dist/codemode.d.ts +40 -5
  31. package/dist/codex-realtime.d.ts +29 -3
  32. package/dist/codex-session-pointers.d.ts +19 -0
  33. package/dist/connection-ownership.d.ts +6 -3
  34. package/dist/controller-data-plane.d.ts +16 -0
  35. package/dist/credit-promotion-snapshot.d.ts +6 -0
  36. package/dist/editable-artifact-source-session.d.ts +3 -0
  37. package/dist/editable-artifact-websocket.d.ts +5 -3
  38. package/dist/fatal-process-boundary.d.ts +9 -1
  39. package/dist/github-access.d.ts +7 -1
  40. package/dist/github-browser-flow.d.ts +1 -1
  41. package/dist/http/acting-person.d.ts +36 -0
  42. package/dist/http/api-contract-compat.d.ts +19 -0
  43. package/dist/http/api-error.d.ts +50 -1
  44. package/dist/http/auth.d.ts +8 -1
  45. package/dist/http/cors.d.ts +12 -0
  46. package/dist/http/deprecation.d.ts +42 -0
  47. package/dist/http/keyed-admission.d.ts +12 -0
  48. package/dist/http/local-browser-boundary.d.ts +72 -0
  49. package/dist/http/metrics-listener.d.ts +22 -0
  50. package/dist/http/path-identifier.d.ts +17 -0
  51. package/dist/http/registered-route-label.d.ts +16 -0
  52. package/dist/http/rejection-telemetry.d.ts +34 -0
  53. package/dist/http/request-body.d.ts +27 -0
  54. package/dist/http/request-source.d.ts +41 -3
  55. package/dist/http/sse.d.ts +12 -1
  56. package/dist/http/unmatched-route.d.ts +18 -0
  57. package/dist/http/user-content.d.ts +36 -0
  58. package/dist/http/variable-sets-removed.d.ts +41 -0
  59. package/dist/http/websocket-upgrade-dispatch.d.ts +18 -0
  60. package/dist/index.js +1279 -108
  61. package/dist/index.js.map +1 -1
  62. package/dist/integration-connect-metrics.d.ts +35 -0
  63. package/dist/integration-endpoint-test.d.ts +20 -0
  64. package/dist/integrations/api-integrations.d.ts +2 -2
  65. package/dist/integrations/atlassian.d.ts +8 -3
  66. package/dist/integrations/fiken.d.ts +3 -1
  67. package/dist/integrations/github-lens-connect.d.ts +37 -66
  68. package/dist/integrations/google-drive.d.ts +2 -0
  69. package/dist/integrations/integration-commit-authority.d.ts +13 -0
  70. package/dist/integrations/marketplace-plugin.d.ts +43 -43
  71. package/dist/integrations/oauth-client.d.ts +171 -12
  72. package/dist/integrations/oauth-profiles.d.ts +42 -13
  73. package/dist/integrations/onepassword-vault-provider.d.ts +9 -0
  74. package/dist/integrations/slack-bot.d.ts +285 -7
  75. package/dist/integrations/slack-file-upload-flow.d.ts +62 -0
  76. package/dist/integrations/slack-interactions.d.ts +89 -10
  77. package/dist/integrations/slack-mrkdwn.d.ts +41 -0
  78. package/dist/integrations/slack-routing.d.ts +1 -1
  79. package/dist/integrations/slack-session-defaults.d.ts +58 -0
  80. package/dist/integrations/slack-task-file-upload.d.ts +36 -0
  81. package/dist/integrations/slack-tool-review.d.ts +5 -0
  82. package/dist/interaction-agent-access.d.ts +13 -8
  83. package/dist/interaction-agent-version.d.ts +21 -0
  84. package/dist/interaction-holder-heartbeat.d.ts +5 -0
  85. package/dist/interaction-metrics.d.ts +27 -2
  86. package/dist/interaction-route-stages.d.ts +25 -0
  87. package/dist/interaction-secrets-vault.d.ts +20 -0
  88. package/dist/interaction-secrets.d.ts +103 -0
  89. package/dist/mcp/action-catalog-types.d.ts +14 -0
  90. package/dist/mcp/action-catalog.gen.d.ts +2 -0
  91. package/dist/mcp/action-descriptions.d.ts +4 -0
  92. package/dist/mcp/action-schema-imports.gen.d.ts +1 -0
  93. package/dist/mcp/capability-account-readiness.d.ts +7 -0
  94. package/dist/mcp/child-read-evidence.d.ts +9 -0
  95. package/dist/mcp/company-profile-agent-admin.d.ts +12 -0
  96. package/dist/mcp/contract-input.d.ts +13 -0
  97. package/dist/mcp/documents.d.ts +2 -0
  98. package/dist/mcp/first-party-tool-permissions.d.ts +3 -606
  99. package/dist/mcp/notification-tools.d.ts +26 -0
  100. package/dist/mcp/orchestration-failure-diagnostic.d.ts +43 -0
  101. package/dist/mcp/scheduled-task-input.d.ts +1309 -0
  102. package/dist/mcp/scheduled-task-view.d.ts +217 -3
  103. package/dist/mcp/secret-tools.d.ts +14 -0
  104. package/dist/mcp/server.d.ts +108 -5
  105. package/dist/mcp/session-admin-access-tools.d.ts +33 -0
  106. package/dist/mcp/session-event-errors.d.ts +28 -0
  107. package/dist/mcp/session-event-view.d.ts +62 -0
  108. package/dist/mcp/session-view.d.ts +15 -0
  109. package/dist/mcp/session-wait.d.ts +18 -0
  110. package/dist/mcp/site-agent-clamp-tools.d.ts +38 -0
  111. package/dist/mcp/site-data-tools.d.ts +22 -0
  112. package/dist/mcp/site-publication-tools.d.ts +19 -0
  113. package/dist/mcp/site-sql-tools.d.ts +27 -0
  114. package/dist/mcp-oauth.d.ts +37 -4
  115. package/dist/model-calls/chat-completions.d.ts +87 -0
  116. package/dist/model-calls/pending-usage-settlements.d.ts +57 -0
  117. package/dist/model-calls/service.d.ts +36 -0
  118. package/dist/model-catalog.d.ts +9 -3
  119. package/dist/native-push-dispatch.d.ts +69 -0
  120. package/dist/observability.d.ts +3 -1
  121. package/dist/organization-mcp.d.ts +82 -0
  122. package/dist/prepared-mcp-actor.d.ts +77 -0
  123. package/dist/prepared-mcp-permissions.d.ts +8 -0
  124. package/dist/routes/analytics-consent.d.ts +26 -0
  125. package/dist/routes/api-integrations.d.ts +11 -0
  126. package/dist/routes/api-keys.d.ts +7 -7
  127. package/dist/routes/automations.d.ts +2 -0
  128. package/dist/routes/billing.d.ts +59 -0
  129. package/dist/routes/browser-sessions.d.ts +65 -2
  130. package/dist/routes/chat-completions.d.ts +11 -0
  131. package/dist/routes/claude-core-usage.d.ts +20 -0
  132. package/dist/routes/claude-subscription-accounts.d.ts +3 -0
  133. package/dist/routes/claude-subscription-oauth.d.ts +3 -0
  134. package/dist/routes/client-errors.d.ts +182 -0
  135. package/dist/routes/codex-core.d.ts +401 -0
  136. package/dist/routes/codex.d.ts +64 -2
  137. package/dist/routes/computer-sessions.d.ts +6 -1
  138. package/dist/routes/desktop-distribution.d.ts +32 -0
  139. package/dist/routes/github-browser-fonts.gen.d.ts +2 -0
  140. package/dist/routes/github-browser-pages.d.ts +27 -0
  141. package/dist/routes/inbox.d.ts +13 -0
  142. package/dist/routes/insights-response-cache.d.ts +10 -0
  143. package/dist/routes/insights-usage.d.ts +12 -0
  144. package/dist/routes/insights.d.ts +28 -0
  145. package/dist/routes/interaction-placement-message.d.ts +7 -0
  146. package/dist/routes/managed-sign-in-methods.d.ts +6 -0
  147. package/dist/routes/model-account-choice.d.ts +13 -0
  148. package/dist/routes/model-account-settings.d.ts +19 -0
  149. package/dist/routes/native-app-auth.d.ts +12 -0
  150. package/dist/routes/organization-integration-policy.d.ts +8 -0
  151. package/dist/routes/organization-integrations.d.ts +6 -0
  152. package/dist/routes/organization-mcp-connections.d.ts +3 -0
  153. package/dist/routes/organization-model-defaults.d.ts +9 -0
  154. package/dist/routes/organization-service-accounts.d.ts +3 -0
  155. package/dist/routes/personal-api-keys.d.ts +3 -0
  156. package/dist/routes/session-admin-access.d.ts +3 -0
  157. package/dist/routes/session-artifact-associations.d.ts +4 -0
  158. package/dist/routes/session-history-imports.d.ts +20 -0
  159. package/dist/routes/sessions.d.ts +38 -2
  160. package/dist/routes/site-data.d.ts +18 -0
  161. package/dist/routes/site-publishing.d.ts +5 -0
  162. package/dist/routes/site-runtime.d.ts +31 -0
  163. package/dist/routes/site-sql.d.ts +16 -0
  164. package/dist/routes/slack-bot-access.d.ts +3 -0
  165. package/dist/routes/subscription-account-pools.d.ts +21 -0
  166. package/dist/routes/subscription-core-http.d.ts +5 -0
  167. package/dist/routes/subscription-pool-access.d.ts +37 -0
  168. package/dist/routes/subscription-pool-core.d.ts +153 -0
  169. package/dist/routes/supergrok.d.ts +6 -6
  170. package/dist/routes/usage-allowances.d.ts +12 -0
  171. package/dist/routes/variable-sets-removed.d.ts +2 -0
  172. package/dist/routes/vault-providers.d.ts +34 -0
  173. package/dist/routes/vaults.d.ts +3 -0
  174. package/dist/routes/workspace-integrations.d.ts +35 -0
  175. package/dist/routes/workspace-model-providers.d.ts +4 -0
  176. package/dist/routes/workspaces.d.ts +11 -2
  177. package/dist/sandbox/agent-update.d.ts +64 -0
  178. package/dist/sandbox/auth-callout.d.ts +8 -0
  179. package/dist/sandbox/channel-a.d.ts +15 -1
  180. package/dist/sandbox/enrollment.d.ts +26 -4
  181. package/dist/sandbox/machine-audience.d.ts +29 -0
  182. package/dist/sandbox/machines.d.ts +15 -2
  183. package/dist/sandbox/metrics-ingestion.d.ts +6 -2
  184. package/dist/sandbox/screen-control.d.ts +85 -0
  185. package/dist/sandbox/viewer.d.ts +5 -1
  186. package/dist/sandbox-file-artifacts.d.ts +17 -1
  187. package/dist/scheduled-task-blockers.d.ts +39 -0
  188. package/dist/scheduled-task-deletion.d.ts +3 -4
  189. package/dist/scheduled-task-lifecycle.d.ts +14 -0
  190. package/dist/secret-answers.d.ts +40 -0
  191. package/dist/session-create-observability.d.ts +5 -0
  192. package/dist/session-event-view-36GO3IL7.js +528 -0
  193. package/dist/session-event-view-36GO3IL7.js.map +1 -0
  194. package/dist/signed-state-secret.d.ts +18 -0
  195. package/dist/site-agent-guard.d.ts +53 -0
  196. package/dist/site-data/operations.d.ts +103 -0
  197. package/dist/site-data/service.d.ts +203 -0
  198. package/dist/site-frame-guard.d.ts +32 -0
  199. package/dist/site-publishing/agent-data-tools.d.ts +84 -0
  200. package/dist/site-publishing/agent-model.d.ts +58 -0
  201. package/dist/site-publishing/agent-session.d.ts +16 -0
  202. package/dist/site-publishing/content-scanner.d.ts +31 -0
  203. package/dist/site-publishing/edge-sync.d.ts +48 -0
  204. package/dist/site-publishing/gateway-signature.d.ts +56 -0
  205. package/dist/site-publishing/limits.d.ts +63 -0
  206. package/dist/site-publishing/page-tool-authority.d.ts +30 -0
  207. package/dist/site-publishing/platform-usage.d.ts +113 -0
  208. package/dist/site-publishing/platform.d.ts +21 -0
  209. package/dist/site-publishing/readiness.d.ts +62 -0
  210. package/dist/site-publishing/runtime.d.ts +179 -0
  211. package/dist/site-publishing/service.d.ts +264 -0
  212. package/dist/site-publishing/session-events.d.ts +22 -0
  213. package/dist/site-publishing/session-views.d.ts +36 -0
  214. package/dist/site-publishing/viewer.d.ts +40 -0
  215. package/dist/site-session-origin.d.ts +31 -6
  216. package/dist/site-sql/format.d.ts +47 -0
  217. package/dist/site-sql/gateway.d.ts +50 -0
  218. package/dist/site-sql/service.d.ts +213 -0
  219. package/dist/temporal-schedule-sync.d.ts +26 -0
  220. package/dist/transcription/billing-refusal.d.ts +8 -0
  221. package/dist/transcription/normalize.d.ts +23 -0
  222. package/dist/transcription/providers/azure-mai.d.ts +12 -0
  223. package/dist/transcription/providers/azure-openai.d.ts +4 -0
  224. package/dist/transcription/providers/openai.d.ts +16 -0
  225. package/dist/transcription/providers/subscription-core.d.ts +39 -0
  226. package/dist/transcription/service.d.ts +10 -1
  227. package/dist/transcription/wav-duration.d.ts +8 -0
  228. package/dist/workspace-tool-gateway-attestations.d.ts +37 -0
  229. package/dist/workspace-tool-gateway-observability.d.ts +16 -0
  230. package/dist/workspace-tool-gateway-secrets.d.ts +27 -0
  231. package/dist/workspace-tool-gateway.d.ts +102 -6
  232. package/dist/workspace-tool-target-fence.d.ts +116 -0
  233. package/dist/workspace-tool-target.d.ts +225 -0
  234. package/dist/workspace-webhook-dispatch.d.ts +26 -0
  235. package/dist/xai-subscription-core.d.ts +60 -0
  236. package/package.json +25 -20
  237. package/src/access-grant-rls.ts +64 -14
  238. package/src/admission-trace.ts +14 -0
  239. package/src/app.ts +1684 -252
  240. package/src/artifact-catalog-cursor.ts +1 -0
  241. package/src/attached-browser-viewer.ts +26 -0
  242. package/src/auth/managed-auth-attempt-context.ts +9 -0
  243. package/src/auth/managed-auth-rate-limits.ts +252 -0
  244. package/src/auth/managed-auth-session-adapter.ts +64 -29
  245. package/src/auth/managed-auth.ts +303 -35
  246. package/src/auth/managed-email.ts +18 -1
  247. package/src/auth/managed-sign-in-notifications.ts +81 -0
  248. package/src/auth/new-signups-gate.ts +49 -0
  249. package/src/auth/organization-user-setup.ts +3 -3
  250. package/src/auth/signup-funnel-metrics.ts +164 -0
  251. package/src/azure-live.ts +103 -0
  252. package/src/browser-action-fences.ts +45 -0
  253. package/src/browser-controller-authority.ts +1 -186
  254. package/src/browser-ephemeral.ts +39 -0
  255. package/src/browser-lost-runtime-end.ts +71 -0
  256. package/src/browser-state-authority.ts +1 -236
  257. package/src/claude-default-models.ts +37 -0
  258. package/src/claude-subscription-core.ts +154 -0
  259. package/src/claude-subscription-oauth.ts +352 -0
  260. package/src/claude-subscription-profile.ts +73 -0
  261. package/src/claude-subscription-usage.ts +51 -0
  262. package/src/claude-workspace-connection.ts +82 -0
  263. package/src/codemode.ts +236 -39
  264. package/src/codex-realtime.ts +181 -53
  265. package/src/codex-session-pointers.ts +80 -0
  266. package/src/company-brain-okf.ts +1 -1
  267. package/src/connected-machine-computer-access.ts +2 -1
  268. package/src/connection-ownership.ts +19 -13
  269. package/src/controller-data-plane.ts +34 -0
  270. package/src/credit-promotion-snapshot.ts +36 -0
  271. package/src/editable-artifact-production.ts +10 -0
  272. package/src/editable-artifact-source-session.ts +123 -0
  273. package/src/editable-artifact-websocket.ts +16 -3
  274. package/src/fatal-process-boundary.ts +67 -3
  275. package/src/gateway-realtime.ts +12 -8
  276. package/src/github-access.ts +31 -5
  277. package/src/github-browser-flow.ts +1 -1
  278. package/src/http/acting-person.ts +105 -0
  279. package/src/http/api-contract-compat.ts +49 -0
  280. package/src/http/api-error.ts +210 -2
  281. package/src/http/auth.ts +68 -4
  282. package/src/http/cors.ts +37 -5
  283. package/src/http/deprecation.ts +118 -0
  284. package/src/http/keyed-admission.ts +29 -0
  285. package/src/http/local-browser-boundary.ts +343 -0
  286. package/src/http/metrics-listener.ts +57 -0
  287. package/src/http/path-identifier.ts +54 -0
  288. package/src/http/registered-route-label.ts +34 -0
  289. package/src/http/rejection-telemetry.ts +120 -0
  290. package/src/http/request-body.ts +127 -0
  291. package/src/http/request-source.ts +154 -13
  292. package/src/http/sse.ts +88 -28
  293. package/src/http/unmatched-route.ts +60 -0
  294. package/src/http/user-content.ts +158 -0
  295. package/src/http/variable-sets-removed.ts +122 -0
  296. package/src/http/websocket-upgrade-dispatch.ts +29 -0
  297. package/src/index.ts +107 -57
  298. package/src/integration-connect-metrics.ts +228 -0
  299. package/src/integration-endpoint-test.ts +291 -0
  300. package/src/integrations/api-integrations.ts +81 -7
  301. package/src/integrations/atlassian.ts +202 -83
  302. package/src/integrations/fiken.ts +66 -38
  303. package/src/integrations/github-app-connect.ts +64 -18
  304. package/src/integrations/github-lens-connect.ts +8 -29
  305. package/src/integrations/google-drive.ts +448 -152
  306. package/src/integrations/integration-commit-authority.ts +69 -0
  307. package/src/integrations/marketplace-plugin.ts +1 -1
  308. package/src/integrations/oauth-client.ts +733 -193
  309. package/src/integrations/oauth-profiles.ts +116 -45
  310. package/src/integrations/onepassword-vault-provider.ts +16 -0
  311. package/src/integrations/personal-github-repositories.ts +1 -1
  312. package/src/integrations/personal-github.ts +61 -35
  313. package/src/integrations/provider-oauth.ts +67 -85
  314. package/src/integrations/slack-app-home.ts +5 -5
  315. package/src/integrations/slack-bot.ts +893 -201
  316. package/src/integrations/slack-file-upload-flow.ts +147 -0
  317. package/src/integrations/slack-install.ts +7 -7
  318. package/src/integrations/slack-interactions.ts +1589 -299
  319. package/src/integrations/slack-mrkdwn.ts +193 -0
  320. package/src/integrations/slack-routing.ts +2 -2
  321. package/src/integrations/slack-session-defaults.ts +224 -0
  322. package/src/integrations/slack-task-file-upload.ts +323 -0
  323. package/src/integrations/slack-tool-review.ts +65 -0
  324. package/src/integrations/social-oauth.ts +90 -58
  325. package/src/interaction-agent-access.ts +40 -20
  326. package/src/interaction-agent-version.ts +85 -0
  327. package/src/interaction-holder-heartbeat.ts +24 -8
  328. package/src/interaction-metrics.ts +164 -2
  329. package/src/interaction-route-stages.ts +94 -0
  330. package/src/interaction-secrets-vault.ts +213 -0
  331. package/src/interaction-secrets.ts +426 -0
  332. package/src/mcp/action-catalog-types.ts +14 -0
  333. package/src/mcp/action-catalog.gen.ts +8014 -0
  334. package/src/mcp/action-descriptions.ts +299 -0
  335. package/src/mcp/action-schema-imports.gen.ts +304 -0
  336. package/src/mcp/capability-account-readiness.ts +17 -0
  337. package/src/mcp/child-read-evidence.ts +19 -0
  338. package/src/mcp/company-profile-agent-admin.ts +13 -0
  339. package/src/mcp/contract-input.ts +165 -0
  340. package/src/mcp/documents.ts +9 -2
  341. package/src/mcp/editable-artifacts.ts +29 -11
  342. package/src/mcp/files.ts +5 -1
  343. package/src/mcp/first-party-tool-permissions.ts +7 -285
  344. package/src/mcp/knowledge-entries.ts +108 -34
  345. package/src/mcp/notification-tools.ts +480 -0
  346. package/src/mcp/orchestration-failure-diagnostic.ts +43 -0
  347. package/src/mcp/scheduled-task-input.ts +89 -0
  348. package/src/mcp/scheduled-task-view.ts +63 -3
  349. package/src/mcp/secret-tools.ts +185 -0
  350. package/src/mcp/server.ts +2213 -1116
  351. package/src/mcp/session-admin-access-tools.ts +163 -0
  352. package/src/mcp/session-event-errors.ts +123 -0
  353. package/src/mcp/session-event-view.ts +395 -13
  354. package/src/mcp/session-view.ts +3 -0
  355. package/src/mcp/session-wait.ts +67 -7
  356. package/src/mcp/site-agent-clamp-tools.ts +140 -0
  357. package/src/mcp/site-data-tools.ts +339 -0
  358. package/src/mcp/site-publication-tools.ts +201 -0
  359. package/src/mcp/site-sql-tools.ts +427 -0
  360. package/src/mcp-oauth.ts +635 -45
  361. package/src/model-calls/chat-completions.ts +352 -0
  362. package/src/model-calls/pending-usage-settlements.ts +125 -0
  363. package/src/model-calls/service.ts +694 -0
  364. package/src/model-catalog.ts +68 -17
  365. package/src/native-push-dispatch.ts +457 -0
  366. package/src/observability.ts +15 -1
  367. package/src/organization-mcp.ts +485 -0
  368. package/src/prepared-mcp-actor.ts +154 -0
  369. package/src/prepared-mcp-permissions.ts +38 -0
  370. package/src/routes/analytics-consent.ts +123 -0
  371. package/src/routes/api-integrations.ts +268 -9
  372. package/src/routes/api-keys.ts +164 -25
  373. package/src/routes/artifact-catalog.ts +111 -0
  374. package/src/routes/automations.ts +163 -90
  375. package/src/routes/billing.ts +535 -59
  376. package/src/routes/browser-sessions.ts +966 -342
  377. package/src/routes/canonical-human-identities.ts +61 -0
  378. package/src/routes/capabilities.ts +112 -5
  379. package/src/routes/channels.ts +4 -3
  380. package/src/routes/chat-completions.ts +235 -0
  381. package/src/routes/claude-core-usage.ts +147 -0
  382. package/src/routes/claude-subscription-accounts.ts +233 -0
  383. package/src/routes/claude-subscription-oauth.ts +175 -0
  384. package/src/routes/client-errors.ts +394 -0
  385. package/src/routes/codex-core.ts +687 -0
  386. package/src/routes/codex.ts +1277 -1119
  387. package/src/routes/company-brain.ts +4 -0
  388. package/src/routes/computer-sessions.ts +319 -85
  389. package/src/routes/connect.ts +277 -175
  390. package/src/routes/connections.ts +690 -363
  391. package/src/routes/desktop-distribution.ts +217 -0
  392. package/src/routes/documents.ts +13 -7
  393. package/src/routes/editable-artifacts.ts +74 -4
  394. package/src/routes/enrollments.ts +110 -16
  395. package/src/routes/external-identity-links.ts +13 -12
  396. package/src/routes/files.ts +41 -16
  397. package/src/routes/github-browser-fonts.gen.ts +12 -0
  398. package/src/routes/github-browser-pages.ts +258 -0
  399. package/src/routes/github.ts +200 -75
  400. package/src/routes/inbox.ts +353 -0
  401. package/src/routes/insights-response-cache.ts +83 -0
  402. package/src/routes/insights-usage.ts +345 -0
  403. package/src/routes/insights.ts +103 -8
  404. package/src/routes/install.ts +51 -10
  405. package/src/routes/integration-facets.ts +70 -28
  406. package/src/routes/interaction-placement-message.ts +12 -0
  407. package/src/routes/knowledge.ts +136 -27
  408. package/src/routes/machines.ts +189 -135
  409. package/src/routes/managed-auth-session-sets.ts +43 -10
  410. package/src/routes/managed-onboarding.ts +39 -19
  411. package/src/routes/managed-sign-in-methods.ts +433 -0
  412. package/src/routes/memory-slack-publications.ts +3 -2
  413. package/src/routes/model-account-choice.ts +194 -0
  414. package/src/routes/model-account-settings.ts +235 -0
  415. package/src/routes/model-connection-access.ts +210 -48
  416. package/src/routes/native-app-auth.ts +296 -0
  417. package/src/routes/organization-integration-policy.ts +116 -0
  418. package/src/routes/organization-integrations.ts +326 -0
  419. package/src/routes/organization-mcp-connections.ts +183 -0
  420. package/src/routes/organization-memberships.ts +205 -19
  421. package/src/routes/organization-model-defaults.ts +110 -0
  422. package/src/routes/organization-model-providers.ts +74 -3
  423. package/src/routes/organization-service-accounts.ts +128 -0
  424. package/src/routes/organization-sessions.ts +21 -5
  425. package/src/routes/personal-api-keys.ts +184 -0
  426. package/src/routes/personal-github-git-broker.ts +2 -2
  427. package/src/routes/personal-github.ts +9 -4
  428. package/src/routes/plugins.ts +46 -7
  429. package/src/routes/pr-review-github.ts +105 -118
  430. package/src/routes/pr-review.ts +88 -82
  431. package/src/routes/preference-registry.ts +18 -0
  432. package/src/routes/rigs.ts +48 -13
  433. package/src/routes/scheduled-tasks.ts +347 -27
  434. package/src/routes/session-admin-access.ts +271 -0
  435. package/src/routes/session-artifact-associations.ts +164 -0
  436. package/src/routes/session-history-imports.ts +305 -0
  437. package/src/routes/sessions.ts +1682 -363
  438. package/src/routes/site-data.ts +340 -0
  439. package/src/routes/site-publishing.ts +584 -0
  440. package/src/routes/site-runtime.ts +1944 -0
  441. package/src/routes/site-sql.ts +263 -0
  442. package/src/routes/skill-content.ts +72 -7
  443. package/src/routes/skills.ts +5 -4
  444. package/src/routes/slack-bot-access.ts +108 -0
  445. package/src/routes/social.ts +27 -15
  446. package/src/routes/subscription-account-pools.ts +209 -0
  447. package/src/routes/subscription-core-http.ts +18 -0
  448. package/src/routes/subscription-pool-access.ts +180 -0
  449. package/src/routes/subscription-pool-core.ts +552 -0
  450. package/src/routes/supergrok.ts +174 -655
  451. package/src/routes/transcription-recordings.ts +71 -4
  452. package/src/routes/transcriptions.ts +26 -2
  453. package/src/routes/usage-allowances.ts +381 -0
  454. package/src/routes/variable-sets-removed.ts +19 -0
  455. package/src/routes/vault-providers.ts +782 -0
  456. package/src/routes/vaults.ts +421 -0
  457. package/src/routes/video-generation.ts +30 -12
  458. package/src/routes/workspace-artifacts.ts +165 -53
  459. package/src/routes/workspace-integrations.ts +576 -0
  460. package/src/routes/workspace-model-providers.ts +148 -0
  461. package/src/routes/workspace-state.ts +4 -0
  462. package/src/routes/workspaces.ts +625 -117
  463. package/src/sandbox/agent-update.ts +315 -0
  464. package/src/sandbox/auth-callout.ts +104 -21
  465. package/src/sandbox/channel-a.ts +165 -55
  466. package/src/sandbox/enrollment.ts +131 -22
  467. package/src/sandbox/machine-audience.ts +192 -0
  468. package/src/sandbox/machines.ts +75 -31
  469. package/src/sandbox/metrics-ingestion.ts +133 -2
  470. package/src/sandbox/rematerialize.ts +51 -21
  471. package/src/sandbox/screen-control.ts +289 -0
  472. package/src/sandbox/viewer.ts +33 -58
  473. package/src/sandbox-file-artifacts.ts +53 -27
  474. package/src/scheduled-task-blockers.ts +293 -0
  475. package/src/scheduled-task-deletion.ts +13 -3
  476. package/src/scheduled-task-lifecycle.ts +84 -0
  477. package/src/secret-answers.ts +119 -0
  478. package/src/session-create-observability.ts +46 -0
  479. package/src/session-realtime-context.ts +26 -4
  480. package/src/signed-state-secret.ts +58 -0
  481. package/src/site-agent-guard.ts +261 -0
  482. package/src/site-data/operations.ts +777 -0
  483. package/src/site-data/service.ts +1043 -0
  484. package/src/site-frame-guard.ts +107 -0
  485. package/src/site-publishing/agent-data-tools.ts +250 -0
  486. package/src/site-publishing/agent-model.ts +127 -0
  487. package/src/site-publishing/agent-session.ts +148 -0
  488. package/src/site-publishing/content-scanner.ts +93 -0
  489. package/src/site-publishing/edge-sync.ts +148 -0
  490. package/src/site-publishing/gateway-signature.ts +198 -0
  491. package/src/site-publishing/limits.ts +315 -0
  492. package/src/site-publishing/page-tool-authority.ts +111 -0
  493. package/src/site-publishing/platform-usage.ts +479 -0
  494. package/src/site-publishing/platform.ts +98 -0
  495. package/src/site-publishing/readiness.ts +330 -0
  496. package/src/site-publishing/runtime.ts +831 -0
  497. package/src/site-publishing/service.ts +1282 -0
  498. package/src/site-publishing/session-events.ts +262 -0
  499. package/src/site-publishing/session-views.ts +262 -0
  500. package/src/site-publishing/viewer.ts +75 -0
  501. package/src/site-session-origin.ts +91 -6
  502. package/src/site-sql/format.ts +134 -0
  503. package/src/site-sql/gateway.ts +168 -0
  504. package/src/site-sql/service.ts +1636 -0
  505. package/src/site-uploads.ts +27 -5
  506. package/src/temporal-schedule-sync.ts +74 -0
  507. package/src/transcription/billing-refusal.ts +14 -0
  508. package/src/transcription/normalize.ts +77 -0
  509. package/src/transcription/providers/azure-mai.ts +98 -0
  510. package/src/transcription/providers/azure-openai.ts +16 -7
  511. package/src/transcription/providers/codex-subscription.ts +190 -67
  512. package/src/transcription/providers/openai.ts +79 -5
  513. package/src/transcription/providers/subscription-core.ts +125 -0
  514. package/src/transcription/providers/xai-subscription.ts +81 -83
  515. package/src/transcription/segmenter.ts +7 -1
  516. package/src/transcription/service.ts +239 -10
  517. package/src/transcription/wav-duration.ts +39 -0
  518. package/src/workspace-deletion.ts +25 -1
  519. package/src/workspace-tool-gateway-attestations.ts +133 -0
  520. package/src/workspace-tool-gateway-observability.ts +64 -0
  521. package/src/workspace-tool-gateway-secrets.ts +104 -0
  522. package/src/workspace-tool-gateway.ts +921 -103
  523. package/src/workspace-tool-target-fence.ts +380 -0
  524. package/src/workspace-tool-target.ts +554 -0
  525. package/src/workspace-webhook-dispatch.ts +225 -0
  526. package/src/xai-realtime.ts +85 -81
  527. package/src/xai-subscription-core.ts +172 -0
  528. package/dist/browser-auth-broker.d.ts +0 -20
  529. package/dist/chunk-AJ62T5QN.js.map +0 -1
  530. package/dist/connection-authority-owner.d.ts +0 -59
  531. package/dist/routes/connection-authorities.d.ts +0 -3
  532. package/dist/routes/environments.d.ts +0 -5
  533. package/dist/routes/host-mcp-bindings.d.ts +0 -5
  534. package/dist/routes/host-mcp-resolvers.d.ts +0 -3
  535. package/dist/routes/packs.d.ts +0 -3
  536. package/dist/session-event-view-MU3HMNV3.js +0 -264
  537. package/dist/session-event-view-MU3HMNV3.js.map +0 -1
  538. package/dist/xai-subscription-auth.d.ts +0 -23
  539. package/src/browser-auth-broker.ts +0 -155
  540. package/src/connection-authority-owner.ts +0 -61
  541. package/src/routes/connection-authorities.ts +0 -139
  542. package/src/routes/environments.ts +0 -388
  543. package/src/routes/host-mcp-bindings.ts +0 -122
  544. package/src/routes/host-mcp-resolvers.ts +0 -41
  545. package/src/routes/packs.ts +0 -784
  546. package/src/xai-subscription-auth.ts +0 -139
@@ -0,0 +1,479 @@
1
+ import {
2
+ SITE_PLATFORM_BRAKE_ERROR_CODE,
3
+ SITE_PLATFORM_QUOTA_ERROR_CODE,
4
+ type SitePlatformMeter,
5
+ type SitePlatformUsage,
6
+ } from "@opengeni/contracts";
7
+ import type { Settings } from "@opengeni/config";
8
+ import {
9
+ applyCreditDebitAfterUse,
10
+ claimSitePlatformCharge,
11
+ creditDebitAttributionMetadata,
12
+ currentCreditDebitAttribution,
13
+ evaluateSitePlatformBrake,
14
+ getSpendableCreditBalance,
15
+ readSitePlatformBrake,
16
+ readSitePlatformTotals,
17
+ readSitePlatformUsage,
18
+ recordUsageEvent,
19
+ type Database,
20
+ type SitePlatformBrakeRecord,
21
+ type SitePlatformScope,
22
+ type SitePlatformUsageRecord,
23
+ } from "@opengeni/db";
24
+ import { ApiHttpError } from "../http/api-error";
25
+
26
+ /**
27
+ * Site platform usage: what published Sites cost the platform apart from
28
+ * model spend (gateway requests, Site SQL rows read and written, Site SQL
29
+ * plus Site Data storage). Every mode meters it per workspace and month.
30
+ *
31
+ * - usage_only (default): recorded only.
32
+ * - shadow: what credits mode would charge is recorded (shadow_micros).
33
+ * - credits: usage above the workspace's monthly allowance is charged from
34
+ * organization credits; a workspace past an allowance with no credits (or
35
+ * with overage off) is refused further Site SQL and Site Data use (402).
36
+ *
37
+ * Separately, one Opengeni-wide monthly limit brakes every workspace: when
38
+ * the estimated cost of all metered usage this month reaches
39
+ * OPENGENI_SITES_PLATFORM_MONTHLY_LIMIT_USD the brake engages and refuses
40
+ * new Site SQL writes, new publishes and guest agent turns (503,
41
+ * details.code site_platform_brake_engaged). Published pages keep serving.
42
+ */
43
+
44
+ export type SitePlatformSettings = Pick<
45
+ Settings,
46
+ | "sitesPlatformBillingMode"
47
+ | "sitesPlatformOverageEnabled"
48
+ | "sitesPlatformAllowanceRequests"
49
+ | "sitesPlatformAllowanceSqlRowsRead"
50
+ | "sitesPlatformAllowanceSqlRowsWritten"
51
+ | "sitesPlatformAllowanceStorageBytes"
52
+ | "sitesPlatformPriceMicrosPerMillionRequests"
53
+ | "sitesPlatformPriceMicrosPerMillionSqlRowsRead"
54
+ | "sitesPlatformPriceMicrosPerMillionSqlRowsWritten"
55
+ | "sitesPlatformPriceMicrosPerGbMonth"
56
+ | "sitesPlatformMonthlyLimitUsd"
57
+ | "sitesPlatformAlertPercent"
58
+ >;
59
+
60
+ export type SitePlatformDeps = { db: Database; settings: SitePlatformSettings };
61
+
62
+ type MeterRule = {
63
+ meter: SitePlatformMeter;
64
+ allowance: number;
65
+ priceMicros: number;
66
+ priceUnit: number;
67
+ };
68
+
69
+ /** GB-month unit of storage prices (decimal gigabytes, as Cloudflare bills). */
70
+ export const SITE_PLATFORM_GB = 1_000_000_000;
71
+
72
+ export function sitePlatformMeterRules(settings: SitePlatformSettings): MeterRule[] {
73
+ return [
74
+ {
75
+ meter: "requests",
76
+ allowance: settings.sitesPlatformAllowanceRequests,
77
+ priceMicros: settings.sitesPlatformPriceMicrosPerMillionRequests,
78
+ priceUnit: 1_000_000,
79
+ },
80
+ {
81
+ meter: "sql_rows_read",
82
+ allowance: settings.sitesPlatformAllowanceSqlRowsRead,
83
+ priceMicros: settings.sitesPlatformPriceMicrosPerMillionSqlRowsRead,
84
+ priceUnit: 1_000_000,
85
+ },
86
+ {
87
+ meter: "sql_rows_written",
88
+ allowance: settings.sitesPlatformAllowanceSqlRowsWritten,
89
+ priceMicros: settings.sitesPlatformPriceMicrosPerMillionSqlRowsWritten,
90
+ priceUnit: 1_000_000,
91
+ },
92
+ {
93
+ meter: "storage_bytes",
94
+ allowance: settings.sitesPlatformAllowanceStorageBytes,
95
+ priceMicros: settings.sitesPlatformPriceMicrosPerGbMonth,
96
+ priceUnit: SITE_PLATFORM_GB,
97
+ },
98
+ ];
99
+ }
100
+
101
+ type MeterAmounts = Record<SitePlatformMeter, { used: number; peak: number }>;
102
+
103
+ type UsageAmounts = {
104
+ requests: number;
105
+ sqlRowsRead: number;
106
+ sqlRowsWritten: number;
107
+ storageBytes: number;
108
+ storagePeakBytes?: number;
109
+ };
110
+
111
+ function amounts(usage: UsageAmounts): MeterAmounts {
112
+ return {
113
+ requests: { used: usage.requests, peak: usage.requests },
114
+ sql_rows_read: { used: usage.sqlRowsRead, peak: usage.sqlRowsRead },
115
+ sql_rows_written: { used: usage.sqlRowsWritten, peak: usage.sqlRowsWritten },
116
+ storage_bytes: {
117
+ used: usage.storageBytes,
118
+ peak: Math.max(usage.storageBytes, usage.storagePeakBytes ?? 0),
119
+ },
120
+ };
121
+ }
122
+
123
+ const priced = (quantity: number, rule: MeterRule) =>
124
+ Math.ceil((Math.max(0, quantity) * rule.priceMicros) / rule.priceUnit);
125
+
126
+ /**
127
+ * Estimated cost of usage, micro-USD, before allowances. Storage is priced
128
+ * at its level (peak for a workspace) as if held the whole month: an upper
129
+ * bound, so the brake errs early rather than late.
130
+ */
131
+ export function sitePlatformEstimateMicros(
132
+ settings: SitePlatformSettings,
133
+ usage: UsageAmounts,
134
+ ): number {
135
+ const values = amounts(usage);
136
+ return sitePlatformMeterRules(settings).reduce(
137
+ (total, rule) => total + priced(values[rule.meter].peak, rule),
138
+ 0,
139
+ );
140
+ }
141
+
142
+ /** What credits mode charges this month: usage above each allowance, at its price. */
143
+ export function sitePlatformBillableMicros(
144
+ settings: SitePlatformSettings,
145
+ usage: UsageAmounts,
146
+ ): number {
147
+ const values = amounts(usage);
148
+ return sitePlatformMeterRules(settings).reduce(
149
+ (total, rule) => total + priced(values[rule.meter].peak - rule.allowance, rule),
150
+ 0,
151
+ );
152
+ }
153
+
154
+ function brakeView(brake: SitePlatformBrakeRecord) {
155
+ return { engaged: brake.engagedAt !== null, engagedAt: brake.engagedAt?.toISOString() ?? null };
156
+ }
157
+
158
+ export function sitePlatformUsageView(
159
+ settings: SitePlatformSettings,
160
+ workspaceId: string,
161
+ usage: SitePlatformUsageRecord,
162
+ brake: SitePlatformBrakeRecord,
163
+ ): SitePlatformUsage {
164
+ const values = amounts(usage);
165
+ const meters = sitePlatformMeterRules(settings).map((rule) => ({
166
+ meter: rule.meter,
167
+ used: values[rule.meter].used,
168
+ peak: values[rule.meter].peak,
169
+ allowance: rule.allowance,
170
+ priceMicros: rule.priceMicros,
171
+ priceUnit: rule.priceUnit,
172
+ estimatedMicros: priced(values[rule.meter].peak, rule),
173
+ }));
174
+ return {
175
+ workspaceId,
176
+ periodStart: usage.periodStart,
177
+ billingMode: settings.sitesPlatformBillingMode,
178
+ meters,
179
+ estimatedMicros: meters.reduce((total, meter) => total + meter.estimatedMicros, 0),
180
+ chargedMicros: usage.chargedMicros,
181
+ shadowMicros: usage.shadowMicros,
182
+ brake: brakeView(brake),
183
+ };
184
+ }
185
+
186
+ export async function readSitePlatformUsageView(
187
+ deps: SitePlatformDeps,
188
+ scope: SitePlatformScope,
189
+ ): Promise<SitePlatformUsage> {
190
+ const [usage, brake] = await Promise.all([
191
+ readSitePlatformUsage(deps.db, scope),
192
+ readSitePlatformBrake(deps.db),
193
+ ]);
194
+ return sitePlatformUsageView(deps.settings, scope.workspaceId, usage, brake);
195
+ }
196
+
197
+ // --- charging (shadow and credits modes) --------------------------------------------
198
+
199
+ /** Charges smaller than this wait for more usage (one debit per cent at most). */
200
+ export const SITE_PLATFORM_MIN_CHARGE_MICROS = 10_000;
201
+
202
+ /**
203
+ * After usage was recorded: in shadow mode record what credits would charge;
204
+ * in credits mode charge the new billable amount from organization credits
205
+ * (claim and debit in one transaction). Best effort: a failure is logged and
206
+ * the next metered call retries it.
207
+ */
208
+ export async function settleSitePlatformCharges(
209
+ deps: SitePlatformDeps,
210
+ scope: SitePlatformScope,
211
+ usage: SitePlatformUsageRecord,
212
+ ): Promise<void> {
213
+ const mode = deps.settings.sitesPlatformBillingMode;
214
+ if (mode === "usage_only") return;
215
+ const billable = sitePlatformBillableMicros(deps.settings, usage);
216
+ if (mode === "shadow" ? billable <= usage.shadowMicros : billable <= usage.chargedMicros) return;
217
+ // Platform usage is the Sites' own running cost (gateway request reports,
218
+ // visitors' Site SQL and Site Data): a service debit unless a person's
219
+ // request is in scope.
220
+ const current = currentCreditDebitAttribution();
221
+ const attribution: ReturnType<typeof currentCreditDebitAttribution> =
222
+ current.kind === "unknown" ? { kind: "service" } : current;
223
+ try {
224
+ await claimSitePlatformCharge(deps.db, scope, {
225
+ billableMicros: billable,
226
+ minimumMicros: SITE_PLATFORM_MIN_CHARGE_MICROS,
227
+ mode,
228
+ debit: async (tx, claim) => {
229
+ const sourceId = `${scope.workspaceId}:${claim.periodStart}`;
230
+ await recordUsageEvent(tx, {
231
+ accountId: scope.accountId,
232
+ workspaceId: scope.workspaceId,
233
+ eventType: "site_platform.cost",
234
+ quantity: claim.deltaMicros,
235
+ unit: "usd_micros",
236
+ sourceResourceType: "site_platform",
237
+ sourceResourceId: sourceId,
238
+ idempotencyKey: `site_platform.cost:${sourceId}:${claim.seq}`,
239
+ });
240
+ await applyCreditDebitAfterUse(tx, {
241
+ accountId: scope.accountId,
242
+ workspaceId: scope.workspaceId,
243
+ type: "site_platform.usage",
244
+ amountMicros: claim.deltaMicros,
245
+ sourceType: "site_platform",
246
+ sourceId,
247
+ idempotencyKey: `debit:site_platform:${sourceId}:${claim.seq}`,
248
+ metadata: creditDebitAttributionMetadata(attribution),
249
+ });
250
+ },
251
+ });
252
+ } catch (error) {
253
+ console.warn("[site-platform] could not settle platform charges", {
254
+ workspaceId: scope.workspaceId,
255
+ error: error instanceof Error ? error.message : String(error),
256
+ });
257
+ }
258
+ }
259
+
260
+ /**
261
+ * Credits mode only: refuse (402, details.code site_platform_quota_exhausted)
262
+ * when a meter the call uses is at or past its allowance and the workspace
263
+ * cannot pay for more (overage off, or no spendable credits).
264
+ */
265
+ export async function requireSitePlatformQuota(
266
+ deps: SitePlatformDeps,
267
+ scope: SitePlatformScope,
268
+ meters: readonly SitePlatformMeter[],
269
+ ): Promise<void> {
270
+ if (deps.settings.sitesPlatformBillingMode !== "credits" || meters.length === 0) return;
271
+ const usage = await readSitePlatformUsage(deps.db, scope);
272
+ const values = amounts(usage);
273
+ const exhausted = sitePlatformMeterRules(deps.settings).find(
274
+ (rule) => meters.includes(rule.meter) && values[rule.meter].peak >= rule.allowance,
275
+ );
276
+ if (!exhausted) return;
277
+ let reason: "overage_disabled" | "no_credits" | null = null;
278
+ if (!deps.settings.sitesPlatformOverageEnabled) reason = "overage_disabled";
279
+ else {
280
+ const balance = await getSpendableCreditBalance(deps.db, scope.accountId);
281
+ if (balance.balanceMicros <= 0) reason = "no_credits";
282
+ }
283
+ if (!reason) return;
284
+ throw new ApiHttpError(402, {
285
+ code: "payment_required",
286
+ message:
287
+ reason === "no_credits"
288
+ ? "This workspace has used its included Site usage for this month and has no credits left"
289
+ : "This workspace has used its included Site usage for this month",
290
+ retryable: false,
291
+ outcomeUnknown: false,
292
+ details: {
293
+ code: SITE_PLATFORM_QUOTA_ERROR_CODE,
294
+ meter: exhausted.meter,
295
+ allowance: exhausted.allowance,
296
+ used: values[exhausted.meter].peak,
297
+ reason,
298
+ },
299
+ });
300
+ }
301
+
302
+ // --- the Opengeni-wide brake --------------------------------------------------------
303
+
304
+ /** The monthly limit in micro-USD, or null when the automatic brake is off (limit 0). */
305
+ export function sitePlatformLimitMicros(settings: SitePlatformSettings): number | null {
306
+ const limit = Math.round(settings.sitesPlatformMonthlyLimitUsd * 1_000_000);
307
+ return limit > 0 ? limit : null;
308
+ }
309
+
310
+ /** How long a process trusts a brake read. */
311
+ export const SITE_PLATFORM_BRAKE_CACHE_MS = 15_000;
312
+ /** How often a process re-evaluates the Opengeni-wide estimate after metering. */
313
+ export const SITE_PLATFORM_EVALUATE_INTERVAL_MS = 30_000;
314
+
315
+ type BrakeCache = { at: number; brake: SitePlatformBrakeRecord };
316
+ let brakeCache: BrakeCache | null = null;
317
+ let lastEvaluation = 0;
318
+ let evaluating: Promise<void> | null = null;
319
+
320
+ /** Forget cached brake state and the evaluation throttle (tests). */
321
+ export function resetSitePlatformBrakeCache(): void {
322
+ brakeCache = null;
323
+ lastEvaluation = 0;
324
+ }
325
+
326
+ async function cachedBrake(deps: SitePlatformDeps): Promise<SitePlatformBrakeRecord> {
327
+ const now = Date.now();
328
+ const period = `${new Date(now).toISOString().slice(0, 7)}-01`;
329
+ if (
330
+ brakeCache &&
331
+ now - brakeCache.at < SITE_PLATFORM_BRAKE_CACHE_MS &&
332
+ brakeCache.brake.periodStart === period
333
+ )
334
+ return brakeCache.brake;
335
+ const brake = await readSitePlatformBrake(deps.db, new Date(now));
336
+ brakeCache = { at: now, brake };
337
+ return brake;
338
+ }
339
+
340
+ export type SitePlatformBrakedAction = "sql_write" | "publish" | "guest_agent";
341
+
342
+ const BRAKE_MESSAGES: Record<SitePlatformBrakedAction, string> = {
343
+ sql_write:
344
+ "Opengeni has paused new Site database writes for the rest of the month. Published pages keep working.",
345
+ publish:
346
+ "Opengeni has paused publishing for the rest of the month. Published pages keep working.",
347
+ guest_agent:
348
+ "Opengeni has paused Site assistants for visitors for the rest of the month. Published pages keep working.",
349
+ };
350
+
351
+ /** The 503 a braked action gets. */
352
+ export function sitePlatformBrakeError(action: SitePlatformBrakedAction): ApiHttpError {
353
+ return new ApiHttpError(503, {
354
+ code: "limit_exceeded",
355
+ message: BRAKE_MESSAGES[action],
356
+ retryable: false,
357
+ outcomeUnknown: false,
358
+ details: { code: SITE_PLATFORM_BRAKE_ERROR_CODE, action },
359
+ });
360
+ }
361
+
362
+ /**
363
+ * Run a brake check for a first-party agent tool: null when it passes, else
364
+ * the refusal as a tool result (details.code site_platform_brake_engaged).
365
+ */
366
+ export async function sitePlatformBrakeToolRefusal(check: () => Promise<void>) {
367
+ try {
368
+ await check();
369
+ return null;
370
+ } catch (error) {
371
+ if (error instanceof ApiHttpError && error.details?.code === SITE_PLATFORM_BRAKE_ERROR_CODE)
372
+ return {
373
+ isError: true as const,
374
+ content: [
375
+ {
376
+ type: "text" as const,
377
+ text: JSON.stringify({
378
+ error: { code: SITE_PLATFORM_BRAKE_ERROR_CODE, message: error.message },
379
+ }),
380
+ },
381
+ ],
382
+ };
383
+ throw error;
384
+ }
385
+ }
386
+
387
+ /** Whether the Opengeni-wide brake is engaged (cached per process for 15 seconds). */
388
+ export async function sitePlatformBrakeEngaged(deps: SitePlatformDeps): Promise<boolean> {
389
+ const brake = await cachedBrake(deps);
390
+ if (brake.engagedAt === null) return false;
391
+ // With the limit off (0) only an operator-engaged brake holds.
392
+ return sitePlatformLimitMicros(deps.settings) !== null || brake.engagedBy === "operator";
393
+ }
394
+
395
+ /** Refuse a braked action while the brake is engaged. A failed read never refuses. */
396
+ export async function requireSitePlatformOpen(
397
+ deps: SitePlatformDeps,
398
+ action: SitePlatformBrakedAction,
399
+ ): Promise<void> {
400
+ let engaged = false;
401
+ try {
402
+ engaged = await sitePlatformBrakeEngaged(deps);
403
+ } catch (error) {
404
+ console.warn("[site-platform] could not read the platform brake", {
405
+ error: error instanceof Error ? error.message : String(error),
406
+ });
407
+ }
408
+ if (engaged) throw sitePlatformBrakeError(action);
409
+ }
410
+
411
+ /**
412
+ * Re-evaluate the Opengeni-wide estimate: the month's totals of every
413
+ * workspace and the current storage level, at the configured prices. At the
414
+ * alert threshold operators are alerted once a month (a structured log line,
415
+ * `site_platform_limit_alert`; Opengeni has no operator mailer); at the limit
416
+ * the brake engages (`site_platform_brake_engaged`) unless an operator lifted
417
+ * it this month.
418
+ */
419
+ export async function evaluateSitePlatformLimit(
420
+ deps: SitePlatformDeps,
421
+ now: Date = new Date(),
422
+ ): Promise<{ estimateMicros: number; limitMicros: number | null; brake: SitePlatformBrakeRecord }> {
423
+ const totals = await readSitePlatformTotals(deps.db, now);
424
+ const estimateMicros = sitePlatformEstimateMicros(deps.settings, totals);
425
+ const limitMicros = sitePlatformLimitMicros(deps.settings);
426
+ if (limitMicros === null)
427
+ return { estimateMicros, limitMicros, brake: await readSitePlatformBrake(deps.db, now) };
428
+ const alertMicros = Math.floor((limitMicros * deps.settings.sitesPlatformAlertPercent) / 100);
429
+ const result = await evaluateSitePlatformBrake(deps.db, {
430
+ estimateMicros,
431
+ alert: estimateMicros >= alertMicros,
432
+ limit: estimateMicros >= limitMicros,
433
+ now,
434
+ });
435
+ const detail = {
436
+ periodStart: totals.periodStart,
437
+ estimateUsd: estimateMicros / 1_000_000,
438
+ limitUsd: limitMicros / 1_000_000,
439
+ percent: Math.round((estimateMicros / limitMicros) * 1000) / 10,
440
+ requests: totals.requests,
441
+ sqlRowsRead: totals.sqlRowsRead,
442
+ sqlRowsWritten: totals.sqlRowsWritten,
443
+ storageBytes: totals.storageBytes,
444
+ };
445
+ if (result.alerted)
446
+ console.warn(JSON.stringify({ event: "site_platform_limit_alert", ...detail }));
447
+ if (result.engaged) {
448
+ console.warn(JSON.stringify({ event: "site_platform_brake_engaged", by: "auto", ...detail }));
449
+ brakeCache = { at: Date.now(), brake: result.brake };
450
+ }
451
+ return { estimateMicros, limitMicros, brake: result.brake };
452
+ }
453
+
454
+ /**
455
+ * After usage was metered: charge it (shadow and credits modes) and, at most
456
+ * every 30 seconds per process, re-evaluate the Opengeni-wide limit in the
457
+ * background (the request does not wait for it). Never throws.
458
+ */
459
+ export async function afterSitePlatformUsage(
460
+ deps: SitePlatformDeps,
461
+ scope: SitePlatformScope,
462
+ usage: SitePlatformUsageRecord,
463
+ ): Promise<void> {
464
+ await settleSitePlatformCharges(deps, scope, usage);
465
+ if (sitePlatformLimitMicros(deps.settings) === null) return;
466
+ const now = Date.now();
467
+ if (evaluating || now - lastEvaluation < SITE_PLATFORM_EVALUATE_INTERVAL_MS) return;
468
+ lastEvaluation = now;
469
+ evaluating = evaluateSitePlatformLimit(deps)
470
+ .then(() => undefined)
471
+ .catch((error: unknown) => {
472
+ console.warn("[site-platform] could not evaluate the platform limit", {
473
+ error: error instanceof Error ? error.message : String(error),
474
+ });
475
+ })
476
+ .finally(() => {
477
+ evaluating = null;
478
+ });
479
+ }
@@ -0,0 +1,98 @@
1
+ import { parseSiteHostname } from "@opengeni/contracts";
2
+ import {
3
+ actionOpenSiteAbuseReports,
4
+ findSiteHostname,
5
+ findSitePublicationGlobally,
6
+ isSitePublishingUuid,
7
+ recordAuditEvent,
8
+ restoreSitePublication,
9
+ suspendSitePublication,
10
+ type SitePublicationRecord,
11
+ } from "@opengeni/db";
12
+ import {
13
+ requireSitesDomain,
14
+ runSitePublishing,
15
+ scheduleSiteEdgeSync,
16
+ sitePublishingEffects,
17
+ sitePublishingError,
18
+ stopSiteViewers,
19
+ type SitePublishingDeps,
20
+ } from "./service";
21
+
22
+ /**
23
+ * Platform moderation: the deployment operator takes a published Site down
24
+ * (or restores one it took down) by hostname or Site id, across workspaces.
25
+ * There is no platform-admin API in Opengeni, so this runs from the operator
26
+ * script (`scripts/operator/site-takedown.ts`) with the migrations
27
+ * credential. Owners and workspace admins cannot lift a platform takedown,
28
+ * and its hostname stays held for the platform even if the Site or its
29
+ * workspace is deleted (`liftSiteHostnameHold` releases it). Viewer sessions
30
+ * are revoked at once; running conversations are refused further work by
31
+ * site-runtime and end on their own usage caps (the script has no
32
+ * in-process session dispatch to cancel them).
33
+ */
34
+ export async function moderateSiteAsPlatform(
35
+ deps: SitePublishingDeps,
36
+ input: {
37
+ /** A label, a full hostname, or a Site id. */
38
+ host: string;
39
+ operator: string;
40
+ action: "takedown" | "restore";
41
+ reason?: string | undefined;
42
+ },
43
+ ): Promise<SitePublicationRecord> {
44
+ const domain = requireSitesDomain(deps.settings);
45
+ const operator = input.operator.trim();
46
+ if (!operator) throw new Error("Name the operator");
47
+ const reason = input.reason?.trim() ?? "";
48
+ if (input.action === "takedown" && reason.length < 6)
49
+ throw new Error("Give a reason of at least six characters");
50
+ const host = input.host.trim().toLowerCase().replace(/\.$/u, "");
51
+ let record: { accountId: string; workspaceId: string; siteId: string } | null = null;
52
+ if (isSitePublishingUuid(host)) {
53
+ const found = await findSitePublicationGlobally(deps.db, host);
54
+ record = found ? { ...found, siteId: host } : null;
55
+ } else {
56
+ // A bare label or the full hostname.
57
+ const label = host.includes(".") ? parseSiteHostname(host, domain) : host;
58
+ const hostname = label ? await findSiteHostname(deps.db, label) : null;
59
+ record = hostname && hostname.releasedAt === null ? hostname : null;
60
+ }
61
+ if (!record)
62
+ throw sitePublishingError(
63
+ 404,
64
+ "not_found",
65
+ "site_not_found",
66
+ "No Site has this hostname or id",
67
+ );
68
+ const scope = { accountId: record.accountId, workspaceId: record.workspaceId };
69
+ const subject = `platform:${operator}`.slice(0, 300);
70
+ const publication = await runSitePublishing(() =>
71
+ input.action === "takedown"
72
+ ? suspendSitePublication(deps.db, scope, record.siteId, { by: "platform", reason, subject })
73
+ : restoreSitePublication(deps.db, scope, record.siteId, { by: "platform", subject }),
74
+ );
75
+ if (input.action === "takedown")
76
+ await actionOpenSiteAbuseReports(deps.db, scope, { siteId: record.siteId, actor: subject });
77
+ await recordAuditEvent(deps.db, {
78
+ accountId: scope.accountId,
79
+ workspaceId: scope.workspaceId,
80
+ subjectId: subject,
81
+ action: input.action === "takedown" ? "site.publication.takedown" : "site.publication.restore",
82
+ targetType: "site",
83
+ targetId: record.siteId,
84
+ metadata: {
85
+ by: "platform",
86
+ label: publication.label,
87
+ ...(input.action === "takedown" ? { reason: reason.slice(0, 2000) } : {}),
88
+ },
89
+ });
90
+ if (input.action === "takedown")
91
+ await stopSiteViewers(deps, scope, record.siteId, {
92
+ reason: "takedown",
93
+ cancelConversations: false,
94
+ });
95
+ scheduleSiteEdgeSync(deps, [publication.label], { siteIdHint: record.siteId, purge: true });
96
+ await sitePublishingEffects(deps.settings).flush();
97
+ return publication;
98
+ }