@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,235 @@
1
+ import {
2
+ ModelAccountSettingsOverview,
3
+ OrganizationModelAccountSettings,
4
+ UpdateOrganizationModelAccountSettingsRequest,
5
+ UpdateWorkspaceModelAccountSettingsRequest,
6
+ WorkspaceModelAccountSettings,
7
+ } from "@opengeni/contracts";
8
+ import { requireAccessGrant, type ApiRouteDeps } from "@opengeni/core";
9
+ import {
10
+ deliverSubscriptionCoreCodexWake,
11
+ readOrganizationSubscriptionSettings,
12
+ readSubscriptionSettingsOverview,
13
+ readWorkspaceSubscriptionSettings,
14
+ SubscriptionSettingsBusyError,
15
+ SubscriptionSettingsForbiddenError,
16
+ SubscriptionSettingsInvalidError,
17
+ SubscriptionSettingsLockedError,
18
+ subscriptionSettingLockRefusal,
19
+ SubscriptionSettingsPersonalWorkspaceError,
20
+ SubscriptionSettingsVersionConflictError,
21
+ updateOrganizationSubscriptionSettings,
22
+ updateWorkspaceSubscriptionSettings,
23
+ type SubscriptionSettingsWake,
24
+ } from "@opengeni/db";
25
+ import type { Context, Hono } from "hono";
26
+ import { HTTPException } from "hono/http-exception";
27
+ import { z } from "zod";
28
+
29
+ import { ApiHttpError } from "../http/api-error";
30
+ import { requireOrganizationCodexHuman, requireSameOriginBrowserMutation } from "./codex";
31
+
32
+ const Uuid = z.string().uuid();
33
+
34
+ function parseId(value: string | undefined, what: "organization" | "workspace"): string {
35
+ const parsed = Uuid.safeParse(value);
36
+ if (!parsed.success) throw new HTTPException(404, { message: `${what} not found` });
37
+ return parsed.data;
38
+ }
39
+
40
+ /**
41
+ * 409 `setting_locked` for any write the organization's settings lock refused:
42
+ * these routes and every older route whose write meets the 0724 guard (for
43
+ * example a Codex rotation, primary or source change). Mapped centrally in
44
+ * the app error handler.
45
+ */
46
+ export function subscriptionSettingsLockedHttpError(error: unknown): ApiHttpError | null {
47
+ const settings =
48
+ error instanceof SubscriptionSettingsLockedError
49
+ ? [...error.settings]
50
+ : subscriptionSettingLockRefusal(error);
51
+ if (settings === null) return null;
52
+ return new ApiHttpError(409, {
53
+ code: "conflict",
54
+ message: "the organization locked this setting",
55
+ retryable: false,
56
+ outcomeUnknown: false,
57
+ details: { reason: "setting_locked", settings },
58
+ });
59
+ }
60
+
61
+ /** Typed refusals to HTTP: 403, 409 (locked, Personal workspace, version), 422 or 503 (busy). */
62
+ function refused(error: unknown): never {
63
+ if (error instanceof SubscriptionSettingsForbiddenError) {
64
+ throw new HTTPException(403, { message: error.message });
65
+ }
66
+ const locked = subscriptionSettingsLockedHttpError(error);
67
+ if (locked) throw locked;
68
+ if (error instanceof SubscriptionSettingsPersonalWorkspaceError) {
69
+ throw new ApiHttpError(409, {
70
+ code: "conflict",
71
+ message: error.message,
72
+ retryable: false,
73
+ outcomeUnknown: false,
74
+ details: { reason: "personal_workspace" },
75
+ });
76
+ }
77
+ if (error instanceof SubscriptionSettingsVersionConflictError) {
78
+ throw new ApiHttpError(409, {
79
+ code: "conflict",
80
+ message: error.message,
81
+ retryable: false,
82
+ outcomeUnknown: false,
83
+ details: { reason: "version_conflict", currentVersion: error.currentVersion },
84
+ });
85
+ }
86
+ if (error instanceof SubscriptionSettingsInvalidError) {
87
+ throw new HTTPException(422, { message: error.message });
88
+ }
89
+ if (error instanceof SubscriptionSettingsBusyError) {
90
+ // A lock change kept yielding to workspace writes; nothing was written.
91
+ throw new ApiHttpError(503, {
92
+ code: "upstream_unavailable",
93
+ message: error.message,
94
+ retryable: true,
95
+ outcomeUnknown: false,
96
+ details: { reason: "settings_busy" },
97
+ });
98
+ }
99
+ throw error;
100
+ }
101
+
102
+ async function wake(deps: ApiRouteDeps, value: SubscriptionSettingsWake | null): Promise<void> {
103
+ // Capacity waiters recheck on their own bounded timer; a lost wake only delays.
104
+ await deliverSubscriptionCoreCodexWake(deps.db, value).catch(() => undefined);
105
+ }
106
+
107
+ async function jsonBody(c: Context): Promise<unknown> {
108
+ return await c.req.json().catch(() => null);
109
+ }
110
+
111
+ /**
112
+ * Model-account settings (SUB-SET-01..05). Organization owners and admins
113
+ * read and change the organization's values and locks and read the overview
114
+ * of every shared workspace. Workspace members read their workspace's
115
+ * effective values; its administrators (and organization administrators)
116
+ * override what the organization has not locked. The database enforces
117
+ * every refusal; these routes only translate it.
118
+ */
119
+ export function registerModelAccountSettingsRoutes(app: Hono, deps: ApiRouteDeps): void {
120
+ const organizationPath = "/v1/organizations/:organizationId/model-account-settings";
121
+
122
+ app.get(organizationPath, async (c) => {
123
+ c.header("cache-control", "private, no-store");
124
+ const organizationId = parseId(c.req.param("organizationId"), "organization");
125
+ const human = await requireOrganizationCodexHuman(c, deps, organizationId);
126
+ try {
127
+ return c.json(
128
+ OrganizationModelAccountSettings.parse(
129
+ await readOrganizationSubscriptionSettings(deps.db, {
130
+ organizationId,
131
+ actorSubjectId: human.subjectId,
132
+ }),
133
+ ),
134
+ );
135
+ } catch (error) {
136
+ refused(error);
137
+ }
138
+ });
139
+
140
+ app.patch(organizationPath, async (c) => {
141
+ requireSameOriginBrowserMutation(c, deps);
142
+ const organizationId = parseId(c.req.param("organizationId"), "organization");
143
+ const human = await requireOrganizationCodexHuman(c, deps, organizationId);
144
+ const parsed = UpdateOrganizationModelAccountSettingsRequest.safeParse(await jsonBody(c));
145
+ if (!parsed.success) {
146
+ throw new HTTPException(422, { message: "invalid model account settings" });
147
+ }
148
+ const { expectedVersion, ...patch } = parsed.data;
149
+ try {
150
+ const result = await updateOrganizationSubscriptionSettings(deps.db, {
151
+ organizationId,
152
+ actorSubjectId: human.subjectId,
153
+ patch,
154
+ ...(expectedVersion === undefined ? {} : { expectedVersion }),
155
+ });
156
+ await wake(deps, result.wake);
157
+ return c.json(OrganizationModelAccountSettings.parse(result.settings));
158
+ } catch (error) {
159
+ refused(error);
160
+ }
161
+ });
162
+
163
+ app.get(`${organizationPath}/overview`, async (c) => {
164
+ c.header("cache-control", "private, no-store");
165
+ const organizationId = parseId(c.req.param("organizationId"), "organization");
166
+ const human = await requireOrganizationCodexHuman(c, deps, organizationId);
167
+ const after = c.req.query("after");
168
+ if (after !== undefined && !Uuid.safeParse(after).success) {
169
+ throw new HTTPException(422, { message: "invalid cursor" });
170
+ }
171
+ const limitText = c.req.query("limit");
172
+ const limit = limitText === undefined ? undefined : Number(limitText);
173
+ if (limit !== undefined && (!Number.isInteger(limit) || limit < 1 || limit > 500)) {
174
+ throw new HTTPException(422, { message: "limit must be between 1 and 500" });
175
+ }
176
+ try {
177
+ return c.json(
178
+ ModelAccountSettingsOverview.parse(
179
+ await readSubscriptionSettingsOverview(deps.db, {
180
+ organizationId,
181
+ actorSubjectId: human.subjectId,
182
+ after: after ?? null,
183
+ ...(limit === undefined ? {} : { limit }),
184
+ }),
185
+ ),
186
+ );
187
+ } catch (error) {
188
+ refused(error);
189
+ }
190
+ });
191
+
192
+ const workspacePath = "/v1/workspaces/:workspaceId/model-account-settings";
193
+
194
+ app.get(workspacePath, async (c) => {
195
+ c.header("cache-control", "private, no-store");
196
+ const workspaceId = parseId(c.req.param("workspaceId"), "workspace");
197
+ const grant = await requireAccessGrant(c, deps, workspaceId, "workspace:read");
198
+ try {
199
+ return c.json(
200
+ WorkspaceModelAccountSettings.parse(
201
+ await readWorkspaceSubscriptionSettings(deps.db, {
202
+ accountId: grant.accountId,
203
+ workspaceId,
204
+ subjectId: grant.subjectId,
205
+ }),
206
+ ),
207
+ );
208
+ } catch (error) {
209
+ refused(error);
210
+ }
211
+ });
212
+
213
+ app.patch(workspacePath, async (c) => {
214
+ const workspaceId = parseId(c.req.param("workspaceId"), "workspace");
215
+ const grant = await requireAccessGrant(c, deps, workspaceId, "workspace:admin");
216
+ const parsed = UpdateWorkspaceModelAccountSettingsRequest.safeParse(await jsonBody(c));
217
+ if (!parsed.success) {
218
+ throw new HTTPException(422, { message: "invalid model account settings" });
219
+ }
220
+ const { expectedVersion, ...patch } = parsed.data;
221
+ try {
222
+ const result = await updateWorkspaceSubscriptionSettings(deps.db, {
223
+ accountId: grant.accountId,
224
+ workspaceId,
225
+ subjectId: grant.subjectId,
226
+ patch,
227
+ ...(expectedVersion === undefined ? {} : { expectedVersion }),
228
+ });
229
+ await wake(deps, result.wake);
230
+ return c.json(WorkspaceModelAccountSettings.parse(result.settings));
231
+ } catch (error) {
232
+ refused(error);
233
+ }
234
+ });
235
+ }
@@ -1,9 +1,11 @@
1
+ import { claudeProviderId, withClaudeConnectionCatalog } from "@opengeni/config";
1
2
  import {
2
3
  configuredModels,
3
4
  withCodexCatalogProvider,
4
5
  withXaiSubscriptionCatalogProvider,
5
6
  withOrganizationGatewayCatalogProvider,
6
7
  withOrganizationOpenRouterCatalogProvider,
8
+ withOrganizationOpperCatalogProvider,
7
9
  } from "@opengeni/config";
