@opengeni/api-router 0.30.3 → 1.0.0

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 (434) hide show
  1. package/dist/access-grant-rls.d.ts +3 -0
  2. package/dist/admission-trace.d.ts +8 -0
  3. package/dist/api-websocket.d.ts +18 -0
  4. package/dist/app.d.ts +50 -2
  5. package/dist/app.js +12 -1
  6. package/dist/artifact-catalog-cursor.d.ts +27 -0
  7. package/dist/auth/managed-auth-attempt-context.d.ts +10 -0
  8. package/dist/auth/managed-auth-rate-limits.d.ts +167 -0
  9. package/dist/auth/managed-auth-session-adapter.d.ts +6 -0
  10. package/dist/auth/managed-auth.d.ts +102 -3
  11. package/dist/auth/managed-email.d.ts +29 -0
  12. package/dist/auth/managed-sign-in-notifications.d.ts +4 -0
  13. package/dist/auth/new-signups-gate.d.ts +23 -0
  14. package/dist/auth/organization-user-setup.d.ts +80 -0
  15. package/dist/auth/signup-funnel-metrics.d.ts +44 -0
  16. package/dist/browser-controller-authority.d.ts +1 -61
  17. package/dist/browser-ephemeral.d.ts +5 -0
  18. package/dist/browser-state-authority.d.ts +1 -27
  19. package/dist/chunk-6TZ5LG3O.js +123948 -0
  20. package/dist/chunk-6TZ5LG3O.js.map +1 -0
  21. package/dist/chunk-OGQDXVXY.js +18 -0
  22. package/dist/chunk-OGQDXVXY.js.map +1 -0
  23. package/dist/claude-subscription-account-conflicts.d.ts +1 -0
  24. package/dist/claude-subscription-account-usage.d.ts +39 -0
  25. package/dist/claude-subscription-oauth.d.ts +25 -0
  26. package/dist/claude-subscription-profile.d.ts +9 -0
  27. package/dist/claude-subscription-usage.d.ts +44 -0
  28. package/dist/claude-workspace-connection.d.ts +15 -0
  29. package/dist/codemode.d.ts +32 -1
  30. package/dist/company-brain-okf.d.ts +24 -0
  31. package/dist/connected-machine-computer-access.d.ts +11 -0
  32. package/dist/connection-ownership.d.ts +54 -0
  33. package/dist/controller-data-plane.d.ts +32 -0
  34. package/dist/editable-artifact-source-session.d.ts +3 -0
  35. package/dist/editable-artifact-websocket.d.ts +10 -18
  36. package/dist/editable-artifact-workspace-files.d.ts +1 -1
  37. package/dist/fatal-process-boundary.d.ts +25 -0
  38. package/dist/github-access.d.ts +31 -2
  39. package/dist/http/acting-person.d.ts +24 -0
  40. package/dist/http/api-contract-compat.d.ts +19 -0
  41. package/dist/http/api-error.d.ts +27 -1
  42. package/dist/http/cors.d.ts +17 -0
  43. package/dist/http/deprecation.d.ts +42 -0
  44. package/dist/http/interaction-control-error.d.ts +13 -0
  45. package/dist/http/keyed-admission.d.ts +12 -0
  46. package/dist/http/local-browser-boundary.d.ts +72 -0
  47. package/dist/http/metrics-listener.d.ts +22 -0
  48. package/dist/http/path-identifier.d.ts +17 -0
  49. package/dist/http/registered-route-label.d.ts +16 -0
  50. package/dist/http/request-body.d.ts +27 -0
  51. package/dist/http/request-source.d.ts +52 -0
  52. package/dist/http/sse.d.ts +17 -6
  53. package/dist/http/unmatched-route.d.ts +18 -0
  54. package/dist/http/user-content.d.ts +36 -0
  55. package/dist/http/websocket-upgrade-dispatch.d.ts +18 -0
  56. package/dist/index.d.ts +10 -3
  57. package/dist/index.js +1091 -162
  58. package/dist/index.js.map +1 -1
  59. package/dist/integration-endpoint-test.d.ts +20 -0
  60. package/dist/integrations/api-integrations.d.ts +2 -2
  61. package/dist/integrations/atlassian.d.ts +29 -3
  62. package/dist/integrations/connect-authority.d.ts +1 -0
  63. package/dist/integrations/connect-callback-return.d.ts +6 -0
  64. package/dist/integrations/fiken.d.ts +16 -2
  65. package/dist/integrations/github-app-connect.d.ts +47 -0
  66. package/dist/integrations/github-installation-proof.d.ts +3 -0
  67. package/dist/integrations/github-lens-connect.d.ts +116 -0
  68. package/dist/integrations/github-skill-source.d.ts +1 -5
  69. package/dist/integrations/google-drive.d.ts +24 -0
  70. package/dist/integrations/integration-commit-authority.d.ts +13 -0
  71. package/dist/integrations/marketplace-plugin.d.ts +2691 -0
  72. package/dist/integrations/oauth-client.d.ts +178 -18
  73. package/dist/integrations/oauth-profiles.d.ts +222 -0
  74. package/dist/integrations/oauth-return-path.d.ts +1 -0
  75. package/dist/integrations/personal-github-repositories.d.ts +84 -0
  76. package/dist/integrations/personal-github.d.ts +42 -0
  77. package/dist/integrations/pr-review-provider.d.ts +22 -0
  78. package/dist/integrations/provider-oauth.d.ts +19 -1
  79. package/dist/integrations/slack-app-home.d.ts +24 -0
  80. package/dist/integrations/slack-bot.d.ts +367 -12
  81. package/dist/integrations/slack-file-upload-flow.d.ts +62 -0
  82. package/dist/integrations/slack-install.d.ts +20 -0
  83. package/dist/integrations/slack-interactions.d.ts +107 -9
  84. package/dist/integrations/slack-mrkdwn.d.ts +41 -0
  85. package/dist/integrations/slack-routing.d.ts +120 -0
  86. package/dist/integrations/slack-session-defaults.d.ts +58 -0
  87. package/dist/integrations/slack-task-file-upload.d.ts +36 -0
  88. package/dist/integrations/social-oauth.d.ts +7 -0
  89. package/dist/interaction-agent-access.d.ts +15 -0
  90. package/dist/interaction-frame-proxy.d.ts +68 -0
  91. package/dist/interaction-metrics.d.ts +2 -0
  92. package/dist/mcp/action-catalog-types.d.ts +9 -0
  93. package/dist/mcp/action-catalog.gen.d.ts +2 -0
  94. package/dist/mcp/capability-account-readiness.d.ts +7 -0
  95. package/dist/mcp/child-read-evidence.d.ts +9 -0
  96. package/dist/mcp/command-read.d.ts +24 -0
  97. package/dist/mcp/company-profile-agent-admin.d.ts +44 -0
  98. package/dist/mcp/contract-input.d.ts +11 -0
  99. package/dist/mcp/documents.d.ts +7 -5
  100. package/dist/mcp/files.d.ts +2 -2
  101. package/dist/mcp/first-party-tool-permissions.d.ts +650 -0
  102. package/dist/mcp/knowledge-entries.d.ts +5 -0
  103. package/dist/mcp/orchestration-failure-diagnostic.d.ts +43 -0
  104. package/dist/mcp/receipts.d.ts +9 -0
  105. package/dist/mcp/request-abort.d.ts +19 -0
  106. package/dist/mcp/scheduled-task-input.d.ts +1189 -0
  107. package/dist/mcp/scheduled-task-view.d.ts +22 -4
  108. package/dist/mcp/server.d.ts +255 -3
  109. package/dist/mcp/session-event-view.d.ts +94 -0
  110. package/dist/mcp/session-view.d.ts +66 -2
  111. package/dist/mcp/session-wait.d.ts +174 -0
  112. package/dist/mcp-oauth.d.ts +52 -0
  113. package/dist/model-catalog.d.ts +11 -31
  114. package/dist/observability.d.ts +3 -1
  115. package/dist/organization-mcp.d.ts +52 -0
  116. package/dist/organization-recovery-notifications.d.ts +41 -0
  117. package/dist/routes/analytics-consent.d.ts +26 -0
  118. package/dist/routes/api-integrations.d.ts +25 -0
  119. package/dist/routes/api-keys.d.ts +17 -0
  120. package/dist/routes/artifact-catalog.d.ts +6 -0
  121. package/dist/routes/automations.d.ts +19 -0
  122. package/dist/routes/billing.d.ts +49 -0
  123. package/dist/routes/browser-sessions.d.ts +59 -2
  124. package/dist/routes/claude-subscription-accounts.d.ts +3 -0
  125. package/dist/routes/claude-subscription-oauth.d.ts +3 -0
  126. package/dist/routes/client-errors.d.ts +146 -0
  127. package/dist/routes/codex.d.ts +76 -2
  128. package/dist/routes/company-brain.d.ts +3 -0
  129. package/dist/routes/company-profile.d.ts +2 -1
  130. package/dist/routes/computer-sessions.d.ts +14 -0
  131. package/dist/routes/connect.d.ts +5 -0
  132. package/dist/routes/editable-artifacts.d.ts +2 -0
  133. package/dist/routes/external-identity-links.d.ts +6 -0
  134. package/dist/routes/feedback.d.ts +3 -0
  135. package/dist/routes/github-browser-pages.d.ts +12 -0
  136. package/dist/routes/github.d.ts +2 -0
  137. package/dist/routes/insights-response-cache.d.ts +10 -0
  138. package/dist/routes/insights-usage.d.ts +12 -0
  139. package/dist/routes/insights.d.ts +30 -1
  140. package/dist/routes/knowledge.d.ts +3 -0
  141. package/dist/routes/managed-auth-session-sets.d.ts +26 -0
  142. package/dist/routes/managed-onboarding.d.ts +29 -0
  143. package/dist/routes/managed-sign-in-methods.d.ts +6 -0
  144. package/dist/routes/model-connection-access.d.ts +3 -0
  145. package/dist/routes/organization-integration-policy.d.ts +3 -0
  146. package/dist/routes/organization-integrations.d.ts +6 -0
  147. package/dist/routes/organization-mcp-connections.d.ts +3 -0
  148. package/dist/routes/organization-model-providers.d.ts +3 -0
  149. package/dist/routes/organization-recovery.d.ts +19 -0
  150. package/dist/routes/organization-service-accounts.d.ts +3 -0
  151. package/dist/routes/organization-sessions.d.ts +26 -0
  152. package/dist/routes/personal-github-git-broker.d.ts +29 -0
  153. package/dist/routes/personal-github.d.ts +3 -0
  154. package/dist/routes/pr-review-github.d.ts +3 -0
  155. package/dist/routes/pr-review.d.ts +3 -0
  156. package/dist/routes/session-artifact-associations.d.ts +4 -0
  157. package/dist/routes/session-history-imports.d.ts +9 -0
  158. package/dist/routes/sessions.d.ts +44 -6
  159. package/dist/routes/skill-content.d.ts +4 -0
  160. package/dist/routes/skill-install-authority.d.ts +6 -0
  161. package/dist/routes/subscription-account-pools.d.ts +34 -0
  162. package/dist/routes/subscription-pool-access.d.ts +16 -0
  163. package/dist/routes/supergrok.d.ts +6 -1
  164. package/dist/routes/usage-allowances.d.ts +12 -0
  165. package/dist/routes/user-resource-authorities.d.ts +3 -0
  166. package/dist/routes/workspace-artifacts.d.ts +2 -1
  167. package/dist/routes/workspace-capture.d.ts +10 -2
  168. package/dist/routes/workspace-integrations.d.ts +35 -0
  169. package/dist/routes/workspace-learning.d.ts +3 -0
  170. package/dist/routes/workspace-model-providers.d.ts +4 -0
  171. package/dist/routes/workspaces.d.ts +29 -0
  172. package/dist/sandbox/auth-callout.d.ts +8 -0
  173. package/dist/sandbox/channel-a.d.ts +19 -1
  174. package/dist/sandbox/connection-authority.d.ts +3 -0
  175. package/dist/sandbox/enrollment.d.ts +9 -1
  176. package/dist/sandbox/machines.d.ts +5 -2
  177. package/dist/sandbox/metrics-ingestion.d.ts +28 -20
  178. package/dist/sandbox/rematerialize.d.ts +2 -0
  179. package/dist/sandbox/session-attach-variable-sets.d.ts +30 -0
  180. package/dist/sandbox/viewer.d.ts +26 -1
  181. package/dist/sandbox-file-artifacts.d.ts +50 -0
  182. package/dist/scheduled-task-deletion.d.ts +13 -0
  183. package/dist/session-create-observability.d.ts +5 -0
  184. package/dist/session-event-view-MPS2OZD3.js +292 -0
  185. package/dist/session-event-view-MPS2OZD3.js.map +1 -0
  186. package/dist/site-session-origin.d.ts +13 -0
  187. package/dist/site-uploads.d.ts +41 -0
  188. package/dist/slack-reaction-files.d.ts +1 -1
  189. package/dist/temporal-schedule-cleanup.d.ts +1 -0
  190. package/dist/temporal-schedule-sync.d.ts +26 -0
  191. package/dist/transcription/providers/xai-subscription.d.ts +1 -0
  192. package/dist/transcription/service.d.ts +2 -1
  193. package/dist/work-discovery-observability.d.ts +33 -0
  194. package/dist/workspace-artifact-content.d.ts +28 -0
  195. package/dist/workspace-artifact-provenance.d.ts +7 -0
  196. package/dist/workspace-delete-observability.d.ts +10 -0
  197. package/dist/workspace-deletion.d.ts +6 -0
  198. package/dist/workspace-state-projection.d.ts +3 -5
  199. package/dist/workspace-tool-gateway-observability.d.ts +17 -0
  200. package/dist/workspace-tool-gateway.d.ts +123 -0
  201. package/dist/workspace-webhook-dispatch.d.ts +26 -0
  202. package/package.json +23 -19
  203. package/src/access-grant-rls.ts +75 -0
  204. package/src/admission-trace.ts +14 -0
  205. package/src/api-websocket.ts +23 -0
  206. package/src/app.ts +1967 -252
  207. package/src/artifact-catalog-cursor.ts +60 -0
  208. package/src/auth/managed-auth-attempt-context.ts +70 -0
  209. package/src/auth/managed-auth-rate-limits.ts +252 -0
  210. package/src/auth/managed-auth-session-adapter.ts +222 -0
  211. package/src/auth/managed-auth.ts +536 -60
  212. package/src/auth/managed-email.ts +174 -0
  213. package/src/auth/managed-sign-in-notifications.ts +81 -0
  214. package/src/auth/new-signups-gate.ts +49 -0
  215. package/src/auth/organization-user-setup.ts +307 -0
  216. package/src/auth/signup-funnel-metrics.ts +164 -0
  217. package/src/browser-controller-authority.ts +1 -186
  218. package/src/browser-ephemeral.ts +39 -0
  219. package/src/browser-state-authority.ts +1 -236
  220. package/src/claude-subscription-account-conflicts.ts +12 -0
  221. package/src/claude-subscription-account-usage.ts +48 -0
  222. package/src/claude-subscription-oauth.ts +362 -0
  223. package/src/claude-subscription-profile.ts +73 -0
  224. package/src/claude-subscription-usage.ts +97 -0
  225. package/src/claude-workspace-connection.ts +82 -0
  226. package/src/codemode.ts +194 -30
  227. package/src/codex-realtime.ts +8 -2
  228. package/src/company-brain-okf.ts +340 -0
  229. package/src/connected-machine-computer-access.ts +33 -0
  230. package/src/connection-ownership.ts +199 -0
  231. package/src/controller-data-plane.ts +81 -0
  232. package/src/editable-artifact-native-kernel.ts +26 -15
  233. package/src/editable-artifact-office-import.ts +28 -3
  234. package/src/editable-artifact-production.ts +23 -7
  235. package/src/editable-artifact-source-session.ts +123 -0
  236. package/src/editable-artifact-websocket.ts +27 -21
  237. package/src/editable-artifact-workspace-files.ts +31 -6
  238. package/src/fatal-process-boundary.ts +246 -0
  239. package/src/gateway-realtime.ts +1 -1
  240. package/src/github-access.ts +147 -5
  241. package/src/http/acting-person.ts +71 -0
  242. package/src/http/api-contract-compat.ts +49 -0
  243. package/src/http/api-error.ts +115 -1
  244. package/src/http/auth.ts +48 -0
  245. package/src/http/cors.ts +67 -0
  246. package/src/http/deprecation.ts +118 -0
  247. package/src/http/interaction-control-error.ts +164 -0
  248. package/src/http/keyed-admission.ts +29 -0
  249. package/src/http/local-browser-boundary.ts +343 -0
  250. package/src/http/metrics-listener.ts +57 -0
  251. package/src/http/path-identifier.ts +54 -0
  252. package/src/http/registered-route-label.ts +34 -0
  253. package/src/http/request-body.ts +127 -0
  254. package/src/http/request-source.ts +178 -0
  255. package/src/http/sse.ts +486 -132
  256. package/src/http/unmatched-route.ts +60 -0
  257. package/src/http/user-content.ts +158 -0
  258. package/src/http/websocket-upgrade-dispatch.ts +29 -0
  259. package/src/index.ts +157 -52
  260. package/src/integration-endpoint-test.ts +291 -0
  261. package/src/integrations/api-integrations.ts +98 -11
  262. package/src/integrations/atlassian.ts +474 -136
  263. package/src/integrations/connect-authority.ts +2 -0
  264. package/src/integrations/connect-callback-return.ts +86 -0
  265. package/src/integrations/fiken.ts +354 -64
  266. package/src/integrations/github-app-connect.ts +435 -0
  267. package/src/integrations/github-installation-proof.ts +60 -0
  268. package/src/integrations/github-lens-connect.ts +76 -0
  269. package/src/integrations/github-skill-source.ts +2 -142
  270. package/src/integrations/google-drive.ts +717 -225
  271. package/src/integrations/integration-commit-authority.ts +69 -0
  272. package/src/integrations/marketplace-plugin.ts +48 -0
  273. package/src/integrations/oauth-client.ts +1356 -459
  274. package/src/integrations/oauth-profiles.ts +537 -0
  275. package/src/integrations/oauth-return-path.ts +18 -0
  276. package/src/integrations/personal-github-repositories.ts +674 -0
  277. package/src/integrations/personal-github.ts +825 -0
  278. package/src/integrations/pr-review-provider.ts +246 -0
  279. package/src/integrations/provider-oauth.ts +250 -22
  280. package/src/integrations/slack-app-home.ts +300 -0
  281. package/src/integrations/slack-bot.ts +963 -239
  282. package/src/integrations/slack-file-upload-flow.ts +147 -0
  283. package/src/integrations/slack-install.ts +83 -0
  284. package/src/integrations/slack-interactions.ts +3167 -474
  285. package/src/integrations/slack-mrkdwn.ts +193 -0
  286. package/src/integrations/slack-routing.ts +337 -0
  287. package/src/integrations/slack-session-defaults.ts +224 -0
  288. package/src/integrations/slack-task-file-upload.ts +323 -0
  289. package/src/integrations/social-oauth.ts +213 -15
  290. package/src/interaction-agent-access.ts +48 -0
  291. package/src/interaction-frame-proxy.ts +409 -0
  292. package/src/interaction-metrics.ts +30 -0
  293. package/src/mcp/action-catalog-types.ts +9 -0
  294. package/src/mcp/action-catalog.gen.ts +6696 -0
  295. package/src/mcp/capability-account-readiness.ts +17 -0
  296. package/src/mcp/child-read-evidence.ts +19 -0
  297. package/src/mcp/command-read.ts +109 -0
  298. package/src/mcp/company-profile-agent-admin.ts +198 -0
  299. package/src/mcp/contract-input.ts +141 -0
  300. package/src/mcp/documents.ts +65 -377
  301. package/src/mcp/editable-artifacts.ts +12 -6
  302. package/src/mcp/files.ts +80 -43
  303. package/src/mcp/first-party-tool-permissions.ts +305 -0
  304. package/src/mcp/knowledge-entries.ts +322 -0
  305. package/src/mcp/orchestration-failure-diagnostic.ts +43 -0
  306. package/src/mcp/receipts.ts +34 -0
  307. package/src/mcp/request-abort.ts +44 -0
  308. package/src/mcp/scheduled-task-input.ts +76 -0
  309. package/src/mcp/scheduled-task-view.ts +44 -3
  310. package/src/mcp/server.ts +3030 -1267
  311. package/src/mcp/session-event-view.ts +383 -0
  312. package/src/mcp/session-view.ts +84 -3
  313. package/src/mcp/session-wait.ts +665 -0
  314. package/src/mcp-oauth.ts +1123 -0
  315. package/src/model-catalog.ts +91 -333
  316. package/src/observability.ts +15 -1
  317. package/src/organization-mcp.ts +397 -0
  318. package/src/organization-recovery-notifications.ts +103 -0
  319. package/src/routes/analytics-consent.ts +123 -0
  320. package/src/routes/api-integrations.ts +364 -74
  321. package/src/routes/api-keys.ts +336 -10
  322. package/src/routes/artifact-catalog.ts +279 -0
  323. package/src/routes/automations.ts +768 -0
  324. package/src/routes/billing.ts +461 -46
  325. package/src/routes/browser-sessions.ts +780 -112
  326. package/src/routes/canonical-human-identities.ts +90 -14
  327. package/src/routes/capabilities.ts +107 -6
  328. package/src/routes/channels.ts +20 -3
  329. package/src/routes/claude-subscription-accounts.ts +334 -0
  330. package/src/routes/claude-subscription-oauth.ts +142 -0
  331. package/src/routes/client-errors.ts +362 -0
  332. package/src/routes/codex.ts +833 -116
  333. package/src/routes/company-brain.ts +322 -0
  334. package/src/routes/company-profile.ts +65 -1
  335. package/src/routes/computer-sessions.ts +557 -106
  336. package/src/routes/connect.ts +1938 -0
  337. package/src/routes/connections.ts +1039 -349
  338. package/src/routes/documents.ts +488 -287
  339. package/src/routes/editable-artifacts.ts +79 -9
  340. package/src/routes/enrollments.ts +135 -39
  341. package/src/routes/environments.ts +154 -58
  342. package/src/routes/external-identity-links.ts +201 -0
  343. package/src/routes/feedback.ts +113 -0
  344. package/src/routes/files.ts +267 -33
  345. package/src/routes/github-browser-pages.ts +162 -0
  346. package/src/routes/github.ts +446 -144
  347. package/src/routes/insights-response-cache.ts +83 -0
  348. package/src/routes/insights-usage.ts +345 -0
  349. package/src/routes/insights.ts +153 -19
  350. package/src/routes/install.ts +133 -38
  351. package/src/routes/integration-facets.ts +107 -33
  352. package/src/routes/interaction-resources.ts +30 -3
  353. package/src/routes/knowledge.ts +488 -0
  354. package/src/routes/machines.ts +313 -15
  355. package/src/routes/managed-auth-session-sets.ts +1218 -0
  356. package/src/routes/managed-onboarding.ts +337 -0
  357. package/src/routes/managed-sign-in-methods.ts +433 -0
  358. package/src/routes/memory-slack-publications.ts +3 -2
  359. package/src/routes/model-connection-access.ts +208 -0
  360. package/src/routes/organization-integration-policy.ts +116 -0
  361. package/src/routes/organization-integrations.ts +326 -0
  362. package/src/routes/organization-mcp-connections.ts +178 -0
  363. package/src/routes/organization-memberships.ts +1019 -27
  364. package/src/routes/organization-model-providers.ts +293 -0
  365. package/src/routes/organization-recovery.ts +325 -0
  366. package/src/routes/organization-service-accounts.ts +128 -0
  367. package/src/routes/organization-sessions.ts +350 -0
  368. package/src/routes/personal-github-git-broker.ts +785 -0
  369. package/src/routes/personal-github.ts +370 -0
  370. package/src/routes/plugins.ts +251 -22
  371. package/src/routes/pr-review-github.ts +881 -0
  372. package/src/routes/pr-review.ts +622 -0
  373. package/src/routes/preference-registry.ts +12 -93
  374. package/src/routes/rigs.ts +167 -50
  375. package/src/routes/scheduled-tasks.ts +346 -41
  376. package/src/routes/session-artifact-associations.ts +87 -0
  377. package/src/routes/session-history-imports.ts +280 -0
  378. package/src/routes/sessions.ts +2306 -264
  379. package/src/routes/skill-content.ts +297 -0
  380. package/src/routes/skill-install-authority.ts +64 -0
  381. package/src/routes/skills.ts +62 -9
  382. package/src/routes/social.ts +46 -18
  383. package/src/routes/subscription-account-pools.ts +436 -0
  384. package/src/routes/subscription-pool-access.ts +126 -0
  385. package/src/routes/supergrok.ts +219 -303
  386. package/src/routes/transcription-recordings.ts +38 -3
  387. package/src/routes/transcriptions.ts +4 -0
  388. package/src/routes/usage-allowances.ts +378 -0
  389. package/src/routes/user-resource-authorities.ts +138 -0
  390. package/src/routes/video-generation.ts +14 -10
  391. package/src/routes/workspace-artifacts.ts +275 -69
  392. package/src/routes/workspace-capture.ts +21 -0
  393. package/src/routes/workspace-integrations.ts +576 -0
  394. package/src/routes/workspace-learning.ts +159 -0
  395. package/src/routes/workspace-model-providers.ts +148 -0
  396. package/src/routes/workspace-state.ts +38 -25
  397. package/src/routes/workspaces.ts +1004 -127
  398. package/src/sandbox/auth-callout.ts +96 -19
  399. package/src/sandbox/channel-a.ts +323 -24
  400. package/src/sandbox/connection-authority.ts +3 -0
  401. package/src/sandbox/enrollment.ts +81 -6
  402. package/src/sandbox/machines.ts +218 -76
  403. package/src/sandbox/metrics-ingestion.ts +411 -62
  404. package/src/sandbox/rematerialize.ts +121 -19
  405. package/src/sandbox/session-attach-variable-sets.ts +131 -0
  406. package/src/sandbox/viewer.ts +280 -25
  407. package/src/sandbox-file-artifacts.ts +413 -0
  408. package/src/scheduled-task-deletion.ts +138 -0
  409. package/src/session-create-observability.ts +46 -0
  410. package/src/session-realtime-context.ts +6 -3
  411. package/src/site-session-origin.ts +48 -0
  412. package/src/site-uploads.ts +224 -0
  413. package/src/slack-reaction-files.ts +16 -5
  414. package/src/temporal-schedule-cleanup.ts +13 -0
  415. package/src/temporal-schedule-sync.ts +74 -0
  416. package/src/transcription/providers/codex-subscription.ts +2 -0
  417. package/src/transcription/providers/openai.ts +1 -0
  418. package/src/transcription/providers/xai-subscription.ts +49 -3
  419. package/src/transcription/segmenter.ts +8 -2
  420. package/src/transcription/service.ts +43 -6
  421. package/src/work-discovery-observability.ts +121 -0
  422. package/src/workspace-artifact-content.ts +144 -0
  423. package/src/workspace-artifact-provenance.ts +104 -0
  424. package/src/workspace-delete-observability.ts +75 -0
  425. package/src/workspace-deletion.ts +73 -0
  426. package/src/workspace-state-projection.ts +18 -148
  427. package/src/workspace-tool-gateway-observability.ts +100 -0
  428. package/src/workspace-tool-gateway.ts +870 -0
  429. package/src/workspace-webhook-dispatch.ts +190 -0
  430. package/src/xai-subscription-auth.ts +9 -2
  431. package/dist/chunk-WCXHI3FF.js +0 -49920
  432. package/dist/chunk-WCXHI3FF.js.map +0 -1
  433. package/dist/routes/packs.d.ts +0 -3
  434. package/src/routes/packs.ts +0 -729
