@opengeni/api-router 3.0.1 → 3.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. package/dist/access-grant-rls.d.ts +8 -1
  2. package/dist/admission-trace.d.ts +8 -0
  3. package/dist/app.d.ts +50 -3
  4. package/dist/app.js +10 -1
  5. package/dist/artifact-catalog-cursor.d.ts +1 -0
  6. package/dist/attached-browser-viewer.d.ts +11 -0
  7. package/dist/auth/managed-auth-attempt-context.d.ts +2 -0
  8. package/dist/auth/managed-auth-rate-limits.d.ts +167 -0
  9. package/dist/auth/managed-auth-session-adapter.d.ts +9 -1
  10. package/dist/auth/managed-auth.d.ts +72 -5
  11. package/dist/auth/managed-sign-in-notifications.d.ts +4 -0
  12. package/dist/auth/new-signups-gate.d.ts +23 -0
  13. package/dist/auth/signup-funnel-metrics.d.ts +44 -0
  14. package/dist/azure-live.d.ts +28 -0
  15. package/dist/browser-action-fences.d.ts +13 -0
  16. package/dist/browser-controller-authority.d.ts +1 -61
  17. package/dist/browser-ephemeral.d.ts +5 -0
  18. package/dist/browser-lost-runtime-end.d.ts +24 -0
  19. package/dist/browser-state-authority.d.ts +1 -27
  20. package/dist/chunk-OGQDXVXY.js +18 -0
  21. package/dist/chunk-OGQDXVXY.js.map +1 -0
  22. package/dist/{chunk-AJ62T5QN.js → chunk-OT56OY4V.js} +80503 -39869
  23. package/dist/chunk-OT56OY4V.js.map +1 -0
  24. package/dist/claude-default-models.d.ts +19 -0
  25. package/dist/claude-subscription-core.d.ts +50 -0
  26. package/dist/claude-subscription-oauth.d.ts +36 -0
  27. package/dist/claude-subscription-profile.d.ts +9 -0
  28. package/dist/claude-subscription-usage.d.ts +6 -0
  29. package/dist/claude-workspace-connection.d.ts +15 -0
  30. package/dist/codemode.d.ts +40 -5
  31. package/dist/codex-realtime.d.ts +29 -3
  32. package/dist/codex-session-pointers.d.ts +19 -0
  33. package/dist/connection-ownership.d.ts +6 -3
  34. package/dist/controller-data-plane.d.ts +16 -0
  35. package/dist/credit-promotion-snapshot.d.ts +6 -0
  36. package/dist/editable-artifact-source-session.d.ts +3 -0
  37. package/dist/editable-artifact-websocket.d.ts +5 -3
  38. package/dist/fatal-process-boundary.d.ts +9 -1
  39. package/dist/github-access.d.ts +7 -1
  40. package/dist/github-browser-flow.d.ts +1 -1
  41. package/dist/http/acting-person.d.ts +36 -0
  42. package/dist/http/api-contract-compat.d.ts +19 -0
  43. package/dist/http/api-error.d.ts +50 -1
  44. package/dist/http/auth.d.ts +8 -1
  45. package/dist/http/cors.d.ts +12 -0
  46. package/dist/http/deprecation.d.ts +42 -0
  47. package/dist/http/keyed-admission.d.ts +12 -0
  48. package/dist/http/local-browser-boundary.d.ts +72 -0
  49. package/dist/http/metrics-listener.d.ts +22 -0
  50. package/dist/http/path-identifier.d.ts +17 -0
  51. package/dist/http/registered-route-label.d.ts +16 -0
  52. package/dist/http/rejection-telemetry.d.ts +34 -0
  53. package/dist/http/request-body.d.ts +27 -0
  54. package/dist/http/request-source.d.ts +41 -3
  55. package/dist/http/sse.d.ts +12 -1
  56. package/dist/http/unmatched-route.d.ts +18 -0
  57. package/dist/http/user-content.d.ts +36 -0
  58. package/dist/http/variable-sets-removed.d.ts +41 -0
  59. package/dist/http/websocket-upgrade-dispatch.d.ts +18 -0
  60. package/dist/index.js +1279 -108
  61. package/dist/index.js.map +1 -1
  62. package/dist/integration-connect-metrics.d.ts +35 -0
  63. package/dist/integration-endpoint-test.d.ts +20 -0
  64. package/dist/integrations/api-integrations.d.ts +2 -2
  65. package/dist/integrations/atlassian.d.ts +8 -3
  66. package/dist/integrations/fiken.d.ts +3 -1
  67. package/dist/integrations/github-lens-connect.d.ts +37 -66
  68. package/dist/integrations/google-drive.d.ts +2 -0
  69. package/dist/integrations/integration-commit-authority.d.ts +13 -0
  70. package/dist/integrations/marketplace-plugin.d.ts +43 -43
  71. package/dist/integrations/oauth-client.d.ts +171 -12
  72. package/dist/integrations/oauth-profiles.d.ts +42 -13
  73. package/dist/integrations/onepassword-vault-provider.d.ts +9 -0
  74. package/dist/integrations/slack-bot.d.ts +285 -7
  75. package/dist/integrations/slack-file-upload-flow.d.ts +62 -0
  76. package/dist/integrations/slack-interactions.d.ts +89 -10
  77. package/dist/integrations/slack-mrkdwn.d.ts +41 -0
  78. package/dist/integrations/slack-routing.d.ts +1 -1
  79. package/dist/integrations/slack-session-defaults.d.ts +58 -0
  80. package/dist/integrations/slack-task-file-upload.d.ts +36 -0
  81. package/dist/integrations/slack-tool-review.d.ts +5 -0
  82. package/dist/interaction-agent-access.d.ts +13 -8
  83. package/dist/interaction-agent-version.d.ts +21 -0
  84. package/dist/interaction-holder-heartbeat.d.ts +5 -0
  85. package/dist/interaction-metrics.d.ts +27 -2
  86. package/dist/interaction-route-stages.d.ts +25 -0
  87. package/dist/interaction-secrets-vault.d.ts +20 -0
  88. package/dist/interaction-secrets.d.ts +103 -0
  89. package/dist/mcp/action-catalog-types.d.ts +14 -0
  90. package/dist/mcp/action-catalog.gen.d.ts +2 -0
  91. package/dist/mcp/action-descriptions.d.ts +4 -0
  92. package/dist/mcp/action-schema-imports.gen.d.ts +1 -0
  93. package/dist/mcp/capability-account-readiness.d.ts +7 -0
  94. package/dist/mcp/child-read-evidence.d.ts +9 -0
  95. package/dist/mcp/company-profile-agent-admin.d.ts +12 -0
  96. package/dist/mcp/contract-input.d.ts +13 -0
  97. package/dist/mcp/documents.d.ts +2 -0
  98. package/dist/mcp/first-party-tool-permissions.d.ts +3 -606
  99. package/dist/mcp/notification-tools.d.ts +26 -0
  100. package/dist/mcp/orchestration-failure-diagnostic.d.ts +43 -0
  101. package/dist/mcp/scheduled-task-input.d.ts +1309 -0
  102. package/dist/mcp/scheduled-task-view.d.ts +217 -3
  103. package/dist/mcp/secret-tools.d.ts +14 -0
  104. package/dist/mcp/server.d.ts +108 -5
  105. package/dist/mcp/session-admin-access-tools.d.ts +33 -0
  106. package/dist/mcp/session-event-errors.d.ts +28 -0
  107. package/dist/mcp/session-event-view.d.ts +62 -0
  108. package/dist/mcp/session-view.d.ts +15 -0
  109. package/dist/mcp/session-wait.d.ts +18 -0
  110. package/dist/mcp/site-agent-clamp-tools.d.ts +38 -0
  111. package/dist/mcp/site-data-tools.d.ts +22 -0
  112. package/dist/mcp/site-publication-tools.d.ts +19 -0
  113. package/dist/mcp/site-sql-tools.d.ts +27 -0
  114. package/dist/mcp-oauth.d.ts +37 -4
  115. package/dist/model-calls/chat-completions.d.ts +87 -0
  116. package/dist/model-calls/pending-usage-settlements.d.ts +57 -0
  117. package/dist/model-calls/service.d.ts +36 -0
  118. package/dist/model-catalog.d.ts +9 -3
  119. package/dist/native-push-dispatch.d.ts +69 -0
  120. package/dist/observability.d.ts +3 -1
  121. package/dist/organization-mcp.d.ts +82 -0
  122. package/dist/prepared-mcp-actor.d.ts +77 -0
  123. package/dist/prepared-mcp-permissions.d.ts +8 -0
  124. package/dist/routes/analytics-consent.d.ts +26 -0
  125. package/dist/routes/api-integrations.d.ts +11 -0
  126. package/dist/routes/api-keys.d.ts +7 -7
  127. package/dist/routes/automations.d.ts +2 -0
  128. package/dist/routes/billing.d.ts +59 -0
  129. package/dist/routes/browser-sessions.d.ts +65 -2
  130. package/dist/routes/chat-completions.d.ts +11 -0
  131. package/dist/routes/claude-core-usage.d.ts +20 -0
  132. package/dist/routes/claude-subscription-accounts.d.ts +3 -0
  133. package/dist/routes/claude-subscription-oauth.d.ts +3 -0
  134. package/dist/routes/client-errors.d.ts +182 -0
  135. package/dist/routes/codex-core.d.ts +401 -0
  136. package/dist/routes/codex.d.ts +64 -2
  137. package/dist/routes/computer-sessions.d.ts +6 -1
  138. package/dist/routes/desktop-distribution.d.ts +32 -0
  139. package/dist/routes/github-browser-fonts.gen.d.ts +2 -0
  140. package/dist/routes/github-browser-pages.d.ts +27 -0
  141. package/dist/routes/inbox.d.ts +13 -0
  142. package/dist/routes/insights-response-cache.d.ts +10 -0
  143. package/dist/routes/insights-usage.d.ts +12 -0
  144. package/dist/routes/insights.d.ts +28 -0
  145. package/dist/routes/interaction-placement-message.d.ts +7 -0
  146. package/dist/routes/managed-sign-in-methods.d.ts +6 -0
  147. package/dist/routes/model-account-choice.d.ts +13 -0
  148. package/dist/routes/model-account-settings.d.ts +19 -0
  149. package/dist/routes/native-app-auth.d.ts +12 -0
  150. package/dist/routes/organization-integration-policy.d.ts +8 -0
  151. package/dist/routes/organization-integrations.d.ts +6 -0
  152. package/dist/routes/organization-mcp-connections.d.ts +3 -0
  153. package/dist/routes/organization-model-defaults.d.ts +9 -0
  154. package/dist/routes/organization-service-accounts.d.ts +3 -0
  155. package/dist/routes/personal-api-keys.d.ts +3 -0
  156. package/dist/routes/session-admin-access.d.ts +3 -0
  157. package/dist/routes/session-artifact-associations.d.ts +4 -0
  158. package/dist/routes/session-history-imports.d.ts +20 -0
  159. package/dist/routes/sessions.d.ts +38 -2
  160. package/dist/routes/site-data.d.ts +18 -0
  161. package/dist/routes/site-publishing.d.ts +5 -0
  162. package/dist/routes/site-runtime.d.ts +31 -0
  163. package/dist/routes/site-sql.d.ts +16 -0
  164. package/dist/routes/slack-bot-access.d.ts +3 -0
  165. package/dist/routes/subscription-account-pools.d.ts +21 -0
  166. package/dist/routes/subscription-core-http.d.ts +5 -0
  167. package/dist/routes/subscription-pool-access.d.ts +37 -0
  168. package/dist/routes/subscription-pool-core.d.ts +153 -0
  169. package/dist/routes/supergrok.d.ts +6 -6
  170. package/dist/routes/usage-allowances.d.ts +12 -0
  171. package/dist/routes/variable-sets-removed.d.ts +2 -0
  172. package/dist/routes/vault-providers.d.ts +34 -0
  173. package/dist/routes/vaults.d.ts +3 -0
  174. package/dist/routes/workspace-integrations.d.ts +35 -0
  175. package/dist/routes/workspace-model-providers.d.ts +4 -0
  176. package/dist/routes/workspaces.d.ts +11 -2
  177. package/dist/sandbox/agent-update.d.ts +64 -0
  178. package/dist/sandbox/auth-callout.d.ts +8 -0
  179. package/dist/sandbox/channel-a.d.ts +15 -1
  180. package/dist/sandbox/enrollment.d.ts +26 -4
  181. package/dist/sandbox/machine-audience.d.ts +29 -0
  182. package/dist/sandbox/machines.d.ts +15 -2
  183. package/dist/sandbox/metrics-ingestion.d.ts +6 -2
  184. package/dist/sandbox/screen-control.d.ts +85 -0
  185. package/dist/sandbox/viewer.d.ts +5 -1
  186. package/dist/sandbox-file-artifacts.d.ts +17 -1
  187. package/dist/scheduled-task-blockers.d.ts +39 -0
  188. package/dist/scheduled-task-deletion.d.ts +3 -4
  189. package/dist/scheduled-task-lifecycle.d.ts +14 -0
  190. package/dist/secret-answers.d.ts +40 -0
  191. package/dist/session-create-observability.d.ts +5 -0
  192. package/dist/session-event-view-36GO3IL7.js +528 -0
  193. package/dist/session-event-view-36GO3IL7.js.map +1 -0
  194. package/dist/signed-state-secret.d.ts +18 -0
  195. package/dist/site-agent-guard.d.ts +53 -0
  196. package/dist/site-data/operations.d.ts +103 -0
  197. package/dist/site-data/service.d.ts +203 -0
  198. package/dist/site-frame-guard.d.ts +32 -0
  199. package/dist/site-publishing/agent-data-tools.d.ts +84 -0
  200. package/dist/site-publishing/agent-model.d.ts +58 -0
  201. package/dist/site-publishing/agent-session.d.ts +16 -0
  202. package/dist/site-publishing/content-scanner.d.ts +31 -0
  203. package/dist/site-publishing/edge-sync.d.ts +48 -0
  204. package/dist/site-publishing/gateway-signature.d.ts +56 -0
  205. package/dist/site-publishing/limits.d.ts +63 -0
  206. package/dist/site-publishing/page-tool-authority.d.ts +30 -0
  207. package/dist/site-publishing/platform-usage.d.ts +113 -0
  208. package/dist/site-publishing/platform.d.ts +21 -0
  209. package/dist/site-publishing/readiness.d.ts +62 -0
  210. package/dist/site-publishing/runtime.d.ts +179 -0
  211. package/dist/site-publishing/service.d.ts +264 -0
  212. package/dist/site-publishing/session-events.d.ts +22 -0
  213. package/dist/site-publishing/session-views.d.ts +36 -0
  214. package/dist/site-publishing/viewer.d.ts +40 -0
  215. package/dist/site-session-origin.d.ts +31 -6
  216. package/dist/site-sql/format.d.ts +47 -0
  217. package/dist/site-sql/gateway.d.ts +50 -0
  218. package/dist/site-sql/service.d.ts +213 -0
  219. package/dist/temporal-schedule-sync.d.ts +26 -0
  220. package/dist/transcription/billing-refusal.d.ts +8 -0
  221. package/dist/transcription/normalize.d.ts +23 -0
  222. package/dist/transcription/providers/azure-mai.d.ts +12 -0
  223. package/dist/transcription/providers/azure-openai.d.ts +4 -0
  224. package/dist/transcription/providers/openai.d.ts +16 -0
  225. package/dist/transcription/providers/subscription-core.d.ts +39 -0
  226. package/dist/transcription/service.d.ts +10 -1
  227. package/dist/transcription/wav-duration.d.ts +8 -0
  228. package/dist/workspace-tool-gateway-attestations.d.ts +37 -0
  229. package/dist/workspace-tool-gateway-observability.d.ts +16 -0
  230. package/dist/workspace-tool-gateway-secrets.d.ts +27 -0
  231. package/dist/workspace-tool-gateway.d.ts +102 -6
  232. package/dist/workspace-tool-target-fence.d.ts +116 -0
  233. package/dist/workspace-tool-target.d.ts +225 -0
  234. package/dist/workspace-webhook-dispatch.d.ts +26 -0
  235. package/dist/xai-subscription-core.d.ts +60 -0
  236. package/package.json +25 -20
  237. package/src/access-grant-rls.ts +64 -14
  238. package/src/admission-trace.ts +14 -0
  239. package/src/app.ts +1684 -252
  240. package/src/artifact-catalog-cursor.ts +1 -0
  241. package/src/attached-browser-viewer.ts +26 -0
  242. package/src/auth/managed-auth-attempt-context.ts +9 -0
  243. package/src/auth/managed-auth-rate-limits.ts +252 -0
  244. package/src/auth/managed-auth-session-adapter.ts +64 -29
  245. package/src/auth/managed-auth.ts +303 -35
  246. package/src/auth/managed-email.ts +18 -1
  247. package/src/auth/managed-sign-in-notifications.ts +81 -0
  248. package/src/auth/new-signups-gate.ts +49 -0
  249. package/src/auth/organization-user-setup.ts +3 -3
  250. package/src/auth/signup-funnel-metrics.ts +164 -0
  251. package/src/azure-live.ts +103 -0
  252. package/src/browser-action-fences.ts +45 -0
  253. package/src/browser-controller-authority.ts +1 -186
  254. package/src/browser-ephemeral.ts +39 -0
  255. package/src/browser-lost-runtime-end.ts +71 -0
  256. package/src/browser-state-authority.ts +1 -236
  257. package/src/claude-default-models.ts +37 -0
  258. package/src/claude-subscription-core.ts +154 -0
  259. package/src/claude-subscription-oauth.ts +352 -0
  260. package/src/claude-subscription-profile.ts +73 -0
  261. package/src/claude-subscription-usage.ts +51 -0
  262. package/src/claude-workspace-connection.ts +82 -0
  263. package/src/codemode.ts +236 -39
  264. package/src/codex-realtime.ts +181 -53
  265. package/src/codex-session-pointers.ts +80 -0
  266. package/src/company-brain-okf.ts +1 -1
  267. package/src/connected-machine-computer-access.ts +2 -1
  268. package/src/connection-ownership.ts +19 -13
  269. package/src/controller-data-plane.ts +34 -0
  270. package/src/credit-promotion-snapshot.ts +36 -0
  271. package/src/editable-artifact-production.ts +10 -0
  272. package/src/editable-artifact-source-session.ts +123 -0
  273. package/src/editable-artifact-websocket.ts +16 -3
  274. package/src/fatal-process-boundary.ts +67 -3
  275. package/src/gateway-realtime.ts +12 -8
  276. package/src/github-access.ts +31 -5
  277. package/src/github-browser-flow.ts +1 -1
  278. package/src/http/acting-person.ts +105 -0
  279. package/src/http/api-contract-compat.ts +49 -0
  280. package/src/http/api-error.ts +210 -2
  281. package/src/http/auth.ts +68 -4
  282. package/src/http/cors.ts +37 -5
  283. package/src/http/deprecation.ts +118 -0
  284. package/src/http/keyed-admission.ts +29 -0
  285. package/src/http/local-browser-boundary.ts +343 -0
  286. package/src/http/metrics-listener.ts +57 -0
  287. package/src/http/path-identifier.ts +54 -0
  288. package/src/http/registered-route-label.ts +34 -0
  289. package/src/http/rejection-telemetry.ts +120 -0
  290. package/src/http/request-body.ts +127 -0
  291. package/src/http/request-source.ts +154 -13
  292. package/src/http/sse.ts +88 -28
  293. package/src/http/unmatched-route.ts +60 -0
  294. package/src/http/user-content.ts +158 -0
  295. package/src/http/variable-sets-removed.ts +122 -0
  296. package/src/http/websocket-upgrade-dispatch.ts +29 -0
  297. package/src/index.ts +107 -57
  298. package/src/integration-connect-metrics.ts +228 -0
  299. package/src/integration-endpoint-test.ts +291 -0
  300. package/src/integrations/api-integrations.ts +81 -7
  301. package/src/integrations/atlassian.ts +202 -83
  302. package/src/integrations/fiken.ts +66 -38
  303. package/src/integrations/github-app-connect.ts +64 -18
  304. package/src/integrations/github-lens-connect.ts +8 -29
  305. package/src/integrations/google-drive.ts +448 -152
  306. package/src/integrations/integration-commit-authority.ts +69 -0
  307. package/src/integrations/marketplace-plugin.ts +1 -1
  308. package/src/integrations/oauth-client.ts +733 -193
  309. package/src/integrations/oauth-profiles.ts +116 -45
  310. package/src/integrations/onepassword-vault-provider.ts +16 -0
  311. package/src/integrations/personal-github-repositories.ts +1 -1
  312. package/src/integrations/personal-github.ts +61 -35
  313. package/src/integrations/provider-oauth.ts +67 -85
  314. package/src/integrations/slack-app-home.ts +5 -5
  315. package/src/integrations/slack-bot.ts +893 -201
  316. package/src/integrations/slack-file-upload-flow.ts +147 -0
  317. package/src/integrations/slack-install.ts +7 -7
  318. package/src/integrations/slack-interactions.ts +1589 -299
  319. package/src/integrations/slack-mrkdwn.ts +193 -0
  320. package/src/integrations/slack-routing.ts +2 -2
  321. package/src/integrations/slack-session-defaults.ts +224 -0
  322. package/src/integrations/slack-task-file-upload.ts +323 -0
  323. package/src/integrations/slack-tool-review.ts +65 -0
  324. package/src/integrations/social-oauth.ts +90 -58
  325. package/src/interaction-agent-access.ts +40 -20
  326. package/src/interaction-agent-version.ts +85 -0
  327. package/src/interaction-holder-heartbeat.ts +24 -8
  328. package/src/interaction-metrics.ts +164 -2
  329. package/src/interaction-route-stages.ts +94 -0
  330. package/src/interaction-secrets-vault.ts +213 -0
  331. package/src/interaction-secrets.ts +426 -0
  332. package/src/mcp/action-catalog-types.ts +14 -0
  333. package/src/mcp/action-catalog.gen.ts +8014 -0
  334. package/src/mcp/action-descriptions.ts +299 -0
  335. package/src/mcp/action-schema-imports.gen.ts +304 -0
  336. package/src/mcp/capability-account-readiness.ts +17 -0
  337. package/src/mcp/child-read-evidence.ts +19 -0
  338. package/src/mcp/company-profile-agent-admin.ts +13 -0
  339. package/src/mcp/contract-input.ts +165 -0
  340. package/src/mcp/documents.ts +9 -2
  341. package/src/mcp/editable-artifacts.ts +29 -11
  342. package/src/mcp/files.ts +5 -1
  343. package/src/mcp/first-party-tool-permissions.ts +7 -285
  344. package/src/mcp/knowledge-entries.ts +108 -34
  345. package/src/mcp/notification-tools.ts +480 -0
  346. package/src/mcp/orchestration-failure-diagnostic.ts +43 -0
  347. package/src/mcp/scheduled-task-input.ts +89 -0
  348. package/src/mcp/scheduled-task-view.ts +63 -3
  349. package/src/mcp/secret-tools.ts +185 -0
  350. package/src/mcp/server.ts +2213 -1116
  351. package/src/mcp/session-admin-access-tools.ts +163 -0
  352. package/src/mcp/session-event-errors.ts +123 -0
  353. package/src/mcp/session-event-view.ts +395 -13
  354. package/src/mcp/session-view.ts +3 -0
  355. package/src/mcp/session-wait.ts +67 -7
  356. package/src/mcp/site-agent-clamp-tools.ts +140 -0
  357. package/src/mcp/site-data-tools.ts +339 -0
  358. package/src/mcp/site-publication-tools.ts +201 -0
  359. package/src/mcp/site-sql-tools.ts +427 -0
  360. package/src/mcp-oauth.ts +635 -45
  361. package/src/model-calls/chat-completions.ts +352 -0
  362. package/src/model-calls/pending-usage-settlements.ts +125 -0
  363. package/src/model-calls/service.ts +694 -0
  364. package/src/model-catalog.ts +68 -17
  365. package/src/native-push-dispatch.ts +457 -0
  366. package/src/observability.ts +15 -1
  367. package/src/organization-mcp.ts +485 -0
  368. package/src/prepared-mcp-actor.ts +154 -0
  369. package/src/prepared-mcp-permissions.ts +38 -0
  370. package/src/routes/analytics-consent.ts +123 -0
  371. package/src/routes/api-integrations.ts +268 -9
  372. package/src/routes/api-keys.ts +164 -25
  373. package/src/routes/artifact-catalog.ts +111 -0
  374. package/src/routes/automations.ts +163 -90
  375. package/src/routes/billing.ts +535 -59
  376. package/src/routes/browser-sessions.ts +966 -342
  377. package/src/routes/canonical-human-identities.ts +61 -0
  378. package/src/routes/capabilities.ts +112 -5
  379. package/src/routes/channels.ts +4 -3
  380. package/src/routes/chat-completions.ts +235 -0
  381. package/src/routes/claude-core-usage.ts +147 -0
  382. package/src/routes/claude-subscription-accounts.ts +233 -0
  383. package/src/routes/claude-subscription-oauth.ts +175 -0
  384. package/src/routes/client-errors.ts +394 -0
  385. package/src/routes/codex-core.ts +687 -0
  386. package/src/routes/codex.ts +1277 -1119
  387. package/src/routes/company-brain.ts +4 -0
  388. package/src/routes/computer-sessions.ts +319 -85
  389. package/src/routes/connect.ts +277 -175
  390. package/src/routes/connections.ts +690 -363
  391. package/src/routes/desktop-distribution.ts +217 -0
  392. package/src/routes/documents.ts +13 -7
  393. package/src/routes/editable-artifacts.ts +74 -4
  394. package/src/routes/enrollments.ts +110 -16
  395. package/src/routes/external-identity-links.ts +13 -12
  396. package/src/routes/files.ts +41 -16
  397. package/src/routes/github-browser-fonts.gen.ts +12 -0
  398. package/src/routes/github-browser-pages.ts +258 -0
  399. package/src/routes/github.ts +200 -75
  400. package/src/routes/inbox.ts +353 -0
  401. package/src/routes/insights-response-cache.ts +83 -0
  402. package/src/routes/insights-usage.ts +345 -0
  403. package/src/routes/insights.ts +103 -8
  404. package/src/routes/install.ts +51 -10
  405. package/src/routes/integration-facets.ts +70 -28
  406. package/src/routes/interaction-placement-message.ts +12 -0
  407. package/src/routes/knowledge.ts +136 -27
  408. package/src/routes/machines.ts +189 -135
  409. package/src/routes/managed-auth-session-sets.ts +43 -10
  410. package/src/routes/managed-onboarding.ts +39 -19
  411. package/src/routes/managed-sign-in-methods.ts +433 -0
  412. package/src/routes/memory-slack-publications.ts +3 -2
  413. package/src/routes/model-account-choice.ts +194 -0
  414. package/src/routes/model-account-settings.ts +235 -0
  415. package/src/routes/model-connection-access.ts +210 -48
  416. package/src/routes/native-app-auth.ts +296 -0
  417. package/src/routes/organization-integration-policy.ts +116 -0
  418. package/src/routes/organization-integrations.ts +326 -0
  419. package/src/routes/organization-mcp-connections.ts +183 -0
  420. package/src/routes/organization-memberships.ts +205 -19
  421. package/src/routes/organization-model-defaults.ts +110 -0
  422. package/src/routes/organization-model-providers.ts +74 -3
  423. package/src/routes/organization-service-accounts.ts +128 -0
  424. package/src/routes/organization-sessions.ts +21 -5
  425. package/src/routes/personal-api-keys.ts +184 -0
  426. package/src/routes/personal-github-git-broker.ts +2 -2
  427. package/src/routes/personal-github.ts +9 -4
  428. package/src/routes/plugins.ts +46 -7
  429. package/src/routes/pr-review-github.ts +105 -118
  430. package/src/routes/pr-review.ts +88 -82
  431. package/src/routes/preference-registry.ts +18 -0
  432. package/src/routes/rigs.ts +48 -13
  433. package/src/routes/scheduled-tasks.ts +347 -27
  434. package/src/routes/session-admin-access.ts +271 -0
  435. package/src/routes/session-artifact-associations.ts +164 -0
  436. package/src/routes/session-history-imports.ts +305 -0
  437. package/src/routes/sessions.ts +1682 -363
  438. package/src/routes/site-data.ts +340 -0
  439. package/src/routes/site-publishing.ts +584 -0
  440. package/src/routes/site-runtime.ts +1944 -0
  441. package/src/routes/site-sql.ts +263 -0
  442. package/src/routes/skill-content.ts +72 -7
  443. package/src/routes/skills.ts +5 -4
  444. package/src/routes/slack-bot-access.ts +108 -0
  445. package/src/routes/social.ts +27 -15
  446. package/src/routes/subscription-account-pools.ts +209 -0
  447. package/src/routes/subscription-core-http.ts +18 -0
  448. package/src/routes/subscription-pool-access.ts +180 -0
  449. package/src/routes/subscription-pool-core.ts +552 -0
  450. package/src/routes/supergrok.ts +174 -655
  451. package/src/routes/transcription-recordings.ts +71 -4
  452. package/src/routes/transcriptions.ts +26 -2
  453. package/src/routes/usage-allowances.ts +381 -0
  454. package/src/routes/variable-sets-removed.ts +19 -0
  455. package/src/routes/vault-providers.ts +782 -0
  456. package/src/routes/vaults.ts +421 -0
  457. package/src/routes/video-generation.ts +30 -12
  458. package/src/routes/workspace-artifacts.ts +165 -53
  459. package/src/routes/workspace-integrations.ts +576 -0
  460. package/src/routes/workspace-model-providers.ts +148 -0
  461. package/src/routes/workspace-state.ts +4 -0
  462. package/src/routes/workspaces.ts +625 -117
  463. package/src/sandbox/agent-update.ts +315 -0
  464. package/src/sandbox/auth-callout.ts +104 -21
  465. package/src/sandbox/channel-a.ts +165 -55
  466. package/src/sandbox/enrollment.ts +131 -22
  467. package/src/sandbox/machine-audience.ts +192 -0
  468. package/src/sandbox/machines.ts +75 -31
  469. package/src/sandbox/metrics-ingestion.ts +133 -2
  470. package/src/sandbox/rematerialize.ts +51 -21
  471. package/src/sandbox/screen-control.ts +289 -0
  472. package/src/sandbox/viewer.ts +33 -58
  473. package/src/sandbox-file-artifacts.ts +53 -27
  474. package/src/scheduled-task-blockers.ts +293 -0
  475. package/src/scheduled-task-deletion.ts +13 -3
  476. package/src/scheduled-task-lifecycle.ts +84 -0
  477. package/src/secret-answers.ts +119 -0
  478. package/src/session-create-observability.ts +46 -0
  479. package/src/session-realtime-context.ts +26 -4
  480. package/src/signed-state-secret.ts +58 -0
  481. package/src/site-agent-guard.ts +261 -0
  482. package/src/site-data/operations.ts +777 -0
  483. package/src/site-data/service.ts +1043 -0
  484. package/src/site-frame-guard.ts +107 -0
  485. package/src/site-publishing/agent-data-tools.ts +250 -0
  486. package/src/site-publishing/agent-model.ts +127 -0
  487. package/src/site-publishing/agent-session.ts +148 -0
  488. package/src/site-publishing/content-scanner.ts +93 -0
  489. package/src/site-publishing/edge-sync.ts +148 -0
  490. package/src/site-publishing/gateway-signature.ts +198 -0
  491. package/src/site-publishing/limits.ts +315 -0
  492. package/src/site-publishing/page-tool-authority.ts +111 -0
  493. package/src/site-publishing/platform-usage.ts +479 -0
  494. package/src/site-publishing/platform.ts +98 -0
  495. package/src/site-publishing/readiness.ts +330 -0
  496. package/src/site-publishing/runtime.ts +831 -0
  497. package/src/site-publishing/service.ts +1282 -0
  498. package/src/site-publishing/session-events.ts +262 -0
  499. package/src/site-publishing/session-views.ts +262 -0
  500. package/src/site-publishing/viewer.ts +75 -0
  501. package/src/site-session-origin.ts +91 -6
  502. package/src/site-sql/format.ts +134 -0
  503. package/src/site-sql/gateway.ts +168 -0
  504. package/src/site-sql/service.ts +1636 -0
  505. package/src/site-uploads.ts +27 -5
  506. package/src/temporal-schedule-sync.ts +74 -0
  507. package/src/transcription/billing-refusal.ts +14 -0
  508. package/src/transcription/normalize.ts +77 -0
  509. package/src/transcription/providers/azure-mai.ts +98 -0
  510. package/src/transcription/providers/azure-openai.ts +16 -7
  511. package/src/transcription/providers/codex-subscription.ts +190 -67
  512. package/src/transcription/providers/openai.ts +79 -5
  513. package/src/transcription/providers/subscription-core.ts +125 -0
  514. package/src/transcription/providers/xai-subscription.ts +81 -83
  515. package/src/transcription/segmenter.ts +7 -1
  516. package/src/transcription/service.ts +239 -10
  517. package/src/transcription/wav-duration.ts +39 -0
  518. package/src/workspace-deletion.ts +25 -1
  519. package/src/workspace-tool-gateway-attestations.ts +133 -0
  520. package/src/workspace-tool-gateway-observability.ts +64 -0
  521. package/src/workspace-tool-gateway-secrets.ts +104 -0
  522. package/src/workspace-tool-gateway.ts +921 -103
  523. package/src/workspace-tool-target-fence.ts +380 -0
  524. package/src/workspace-tool-target.ts +554 -0
  525. package/src/workspace-webhook-dispatch.ts +225 -0
  526. package/src/xai-realtime.ts +85 -81
  527. package/src/xai-subscription-core.ts +172 -0
  528. package/dist/browser-auth-broker.d.ts +0 -20
  529. package/dist/chunk-AJ62T5QN.js.map +0 -1
  530. package/dist/connection-authority-owner.d.ts +0 -59
  531. package/dist/routes/connection-authorities.d.ts +0 -3
  532. package/dist/routes/environments.d.ts +0 -5
  533. package/dist/routes/host-mcp-bindings.d.ts +0 -5
  534. package/dist/routes/host-mcp-resolvers.d.ts +0 -3
  535. package/dist/routes/packs.d.ts +0 -3
  536. package/dist/session-event-view-MU3HMNV3.js +0 -264
  537. package/dist/session-event-view-MU3HMNV3.js.map +0 -1
  538. package/dist/xai-subscription-auth.d.ts +0 -23
  539. package/src/browser-auth-broker.ts +0 -155
  540. package/src/connection-authority-owner.ts +0 -61
  541. package/src/routes/connection-authorities.ts +0 -139
  542. package/src/routes/environments.ts +0 -388
  543. package/src/routes/host-mcp-bindings.ts +0 -122
  544. package/src/routes/host-mcp-resolvers.ts +0 -41
  545. package/src/routes/packs.ts +0 -784
  546. package/src/xai-subscription-auth.ts +0 -139
