@opengeni/api-router 0.30.1 → 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 (436) 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-office-import.d.ts +7 -4
  35. package/dist/editable-artifact-source-session.d.ts +3 -0
  36. package/dist/editable-artifact-websocket.d.ts +10 -18
  37. package/dist/editable-artifact-workspace-files.d.ts +1 -1
  38. package/dist/fatal-process-boundary.d.ts +25 -0
  39. package/dist/github-access.d.ts +31 -2
  40. package/dist/http/acting-person.d.ts +24 -0
  41. package/dist/http/api-contract-compat.d.ts +19 -0
  42. package/dist/http/api-error.d.ts +27 -1
  43. package/dist/http/cors.d.ts +17 -0
  44. package/dist/http/deprecation.d.ts +42 -0
  45. package/dist/http/interaction-control-error.d.ts +13 -0
  46. package/dist/http/keyed-admission.d.ts +12 -0
  47. package/dist/http/local-browser-boundary.d.ts +72 -0
  48. package/dist/http/metrics-listener.d.ts +22 -0
  49. package/dist/http/path-identifier.d.ts +17 -0
  50. package/dist/http/registered-route-label.d.ts +16 -0
  51. package/dist/http/request-body.d.ts +27 -0
  52. package/dist/http/request-source.d.ts +52 -0
  53. package/dist/http/sse.d.ts +17 -6
  54. package/dist/http/unmatched-route.d.ts +18 -0
  55. package/dist/http/user-content.d.ts +36 -0
  56. package/dist/http/websocket-upgrade-dispatch.d.ts +18 -0
  57. package/dist/index.d.ts +10 -3
  58. package/dist/index.js +1129 -166
  59. package/dist/index.js.map +1 -1
  60. package/dist/integration-endpoint-test.d.ts +20 -0
  61. package/dist/integrations/api-integrations.d.ts +2 -2
  62. package/dist/integrations/atlassian.d.ts +29 -3
  63. package/dist/integrations/connect-authority.d.ts +1 -0
  64. package/dist/integrations/connect-callback-return.d.ts +6 -0
  65. package/dist/integrations/fiken.d.ts +16 -2
  66. package/dist/integrations/github-app-connect.d.ts +47 -0
  67. package/dist/integrations/github-installation-proof.d.ts +3 -0
  68. package/dist/integrations/github-lens-connect.d.ts +116 -0
  69. package/dist/integrations/github-skill-source.d.ts +1 -5
  70. package/dist/integrations/google-drive.d.ts +25 -0
  71. package/dist/integrations/integration-commit-authority.d.ts +13 -0
  72. package/dist/integrations/marketplace-plugin.d.ts +2691 -0
  73. package/dist/integrations/oauth-client.d.ts +178 -18
  74. package/dist/integrations/oauth-profiles.d.ts +222 -0
  75. package/dist/integrations/oauth-return-path.d.ts +1 -0
  76. package/dist/integrations/personal-github-repositories.d.ts +84 -0
  77. package/dist/integrations/personal-github.d.ts +42 -0
  78. package/dist/integrations/pr-review-provider.d.ts +22 -0
  79. package/dist/integrations/provider-oauth.d.ts +19 -1
  80. package/dist/integrations/slack-app-home.d.ts +24 -0
  81. package/dist/integrations/slack-bot.d.ts +367 -12
  82. package/dist/integrations/slack-file-upload-flow.d.ts +62 -0
  83. package/dist/integrations/slack-install.d.ts +20 -0
  84. package/dist/integrations/slack-interactions.d.ts +113 -10
  85. package/dist/integrations/slack-mrkdwn.d.ts +41 -0
  86. package/dist/integrations/slack-routing.d.ts +120 -0
  87. package/dist/integrations/slack-session-defaults.d.ts +58 -0
  88. package/dist/integrations/slack-task-file-upload.d.ts +36 -0
  89. package/dist/integrations/social-oauth.d.ts +7 -0
  90. package/dist/interaction-agent-access.d.ts +15 -0
  91. package/dist/interaction-frame-proxy.d.ts +68 -0
  92. package/dist/interaction-metrics.d.ts +2 -0
  93. package/dist/mcp/action-catalog-types.d.ts +9 -0
  94. package/dist/mcp/action-catalog.gen.d.ts +2 -0
  95. package/dist/mcp/capability-account-readiness.d.ts +7 -0
  96. package/dist/mcp/child-read-evidence.d.ts +9 -0
  97. package/dist/mcp/command-read.d.ts +24 -0
  98. package/dist/mcp/company-profile-agent-admin.d.ts +44 -0
  99. package/dist/mcp/contract-input.d.ts +11 -0
  100. package/dist/mcp/documents.d.ts +7 -5
  101. package/dist/mcp/files.d.ts +2 -2
  102. package/dist/mcp/first-party-tool-permissions.d.ts +650 -0
  103. package/dist/mcp/knowledge-entries.d.ts +5 -0
  104. package/dist/mcp/orchestration-failure-diagnostic.d.ts +43 -0
  105. package/dist/mcp/receipts.d.ts +9 -0
  106. package/dist/mcp/request-abort.d.ts +19 -0
  107. package/dist/mcp/scheduled-task-input.d.ts +1189 -0
  108. package/dist/mcp/scheduled-task-view.d.ts +22 -4
  109. package/dist/mcp/server.d.ts +255 -3
  110. package/dist/mcp/session-event-view.d.ts +94 -0
  111. package/dist/mcp/session-view.d.ts +66 -2
  112. package/dist/mcp/session-wait.d.ts +174 -0
  113. package/dist/mcp-oauth.d.ts +52 -0
  114. package/dist/model-catalog.d.ts +11 -31
  115. package/dist/observability.d.ts +3 -1
  116. package/dist/organization-mcp.d.ts +52 -0
  117. package/dist/organization-recovery-notifications.d.ts +41 -0
  118. package/dist/routes/analytics-consent.d.ts +26 -0
  119. package/dist/routes/api-integrations.d.ts +25 -0
  120. package/dist/routes/api-keys.d.ts +17 -0
  121. package/dist/routes/artifact-catalog.d.ts +6 -0
  122. package/dist/routes/automations.d.ts +19 -0
  123. package/dist/routes/billing.d.ts +49 -0
  124. package/dist/routes/browser-sessions.d.ts +71 -3
  125. package/dist/routes/claude-subscription-accounts.d.ts +3 -0
  126. package/dist/routes/claude-subscription-oauth.d.ts +3 -0
  127. package/dist/routes/client-errors.d.ts +146 -0
  128. package/dist/routes/codex.d.ts +76 -2
  129. package/dist/routes/company-brain.d.ts +3 -0
  130. package/dist/routes/company-profile.d.ts +2 -1
  131. package/dist/routes/computer-sessions.d.ts +14 -0
  132. package/dist/routes/connect.d.ts +5 -0
  133. package/dist/routes/editable-artifacts.d.ts +2 -0
  134. package/dist/routes/external-identity-links.d.ts +6 -0
  135. package/dist/routes/feedback.d.ts +3 -0
  136. package/dist/routes/files.d.ts +4 -0
  137. package/dist/routes/github-browser-pages.d.ts +12 -0
  138. package/dist/routes/github.d.ts +2 -0
  139. package/dist/routes/insights-response-cache.d.ts +10 -0
  140. package/dist/routes/insights-usage.d.ts +12 -0
  141. package/dist/routes/insights.d.ts +30 -1
  142. package/dist/routes/knowledge.d.ts +3 -0
  143. package/dist/routes/managed-auth-session-sets.d.ts +26 -0
  144. package/dist/routes/managed-onboarding.d.ts +29 -0
  145. package/dist/routes/managed-sign-in-methods.d.ts +6 -0
  146. package/dist/routes/model-connection-access.d.ts +3 -0
  147. package/dist/routes/organization-integration-policy.d.ts +3 -0
  148. package/dist/routes/organization-integrations.d.ts +6 -0
  149. package/dist/routes/organization-mcp-connections.d.ts +3 -0
  150. package/dist/routes/organization-model-providers.d.ts +3 -0
  151. package/dist/routes/organization-recovery.d.ts +19 -0
  152. package/dist/routes/organization-service-accounts.d.ts +3 -0
  153. package/dist/routes/organization-sessions.d.ts +26 -0
  154. package/dist/routes/personal-github-git-broker.d.ts +29 -0
  155. package/dist/routes/personal-github.d.ts +3 -0
  156. package/dist/routes/pr-review-github.d.ts +3 -0
  157. package/dist/routes/pr-review.d.ts +3 -0
  158. package/dist/routes/session-artifact-associations.d.ts +4 -0
  159. package/dist/routes/session-history-imports.d.ts +9 -0
  160. package/dist/routes/sessions.d.ts +44 -6
  161. package/dist/routes/skill-content.d.ts +4 -0
  162. package/dist/routes/skill-install-authority.d.ts +6 -0
  163. package/dist/routes/subscription-account-pools.d.ts +34 -0
  164. package/dist/routes/subscription-pool-access.d.ts +16 -0
  165. package/dist/routes/supergrok.d.ts +6 -1
  166. package/dist/routes/usage-allowances.d.ts +12 -0
  167. package/dist/routes/user-resource-authorities.d.ts +3 -0
  168. package/dist/routes/workspace-artifacts.d.ts +2 -1
  169. package/dist/routes/workspace-capture.d.ts +10 -2
  170. package/dist/routes/workspace-integrations.d.ts +35 -0
  171. package/dist/routes/workspace-learning.d.ts +3 -0
  172. package/dist/routes/workspace-model-providers.d.ts +4 -0
  173. package/dist/routes/workspaces.d.ts +29 -0
  174. package/dist/sandbox/auth-callout.d.ts +8 -0
  175. package/dist/sandbox/channel-a.d.ts +19 -1
  176. package/dist/sandbox/connection-authority.d.ts +3 -0
  177. package/dist/sandbox/enrollment.d.ts +9 -1
  178. package/dist/sandbox/machines.d.ts +5 -2
  179. package/dist/sandbox/metrics-ingestion.d.ts +28 -20
  180. package/dist/sandbox/rematerialize.d.ts +2 -0
  181. package/dist/sandbox/session-attach-variable-sets.d.ts +30 -0
  182. package/dist/sandbox/viewer.d.ts +26 -1
  183. package/dist/sandbox-file-artifacts.d.ts +50 -0
  184. package/dist/scheduled-task-deletion.d.ts +13 -0
  185. package/dist/session-create-observability.d.ts +5 -0
  186. package/dist/session-event-view-MPS2OZD3.js +292 -0
  187. package/dist/session-event-view-MPS2OZD3.js.map +1 -0
  188. package/dist/site-session-origin.d.ts +13 -0
  189. package/dist/site-uploads.d.ts +41 -0
  190. package/dist/slack-reaction-files.d.ts +1 -1
  191. package/dist/temporal-schedule-cleanup.d.ts +1 -0
  192. package/dist/temporal-schedule-sync.d.ts +26 -0
  193. package/dist/transcription/providers/xai-subscription.d.ts +1 -0
  194. package/dist/transcription/service.d.ts +2 -1
  195. package/dist/work-discovery-observability.d.ts +33 -0
  196. package/dist/workspace-artifact-content.d.ts +28 -0
  197. package/dist/workspace-artifact-provenance.d.ts +7 -0
  198. package/dist/workspace-delete-observability.d.ts +10 -0
  199. package/dist/workspace-deletion.d.ts +6 -0
  200. package/dist/workspace-state-projection.d.ts +3 -5
  201. package/dist/workspace-tool-gateway-observability.d.ts +17 -0
  202. package/dist/workspace-tool-gateway.d.ts +123 -0
  203. package/dist/workspace-webhook-dispatch.d.ts +26 -0
  204. package/package.json +23 -19
  205. package/src/access-grant-rls.ts +75 -0
  206. package/src/admission-trace.ts +14 -0
  207. package/src/api-websocket.ts +23 -0
  208. package/src/app.ts +1974 -256
  209. package/src/artifact-catalog-cursor.ts +60 -0
  210. package/src/auth/managed-auth-attempt-context.ts +70 -0
  211. package/src/auth/managed-auth-rate-limits.ts +252 -0
  212. package/src/auth/managed-auth-session-adapter.ts +222 -0
  213. package/src/auth/managed-auth.ts +536 -60
  214. package/src/auth/managed-email.ts +174 -0
  215. package/src/auth/managed-sign-in-notifications.ts +81 -0
  216. package/src/auth/new-signups-gate.ts +49 -0
  217. package/src/auth/organization-user-setup.ts +307 -0
  218. package/src/auth/signup-funnel-metrics.ts +164 -0
  219. package/src/browser-controller-authority.ts +1 -186
  220. package/src/browser-ephemeral.ts +39 -0
  221. package/src/browser-state-authority.ts +1 -236
  222. package/src/claude-subscription-account-conflicts.ts +12 -0
  223. package/src/claude-subscription-account-usage.ts +48 -0
  224. package/src/claude-subscription-oauth.ts +362 -0
  225. package/src/claude-subscription-profile.ts +73 -0
  226. package/src/claude-subscription-usage.ts +97 -0
  227. package/src/claude-workspace-connection.ts +82 -0
  228. package/src/codemode.ts +194 -30
  229. package/src/codex-realtime.ts +8 -2
  230. package/src/company-brain-okf.ts +340 -0
  231. package/src/connected-machine-computer-access.ts +33 -0
  232. package/src/connection-ownership.ts +199 -0
  233. package/src/controller-data-plane.ts +81 -0
  234. package/src/editable-artifact-native-kernel.ts +26 -15
  235. package/src/editable-artifact-office-import.ts +77 -9
  236. package/src/editable-artifact-production.ts +23 -7
  237. package/src/editable-artifact-source-session.ts +123 -0
  238. package/src/editable-artifact-websocket.ts +27 -21
  239. package/src/editable-artifact-workspace-files.ts +31 -6
  240. package/src/fatal-process-boundary.ts +246 -0
  241. package/src/gateway-realtime.ts +1 -1
  242. package/src/github-access.ts +147 -5
  243. package/src/http/acting-person.ts +71 -0
  244. package/src/http/api-contract-compat.ts +49 -0
  245. package/src/http/api-error.ts +115 -1
  246. package/src/http/auth.ts +48 -0
  247. package/src/http/cors.ts +67 -0
  248. package/src/http/deprecation.ts +118 -0
  249. package/src/http/interaction-control-error.ts +164 -0
  250. package/src/http/keyed-admission.ts +29 -0
  251. package/src/http/local-browser-boundary.ts +343 -0
  252. package/src/http/metrics-listener.ts +57 -0
  253. package/src/http/path-identifier.ts +54 -0
  254. package/src/http/registered-route-label.ts +34 -0
  255. package/src/http/request-body.ts +127 -0
  256. package/src/http/request-source.ts +178 -0
  257. package/src/http/sse.ts +486 -132
  258. package/src/http/unmatched-route.ts +60 -0
  259. package/src/http/user-content.ts +158 -0
  260. package/src/http/websocket-upgrade-dispatch.ts +29 -0
  261. package/src/index.ts +157 -52
  262. package/src/integration-endpoint-test.ts +291 -0
  263. package/src/integrations/api-integrations.ts +98 -11
  264. package/src/integrations/atlassian.ts +474 -136
  265. package/src/integrations/connect-authority.ts +2 -0
  266. package/src/integrations/connect-callback-return.ts +86 -0
  267. package/src/integrations/fiken.ts +354 -64
  268. package/src/integrations/github-app-connect.ts +435 -0
  269. package/src/integrations/github-installation-proof.ts +60 -0
  270. package/src/integrations/github-lens-connect.ts +76 -0
  271. package/src/integrations/github-skill-source.ts +2 -142
  272. package/src/integrations/google-drive.ts +820 -222
  273. package/src/integrations/integration-commit-authority.ts +69 -0
  274. package/src/integrations/marketplace-plugin.ts +48 -0
  275. package/src/integrations/oauth-client.ts +1356 -459
  276. package/src/integrations/oauth-profiles.ts +537 -0
  277. package/src/integrations/oauth-return-path.ts +18 -0
  278. package/src/integrations/personal-github-repositories.ts +674 -0
  279. package/src/integrations/personal-github.ts +825 -0
  280. package/src/integrations/pr-review-provider.ts +246 -0
  281. package/src/integrations/provider-oauth.ts +250 -22
  282. package/src/integrations/slack-app-home.ts +300 -0
  283. package/src/integrations/slack-bot.ts +963 -239
  284. package/src/integrations/slack-file-upload-flow.ts +147 -0
  285. package/src/integrations/slack-install.ts +83 -0
  286. package/src/integrations/slack-interactions.ts +3170 -474
  287. package/src/integrations/slack-mrkdwn.ts +193 -0
  288. package/src/integrations/slack-routing.ts +337 -0
  289. package/src/integrations/slack-session-defaults.ts +224 -0
  290. package/src/integrations/slack-task-file-upload.ts +323 -0
  291. package/src/integrations/social-oauth.ts +213 -15
  292. package/src/interaction-agent-access.ts +48 -0
  293. package/src/interaction-frame-proxy.ts +409 -0
  294. package/src/interaction-metrics.ts +30 -0
  295. package/src/mcp/action-catalog-types.ts +9 -0
  296. package/src/mcp/action-catalog.gen.ts +6696 -0
  297. package/src/mcp/capability-account-readiness.ts +17 -0
  298. package/src/mcp/child-read-evidence.ts +19 -0
  299. package/src/mcp/command-read.ts +109 -0
  300. package/src/mcp/company-profile-agent-admin.ts +198 -0
  301. package/src/mcp/contract-input.ts +141 -0
  302. package/src/mcp/documents.ts +65 -377
  303. package/src/mcp/editable-artifacts.ts +12 -6
  304. package/src/mcp/files.ts +80 -38
  305. package/src/mcp/first-party-tool-permissions.ts +305 -0
  306. package/src/mcp/knowledge-entries.ts +322 -0
  307. package/src/mcp/orchestration-failure-diagnostic.ts +43 -0
  308. package/src/mcp/receipts.ts +34 -0
  309. package/src/mcp/request-abort.ts +44 -0
  310. package/src/mcp/scheduled-task-input.ts +76 -0
  311. package/src/mcp/scheduled-task-view.ts +44 -3
  312. package/src/mcp/server.ts +3030 -1267
  313. package/src/mcp/session-event-view.ts +383 -0
  314. package/src/mcp/session-view.ts +84 -3
  315. package/src/mcp/session-wait.ts +665 -0
  316. package/src/mcp-oauth.ts +1123 -0
  317. package/src/model-catalog.ts +91 -333
  318. package/src/observability.ts +15 -1
  319. package/src/organization-mcp.ts +397 -0
  320. package/src/organization-recovery-notifications.ts +103 -0
  321. package/src/routes/analytics-consent.ts +123 -0
  322. package/src/routes/api-integrations.ts +364 -74
  323. package/src/routes/api-keys.ts +336 -10
  324. package/src/routes/artifact-catalog.ts +279 -0
  325. package/src/routes/automations.ts +768 -0
  326. package/src/routes/billing.ts +461 -46
  327. package/src/routes/browser-sessions.ts +839 -131
  328. package/src/routes/canonical-human-identities.ts +90 -14
  329. package/src/routes/capabilities.ts +107 -6
  330. package/src/routes/channels.ts +20 -3
  331. package/src/routes/claude-subscription-accounts.ts +334 -0
  332. package/src/routes/claude-subscription-oauth.ts +142 -0
  333. package/src/routes/client-errors.ts +362 -0
  334. package/src/routes/codex.ts +833 -116
  335. package/src/routes/company-brain.ts +322 -0
  336. package/src/routes/company-profile.ts +65 -1
  337. package/src/routes/computer-sessions.ts +557 -106
  338. package/src/routes/connect.ts +1938 -0
  339. package/src/routes/connections.ts +1040 -349
  340. package/src/routes/documents.ts +488 -287
  341. package/src/routes/editable-artifacts.ts +79 -9
  342. package/src/routes/enrollments.ts +135 -39
  343. package/src/routes/environments.ts +154 -58
  344. package/src/routes/external-identity-links.ts +201 -0
  345. package/src/routes/feedback.ts +113 -0
  346. package/src/routes/files.ts +337 -39
  347. package/src/routes/github-browser-pages.ts +162 -0
  348. package/src/routes/github.ts +446 -144
  349. package/src/routes/insights-response-cache.ts +83 -0
  350. package/src/routes/insights-usage.ts +345 -0
  351. package/src/routes/insights.ts +153 -19
  352. package/src/routes/install.ts +133 -38
  353. package/src/routes/integration-facets.ts +107 -33
  354. package/src/routes/interaction-resources.ts +30 -3
  355. package/src/routes/knowledge.ts +488 -0
  356. package/src/routes/machines.ts +313 -15
  357. package/src/routes/managed-auth-session-sets.ts +1218 -0
  358. package/src/routes/managed-onboarding.ts +337 -0
  359. package/src/routes/managed-sign-in-methods.ts +433 -0
  360. package/src/routes/memory-slack-publications.ts +3 -2
  361. package/src/routes/model-connection-access.ts +208 -0
  362. package/src/routes/organization-integration-policy.ts +116 -0
  363. package/src/routes/organization-integrations.ts +326 -0
  364. package/src/routes/organization-mcp-connections.ts +178 -0
  365. package/src/routes/organization-memberships.ts +1019 -27
  366. package/src/routes/organization-model-providers.ts +293 -0
  367. package/src/routes/organization-recovery.ts +325 -0
  368. package/src/routes/organization-service-accounts.ts +128 -0
  369. package/src/routes/organization-sessions.ts +350 -0
  370. package/src/routes/personal-github-git-broker.ts +785 -0
  371. package/src/routes/personal-github.ts +370 -0
  372. package/src/routes/plugins.ts +251 -22
  373. package/src/routes/pr-review-github.ts +881 -0
  374. package/src/routes/pr-review.ts +622 -0
  375. package/src/routes/preference-registry.ts +12 -93
  376. package/src/routes/rigs.ts +167 -50
  377. package/src/routes/scheduled-tasks.ts +346 -41
  378. package/src/routes/session-artifact-associations.ts +87 -0
  379. package/src/routes/session-history-imports.ts +280 -0
  380. package/src/routes/sessions.ts +2306 -264
  381. package/src/routes/skill-content.ts +297 -0
  382. package/src/routes/skill-install-authority.ts +64 -0
  383. package/src/routes/skills.ts +62 -9
  384. package/src/routes/social.ts +46 -18
  385. package/src/routes/subscription-account-pools.ts +436 -0
  386. package/src/routes/subscription-pool-access.ts +126 -0
  387. package/src/routes/supergrok.ts +219 -303
  388. package/src/routes/transcription-recordings.ts +38 -3
  389. package/src/routes/transcriptions.ts +4 -0
  390. package/src/routes/usage-allowances.ts +378 -0
  391. package/src/routes/user-resource-authorities.ts +138 -0
  392. package/src/routes/video-generation.ts +14 -10
  393. package/src/routes/workspace-artifacts.ts +275 -69
  394. package/src/routes/workspace-capture.ts +21 -0
  395. package/src/routes/workspace-integrations.ts +576 -0
  396. package/src/routes/workspace-learning.ts +159 -0
  397. package/src/routes/workspace-model-providers.ts +148 -0
  398. package/src/routes/workspace-state.ts +38 -25
  399. package/src/routes/workspaces.ts +1004 -127
  400. package/src/sandbox/auth-callout.ts +96 -19
  401. package/src/sandbox/channel-a.ts +323 -24
  402. package/src/sandbox/connection-authority.ts +3 -0
  403. package/src/sandbox/enrollment.ts +81 -6
  404. package/src/sandbox/machines.ts +218 -76
  405. package/src/sandbox/metrics-ingestion.ts +411 -62
  406. package/src/sandbox/rematerialize.ts +121 -19
  407. package/src/sandbox/session-attach-variable-sets.ts +131 -0
  408. package/src/sandbox/viewer.ts +280 -25
  409. package/src/sandbox-file-artifacts.ts +413 -0
  410. package/src/scheduled-task-deletion.ts +138 -0
  411. package/src/session-create-observability.ts +46 -0
  412. package/src/session-realtime-context.ts +6 -3
  413. package/src/site-session-origin.ts +48 -0
  414. package/src/site-uploads.ts +224 -0
  415. package/src/slack-reaction-files.ts +16 -5
  416. package/src/temporal-schedule-cleanup.ts +13 -0
  417. package/src/temporal-schedule-sync.ts +74 -0
  418. package/src/transcription/providers/codex-subscription.ts +2 -0
  419. package/src/transcription/providers/openai.ts +1 -0
  420. package/src/transcription/providers/xai-subscription.ts +49 -3
  421. package/src/transcription/segmenter.ts +8 -2
  422. package/src/transcription/service.ts +43 -6
  423. package/src/work-discovery-observability.ts +121 -0
  424. package/src/workspace-artifact-content.ts +144 -0
  425. package/src/workspace-artifact-provenance.ts +104 -0
  426. package/src/workspace-delete-observability.ts +75 -0
  427. package/src/workspace-deletion.ts +73 -0
  428. package/src/workspace-state-projection.ts +18 -148
  429. package/src/workspace-tool-gateway-observability.ts +100 -0
  430. package/src/workspace-tool-gateway.ts +870 -0
  431. package/src/workspace-webhook-dispatch.ts +190 -0
  432. package/src/xai-subscription-auth.ts +9 -2
  433. package/dist/chunk-2PQMSRCB.js +0 -49759
  434. package/dist/chunk-2PQMSRCB.js.map +0 -1
  435. package/dist/routes/packs.d.ts +0 -3
  436. 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
  }