@@ -1,12 +1,23 @@
1
+ import { registerSubscriptionAccountPoolRoutes } from "./subscription-account-pools";
2
+ import {
3
+ requireSameOriginBrowserMutation,
4
+ requirePrivateSubscriptionHuman,
5
+ requireSubscriptionScopeMutation,
6
+ } from "./subscription-pool-access";
7
+ export { managedCookieHuman } from "./subscription-pool-access";
8
+ import { requireOrganizationCodexHuman } from "./codex";
9
+ import {
10
+ listOrganizationXaiSubscriptions,
11
+ upsertOrganizationXaiSubscription,
12
+ updateOrganizationXaiSubscription,
13
+ updateOrganizationXaiRotation,
14
+ } from "@opengeni/db";
1
15
  import {
2
16
  configuredModels,
3
17
  environmentsEncryptionKeyBytes,
4
18
  withXaiSubscriptionCatalogProvider,
5
19
  } from "@opengeni/config";
6
- import {
7
- WORKSPACE_XAI_PROVIDER_ACCOUNT_AUTHORITY_SNAPSHOT_V1,
8
- type XaiProviderAccountAuthoritySnapshotV1,
9
- } from "@opengeni/contracts";
20
+ import type { XaiProviderAccountAuthoritySnapshotV1 } from "@opengeni/contracts";
10
21
  import {
11
22
  disconnectXaiSubscriptionCredentialAndRepick,
12
23
  ensureXaiRotationSettings,
@@ -23,19 +34,26 @@ import {
23
34
  updateXaiRotationSettings,
24
35
  upsertXaiSubscriptionCredential,
25
36
  wakeXaiCapacityWaiters,
37
+ encryptEnvironmentValue,
38
+ decryptEnvironmentValue,
26
39
  type XaiSubscriptionAccountMetadata,
27
40
  } from "@opengeni/db";
28
41
  import { createSignedState, readSignedState } from "@opengeni/github";
29
- import { getManagedSession, requireAccessGrant, type ApiRouteDeps } from "@opengeni/core";
42
+ import {
43
+ requireAccessGrant,
44
+ requireAccessGrantAuthorization,
45
+ externalActorContinuationForAuthorization,
46
+ type ApiRouteDeps,
47
+ } from "@opengeni/core";
30
48
  import {
31
49
  XAI_CLIENT_VERSION,
32
50
  XaiSubscriptionError,
33
51
  fetchXaiSubscriptionModels,
34
- fetchXaiVerifiedIdentity,
35
52
  pollXaiDeviceCode,
36
53
  refreshXaiToken,
37
54
  requestXaiDeviceCode,
38
55
  xaiAccessTokenExpiry,
56
+ xaiIdentityFromDeviceTokens,
39
57
  type XaiFetch,
40
58
  type XaiProxyAuthContext,
41
59
  } from "@opengeni/xai-subscription";
@@ -43,11 +61,13 @@ import type { Context, Hono } from "hono";
43
61
  import { HTTPException } from "hono/http-exception";
44
62
  import * as z from "zod/v4";
45
63
  import { projectClientModel } from "../model-catalog";
64
+ import { ExternalActorContinuation } from "@opengeni/contracts/external-identities";
65
+ import { requireConnectOwnerAuthority } from "../integrations/connect-authority";
46
66
 
47
67
  type XaiAuthoritySnapshot = XaiProviderAccountAuthoritySnapshotV1;
48
- type ManagedCookieHuman = { subjectId: string };
49
68
 
50
69
  type SuperGrokConnectState = {
70
+ externalContinuationEncrypted?: string;
51
71
  workspaceId: string;
52
72
  scope: "workspace" | "user";
53
73
  subjectId: string;
@@ -61,51 +81,6 @@ const connectStartBody = z.object({
61
81
  scope: z.enum(["workspace", "user"]).default("workspace"),
62
82
  });
63
83
  const connectPollBody = z.object({ state: z.string().min(1).max(16_384) });
64
- const allocatorBody = z.object({
65
- enabled: z.boolean(),
66
- expectedVersion: z.number().int().positive(),
67
- });
68
- const settingsBody = z.object({ rotationEnabled: z.boolean() });
69
- const renameBody = z.object({ label: z.string().trim().max(200).nullable() });
70
-
71
- async function managedCookieHuman(
72
- c: Context,
73
- deps: ApiRouteDeps,
74
- ): Promise<ManagedCookieHuman | null> {
75
- if (
76
- deps.settings.productAccessMode !== "managed" ||
77
- !deps.managedAuth ||
78
- !c.req.header("cookie") ||
79
- c.req.header("authorization")
80
- ) {
81
- return null;
82
- }
83
- const session = await getManagedSession(c, deps.managedAuth);
84
- return session?.user?.id ? { subjectId: `user:${session.user.id}` } : null;
85
- }
86
-
87
- function requireSameOriginBrowserMutation(c: Context, deps: ApiRouteDeps): void {
88
- const contentType = c.req.header("content-type")?.split(";", 1)[0]?.trim().toLowerCase();
89
- if (contentType !== "application/json") {
90
- throw new HTTPException(403, { message: "JSON browser request required" });
91
- }
92
- if (!deps.settings.publicBaseUrl) {
93
- throw new HTTPException(503, {
94
- message: "managed browser origin is not configured",
95
- });
96
- }
97
- const expectedOrigin = new URL(deps.settings.publicBaseUrl).origin;
98
- if (c.req.header("origin") !== expectedOrigin) {
99
- throw new HTTPException(403, {
100
- message: "same-origin browser request required",
101
- });
102
- }
103
- if (c.req.header("sec-fetch-site")?.toLowerCase() !== "same-origin") {
104
- throw new HTTPException(403, {
105
- message: "same-origin fetch metadata required",
106
- });
107
- }
108
- }
109
84
 
110
85
  function requireEnabled(deps: ApiRouteDeps): void {
111
86
  if (!deps.settings.supergrokSubscriptionEnabled) {
@@ -115,44 +90,14 @@ function requireEnabled(deps: ApiRouteDeps): void {
115
90
  }
116
91
  }
117
92
 
118
- async function requirePrivateHuman(
119
- c: Context,
120
- deps: ApiRouteDeps,
121
- workspaceId: string,
122
- ): Promise<{ accountId: string; subjectId: string }> {
123
- if (c.req.header("authorization")) {
124
- throw new HTTPException(403, {
125
- message: "authorization bearer is not allowed for private SuperGrok accounts",
126
- });
127
- }
128
- const human = await managedCookieHuman(c, deps);
129
- if (!human) {
130
- throw new HTTPException(401, {
131
- message: "managed browser session required",
132
- });
133
- }
134
- const grant = await requireAccessGrant(c, deps, workspaceId, "connections:write");
135
- if (grant.subjectId !== human.subjectId) {
136
- throw new HTTPException(403, {
137
- message: "managed browser identity mismatch",
138
- });
139
- }
140
- return { accountId: grant.accountId, subjectId: grant.subjectId };
141
- }
142
-
143
- async function requireScopeMutation(
93
+ const requirePrivateHuman = (c: Context, deps: ApiRouteDeps, workspaceId: string) =>
94
+ requirePrivateSubscriptionHuman(c, deps, workspaceId, "SuperGrok");
95
+ export const requireScopeMutation = (
144
96
  c: Context,
145
97
  deps: ApiRouteDeps,
146
98
  workspaceId: string,
147
- scope: "workspace" | "user",
148
- ): Promise<{ accountId: string; subjectId: string }> {
149
- if (scope === "user") {
150
- requireSameOriginBrowserMutation(c, deps);
151
- return await requirePrivateHuman(c, deps, workspaceId);
152
- }
153
- const grant = await requireAccessGrant(c, deps, workspaceId, "workspace:admin");
154
- return { accountId: grant.accountId, subjectId: grant.subjectId };
155
- }
99
+ scope: "workspace" | "user" | "organization",
100
+ ) => requireSubscriptionScopeMutation(c, deps, workspaceId, scope, "SuperGrok");
156
101
 
157
102
  async function resolveReadAuthority(
158
103
  c: Context,
@@ -168,7 +113,7 @@ async function resolveReadAuthority(
168
113
  workspaceId,
169
114
  subjectId: grant.subjectId,
170
115
  });
171
- if (snapshot.scope === "workspace") {
116
+ if (snapshot.scope !== "user") {
172
117
  return { accountId: grant.accountId, subjectId: grant.subjectId, snapshot };
173
118
  }
174
119
  const human = await requirePrivateHuman(c, deps, workspaceId);
@@ -197,6 +142,7 @@ function accountJson(row: XaiSubscriptionAccountMetadata, activeCredentialId: st
197
142
  subject: row.providerAccountId ?? row.accountEmail ?? row.id,
198
143
  email: row.accountEmail,
199
144
  label: row.label,
145
+ plan: row.planType,
200
146
  status: row.status === "disabled" ? "error" : row.status,
201
147
  active: row.id === activeCredentialId,
202
148
  expiresAt: row.expiresAt?.toISOString() ?? null,
@@ -307,34 +253,135 @@ async function materializedAuthContext(
307
253
  };
308
254
  }
309
255
 
310
- async function authorityForAccountMutation(
311
- c: Context,
312
- deps: ApiRouteDeps,
313
- workspaceId: string,
314
- credentialId: string,
315
- ): Promise<{
316
- accountId: string;
317
- subjectId: string;
318
- snapshot: XaiAuthoritySnapshot;
319
- }> {
320
- const readGrant = await requireAccessGrant(c, deps, workspaceId, "workspace:read");
321
- const snapshot = await getXaiSubscriptionAccountAuthoritySnapshot(deps.db, {
322
- workspaceId,
323
- subjectId: readGrant.subjectId,
324
- credentialId,
256
+ export function registerSuperGrokRoutes(app: Hono, deps: ApiRouteDeps): void {
257
+ registerSubscriptionAccountPoolRoutes(app, deps, {
258
+ provider: "xai",
259
+ route: "supergrok",
260
+ displayName: "SuperGrok",
261
+ enabled: () => deps.settings.supergrokSubscriptionEnabled,
262
+ accountJson,
263
+ repository: {
264
+ listOrganizationSubscriptions: listOrganizationXaiSubscriptions,
265
+ updateOrganizationSubscription: updateOrganizationXaiSubscription,
266
+ updateOrganizationSubscriptionRotation: updateOrganizationXaiRotation,
267
+ listSubscriptionAccountsMetadata: listXaiSubscriptionAccountsMetadata,
268
+ getSubscriptionRotationSettings: getXaiRotationSettings,
269
+ ensureSubscriptionRotationSettings: ensureXaiRotationSettings,
270
+ getSubscriptionAccountAuthoritySnapshot: getXaiSubscriptionAccountAuthoritySnapshot,
271
+ resolveSubscriptionProviderAccountAuthoritySnapshotForAcceptance:
272
+ resolveXaiProviderAccountAuthoritySnapshotForAcceptance,
273
+ setActiveSubscriptionCredential: setActiveXaiCredential,
274
+ updateSubscriptionRotationSettings: updateXaiRotationSettings,
275
+ updateSubscriptionAllocatorEligibility: updateXaiAllocatorEligibility,
276
+ renameSubscriptionAccount: renameXaiSubscriptionAccount,
277
+ disconnectSubscriptionCredentialAndRepick: disconnectXaiSubscriptionCredentialAndRepick,
278
+ wakeSubscriptionCapacityWaiters: wakeXaiCapacityWaiters,
279
+ },
325
280
  });
326
- if (!snapshot) throw new HTTPException(404, { message: "SuperGrok account not found" });
327
- const mutation = await requireScopeMutation(c, deps, workspaceId, snapshot.scope);
328
- return { ...mutation, snapshot };
329
- }
281
+ const { db } = deps;
330
282
 
331
- export function registerSuperGrokRoutes(app: Hono, deps: ApiRouteDeps): void {
283
+ const organizationPath = "/v1/organizations/:organizationId/supergrok";
284
+ const organizationActor = async (c: Context, mutation = false, providerConsent = false) => {
285
+ requireEnabled(deps);
286
+ if (mutation) requireSameOriginBrowserMutation(c, deps);
287
+ const organizationId = c.req.param("organizationId")!;
288
+ const human = await requireOrganizationCodexHuman(c, deps, organizationId, { providerConsent });
289
+ return { organizationId, actorSubjectId: human.subjectId };
290
+ };
291
+ app.post(`${organizationPath}/connect/start`, async (c) => {
292
+ const actor = await organizationActor(c, true, true);
293
+ try {
294
+ const start = await requestXaiDeviceCode({ fetch: (deps.xaiFetch ?? fetch) as XaiFetch });
295
+ const expiresAt = Math.floor(Date.now() / 1000) + start.expiresInSeconds;
296
+ return c.json({
297
+ ...start,
298
+ scope: "organization",
299
+ state: createSignedState(deps.githubStateSecret, {
300
+ ...actor,
301
+ deviceCode: start.deviceCode,
302
+ intervalSeconds: start.intervalSeconds,
303
+ expiresAt,
304
+ }),
305
+ deviceCode: undefined,
306
+ });
307
+ } catch (error) {
308
+ throw xaiHttpError(error, "Failed to start SuperGrok device login");
309
+ }
310
+ });
311
+ app.post(`${organizationPath}/connect/poll`, async (c) => {
312
+ const actor = await organizationActor(c, true, true);
313
+ const parsed = connectPollBody.safeParse(await c.req.json().catch(() => null));
314
+ if (!parsed.success) throw new HTTPException(400, { message: "SuperGrok state is required" });
315
+ const state = readSignedState(parsed.data.state, deps.githubStateSecret) as {
316
+ organizationId?: string;
317
+ actorSubjectId?: string;
318
+ deviceCode?: string;
319
+ intervalSeconds?: number;
320
+ expiresAt?: number;
321
+ } | null;
322
+ if (
323
+ !state ||
324
+ state.organizationId !== actor.organizationId ||
325
+ state.actorSubjectId !== actor.actorSubjectId ||
326
+ !state.deviceCode ||
327
+ !Number.isFinite(state.intervalSeconds) ||
328
+ !Number.isFinite(state.expiresAt)
329
+ ) {
330
+ throw new HTTPException(400, { message: "SuperGrok connect state is invalid or expired" });
331
+ }
332
+ if (Math.floor(Date.now() / 1000) >= state.expiresAt!) return c.json({ status: "expired" });
333
+ try {
334
+ const poll = await pollXaiDeviceCode(
335
+ { deviceCode: state.deviceCode, intervalSeconds: state.intervalSeconds! },
336
+ { fetch: (deps.xaiFetch ?? fetch) as XaiFetch },
337
+ );
338
+ if (poll.status !== "authorized") return c.json(poll);
339
+ const identity = xaiIdentityFromDeviceTokens(poll.tokens);
340
+ const encryptionKey = environmentsEncryptionKeyBytes(deps.settings);
341
+ if (!encryptionKey)
342
+ throw new HTTPException(500, { message: "Connection encryption is not configured" });
343
+ const connected = await upsertOrganizationXaiSubscription(db, {
344
+ ...actor,
345
+ encryptionKey,
346
+ secret: {
347
+ version: 1,
348
+ accessToken: poll.tokens.accessToken,
349
+ refreshToken: poll.tokens.refreshToken,
350
+ },
351
+ providerAccountId: identity.subject,
352
+ label: identity.name ?? identity.email ?? identity.subject,
353
+ accountEmail: identity.email,
354
+ expiresAt:
355
+ xaiAccessTokenExpiry(poll.tokens.accessToken) ??
356
+ new Date(Date.now() + poll.tokens.expiresInSeconds * 1000),
357
+ });
358
+ return c.json({
359
+ status: "connected",
360
+ accountId: connected.account.id,
361
+ scope: "organization",
362
+ isActive: connected.isActive,
363
+ email: identity.email,
364
+ });
365
+ } catch (error) {
366
+ throw xaiHttpError(error, "SuperGrok device login failed");
367
+ }
368
+ });
332
369
  app.post("/v1/workspaces/:workspaceId/supergrok/connect/start", async (c) => {
333
370
  requireEnabled(deps);
334
371
  const workspaceId = c.req.param("workspaceId");
335
372
  const parsed = connectStartBody.safeParse(await c.req.json().catch(() => ({})));
336
373
  if (!parsed.success) throw new HTTPException(400, { message: "invalid SuperGrok scope" });
337
374
  const authority = await requireScopeMutation(c, deps, workspaceId, parsed.data.scope);
375
+ const authorization = await requireAccessGrantAuthorization(
376
+ c,
377
+ deps,
378
+ workspaceId,
379
+ parsed.data.scope === "workspace" ? "workspace:admin" : "connections:write",
380
+ );
381
+ const continuation = externalActorContinuationForAuthorization(authorization);
382
+ const encryptionKey = environmentsEncryptionKeyBytes(deps.settings);
383
+ if (continuation && !encryptionKey)
384
+ throw new HTTPException(503, { message: "Credential encryption is unavailable" });
338
385
  try {
339
386
  const start = await requestXaiDeviceCode({
340
387
  fetch: (deps.xaiFetch ?? fetch) as XaiFetch,
@@ -354,6 +401,14 @@ export function registerSuperGrokRoutes(app: Hono, deps: ApiRouteDeps): void {
354
401
  deviceCode: start.deviceCode,
355
402
  intervalSeconds: start.intervalSeconds,
356
403
  expiresAt,
404
+ ...(continuation
405
+ ? {
406
+ externalContinuationEncrypted: encryptEnvironmentValue(
407
+ encryptionKey!,
408
+ JSON.stringify(continuation),
409
+ ),
410
+ }
411
+ : {}),
357
412
  }),
358
413
  });
359
414
  } catch (error) {
@@ -389,9 +444,34 @@ export function registerSuperGrokRoutes(app: Hono, deps: ApiRouteDeps): void {
389
444
  message: "SuperGrok connect identity changed",
390
445
  });
391
446
  }
447
+ const originKey = environmentsEncryptionKeyBytes(deps.settings);
448
+ const origin =
449
+ state.externalContinuationEncrypted && originKey
450
+ ? ExternalActorContinuation.parse(
451
+ JSON.parse(decryptEnvironmentValue(originKey, state.externalContinuationEncrypted)),
452
+ )
453
+ : null;
454
+ if (state.externalContinuationEncrypted && !origin)
455
+ throw new HTTPException(503, { message: "Connection origin unavailable" });
456
+ const requireOrigin = async () => {
457
+ if (origin)
458
+ await requireConnectOwnerAuthority(
459
+ deps.db,
460
+ {
461
+ accountId: authority.accountId,
462
+ workspaceId,
463
+ subjectId: authority.subjectId,
464
+ externalContinuation: origin,
465
+ },
466
+ state.scope === "workspace" ? "workspace:admin" : "connections:write",
467
+ origin,
468
+ );
469
+ };
470
+ await requireOrigin();
392
471
  if (Math.floor(Date.now() / 1_000) >= state.expiresAt) {
393
472
  return c.json({ status: "expired" as const });
394
473
  }
474
+ let phase = "device_token_exchange";
395
475
  try {
396
476
  const poll = await pollXaiDeviceCode(
397
477
  {
@@ -401,9 +481,16 @@ export function registerSuperGrokRoutes(app: Hono, deps: ApiRouteDeps): void {
401
481
  { fetch: (deps.xaiFetch ?? fetch) as XaiFetch },
402
482
  );
403
483
  if (poll.status !== "authorized") return c.json(poll);
404
- const identity = await fetchXaiVerifiedIdentity(poll.tokens.accessToken, {
405
- fetch: (deps.xaiFetch ?? fetch) as XaiFetch,
406
- });
484
+ phase = "token_identity";
485
+ const identity = xaiIdentityFromDeviceTokens(poll.tokens);
486
+ phase = "credential_persist";
487
+ await requireOrigin();
488
+ const liveAuthority = await requireScopeMutation(c, deps, workspaceId, state.scope);
489
+ if (
490
+ liveAuthority.accountId !== authority.accountId ||
491
+ liveAuthority.subjectId !== authority.subjectId
492
+ )
493
+ throw new HTTPException(403, { message: "SuperGrok connection identity changed" });
407
494
  const encryptionKey = environmentsEncryptionKeyBytes(deps.settings);
408
495
  if (!encryptionKey) {
409
496
  throw new HTTPException(500, {
@@ -458,37 +545,28 @@ export function registerSuperGrokRoutes(app: Hono, deps: ApiRouteDeps): void {
458
545
  email: identity.email,
459
546
  });
460
547
  } catch (error) {
548
+ deps.observability?.warn("SuperGrok connection operation failed", {
549
+ provider: "xai",
550
+ providerApi: "oauth",
551
+ op: phase,
552
+ outcome: "failed",
553
+ reason:
554
+ error instanceof XaiSubscriptionError
555
+ ? error.kind
556
+ : error instanceof HTTPException
557
+ ? "http_exception"
558
+ : "unexpected",
559
+ status:
560
+ error instanceof XaiSubscriptionError
561
+ ? error.status
562
+ : error instanceof HTTPException
563
+ ? error.status
564
+ : undefined,
565
+ });
461
566
  throw xaiHttpError(error, "SuperGrok device login failed");
462
567
  }
463
568
  });
464
569
 
465
- app.get("/v1/workspaces/:workspaceId/supergrok/accounts", async (c) => {
466
- requireEnabled(deps);
467
- const workspaceId = c.req.param("workspaceId");
468
- const authority = await resolveReadAuthority(c, deps, workspaceId);
469
- const [accounts, settings] = await Promise.all([
470
- listXaiSubscriptionAccountsMetadata(deps.db, {
471
- workspaceId,
472
- subjectId: authority.subjectId,
473
- }),
474
- getXaiRotationSettings(deps.db, {
475
- workspaceId,
476
- subjectId: authority.subjectId,
477
- authoritySnapshot: authority.snapshot,
478
- }),
479
- ]);
480
- const activeCredentialId = settings?.activeCredentialId ?? null;
481
- return c.json({
482
- accounts: accounts.map((account) => accountJson(account, activeCredentialId)),
483
- activeAccountId: activeCredentialId,
484
- settings: {
485
- rotationEnabled: settings?.rotationEnabled ?? true,
486
- rotationStrategy: "sharded" as const,
487
- activeCredentialId,
488
- },
489
- });
490
- });
491
-
492
570
  app.get("/v1/workspaces/:workspaceId/supergrok/status", async (c) => {
493
571
  requireEnabled(deps);
494
572
  const workspaceId = c.req.param("workspaceId");
@@ -529,8 +607,9 @@ export function registerSuperGrokRoutes(app: Hono, deps: ApiRouteDeps): void {
529
607
  } catch {
530
608
  valid = false;
531
609
  }
532
- const catalog = valid
533
- ? configuredModels(withXaiSubscriptionCatalogProvider(deps.settings))
610
+ const catalogSettings = valid ? (await deps.resolveCatalogSettings()).settings : null;
611
+ const catalog = catalogSettings
612
+ ? configuredModels(withXaiSubscriptionCatalogProvider(catalogSettings))
534
613
  .filter(
535
614
  (model) =>
536
615
  model.credentialSource.kind === "connected_subscription" &&
@@ -551,167 +630,4 @@ export function registerSuperGrokRoutes(app: Hono, deps: ApiRouteDeps): void {
551
630
  },
552
631
  });
553
632
  });
554
-
555
- app.post("/v1/workspaces/:workspaceId/supergrok/accounts/:accountId/activate", async (c) => {
556
- requireEnabled(deps);
557
- const workspaceId = c.req.param("workspaceId");
558
- const credentialId = c.req.param("accountId");
559
- const authority = await authorityForAccountMutation(c, deps, workspaceId, credentialId);
560
- const activated = await setActiveXaiCredential(deps.db, {
561
- accountId: authority.accountId,
562
- workspaceId,
563
- subjectId: authority.subjectId,
564
- authoritySnapshot: authority.snapshot,
565
- credentialId,
566
- });
567
- if (!activated)
568
- throw new HTTPException(409, {
569
- message: "SuperGrok account requires relogin",
570
- });
571
- await wakeXaiCapacityWaiters(deps.db, {
572
- workspaceId,
573
- subjectId: authority.subjectId,
574
- authoritySnapshot: authority.snapshot,
575
- reason: "xai_active_credential_changed",
576
- });
577
- return c.json({ activated: true, accountId: credentialId });
578
- });
579
-
580
- app.patch("/v1/workspaces/:workspaceId/supergrok/settings", async (c) => {
581
- requireEnabled(deps);
582
- const workspaceId = c.req.param("workspaceId");
583
- const parsed = settingsBody.safeParse(await c.req.json().catch(() => null));
584
- if (!parsed.success) throw new HTTPException(400, { message: "rotationEnabled is required" });
585
- const readAuthority = await resolveReadAuthority(c, deps, workspaceId);
586
- const authority = await requireScopeMutation(
587
- c,
588
- deps,
589
- workspaceId,
590
- readAuthority.snapshot.scope,
591
- );
592
- const current = await ensureXaiRotationSettings(deps.db, {
593
- accountId: authority.accountId,
594
- workspaceId,
595
- subjectId: authority.subjectId,
596
- authoritySnapshot: readAuthority.snapshot,
597
- });
598
- const updated = await updateXaiRotationSettings(deps.db, {
599
- workspaceId,
600
- subjectId: authority.subjectId,
601
- authoritySnapshot: readAuthority.snapshot,
602
- expectedVersion: current.version,
603
- rotationEnabled: parsed.data.rotationEnabled,
604
- }).catch(() => null);
605
- if (!updated) throw new HTTPException(409, { message: "SuperGrok settings changed" });
606
- await wakeXaiCapacityWaiters(deps.db, {
607
- workspaceId,
608
- subjectId: authority.subjectId,
609
- authoritySnapshot: readAuthority.snapshot,
610
- reason: "xai_rotation_settings_changed",
611
- });
612
- return c.json({
613
- rotationEnabled: updated.rotationEnabled,
614
- rotationStrategy: "sharded" as const,
615
- activeCredentialId: updated.activeCredentialId,
616
- });
617
- });
618
-
619
- app.patch("/v1/workspaces/:workspaceId/supergrok/accounts/:accountId/allocator", async (c) => {
620
- requireEnabled(deps);
621
- const workspaceId = c.req.param("workspaceId");
622
- const credentialId = c.req.param("accountId");
623
- const authority = await authorityForAccountMutation(c, deps, workspaceId, credentialId);
624
- const parsed = allocatorBody.safeParse(await c.req.json().catch(() => null));
625
- if (!parsed.success) {
626
- throw new HTTPException(400, {
627
- message: "enabled and expectedVersion are required",
628
- });
629
- }
630
- const result = await updateXaiAllocatorEligibility(deps.db, {
631
- workspaceId,
632
- subjectId: authority.subjectId,
633
- credentialId,
634
- enabled: parsed.data.enabled,
635
- expectedVersion: parsed.data.expectedVersion,
636
- });
637
- if (result.kind === "not_found") {
638
- throw new HTTPException(404, {
639
- message: "SuperGrok account not found",
640
- });
641
- }
642
- const response = {
643
- allocatorEnabled: result.allocatorEnabled,
644
- allocatorVersion: result.allocatorVersion,
645
- allocatorUpdatedAt: result.allocatorUpdatedAt?.toISOString() ?? null,
646
- changed: result.kind === "updated",
647
- };
648
- if (result.kind === "updated") {
649
- await wakeXaiCapacityWaiters(deps.db, {
650
- workspaceId,
651
- subjectId: authority.subjectId,
652
- authoritySnapshot: authority.snapshot,
653
- reason: "xai_allocator_eligibility_changed",
654
- });
655
- }
656
- return result.kind === "conflict" ? c.json(response, 409) : c.json(response);
657
- });
658
-
659
- app.patch("/v1/workspaces/:workspaceId/supergrok/accounts/:accountId", async (c) => {
660
- requireEnabled(deps);
661
- const workspaceId = c.req.param("workspaceId");
662
- const credentialId = c.req.param("accountId");
663
- const authority = await authorityForAccountMutation(c, deps, workspaceId, credentialId);
664
- const parsed = renameBody.safeParse(await c.req.json().catch(() => null));
665
- if (!parsed.success) throw new HTTPException(400, { message: "label is invalid" });
666
- const account = await renameXaiSubscriptionAccount(deps.db, {
667
- workspaceId,
668
- subjectId: authority.subjectId,
669
- credentialId,
670
- label: parsed.data.label || null,
671
- });
672
- if (!account)
673
- throw new HTTPException(404, {
674
- message: "SuperGrok account not found",
675
- });
676
- const settings = await getXaiRotationSettings(deps.db, {
677
- workspaceId,
678
- subjectId: authority.subjectId,
679
- authoritySnapshot: authority.snapshot,
680
- });
681
- return c.json(accountJson(account, settings?.activeCredentialId ?? null));
682
- });
683
-
684
- app.delete("/v1/workspaces/:workspaceId/supergrok/accounts/:accountId", async (c) => {
685
- requireEnabled(deps);
686
- const workspaceId = c.req.param("workspaceId");
687
- const credentialId = c.req.param("accountId");
688
- const authority = await authorityForAccountMutation(c, deps, workspaceId, credentialId);
689
- if (authority.snapshot.scope === "user") {
690
- await wakeXaiCapacityWaiters(deps.db, {
691
- workspaceId,
692
- subjectId: authority.subjectId,
693
- authoritySnapshot: authority.snapshot,
694
- reason: "xai_credential_disconnecting",
695
- });
696
- }
697
- const result = await disconnectXaiSubscriptionCredentialAndRepick(deps.db, {
698
- accountId: authority.accountId,
699
- workspaceId,
700
- subjectId: authority.subjectId,
701
- credentialId,
702
- authoritySnapshot: authority.snapshot,
703
- });
704
- if (result.disconnected && authority.snapshot.scope === "workspace") {
705
- await wakeXaiCapacityWaiters(deps.db, {
706
- workspaceId,
707
- subjectId: authority.subjectId,
708
- authoritySnapshot: WORKSPACE_XAI_PROVIDER_ACCOUNT_AUTHORITY_SNAPSHOT_V1,
709
- reason: "xai_credential_disconnected",
710
- });
711
- }
712
- return c.json({
713
- disconnected: result.disconnected,
714
- newActiveId: result.newActiveCredentialId,
715
- });
716
- });
717
633
  }