@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,147 @@
1
+ // Claude usage routes on the shared subscription core (design 5.3, Claude
2
+ // track C2a, EP-N24 and EP-S13). The usage routes read the organization's
3
+ // Claude provider route once after authentication: missing or disabled
4
+ // receipts answer a typed 503; `core` projects the connection's quota in the legacy
5
+ // `ClaudeSubscriptionUsage` shape. Paths, auth checks and cache headers are
6
+ // the legacy ones. A refresh reads live: a shared connection of the
7
+ // workspace's pool through the core connection seam, the caller's own
8
+ // personal connection in their own Personal workspace through the owner-only
9
+ // seam, and an organization-pool connection on the organization route
10
+ // through the administrator seam (design 5.3, C2c).
11
+ import type { Context } from "hono";
12
+ import { HTTPException } from "hono/http-exception";
13
+ import type { ClaudeSubscriptionUsage } from "@opengeni/contracts";
14
+ import type { ApiRouteDeps } from "@opengeni/core";
15
+ import {
16
+ deliverSubscriptionCoreProviderWake,
17
+ projectSubscriptionCoreClaudeUsage,
18
+ readSubscriptionCoreClaudeOrganizationUsageRow,
19
+ readSubscriptionCoreClaudeWorkspaceUsageTarget,
20
+ readSubscriptionCoreProviderRouteForWorkspace,
21
+ refreshSubscriptionCoreClaudeOrganizationUsage,
22
+ refreshSubscriptionCoreClaudeWorkspaceUsage,
23
+ } from "@opengeni/db";
24
+ import { ApiHttpError } from "../http/api-error";
25
+ import { SUBSCRIPTION_CORE_CUTOVER_DISABLED } from "./codex-core";
26
+ import {
27
+ requirePrivateSubscriptionHuman,
28
+ requireSubscriptionScopeMutation,
29
+ } from "./subscription-pool-access";
30
+
31
+ /** An authenticated usage caller whose organization serves Claude from the core. */
32
+ export type CoreClaudeUsageCaller = {
33
+ core: true;
34
+ accountId: string;
35
+ /** Null on the organization path. */
36
+ workspaceId: string | null;
37
+ subjectId: string;
38
+ /** The route's account id: a canonical connection id or a cutover alias. */
39
+ accountIdParam: string;
40
+ };
41
+
42
+ /**
43
+ * Require Claude's core route for an authenticated usage caller. Missing or
44
+ * disabled receipts fail closed with the typed 503 the Codex routes use.
45
+ */
46
+ export async function claudeUsageRoute(
47
+ deps: ApiRouteDeps,
48
+ accountId: string,
49
+ workspaceId: string | null,
50
+ ): Promise<"core"> {
51
+ const route = await readSubscriptionCoreProviderRouteForWorkspace(deps.db, {
52
+ accountId,
53
+ workspaceId,
54
+ provider: "claude",
55
+ });
56
+ if (route !== "core") {
57
+ throw new ApiHttpError(503, {
58
+ code: "upstream_unavailable",
59
+ message: "Claude subscriptions are paused for maintenance in this organization",
60
+ retryable: true,
61
+ outcomeUnknown: false,
62
+ details: { reason: SUBSCRIPTION_CORE_CUTOVER_DISABLED },
63
+ });
64
+ }
65
+ return route;
66
+ }
67
+
68
+ /**
69
+ * Wake the Claude core waiters after a reading that ended a stored
70
+ * exhaustion. The reading already committed; a failed wake hint never fails
71
+ * the read (every core waiter has its own recheck).
72
+ */
73
+ async function wakeAfterRecovery(
74
+ deps: ApiRouteDeps,
75
+ accountId: string,
76
+ result: { usage: ClaudeSubscriptionUsage; recovered: boolean },
77
+ ): Promise<ClaudeSubscriptionUsage> {
78
+ if (result.recovered) {
79
+ await deliverSubscriptionCoreProviderWake(deps.db, "claude", {
80
+ accountId,
81
+ reason: "usage_recovered",
82
+ }).catch(() => undefined);
83
+ }
84
+ return result.usage;
85
+ }
86
+
87
+ /** GET or POST refresh of one Claude account's usage on the core. */
88
+ export async function coreClaudeUsage(
89
+ c: Context,
90
+ deps: ApiRouteDeps,
91
+ caller: CoreClaudeUsageCaller,
92
+ mutation: boolean,
93
+ ): Promise<ClaudeSubscriptionUsage> {
94
+ if (caller.workspaceId === null) {
95
+ const row = await readSubscriptionCoreClaudeOrganizationUsageRow(deps.db, {
96
+ organizationId: caller.accountId,
97
+ subjectId: caller.subjectId,
98
+ accountIdParam: caller.accountIdParam,
99
+ });
100
+ if (!row) throw new HTTPException(404, { message: "Claude account not found" });
101
+ if (!mutation) return projectSubscriptionCoreClaudeUsage(row);
102
+ return await wakeAfterRecovery(
103
+ deps,
104
+ caller.accountId,
105
+ await refreshSubscriptionCoreClaudeOrganizationUsage(
106
+ deps.db,
107
+ deps.settings,
108
+ { organizationId: caller.accountId, subjectId: caller.subjectId, row },
109
+ deps.claudeFetch ? { fetchImpl: deps.claudeFetch } : {},
110
+ ),
111
+ );
112
+ }
113
+ const workspaceId = caller.workspaceId;
114
+ const target = await readSubscriptionCoreClaudeWorkspaceUsageTarget(deps.db, {
115
+ accountId: caller.accountId,
116
+ workspaceId,
117
+ subjectId: caller.subjectId,
118
+ accountIdParam: caller.accountIdParam,
119
+ });
120
+ if (!target) throw new HTTPException(404, { message: "Claude account not found" });
121
+ // The legacy authority checks, by the scope the connection maps to. A
122
+ // personal connection lives only in its owner's own Personal workspace on
123
+ // the core (D-03), so its verified owner is checked there, never through
124
+ // the legacy ordinary-workspace membership rule (which no Personal
125
+ // workspace passes).
126
+ if (target.scope === "user")
127
+ await requirePrivateSubscriptionHuman(c, deps, workspaceId, "Claude", "personal_workspace");
128
+ if (!mutation) return projectSubscriptionCoreClaudeUsage(target.row);
129
+ await requireSubscriptionScopeMutation(
130
+ c,
131
+ deps,
132
+ workspaceId,
133
+ target.scope,
134
+ "Claude",
135
+ "personal_workspace",
136
+ );
137
+ return await wakeAfterRecovery(
138
+ deps,
139
+ caller.accountId,
140
+ await refreshSubscriptionCoreClaudeWorkspaceUsage(
141
+ deps.db,
142
+ deps.settings,
143
+ { accountId: caller.accountId, workspaceId, subjectId: caller.subjectId, target },
144
+ deps.claudeFetch ? { fetchImpl: deps.claudeFetch } : {},
145
+ ),
146
+ );
147
+ }
@@ -0,0 +1,233 @@
1
+ import { createHmac } from "node:crypto";
2
+ import { z } from "zod";
3
+ import { requireEnvironmentEncryption } from "@opengeni/core";
4
+ import { ClaudeSubscriptionCredential } from "@opengeni/config";
5
+ import type { ClaudeSubscriptionAccountMetadata } from "@opengeni/db";
6
+
7
+ import { prepareClaudeSubscriptionCredential } from "../claude-workspace-connection";
8
+ import { requireAccessGrant } from "@opengeni/core";
9
+ import { ClaudeSubscriptionUsage, ClaudeSubscriptionSetupTokenRequest } from "@opengeni/contracts";
10
+
11
+ import { requireOrganizationCodexHuman } from "./codex";
12
+ import {
13
+ requireSameOriginBrowserMutation,
14
+ requireSubscriptionScopeMutation,
15
+ } from "./subscription-pool-access";
16
+
17
+ import { HTTPException } from "hono/http-exception";
18
+ import type { Context } from "hono";
19
+
20
+ import type { ApiRouteDeps } from "@opengeni/core";
21
+ import type { Hono } from "hono";
22
+ import { offerClaudeDefaultModels } from "../claude-default-models";
23
+ import { registerSubscriptionAccountPoolRoutes } from "./subscription-account-pools";
24
+ import { claudeUsageRoute, coreClaudeUsage, type CoreClaudeUsageCaller } from "./claude-core-usage";
25
+ import {
26
+ claudeCoreAccount,
27
+ claudeCoreRoute,
28
+ claudePoolCore,
29
+ connectClaudeCore,
30
+ requireClaudeCorePersonalWorkspace,
31
+ } from "../claude-subscription-core";
32
+ import { deliverPoolCoreWake } from "./subscription-pool-core";
33
+ import { managedCookieHuman } from "./subscription-pool-access";
34
+
35
+ function accountJson(account: ClaudeSubscriptionAccountMetadata, activeId: string | null) {
36
+ return {
37
+ id: account.id,
38
+ scope: account.scope,
39
+ subject: account.providerAccountId ?? account.id,
40
+ email: account.accountEmail,
41
+ label: account.label,
42
+ plan: account.planType,
43
+ status: account.status,
44
+ active: account.id === activeId,
45
+ version: account.version,
46
+ expiresAt: account.expiresAt?.toISOString() ?? null,
47
+ lastRefreshAt: account.lastRefreshAt?.toISOString() ?? null,
48
+ lastError: account.lastError,
49
+ allocatorEnabled: account.allocatorEnabled,
50
+ allocatorVersion: account.allocatorVersion,
51
+ allocatorUpdatedAt: account.allocatorUpdatedAt?.toISOString() ?? null,
52
+ };
53
+ }
54
+
55
+ const CLAUDE_CORE = claudePoolCore(accountJson);
56
+ const SETUP_TOKEN_CHANGED = "Claude account changed. Reload it before replacing the token.";
57
+
58
+ export function registerClaudeSubscriptionAccountRoutes(app: Hono, deps: ApiRouteDeps) {
59
+ registerSubscriptionAccountPoolRoutes(app, deps, {
60
+ provider: "claude",
61
+ route: "claude",
62
+ displayName: "Claude",
63
+ enabled: () => deps.settings.claudeSubscriptionEnabled,
64
+ accountJson,
65
+ core: CLAUDE_CORE,
66
+ });
67
+ async function usageAuthority(
68
+ c: Context,
69
+ organization: boolean,
70
+ mutation: boolean,
71
+ ): Promise<CoreClaudeUsageCaller> {
72
+ c.header("cache-control", "private, no-store");
73
+ if (!deps.settings.claudeSubscriptionEnabled)
74
+ throw new HTTPException(404, { message: "Claude subscriptions are not enabled" });
75
+ const credentialId = z.string().uuid().safeParse(c.req.param("accountId"));
76
+ if (!credentialId.success)
77
+ throw new HTTPException(400, { message: "Invalid Claude account ID" });
78
+ if (mutation && !c.req.header("authorization")) requireSameOriginBrowserMutation(c, deps);
79
+ if (organization) {
80
+ const accountId = c.req.param("organizationId")!;
81
+ const human = await requireOrganizationCodexHuman(c, deps, accountId);
82
+ await claudeUsageRoute(deps, accountId, null);
83
+ return {
84
+ core: true,
85
+ accountId,
86
+ workspaceId: null,
87
+ subjectId: human.subjectId,
88
+ accountIdParam: credentialId.data,
89
+ };
90
+ }
91
+ const workspaceId = c.req.param("workspaceId")!;
92
+ const grant = await requireAccessGrant(c, deps, workspaceId, "workspace:read");
93
+ await claudeUsageRoute(deps, grant.accountId, workspaceId);
94
+ return {
95
+ core: true,
96
+ accountId: grant.accountId,
97
+ workspaceId,
98
+ subjectId: grant.subjectId,
99
+ accountIdParam: credentialId.data,
100
+ };
101
+ }
102
+ for (const organization of [false, true]) {
103
+ const path = organization
104
+ ? "/v1/organizations/:organizationId/claude/accounts/:accountId/usage"
105
+ : "/v1/workspaces/:workspaceId/claude/accounts/:accountId/usage";
106
+ app.get(path, async (c) => {
107
+ const authority = await usageAuthority(c, organization, false);
108
+ return c.json(
109
+ ClaudeSubscriptionUsage.parse(await coreClaudeUsage(c, deps, authority, false)),
110
+ );
111
+ });
112
+ app.post(path + "/refresh", async (c) => {
113
+ const authority = await usageAuthority(c, organization, true);
114
+ return c.json(ClaudeSubscriptionUsage.parse(await coreClaudeUsage(c, deps, authority, true)));
115
+ });
116
+ }
117
+
118
+ const setupRequest = ClaudeSubscriptionSetupTokenRequest;
119
+ for (const organization of [false, true]) {
120
+ const path = organization
121
+ ? "/v1/organizations/:organizationId/claude/accounts/setup-token"
122
+ : "/v1/workspaces/:workspaceId/claude/accounts/setup-token";
123
+ app.post(path, async (c) => {
124
+ c.header("cache-control", "private, no-store");
125
+ if (!deps.settings.claudeSubscriptionEnabled)
126
+ throw new HTTPException(404, { message: "Claude subscriptions are not enabled" });
127
+ requireSameOriginBrowserMutation(c, deps);
128
+ const parsed = setupRequest.safeParse(await c.req.json().catch(() => null));
129
+ if (!parsed.success || (organization && parsed.data.scope !== "workspace"))
130
+ throw new HTTPException(422, { message: "Enter the Claude setup token." });
131
+ const actor = organization
132
+ ? {
133
+ organizationId: c.req.param("organizationId")!,
134
+ ...(await requireOrganizationCodexHuman(c, deps, c.req.param("organizationId")!)),
135
+ }
136
+ : null;
137
+ const workspaceId = organization ? null : c.req.param("workspaceId")!;
138
+ // The runtime first (one receipt read), so a private account on the
139
+ // core is authorized in the owner's Personal workspace, where the core
140
+ // keeps it, and refused (403) anywhere else. The read grant naming the
141
+ // organization is taken only once a receipt exists (the callback), so
142
+ // legacy authorizes exactly as before.
143
+ const read: { grant?: Awaited<ReturnType<typeof requireAccessGrant>> } = {};
144
+ await claudeCoreRoute(deps, async () => {
145
+ if (actor) return actor.organizationId;
146
+ read.grant = await requireAccessGrant(c, deps, workspaceId!, "workspace:read");
147
+ return read.grant.accountId;
148
+ });
149
+ if (workspaceId && parsed.data.scope === "user") {
150
+ if (!read.grant) throw new Error("core Claude route without its read grant");
151
+ await requireClaudeCorePersonalWorkspace(deps, {
152
+ accountId: read.grant.accountId,
153
+ workspaceId,
154
+ subjectId: read.grant.subjectId,
155
+ });
156
+ }
157
+ const authority = workspaceId
158
+ ? await requireSubscriptionScopeMutation(
159
+ c,
160
+ deps,
161
+ workspaceId,
162
+ parsed.data.scope,
163
+ "Claude",
164
+ "personal_workspace",
165
+ )
166
+ : null;
167
+ const accountId = actor?.organizationId ?? authority!.accountId;
168
+ const subjectId = actor?.subjectId ?? authority!.subjectId;
169
+ const encryptionKey = requireEnvironmentEncryption(deps.settings);
170
+ const reconnectId = parsed.data.reconnectAccountId;
171
+
172
+ const scope = workspaceId ? parsed.data.scope : "organization";
173
+ const personal = scope === "user";
174
+ const target = reconnectId
175
+ ? await claudeCoreAccount(deps, { accountId, workspaceId, subjectId }, reconnectId)
176
+ : null;
177
+ if (
178
+ reconnectId &&
179
+ (!target ||
180
+ target.version !== parsed.data.expectedCredentialVersion ||
181
+ target.scope !== scope)
182
+ )
183
+ throw new HTTPException(409, { message: SETUP_TOKEN_CHANGED });
184
+ const connected = await connectClaudeCore(
185
+ deps.db,
186
+ {
187
+ accountId,
188
+ workspaceId,
189
+ subjectId,
190
+ ...(personal ? { personal: true } : {}),
191
+ encryptionKey,
192
+ credential: ClaudeSubscriptionCredential.parse(
193
+ JSON.parse(
194
+ prepareClaudeSubscriptionCredential(
195
+ deps.settings,
196
+ workspaceId ? "workspace:" + workspaceId : "organization:" + accountId,
197
+ parsed.data.token,
198
+ ),
199
+ ),
200
+ ),
201
+ providerAccountId:
202
+ "setup:" + createHmac("sha256", encryptionKey).update(parsed.data.token).digest("hex"),
203
+ accountEmail: null,
204
+ planType: null,
205
+ label: target?.label ?? parsed.data.label ?? "Claude subscription",
206
+ connectedBySubjectId: (await managedCookieHuman(c, deps))?.subjectId ?? null,
207
+ ...(target
208
+ ? {
209
+ reconnectTarget: {
210
+ connectionId: target.id,
211
+ expectedVersion: target.version,
212
+ providerAccountId: target.providerAccountId,
213
+ },
214
+ }
215
+ : {}),
216
+ },
217
+ SETUP_TOKEN_CHANGED,
218
+ );
219
+ await deliverPoolCoreWake(deps, CLAUDE_CORE, connected.wake);
220
+ await offerClaudeDefaultModels(deps, {
221
+ ...(workspaceId ? { accountId, workspaceId } : { organizationId: accountId }),
222
+ actorSubjectId: subjectId,
223
+ providerKind: "claude_subscription",
224
+ });
225
+ return c.json({
226
+ connected: true,
227
+ accountId: connected.id,
228
+ credentialVersion: connected.version,
229
+ scope,
230
+ });
231
+ });
232
+ }
233
+ }
@@ -0,0 +1,175 @@
1
+ import { requireSubscriptionScopeMutation } from "./subscription-pool-access";
2
+ import {
3
+ ClaudeSubscriptionOAuthCompleteRequest,
4
+ ClaudeSubscriptionOAuthStartRequest,
5
+ } from "@opengeni/contracts";
6
+ import { requireAccessGrant, requireFreshAccessGrant, type ApiRouteDeps } from "@opengeni/core";
7
+ import { type Context, type Hono } from "hono";
8
+ import { HTTPException } from "hono/http-exception";
9
+ import { z } from "zod";
10
+ import { hashCodexBrowserSession } from "../codex-redemption-security";
11
+ import { isConfiguredDeploymentKeyRequest } from "../http/auth";
12
+ import {
13
+ startClaudeSubscriptionOAuth,
14
+ completeClaudeSubscriptionOAuth,
15
+ type ClaudeOAuthScope,
16
+ } from "../claude-subscription-oauth";
17
+ import {
18
+ managedCookieHuman,
19
+ requireOrganizationCodexHuman,
20
+ requireSameOriginBrowserMutation,
21
+ } from "./codex";
22
+ import { claudeCoreRoute, requireClaudeCorePersonalWorkspace } from "../claude-subscription-core";
23
+
24
+ export function registerClaudeSubscriptionOAuthRoutes(
25
+ app: Hono,
26
+ deps: ApiRouteDeps,
27
+ fetchImpl: typeof fetch = globalThis.fetch,
28
+ ) {
29
+ async function scope(
30
+ c: Context,
31
+ organization: boolean,
32
+ fresh = false,
33
+ ): Promise<ClaudeOAuthScope> {
34
+ c.header("cache-control", "private, no-store");
35
+ if (!deps.settings.claudeSubscriptionEnabled)
36
+ throw new HTTPException(404, {
37
+ message: "Claude subscriptions are not enabled",
38
+ });
39
+ // A key-only deployment has no Opengeni sign-in, so its operator connects
40
+ // Claude with the deployment key itself (console or API).
41
+ const deploymentKey = !organization && isConfiguredDeploymentKeyRequest(c, deps.settings);
42
+ if (!deploymentKey) requireSameOriginBrowserMutation(c, deps);
43
+ const id = z
44
+ .string()
45
+ .uuid()
46
+ .safeParse(c.req.param(organization ? "organizationId" : "workspaceId"));
47
+ if (!id.success) throw new HTTPException(404, { message: "Scope not found" });
48
+ if (organization) {
49
+ const human = await requireOrganizationCodexHuman(c, deps, id.data, {
50
+ providerConsent: true,
51
+ });
52
+ return {
53
+ accountId: id.data,
54
+ workspaceId: null,
55
+ actorSubjectId: human.subjectId,
56
+ browserSessionHash: human.browserSessionHash,
57
+ };
58
+ }
59
+ const grant = await (fresh ? requireFreshAccessGrant : requireAccessGrant)(
60
+ c,
61
+ deps,
62
+ id.data,
63
+ "connections:write",
64
+ );
65
+ const human = await managedCookieHuman(c, deps);
66
+ if (human && human.subjectId === grant.subjectId)
67
+ return {
68
+ accountId: grant.accountId,
69
+ workspaceId: id.data,
70
+ actorSubjectId: human.subjectId,
71
+ browserSessionHash: human.browserSessionHash,
72
+ };
73
+ if (deploymentKey && grant.principalKind === "configured_key" && grant.subjectId)
74
+ return {
75
+ accountId: grant.accountId,
76
+ workspaceId: id.data,
77
+ actorSubjectId: grant.subjectId,
78
+ browserSessionHash: await hashCodexBrowserSession("configured:" + grant.subjectId),
79
+ };
80
+ if (
81
+ deps.settings.productAccessMode === "local" &&
82
+ grant.subjectId &&
83
+ !c.req.header("authorization")
84
+ )
85
+ return {
86
+ accountId: grant.accountId,
87
+ workspaceId: id.data,
88
+ actorSubjectId: grant.subjectId,
89
+ browserSessionHash: await hashCodexBrowserSession("local:" + grant.subjectId),
90
+ };
91
+ throw new HTTPException(401, {
92
+ message: "Sign in to Opengeni to connect Claude.",
93
+ });
94
+ }
95
+ /**
96
+ * Require the Claude cutover receipt at start and completion alike.
97
+ */
98
+ async function oauthCore(c: Context, inputScope: ClaudeOAuthScope) {
99
+ await claudeCoreRoute(deps, async () => inputScope.accountId);
100
+ return { connectedBySubjectId: (await managedCookieHuman(c, deps))?.subjectId ?? null };
101
+ }
102
+ for (const organization of [false, true]) {
103
+ const path = organization
104
+ ? "/v1/organizations/:organizationId/model-providers/claude_subscription/oauth"
105
+ : "/v1/workspaces/:workspaceId/model-providers/claude_subscription/oauth";
106
+ app.post(`${path}/start`, async (c) => {
107
+ const inputScope = await scope(c, organization);
108
+ const payload = ClaudeSubscriptionOAuthStartRequest.safeParse(
109
+ await c.req.json().catch(() => null),
110
+ );
111
+ if (!payload.success || (organization && payload.data.scope !== "workspace"))
112
+ throw new HTTPException(422, { message: "Choose where to connect this Claude account." });
113
+ // The runtime first: on the core a private account is authorized in
114
+ // the owner's Personal workspace and refused (403) anywhere else,
115
+ // before any Claude sign-in.
116
+ const core = await oauthCore(c, inputScope);
117
+ if (payload.data.scope === "user")
118
+ await requireClaudeCorePersonalWorkspace(deps, {
119
+ accountId: inputScope.accountId,
120
+ workspaceId: inputScope.workspaceId,
121
+ subjectId: inputScope.actorSubjectId,
122
+ });
123
+ if (!organization)
124
+ await requireSubscriptionScopeMutation(
125
+ c,
126
+ deps,
127
+ inputScope.workspaceId!,
128
+ payload.data.scope,
129
+ "Claude",
130
+ "personal_workspace",
131
+ );
132
+ return c.json(await startClaudeSubscriptionOAuth(deps, inputScope, payload.data, core));
133
+ });
134
+ app.post(`${path}/complete`, async (c) => {
135
+ const inputScope = await scope(c, organization);
136
+ const payload = ClaudeSubscriptionOAuthCompleteRequest.safeParse(
137
+ await c.req.json().catch(() => null),
138
+ );
139
+ if (!payload.success)
140
+ throw new HTTPException(422, {
141
+ message: "Enter the authorization code from Claude.",
142
+ });
143
+ const core = await oauthCore(c, inputScope);
144
+ return c.json(
145
+ await completeClaudeSubscriptionOAuth(
146
+ deps,
147
+ inputScope,
148
+ payload.data,
149
+ async (poolScope) => {
150
+ if (!organization)
151
+ await requireSubscriptionScopeMutation(
152
+ c,
153
+ deps,
154
+ inputScope.workspaceId!,
155
+ poolScope ?? "workspace",
156
+ "Claude",
157
+ "personal_workspace",
158
+ );
159
+ const fresh = await scope(c, organization, true);
160
+ if (
161
+ fresh.accountId !== inputScope.accountId ||
162
+ fresh.actorSubjectId !== inputScope.actorSubjectId ||
163
+ fresh.browserSessionHash !== inputScope.browserSessionHash
164
+ )
165
+ throw new HTTPException(403, {
166
+ message: "Your access changed during Claude sign-in. Start again.",
167
+ });
168
+ },
169
+ fetchImpl,
170
+ core,
171
+ ),
172
+ );
173
+ });
174
+ }
175
+ }