@@ -0,0 +1,225 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { environmentsEncryptionKeyBytes, type Settings } from "@opengeni/config";
3
+ import {
4
+ OPENGENI_DELIVERY_ID_HEADER,
5
+ OPENGENI_EVENT_ID_HEADER,
6
+ OPENGENI_SIGNATURE_HEADER,
7
+ signOpenGeniPayload,
8
+ } from "@opengeni/contracts";
9
+ import {
10
+ claimWorkspaceWebhookDeliveries,
11
+ claimOrganizationWebhookDeliveries,
12
+ decryptEnvironmentValue,
13
+ maintainSessionUsageLimits,
14
+ maintainWorkspaceAllowances,
15
+ pruneOrganizationWebhookDeliveries,
16
+ pruneWorkspaceWebhookDeliveries,
17
+ settleOrganizationWebhookDelivery,
18
+ settleWorkspaceWebhookDelivery,
19
+ type ClaimedWorkspaceWebhookDelivery,
20
+ type Database,
21
+ } from "@opengeni/db";
22
+ import { pinnedFetch } from "@opengeni/network";
23
+ import type { Observability } from "@opengeni/observability";
24
+ import { recordSessionUsageLimitEvent } from "@opengeni/core";
25
+
26
+ export const WORKSPACE_WEBHOOK_DISPATCH_BATCH_SIZE = 32;
27
+ const CLAIM_SECONDS = 60;
28
+ const POLL_INTERVAL_MS = 2_000;
29
+ const DELIVERY_TIMEOUT_MS = 10_000;
30
+ const PRUNE_EVERY_TICKS = 300;
31
+
32
+ export type WorkspaceWebhookDispatchDeps = {
33
+ db: Database;
34
+ settings: Settings;
35
+ observability?: Pick<Observability, "info" | "warn" | "error"> &
36
+ Partial<Pick<Observability, "incrementCounter">>;
37
+ fetch?: typeof pinnedFetch;
38
+ };
39
+
40
+ export type WorkspaceWebhookBatchResult = { claimed: number; delivered: number; failed: number };
41
+
42
+ function errorText(error: unknown): string {
43
+ if (error instanceof Error) {
44
+ if (error.name === "TimeoutError" || error.name === "AbortError") return "timeout";
45
+ return `${error.name}: ${error.message}`.slice(0, 500);
46
+ }
47
+ return String(error).slice(0, 500);
48
+ }
49
+
50
+ async function deliverOne(
51
+ deps: WorkspaceWebhookDispatchDeps,
52
+ key: Uint8Array,
53
+ claimId: string,
54
+ delivery: ClaimedWorkspaceWebhookDelivery,
55
+ organization = false,
56
+ ): Promise<"delivered" | "failed"> {
57
+ let status: number | null = null;
58
+ let error: string | null = null;
59
+ try {
60
+ const body = JSON.stringify(delivery.payload);
61
+ const secret = decryptEnvironmentValue(key, delivery.secretEncrypted);
62
+ const response = await (deps.fetch ?? pinnedFetch)(
63
+ delivery.url,
64
+ {
65
+ method: "POST",
66
+ headers: {
67
+ "content-type": "application/json",
68
+ "user-agent": "OpenGeni-Webhooks/1",
69
+ [OPENGENI_SIGNATURE_HEADER]: await signOpenGeniPayload(secret, body),
70
+ [OPENGENI_EVENT_ID_HEADER]: delivery.eventId,
71
+ [OPENGENI_DELIVERY_ID_HEADER]: delivery.deliveryId,
72
+ },
73
+ body,
74
+ signal: AbortSignal.timeout(DELIVERY_TIMEOUT_MS),
75
+ },
76
+ deps.settings,
77
+ {
78
+ label: organization ? "Organization webhook" : "Workspace webhook",
79
+ requireHttpsOutsideLocalTest: true,
80
+ },
81
+ );
82
+ status = response.status;
83
+ await response.body?.cancel().catch(() => undefined);
84
+ if (status < 200 || status >= 300) error = `HTTP ${status}`;
85
+ } catch (caught) {
86
+ error = errorText(caught);
87
+ }
88
+ await (organization ? settleOrganizationWebhookDelivery : settleWorkspaceWebhookDelivery)(
89
+ deps.db,
90
+ {
91
+ deliveryId: delivery.deliveryId,
92
+ claimId,
93
+ status,
94
+ error,
95
+ },
96
+ );
97
+ return error === null ? "delivered" : "failed";
98
+ }
99
+
100
+ /**
101
+ * One bounded, resumable page of the per-task usage limit legacy import.
102
+ * Roots created before the feature stay `preparing` (never shown or
103
+ * admitted as $0 for a write) until this converges them. A failure is retried
104
+ * on a later tick (per-root exponential backoff with its SQLSTATE kept) and
105
+ * never blocks webhook delivery. The same pass discloses lost single-call
106
+ * custody markers as unpriced so a crashed process cannot block a task forever.
107
+ */
108
+ async function importLegacySessionUsage(deps: WorkspaceWebhookDispatchDeps): Promise<void> {
109
+ const sink = deps.observability?.incrementCounter ? deps.observability : null;
110
+ const metrics = sink as Pick<Observability, "incrementCounter"> | null;
111
+ try {
112
+ const result = await maintainSessionUsageLimits(deps.db);
113
+ recordSessionUsageLimitEvent(metrics, "import", "imported", result.processed);
114
+ recordSessionUsageLimitEvent(metrics, "import", "import_failed", result.failed);
115
+ recordSessionUsageLimitEvent(metrics, "single_call", "lost_resolved", result.resolvedLost);
116
+ if (result.failed > 0) {
117
+ deps.observability?.warn("Session usage limit import pages failed", {
118
+ failed: result.failed,
119
+ sqlstates: JSON.stringify(result.errors),
120
+ });
121
+ }
122
+ } catch (error) {
123
+ recordSessionUsageLimitEvent(metrics, "import", "import_failed");
124
+ deps.observability?.warn("Session usage limit import failed", { error: errorText(error) });
125
+ }
126
+ }
127
+
128
+ /** Claim and deliver one globally bounded batch. At-least-once: receivers dedupe on event id. */
129
+ export async function drainWorkspaceWebhookDeliveries(
130
+ deps: WorkspaceWebhookDispatchDeps,
131
+ ): Promise<WorkspaceWebhookBatchResult> {
132
+ // Usage-limit maintenance contains its own failures, so it runs first: a
133
+ // failing allowance pass cannot keep lost custody markers (and the tasks
134
+ // they park) unresolved.
135
+ await importLegacySessionUsage(deps);
136
+ // Allowance rollover/expiry does not depend on webhook secrets, usage
137
+ // readers, inference or having any pending delivery.
138
+ await maintainWorkspaceAllowances(deps.db);
139
+ const key = environmentsEncryptionKeyBytes(deps.settings);
140
+ if (!key) return { claimed: 0, delivered: 0, failed: 0 };
141
+ const claimId = randomUUID();
142
+ const claims = await claimWorkspaceWebhookDeliveries(deps.db, {
143
+ claimId,
144
+ limit: WORKSPACE_WEBHOOK_DISPATCH_BATCH_SIZE,
145
+ claimSeconds: CLAIM_SECONDS,
146
+ });
147
+ // Each lane is bounded; the shared pump does not starve organization queues
148
+ // behind a sustained workspace backlog.
149
+ const organizationClaims = await claimOrganizationWebhookDeliveries(deps.db, {
150
+ claimId,
151
+ limit: WORKSPACE_WEBHOOK_DISPATCH_BATCH_SIZE,
152
+ claimSeconds: CLAIM_SECONDS,
153
+ });
154
+ const outcomes = await Promise.all(
155
+ [
156
+ ...claims.map((delivery) => ({ delivery, organization: false })),
157
+ ...organizationClaims.map((delivery) => ({ delivery, organization: true })),
158
+ ].map(async ({ delivery, organization }) => {
159
+ try {
160
+ return await deliverOne(deps, key, claimId, delivery, organization);
161
+ } catch (error) {
162
+ deps.observability?.warn("Workspace webhook settlement failed", {
163
+ deliveryId: delivery.deliveryId,
164
+ error: errorText(error),
165
+ });
166
+ return "failed" as const;
167
+ }
168
+ }),
169
+ );
170
+ return {
171
+ claimed: claims.length + organizationClaims.length,
172
+ delivered: outcomes.filter((outcome) => outcome === "delivered").length,
173
+ failed: outcomes.filter((outcome) => outcome === "failed").length,
174
+ };
175
+ }
176
+
177
+ /**
178
+ * One non-overlapping loop per API replica. PostgreSQL claims coordinate
179
+ * replicas; a crash only delays a delivery until its claim expires.
180
+ */
181
+ export function startWorkspaceWebhookDispatchPump(
182
+ deps: WorkspaceWebhookDispatchDeps,
183
+ options: {
184
+ intervalMs?: number;
185
+ drain?: (deps: WorkspaceWebhookDispatchDeps) => Promise<WorkspaceWebhookBatchResult>;
186
+ } = {},
187
+ ): () => Promise<void> {
188
+ const intervalMs = Math.max(100, options.intervalMs ?? POLL_INTERVAL_MS);
189
+ const drain = options.drain ?? drainWorkspaceWebhookDeliveries;
190
+ let stopped = false;
191
+ let running: Promise<void> | undefined;
192
+ let ticks = 0;
193
+
194
+ const tick = (): void => {
195
+ if (stopped || running) return;
196
+ ticks += 1;
197
+ // A full batch means a backlog: drain it now instead of one batch per interval.
198
+ let backlog = false;
199
+ running = (async () => {
200
+ const result = await drain(deps);
201
+ backlog = result.claimed >= WORKSPACE_WEBHOOK_DISPATCH_BATCH_SIZE;
202
+ if (result.claimed > 0) deps.observability?.info("Workspace webhook batch settled", result);
203
+ if (ticks % PRUNE_EVERY_TICKS === 0) {
204
+ await pruneWorkspaceWebhookDeliveries(deps.db);
205
+ await pruneOrganizationWebhookDeliveries(deps.db);
206
+ }
207
+ })()
208
+ .catch((error: unknown) => {
209
+ deps.observability?.error("Workspace webhook dispatch failed", { error: errorText(error) });
210
+ })
211
+ .finally(() => {
212
+ running = undefined;
213
+ if (backlog && !stopped) queueMicrotask(tick);
214
+ });
215
+ };
216
+
217
+ const timer = setInterval(tick, intervalMs);
218
+ queueMicrotask(tick);
219
+
220
+ return async () => {
221
+ stopped = true;
222
+ clearInterval(timer);
223
+ await running;
224
+ };
225
+ }
@@ -3,21 +3,24 @@ import type { GatewayRealtimeInitialItem } from "@opengeni/contracts";
3
3
  import {
4
4
  getActiveSessionHistoryItems,
5
5
  getSessionRealtimeContinuityEntries,
6
- getXaiSessionAccountPin,
7
- resolveXaiProviderAccountAuthoritySnapshotForAcceptance,
8
- setXaiSessionAccountPin,
6
+ readSubscriptionCoreProviderRouteForWorkspace,
7
+ readSubscriptionCoreSessionOwner,
8
+ SUBSCRIPTION_CORE_XAI,
9
+ SUBSCRIPTION_CORE_XAI_PROVIDER,
10
+ subscriptionCoreOperationConnections,
11
+ subscriptionCoreXaiRequestAuth,
9
12
  type Database,
13
+ type SubscriptionCoreFetch,
10
14
  } from "@opengeni/db";
