@opengeni/api-router 3.0.1 → 3.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. package/dist/access-grant-rls.d.ts +8 -1
  2. package/dist/admission-trace.d.ts +8 -0
  3. package/dist/app.d.ts +50 -3
  4. package/dist/app.js +10 -1
  5. package/dist/artifact-catalog-cursor.d.ts +1 -0
  6. package/dist/attached-browser-viewer.d.ts +11 -0
  7. package/dist/auth/managed-auth-attempt-context.d.ts +2 -0
  8. package/dist/auth/managed-auth-rate-limits.d.ts +167 -0
  9. package/dist/auth/managed-auth-session-adapter.d.ts +9 -1
  10. package/dist/auth/managed-auth.d.ts +72 -5
  11. package/dist/auth/managed-sign-in-notifications.d.ts +4 -0
  12. package/dist/auth/new-signups-gate.d.ts +23 -0
  13. package/dist/auth/signup-funnel-metrics.d.ts +44 -0
  14. package/dist/azure-live.d.ts +28 -0
  15. package/dist/browser-action-fences.d.ts +13 -0
  16. package/dist/browser-controller-authority.d.ts +1 -61
  17. package/dist/browser-ephemeral.d.ts +5 -0
  18. package/dist/browser-lost-runtime-end.d.ts +24 -0
  19. package/dist/browser-state-authority.d.ts +1 -27
  20. package/dist/chunk-OGQDXVXY.js +18 -0
  21. package/dist/chunk-OGQDXVXY.js.map +1 -0
  22. package/dist/{chunk-AJ62T5QN.js → chunk-OT56OY4V.js} +80503 -39869
  23. package/dist/chunk-OT56OY4V.js.map +1 -0
  24. package/dist/claude-default-models.d.ts +19 -0
  25. package/dist/claude-subscription-core.d.ts +50 -0
  26. package/dist/claude-subscription-oauth.d.ts +36 -0
  27. package/dist/claude-subscription-profile.d.ts +9 -0
  28. package/dist/claude-subscription-usage.d.ts +6 -0
  29. package/dist/claude-workspace-connection.d.ts +15 -0
  30. package/dist/codemode.d.ts +40 -5
  31. package/dist/codex-realtime.d.ts +29 -3
  32. package/dist/codex-session-pointers.d.ts +19 -0
  33. package/dist/connection-ownership.d.ts +6 -3
  34. package/dist/controller-data-plane.d.ts +16 -0
  35. package/dist/credit-promotion-snapshot.d.ts +6 -0
  36. package/dist/editable-artifact-source-session.d.ts +3 -0
  37. package/dist/editable-artifact-websocket.d.ts +5 -3
  38. package/dist/fatal-process-boundary.d.ts +9 -1
  39. package/dist/github-access.d.ts +7 -1
  40. package/dist/github-browser-flow.d.ts +1 -1
  41. package/dist/http/acting-person.d.ts +36 -0
  42. package/dist/http/api-contract-compat.d.ts +19 -0
  43. package/dist/http/api-error.d.ts +50 -1
  44. package/dist/http/auth.d.ts +8 -1
  45. package/dist/http/cors.d.ts +12 -0
  46. package/dist/http/deprecation.d.ts +42 -0
  47. package/dist/http/keyed-admission.d.ts +12 -0
  48. package/dist/http/local-browser-boundary.d.ts +72 -0
  49. package/dist/http/metrics-listener.d.ts +22 -0
  50. package/dist/http/path-identifier.d.ts +17 -0
  51. package/dist/http/registered-route-label.d.ts +16 -0
  52. package/dist/http/rejection-telemetry.d.ts +34 -0
  53. package/dist/http/request-body.d.ts +27 -0
  54. package/dist/http/request-source.d.ts +41 -3
  55. package/dist/http/sse.d.ts +12 -1
  56. package/dist/http/unmatched-route.d.ts +18 -0
  57. package/dist/http/user-content.d.ts +36 -0
  58. package/dist/http/variable-sets-removed.d.ts +41 -0
  59. package/dist/http/websocket-upgrade-dispatch.d.ts +18 -0
  60. package/dist/index.js +1279 -108
  61. package/dist/index.js.map +1 -1
  62. package/dist/integration-connect-metrics.d.ts +35 -0
  63. package/dist/integration-endpoint-test.d.ts +20 -0
  64. package/dist/integrations/api-integrations.d.ts +2 -2
  65. package/dist/integrations/atlassian.d.ts +8 -3
  66. package/dist/integrations/fiken.d.ts +3 -1
  67. package/dist/integrations/github-lens-connect.d.ts +37 -66
  68. package/dist/integrations/google-drive.d.ts +2 -0
  69. package/dist/integrations/integration-commit-authority.d.ts +13 -0
  70. package/dist/integrations/marketplace-plugin.d.ts +43 -43
  71. package/dist/integrations/oauth-client.d.ts +171 -12
  72. package/dist/integrations/oauth-profiles.d.ts +42 -13
  73. package/dist/integrations/onepassword-vault-provider.d.ts +9 -0
  74. package/dist/integrations/slack-bot.d.ts +285 -7
  75. package/dist/integrations/slack-file-upload-flow.d.ts +62 -0
  76. package/dist/integrations/slack-interactions.d.ts +89 -10
  77. package/dist/integrations/slack-mrkdwn.d.ts +41 -0
  78. package/dist/integrations/slack-routing.d.ts +1 -1
  79. package/dist/integrations/slack-session-defaults.d.ts +58 -0
  80. package/dist/integrations/slack-task-file-upload.d.ts +36 -0
  81. package/dist/integrations/slack-tool-review.d.ts +5 -0
  82. package/dist/interaction-agent-access.d.ts +13 -8
  83. package/dist/interaction-agent-version.d.ts +21 -0
  84. package/dist/interaction-holder-heartbeat.d.ts +5 -0
  85. package/dist/interaction-metrics.d.ts +27 -2
  86. package/dist/interaction-route-stages.d.ts +25 -0
  87. package/dist/interaction-secrets-vault.d.ts +20 -0
  88. package/dist/interaction-secrets.d.ts +103 -0
  89. package/dist/mcp/action-catalog-types.d.ts +14 -0
  90. package/dist/mcp/action-catalog.gen.d.ts +2 -0
  91. package/dist/mcp/action-descriptions.d.ts +4 -0
  92. package/dist/mcp/action-schema-imports.gen.d.ts +1 -0
  93. package/dist/mcp/capability-account-readiness.d.ts +7 -0
  94. package/dist/mcp/child-read-evidence.d.ts +9 -0
  95. package/dist/mcp/company-profile-agent-admin.d.ts +12 -0
  96. package/dist/mcp/contract-input.d.ts +13 -0
  97. package/dist/mcp/documents.d.ts +2 -0
  98. package/dist/mcp/first-party-tool-permissions.d.ts +3 -606
  99. package/dist/mcp/notification-tools.d.ts +26 -0
  100. package/dist/mcp/orchestration-failure-diagnostic.d.ts +43 -0
  101. package/dist/mcp/scheduled-task-input.d.ts +1309 -0
  102. package/dist/mcp/scheduled-task-view.d.ts +217 -3
  103. package/dist/mcp/secret-tools.d.ts +14 -0
  104. package/dist/mcp/server.d.ts +108 -5
  105. package/dist/mcp/session-admin-access-tools.d.ts +33 -0
  106. package/dist/mcp/session-event-errors.d.ts +28 -0
  107. package/dist/mcp/session-event-view.d.ts +62 -0
  108. package/dist/mcp/session-view.d.ts +15 -0
  109. package/dist/mcp/session-wait.d.ts +18 -0
  110. package/dist/mcp/site-agent-clamp-tools.d.ts +38 -0
  111. package/dist/mcp/site-data-tools.d.ts +22 -0
  112. package/dist/mcp/site-publication-tools.d.ts +19 -0
  113. package/dist/mcp/site-sql-tools.d.ts +27 -0
  114. package/dist/mcp-oauth.d.ts +37 -4
  115. package/dist/model-calls/chat-completions.d.ts +87 -0
  116. package/dist/model-calls/pending-usage-settlements.d.ts +57 -0
  117. package/dist/model-calls/service.d.ts +36 -0
  118. package/dist/model-catalog.d.ts +9 -3
  119. package/dist/native-push-dispatch.d.ts +69 -0
  120. package/dist/observability.d.ts +3 -1
  121. package/dist/organization-mcp.d.ts +82 -0
  122. package/dist/prepared-mcp-actor.d.ts +77 -0
  123. package/dist/prepared-mcp-permissions.d.ts +8 -0
  124. package/dist/routes/analytics-consent.d.ts +26 -0
  125. package/dist/routes/api-integrations.d.ts +11 -0
  126. package/dist/routes/api-keys.d.ts +7 -7
  127. package/dist/routes/automations.d.ts +2 -0
  128. package/dist/routes/billing.d.ts +59 -0
  129. package/dist/routes/browser-sessions.d.ts +65 -2
  130. package/dist/routes/chat-completions.d.ts +11 -0
  131. package/dist/routes/claude-core-usage.d.ts +20 -0
  132. package/dist/routes/claude-subscription-accounts.d.ts +3 -0
  133. package/dist/routes/claude-subscription-oauth.d.ts +3 -0
  134. package/dist/routes/client-errors.d.ts +182 -0
  135. package/dist/routes/codex-core.d.ts +401 -0
  136. package/dist/routes/codex.d.ts +64 -2
  137. package/dist/routes/computer-sessions.d.ts +6 -1
  138. package/dist/routes/desktop-distribution.d.ts +32 -0
  139. package/dist/routes/github-browser-fonts.gen.d.ts +2 -0
  140. package/dist/routes/github-browser-pages.d.ts +27 -0
  141. package/dist/routes/inbox.d.ts +13 -0
  142. package/dist/routes/insights-response-cache.d.ts +10 -0
  143. package/dist/routes/insights-usage.d.ts +12 -0
  144. package/dist/routes/insights.d.ts +28 -0
  145. package/dist/routes/interaction-placement-message.d.ts +7 -0
  146. package/dist/routes/managed-sign-in-methods.d.ts +6 -0
  147. package/dist/routes/model-account-choice.d.ts +13 -0
  148. package/dist/routes/model-account-settings.d.ts +19 -0
  149. package/dist/routes/native-app-auth.d.ts +12 -0
  150. package/dist/routes/organization-integration-policy.d.ts +8 -0
  151. package/dist/routes/organization-integrations.d.ts +6 -0
  152. package/dist/routes/organization-mcp-connections.d.ts +3 -0
  153. package/dist/routes/organization-model-defaults.d.ts +9 -0
  154. package/dist/routes/organization-service-accounts.d.ts +3 -0
  155. package/dist/routes/personal-api-keys.d.ts +3 -0
  156. package/dist/routes/session-admin-access.d.ts +3 -0
  157. package/dist/routes/session-artifact-associations.d.ts +4 -0
  158. package/dist/routes/session-history-imports.d.ts +20 -0
  159. package/dist/routes/sessions.d.ts +38 -2
  160. package/dist/routes/site-data.d.ts +18 -0
  161. package/dist/routes/site-publishing.d.ts +5 -0
  162. package/dist/routes/site-runtime.d.ts +31 -0
  163. package/dist/routes/site-sql.d.ts +16 -0
  164. package/dist/routes/slack-bot-access.d.ts +3 -0
  165. package/dist/routes/subscription-account-pools.d.ts +21 -0
  166. package/dist/routes/subscription-core-http.d.ts +5 -0
  167. package/dist/routes/subscription-pool-access.d.ts +37 -0
  168. package/dist/routes/subscription-pool-core.d.ts +153 -0
  169. package/dist/routes/supergrok.d.ts +6 -6
  170. package/dist/routes/usage-allowances.d.ts +12 -0
  171. package/dist/routes/variable-sets-removed.d.ts +2 -0
  172. package/dist/routes/vault-providers.d.ts +34 -0
  173. package/dist/routes/vaults.d.ts +3 -0
  174. package/dist/routes/workspace-integrations.d.ts +35 -0
  175. package/dist/routes/workspace-model-providers.d.ts +4 -0
  176. package/dist/routes/workspaces.d.ts +11 -2
  177. package/dist/sandbox/agent-update.d.ts +64 -0
  178. package/dist/sandbox/auth-callout.d.ts +8 -0
  179. package/dist/sandbox/channel-a.d.ts +15 -1
  180. package/dist/sandbox/enrollment.d.ts +26 -4
  181. package/dist/sandbox/machine-audience.d.ts +29 -0
  182. package/dist/sandbox/machines.d.ts +15 -2
  183. package/dist/sandbox/metrics-ingestion.d.ts +6 -2
  184. package/dist/sandbox/screen-control.d.ts +85 -0
  185. package/dist/sandbox/viewer.d.ts +5 -1
  186. package/dist/sandbox-file-artifacts.d.ts +17 -1
  187. package/dist/scheduled-task-blockers.d.ts +39 -0
  188. package/dist/scheduled-task-deletion.d.ts +3 -4
  189. package/dist/scheduled-task-lifecycle.d.ts +14 -0
  190. package/dist/secret-answers.d.ts +40 -0
  191. package/dist/session-create-observability.d.ts +5 -0
  192. package/dist/session-event-view-36GO3IL7.js +528 -0
  193. package/dist/session-event-view-36GO3IL7.js.map +1 -0
  194. package/dist/signed-state-secret.d.ts +18 -0
  195. package/dist/site-agent-guard.d.ts +53 -0
  196. package/dist/site-data/operations.d.ts +103 -0
  197. package/dist/site-data/service.d.ts +203 -0
  198. package/dist/site-frame-guard.d.ts +32 -0
  199. package/dist/site-publishing/agent-data-tools.d.ts +84 -0
  200. package/dist/site-publishing/agent-model.d.ts +58 -0
  201. package/dist/site-publishing/agent-session.d.ts +16 -0
  202. package/dist/site-publishing/content-scanner.d.ts +31 -0
  203. package/dist/site-publishing/edge-sync.d.ts +48 -0
  204. package/dist/site-publishing/gateway-signature.d.ts +56 -0
  205. package/dist/site-publishing/limits.d.ts +63 -0
  206. package/dist/site-publishing/page-tool-authority.d.ts +30 -0
  207. package/dist/site-publishing/platform-usage.d.ts +113 -0
  208. package/dist/site-publishing/platform.d.ts +21 -0
  209. package/dist/site-publishing/readiness.d.ts +62 -0
  210. package/dist/site-publishing/runtime.d.ts +179 -0
  211. package/dist/site-publishing/service.d.ts +264 -0
  212. package/dist/site-publishing/session-events.d.ts +22 -0
  213. package/dist/site-publishing/session-views.d.ts +36 -0
  214. package/dist/site-publishing/viewer.d.ts +40 -0
  215. package/dist/site-session-origin.d.ts +31 -6
  216. package/dist/site-sql/format.d.ts +47 -0
  217. package/dist/site-sql/gateway.d.ts +50 -0
  218. package/dist/site-sql/service.d.ts +213 -0
  219. package/dist/temporal-schedule-sync.d.ts +26 -0
  220. package/dist/transcription/billing-refusal.d.ts +8 -0
  221. package/dist/transcription/normalize.d.ts +23 -0
  222. package/dist/transcription/providers/azure-mai.d.ts +12 -0
  223. package/dist/transcription/providers/azure-openai.d.ts +4 -0
  224. package/dist/transcription/providers/openai.d.ts +16 -0
  225. package/dist/transcription/providers/subscription-core.d.ts +39 -0
  226. package/dist/transcription/service.d.ts +10 -1
  227. package/dist/transcription/wav-duration.d.ts +8 -0
  228. package/dist/workspace-tool-gateway-attestations.d.ts +37 -0
  229. package/dist/workspace-tool-gateway-observability.d.ts +16 -0
  230. package/dist/workspace-tool-gateway-secrets.d.ts +27 -0
  231. package/dist/workspace-tool-gateway.d.ts +102 -6
  232. package/dist/workspace-tool-target-fence.d.ts +116 -0
  233. package/dist/workspace-tool-target.d.ts +225 -0
  234. package/dist/workspace-webhook-dispatch.d.ts +26 -0
  235. package/dist/xai-subscription-core.d.ts +60 -0
  236. package/package.json +25 -20
  237. package/src/access-grant-rls.ts +64 -14
  238. package/src/admission-trace.ts +14 -0
  239. package/src/app.ts +1684 -252
  240. package/src/artifact-catalog-cursor.ts +1 -0
  241. package/src/attached-browser-viewer.ts +26 -0
  242. package/src/auth/managed-auth-attempt-context.ts +9 -0
  243. package/src/auth/managed-auth-rate-limits.ts +252 -0
  244. package/src/auth/managed-auth-session-adapter.ts +64 -29
  245. package/src/auth/managed-auth.ts +303 -35
  246. package/src/auth/managed-email.ts +18 -1
  247. package/src/auth/managed-sign-in-notifications.ts +81 -0
  248. package/src/auth/new-signups-gate.ts +49 -0
  249. package/src/auth/organization-user-setup.ts +3 -3
  250. package/src/auth/signup-funnel-metrics.ts +164 -0
  251. package/src/azure-live.ts +103 -0
  252. package/src/browser-action-fences.ts +45 -0
  253. package/src/browser-controller-authority.ts +1 -186
  254. package/src/browser-ephemeral.ts +39 -0
  255. package/src/browser-lost-runtime-end.ts +71 -0
  256. package/src/browser-state-authority.ts +1 -236
  257. package/src/claude-default-models.ts +37 -0
  258. package/src/claude-subscription-core.ts +154 -0
  259. package/src/claude-subscription-oauth.ts +352 -0
  260. package/src/claude-subscription-profile.ts +73 -0
  261. package/src/claude-subscription-usage.ts +51 -0
  262. package/src/claude-workspace-connection.ts +82 -0
  263. package/src/codemode.ts +236 -39
  264. package/src/codex-realtime.ts +181 -53
  265. package/src/codex-session-pointers.ts +80 -0
  266. package/src/company-brain-okf.ts +1 -1
  267. package/src/connected-machine-computer-access.ts +2 -1
  268. package/src/connection-ownership.ts +19 -13
  269. package/src/controller-data-plane.ts +34 -0
  270. package/src/credit-promotion-snapshot.ts +36 -0
  271. package/src/editable-artifact-production.ts +10 -0
  272. package/src/editable-artifact-source-session.ts +123 -0
  273. package/src/editable-artifact-websocket.ts +16 -3
  274. package/src/fatal-process-boundary.ts +67 -3
  275. package/src/gateway-realtime.ts +12 -8
  276. package/src/github-access.ts +31 -5
  277. package/src/github-browser-flow.ts +1 -1
  278. package/src/http/acting-person.ts +105 -0
  279. package/src/http/api-contract-compat.ts +49 -0
  280. package/src/http/api-error.ts +210 -2
  281. package/src/http/auth.ts +68 -4
  282. package/src/http/cors.ts +37 -5
  283. package/src/http/deprecation.ts +118 -0
  284. package/src/http/keyed-admission.ts +29 -0
  285. package/src/http/local-browser-boundary.ts +343 -0
  286. package/src/http/metrics-listener.ts +57 -0
  287. package/src/http/path-identifier.ts +54 -0
  288. package/src/http/registered-route-label.ts +34 -0
  289. package/src/http/rejection-telemetry.ts +120 -0
  290. package/src/http/request-body.ts +127 -0
  291. package/src/http/request-source.ts +154 -13
  292. package/src/http/sse.ts +88 -28
  293. package/src/http/unmatched-route.ts +60 -0
  294. package/src/http/user-content.ts +158 -0
  295. package/src/http/variable-sets-removed.ts +122 -0
  296. package/src/http/websocket-upgrade-dispatch.ts +29 -0
  297. package/src/index.ts +107 -57
  298. package/src/integration-connect-metrics.ts +228 -0
  299. package/src/integration-endpoint-test.ts +291 -0
  300. package/src/integrations/api-integrations.ts +81 -7
  301. package/src/integrations/atlassian.ts +202 -83
  302. package/src/integrations/fiken.ts +66 -38
  303. package/src/integrations/github-app-connect.ts +64 -18
  304. package/src/integrations/github-lens-connect.ts +8 -29
  305. package/src/integrations/google-drive.ts +448 -152
  306. package/src/integrations/integration-commit-authority.ts +69 -0
  307. package/src/integrations/marketplace-plugin.ts +1 -1
  308. package/src/integrations/oauth-client.ts +733 -193
  309. package/src/integrations/oauth-profiles.ts +116 -45
  310. package/src/integrations/onepassword-vault-provider.ts +16 -0
  311. package/src/integrations/personal-github-repositories.ts +1 -1
  312. package/src/integrations/personal-github.ts +61 -35
  313. package/src/integrations/provider-oauth.ts +67 -85
  314. package/src/integrations/slack-app-home.ts +5 -5
  315. package/src/integrations/slack-bot.ts +893 -201
  316. package/src/integrations/slack-file-upload-flow.ts +147 -0
  317. package/src/integrations/slack-install.ts +7 -7
  318. package/src/integrations/slack-interactions.ts +1589 -299
  319. package/src/integrations/slack-mrkdwn.ts +193 -0
  320. package/src/integrations/slack-routing.ts +2 -2
  321. package/src/integrations/slack-session-defaults.ts +224 -0
  322. package/src/integrations/slack-task-file-upload.ts +323 -0
  323. package/src/integrations/slack-tool-review.ts +65 -0
  324. package/src/integrations/social-oauth.ts +90 -58
  325. package/src/interaction-agent-access.ts +40 -20
  326. package/src/interaction-agent-version.ts +85 -0
  327. package/src/interaction-holder-heartbeat.ts +24 -8
  328. package/src/interaction-metrics.ts +164 -2
  329. package/src/interaction-route-stages.ts +94 -0
  330. package/src/interaction-secrets-vault.ts +213 -0
  331. package/src/interaction-secrets.ts +426 -0
  332. package/src/mcp/action-catalog-types.ts +14 -0
  333. package/src/mcp/action-catalog.gen.ts +8014 -0
  334. package/src/mcp/action-descriptions.ts +299 -0
  335. package/src/mcp/action-schema-imports.gen.ts +304 -0
  336. package/src/mcp/capability-account-readiness.ts +17 -0
  337. package/src/mcp/child-read-evidence.ts +19 -0
  338. package/src/mcp/company-profile-agent-admin.ts +13 -0
  339. package/src/mcp/contract-input.ts +165 -0
  340. package/src/mcp/documents.ts +9 -2
  341. package/src/mcp/editable-artifacts.ts +29 -11
  342. package/src/mcp/files.ts +5 -1
  343. package/src/mcp/first-party-tool-permissions.ts +7 -285
  344. package/src/mcp/knowledge-entries.ts +108 -34
  345. package/src/mcp/notification-tools.ts +480 -0
  346. package/src/mcp/orchestration-failure-diagnostic.ts +43 -0
  347. package/src/mcp/scheduled-task-input.ts +89 -0
  348. package/src/mcp/scheduled-task-view.ts +63 -3
  349. package/src/mcp/secret-tools.ts +185 -0
  350. package/src/mcp/server.ts +2213 -1116
  351. package/src/mcp/session-admin-access-tools.ts +163 -0
  352. package/src/mcp/session-event-errors.ts +123 -0
  353. package/src/mcp/session-event-view.ts +395 -13
  354. package/src/mcp/session-view.ts +3 -0
  355. package/src/mcp/session-wait.ts +67 -7
  356. package/src/mcp/site-agent-clamp-tools.ts +140 -0
  357. package/src/mcp/site-data-tools.ts +339 -0
  358. package/src/mcp/site-publication-tools.ts +201 -0
  359. package/src/mcp/site-sql-tools.ts +427 -0
  360. package/src/mcp-oauth.ts +635 -45
  361. package/src/model-calls/chat-completions.ts +352 -0
  362. package/src/model-calls/pending-usage-settlements.ts +125 -0
  363. package/src/model-calls/service.ts +694 -0
  364. package/src/model-catalog.ts +68 -17
  365. package/src/native-push-dispatch.ts +457 -0
  366. package/src/observability.ts +15 -1
  367. package/src/organization-mcp.ts +485 -0
  368. package/src/prepared-mcp-actor.ts +154 -0
  369. package/src/prepared-mcp-permissions.ts +38 -0
  370. package/src/routes/analytics-consent.ts +123 -0
  371. package/src/routes/api-integrations.ts +268 -9
  372. package/src/routes/api-keys.ts +164 -25
  373. package/src/routes/artifact-catalog.ts +111 -0
  374. package/src/routes/automations.ts +163 -90
  375. package/src/routes/billing.ts +535 -59
  376. package/src/routes/browser-sessions.ts +966 -342
  377. package/src/routes/canonical-human-identities.ts +61 -0
  378. package/src/routes/capabilities.ts +112 -5
  379. package/src/routes/channels.ts +4 -3
  380. package/src/routes/chat-completions.ts +235 -0
  381. package/src/routes/claude-core-usage.ts +147 -0
  382. package/src/routes/claude-subscription-accounts.ts +233 -0
  383. package/src/routes/claude-subscription-oauth.ts +175 -0
  384. package/src/routes/client-errors.ts +394 -0
  385. package/src/routes/codex-core.ts +687 -0
  386. package/src/routes/codex.ts +1277 -1119
  387. package/src/routes/company-brain.ts +4 -0
  388. package/src/routes/computer-sessions.ts +319 -85
  389. package/src/routes/connect.ts +277 -175
  390. package/src/routes/connections.ts +690 -363
  391. package/src/routes/desktop-distribution.ts +217 -0
  392. package/src/routes/documents.ts +13 -7
  393. package/src/routes/editable-artifacts.ts +74 -4
  394. package/src/routes/enrollments.ts +110 -16
  395. package/src/routes/external-identity-links.ts +13 -12
  396. package/src/routes/files.ts +41 -16
  397. package/src/routes/github-browser-fonts.gen.ts +12 -0
  398. package/src/routes/github-browser-pages.ts +258 -0
  399. package/src/routes/github.ts +200 -75
  400. package/src/routes/inbox.ts +353 -0
  401. package/src/routes/insights-response-cache.ts +83 -0
  402. package/src/routes/insights-usage.ts +345 -0
  403. package/src/routes/insights.ts +103 -8
  404. package/src/routes/install.ts +51 -10
  405. package/src/routes/integration-facets.ts +70 -28
  406. package/src/routes/interaction-placement-message.ts +12 -0
  407. package/src/routes/knowledge.ts +136 -27
  408. package/src/routes/machines.ts +189 -135
  409. package/src/routes/managed-auth-session-sets.ts +43 -10
  410. package/src/routes/managed-onboarding.ts +39 -19
  411. package/src/routes/managed-sign-in-methods.ts +433 -0
  412. package/src/routes/memory-slack-publications.ts +3 -2
  413. package/src/routes/model-account-choice.ts +194 -0
  414. package/src/routes/model-account-settings.ts +235 -0
  415. package/src/routes/model-connection-access.ts +210 -48
  416. package/src/routes/native-app-auth.ts +296 -0
  417. package/src/routes/organization-integration-policy.ts +116 -0
  418. package/src/routes/organization-integrations.ts +326 -0
  419. package/src/routes/organization-mcp-connections.ts +183 -0
  420. package/src/routes/organization-memberships.ts +205 -19
  421. package/src/routes/organization-model-defaults.ts +110 -0
  422. package/src/routes/organization-model-providers.ts +74 -3
  423. package/src/routes/organization-service-accounts.ts +128 -0
  424. package/src/routes/organization-sessions.ts +21 -5
  425. package/src/routes/personal-api-keys.ts +184 -0
  426. package/src/routes/personal-github-git-broker.ts +2 -2
  427. package/src/routes/personal-github.ts +9 -4
  428. package/src/routes/plugins.ts +46 -7
  429. package/src/routes/pr-review-github.ts +105 -118
  430. package/src/routes/pr-review.ts +88 -82
  431. package/src/routes/preference-registry.ts +18 -0
  432. package/src/routes/rigs.ts +48 -13
  433. package/src/routes/scheduled-tasks.ts +347 -27
  434. package/src/routes/session-admin-access.ts +271 -0
  435. package/src/routes/session-artifact-associations.ts +164 -0
  436. package/src/routes/session-history-imports.ts +305 -0
  437. package/src/routes/sessions.ts +1682 -363
  438. package/src/routes/site-data.ts +340 -0
  439. package/src/routes/site-publishing.ts +584 -0
  440. package/src/routes/site-runtime.ts +1944 -0
  441. package/src/routes/site-sql.ts +263 -0
  442. package/src/routes/skill-content.ts +72 -7
  443. package/src/routes/skills.ts +5 -4
  444. package/src/routes/slack-bot-access.ts +108 -0
  445. package/src/routes/social.ts +27 -15
  446. package/src/routes/subscription-account-pools.ts +209 -0
  447. package/src/routes/subscription-core-http.ts +18 -0
  448. package/src/routes/subscription-pool-access.ts +180 -0
  449. package/src/routes/subscription-pool-core.ts +552 -0
  450. package/src/routes/supergrok.ts +174 -655
  451. package/src/routes/transcription-recordings.ts +71 -4
  452. package/src/routes/transcriptions.ts +26 -2
  453. package/src/routes/usage-allowances.ts +381 -0
  454. package/src/routes/variable-sets-removed.ts +19 -0
  455. package/src/routes/vault-providers.ts +782 -0
  456. package/src/routes/vaults.ts +421 -0
  457. package/src/routes/video-generation.ts +30 -12
  458. package/src/routes/workspace-artifacts.ts +165 -53
  459. package/src/routes/workspace-integrations.ts +576 -0
  460. package/src/routes/workspace-model-providers.ts +148 -0
  461. package/src/routes/workspace-state.ts +4 -0
  462. package/src/routes/workspaces.ts +625 -117
  463. package/src/sandbox/agent-update.ts +315 -0
  464. package/src/sandbox/auth-callout.ts +104 -21
  465. package/src/sandbox/channel-a.ts +165 -55
  466. package/src/sandbox/enrollment.ts +131 -22
  467. package/src/sandbox/machine-audience.ts +192 -0
  468. package/src/sandbox/machines.ts +75 -31
  469. package/src/sandbox/metrics-ingestion.ts +133 -2
  470. package/src/sandbox/rematerialize.ts +51 -21
  471. package/src/sandbox/screen-control.ts +289 -0
  472. package/src/sandbox/viewer.ts +33 -58
  473. package/src/sandbox-file-artifacts.ts +53 -27
  474. package/src/scheduled-task-blockers.ts +293 -0
  475. package/src/scheduled-task-deletion.ts +13 -3
  476. package/src/scheduled-task-lifecycle.ts +84 -0
  477. package/src/secret-answers.ts +119 -0
  478. package/src/session-create-observability.ts +46 -0
  479. package/src/session-realtime-context.ts +26 -4
  480. package/src/signed-state-secret.ts +58 -0
  481. package/src/site-agent-guard.ts +261 -0
  482. package/src/site-data/operations.ts +777 -0
  483. package/src/site-data/service.ts +1043 -0
  484. package/src/site-frame-guard.ts +107 -0
  485. package/src/site-publishing/agent-data-tools.ts +250 -0
  486. package/src/site-publishing/agent-model.ts +127 -0
  487. package/src/site-publishing/agent-session.ts +148 -0
  488. package/src/site-publishing/content-scanner.ts +93 -0
  489. package/src/site-publishing/edge-sync.ts +148 -0
  490. package/src/site-publishing/gateway-signature.ts +198 -0
  491. package/src/site-publishing/limits.ts +315 -0
  492. package/src/site-publishing/page-tool-authority.ts +111 -0
  493. package/src/site-publishing/platform-usage.ts +479 -0
  494. package/src/site-publishing/platform.ts +98 -0
  495. package/src/site-publishing/readiness.ts +330 -0
  496. package/src/site-publishing/runtime.ts +831 -0
  497. package/src/site-publishing/service.ts +1282 -0
  498. package/src/site-publishing/session-events.ts +262 -0
  499. package/src/site-publishing/session-views.ts +262 -0
  500. package/src/site-publishing/viewer.ts +75 -0
  501. package/src/site-session-origin.ts +91 -6
  502. package/src/site-sql/format.ts +134 -0
  503. package/src/site-sql/gateway.ts +168 -0
  504. package/src/site-sql/service.ts +1636 -0
  505. package/src/site-uploads.ts +27 -5
  506. package/src/temporal-schedule-sync.ts +74 -0
  507. package/src/transcription/billing-refusal.ts +14 -0
  508. package/src/transcription/normalize.ts +77 -0
  509. package/src/transcription/providers/azure-mai.ts +98 -0
  510. package/src/transcription/providers/azure-openai.ts +16 -7
  511. package/src/transcription/providers/codex-subscription.ts +190 -67
  512. package/src/transcription/providers/openai.ts +79 -5
  513. package/src/transcription/providers/subscription-core.ts +125 -0
  514. package/src/transcription/providers/xai-subscription.ts +81 -83
  515. package/src/transcription/segmenter.ts +7 -1
  516. package/src/transcription/service.ts +239 -10
  517. package/src/transcription/wav-duration.ts +39 -0
  518. package/src/workspace-deletion.ts +25 -1
  519. package/src/workspace-tool-gateway-attestations.ts +133 -0
  520. package/src/workspace-tool-gateway-observability.ts +64 -0
  521. package/src/workspace-tool-gateway-secrets.ts +104 -0
  522. package/src/workspace-tool-gateway.ts +921 -103
  523. package/src/workspace-tool-target-fence.ts +380 -0
  524. package/src/workspace-tool-target.ts +554 -0
  525. package/src/workspace-webhook-dispatch.ts +225 -0
  526. package/src/xai-realtime.ts +85 -81
  527. package/src/xai-subscription-core.ts +172 -0
  528. package/dist/browser-auth-broker.d.ts +0 -20
  529. package/dist/chunk-AJ62T5QN.js.map +0 -1
  530. package/dist/connection-authority-owner.d.ts +0 -59
  531. package/dist/routes/connection-authorities.d.ts +0 -3
  532. package/dist/routes/environments.d.ts +0 -5
  533. package/dist/routes/host-mcp-bindings.d.ts +0 -5
  534. package/dist/routes/host-mcp-resolvers.d.ts +0 -3
  535. package/dist/routes/packs.d.ts +0 -3
  536. package/dist/session-event-view-MU3HMNV3.js +0 -264
  537. package/dist/session-event-view-MU3HMNV3.js.map +0 -1
  538. package/dist/xai-subscription-auth.d.ts +0 -23
  539. package/src/browser-auth-broker.ts +0 -155
  540. package/src/connection-authority-owner.ts +0 -61
  541. package/src/routes/connection-authorities.ts +0 -139
  542. package/src/routes/environments.ts +0 -388
  543. package/src/routes/host-mcp-bindings.ts +0 -122
  544. package/src/routes/host-mcp-resolvers.ts +0 -41
  545. package/src/routes/packs.ts +0 -784
  546. package/src/xai-subscription-auth.ts +0 -139