8
10
  import { ModelConnectionAccessPolicy, ModelConnectionAccessResponse } from "@opengeni/contracts";
9
11
  import {
@@ -12,87 +14,153 @@ import {
12
14
  type ApiRouteDeps,
13
15
  } from "@opengeni/core";
14
16
  import {
17
+ deliverSubscriptionCoreWake,
15
18
  getModelConnectionAccess,
19
+ listOrganizationAdministrationMembers,
20
+ nestedPostgresSqlState,
21
+ readSubscriptionCoreProviderModelConnectionAccess,
22
+ subscriptionCoreAccessChangeWake,
23
+ ModelConnectionAccessForbiddenError,
24
+ SubscriptionCoreAccessInvalidError,
25
+ SubscriptionCoreAccessPeopleUnlistableError,
26
+ SubscriptionCoreAccessPersonNotInOrganizationError,
27
+ ModelConnectionWorkspaceNotInOrganizationError,
16
28
  updateModelConnectionAccess,
29
+ updateSubscriptionCoreProviderModelConnectionAccess,
17
30
  getOrganizationAdministrationOverview,
18
- getXaiSubscriptionAccountAuthoritySnapshot,
19
31
  listOrganizationModelProviderCustomModels,
20
- getWorkspaceVercelAiGatewayConnectionMetadata,
21
- getWorkspaceOpenRouterConnectionMetadata,
32
+ getWorkspaceProviderApiKeyConnectionMetadata,
22
33
  type ModelConnectionTarget,
23
34
  } from "@opengeni/db";
24
35
  import type { Context, Hono } from "hono";
25
36
  import { HTTPException } from "hono/http-exception";
26
37
  import { z } from "zod";
27
38
  import { requireOrganizationCodexHuman, requireSameOriginBrowserMutation } from "./codex";
28
- import { managedCookieHuman, requireScopeMutation } from "./supergrok";
39
+ import { codexRouteDisposition } from "./codex-core";
40
+ import { requireSubscriptionCoreRoute } from "./subscription-pool-core";
29
41
 
30
- const Kind = z.enum(["codex", "supergrok", "vercel_gateway", "openrouter"]);
42
+ const Kind = z.enum([
43
+ "codex",
44
+ "supergrok",
45
+ "vercel_gateway",
46
+ "openrouter",
47
+ "anthropic",
48
+ "claude_subscription",
49
+ "opper",
50
+ ]);
31
51
  function modelPrefix(target: ModelConnectionTarget) {
52
+ if (target.kind === "anthropic" || target.kind === "claude_subscription")
53
+ return (
54
+ claudeProviderId(target.kind, target.workspaceId === null ? "organization" : "workspace") +
55
+ "/"
56
+ );
32
57
  if (target.kind === "codex" || target.kind === "supergrok") return `${target.kind}/`;
33
- return `${target.workspaceId === null ? "organization" : "workspace"}-${target.kind === "vercel_gateway" ? "gateway" : "openrouter"}/`;
58
+ return `${target.workspaceId === null ? "organization" : "workspace"}-${target.kind === "vercel_gateway" ? "gateway" : target.kind === "opper" ? "opper" : "openrouter"}/`;
59
+ }
60
+
61
+ /**
62
+ * Codex access policies follow the organization's Codex cutover row (M3 PR
63
+ * 3): the legacy credential row without one; the shared core connection with
64
+ * an enabled one (the legacy rows are frozen after 0680); a disabled row is
65
+ * maintenance (typed 503 from `codexRouteDisposition`). SuperGrok's follow
66
+ * its provider route (design 5.3, X2b): legacy without the `xai` cutover
67
+ * receipt, the shared core connection with it, maintenance fails closed.
68
+ */
69
+ async function coreAccessDisposition(
70
+ deps: ApiRouteDeps,
71
+ kind: ModelConnectionTarget["kind"],
72
+ accountId: string,
73
+ ): Promise<"legacy" | "core"> {
74
+ if (kind === "codex") return await codexRouteDisposition(deps, accountId);
75
+ // SuperGrok runs only on the core: any other route fails closed.
76
+ if (kind === "supergrok")
77
+ return await requireSubscriptionCoreRoute(deps, "xai", "SuperGrok", async () => accountId);
78
+ if (kind === "claude_subscription")
79
+ return await requireSubscriptionCoreRoute(deps, "claude", "Claude", async () => accountId);
80
+ return "legacy";
34
81
  }
35
82
 
36
83
  export function registerModelConnectionAccessRoutes(app: Hono, deps: ApiRouteDeps) {
37
84
  for (const scope of ["organizations", "workspaces"] as const) {
38
85
  const path = `/v1/${scope}/:scopeId/model-connections/:kind/:connectionId/access`;
39
- async function target(c: Context, mutate: boolean): Promise<ModelConnectionTarget> {
86
+ async function target(
87
+ c: Context,
88
+ mutate: boolean,
89
+ ): Promise<{ connection: ModelConnectionTarget; core: boolean }> {
40
90
  const kind = Kind.parse(c.req.param("kind"));
91
+ if (kind === "claude_subscription" && !deps.settings.claudeSubscriptionEnabled)
92
+ throw new HTTPException(404, { message: "Claude subscriptions are not enabled" });
41
93
  const scopeId = z.string().uuid().parse(c.req.param("scopeId"));
42
94
  let connectionId = c.req.param("connectionId")!;
43
- if (kind === "codex" || kind === "supergrok")
95
+ if (kind === "codex" || kind === "supergrok" || kind === "claude_subscription")
44
96
  connectionId = z.string().uuid().parse(connectionId);
45
97
  if (scope === "organizations") {
46
98
  if (mutate) requireSameOriginBrowserMutation(c, deps);
47
99
  const human = await requireOrganizationCodexHuman(c, deps, scopeId);
48
100
  return {
49
- kind,
50
- connectionId,
51
- accountId: scopeId,
52
- workspaceId: null,
53
- subjectId: human.subjectId,
101
+ connection: {
102
+ kind,
103
+ connectionId,
104
+ accountId: scopeId,
105
+ workspaceId: null,
106
+ subjectId: human.subjectId,
107
+ },
108
+ core: (await coreAccessDisposition(deps, kind, scopeId)) === "core",
54
109
  };
55
110
  }
56
111
  const grant = await requireAccessGrant(c, deps, scopeId, "workspace:read");
57
- if (kind === "supergrok") {
58
- const snapshot = await getXaiSubscriptionAccountAuthoritySnapshot(deps.db, {
59
- workspaceId: scopeId,
60
- subjectId: grant.subjectId,
61
- credentialId: connectionId,
62
- });
63
- if (!snapshot) throw new HTTPException(404, { message: "Subscription not found" });
64
- if (snapshot.scope === "user") {
65
- const human = await managedCookieHuman(c, deps);
66
- if (!human || human.subjectId !== grant.subjectId)
67
- throw new HTTPException(403, {
68
- message: "Subscription owner browser session required",
69
- });
70
- }
71
- if (mutate) await requireScopeMutation(c, deps, scopeId, snapshot.scope);
72
- } else if (mutate) await requireAccessGrant(c, deps, scopeId, "workspace:admin");
73
- if (kind === "vercel_gateway" || kind === "openrouter") {
74
- const metadata = await (
75
- kind === "vercel_gateway"
76
- ? getWorkspaceVercelAiGatewayConnectionMetadata
77
- : getWorkspaceOpenRouterConnectionMetadata
78
- )(deps.db, scopeId);
112
+ // On the core a SuperGrok or Claude access policy is a shared connection's, which
113
+ // the core editor authorizes; only the legacy pools have private rows.
114
+ const sharedCore =
115
+ (kind === "supergrok" || kind === "claude_subscription") &&
116
+ (await coreAccessDisposition(deps, kind, grant.accountId)) === "core";
117
+ if (mutate) {
118
+ // A core Claude change keeps the legacy same-origin browser check.
119
+ if (kind === "claude_subscription" && !c.req.header("authorization"))
120
+ requireSameOriginBrowserMutation(c, deps);
121
+ await requireAccessGrant(c, deps, scopeId, "workspace:admin");
122
+ }
123
+ if (
124
+ kind === "vercel_gateway" ||
125
+ kind === "openrouter" ||
126
+ kind === "anthropic" ||
127
+ kind === "opper"
128
+ ) {
129
+ const metadata = await getWorkspaceProviderApiKeyConnectionMetadata(deps.db, scopeId, kind);
79
130
  if (!metadata || (connectionId !== "current" && metadata.connectionId !== connectionId))
80
131
  throw new HTTPException(404, { message: "Connection not found" });
81
132
  connectionId = metadata.connectionId;
82
133
  }
83
134
  return {
84
- kind,
85
- connectionId,
86
- accountId: grant.accountId,
87
- workspaceId: scopeId,
88
- subjectId: grant.subjectId,
135
+ connection: {
136
+ kind,
137
+ connectionId,
138
+ accountId: grant.accountId,
139
+ workspaceId: scopeId,
140
+ subjectId: grant.subjectId,
141
+ },
142
+ core:
143
+ kind === "supergrok" || kind === "claude_subscription"
144
+ ? sharedCore
145
+ : (await coreAccessDisposition(deps, kind, grant.accountId)) === "core",
89
146
  };
90
147
  }
91
148
  app.get(path, async (c) => {
92
149
  c.header("cache-control", "private, no-store");
93
- const connection = await target(c, false);
94
- const policy = await getModelConnectionAccess(deps.db, connection);
150
+ const { connection, core } = await target(c, false);
151
+ const coreAccess = core
152
+ ? await readSubscriptionCoreProviderModelConnectionAccess(deps.db, connection)
153
+ : null;
154
+ const policy = core
155
+ ? coreAccess && {
156
+ ...coreAccess.policy,
157
+ allowedPeople: coreAccess.policy.allowedPeople ?? undefined,
158
+ }
159
+ : await getModelConnectionAccess(deps.db, connection);
95
160
  if (!policy) throw new HTTPException(404, { message: "Connection not found" });
161
+ // Shared core connections at organization scope can be limited to people
162
+ // and report the workspaces that use them as their own (design 5.4).
163
+ const organizationCore = coreAccess !== null && connection.workspaceId === null;
96
164
  let settings =
97
165
  connection.workspaceId === null
98
166
  ? (await deps.resolveCatalogSettings()).settings
@@ -112,7 +180,21 @@ export function registerModelConnectionAccessRoutes(app: Hono, deps: ApiRouteDep
112
180
  workspaces = (await getOrganizationAdministrationOverview(deps.db, actor)).workspaces.map(
113
181
  ({ id, name }) => ({ id, name }),
114
182
  );
115
- if (connection.kind === "vercel_gateway" || connection.kind === "openrouter") {
183
+ if (connection.kind === "anthropic" || connection.kind === "claude_subscription") {
184
+ const customModels = await listOrganizationModelProviderCustomModels(deps.db, {
185
+ organizationId: connection.accountId,
186
+ actorSubjectId: connection.subjectId,
187
+ providerKind: connection.kind,
188
+ });
189
+ settings = withClaudeConnectionCatalog(settings, {
190
+ [connection.kind]: { models: customModels },
191
+ });
192
+ }
193
+ if (
194
+ connection.kind === "vercel_gateway" ||
195
+ connection.kind === "openrouter" ||
196
+ connection.kind === "opper"
197
+ ) {
116
198
  const models = await listOrganizationModelProviderCustomModels(deps.db, {
117
199
  ...actor,
118
200
  providerKind: connection.kind,
@@ -120,9 +202,37 @@ export function registerModelConnectionAccessRoutes(app: Hono, deps: ApiRouteDep
120
202
  settings =
121
203
  connection.kind === "vercel_gateway"
122
204
  ? withOrganizationGatewayCatalogProvider(settings, models)
123
- : withOrganizationOpenRouterCatalogProvider(settings, models);
205
+ : connection.kind === "opper"
206
+ ? withOrganizationOpperCatalogProvider(settings, models)
207
+ : withOrganizationOpenRouterCatalogProvider(settings, models);
124
208
  }
125
209
  }
210
+ // The people an administrator can choose, or null when the account
211
+ // can't be limited to people or the organization has more members than
212
+ // its member list shows (people are then not offered).
213
+ const people =
214
+ organizationCore && coreAccess?.peopleSupported
215
+ ? await listOrganizationAdministrationMembers(deps.db, {
216
+ organizationId: connection.accountId,
217
+ actorSubjectId: connection.subjectId,
218
+ }).then(
219
+ (members) =>
220
+ members
221
+ .filter(
222
+ (member) =>
223
+ member.status === "active" &&
224
+ member.revokedAt === null &&
225
+ member.subjectId.startsWith("user:"),
226
+ )
227
+ .map(({ id, name, email }) => ({ id, name, email })),
228
+ (error: unknown) => {
229
+ // The member list refuses organizations above its bound
230
+ // (SQLSTATE 54000); people are then not offered.
231
+ if (nestedPostgresSqlState(error) === "54000") return null;
232
+ throw error;
233
+ },
234
+ )
235
+ : null;
126
236
  return c.json(
127
237
  ModelConnectionAccessResponse.parse({
128
238
  policy,
@@ -132,29 +242,81 @@ export function registerModelConnectionAccessRoutes(app: Hono, deps: ApiRouteDep
132
242
  .map(({ id, label }) => ({ id, label })),
133
243
  personalWorkspacesSupported:
134
244
  connection.workspaceId === null &&
135
- (connection.kind === "codex" || connection.kind === "supergrok"),
245
+ (connection.kind === "codex" ||
246
+ connection.kind === "supergrok" ||
247
+ connection.kind === "claude_subscription"),
248
+ ...(organizationCore
249
+ ? {
250
+ ...(people ? { peopleSupported: true, people } : { peopleSupported: false }),
251
+ localWorkspaceIds: coreAccess.localWorkspaceIds,
252
+ managedByWorkspaceId: coreAccess.managedByWorkspaceId,
253
+ ...(coreAccess.personalSharingSupported ? { personalSharingSupported: true } : {}),
254
+ }
255
+ : {}),
136
256
  }),
137
257
  );
138
258
  });
139
259
  app.put(path, async (c) => {
140
- const connection = await target(c, true);
260
+ // Access of a provider on the shared core lives there; the frozen legacy row is never written.
261
+ const { connection, core } = await target(c, true);
141
262
  const parsed = ModelConnectionAccessPolicy.safeParse(await c.req.json().catch(() => null));
142
263
  if (!parsed.success)
143
264
  throw new HTTPException(422, { message: "Invalid connection access policy" });
144
265
  const policy = parsed.data;
266
+ if (policy.sharePersonal && (!core || connection.workspaceId !== null))
267
+ throw new HTTPException(422, {
268
+ message: "Personal sharing requires the organization subscription route",
269
+ });
145
270
  if (policy.allowedModels?.some((id) => !id.startsWith(modelPrefix(connection))))
146
271
  throw new HTTPException(422, {
147
272
  message: "Model belongs to a different connection provider",
148
273
  });
149
- if (connection.workspaceId !== null && policy.allowedWorkspaces !== null)
274
+ if (
275
+ connection.workspaceId !== null &&
276
+ (policy.allowedWorkspaces !== null || policy.allowedPeople != null)
277
+ )
150
278
  throw new HTTPException(422, {
151
279
  message: "Workspace connections cannot be assigned to other workspaces",
152
280
  });
153
- const updated = await updateModelConnectionAccess(deps.db, connection, policy);
281
+ if (!core && policy.allowedPeople != null)
282
+ throw new HTTPException(422, { message: "This account cannot be limited to people" });
283
+ let updated;
284
+ try {
285
+ updated = core
286
+ ? await updateSubscriptionCoreProviderModelConnectionAccess(deps.db, connection, policy)
287
+ : await updateModelConnectionAccess(deps.db, connection, policy);
288
+ } catch (error) {
289
+ if (error instanceof ModelConnectionWorkspaceNotInOrganizationError)
290
+ throw new HTTPException(422, { message: error.message });
291
+ if (
292
+ error instanceof SubscriptionCoreAccessPersonNotInOrganizationError ||
293
+ error instanceof SubscriptionCoreAccessPeopleUnlistableError ||
294
+ error instanceof SubscriptionCoreAccessInvalidError
295
+ )
296
+ throw new HTTPException(422, { message: error.message });
297
+ if (error instanceof ModelConnectionAccessForbiddenError)
298
+ throw new HTTPException(403, { message: error.message });
299
+ throw error;
300
+ }
154
301
  if (!updated)
155
302
  throw new HTTPException(409, {
156
303
  message: "Connection access changed. Reload before saving.",
157
304
  });
305
+ if (core) {
306
+ // A wider scope or model list can make waiting work placeable.
307
+ try {
308
+ const change = subscriptionCoreAccessChangeWake(connection.kind, connection.accountId);
309
+ if (change)
310
+ await deliverSubscriptionCoreWake(
311
+ deps.db,
312
+ change.provider,
313
+ change.wake,
314
+ change.displayName,
315
+ );
316
+ } catch {
317
+ // Every core waiter has its own bounded recheck; a lost wake only delays.
318
+ }
319
+ }
158
320
  return c.json(updated);
159
321
  });
160
322
  }