11
15
  import {
12
16
  XAI_CLIENT_MODE,
13
17
  XAI_CLIENT_VERSION,
14
18
  XAI_PUBLIC_API_BASE_URL,
15
- type XaiFetch,
19
+ type XaiProxyAuthContext,
16
20
  } from "@opengeni/xai-subscription";
17
21
 
18
22
  import { openGeniRealtimeInstructions } from "./codex-realtime";
19
23
  import { projectSessionRealtimeInitialItems } from "./session-realtime-context";
20
- import { buildXaiSubscriptionAuthorization } from "./xai-subscription-auth";
21
24
 
22
25
  const UPSTREAM_MODEL_ID = "grok-voice-think-fast-2.0";
23
26
 
@@ -61,86 +64,85 @@ export async function createXaiRealtimeConnectionSecret(input: {
61
64
  "The selected model is not a connected SuperGrok realtime model",
62
65
  );
63
66
  }
64
- const authoritySnapshot = await resolveXaiProviderAccountAuthoritySnapshotForAcceptance(
65
- input.db,
66
- { workspaceId: input.workspaceId, subjectId: input.subjectId },
67
- );
68
- let pin = await getXaiSessionAccountPin(input.db, {
67
+ const route = await readSubscriptionCoreProviderRouteForWorkspace(input.db, {
68
+ accountId: input.accountId,
69
69
  workspaceId: input.workspaceId,
70
- subjectId: input.subjectId,
71
- sessionId: input.sessionId,
72
- authoritySnapshot,
70
+ provider: SUBSCRIPTION_CORE_XAI_PROVIDER,
73
71
  });
74
- let auth: Awaited<ReturnType<typeof buildXaiSubscriptionAuthorization>>;
75
- try {
76
- auth = await buildXaiSubscriptionAuthorization({
77
- db: input.db,
78
- settings: input.settings,
79
- accountId: input.accountId,
80
- workspaceId: input.workspaceId,
81
- subjectId: input.subjectId,
82
- shardKey: input.sessionId,
83
- pinnedCredentialId: pin?.pinnedCredentialId ?? null,
84
- pinSource: pin?.pinSource === "manual" || pin?.pinSource === "policy" ? pin.pinSource : null,
85
- authoritySnapshot,
86
- sessionId: input.sessionId,
87
- ...(input.fetchImpl ? { fetch: input.fetchImpl as XaiFetch } : {}),
88
- });
89
- if (
90
- auth.rotationEnabled &&
91
- pin?.pinSource !== "manual" &&
92
- pin?.pinnedCredentialId !== auth.credentialId
93
- ) {
94
- try {
95
- pin = await setXaiSessionAccountPin(input.db, {
96
- accountId: input.accountId,
97
- workspaceId: input.workspaceId,
98
- subjectId: input.subjectId,
99
- sessionId: input.sessionId,
100
- authoritySnapshot,
101
- credentialId: auth.credentialId,
102
- pinSource: "policy",
103
- expectedVersion: pin?.version ?? null,
104
- });
105
- } catch {
106
- const current = await getXaiSessionAccountPin(input.db, {
107
- workspaceId: input.workspaceId,
108
- subjectId: input.subjectId,
109
- sessionId: input.sessionId,
110
- authoritySnapshot,
111
- });
112
- if (current?.pinSource === "manual" && current.pinnedCredentialId !== auth.credentialId) {
113
- auth = await buildXaiSubscriptionAuthorization({
114
- db: input.db,
115
- settings: input.settings,
116
- accountId: input.accountId,
117
- workspaceId: input.workspaceId,
118
- subjectId: input.subjectId,
119
- shardKey: input.sessionId,
120
- pinnedCredentialId: current.pinnedCredentialId,
121
- pinSource: "manual",
122
- authoritySnapshot,
123
- sessionId: input.sessionId,
124
- ...(input.fetchImpl ? { fetch: input.fetchImpl as XaiFetch } : {}),
125
- });
126
- }
127
- }
128
- }
129
- } catch {
72
+ // SuperGrok realtime runs only on the shared core; any other route
73
+ // (maintenance, or no receipt) has no eligible account.
74
+ if (route !== "core") {
130
75
  throw new XaiRealtimeBrokerError(
131
76
  "credential_unavailable",
132
77
  "No eligible connected SuperGrok account is available",
133
78
  );
134
79
  }
80
+ return await createCoreXaiRealtimeConnectionSecret(input);
81
+ }
135
82
 
136
- const [history, continuity, minted] = await Promise.all([
137
- getActiveSessionHistoryItems(input.db, input.workspaceId, input.sessionId),
138
- getSessionRealtimeContinuityEntries(input.db, input.workspaceId, input.sessionId),
139
- mintXaiClientSecret({
140
- auth,
83
+ /**
84
+ * SuperGrok realtime on the shared subscription core (the M3 Codex rule,
85
+ * EP-N05/N07/S17): the session's recorded owner (never the caller), shared
86
+ * organization- or workspace-scoped connections only (decision 3), a
87
+ * `realtime` operation lease held through the client-secret request, with
88
+ * refresh under the per-connection lock. The session binding is never read
89
+ * for placement beyond an explicit choice and never written (decision 6).
90
+ */
91
+ async function createCoreXaiRealtimeConnectionSecret(input: {
92
+ db: Database;
93
+ settings: Settings;
94
+ accountId: string;
95
+ workspaceId: string;
96
+ sessionId: string;
97
+ fetchImpl?: typeof fetch;
98
+ }): Promise<XaiRealtimeConnectionSecret> {
99
+ const unavailable = () =>
100
+ new XaiRealtimeBrokerError(
101
+ "credential_unavailable",
102
+ "No eligible connected SuperGrok account is available",
103
+ );
104
+ // The deployment switch for SuperGrok subscriptions, as the Codex broker checks its own.
105
+ if (!input.settings.supergrokSubscriptionEnabled) throw unavailable();
106
+ const context = {
107
+ accountId: input.accountId,
108
+ workspaceId: input.workspaceId,
109
+ sessionId: input.sessionId,
110
+ };
111
+ const owner = await readSubscriptionCoreSessionOwner(input.db, context);
112
+ if (!owner) throw unavailable();
113
+ const scope = {
114
+ kind: "session" as const,
115
+ ...context,
116
+ sessionOwnerSubjectId: owner.ownerSubjectId,
117
+ };
118
+ const connections = subscriptionCoreOperationConnections(SUBSCRIPTION_CORE_XAI);
119
+ const candidates = await connections.listSubscriptionCoreOperationCandidates(input.db, scope);
120
+ const ran = await connections.runSubscriptionCoreOperation(
121
+ input.db,
122
+ input.settings,
123
+ scope,
124
+ {
125
+ candidates: candidates.map((candidate) => candidate.connectionId),
126
+ operationKind: "realtime",
127
+ holderId: `realtime:${input.sessionId}`,
141
128
  fetchImpl: input.fetchImpl ?? fetch,
142
- }),
143
- ]);
129
+ },
130
+ async ({ resolver, fetch: requestFetch, fence }) =>
131
+ await Promise.all([
132
+ getActiveSessionHistoryItems(input.db, input.workspaceId, input.sessionId),
133
+ getSessionRealtimeContinuityEntries(input.db, input.workspaceId, input.sessionId),
134
+ mintXaiClientSecret({
135
+ context: subscriptionCoreXaiRequestAuth(resolver),
136
+ fetchImpl: async (url, init) => {
137
+ // Pre-dispatch fence on the exact operation lease.
138
+ if (!(await fence())) throw unavailable();
139
+ return await requestFetch(url, init);
140
+ },
141
+ }),
142
+ ]),
143
+ );
144
+ if (ran.kind === "unavailable") throw unavailable();
145
+ const [history, continuity, minted] = ran.value;
144
146
  return {
145
147
  ...minted,
146
148
  upstreamModelId: UPSTREAM_MODEL_ID,
@@ -150,8 +152,8 @@ export async function createXaiRealtimeConnectionSecret(input: {
150
152
  }
151
153
 
152
154
  async function mintXaiClientSecret(input: {
153
- auth: Awaited<ReturnType<typeof buildXaiSubscriptionAuthorization>>;
154
- fetchImpl: typeof fetch;
155
+ context: Pick<XaiProxyAuthContext, "getToken" | "refresh">;
156
+ fetchImpl: SubscriptionCoreFetch;
155
157
  }): Promise<{ token: string; url: string; expiresAt: number | null }> {
156
158
  const request = async (accessToken: string) =>
157
159
  await input.fetchImpl(`${XAI_PUBLIC_API_BASE_URL}/realtime/client_secrets`, {
@@ -168,14 +170,16 @@ async function mintXaiClientSecret(input: {
168
170
  });
169
171
  let response: Response;
170
172
  try {
171
- let token = await input.auth.context.getToken();
173
+ let token = await input.context.getToken();
172
174
  response = await request(token.accessToken);
173
175
  if (response.status === 401) {
174
176
  await response.body?.cancel().catch(() => undefined);
175
- token = await input.auth.context.refresh();
177
+ token = await input.context.refresh();
176
178
  response = await request(token.accessToken);
177
179
  }
178
- } catch {
180
+ } catch (error) {
181
+ // A core pre-dispatch fence refusal is already typed (legacy never raises one).
182
+ if (error instanceof XaiRealtimeBrokerError) throw error;
179
183
  throw new XaiRealtimeBrokerError("provider_error", "xAI realtime token request failed");
180
184
  }
181
185
  if (!response.ok) {
@@ -0,0 +1,172 @@
1
+ import type { Settings } from "@opengeni/config";
2
+ import {
3
+ deliverSubscriptionCoreProviderWake,
4
+ readSubscriptionCoreProviderRouteForWorkspace,
5
+ SUBSCRIPTION_CORE_XAI,
6
+ SUBSCRIPTION_CORE_XAI_PROVIDER,
7
+ subscriptionCoreAdministeredConnections,
8
+ subscriptionCoreOperationConnections,
9
+ subscriptionCorePersonalConnections,
10
+ type Database,
11
+ } from "@opengeni/db";
12
+
13
+ /**
14
+ * Whether SuperGrok can serve a workspace-level operation (video funding,
15
+ * realtime catalog, transcription): "a shared xAI candidate exists for
16
+ * this workspace" on the shared core, organization- or workspace-scoped
17
+ * shared connections only, never the viewer's personal accounts (design 5.3,
18
+ * EP-N11). Any route other than `core` (maintenance, or no receipt, which
19
+ * this binary's readiness check refuses) serves nothing.
20
+ */
21
+ export async function workspaceXaiOperationAvailable(
22
+ db: Database,
23
+ settings: Settings,
24
+ input: { accountId: string; workspaceId: string; subjectId: string },
25
+ ): Promise<boolean> {
26
+ const route = await readSubscriptionCoreProviderRouteForWorkspace(db, {
27
+ accountId: input.accountId,
28
+ workspaceId: input.workspaceId,
29
+ provider: SUBSCRIPTION_CORE_XAI_PROVIDER,
30
+ });
31
+ if (route !== "core" || !settings.supergrokSubscriptionEnabled) return false;
32
+ const candidates = await subscriptionCoreOperationConnections(
33
+ SUBSCRIPTION_CORE_XAI,
34
+ ).listSubscriptionCoreOperationCandidates(db, { kind: "workspace", ...input });
35
+ return candidates.length > 0;
36
+ }
37
+
38
+ /** The SuperGrok status payload. */
39
+ export type XaiStatusPayload<Model> = {
40
+ connected: boolean;
41
+ valid: boolean;
42
+ accountCount: number;
43
+ models?: Model[];
44
+ activeAccount?: {
45
+ id: string;
46
+ label: string | null;
47
+ subject: string | null;
48
+ scope: "workspace" | "organization" | "user";
49
+ };
50
+ };
51
+
52
+ /**
53
+ * The SuperGrok status after the cutover receipt (design 5.3, status
54
+ * probe): the workspace's shared pool and its effective primary, validated
55
+ * by one live model read through the adapter on that connection. Any route
56
+ * other than the shared core reports nothing usable.
57
+ *
58
+ * The viewer's own personal connections count as connected wherever the
59
+ * owner-only reader shows them. Only in the viewer's own Personal workspace,
60
+ * only without a shared primary, and only for a caller who passes the
61
+ * owner check of a private account (`ownerVerified`: the verified owning
62
+ * person with `connections:write`, by browser sign-in, a verified
63
+ * external-identity assertion linked to them, or an agent acting with their
64
+ * full access; never a read-only agent, a plain bearer or the person's own
65
+ * API keys), is a personal connection the effective account (legacy scope
66
+ * `user`),
67
+ * validated by one live usage read as its owner there; that read also
68
+ * applies the organization's personal-connections rule (0735). Any other
69
+ * caller gets the stored count only, with no live read and no wake.
70
+ * Another person's personal connections are never listed.
71
+ */
72
+ export async function readXaiCoreStatus<Model>(
73
+ deps: { db: Database; settings: Settings },
74
+ input: {
75
+ accountId: string;
76
+ workspaceId: string;
77
+ subjectId: string;
78
+ models: () => Promise<Model[]>;
79
+ /** Asked only before a live personal read; false refuses it. */
80
+ ownerVerified: () => Promise<boolean>;
81
+ fetch?: unknown;
82
+ },
83
+ ): Promise<XaiStatusPayload<Model>> {
84
+ const scope = {
85
+ kind: "workspace" as const,
86
+ accountId: input.accountId,
87
+ workspaceId: input.workspaceId,
88
+ subjectId: input.subjectId,
89
+ };
90
+ const route = await readSubscriptionCoreProviderRouteForWorkspace(deps.db, {
91
+ ...scope,
92
+ provider: SUBSCRIPTION_CORE_XAI_PROVIDER,
93
+ });
94
+ if (route !== "core") return { connected: false, valid: false, accountCount: 0 };
95
+ const connections = subscriptionCoreOperationConnections(SUBSCRIPTION_CORE_XAI);
96
+ const [pool, personal] = await Promise.all([
97
+ connections.readSubscriptionCoreWorkspaceConnections(deps.db, scope),
98
+ subscriptionCorePersonalConnections(
99
+ SUBSCRIPTION_CORE_XAI,
100
+ ).readSubscriptionCorePersonalConnections(deps.db, scope),
101
+ ]);
102
+ const accountCount = pool.connections.length + personal.connections.length;
103
+ const fetchDeps = input.fetch ? { fetchImpl: input.fetch as typeof fetch } : {};
104
+ const active = pool.connections.find(
105
+ (connection) => connection.connectionId === pool.primaryConnectionId,
106
+ );
107
+ const ownActive = personal.ownPersonalWorkspace
108
+ ? personal.connections.find((connection) => connection.status === "active")
109
+ : undefined;
110
+ if (!active && ownActive && (await input.ownerVerified())) {
111
+ const probe = await subscriptionCoreAdministeredConnections(
112
+ SUBSCRIPTION_CORE_XAI,
113
+ ).probeSubscriptionCoreAdministeredConnectionUsage(
114
+ deps.db,
115
+ deps.settings,
116
+ {
117
+ kind: "personal_owner",
118
+ accountId: input.accountId,
119
+ workspaceId: input.workspaceId,
120
+ subjectId: input.subjectId,
121
+ },
122
+ ownActive.connectionId,
123
+ fetchDeps,
124
+ );
125
+ const valid = probe.kind === "read";
126
+ if (probe.kind === "read" && probe.recovered) {
127
+ // The reading is stored and may have ended an exhaustion: wake the
128
+ // organization's SuperGrok core waiters. The reading already
129
+ // committed, so a failed wake hint never fails the status (every core
130
+ // waiter has its own recheck).
131
+ await deliverSubscriptionCoreProviderWake(deps.db, SUBSCRIPTION_CORE_XAI_PROVIDER, {
132
+ accountId: input.accountId,
133
+ reason: "usage_recovered",
134
+ }).catch(() => undefined);
135
+ }
136
+ return {
137
+ connected: true,
138
+ valid,
139
+ accountCount,
140
+ models: valid ? await input.models() : [],
141
+ activeAccount: {
142
+ id: ownActive.connectionId,
143
+ label: ownActive.label,
144
+ subject: ownActive.providerAccountId,
145
+ scope: "user",
146
+ },
147
+ };
148
+ }
149
+ if (!active) {
150
+ return { connected: accountCount > 0, valid: false, accountCount };
151
+ }
152
+ const probe = await connections.probeSubscriptionCoreConnectionLiveModels(
153
+ deps.db,
154
+ deps.settings,
155
+ scope,
156
+ active.connectionId,
157
+ fetchDeps,
158
+ );
159
+ const valid = probe.kind === "read";
160
+ return {
161
+ connected: true,
162
+ valid,
163
+ accountCount,
164
+ models: valid ? await input.models() : [],
165
+ activeAccount: {
166
+ id: active.connectionId,
167
+ label: active.label,
168
+ subject: active.providerAccountId,
169
+ scope: active.source,
170
+ },
171
+ };
172
+ }
@@ -1,20 +0,0 @@
1
- import type { BrowserProtectedAuthFieldValue, ProtectedAuthField, SiteAuthAuthority } from "@opengeni/contracts";
2
- type ConnectionFieldsAuthority = Extract<SiteAuthAuthority, {
3
- kind: "connection_fields";
4
- }>;
5
- export declare class BrowserAuthCredentialError extends Error {
6
- readonly name = "BrowserAuthCredentialError";
7
- }
8
- export declare function resolveProtectedAuthFieldValues(input: {
9
- authority: ConnectionFieldsAuthority;
10
- requestedFields: readonly ProtectedAuthField[];
11
- credential: Readonly<Record<string, unknown>>;
12
- nowMs?: number;
13
- }): BrowserProtectedAuthFieldValue[];
14
- export declare function totpCode(secretValue: string, options?: {
15
- digits?: number;
16
- periodSeconds?: number;
17
- algorithm?: "sha1" | "sha256" | "sha512";
18
- nowMs?: number;
19
- }): string;
20
- export {};