@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,326 @@
1
+ import {
2
+ CreateOrganizationWebhookRequest,
3
+ CreateOrganizationWebhookResponse,
4
+ GetOrganizationCredentialProviderResponse,
5
+ ListOrganizationWebhookDeliveriesResponse,
6
+ ListOrganizationWebhooksResponse,
7
+ OrganizationCredentialProvider,
8
+ OrganizationWebhook,
9
+ PutOrganizationCredentialProviderRequest,
10
+ PutOrganizationCredentialProviderResponse,
11
+ RotateOrganizationCredentialProviderSecretResponse,
12
+ RotateOrganizationWebhookSecretResponse,
13
+ UpdateOrganizationWebhookRequest,
14
+ type AccessContext,
15
+ } from "@opengeni/contracts";
16
+ import {
17
+ accountScopedApiKeyWorkspaceAuthority,
18
+ accessGrantAuthorizationFromContext,
19
+ requireAccountAdminAuthorizationStamp,
20
+ requireAccessContext,
21
+ requireCanonicalLocalAccountAdministrator,
22
+ type AccessGrantAuthorization,
23
+ type ApiRouteDeps,
24
+ isVerifiedDelegatedHumanAuthorization,
25
+ } from "@opengeni/core";
26
+ import {
27
+ createOrganizationWebhook,
28
+ deleteOrganizationCredentialProvider,
29
+ deleteOrganizationWebhook,
30
+ encryptEnvironmentValue,
31
+ getOrganizationCredentialProvider,
32
+ getOrganizationWebhook,
33
+ listOrganizationWebhookDeliveries,
34
+ listOrganizationWebhooks,
35
+ OrganizationWebhookLimitError,
36
+ redeliverOrganizationWebhookDelivery,
37
+ rotateOrganizationCredentialProviderSecret,
38
+ rotateOrganizationWebhookSecret,
39
+ updateOrganizationWebhook,
40
+ upsertOrganizationCredentialProvider,
41
+ withCredentialProviderConfigurationLock,
42
+ type OrganizationCredentialProviderRow,
43
+ type OrganizationWebhookRow,
44
+ } from "@opengeni/db";
45
+ import type { Context, Hono } from "hono";
46
+ import { HTTPException } from "hono/http-exception";
47
+ import { z } from "zod";
48
+ import { organizationApiKeyAccess, requireOrganizationApiKeyControlPermission } from "./api-keys";
49
+ import { requireSameOriginBrowserMutation } from "./codex";
50
+ import {
51
+ integrationBody as body,
52
+ integrationDeliveryProjection as deliveryProjection,
53
+ integrationProviderFields,
54
+ integrationRouteConfiguration,
55
+ integrationWebhookFields,
56
+ isIntegrationAgent,
57
+ newIntegrationSecret,
58
+ } from "./workspace-integrations";
59
+
60
+ /** Account administrators or verified full-access organization keys; never workspace keys. */
61
+ export function requireOrganizationIntegrationAdmin(
62
+ context: AccessContext,
63
+ organizationId: string,
64
+ authorization?: AccessGrantAuthorization,
65
+ ): string {
66
+ if (context.workspaceGrants.some(isIntegrationAgent)) {
67
+ throw new HTTPException(403, {
68
+ message: "Agent attempts cannot manage organization integrations",
69
+ });
70
+ }
71
+ const grant = context.accountGrants.find(
72
+ (candidate) =>
73
+ candidate.accountId === organizationId && candidate.subjectId === context.subjectId,
74
+ );
75
+ if (!grant) {
76
+ throw new HTTPException(403, { message: "missing permission: account:admin" });
77
+ }
78
+ if (context.subjectId.startsWith("api_key:")) {
79
+ requireOrganizationApiKeyControlPermission(context, organizationId);
80
+ const authority = accountScopedApiKeyWorkspaceAuthority(context);
81
+ if (
82
+ !authority ||
83
+ authority.accountId !== organizationId ||
84
+ organizationApiKeyAccess(authority.permissions) !== "full"
85
+ ) {
86
+ throw new HTTPException(403, { message: "organization API key authority required" });
87
+ }
88
+ } else {
89
+ if (!grant.permissions.includes("account:admin"))
90
+ throw new HTTPException(403, { message: "missing permission: account:admin" });
91
+ if (
92
+ !authorization ||
93
+ !(
94
+ authorization.canonicalManagedHumanSession ||
95
+ authorization.canonicalLocalHumanSession ||
96
+ isVerifiedDelegatedHumanAuthorization(authorization)
97
+ ) ||
98
+ authorization.grant.accountId !== organizationId ||
99
+ authorization.authenticatedSubjectId !== context.subjectId ||
100
+ context.workspaceGrants.some((candidate) => candidate.metadata?.delegated === true)
101
+ ) {
102
+ throw new HTTPException(403, { message: "Canonical organization administrator required" });
103
+ }
104
+ requireAccountAdminAuthorizationStamp(authorization);
105
+ }
106
+ return grant.subjectId;
107
+ }
108
+
109
+ function providerProjection(
110
+ row: OrganizationCredentialProviderRow,
111
+ ): OrganizationCredentialProvider {
112
+ return OrganizationCredentialProvider.parse({
113
+ ...integrationProviderFields(row),
114
+ organizationId: row.accountId,
115
+ workspaceFilter: row.workspaceFilter,
116
+ });
117
+ }
118
+ function webhookProjection(row: OrganizationWebhookRow): OrganizationWebhook {
119
+ return OrganizationWebhook.parse({
120
+ ...integrationWebhookFields(row),
121
+ organizationId: row.accountId,
122
+ workspaceFilter: row.workspaceFilter,
123
+ });
124
+ }
125
+
126
+ export function registerOrganizationIntegrationRoutes(app: Hono, deps: ApiRouteDeps): void {
127
+ const scope = async (c: Context) => {
128
+ const id = z.string().uuid().safeParse(c.req.param("organizationId"));
129
+ if (!id.success) throw new HTTPException(422, { message: "invalid organization id" });
130
+ const context = await requireAccessContext(c, deps);
131
+ const accountId = id.data.toLowerCase();
132
+ let authorization: AccessGrantAuthorization | undefined;
133
+ if (!accountScopedApiKeyWorkspaceAuthority(context)) {
134
+ if (deps.settings.productAccessMode === "local") {
135
+ authorization = (await requireCanonicalLocalAccountAdministrator(c, deps, accountId))
136
+ .authorization;
137
+ } else {
138
+ const grant = context.workspaceGrants.find(
139
+ (candidate) => candidate.accountId === accountId,
140
+ );
141
+ if (grant) authorization = accessGrantAuthorizationFromContext(context, grant);
142
+ }
143
+ }
144
+ const subjectId = requireOrganizationIntegrationAdmin(context, accountId, authorization);
145
+ if (!accountScopedApiKeyWorkspaceAuthority(context) && !["GET", "HEAD"].includes(c.req.method))
146
+ requireSameOriginBrowserMutation(c, deps);
147
+ c.header("cache-control", "private, no-store");
148
+ return { accountId, subjectId };
149
+ };
150
+ const { requireKey, requireDeployableUrl: requireUrl } = integrationRouteConfiguration(
151
+ deps,
152
+ "organization",
153
+ );
154
+ const encrypted = (secret: string): string => encryptEnvironmentValue(requireKey(), secret);
155
+ const webhookId = (c: Context): string => {
156
+ const id = z.string().uuid().safeParse(c.req.param("webhookId"));
157
+ if (!id.success) throw new HTTPException(404, { message: "Webhook not found" });
158
+ return id.data;
159
+ };
160
+ const base = "/v1/organizations/:organizationId";
161
+ app.get(`${base}/credential-provider`, async (c) => {
162
+ const target = await scope(c);
163
+ const row = await getOrganizationCredentialProvider(deps.db, target);
164
+ return c.json(
165
+ GetOrganizationCredentialProviderResponse.parse({
166
+ provider: row ? providerProjection(row) : null,
167
+ }),
168
+ );
169
+ });
170
+ app.put(`${base}/credential-provider`, async (c) => {
171
+ const target = await scope(c);
172
+ const request = await body(c, PutOrganizationCredentialProviderRequest, 422);
173
+ requireUrl(request.url);
174
+ const {
175
+ row: providerRow,
176
+ secret: signingSecret,
177
+ created,
178
+ } = await withCredentialProviderConfigurationLock(deps.db, target, async (tx) => {
179
+ const existing = await getOrganizationCredentialProvider(tx, target);
180
+ const secret = existing ? undefined : newIntegrationSecret("ogcp");
181
+ const row = await upsertOrganizationCredentialProvider(tx, {
182
+ accountId: target.accountId,
183
+ url: request.url,
184
+ enabled: request.enabled ?? true,
185
+ timeoutMs: request.timeoutMs ?? 10_000,
186
+ workspaceFilter: request.workspaceFilter,
187
+ createdBySubjectId: target.subjectId,
188
+ ...(secret ? { secretEncrypted: encrypted(secret) } : {}),
189
+ });
190
+ return { row, secret, created: !existing };
191
+ });
192
+ return c.json(
193
+ PutOrganizationCredentialProviderResponse.parse({
194
+ provider: providerProjection(providerRow),
195
+ ...(signingSecret ? { secret: signingSecret } : {}),
196
+ }),
197
+ created ? 201 : 200,
198
+ );
199
+ });
200
+ app.delete(`${base}/credential-provider`, async (c) => {
201
+ await deleteOrganizationCredentialProvider(deps.db, await scope(c));
202
+ return c.body(null, 204);
203
+ });
204
+ app.post(`${base}/credential-provider/rotate-secret`, async (c) => {
205
+ const target = await scope(c);
206
+ const secret = newIntegrationSecret("ogcp");
207
+ const row = await rotateOrganizationCredentialProviderSecret(deps.db, {
208
+ ...target,
209
+ secretEncrypted: encrypted(secret),
210
+ });
211
+ if (!row) throw new HTTPException(404, { message: "Credential provider not found" });
212
+ return c.json(
213
+ RotateOrganizationCredentialProviderSecretResponse.parse({
214
+ provider: providerProjection(row),
215
+ secret,
216
+ }),
217
+ );
218
+ });
219
+ app.get(`${base}/webhooks`, async (c) => {
220
+ const rows = await listOrganizationWebhooks(deps.db, await scope(c));
221
+ return c.json(
222
+ ListOrganizationWebhooksResponse.parse({ webhooks: rows.map(webhookProjection) }),
223
+ );
224
+ });
225
+ app.post(`${base}/webhooks`, async (c) => {
226
+ const target = await scope(c);
227
+ const request = await body(c, CreateOrganizationWebhookRequest, 422);
228
+ requireUrl(request.url);
229
+ const secret = newIntegrationSecret("whsec");
230
+ try {
231
+ const row = await createOrganizationWebhook(deps.db, {
232
+ accountId: target.accountId,
233
+ url: request.url,
234
+ secretEncrypted: encrypted(secret),
235
+ eventTypes: request.eventTypes,
236
+ enabled: request.enabled ?? true,
237
+ description: request.description ?? null,
238
+ workspaceFilter: request.workspaceFilter,
239
+ createdBySubjectId: target.subjectId,
240
+ });
241
+ return c.json(
242
+ CreateOrganizationWebhookResponse.parse({ webhook: webhookProjection(row), secret }),
243
+ 201,
244
+ );
245
+ } catch (error) {
246
+ if (error instanceof OrganizationWebhookLimitError)
247
+ throw new HTTPException(409, { message: error.message });
248
+ throw error;
249
+ }
250
+ });
251
+ app.get(`${base}/webhooks/:webhookId`, async (c) => {
252
+ const target = await scope(c);
253
+ const row = await getOrganizationWebhook(deps.db, {
254
+ accountId: target.accountId,
255
+ webhookId: webhookId(c),
256
+ });
257
+ if (!row) throw new HTTPException(404, { message: "Webhook not found" });
258
+ return c.json(webhookProjection(row));
259
+ });
260
+ app.patch(`${base}/webhooks/:webhookId`, async (c) => {
261
+ const target = await scope(c);
262
+ const request = await body(c, UpdateOrganizationWebhookRequest, 422);
263
+ if (request.url) requireUrl(request.url);
264
+ const row = await updateOrganizationWebhook(deps.db, {
265
+ accountId: target.accountId,
266
+ webhookId: webhookId(c),
267
+ ...(request.url !== undefined ? { url: request.url } : {}),
268
+ ...(request.eventTypes !== undefined ? { eventTypes: request.eventTypes } : {}),
269
+ ...(request.enabled !== undefined ? { enabled: request.enabled } : {}),
270
+ ...(request.description !== undefined ? { description: request.description } : {}),
271
+ ...(request.workspaceFilter !== undefined
272
+ ? { workspaceFilter: request.workspaceFilter }
273
+ : {}),
274
+ });
275
+ if (!row) throw new HTTPException(404, { message: "Webhook not found" });
276
+ return c.json(webhookProjection(row));
277
+ });
278
+ app.delete(`${base}/webhooks/:webhookId`, async (c) => {
279
+ const target = await scope(c);
280
+ if (!(await deleteOrganizationWebhook(deps.db, { ...target, webhookId: webhookId(c) }))) {
281
+ throw new HTTPException(404, { message: "Webhook not found" });
282
+ }
283
+ return c.body(null, 204);
284
+ });
285
+ app.post(`${base}/webhooks/:webhookId/rotate-secret`, async (c) => {
286
+ const target = await scope(c);
287
+ const secret = newIntegrationSecret("whsec");
288
+ const row = await rotateOrganizationWebhookSecret(deps.db, {
289
+ ...target,
290
+ webhookId: webhookId(c),
291
+ secretEncrypted: encrypted(secret),
292
+ });
293
+ if (!row) throw new HTTPException(404, { message: "Webhook not found" });
294
+ return c.json(
295
+ RotateOrganizationWebhookSecretResponse.parse({
296
+ webhook: webhookProjection(row),
297
+ secret,
298
+ }),
299
+ );
300
+ });
301
+ app.get(`${base}/webhooks/:webhookId/deliveries`, async (c) => {
302
+ const target = { ...(await scope(c)), webhookId: webhookId(c) };
303
+ if (!(await getOrganizationWebhook(deps.db, target)))
304
+ throw new HTTPException(404, { message: "Webhook not found" });
305
+ const limit = z.coerce.number().int().min(1).max(200).catch(50).parse(c.req.query("limit"));
306
+ const rows = await listOrganizationWebhookDeliveries(deps.db, { ...target, limit });
307
+ return c.json(
308
+ ListOrganizationWebhookDeliveriesResponse.parse({ deliveries: rows.map(deliveryProjection) }),
309
+ );
310
+ });
311
+ app.post(`${base}/webhooks/:webhookId/deliveries/:deliveryId/redeliver`, async (c) => {
312
+ const target = await scope(c);
313
+ const id = z.string().uuid().safeParse(c.req.param("deliveryId"));
314
+ if (!id.success) throw new HTTPException(404, { message: "Delivery not found" });
315
+ const row = await redeliverOrganizationWebhookDelivery(deps.db, {
316
+ ...target,
317
+ webhookId: webhookId(c),
318
+ deliveryId: id.data,
319
+ });
320
+ if (!row)
321
+ throw new HTTPException(409, {
322
+ message: "Only a delivered or failed delivery can be redelivered",
323
+ });
324
+ return c.json(deliveryProjection(row));
325
+ });
326
+ }
@@ -0,0 +1,183 @@
1
+ import { UpdateOrganizationMcpConnectionRequest, type AccessContext } from "@opengeni/contracts";
2
+ import {
3
+ getManagedUserProfilesByIds,
4
+ getWorkspace,
5
+ listOrganizationMcpConnections,
6
+ revokeOrganizationMcpConnection,
7
+ updateOrganizationMcpConnectionAccess,
8
+ type OrganizationMcpConnection,
9
+ } from "@opengeni/db";
10
+ import { hasPermission, requireAccessContext, type ApiRouteDeps } from "@opengeni/core";
11
+ import type { Context, Hono } from "hono";
12
+ import { HTTPException } from "hono/http-exception";
13
+ import { isAgentActingAsPerson, requireFullAccessIfAgent } from "../http/acting-person";
14
+ import { z } from "zod";
15
+
16
+ import { requireSameOriginBrowserMutation } from "./codex";
17
+
18
+ /* ----------------------------------------------------------------------------
19
+ Connected agents: outside MCP clients people signed in to the organization
20
+ server with. Everyone sees and manages their own; owners and admins see and
21
+ can disconnect everyone's. Only the person who connected an agent changes
22
+ what it can do. An agent with the person's full access can do this as them;
23
+ an agent with less can't use these routes, so it can never widen its own
24
+ access.
25
+ -------------------------------------------------------------------------- */
26
+
27
+ export function registerOrganizationMcpConnectionRoutes(app: Hono, deps: ApiRouteDeps): void {
28
+ app.get("/v1/organizations/:organizationId/mcp-connections", async (c) => {
29
+ const { context, organizationId, admin } = await requireOrganizationPerson(c, deps);
30
+ const connections = await listOrganizationMcpConnections(deps.db, {
31
+ accountId: organizationId,
32
+ ...(admin ? {} : { subjectId: context.subjectId }),
33
+ });
34
+ c.header("cache-control", "no-store");
35
+ return c.json({
36
+ connections: await projectConnections(deps, connections),
37
+ canManageAll: admin,
38
+ });
39
+ });
40
+
41
+ app.patch("/v1/organizations/:organizationId/mcp-connections/:connectionId", async (c) => {
42
+ requireSameOriginBrowserMutation(c, deps);
43
+ const { context, organizationId } = await requireOrganizationPerson(c, deps);
44
+ const connection = await requireConnection(deps, organizationId, c.req.param("connectionId"));
45
+ if (connection.subjectId !== context.subjectId) {
46
+ throw new HTTPException(403, {
47
+ message: "Only the person who connected this agent can change what it can do.",
48
+ });
49
+ }
50
+ const parsed = UpdateOrganizationMcpConnectionRequest.safeParse(
51
+ await c.req.json().catch(() => null),
52
+ );
53
+ if (!parsed.success) throw new HTTPException(400, { message: "invalid access setting" });
54
+ const access = parsed.data.access;
55
+ if (access.workspaceScope.kind === "selected") {
56
+ for (const workspaceId of access.workspaceScope.workspaceIds) {
57
+ const workspace = await getWorkspace(deps.db, workspaceId);
58
+ if (workspace?.accountId !== organizationId) {
59
+ throw new HTTPException(400, {
60
+ message: "a selected workspace is not in this organization",
61
+ });
62
+ }
63
+ }
64
+ }
65
+ await updateOrganizationMcpConnectionAccess(deps.db, {
66
+ accountId: organizationId,
67
+ connectionId: connection.id,
68
+ organizationAccess: access,
69
+ });
70
+ const [updated] = await projectConnections(
71
+ deps,
72
+ await listOrganizationMcpConnections(deps.db, {
73
+ accountId: organizationId,
74
+ connectionId: connection.id,
75
+ }),
76
+ );
77
+ if (!updated) throw new HTTPException(404, { message: "connected agent not found" });
78
+ return c.json(updated);
79
+ });
80
+
81
+ app.delete("/v1/organizations/:organizationId/mcp-connections/:connectionId", async (c) => {
82
+ requireSameOriginBrowserMutation(c, deps);
83
+ const { context, organizationId, admin } = await requireOrganizationPerson(c, deps);
84
+ const connection = await requireConnection(deps, organizationId, c.req.param("connectionId"));
85
+ if (connection.subjectId !== context.subjectId && !admin) {
86
+ throw new HTTPException(403, {
87
+ message: "Only the person who connected this agent, or an admin, can disconnect it.",
88
+ });
89
+ }
90
+ await revokeOrganizationMcpConnection(deps.db, {
91
+ accountId: organizationId,
92
+ connectionId: connection.id,
93
+ });
94
+ return c.body(null, 204);
95
+ });
96
+ }
97
+
98
+ /**
99
+ * A member of the organization, signed in in this browser, or an agent with
100
+ * their full access. Keys and limited agents are refused.
101
+ */
102
+ async function requireOrganizationPerson(
103
+ c: Context,
104
+ deps: ApiRouteDeps,
105
+ ): Promise<{ context: AccessContext; organizationId: string; admin: boolean }> {
106
+ const agent = isAgentActingAsPerson(c);
107
+ if (agent) requireFullAccessIfAgent(c, "Managing connected agents");
108
+ else if (
109
+ deps.settings.productAccessMode !== "managed" ||
110
+ !c.req.header("cookie") ||
111
+ c.req.header("authorization")
112
+ ) {
113
+ throw new HTTPException(403, {
114
+ message: "Manage connected agents in the Opengeni app in your browser.",
115
+ });
116
+ }
117
+ const context = await requireAccessContext(c, deps);
118
+ const organizationId = c.req.param("organizationId") ?? "";
119
+ const grant = context.accountGrants.find((each) => each.accountId === organizationId);
120
+ if (context.mode !== "managed" || !context.subjectId.startsWith("user:") || !grant) {
121
+ throw new HTTPException(404, { message: "organization not found" });
122
+ }
123
+ return { context, organizationId, admin: hasPermission(grant.permissions, "account:admin") };
124
+ }
125
+
126
+ async function requireConnection(
127
+ deps: ApiRouteDeps,
128
+ organizationId: string,
129
+ connectionId: string,
130
+ ): Promise<OrganizationMcpConnection> {
131
+ if (!z.string().uuid().safeParse(connectionId).success) {
132
+ throw new HTTPException(404, { message: "connected agent not found" });
133
+ }
134
+ const [connection] = await listOrganizationMcpConnections(deps.db, {
135
+ accountId: organizationId,
136
+ connectionId,
137
+ });
138
+ if (!connection) throw new HTTPException(404, { message: "connected agent not found" });
139
+ return connection;
140
+ }
141
+
142
+ async function projectConnections(deps: ApiRouteDeps, connections: OrganizationMcpConnection[]) {
143
+ const userIds = connections
144
+ .map((connection) => connection.subjectId)
145
+ .filter((subjectId) => subjectId.startsWith("user:"))
146
+ .map((subjectId) => subjectId.slice("user:".length));
147
+ const profiles = new Map(
148
+ (await getManagedUserProfilesByIds(deps.db, userIds)).map((profile) => [
149
+ `user:${profile.id}`,
150
+ profile,
151
+ ]),
152
+ );
153
+ return connections.map((connection) => {
154
+ const profile = profiles.get(connection.subjectId);
155
+ return {
156
+ id: connection.id,
157
+ clientName: connection.clientName ?? "MCP client",
158
+ clientHost: clientHost(connection.redirectUris),
159
+ actor: "user" as const,
160
+ connectedBy: {
161
+ subjectId: connection.subjectId,
162
+ name: profile?.name?.trim() || profile?.email || "Someone",
163
+ },
164
+ policy: connection.organizationAccess,
165
+ createdAt: connection.connectedAt.toISOString(),
166
+ lastUsedAt: connection.lastUsedAt?.toISOString() ?? null,
167
+ expiresAt: connection.expiresAt.toISOString(),
168
+ revokedAt: null,
169
+ };
170
+ });
171
+ }
172
+
173
+ function clientHost(redirectUris: string[]): string | null {
174
+ for (const value of redirectUris) {
175
+ try {
176
+ const url = new URL(value);
177
+ return url.host || url.protocol.replace(/:$/u, "");
178
+ } catch {
179
+ continue;
180
+ }
181
+ }
182
+ return null;
183
+ }