@@ -0,0 +1,576 @@
1
+ import { randomBytes, randomUUID } from "node:crypto";
2
+ import { environmentsEncryptionKeyBytes, sandboxImageAllowlist } from "@opengeni/config";
3
+ import {
4
+ CreateWorkspaceWebhookRequest,
5
+ CreateWorkspaceWebhookResponse,
6
+ GetWorkspaceCredentialProviderResponse,
7
+ ListWorkspaceWebhookDeliveriesResponse,
8
+ OPENGENI_EVENT_ID_HEADER,
9
+ OPENGENI_TEST_REQUEST_NIL_ID,
10
+ OPENGENI_WEBHOOK_TEST_EVENT_TYPE,
11
+ TestWorkspaceCredentialProviderResponse,
12
+ TestWorkspaceWebhookResponse,
13
+ WorkspaceInheritedIntegrationsResponse,
14
+ type CredentialProviderRequest,
15
+ ListWorkspaceWebhooksResponse,
16
+ PutWorkspaceCredentialProviderRequest,
17
+ PutWorkspaceCredentialProviderResponse,
18
+ RotateWorkspaceCredentialProviderSecretResponse,
19
+ RotateWorkspaceWebhookSecretResponse,
20
+ resolveWorkspaceDefaultSandboxImage,
21
+ UpdateWorkspaceWebhookRequest,
22
+ WorkspaceCredentialProvider,
23
+ WorkspaceWebhook,
24
+ WorkspaceWebhookDelivery,
25
+ type AccessGrant,
26
+ } from "@opengeni/contracts";
27
+ import {
28
+ requireAccessGrant,
29
+ requireWorkspaceSettingsGrant,
30
+ type ApiRouteDeps,
31
+ } from "@opengeni/core";
32
+ import {
33
+ createWorkspaceWebhook,
34
+ decryptEnvironmentValue,
35
+ deleteWorkspaceCredentialProvider,
36
+ deleteWorkspaceWebhook,
37
+ encryptEnvironmentValue,
38
+ getWorkspace,
39
+ getOrganizationCredentialProvider,
40
+ getWorkspaceCredentialProvider,
41
+ getWorkspaceWebhook,
42
+ integrationWorkspaceFilterMatches,
43
+ listOrganizationWebhooks,
44
+ listWorkspaceWebhookDeliveries,
45
+ listWorkspaceWebhooks,
46
+ redeliverWorkspaceWebhookDelivery,
47
+ resolveInitiatingHuman,
48
+ resolveWorkspaceCredentialProvider,
49
+ rotateWorkspaceCredentialProviderSecret,
50
+ rotateWorkspaceWebhookSecret,
51
+ updateWorkspaceWebhook,
52
+ upsertWorkspaceCredentialProvider,
53
+ withCredentialProviderConfigurationLock,
54
+ WorkspaceWebhookLimitError,
55
+ type WorkspaceCredentialProviderRow,
56
+ type WorkspaceWebhookDeliveryRow,
57
+ type WorkspaceWebhookRow,
58
+ } from "@opengeni/db";
59
+ import { isLocalTestEnvironment, type pinnedFetch } from "@opengeni/network";
60
+ import { sendIntegrationEndpointTest } from "../integration-endpoint-test";
61
+ import type { Context, Hono } from "hono";
62
+ import { HTTPException } from "hono/http-exception";
63
+ import { z } from "zod";
64
+
65
+ export function newIntegrationSecret(prefix: string): string {
66
+ return `${prefix}_${randomBytes(32).toString("base64url")}`;
67
+ }
68
+
69
+ function iso(value: Date | null): string | null {
70
+ return value ? value.toISOString() : null;
71
+ }
72
+
73
+ export function integrationWebhookFields(row: Omit<WorkspaceWebhookRow, "workspaceId">) {
74
+ return {
75
+ id: row.id,
76
+ url: row.url,
77
+ eventTypes: row.eventTypes,
78
+ enabled: row.enabled,
79
+ description: row.description,
80
+ createdAt: row.createdAt.toISOString(),
81
+ updatedAt: row.updatedAt.toISOString(),
82
+ };
83
+ }
84
+
85
+ function webhookProjection(row: WorkspaceWebhookRow): WorkspaceWebhook {
86
+ return WorkspaceWebhook.parse({ ...integrationWebhookFields(row), workspaceId: row.workspaceId });
87
+ }
88
+
89
+ export function integrationDeliveryProjection(
90
+ row: WorkspaceWebhookDeliveryRow,
91
+ ): WorkspaceWebhookDelivery {
92
+ return WorkspaceWebhookDelivery.parse({
93
+ id: row.id,
94
+ webhookId: row.webhookId,
95
+ eventId: row.eventId,
96
+ eventType: row.eventType,
97
+ status: row.deliveredAt ? "delivered" : row.failedAt ? "failed" : "pending",
98
+ attempts: row.attempts,
99
+ lastStatus: row.lastStatus,
100
+ lastError: row.lastError,
101
+ nextAttemptAt: row.deliveredAt || row.failedAt ? null : iso(row.nextAttemptAt),
102
+ deliveredAt: iso(row.deliveredAt),
103
+ failedAt: iso(row.failedAt),
104
+ createdAt: row.createdAt.toISOString(),
105
+ });
106
+ }
107
+
108
+ export function integrationProviderFields(
109
+ row: Omit<WorkspaceCredentialProviderRow, "workspaceId">,
110
+ ) {
111
+ return {
112
+ url: row.url,
113
+ enabled: row.enabled,
114
+ timeoutMs: row.timeoutMs,
115
+ createdAt: row.createdAt.toISOString(),
116
+ updatedAt: row.updatedAt.toISOString(),
117
+ };
118
+ }
119
+
120
+ function providerProjection(row: WorkspaceCredentialProviderRow): WorkspaceCredentialProvider {
121
+ return WorkspaceCredentialProvider.parse({
122
+ ...integrationProviderFields(row),
123
+ workspaceId: row.workspaceId,
124
+ });
125
+ }
126
+
127
+ export async function integrationBody<T extends z.ZodTypeAny>(
128
+ c: Context,
129
+ schema: T,
130
+ invalidStatus: 400 | 422 = 400,
131
+ ): Promise<z.output<T>> {
132
+ const parsed = schema.safeParse(await c.req.json().catch(() => null));
133
+ if (!parsed.success) {
134
+ throw new HTTPException(invalidStatus, {
135
+ message: parsed.error.issues[0]?.message ?? "Invalid request",
136
+ });
137
+ }
138
+ return parsed.data;
139
+ }
140
+
141
+ export function integrationRouteConfiguration(
142
+ deps: ApiRouteDeps,
143
+ scope: "workspace" | "organization",
144
+ ) {
145
+ return {
146
+ requireKey(): Uint8Array {
147
+ const key = environmentsEncryptionKeyBytes(deps.settings);
148
+ if (!key) {
149
+ throw new HTTPException(503, {
150
+ message: `OPENGENI_ENVIRONMENTS_ENCRYPTION_KEY is required for ${scope} integrations`,
151
+ });
152
+ }
153
+ return key;
154
+ },
155
+ requireDeployableUrl(url: string): void {
156
+ if (!isLocalTestEnvironment(deps.settings.environment) && !url.startsWith("https://")) {
157
+ throw new HTTPException(422, { message: "URL must use https" });
158
+ }
159
+ },
160
+ };
161
+ }
162
+
163
+ export function isIntegrationAgent(
164
+ grant: Pick<AccessGrant, "principalKind" | "metadata">,
165
+ ): boolean {
166
+ return (
167
+ grant.principalKind === "agent_attempt" ||
168
+ grant.metadata?.["turnId"] !== undefined ||
169
+ grant.metadata?.["attemptId"] !== undefined
170
+ );
171
+ }
172
+
173
+ /** A test request waits at most this long, whatever the provider's run timeout. */
174
+ const TEST_TIMEOUT_MS = 10_000;
175
+
176
+ export type WorkspaceIntegrationRouteOptions = {
177
+ /** Tests inject a fetch; production uses the pinned outbound client. */
178
+ fetch?: typeof pinnedFetch;
179
+ };
180
+
181
+ export function registerWorkspaceIntegrationRoutes(
182
+ app: Hono,
183
+ deps: ApiRouteDeps,
184
+ options: WorkspaceIntegrationRouteOptions = {},
185
+ ): void {
186
+ // Configuring where credentials come from or where events go is a human or
187
+ // host decision; an agent may never redirect its own credential source.
188
+ const requireIntegrationAdmin = async (c: Context, workspaceId: string): Promise<AccessGrant> => {
189
+ const grant = await requireWorkspaceSettingsGrant(c, deps, workspaceId);
190
+ if (isIntegrationAgent(grant)) {
191
+ throw new HTTPException(403, {
192
+ message: "Agent attempts cannot manage workspace integrations",
193
+ });
194
+ }
195
+ return grant;
196
+ };
197
+ const { requireKey, requireDeployableUrl } = integrationRouteConfiguration(deps, "workspace");
198
+
199
+ app.get("/v1/workspaces/:workspaceId/credential-provider", async (c) => {
200
+ const workspaceId = c.req.param("workspaceId");
201
+ const grant = await requireIntegrationAdmin(c, workspaceId);
202
+ const row = await getWorkspaceCredentialProvider(deps.db, {
203
+ accountId: grant.accountId,
204
+ workspaceId,
205
+ });
206
+ c.header("cache-control", "private, no-store");
207
+ return c.json(
208
+ GetWorkspaceCredentialProviderResponse.parse({
209
+ provider: row ? providerProjection(row) : null,
210
+ }),
211
+ );
212
+ });
213
+
214
+ app.put("/v1/workspaces/:workspaceId/credential-provider", async (c) => {
215
+ const workspaceId = c.req.param("workspaceId");
216
+ const grant = await requireIntegrationAdmin(c, workspaceId);
217
+ const request = await integrationBody(c, PutWorkspaceCredentialProviderRequest);
218
+ requireDeployableUrl(request.url);
219
+ const scope = { accountId: grant.accountId, workspaceId };
220
+ const {
221
+ row: providerRow,
222
+ secret: signingSecret,
223
+ created,
224
+ } = await withCredentialProviderConfigurationLock(deps.db, scope, async (tx) => {
225
+ const existing = await getWorkspaceCredentialProvider(tx, scope);
226
+ const secret = existing ? undefined : newIntegrationSecret("ogcp");
227
+ const row = await upsertWorkspaceCredentialProvider(tx, {
228
+ ...scope,
229
+ url: request.url,
230
+ enabled: request.enabled ?? true,
231
+ timeoutMs: request.timeoutMs ?? 10_000,
232
+ createdBySubjectId: grant.subjectId,
233
+ ...(secret ? { secretEncrypted: encryptEnvironmentValue(requireKey(), secret) } : {}),
234
+ });
235
+ return { row, secret, created: !existing };
236
+ });
237
+ c.header("cache-control", "private, no-store");
238
+ return c.json(
239
+ PutWorkspaceCredentialProviderResponse.parse({
240
+ provider: providerProjection(providerRow),
241
+ ...(signingSecret ? { secret: signingSecret } : {}),
242
+ }),
243
+ created ? 201 : 200,
244
+ );
245
+ });
246
+
247
+ app.delete("/v1/workspaces/:workspaceId/credential-provider", async (c) => {
248
+ const workspaceId = c.req.param("workspaceId");
249
+ const grant = await requireIntegrationAdmin(c, workspaceId);
250
+ await deleteWorkspaceCredentialProvider(deps.db, { accountId: grant.accountId, workspaceId });
251
+ return c.body(null, 204);
252
+ });
253
+ app.post("/v1/workspaces/:workspaceId/credential-provider/rotate-secret", async (c) => {
254
+ const workspaceId = c.req.param("workspaceId");
255
+ const grant = await requireIntegrationAdmin(c, workspaceId);
256
+ const secret = newIntegrationSecret("ogcp");
257
+ const row = await rotateWorkspaceCredentialProviderSecret(deps.db, {
258
+ accountId: grant.accountId,
259
+ workspaceId,
260
+ secretEncrypted: encryptEnvironmentValue(requireKey(), secret),
261
+ });
262
+ if (!row) throw new HTTPException(404, { message: "Credential provider not found" });
263
+ c.header("cache-control", "private, no-store");
264
+ return c.json(
265
+ RotateWorkspaceCredentialProviderSecretResponse.parse({
266
+ provider: providerProjection(row),
267
+ secret,
268
+ }),
269
+ );
270
+ });
271
+
272
+ app.get("/v1/workspaces/:workspaceId/webhooks", async (c) => {
273
+ const workspaceId = c.req.param("workspaceId");
274
+ const grant = await requireIntegrationAdmin(c, workspaceId);
275
+ const rows = await listWorkspaceWebhooks(deps.db, { accountId: grant.accountId, workspaceId });
276
+ c.header("cache-control", "private, no-store");
277
+ return c.json(ListWorkspaceWebhooksResponse.parse({ webhooks: rows.map(webhookProjection) }));
278
+ });
279
+
280
+ app.post("/v1/workspaces/:workspaceId/webhooks", async (c) => {
281
+ const workspaceId = c.req.param("workspaceId");
282
+ const grant = await requireIntegrationAdmin(c, workspaceId);
283
+ const request = await integrationBody(c, CreateWorkspaceWebhookRequest);
284
+ requireDeployableUrl(request.url);
285
+ const secret = newIntegrationSecret("whsec");
286
+ try {
287
+ const row = await createWorkspaceWebhook(deps.db, {
288
+ accountId: grant.accountId,
289
+ workspaceId,
290
+ url: request.url,
291
+ secretEncrypted: encryptEnvironmentValue(requireKey(), secret),
292
+ eventTypes: request.eventTypes,
293
+ enabled: request.enabled ?? true,
294
+ description: request.description ?? null,
295
+ createdBySubjectId: grant.subjectId,
296
+ });
297
+ c.header("cache-control", "private, no-store");
298
+ return c.json(
299
+ CreateWorkspaceWebhookResponse.parse({ webhook: webhookProjection(row), secret }),
300
+ 201,
301
+ );
302
+ } catch (error) {
303
+ if (error instanceof WorkspaceWebhookLimitError) {
304
+ throw new HTTPException(409, { message: error.message });
305
+ }
306
+ throw error;
307
+ }
308
+ });
309
+
310
+ app.get("/v1/workspaces/:workspaceId/webhooks/:webhookId", async (c) => {
311
+ const workspaceId = c.req.param("workspaceId");
312
+ const webhookId = z.string().uuid().safeParse(c.req.param("webhookId"));
313
+ if (!webhookId.success) throw new HTTPException(404, { message: "Webhook not found" });
314
+ const grant = await requireIntegrationAdmin(c, workspaceId);
315
+ const row = await getWorkspaceWebhook(deps.db, {
316
+ accountId: grant.accountId,
317
+ workspaceId,
318
+ webhookId: webhookId.data,
319
+ });
320
+ if (!row) throw new HTTPException(404, { message: "Webhook not found" });
321
+ c.header("cache-control", "private, no-store");
322
+ return c.json(webhookProjection(row));
323
+ });
324
+
325
+ app.patch("/v1/workspaces/:workspaceId/webhooks/:webhookId", async (c) => {
326
+ const workspaceId = c.req.param("workspaceId");
327
+ const webhookId = z.string().uuid().safeParse(c.req.param("webhookId"));
328
+ if (!webhookId.success) throw new HTTPException(404, { message: "Webhook not found" });
329
+ const grant = await requireIntegrationAdmin(c, workspaceId);
330
+ const request = await integrationBody(c, UpdateWorkspaceWebhookRequest);
331
+ if (request.url) requireDeployableUrl(request.url);
332
+ const row = await updateWorkspaceWebhook(deps.db, {
333
+ accountId: grant.accountId,
334
+ workspaceId,
335
+ webhookId: webhookId.data,
336
+ ...(request.url !== undefined ? { url: request.url } : {}),
337
+ ...(request.eventTypes !== undefined ? { eventTypes: request.eventTypes } : {}),
338
+ ...(request.enabled !== undefined ? { enabled: request.enabled } : {}),
339
+ ...(request.description !== undefined ? { description: request.description } : {}),
340
+ });
341
+ if (!row) throw new HTTPException(404, { message: "Webhook not found" });
342
+ return c.json(webhookProjection(row));
343
+ });
344
+
345
+ app.delete("/v1/workspaces/:workspaceId/webhooks/:webhookId", async (c) => {
346
+ const workspaceId = c.req.param("workspaceId");
347
+ const webhookId = z.string().uuid().safeParse(c.req.param("webhookId"));
348
+ if (!webhookId.success) throw new HTTPException(404, { message: "Webhook not found" });
349
+ const grant = await requireIntegrationAdmin(c, workspaceId);
350
+ const deleted = await deleteWorkspaceWebhook(deps.db, {
351
+ accountId: grant.accountId,
352
+ workspaceId,
353
+ webhookId: webhookId.data,
354
+ });
355
+ if (!deleted) throw new HTTPException(404, { message: "Webhook not found" });
356
+ return c.body(null, 204);
357
+ });
358
+ app.post("/v1/workspaces/:workspaceId/webhooks/:webhookId/rotate-secret", async (c) => {
359
+ const workspaceId = c.req.param("workspaceId");
360
+ const id = z.string().uuid().safeParse(c.req.param("webhookId"));
361
+ if (!id.success) throw new HTTPException(404, { message: "Webhook not found" });
362
+ const grant = await requireIntegrationAdmin(c, workspaceId);
363
+ const secret = newIntegrationSecret("whsec");
364
+ const row = await rotateWorkspaceWebhookSecret(deps.db, {
365
+ accountId: grant.accountId,
366
+ workspaceId,
367
+ webhookId: id.data,
368
+ secretEncrypted: encryptEnvironmentValue(requireKey(), secret),
369
+ });
370
+ if (!row) throw new HTTPException(404, { message: "Webhook not found" });
371
+ c.header("cache-control", "private, no-store");
372
+ return c.json(
373
+ RotateWorkspaceWebhookSecretResponse.parse({
374
+ webhook: webhookProjection(row),
375
+ secret,
376
+ }),
377
+ );
378
+ });
379
+
380
+ app.get("/v1/workspaces/:workspaceId/webhooks/:webhookId/deliveries", async (c) => {
381
+ const workspaceId = c.req.param("workspaceId");
382
+ const webhookId = z.string().uuid().safeParse(c.req.param("webhookId"));
383
+ if (!webhookId.success) throw new HTTPException(404, { message: "Webhook not found" });
384
+ const grant = await requireIntegrationAdmin(c, workspaceId);
385
+ const scope = { accountId: grant.accountId, workspaceId, webhookId: webhookId.data };
386
+ if (!(await getWorkspaceWebhook(deps.db, scope))) {
387
+ throw new HTTPException(404, { message: "Webhook not found" });
388
+ }
389
+ const limit = z.coerce.number().int().min(1).max(200).catch(50).parse(c.req.query("limit"));
390
+ const rows = await listWorkspaceWebhookDeliveries(deps.db, { ...scope, limit });
391
+ c.header("cache-control", "private, no-store");
392
+ return c.json(
393
+ ListWorkspaceWebhookDeliveriesResponse.parse({
394
+ deliveries: rows.map(integrationDeliveryProjection),
395
+ }),
396
+ );
397
+ });
398
+
399
+ app.post(
400
+ "/v1/workspaces/:workspaceId/webhooks/:webhookId/deliveries/:deliveryId/redeliver",
401
+ async (c) => {
402
+ const workspaceId = c.req.param("workspaceId");
403
+ const ids = z
404
+ .object({ webhookId: z.string().uuid(), deliveryId: z.string().uuid() })
405
+ .safeParse({ webhookId: c.req.param("webhookId"), deliveryId: c.req.param("deliveryId") });
406
+ if (!ids.success) throw new HTTPException(404, { message: "Delivery not found" });
407
+ const grant = await requireIntegrationAdmin(c, workspaceId);
408
+ const row = await redeliverWorkspaceWebhookDelivery(deps.db, {
409
+ accountId: grant.accountId,
410
+ workspaceId,
411
+ ...ids.data,
412
+ });
413
+ if (!row) {
414
+ throw new HTTPException(409, {
415
+ message: "Only a delivered or failed delivery can be redelivered",
416
+ });
417
+ }
418
+ return c.json(integrationDeliveryProjection(row));
419
+ },
420
+ );
421
+
422
+ // Organization registrations that reach this workspace, so its administrators
423
+ // can see where its events go and which credential provider runs inherit.
424
+ app.get("/v1/workspaces/:workspaceId/inherited-integrations", async (c) => {
425
+ const workspaceId = c.req.param("workspaceId");
426
+ const grant = await requireIntegrationAdmin(c, workspaceId);
427
+ const workspace = await getWorkspace(deps.db, workspaceId);
428
+ c.header("cache-control", "private, no-store");
429
+ // Organization registrations never cover a Personal workspace.
430
+ if (!workspace || workspace.accountId !== grant.accountId || workspace.kind !== "shared") {
431
+ return c.json(
432
+ WorkspaceInheritedIntegrationsResponse.parse({ credentialProvider: null, webhooks: [] }),
433
+ );
434
+ }
435
+ // Matched like the runtime resolver, but shown even while this workspace
436
+ // overrides it, so the page can say what its own provider replaces.
437
+ const organizationProvider = await getOrganizationCredentialProvider(deps.db, {
438
+ accountId: grant.accountId,
439
+ });
440
+ const inheritedProvider =
441
+ organizationProvider?.enabled &&
442
+ integrationWorkspaceFilterMatches(organizationProvider.workspaceFilter, workspace)
443
+ ? organizationProvider
444
+ : null;
445
+ const organizationWebhooks = await listOrganizationWebhooks(deps.db, {
446
+ accountId: grant.accountId,
447
+ });
448
+ return c.json(
449
+ WorkspaceInheritedIntegrationsResponse.parse({
450
+ credentialProvider: inheritedProvider
451
+ ? {
452
+ url: inheritedProvider.url,
453
+ timeoutMs: inheritedProvider.timeoutMs,
454
+ updatedAt: inheritedProvider.updatedAt.toISOString(),
455
+ }
456
+ : null,
457
+ webhooks: organizationWebhooks
458
+ .filter(
459
+ (webhook) =>
460
+ webhook.enabled &&
461
+ integrationWorkspaceFilterMatches(webhook.workspaceFilter, workspace),
462
+ )
463
+ .map((webhook) => ({
464
+ id: webhook.id,
465
+ url: webhook.url,
466
+ eventTypes: webhook.eventTypes,
467
+ description: webhook.description,
468
+ })),
469
+ }),
470
+ );
471
+ });
472
+
473
+ // "Send test event": one signed `webhook.test` POST, sent now, never queued.
474
+ app.post("/v1/workspaces/:workspaceId/webhooks/:webhookId/test", async (c) => {
475
+ const workspaceId = c.req.param("workspaceId");
476
+ const webhookId = z.string().uuid().safeParse(c.req.param("webhookId"));
477
+ if (!webhookId.success) throw new HTTPException(404, { message: "Webhook not found" });
478
+ const grant = await requireIntegrationAdmin(c, workspaceId);
479
+ const row = await getWorkspaceWebhook(deps.db, {
480
+ accountId: grant.accountId,
481
+ workspaceId,
482
+ webhookId: webhookId.data,
483
+ });
484
+ if (!row) throw new HTTPException(404, { message: "Webhook not found" });
485
+ const workspace = await getWorkspace(deps.db, workspaceId);
486
+ const eventId = randomUUID();
487
+ const body = JSON.stringify({
488
+ id: eventId,
489
+ type: OPENGENI_WEBHOOK_TEST_EVENT_TYPE,
490
+ lane: "workspace",
491
+ workspaceId,
492
+ workspace: {
493
+ id: workspaceId,
494
+ externalSource: workspace?.externalSource ?? null,
495
+ externalId: workspace?.externalId ?? null,
496
+ },
497
+ sessionId: null,
498
+ turnId: null,
499
+ occurredAt: new Date().toISOString(),
500
+ data: { webhookId: row.id },
501
+ });
502
+ const result = await sendIntegrationEndpointTest({
503
+ kind: "webhook",
504
+ url: row.url,
505
+ secret: decryptEnvironmentValue(requireKey(), row.secretEncrypted),
506
+ body,
507
+ headers: { [OPENGENI_EVENT_ID_HEADER]: eventId },
508
+ timeoutMs: TEST_TIMEOUT_MS,
509
+ settings: deps.settings,
510
+ ...(options.fetch ? { fetch: options.fetch } : {}),
511
+ });
512
+ c.header("cache-control", "private, no-store");
513
+ return c.json(TestWorkspaceWebhookResponse.parse({ result }));
514
+ });
515
+
516
+ // "Test connection": a signed `purpose: "test"` request to the provider this
517
+ // workspace's runs use. A paused workspace provider is still tested, so it
518
+ // can be checked before it is turned back on.
519
+ app.post("/v1/workspaces/:workspaceId/credential-provider/test", async (c) => {
520
+ const workspaceId = c.req.param("workspaceId");
521
+ const grant = await requireIntegrationAdmin(c, workspaceId);
522
+ const scope = { accountId: grant.accountId, workspaceId };
523
+ const own = await getWorkspaceCredentialProvider(deps.db, scope);
524
+ const provider = own ?? (await resolveWorkspaceCredentialProvider(deps.db, scope));
525
+ if (!provider) throw new HTTPException(404, { message: "Credential provider not found" });
526
+ const lane = "workspaceId" in provider ? ("workspace" as const) : ("organization" as const);
527
+ const initiatingHuman = await resolveInitiatingHuman(deps.db, scope, grant.subjectId);
528
+ const initiator = { kind: "subject" as const, subjectId: grant.subjectId };
529
+ const request: CredentialProviderRequest = {
530
+ type: "credentials.request",
531
+ lane,
532
+ mcpServers: [],
533
+ purpose: "test",
534
+ forceRefresh: true,
535
+ accountId: grant.accountId,
536
+ workspaceId,
537
+ sessionId: OPENGENI_TEST_REQUEST_NIL_ID,
538
+ rootSessionId: OPENGENI_TEST_REQUEST_NIL_ID,
539
+ parentSessionId: null,
540
+ turnId: OPENGENI_TEST_REQUEST_NIL_ID,
541
+ attemptId: OPENGENI_TEST_REQUEST_NIL_ID,
542
+ initiator,
543
+ initiatorContext: { kind: "human", initiator, context: {} },
544
+ initiatingHumanSubjectId: grant.subjectId,
545
+ initiatingHuman,
546
+ sandboxBackend: deps.settings.sandboxBackend,
547
+ sandboxOs: "linux",
548
+ };
549
+ const result = await sendIntegrationEndpointTest({
550
+ kind: "credential-provider",
551
+ url: provider.url,
552
+ secret: decryptEnvironmentValue(requireKey(), provider.secretEncrypted),
553
+ body: JSON.stringify(request),
554
+ timeoutMs: Math.min(provider.timeoutMs, TEST_TIMEOUT_MS),
555
+ settings: deps.settings,
556
+ ...(options.fetch ? { fetch: options.fetch } : {}),
557
+ });
558
+ c.header("cache-control", "private, no-store");
559
+ return c.json(
560
+ TestWorkspaceCredentialProviderResponse.parse({ lane, url: provider.url, result }),
561
+ );
562
+ });
563
+
564
+ // The images a workspace may choose as its default sandbox image.
565
+ app.get("/v1/workspaces/:workspaceId/sandbox-images", async (c) => {
566
+ const workspaceId = c.req.param("workspaceId");
567
+ await requireAccessGrant(c, deps, workspaceId, "workspace:read");
568
+ const workspace = await getWorkspace(deps.db, workspaceId);
569
+ const images = sandboxImageAllowlist(deps.settings);
570
+ const selected = resolveWorkspaceDefaultSandboxImage(workspace?.settings);
571
+ return c.json({
572
+ images,
573
+ selected: selected && images.includes(selected) ? selected : null,
574
+ });
575
+ });
576
+ }