@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,552 @@
1
+ // Subscription account-pool routes served from the shared subscription core
2
+ // once a provider cut over (design docs/design/subscription-core-2026-10-07.md,
3
+ // 5.3 "SuperGrok track", X2b). Provider-neutral: a provider passes its
4
+ // binding and its projection of core rows into its legacy account shape; the
5
+ // Claude track reuses this with its own.
6
+ //
7
+ // Every pool route reads `subscriptionCoreRoute` first. Without the
8
+ // provider's cutover receipt it is `legacy` after one read and the legacy
9
+ // handler runs unchanged (a provider whose legacy runtime was deleted uses
10
+ // `requireSubscriptionCoreRoute`, which fails closed there instead);
11
+ // `maintenance` fails closed with a typed 503; `core`
12
+ // runs the handlers below: the same paths, verbs, request fields and
13
+ // response shapes over core connections and settings, with legacy ids
14
+ // resolved through the cutover's aliases. Authority is the core's own
15
+ // (row-level security and the neutral writers); the route keeps the legacy
16
+ // browser and scope checks in front of it, except that a private (`user`)
17
+ // connection is managed only from its owner's own Personal workspace, where
18
+ // the core keeps it.
19
+ import type { Context } from "hono";
20
+ import { HTTPException } from "hono/http-exception";
21
+ import * as z from "zod/v4";
22
+ import { requireAccessGrant, type ApiRouteDeps } from "@opengeni/core";
23
+ import {
24
+ deliverSubscriptionCoreWake,
25
+ disconnectSubscriptionCoreConnection,
26
+ readSubscriptionCoreProviderRouteForRequest,
27
+ renameSubscriptionCoreConnection,
28
+ resolveSubscriptionCoreRouteConnectionId,
29
+ resolveNamedManagedPersonalWorkspaceGrant,
30
+ setSubscriptionCoreAllocator,
31
+ setSubscriptionCorePrimary,
32
+ setSubscriptionCoreRotation,
33
+ type Database,
34
+ type SubscriptionCoreConnectRefusal,
35
+ type SubscriptionCoreDisconnectOutcome,
36
+ type SubscriptionCoreProvider,
37
+ type SubscriptionCoreWake,
38
+ } from "@opengeni/db";
39
+ import type { SubscriptionPoolAccount } from "./subscription-account-pools";
40
+ import { SUBSCRIPTION_CORE_CUTOVER_DISABLED, typedHttpError } from "./subscription-core-http";
41
+ import {
42
+ requirePrivateSubscriptionHuman,
43
+ requireSubscriptionScopeMutation,
44
+ } from "./subscription-pool-access";
45
+
46
+ /** The legacy pool account shape every pool route shares. */
47
+ type PoolAccount = SubscriptionPoolAccount;
48
+
49
+ export type SubscriptionCorePoolProjection = {
50
+ source: "workspace" | "user" | "organization";
51
+ accounts: PoolAccount[];
52
+ activeCredentialId: string | null;
53
+ rotationEnabled: boolean;
54
+ };
55
+
56
+ /** What a provider supplies to serve its pool routes from the core. */
57
+ export type SubscriptionPoolCore = {
58
+ binding: SubscriptionCoreProvider;
59
+ workspaceProjection(
60
+ db: Database,
61
+ input: { accountId: string; workspaceId: string; viewerSubjectId: string },
62
+ ): Promise<SubscriptionCorePoolProjection>;
63
+ organizationProjection(
64
+ db: Database,
65
+ input: { organizationId: string; subjectId: string },
66
+ ): Promise<SubscriptionCorePoolProjection>;
67
+ /**
68
+ * The JSON of one core account in the listings, when it differs from the
69
+ * legacy `accountJson` (fields the legacy listing adds beside it, such as
70
+ * a usage reading). Defaults to the legacy `accountJson`; every other
71
+ * route answers the legacy `accountJson`.
72
+ */
73
+ listedAccountJson?: (account: PoolAccount, activeId: string | null) => Record<string, unknown>;
74
+ };
75
+
76
+ type PoolContext = {
77
+ deps: ApiRouteDeps;
78
+ core: SubscriptionPoolCore;
79
+ displayName: string;
80
+ accountJson: (account: PoolAccount, activeId: string | null) => Record<string, unknown>;
81
+ /** The listings' account JSON (`SubscriptionPoolCore.listedAccountJson`). */
82
+ listedAccountJson: (account: PoolAccount, activeId: string | null) => Record<string, unknown>;
83
+ };
84
+
85
+ /**
86
+ * The runtime serving this provider for the organization: `legacy` without
87
+ * the provider's cutover receipt (one read; `accountId` is not called),
88
+ * `core` with an enabled switch row; maintenance fails closed and never
89
+ * falls back to legacy state.
90
+ */
91
+ export async function subscriptionCoreRoute(
92
+ deps: ApiRouteDeps,
93
+ provider: string,
94
+ displayName: string,
95
+ accountId: () => Promise<string>,
96
+ ): Promise<"legacy" | "core"> {
97
+ const route = await readSubscriptionCoreProviderRouteForRequest(deps.db, provider, accountId);
98
+ if (route === "maintenance") {
99
+ throw typedHttpError(
100
+ 503,
101
+ SUBSCRIPTION_CORE_CUTOVER_DISABLED,
102
+ `${displayName} subscriptions are paused for maintenance in this organization`,
103
+ );
104
+ }
105
+ return route;
106
+ }
107
+
108
+ /**
109
+ * The runtime for a provider whose legacy runtime was deleted after its
110
+ * cutover: only `core` serves. Any other route (maintenance, or no receipt,
111
+ * which the deployed binary's readiness check refuses) fails closed exactly
112
+ * as maintenance does.
113
+ */
114
+ export async function requireSubscriptionCoreRoute(
115
+ deps: ApiRouteDeps,
116
+ provider: string,
117
+ displayName: string,
118
+ accountId: () => Promise<string>,
119
+ ): Promise<"core"> {
120
+ const route = await subscriptionCoreRoute(deps, provider, displayName, accountId);
121
+ if (route !== "core") {
122
+ // Without a receipt the reader returns before resolving the
123
+ // organization; resolve it here so authorization runs first, as it does
124
+ // under maintenance, and a stranger learns nothing about the provider.
125
+ await accountId();
126
+ throw subscriptionCoreMaintenanceError(displayName);
127
+ }
128
+ return route;
129
+ }
130
+
131
+ /** The typed refusal of a core-only provider that is not on `core`. */
132
+ export function subscriptionCoreMaintenanceError(displayName: string) {
133
+ return typedHttpError(
134
+ 503,
135
+ SUBSCRIPTION_CORE_CUTOVER_DISABLED,
136
+ `${displayName} subscriptions are paused for maintenance in this organization`,
137
+ );
138
+ }
139
+
140
+ /** Deliver a committed change's wake; never fails the request (waiters recheck). */
141
+ export async function deliverPoolCoreWake(
142
+ deps: ApiRouteDeps,
143
+ core: Pick<SubscriptionPoolCore, "binding">,
144
+ wake: SubscriptionCoreWake | null,
145
+ ): Promise<void> {
146
+ await deliverSubscriptionCoreWake(
147
+ deps.db,
148
+ core.binding.adapter.provider,
149
+ wake,
150
+ core.binding.adapter.displayName,
151
+ ).catch(() => undefined);
152
+ }
153
+
154
+ /** The legacy texts for a refused core connect. */
155
+ export function coreConnectRefused(
156
+ reason: SubscriptionCoreConnectRefusal,
157
+ displayName: string,
158
+ personal: boolean,
159
+ ): HTTPException | ReturnType<typeof typedHttpError> {
160
+ switch (reason) {
161
+ case "identity_unverified":
162
+ return new HTTPException(409, {
163
+ message: `this migrated ${displayName} login has no verified person identity; an organization administrator must disconnect it before connecting again`,
164
+ });
165
+ case "managed_elsewhere":
166
+ return new HTTPException(409, {
167
+ message: `this ${displayName} account is already connected in this organization and is managed elsewhere`,
168
+ });
169
+ case "personal_connections_disabled":
170
+ return new HTTPException(409, {
171
+ message: `personal ${displayName} connections are turned off in this organization`,
172
+ });
173
+ case "unavailable":
174
+ return typedHttpError(
175
+ 503,
176
+ SUBSCRIPTION_CORE_CUTOVER_DISABLED,
177
+ `${displayName} subscriptions are paused for maintenance in this organization`,
178
+ );
179
+ case "changed":
180
+ return new HTTPException(409, {
181
+ message: `${displayName} account changed. Reload it before reconnecting.`,
182
+ });
183
+ default:
184
+ return new HTTPException(personal ? 409 : 403, {
185
+ message: personal
186
+ ? `a private ${displayName} account is connected from your Personal workspace`
187
+ : `only an administrator of this workspace or of the organization can connect a ${displayName} account here`,
188
+ });
189
+ }
190
+ }
191
+
192
+ function disconnectRefused(outcome: SubscriptionCoreDisconnectOutcome, displayName: string): void {
193
+ if (outcome === "not_found")
194
+ throw new HTTPException(404, { message: `${displayName} account not found` });
195
+ if (outcome === "forbidden")
196
+ throw new HTTPException(403, {
197
+ message: `only an organization administrator can disconnect this ${displayName} account; a workspace administrator can disconnect only an account that serves just their workspace`,
198
+ });
199
+ if (outcome === "unresolved_redemption")
200
+ throw new HTTPException(409, {
201
+ message:
202
+ "this subscription has an unresolved reset redemption; recover it before disconnecting",
203
+ });
204
+ if (outcome === "in_use")
205
+ throw new HTTPException(409, {
206
+ message: `${displayName} subscription cannot disconnect while active turns are using it`,
207
+ });
208
+ }
209
+
210
+ function settingsJson(projection: { rotationEnabled: boolean; activeCredentialId: string | null }) {
211
+ return {
212
+ rotationEnabled: projection.rotationEnabled,
213
+ rotationStrategy: "sharded" as const,
214
+ activeCredentialId: projection.activeCredentialId,
215
+ };
216
+ }
217
+
218
+ /**
219
+ * A route's account id as the canonical core connection id: a legacy id the
220
+ * drained cutover kept as an alias resolves to its connection as the caller
221
+ * may see it (`resolveSubscriptionCoreRouteConnectionId`). Anything else is
222
+ * returned as given; the caller's projection or writer decides whether it
223
+ * exists and is theirs.
224
+ */
225
+ export async function canonicalConnectionId(
226
+ deps: ApiRouteDeps,
227
+ binding: SubscriptionCoreProvider,
228
+ input: { accountId: string; workspaceId: string | null; subjectId: string; routeId: string },
229
+ ): Promise<string> {
230
+ if (!z.uuid().safeParse(input.routeId).success) return input.routeId;
231
+ const resolved = await resolveSubscriptionCoreRouteConnectionId(deps.db, binding, {
232
+ accountId: input.accountId,
233
+ workspaceId: input.workspaceId,
234
+ subjectId: input.subjectId,
235
+ connectionId: input.routeId,
236
+ });
237
+ return resolved ?? input.routeId;
238
+ }
239
+
240
+ /** A workspace route's account: its canonical id, legacy scope and the caller's authority. */
241
+ async function workspaceTarget(c: Context, ctx: PoolContext, workspaceId: string, routeId: string) {
242
+ const { deps, core, displayName } = ctx;
243
+ const grant = await requireAccessGrant(c, deps, workspaceId, "workspace:read");
244
+ const connectionId = await canonicalConnectionId(deps, core.binding, {
245
+ accountId: grant.accountId,
246
+ workspaceId,
247
+ subjectId: grant.subjectId,
248
+ routeId,
249
+ });
250
+ const projection = await core.workspaceProjection(deps.db, {
251
+ accountId: grant.accountId,
252
+ workspaceId,
253
+ viewerSubjectId: grant.subjectId,
254
+ });
255
+ const account = projection.accounts.find((candidate) => candidate.id === connectionId);
256
+ if (!account) throw new HTTPException(404, { message: `${displayName} account not found` });
257
+ const authority = await requireSubscriptionScopeMutation(
258
+ c,
259
+ deps,
260
+ workspaceId,
261
+ account.scope,
262
+ displayName,
263
+ "personal_workspace",
264
+ );
265
+ return {
266
+ admin: { accountId: authority.accountId, workspaceId, subjectId: authority.subjectId },
267
+ connectionId,
268
+ account,
269
+ };
270
+ }
271
+
272
+ export async function coreWorkspaceAccounts(c: Context, ctx: PoolContext, workspaceId: string) {
273
+ const { deps, core, displayName } = ctx;
274
+ const grant = await requireAccessGrant(c, deps, workspaceId, "workspace:read");
275
+ const projection = await core.workspaceProjection(deps.db, {
276
+ accountId: grant.accountId,
277
+ workspaceId,
278
+ viewerSubjectId: grant.subjectId,
279
+ });
280
+ if (projection.source === "user") {
281
+ const human = await requirePrivateSubscriptionHuman(
282
+ c,
283
+ deps,
284
+ workspaceId,
285
+ displayName,
286
+ "personal_workspace",
287
+ );
288
+ if (human.subjectId !== grant.subjectId)
289
+ throw new HTTPException(403, { message: "managed browser identity mismatch" });
290
+ }
291
+ return c.json({
292
+ source: projection.source,
293
+ organizationId: grant.accountId,
294
+ accounts: projection.accounts.map((account) =>
295
+ ctx.listedAccountJson(account, projection.activeCredentialId),
296
+ ),
297
+ activeAccountId: projection.activeCredentialId,
298
+ settings: settingsJson(projection),
299
+ });
300
+ }
301
+
302
+ /** Legacy "activate": the provider's effective primary at the scope the caller administers. */
303
+ export async function coreWorkspaceActivate(
304
+ c: Context,
305
+ ctx: PoolContext,
306
+ workspaceId: string,
307
+ routeId: string,
308
+ ) {
309
+ const target = await workspaceTarget(c, ctx, workspaceId, routeId);
310
+ if (target.account.status !== "active")
311
+ throw new HTTPException(409, { message: `${ctx.displayName} account requires reconnect` });
312
+ const result = await setSubscriptionCorePrimary(ctx.deps.db, ctx.core.binding, {
313
+ ...target.admin,
314
+ connectionId: target.connectionId,
315
+ });
316
+ if (!result.activated)
317
+ throw new HTTPException(404, { message: `${ctx.displayName} account not found` });
318
+ await deliverPoolCoreWake(ctx.deps, ctx.core, result.wake);
319
+ // The canonical id: the listing (and its active account) shows canonical ids.
320
+ return c.json({ activated: true, accountId: target.connectionId });
321
+ }
322
+
323
+ /** Legacy rotation toggle: on is `spread`, off is `primary_first`. */
324
+ export async function coreWorkspaceSettings(
325
+ c: Context,
326
+ ctx: PoolContext,
327
+ workspaceId: string,
328
+ rotationEnabled: boolean,
329
+ ) {
330
+ const { deps, core, displayName } = ctx;
331
+ const grant = await requireAccessGrant(c, deps, workspaceId, "workspace:read");
332
+ const projection = await core.workspaceProjection(deps.db, {
333
+ accountId: grant.accountId,
334
+ workspaceId,
335
+ viewerSubjectId: grant.subjectId,
336
+ });
337
+ // Authorized by the workspace, not by the listing's display source: while an
338
+ // organization pool serves the workspace it is managed there (409, as
339
+ // legacy); the caller's own Personal workspace is the owner's to change;
340
+ // any other workspace needs its administrator.
341
+ const scope =
342
+ projection.source === "organization"
343
+ ? "organization"
344
+ : (await resolveNamedManagedPersonalWorkspaceGrant(deps.db, {
345
+ accountId: grant.accountId,
346
+ workspaceId,
347
+ subjectId: grant.subjectId,
348
+ }))
349
+ ? "user"
350
+ : "workspace";
351
+ const authority = await requireSubscriptionScopeMutation(
352
+ c,
353
+ deps,
354
+ workspaceId,
355
+ scope,
356
+ displayName,
357
+ "personal_workspace",
358
+ );
359
+ const written = await setSubscriptionCoreRotation(deps.db, core.binding, {
360
+ accountId: authority.accountId,
361
+ workspaceId,
362
+ subjectId: authority.subjectId,
363
+ rotationEnabled,
364
+ });
365
+ if (!written) throw new HTTPException(409, { message: `${displayName} settings changed` });
366
+ await deliverPoolCoreWake(deps, core, written.wake);
367
+ return c.json(settingsJson({ rotationEnabled, activeCredentialId: written.primaryConnectionId }));
368
+ }
369
+
370
+ export async function coreWorkspaceAllocator(
371
+ c: Context,
372
+ ctx: PoolContext,
373
+ workspaceId: string,
374
+ routeId: string,
375
+ body: { enabled: boolean; expectedVersion: number },
376
+ ) {
377
+ const target = await workspaceTarget(c, ctx, workspaceId, routeId);
378
+ const mutation = await setSubscriptionCoreAllocator(ctx.deps.db, ctx.core.binding, {
379
+ ...target.admin,
380
+ connectionId: target.connectionId,
381
+ ...body,
382
+ });
383
+ const result = mutation.result;
384
+ if (result.kind === "not_found")
385
+ throw new HTTPException(404, { message: `${ctx.displayName} account not found` });
386
+ await deliverPoolCoreWake(ctx.deps, ctx.core, mutation.wake);
387
+ const response = {
388
+ allocatorEnabled: result.allocatorEnabled,
389
+ allocatorVersion: result.allocatorVersion,
390
+ allocatorUpdatedAt: result.allocatorUpdatedAt?.toISOString() ?? null,
391
+ changed: result.kind === "updated",
392
+ };
393
+ return result.kind === "conflict" ? c.json(response, 409) : c.json(response);
394
+ }
395
+
396
+ export async function coreWorkspaceRename(
397
+ c: Context,
398
+ ctx: PoolContext,
399
+ workspaceId: string,
400
+ routeId: string,
401
+ label: string | null,
402
+ ) {
403
+ const target = await workspaceTarget(c, ctx, workspaceId, routeId);
404
+ const renamed = await renameSubscriptionCoreConnection(ctx.deps.db, ctx.core.binding, {
405
+ ...target.admin,
406
+ connectionId: target.connectionId,
407
+ label,
408
+ });
409
+ const projection = renamed
410
+ ? await ctx.core.workspaceProjection(ctx.deps.db, {
411
+ accountId: target.admin.accountId,
412
+ workspaceId,
413
+ viewerSubjectId: target.admin.subjectId,
414
+ })
415
+ : null;
416
+ const row = projection?.accounts.find((account) => account.id === renamed);
417
+ if (!projection || !row)
418
+ throw new HTTPException(404, { message: `${ctx.displayName} account not found` });
419
+ return c.json(ctx.accountJson(row, projection.activeCredentialId));
420
+ }
421
+
422
+ export async function coreWorkspaceDisconnect(
423
+ c: Context,
424
+ ctx: PoolContext,
425
+ workspaceId: string,
426
+ routeId: string,
427
+ ) {
428
+ const target = await workspaceTarget(c, ctx, workspaceId, routeId);
429
+ const result = await disconnectSubscriptionCoreConnection(ctx.deps.db, ctx.core.binding, {
430
+ ...target.admin,
431
+ connectionId: target.connectionId,
432
+ });
433
+ disconnectRefused(result.outcome, ctx.displayName);
434
+ await deliverPoolCoreWake(ctx.deps, ctx.core, result.wake);
435
+ const projection = await ctx.core.workspaceProjection(ctx.deps.db, {
436
+ accountId: target.admin.accountId,
437
+ workspaceId,
438
+ viewerSubjectId: target.admin.subjectId,
439
+ });
440
+ return c.json({ disconnected: true, newActiveId: projection.activeCredentialId });
441
+ }
442
+
443
+ type OrganizationActor = { organizationId: string; actorSubjectId: string };
444
+
445
+ export async function coreOrganizationAccounts(
446
+ c: Context,
447
+ ctx: PoolContext,
448
+ actor: OrganizationActor,
449
+ ) {
450
+ const projection = await ctx.core.organizationProjection(ctx.deps.db, {
451
+ organizationId: actor.organizationId,
452
+ subjectId: actor.actorSubjectId,
453
+ });
454
+ return c.json({
455
+ accounts: projection.accounts.map((account) =>
456
+ ctx.listedAccountJson(account, projection.activeCredentialId),
457
+ ),
458
+ activeAccountId: projection.activeCredentialId,
459
+ source: "organization",
460
+ organizationId: actor.organizationId,
461
+ settings: settingsJson(projection),
462
+ });
463
+ }
464
+
465
+ export async function coreOrganizationSettings(
466
+ c: Context,
467
+ ctx: PoolContext,
468
+ actor: OrganizationActor,
469
+ rotationEnabled: boolean,
470
+ ) {
471
+ const written = await setSubscriptionCoreRotation(ctx.deps.db, ctx.core.binding, {
472
+ accountId: actor.organizationId,
473
+ workspaceId: null,
474
+ subjectId: actor.actorSubjectId,
475
+ rotationEnabled,
476
+ });
477
+ if (!written) throw new HTTPException(409, { message: `${ctx.displayName} settings changed` });
478
+ await deliverPoolCoreWake(ctx.deps, ctx.core, written.wake);
479
+ return c.json(settingsJson({ rotationEnabled, activeCredentialId: written.primaryConnectionId }));
480
+ }
481
+
482
+ /** The legacy organization account mutations: one change per request. */
483
+ export async function coreOrganizationAccount(
484
+ c: Context,
485
+ ctx: PoolContext,
486
+ actor: OrganizationActor,
487
+ routeId: string,
488
+ change:
489
+ | { activate: true }
490
+ | { disconnect: true }
491
+ | { label: string | null }
492
+ | { allocatorEnabled: boolean; expectedAllocatorVersion: number },
493
+ ) {
494
+ const { deps, core, displayName } = ctx;
495
+ const admin = {
496
+ accountId: actor.organizationId,
497
+ workspaceId: null,
498
+ subjectId: actor.actorSubjectId,
499
+ };
500
+ const connectionId = await canonicalConnectionId(deps, core.binding, { ...admin, routeId });
501
+ const notFound = () => new HTTPException(404, { message: `${displayName} account not found` });
502
+ if ("disconnect" in change) {
503
+ const result = await disconnectSubscriptionCoreConnection(deps.db, core.binding, {
504
+ ...admin,
505
+ connectionId,
506
+ });
507
+ disconnectRefused(result.outcome, displayName);
508
+ await deliverPoolCoreWake(deps, core, result.wake);
509
+ return c.json({ disconnected: true });
510
+ }
511
+ let wake: SubscriptionCoreWake | null = null;
512
+ if ("activate" in change) {
513
+ // Legacy refused a primary that cannot serve: only an active account the
514
+ // allocator may use becomes the organization's primary.
515
+ const projection = await core.organizationProjection(deps.db, {
516
+ organizationId: actor.organizationId,
517
+ subjectId: actor.actorSubjectId,
518
+ });
519
+ const account = projection.accounts.find((candidate) => candidate.id === connectionId);
520
+ if (!account) throw notFound();
521
+ if (account.status !== "active" || !account.allocatorEnabled)
522
+ throw new HTTPException(409, {
523
+ message: `Choose an active, enabled ${displayName} subscription`,
524
+ });
525
+ const result = await setSubscriptionCorePrimary(deps.db, core.binding, {
526
+ ...admin,
527
+ connectionId,
528
+ });
529
+ if (!result.activated) throw notFound();
530
+ wake = result.wake;
531
+ } else if ("label" in change) {
532
+ const renamed = await renameSubscriptionCoreConnection(deps.db, core.binding, {
533
+ ...admin,
534
+ connectionId,
535
+ label: change.label,
536
+ });
537
+ if (!renamed) throw notFound();
538
+ } else {
539
+ const mutation = await setSubscriptionCoreAllocator(deps.db, core.binding, {
540
+ ...admin,
541
+ connectionId,
542
+ enabled: change.allocatorEnabled,
543
+ expectedVersion: change.expectedAllocatorVersion,
544
+ });
545
+ if (mutation.result.kind === "not_found") throw notFound();
546
+ if (mutation.result.kind === "conflict")
547
+ throw new HTTPException(409, { message: "Subscription changed. Refresh and try again." });
548
+ wake = mutation.wake;
549
+ }
550
+ await deliverPoolCoreWake(deps, core, wake);
551
+ return c.json({ updated: true });
552
+ }