@opengeni/api-router 3.0.1 → 3.0.2-canary.38894290271001

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-AJ62T5QN.js → chunk-GBUJ2DYZ.js} +80507 -39878
  21. package/dist/chunk-GBUJ2DYZ.js.map +1 -0
  22. package/dist/chunk-OGQDXVXY.js +18 -0
  23. package/dist/chunk-OGQDXVXY.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 +150 -49
  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,687 @@
1
+ // Codex routes for organizations whose Codex cutover row exists (M3 PR 2b).
2
+ //
3
+ // `codexRouteDisposition` is read first by every Codex route. A missing or disabled row answers a
4
+ // typed 503 and reads no legacy Codex table. An enabled row runs the
5
+ // handlers below: the same paths, verbs, request fields and response shapes,
6
+ // projected from the shared subscription core (SUB-COMPAT-02). Operations the
7
+ // core does not serve yet answer a typed 409 instead of touching legacy state.
8
+ import type { Context } from "hono";
9
+ import { HTTPException } from "hono/http-exception";
10
+ import * as z from "zod/v4";
11
+ import { CodexAppsDesignationRequest } from "@opengeni/contracts";
12
+ import { hasPermission, requireAccessGrant, type ApiRouteDeps } from "@opengeni/core";
13
+ import {
14
+ clearSubscriptionCoreCodexApps,
15
+ connectSubscriptionCoreCodexConnection,
16
+ deliverSubscriptionCoreCodexWake,
17
+ designateSubscriptionCoreCodexApps,
18
+ disconnectAllSubscriptionCoreCodexConnections,
19
+ disconnectSubscriptionCoreCodexConnection,
20
+ fetchSubscriptionCoreCodexUsage,
21
+ getSubscriptionCoreCodexAppsSettings,
22
+ getSubscriptionCoreCodexWorkspaceProjection,
23
+ getSubscriptionCoreOrganizationCodexAccount,
24
+ getSubscriptionCoreOrganizationCodexProjection,
25
+ readCodexCutoverDisposition,
26
+ renameSubscriptionCoreCodexConnection,
27
+ resolveSubscriptionCoreCodexConnectionId,
28
+ setSubscriptionCoreCodexAllocator,
29
+ setSubscriptionCoreCodexExtraCredits,
30
+ setSubscriptionCoreCodexPrimary,
31
+ setSubscriptionCoreCodexRotation,
32
+ setSubscriptionCoreWorkspaceCodexSource,
33
+ SubscriptionCoreCodexOrganizationManagedError,
34
+ SubscriptionCoreCodexSourceRefusedError,
35
+ type SubscriptionCoreCodexCredentialInput,
36
+ type SubscriptionCoreCodexDisconnectOutcome,
37
+ } from "@opengeni/db";
38
+ import type { CodexFetch, CodexUsagePayload } from "@opengeni/codex";
39
+ import {
40
+ codexAccountJson,
41
+ codexModelsForPicker,
42
+ codexUsageJson,
43
+ codexWorkerReadiness,
44
+ managedHumanOrAgent,
45
+ requireCodexAppsHuman,
46
+ } from "./codex";
47
+ import { SUBSCRIPTION_CORE_CUTOVER_DISABLED, typedHttpError } from "./subscription-core-http";
48
+
49
+ export { SUBSCRIPTION_CORE_CUTOVER_DISABLED, typedHttpError };
50
+
51
+ /**
52
+ * Only an enabled Codex cutover admits a request. Missing and disabled rows
53
+ * are maintenance: fail closed, never fall back to legacy state.
54
+ */
55
+ export async function codexRouteDisposition(
56
+ deps: ApiRouteDeps,
57
+ accountId: string,
58
+ ): Promise<"core"> {
59
+ const disposition = await readCodexCutoverDisposition(deps.db, accountId);
60
+ if (disposition === "maintenance") {
61
+ throw typedHttpError(
62
+ 503,
63
+ SUBSCRIPTION_CORE_CUTOVER_DISABLED,
64
+ "Codex subscriptions are paused for maintenance in this organization",
65
+ );
66
+ }
67
+ return disposition;
68
+ }
69
+
70
+ function projection(
71
+ deps: ApiRouteDeps,
72
+ accountId: string,
73
+ workspaceId: string,
74
+ viewerSubjectId?: string,
75
+ ) {
76
+ return getSubscriptionCoreCodexWorkspaceProjection(deps.db, {
77
+ accountId,
78
+ workspaceId,
79
+ viewerSubjectId: viewerSubjectId ?? null,
80
+ });
81
+ }
82
+
83
+ /**
84
+ * Persist a finished device-code sign-in on the core (M3 PR 3b): the legacy
85
+ * `connect/poll` response. `workspaceId` null is the organization route.
86
+ */
87
+ export async function coreCodexConnected(
88
+ c: Context,
89
+ deps: ApiRouteDeps,
90
+ input: {
91
+ accountId: string;
92
+ workspaceId: string | null;
93
+ subjectId: string;
94
+ credential: SubscriptionCoreCodexCredentialInput;
95
+ },
96
+ ) {
97
+ const result = await connectSubscriptionCoreCodexConnection(deps.db, {
98
+ accountId: input.accountId,
99
+ workspaceId: input.workspaceId,
100
+ subjectId: input.subjectId,
101
+ ...input.credential,
102
+ });
103
+ if (result.kind === "refused") {
104
+ switch (result.reason) {
105
+ case "identity_unverified":
106
+ throw new HTTPException(409, {
107
+ message:
108
+ "this migrated Codex login has no verified person identity; an organization administrator must disconnect it before connecting again",
109
+ });
110
+ case "managed_elsewhere":
111
+ throw new HTTPException(409, {
112
+ message:
113
+ "this Codex account is already connected in this organization and is managed elsewhere",
114
+ });
115
+ case "personal_connections_disabled":
116
+ throw new HTTPException(409, {
117
+ message: "personal Codex connections are turned off in this organization",
118
+ });
119
+ case "unavailable":
120
+ throw typedHttpError(
121
+ 503,
122
+ SUBSCRIPTION_CORE_CUTOVER_DISABLED,
123
+ "Codex subscriptions are paused for maintenance in this organization",
124
+ );
125
+ default:
126
+ throw new HTTPException(403, {
127
+ message:
128
+ input.workspaceId === null
129
+ ? "only an organization administrator can connect a Codex account for the whole organization"
130
+ : "only an administrator of this workspace or of the organization can connect a Codex account here",
131
+ });
132
+ }
133
+ }
134
+ try {
135
+ await deliverSubscriptionCoreCodexWake(deps.db, result.wake);
136
+ } catch {
137
+ // Every core waiter has its own bounded recheck; a lost wake only delays.
138
+ }
139
+ const activeCredentialId =
140
+ input.workspaceId === null
141
+ ? (
142
+ await getSubscriptionCoreOrganizationCodexProjection(deps.db, {
143
+ organizationId: input.accountId,
144
+ subjectId: input.subjectId,
145
+ })
146
+ ).rotation.activeCredentialId
147
+ : (await projection(deps, input.accountId, input.workspaceId, input.subjectId)).rotation
148
+ .activeCredentialId;
149
+ return c.json({
150
+ status: "connected",
151
+ plan: input.credential.planType,
152
+ accountId: result.id,
153
+ isActive: activeCredentialId === result.id,
154
+ });
155
+ }
156
+
157
+ function disconnectRefused(outcome: SubscriptionCoreCodexDisconnectOutcome): void {
158
+ if (outcome === "forbidden") {
159
+ throw new HTTPException(403, {
160
+ message:
161
+ "only an organization administrator can disconnect this Codex account; a workspace administrator can disconnect only an account that serves just their workspace",
162
+ });
163
+ }
164
+ if (outcome === "unresolved_redemption") {
165
+ throw new HTTPException(409, {
166
+ message:
167
+ "this subscription has an unresolved reset redemption; recover it before disconnecting",
168
+ });
169
+ }
170
+ if (outcome === "in_use") {
171
+ throw new HTTPException(409, {
172
+ message: "Codex subscription cannot disconnect while active turns are using it",
173
+ });
174
+ }
175
+ }
176
+
177
+ /** Disconnect one account on the core: the legacy `{ disconnected, newActiveId }`. */
178
+ export async function coreCodexDisconnect(
179
+ c: Context,
180
+ deps: ApiRouteDeps,
181
+ input: { accountId: string; workspaceId: string | null; subjectId: string; connectionId: string },
182
+ ) {
183
+ let result: Awaited<ReturnType<typeof disconnectSubscriptionCoreCodexConnection>>;
184
+ try {
185
+ result = await disconnectSubscriptionCoreCodexConnection(deps.db, input);
186
+ } catch (error) {
187
+ if (error instanceof SubscriptionCoreCodexOrganizationManagedError) {
188
+ throw new HTTPException(409, { message: error.message });
189
+ }
190
+ throw error;
191
+ }
192
+ disconnectRefused(result.outcome);
193
+ if (result.wake) {
194
+ try {
195
+ await deliverSubscriptionCoreCodexWake(deps.db, result.wake);
196
+ } catch {
197
+ // Bounded rechecks pick the change up.
198
+ }
199
+ }
200
+ const newActiveId =
201
+ input.workspaceId === null
202
+ ? (
203
+ await getSubscriptionCoreOrganizationCodexProjection(deps.db, {
204
+ organizationId: input.accountId,
205
+ subjectId: input.subjectId,
206
+ })
207
+ ).rotation.activeCredentialId
208
+ : (await projection(deps, input.accountId, input.workspaceId)).rotation.activeCredentialId;
209
+ return c.json({ disconnected: result.outcome === "removed", newActiveId });
210
+ }
211
+
212
+ /** The legacy workspace "disconnect all" on the core: `{ disconnected }`. */
213
+ export async function coreCodexDisconnectAll(
214
+ c: Context,
215
+ deps: ApiRouteDeps,
216
+ input: { accountId: string; workspaceId: string; subjectId: string },
217
+ ) {
218
+ const result = await disconnectAllSubscriptionCoreCodexConnections(deps.db, input);
219
+ if (result.refused) {
220
+ if (result.refused.outcome === "unresolved_redemption") {
221
+ throw new HTTPException(409, {
222
+ message:
223
+ "one or more subscriptions have unresolved reset redemptions; recover them before disconnecting",
224
+ });
225
+ }
226
+ disconnectRefused(result.refused.outcome);
227
+ }
228
+ if (result.wake) {
229
+ try {
230
+ await deliverSubscriptionCoreCodexWake(deps.db, result.wake);
231
+ } catch {
232
+ // Bounded rechecks pick the change up.
233
+ }
234
+ }
235
+ return c.json({ disconnected: result.removed > 0 });
236
+ }
237
+
238
+ export async function coreCodexSource(
239
+ c: Context,
240
+ deps: ApiRouteDeps,
241
+ accountId: string,
242
+ workspaceId: string,
243
+ ) {
244
+ return c.json((await projection(deps, accountId, workspaceId)).source);
245
+ }
246
+
247
+ export async function coreCodexSetSource(
248
+ c: Context,
249
+ deps: ApiRouteDeps,
250
+ input: {
251
+ accountId: string;
252
+ workspaceId: string;
253
+ subjectId: string;
254
+ mode: "automatic" | "workspace" | "organization" | "disabled";
255
+ },
256
+ ) {
257
+ let result: Awaited<ReturnType<typeof setSubscriptionCoreWorkspaceCodexSource>>;
258
+ try {
259
+ result = await setSubscriptionCoreWorkspaceCodexSource(deps.db, input);
260
+ } catch (error) {
261
+ if (error instanceof SubscriptionCoreCodexSourceRefusedError) {
262
+ throw new HTTPException(error.reason === "personal_workspace" ? 409 : 403, {
263
+ message: error.message,
264
+ });
265
+ }
266
+ throw error;
267
+ }
268
+ await deliverSubscriptionCoreCodexWake(deps.db, result.wake);
269
+ return c.json(result.source);
270
+ }
271
+
272
+ /**
273
+ * Readiness is computed from the core pool; there is no live provider model
274
+ * probe (that needs a connection-level credential read, which is PR 2c's usage
275
+ * seam), so `valid` reports whether a serviceable account exists and `models`
276
+ * is the configured Codex catalog.
277
+ */
278
+ export async function coreCodexStatus(
279
+ c: Context,
280
+ deps: ApiRouteDeps,
281
+ accountId: string,
282
+ workspaceId: string,
283
+ catalogSettings: Parameters<typeof codexModelsForPicker>[0],
284
+ viewerSubjectId: string,
285
+ ) {
286
+ const { accounts, rotation, source } = await projection(
287
+ deps,
288
+ accountId,
289
+ workspaceId,
290
+ viewerSubjectId,
291
+ );
292
+ const active = accounts.find((account) => account.id === rotation.activeCredentialId) ?? null;
293
+ const readiness = codexWorkerReadiness({
294
+ effectiveSource: source.effectiveSource,
295
+ rotationEnabled: rotation.rotationEnabled,
296
+ activeCredentialId: rotation.activeCredentialId,
297
+ accounts,
298
+ now: new Date(),
299
+ });
300
+ const connected = accounts.some((account) => account.status === "active");
301
+ return c.json({
302
+ connected,
303
+ plan: active?.planType ?? null,
304
+ valid: readiness.poolReady,
305
+ activeAccountValid: active?.status === "active",
306
+ poolReady: readiness.poolReady,
307
+ workerRoutable: readiness.workerRoutable,
308
+ expiresAt: active?.expiresAt ?? null,
309
+ lastError: active?.lastError ?? null,
310
+ models: connected ? codexModelsForPicker(catalogSettings) : [],
311
+ activeAccount: active
312
+ ? {
313
+ id: active.id,
314
+ label: active.label ?? active.accountEmail ?? active.planType ?? active.chatgptAccountId,
315
+ chatgptAccountId: active.chatgptAccountId,
316
+ }
317
+ : null,
318
+ accountCount: accounts.length,
319
+ source,
320
+ });
321
+ }
322
+
323
+ export async function coreCodexAccounts(
324
+ c: Context,
325
+ deps: ApiRouteDeps,
326
+ grant: Awaited<ReturnType<typeof requireAccessGrant>>,
327
+ workspaceId: string,
328
+ ) {
329
+ const [{ accounts, rotation, source, personalAccountIds }, apps, human] = await Promise.all([
330
+ // In the viewer's own Personal workspace their personal connections are
331
+ // listed too (M3 PR 3b); nobody else ever sees them.
332
+ getSubscriptionCoreCodexWorkspaceProjection(deps.db, {
333
+ accountId: grant.accountId,
334
+ workspaceId,
335
+ viewerSubjectId: grant.subjectId,
336
+ }),
337
+ getSubscriptionCoreCodexAppsSettings(deps.db, { accountId: grant.accountId, workspaceId }),
338
+ managedHumanOrAgent(c, deps),
339
+ ]);
340
+ const personal = new Set(personalAccountIds ?? []);
341
+ const humanSubjectId = human?.subjectId === grant.subjectId ? human.subjectId : null;
342
+ const canManageApps =
343
+ deps.settings.codexConnectedAppsEnabled &&
344
+ humanSubjectId !== null &&
345
+ hasPermission(grant.permissions, "connections:write");
346
+ return c.json({
347
+ accounts: accounts.map((account) => ({
348
+ ...codexAccountJson(account, {
349
+ appsCredentialId: apps.credentialId,
350
+ canManageApps,
351
+ humanSubjectId,
352
+ }),
353
+ // Core designation authority is administrator/delegated manager in any
354
+ // source mode (design 6.3), enforced by the database; this is the hint.
355
+ // Designations are shared-only, so a personal connection never offers it.
356
+ canEnableApps:
357
+ apps.credentialId === null &&
358
+ canManageApps &&
359
+ account.status === "active" &&
360
+ !personal.has(account.id),
361
+ })),
362
+ activeAccountId: rotation.activeCredentialId,
363
+ source,
364
+ apps: {
365
+ available: deps.settings.codexConnectedAppsEnabled,
366
+ credentialId: apps.credentialId,
367
+ version: apps.version,
368
+ designatedAt: apps.designatedAt,
369
+ canDisable: canManageApps && apps.credentialId !== null,
370
+ },
371
+ settings: {
372
+ rotationEnabled: rotation.rotationEnabled,
373
+ rotationStrategy: "sharded",
374
+ activeCredentialId: rotation.activeCredentialId,
375
+ },
376
+ });
377
+ }
378
+
379
+ type AppsHuman = Awaited<ReturnType<typeof requireCodexAppsHuman>>;
380
+
381
+ export async function coreCodexDesignateApps(
382
+ c: Context,
383
+ deps: ApiRouteDeps,
384
+ workspaceId: string,
385
+ { human, accountId }: AppsHuman,
386
+ ) {
387
+ if (!deps.settings.codexConnectedAppsEnabled) {
388
+ throw new HTTPException(409, { message: "Codex Apps is disabled for this deployment" });
389
+ }
390
+ const parsed = CodexAppsDesignationRequest.safeParse(await c.req.json().catch(() => null));
391
+ if (!parsed.success) {
392
+ throw new HTTPException(400, { message: "accountId and expectedVersion are required" });
393
+ }
394
+ const result = await designateSubscriptionCoreCodexApps(deps.db, {
395
+ accountId,
396
+ workspaceId,
397
+ connectionId: parsed.data.accountId,
398
+ subjectId: human.subjectId,
399
+ expectedVersion: parsed.data.expectedVersion,
400
+ });
401
+ if (result.kind === "not_found") {
402
+ throw new HTTPException(404, { message: "codex account not found" });
403
+ }
404
+ if (result.kind === "forbidden") {
405
+ throw new HTTPException(403, {
406
+ message:
407
+ "only an organization administrator or the account's managing workspace administrator may designate it",
408
+ });
409
+ }
410
+ if (result.kind === "unavailable") {
411
+ throw new HTTPException(409, { message: "codex account requires relogin" });
412
+ }
413
+ const response = {
414
+ credentialId: result.credentialId,
415
+ version: result.version,
416
+ designatedAt: result.designatedAt,
417
+ changed: result.kind === "updated",
418
+ };
419
+ return result.kind === "updated" ? c.json(response) : c.json(response, 409);
420
+ }
421
+
422
+ export async function coreCodexClearApps(
423
+ c: Context,
424
+ deps: ApiRouteDeps,
425
+ workspaceId: string,
426
+ { human, accountId }: AppsHuman,
427
+ ) {
428
+ const parsed = z
429
+ .object({ expectedVersion: z.number().int().nonnegative() })
430
+ .safeParse(await c.req.json().catch(() => null));
431
+ if (!parsed.success) {
432
+ throw new HTTPException(400, { message: "expectedVersion is required" });
433
+ }
434
+ const result = await clearSubscriptionCoreCodexApps(deps.db, {
435
+ accountId,
436
+ workspaceId,
437
+ subjectId: human.subjectId,
438
+ expectedVersion: parsed.data.expectedVersion,
439
+ });
440
+ if (result.kind === "forbidden") {
441
+ throw new HTTPException(403, {
442
+ message:
443
+ "only an organization administrator or the account's managing workspace administrator may clear it",
444
+ });
445
+ }
446
+ const response = {
447
+ credentialId: result.credentialId,
448
+ version: result.version,
449
+ designatedAt: result.designatedAt,
450
+ changed: result.kind === "updated",
451
+ };
452
+ return result.kind === "conflict" ? c.json(response, 409) : c.json(response);
453
+ }
454
+
455
+ type Admin = { accountId: string; workspaceId: string | null; subjectId: string };
456
+
457
+ export async function coreCodexActivate(
458
+ c: Context,
459
+ deps: ApiRouteDeps,
460
+ admin: Admin,
461
+ connectionId: string,
462
+ ) {
463
+ const result = await setSubscriptionCoreCodexPrimary(deps.db, { ...admin, connectionId });
464
+ if (!result.activated) throw new HTTPException(404, { message: "codex account not found" });
465
+ await deliverSubscriptionCoreCodexWake(deps.db, result.wake);
466
+ return c.json({ activated: true, accountId: connectionId });
467
+ }
468
+
469
+ export async function coreCodexSetRotation(
470
+ c: Context,
471
+ deps: ApiRouteDeps,
472
+ admin: Admin,
473
+ rotationEnabled: boolean,
474
+ ) {
475
+ const result = await setSubscriptionCoreCodexRotation(deps.db, { ...admin, rotationEnabled });
476
+ if (!result.rotation) {
477
+ throw new HTTPException(404, {
478
+ message: admin.workspaceId ? "codex rotation settings not found" : "Codex settings not found",
479
+ });
480
+ }
481
+ await deliverSubscriptionCoreCodexWake(deps.db, result.wake);
482
+ return c.json({
483
+ rotationEnabled: result.rotation.rotationEnabled,
484
+ rotationStrategy: "sharded",
485
+ activeCredentialId: result.rotation.activeCredentialId,
486
+ });
487
+ }
488
+
489
+ export async function coreCodexRename(
490
+ c: Context,
491
+ deps: ApiRouteDeps,
492
+ admin: Admin,
493
+ connectionId: string,
494
+ label: string | null,
495
+ ) {
496
+ const renamed = await renameSubscriptionCoreCodexConnection(deps.db, {
497
+ ...admin,
498
+ connectionId,
499
+ label,
500
+ });
501
+ if (!renamed) throw new HTTPException(404, { message: "codex account not found" });
502
+ // The organization route also renames accounts a shared workspace manages,
503
+ // which its list does not show: read the renamed one itself.
504
+ const row = admin.workspaceId
505
+ ? (await projection(deps, admin.accountId, admin.workspaceId, admin.subjectId)).accounts.find(
506
+ (account) => account.id === renamed,
507
+ )
508
+ : await getSubscriptionCoreOrganizationCodexAccount(deps.db, {
509
+ organizationId: admin.accountId,
510
+ subjectId: admin.subjectId,
511
+ connectionId: renamed,
512
+ });
513
+ if (!row) throw new HTTPException(404, { message: "codex account not found" });
514
+ return c.json(codexAccountJson(row));
515
+ }
516
+
517
+ export async function coreCodexAllocator(
518
+ c: Context,
519
+ deps: ApiRouteDeps,
520
+ admin: Admin,
521
+ connectionId: string,
522
+ body: { enabled: boolean; expectedVersion: number },
523
+ ) {
524
+ const mutation = await setSubscriptionCoreCodexAllocator(deps.db, {
525
+ ...admin,
526
+ connectionId,
527
+ ...body,
528
+ });
529
+ const result = mutation.result;
530
+ if (result.kind === "not_found") {
531
+ throw new HTTPException(404, { message: "codex account not found" });
532
+ }
533
+ await deliverSubscriptionCoreCodexWake(deps.db, mutation.wake);
534
+ const response = {
535
+ allocatorEnabled: result.allocatorEnabled,
536
+ allocatorVersion: result.allocatorVersion,
537
+ allocatorUpdatedAt: result.allocatorUpdatedAt,
538
+ changed: result.kind === "updated",
539
+ };
540
+ return result.kind === "conflict" ? c.json(response, 409) : c.json(response);
541
+ }
542
+
543
+ export async function coreCodexExtraCredits(
544
+ c: Context,
545
+ deps: ApiRouteDeps,
546
+ admin: Admin,
547
+ connectionId: string,
548
+ body: { enabled: boolean; expectedVersion: number },
549
+ ) {
550
+ const mutation = await setSubscriptionCoreCodexExtraCredits(deps.db, {
551
+ ...admin,
552
+ connectionId,
553
+ ...body,
554
+ });
555
+ const result = mutation.result;
556
+ if (result.kind === "not_found") {
557
+ throw new HTTPException(404, { message: "codex account not found" });
558
+ }
559
+ await deliverSubscriptionCoreCodexWake(deps.db, mutation.wake);
560
+ const response = {
561
+ extraCreditsEnabled: result.extraCreditsEnabled,
562
+ extraCreditsVersion: result.extraCreditsVersion,
563
+ extraCreditsUpdatedAt: result.extraCreditsUpdatedAt,
564
+ changed: result.kind === "updated",
565
+ };
566
+ return result.kind === "conflict" ? c.json(response, 409) : c.json(response);
567
+ }
568
+
569
+ export async function coreOrganizationCodexAccounts(
570
+ c: Context,
571
+ deps: ApiRouteDeps,
572
+ organizationId: string,
573
+ subjectId: string,
574
+ ) {
575
+ const { accounts, rotation } = await getSubscriptionCoreOrganizationCodexProjection(deps.db, {
576
+ organizationId,
577
+ subjectId,
578
+ });
579
+ return c.json({
580
+ accounts: accounts.map((account) => codexAccountJson(account)),
581
+ activeAccountId: rotation.activeCredentialId,
582
+ settings: {
583
+ rotationEnabled: rotation.rotationEnabled,
584
+ rotationStrategy: "sharded",
585
+ activeCredentialId: rotation.activeCredentialId,
586
+ },
587
+ });
588
+ }
589
+
590
+ type Grant = Awaited<ReturnType<typeof requireAccessGrant>>;
591
+
592
+ /** One connection's live usage through the core seam; wakes waiters on recovery. */
593
+ async function liveCoreCodexUsage(
594
+ deps: ApiRouteDeps,
595
+ grant: Grant,
596
+ workspaceId: string,
597
+ connectionId: string,
598
+ ): Promise<CodexUsagePayload> {
599
+ const { usage, recovered } = await fetchSubscriptionCoreCodexUsage(
600
+ deps.db,
601
+ deps.settings,
602
+ { kind: "workspace", accountId: grant.accountId, workspaceId, subjectId: grant.subjectId },
603
+ connectionId,
604
+ (deps.codexFetch ?? fetch) as CodexFetch,
605
+ );
606
+ if (recovered) {
607
+ // The quota observation already committed; a failed wake hint must never
608
+ // turn the read into an error (every core waiter has its own recheck).
609
+ await deliverSubscriptionCoreCodexWake(deps.db, {
610
+ accountId: grant.accountId,
611
+ reason: "usage_recovered",
612
+ }).catch(() => undefined);
613
+ }
614
+ return usage;
615
+ }
616
+
617
+ /**
618
+ * Live usage on the core (EP-N21): the workspace's effective primary
619
+ * connection (the legacy active account), or one connection of the
620
+ * workspace's pool by id or legacy alias. The 404 copy matches legacy.
621
+ */
622
+ export async function coreCodexUsage(
623
+ c: Context,
624
+ deps: ApiRouteDeps,
625
+ grant: Grant,
626
+ workspaceId: string,
627
+ requestedId: string | null,
628
+ ) {
629
+ const { accounts, rotation } = await projection(deps, grant.accountId, workspaceId);
630
+ let connectionId: string | null;
631
+ if (requestedId === null) {
632
+ connectionId = rotation.activeCredentialId;
633
+ if (!connectionId || !accounts.some((account) => account.id === connectionId)) {
634
+ throw new HTTPException(404, { message: "codex subscription is not connected" });
635
+ }
636
+ } else {
637
+ connectionId = z.uuid().safeParse(requestedId).success
638
+ ? await resolveSubscriptionCoreCodexConnectionId(deps.db, {
639
+ accountId: grant.accountId,
640
+ workspaceId,
641
+ connectionId: requestedId,
642
+ })
643
+ : null;
644
+ if (!connectionId || !accounts.some((account) => account.id === connectionId)) {
645
+ throw new HTTPException(404, { message: "codex account not found" });
646
+ }
647
+ }
648
+ return c.json(codexUsageJson(await liveCoreCodexUsage(deps, grant, workspaceId, connectionId)));
649
+ }
650
+
651
+ /** Batched live refresh over the workspace's core pool, four provider calls at a time. */
652
+ export async function coreCodexUsageRefresh(
653
+ c: Context,
654
+ deps: ApiRouteDeps,
655
+ grant: Grant,
656
+ workspaceId: string,
657
+ ) {
658
+ const { accounts } = await projection(deps, grant.accountId, workspaceId);
659
+ const usage: Record<string, ReturnType<typeof codexUsageJson>> = {};
660
+ const queue = [...accounts];
661
+ const worker = async (): Promise<void> => {
662
+ for (;;) {
663
+ const account = queue.shift();
664
+ if (!account) return;
665
+ const settled = await Promise.allSettled([
666
+ liveCoreCodexUsage(deps, grant, workspaceId, account.id),
667
+ ]);
668
+ const result = settled[0];
669
+ usage[account.id] =
670
+ result.status === "fulfilled"
671
+ ? codexUsageJson(result.value)
672
+ : codexUsageJson({
673
+ status: "error",
674
+ planType: null,
675
+ fiveHour: null,
676
+ weekly: null,
677
+ limitReached: false,
678
+ fetchedAt: new Date().toISOString(),
679
+ rateLimitResetCredits: null,
680
+ });
681
+ }
682
+ };
683
+ await Promise.all(
684
+ Array.from({ length: Math.min(4, Math.max(1, accounts.length)) }, () => worker()),
685
+ );
686
+ return c.json({ usage });
687
+ }