@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
@@ -1,26 +1,28 @@
1
1
  import { createHash, createHmac, randomUUID } from "node:crypto";
2
2
  import type { Hono } from "hono";
3
3
  import { HTTPException } from "hono/http-exception";
4
+ import { getConnectBeginReplay } from "@opengeni/db/connect-attempts";
4
5
  import {
5
6
  AdvanceConnectRequest,
6
7
  BeginConnectRequest,
7
8
  ConnectOperationRequest,
8
9
  ConnectProvider,
9
10
  ConnectAccount,
11
+ preparedMcpHeaders,
10
12
  } from "@opengeni/contracts/connect";
11
13
  import {
12
14
  API_INTEGRATION_OAUTH_CREDENTIAL_ROLE,
13
15
  InstallApiIntegrationRequest,
14
16
  stableJson,
17
+ assertOrganizationIntegrationAllowed,
15
18
  OPENGENI_PERSONAL_SLACK_MCP_URL,
16
- OPENGENI_PR_REVIEW_PACK_ID,
17
19
  } from "@opengeni/contracts";
18
20
  import {
19
21
  CORE_INTEGRATION_DEFINITIONS,
20
22
  createPinnedIntegrationTransport,
21
23
  } from "@opengeni/capabilities";
22
24
  import {
23
- beginConnectAttempt,
25
+ beginConnectAttempt as persistConnectAttempt,
24
26
  getConnectAttempt,
25
27
  listPendingConnectAttempts,
26
28
  withWorkspaceSubjectRls,
@@ -30,9 +32,8 @@ import {
30
32
  createConnection,
31
33
  updateConnection,
32
34
  encryptEnvironmentValue,
33
- normalizedHostCredentialHeaders,
35
+ normalizedCredentialHeaders,
34
36
  listGitHubInstallationAccessForWorkspace,
35
- getPackInstallation,
36
37
  listPrReviewAppRegistrations,
37
38
  listSocialConnections,
38
39
  getSocialConnection,
@@ -45,7 +46,9 @@ import {
45
46
  isFikenConnection,
46
47
  isOpenGeniSlackBotConnection,
47
48
  prepareCapabilityEnable,
49
+ prepareMcpConnectionActivation,
48
50
  buildCapabilityCatalog,
51
+ integrationKeyForConnectProvider,
49
52
  type ApiRouteDeps,
50
53
  } from "@opengeni/core";
51
54
  import { isPersonalConnectionOwnerPrincipal } from "../connection-ownership";
@@ -67,20 +70,28 @@ import {
67
70
  GOOGLE_DRIVE_CREDENTIAL_ROLE,
68
71
  googleDriveScopesAllowCapability,
69
72
  } from "@opengeni/contracts/google-drive";
70
- import { ATLASSIAN_CREDENTIAL_ROLE } from "@opengeni/contracts/atlassian";
73
+ import { ATLASSIAN_NATIVE_RETIRED_MESSAGE } from "@opengeni/contracts/atlassian-native-retirement";
71
74
  import {
72
75
  curatedOAuthReadiness,
73
76
  startApiIntegrationProviderOAuth,
74
77
  } from "../integrations/provider-oauth";
75
78
  import { resolveForRoute, validatedIntegrationInstallInput } from "./api-integrations";
76
79
  import { executeConnectOperation } from "@opengeni/core";
77
- import { startMcpOAuth, requireIntegrationsStateSecret } from "../integrations/oauth-client";
80
+ import { withOrganizationIntegrationPolicyFence } from "@opengeni/db/organization-integration-policy";
81
+ import {
82
+ startMcpOAuth,
83
+ requireIntegrationsStateSecret,
84
+ gmailOAuthClientConfigured,
85
+ } from "../integrations/oauth-client";
78
86
  import { OFFICIAL_GMAIL_MCP_URL } from "../integrations/oauth-profiles";
79
87
  import { z } from "zod";
80
88
  import {
81
89
  WORKSPACE_OPENROUTER_CONNECTION_DOMAIN,
90
+ WORKSPACE_OPPER_CONNECTION_DOMAIN,
82
91
  VERCEL_AI_GATEWAY_CONNECTION_DOMAIN,
83
92
  } from "@opengeni/config";
93
+ import { parseRequestJson } from "../http/request-body";
94
+ import { connectRequestActor, assertAgentPreparedConnect } from "../prepared-mcp-actor";
84
95
 
85
96
  /** Shared durable setup entry. Provider completion is distinct from
86
97
  * subsequent preview/install; never report an OAuth token as a ready integration. */
@@ -101,13 +112,13 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
101
112
  "workspace:read",
102
113
  );
103
114
  const external = authorization.contextIntegrity;
104
- const canWrite = hasPermission(authorization.grant.permissions, "connections:write");
105
- const personal = isPersonalConnectionOwnerPrincipal(authorization);
106
- const lensPack = await getPackInstallation(
115
+ const policy = await withOrganizationIntegrationPolicyFence(
107
116
  deps.db,
108
- authorization.grant.workspaceId,
109
- OPENGENI_PR_REVIEW_PACK_ID,
117
+ authorization.grant,
118
+ async (_tx, current) => current,
110
119
  );
120
+ const canWrite = hasPermission(authorization.grant.permissions, "connections:write");
121
+ const personal = isPersonalConnectionOwnerPrincipal(authorization);
111
122
  let mcpConfigured = false;
112
123
  let credentialConfigured = false;
113
124
  try {
@@ -118,7 +129,7 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
118
129
  } catch {
119
130
  /* Missing operator configuration is catalog readiness, not actor authority. */
120
131
  }
121
- return c.json([
132
+ const providers = [
122
133
  ...(["x", "reddit"] as const).map((providerId) => {
123
134
  let configured = mcpConfigured;
124
135
  try {
@@ -197,21 +208,6 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
197
208
  setup: [protocol, "installation"],
198
209
  }),
199
210
  ),
200
- ConnectProvider.parse({
201
- id: "atlassian",
202
- label: "Atlassian (Jira and Confluence)",
203
- family: "atlassian",
204
- readiness:
205
- !external || !canWrite || !personal
206
- ? "unsupported"
207
- : mcpConfigured &&
208
- deps.settings.atlassianClientId?.trim() &&
209
- deps.settings.atlassianClientSecret?.trim()
210
- ? "available"
211
- : "needs_configuration",
212
- ownership: personal ? ["personal"] : [],
213
- setup: ["oauth"],
214
- }),
215
211
  ConnectProvider.parse({
216
212
  id: "slack-bot",
217
213
  label: "Slack workspace bot",
@@ -235,7 +231,7 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
235
231
  readiness:
236
232
  !external || !canWrite || !personal
237
233
  ? "unsupported"
238
- : mcpConfigured
234
+ : mcpConfigured && gmailOAuthClientConfigured(deps.settings)
239
235
  ? "available"
240
236
  : "needs_configuration",
241
237
  ownership: personal ? ["personal"] : [],
@@ -243,17 +239,17 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
243
239
  }),
244
240
  ConnectProvider.parse({
245
241
  id: "slack-personal",
246
- label: "My Slack account",
242
+ label: "Slack account",
247
243
  family: "slack",
248
244
  readiness:
249
- !external || !canWrite || !personal
245
+ !external || !canWrite
250
246
  ? "unsupported"
251
247
  : mcpConfigured &&
252
248
  deps.settings.slackClientId?.trim() &&
253
249
  deps.settings.slackClientSecret?.trim()
254
250
  ? "available"
255
251
  : "needs_configuration",
256
- ownership: personal ? ["personal"] : [],
252
+ ownership: personal ? ["workspace", "personal"] : ["workspace"],
257
253
  setup: ["oauth"],
258
254
  }),
259
255
  ConnectProvider.parse({
@@ -288,7 +284,7 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
288
284
  }),
289
285
  ConnectProvider.parse({
290
286
  id: "github-lens",
291
- label: "OpenGeni Lens PR review",
287
+ label: "Opengeni Lens PR review",
292
288
  family: "github-lens",
293
289
  readiness:
294
290
  !external ||
@@ -296,7 +292,6 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
296
292
  !hasPermission(authorization.grant.permissions, "secrets:write")
297
293
  ? "unsupported"
298
294
  : credentialConfigured &&
299
- lensPack?.status === "active" &&
300
295
  deps.settings.sandboxBackend !== "selfhosted" &&
301
296
  prReviewGitHubAppMissingSettings(deps.settings).length === 0
302
297
  ? "available"
@@ -391,7 +386,16 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
391
386
  ownership: personal ? ["workspace", "personal"] : ["workspace"],
392
387
  setup: ["credentials"],
393
388
  }),
394
- ]);
389
+ ];
390
+ return c.json(
391
+ providers.filter(
392
+ (provider) =>
393
+ policy.mode === "unrestricted" ||
394
+ policy.allowedIntegrationKeys.includes(
395
+ integrationKeyForConnectProvider(provider.id) ?? "",
396
+ ),
397
+ ),
398
+ );
395
399
  });
396
400
  app.get("/v1/workspaces/:workspaceId/connect/accounts", async (c) => {
397
401
  const workspaceId = c.req.param("workspaceId");
@@ -508,22 +512,6 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
508
512
  : "auth_needed",
509
513
  }),
510
514
  ];
511
- if (connection.metadata.credentialRole === ATLASSIAN_CREDENTIAL_ROLE)
512
- return [
513
- ConnectAccount.parse({
514
- id: connection.id,
515
- version: connection.version,
516
- providerId: "atlassian",
517
- label: String(connection.metadata.displayName ?? "Atlassian"),
518
- ownership: "personal",
519
- status:
520
- connection.status === "revoked"
521
- ? "disabled"
522
- : connection.status === "active"
523
- ? "connected"
524
- : "auth_needed",
525
- }),
526
- ];
527
515
  if (isFikenConnection(connection))
528
516
  return [
529
517
  ConnectAccount.parse({
@@ -579,9 +567,12 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
579
567
  status:
580
568
  connection.status === "revoked"
581
569
  ? "disabled"
582
- : connection.status === "active"
583
- ? "connected"
584
- : "auth_needed",
570
+ : connection.metadata.mcpUrl === OFFICIAL_GMAIL_MCP_URL &&
571
+ connection.subjectId === null
572
+ ? "auth_needed"
573
+ : connection.status === "active"
574
+ ? "connected"
575
+ : "auth_needed",
585
576
  }),
586
577
  ];
587
578
  if (connection.metadata.credentialRole !== API_INTEGRATION_OAUTH_CREDENTIAL_ROLE) return [];
@@ -619,7 +610,7 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
619
610
  ...(deps.apiIntegrationSourceFetch ? { fetchImpl: deps.apiIntegrationSourceFetch } : {}),
620
611
  });
621
612
  app.post("/v1/workspaces/:workspaceId/connect/attempts/:attemptId/advance", async (c) => {
622
- const input = AdvanceConnectRequest.parse(await c.req.json());
613
+ const input = await parseRequestJson(c, AdvanceConnectRequest);
623
614
  const action = input.action;
624
615
  const workspaceId = c.req.param("workspaceId");
625
616
  const permission =
@@ -635,21 +626,19 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
635
626
  const continuation = externalActorContinuationForAuthorization(authorization);
636
627
  if (!authorization.contextIntegrity)
637
628
  throw new HTTPException(403, { message: "Verified Connect authority required" });
638
- const scope = {
639
- accountId: authorization.grant.accountId,
640
- workspaceId,
641
- subjectId: authorization.grant.subjectId,
642
- personalOwnerVerified: isPersonalConnectionOwnerPrincipal(authorization),
643
- ...(continuation ? { externalContinuation: continuation } : {}),
644
- };
629
+ const actor = await connectRequestActor(deps, authorization);
630
+ const scope = actor.scope;
645
631
  // Reject invalid caller selections before taking a durable operation claim.
646
632
  // Older revisions still go through the receipt-aware claim path for replay.
647
633
  const stored = await getConnectAttempt(deps.db, scope, c.req.param("attemptId"));
648
634
  const before = stored.attempt;
635
+ assertAgentPreparedConnect(actor, before);
649
636
  const advancePermission =
650
637
  before.providerId === "mcp-install" ? "capabilities:manage" : permission;
651
638
  if (!hasPermission(authorization.grant.permissions, advancePermission))
652
639
  throw new HTTPException(403, { message: `${advancePermission} required` });
640
+ if (before.mcpSetup && !hasPermission(authorization.grant.permissions, "capabilities:manage"))
641
+ throw new HTTPException(403, { message: "capabilities:manage required" });
653
642
  if (before.providerId === "mcp-install") {
654
643
  if (action.type !== "credentials")
655
644
  throw new HTTPException(422, { message: "Choose an MCP capability" });
@@ -717,7 +706,7 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
717
706
  await requireConnectOwnerAuthority(tx, scope, installationPermission, origin);
718
707
  if (before.providerId === "github-lens") {
719
708
  await requireConnectOwnerAuthority(tx, scope, "secrets:write", origin);
720
- await requireGitHubLensConnect({ ...deps, db: tx }, workspaceId);
709
+ await requireGitHubLensConnect({ ...deps, db: tx });
721
710
  }
722
711
  },
723
712
  execute: async (attempt) =>
@@ -754,6 +743,7 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
754
743
  const resolved = await resolveForRoute({
755
744
  deps,
756
745
  transport,
746
+ accountId: scope.accountId,
757
747
  workspaceId,
758
748
  subjectId: scope.subjectId,
759
749
  payload: {
@@ -880,31 +870,43 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
880
870
  if (["mcp-bearer", "mcp-headers"].includes(before.providerId)) {
881
871
  if (action.type !== "credentials")
882
872
  throw new HTTPException(422, { message: "MCP credentials required" });
883
- const values =
884
- before.providerId === "mcp-headers"
885
- ? z
886
- .object({
887
- mcpUrl: z.string().url().max(4096),
888
- headers: z.string().min(2).max(65_536),
889
- })
890
- .strict()
891
- .parse(action.values)
892
- : z
893
- .object({
894
- mcpUrl: z.string().url().max(4096),
895
- token: z
896
- .string()
897
- .min(1)
898
- .max(16_384)
899
- .regex(/^[^\u0000-\u0020\u007f]+$/),
900
- })
901
- .strict()
902
- .parse(action.values);
873
+ let values: { mcpUrl: string; headers: string } | { mcpUrl: string; token: string };
874
+ if (before.mcpSetup) {
875
+ try {
876
+ values = {
877
+ mcpUrl: before.mcpSetup.endpointUrl,
878
+ headers: JSON.stringify(preparedMcpHeaders(before.mcpSetup, action.values)),
879
+ };
880
+ } catch {
881
+ throw new HTTPException(422, { message: "Supply exactly the requested secret fields" });
882
+ }
883
+ } else {
884
+ values =
885
+ before.providerId === "mcp-headers"
886
+ ? z
887
+ .object({
888
+ mcpUrl: z.string().url().max(4096),
889
+ headers: z.string().min(2).max(65_536),
890
+ })
891
+ .strict()
892
+ .parse(action.values)
893
+ : z
894
+ .object({
895
+ mcpUrl: z.string().url().max(4096),
896
+ token: z
897
+ .string()
898
+ .min(1)
899
+ .max(16_384)
900
+ .regex(/^[^\u0000-\u0020\u007f]+$/),
901
+ })
902
+ .strict()
903
+ .parse(action.values);
904
+ }
903
905
  let credentialHeaders: Record<string, string>;
904
906
  try {
905
907
  credentialHeaders =
906
908
  "headers" in values
907
- ? normalizedHostCredentialHeaders(
909
+ ? normalizedCredentialHeaders(
908
910
  z.record(z.string(), z.string()).parse(JSON.parse(values.headers)),
909
911
  )
910
912
  : { authorization: `Bearer ${values.token}` };
@@ -915,9 +917,11 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
915
917
  }
916
918
  const destination = new URL(values.mcpUrl);
917
919
  if (
918
- [WORKSPACE_OPENROUTER_CONNECTION_DOMAIN, VERCEL_AI_GATEWAY_CONNECTION_DOMAIN].some(
919
- (domain) => domain === destination.hostname,
920
- )
920
+ [
921
+ WORKSPACE_OPENROUTER_CONNECTION_DOMAIN,
922
+ VERCEL_AI_GATEWAY_CONNECTION_DOMAIN,
923
+ WORKSPACE_OPPER_CONNECTION_DOMAIN,
924
+ ].some((domain) => domain === destination.hostname)
921
925
  )
922
926
  throw new HTTPException(422, {
923
927
  message: "Use the dedicated workspace provider credential flow",
@@ -941,11 +945,43 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
941
945
  expectedRevision: input.expectedRevision,
942
946
  operationId: input.idempotencyKey,
943
947
  inputDigest: createHmac("sha256", encryptionKey).update(stableJson(input)).digest("hex"),
944
- authorize: (tx, _attempt, origin) =>
945
- requireConnectOwnerAuthority(tx, scope, "connections:write", origin),
948
+ beforeOperation: actor.beforeOperation,
949
+ authorize: async (tx, attempt, origin) => {
950
+ await requireConnectOwnerAuthority(tx, scope, "connections:write", origin);
951
+ if (attempt.mcpSetup)
952
+ await requireConnectOwnerAuthority(tx, scope, "capabilities:manage", origin);
953
+ },
946
954
  execute: async (attempt) => {
947
955
  if (attempt.state !== "credential_input")
948
956
  throw new HTTPException(409, { message: "Reload the current credential setup" });
957
+ let activation: Awaited<ReturnType<typeof prepareMcpConnectionActivation>> | undefined;
958
+ if (attempt.mcpSetup) {
959
+ try {
960
+ activation = await prepareMcpConnectionActivation({
961
+ grant: actor.grant,
962
+ settings: deps.settings,
963
+ setup: attempt.mcpSetup,
964
+ ownership: attempt.ownership,
965
+ headers: credentialHeaders,
966
+ ...(deps.mcpCapabilityProbe ? { probe: deps.mcpCapabilityProbe } : {}),
967
+ });
968
+ } catch {
969
+ // No credential/catalog write has occurred. Settle this exact
970
+ // operation without recording provider text or secret values.
971
+ return {
972
+ commit: async (_tx, current) => ({
973
+ ...current,
974
+ revision: current.revision + 1,
975
+ error: {
976
+ code: "mcp_verification_failed",
977
+ message:
978
+ "Could not verify the MCP connection. Check the key and server, then submit again.",
979
+ retryable: false,
980
+ },
981
+ }),
982
+ };
983
+ }
984
+ }
949
985
  const credentialEncrypted = encryptEnvironmentValue(
950
986
  encryptionKey,
951
987
  JSON.stringify({ headers: credentialHeaders }),
@@ -1002,11 +1038,20 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
1002
1038
  createdBySubjectId: scope.subjectId,
1003
1039
  });
1004
1040
  if (!connection) throw new HTTPException(409, { message: "MCP account changed" });
1041
+ if (activation) await activation.commit(tx, connection);
1042
+ const { error: _error, ...settled } = current;
1005
1043
  return {
1006
- ...current,
1044
+ ...settled,
1007
1045
  revision: current.revision + 1,
1008
1046
  state: "complete",
1009
1047
  credentialsCommitted: true,
1048
+ ...(activation
1049
+ ? {
1050
+ integrationInstalled: true,
1051
+ completionRequirement: "integration" as const,
1052
+ mcpCapabilityId: activation.capabilityId,
1053
+ }
1054
+ : {}),
1010
1055
  nextAction: { type: "none" },
1011
1056
  account: {
1012
1057
  id: connection.id,
@@ -1052,6 +1097,9 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
1052
1097
  throw new HTTPException(409, { message: "Reload the current connection setup" });
1053
1098
  const started = await startMcpOAuth(deps, {
1054
1099
  ...scope,
1100
+ ...(before.providerId === "gmail" || before.providerId === "slack-personal"
1101
+ ? { integrationKey: before.providerId }
1102
+ : {}),
1055
1103
  ...(continuation ? { externalContinuation: continuation } : {}),
1056
1104
  connectAttemptId: attempt.id,
1057
1105
  personalOwnershipAllowed: isPersonalConnectionOwnerPrincipal(authorization),
@@ -1144,6 +1192,7 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
1144
1192
  const resolved = await resolveForRoute({
1145
1193
  deps,
1146
1194
  transport,
1195
+ accountId: scope.accountId,
1147
1196
  workspaceId,
1148
1197
  subjectId: scope.subjectId,
1149
1198
  payload: previewRequest,
@@ -1214,19 +1263,11 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
1214
1263
  );
1215
1264
  });
1216
1265
  app.post("/v1/workspaces/:workspaceId/connect/attempts/:attemptId/cancel", async (c) => {
1217
- const input = ConnectOperationRequest.parse(await c.req.json());
1266
+ const input = await parseRequestJson(c, ConnectOperationRequest);
1218
1267
  const workspaceId = c.req.param("workspaceId");
1219
1268
  const authorization = await requireAccessGrantAuthorization(c, deps, workspaceId);
1220
- const continuation = externalActorContinuationForAuthorization(authorization);
1221
- if (!authorization.contextIntegrity)
1222
- throw new HTTPException(403, { message: "Verified Connect authority required" });
1223
- const scope = {
1224
- accountId: authorization.grant.accountId,
1225
- workspaceId,
1226
- subjectId: authorization.grant.subjectId,
1227
- personalOwnerVerified: isPersonalConnectionOwnerPrincipal(authorization),
1228
- ...(continuation ? { externalContinuation: continuation } : {}),
1229
- };
1269
+ const actor = await connectRequestActor(deps, authorization);
1270
+ const scope = actor.scope;
1230
1271
  return c.json(
1231
1272
  await executeConnectOperation({
1232
1273
  db: deps.db,
@@ -1237,7 +1278,10 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
1237
1278
  inputDigest: createHash("sha256")
1238
1279
  .update(stableJson({ ...input, action: "cancel" }))
1239
1280
  .digest("hex"),
1281
+ purpose: "cancellation",
1282
+ beforeOperation: actor.beforeOperation,
1240
1283
  authorize: async (tx, attempt, origin) => {
1284
+ assertAgentPreparedConnect(actor, attempt);
1241
1285
  const permission =
1242
1286
  attempt.providerId === "mcp-install"
1243
1287
  ? "capabilities:manage"
@@ -1275,7 +1319,7 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
1275
1319
  if (!deps.settings.integrationsEnabled)
1276
1320
  throw new HTTPException(403, { message: "integrations disabled" });
1277
1321
  const workspaceId = c.req.param("workspaceId");
1278
- const input = BeginConnectRequest.parse(await c.req.json());
1322
+ const input = await parseRequestJson(c, BeginConnectRequest);
1279
1323
  const setupPermission =
1280
1324
  input.providerId === "mcp-install"
1281
1325
  ? "capabilities:manage"
@@ -1299,6 +1343,12 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
1299
1343
  throw new HTTPException(403, {
1300
1344
  message: "Verified Connect authority required",
1301
1345
  });
1346
+ if (input.mcpSetup && !hasPermission(authorization.grant.permissions, "capabilities:manage"))
1347
+ throw new HTTPException(403, { message: "capabilities:manage required" });
1348
+ if (input.providerId === "atlassian")
1349
+ throw new HTTPException(410, { message: ATLASSIAN_NATIVE_RETIRED_MESSAGE });
1350
+ if (input.providerId === "gmail" && input.ownership !== "personal")
1351
+ throw new HTTPException(422, { message: "Gmail connections must be personal-owned" });
1302
1352
  let target: URL;
1303
1353
  try {
1304
1354
  target = new URL(input.returnUrl);
@@ -1312,16 +1362,69 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
1312
1362
  /[\u0000-\u0020\u007f]/.test(input.returnUrl)
1313
1363
  )
1314
1364
  throw new HTTPException(400, { message: "invalid return URL" });
1315
- const scope = {
1316
- accountId: authorization.grant.accountId,
1317
- workspaceId,
1318
- subjectId: authorization.grant.subjectId,
1319
- personalOwnerVerified: isPersonalConnectionOwnerPrincipal(authorization),
1320
- ...(continuation ? { externalContinuation: continuation } : {}),
1321
- };
1365
+ const actor = await connectRequestActor(deps, authorization);
1366
+ const scope = actor.scope;
1367
+ assertAgentPreparedConnect(actor, input);
1322
1368
  return c.json(
1323
- await withWorkspaceSubjectRls(deps.db, workspaceId, scope.subjectId, async (tx) => {
1324
- await requireConnectOwnerAuthority(tx, scope, setupPermission);
1369
+ await (async () => {
1370
+ // Remote setup preparation stays outside the policy and actor transactions.
1371
+ // Repeat both admissions when persisting the resulting attempt.
1372
+ const tx = deps.db;
1373
+ const admit = () =>
1374
+ withOrganizationIntegrationPolicyFence(deps.db, scope, async (policyTx, policy) => {
1375
+ await actor.beforeOperation?.(policyTx);
1376
+ return withWorkspaceSubjectRls(
1377
+ policyTx,
1378
+ workspaceId,
1379
+ scope.subjectId,
1380
+ async (actorTx) => {
1381
+ await requireConnectOwnerAuthority(actorTx, scope, setupPermission);
1382
+ if (input.mcpSetup)
1383
+ await requireConnectOwnerAuthority(actorTx, scope, "capabilities:manage");
1384
+ const replay = await getConnectBeginReplay(actorTx, scope, {
1385
+ idempotencyKey: input.idempotencyKey,
1386
+ requestDigest: createHash("sha256").update(stableJson(input)).digest("hex"),
1387
+ returnUrl: input.returnUrl,
1388
+ ...(continuation ? { externalContinuation: continuation } : {}),
1389
+ });
1390
+ if (replay) return replay;
1391
+ assertOrganizationIntegrationAllowed(
1392
+ policy,
1393
+ integrationKeyForConnectProvider(input.providerId),
1394
+ );
1395
+ return null;
1396
+ },
1397
+ );
1398
+ });
1399
+ const replay = await admit();
1400
+ if (replay) return replay;
1401
+ const beginConnectAttempt = async (
1402
+ _db: Parameters<typeof persistConnectAttempt>[0],
1403
+ _scope: Parameters<typeof persistConnectAttempt>[1],
1404
+ attemptInput: Parameters<typeof persistConnectAttempt>[2],
1405
+ ) =>
1406
+ withOrganizationIntegrationPolicyFence(deps.db, scope, async (policyTx, policy) => {
1407
+ await actor.beforeOperation?.(policyTx);
1408
+ return withWorkspaceSubjectRls(
1409
+ policyTx,
1410
+ workspaceId,
1411
+ scope.subjectId,
1412
+ async (actorTx) => {
1413
+ await requireConnectOwnerAuthority(actorTx, scope, setupPermission);
1414
+ if (input.mcpSetup)
1415
+ await requireConnectOwnerAuthority(actorTx, scope, "capabilities:manage");
1416
+ return persistConnectAttempt(actorTx, scope, {
1417
+ ...attemptInput,
1418
+ authorizeAcquisition: async () => {
1419
+ assertOrganizationIntegrationAllowed(
1420
+ policy,
1421
+ integrationKeyForConnectProvider(input.providerId),
1422
+ );
1423
+ },
1424
+ });
1425
+ },
1426
+ );
1427
+ });
1325
1428
  const id = randomUUID();
1326
1429
  if (input.providerId === "mcp-install") {
1327
1430
  if (
@@ -1467,7 +1570,7 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
1467
1570
  if (!hasPermission(authorization.grant.permissions, "secrets:write"))
1468
1571
  throw new HTTPException(403, { message: "secrets:write required" });
1469
1572
  await requireConnectOwnerAuthority(tx, scope, "secrets:write");
1470
- await requireGitHubLensConnect({ ...deps, db: tx }, workspaceId);
1573
+ await requireGitHubLensConnect({ ...deps, db: tx });
1471
1574
  }
1472
1575
  const navigation = githubAppConnectNavigation(
1473
1576
  deps,
@@ -1501,7 +1604,7 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
1501
1604
  if (["openapi", "graphql"].includes(input.providerId)) {
1502
1605
  if (input.reconnectAccountId)
1503
1606
  throw new HTTPException(422, { message: "Select the service connection during setup" });
1504
- if (input.ownership === "personal" && !isPersonalConnectionOwnerPrincipal(authorization))
1607
+ if (input.ownership === "personal" && !scope.personalOwnerVerified)
1505
1608
  throw new HTTPException(403, { message: "personal ownership unavailable" });
1506
1609
  const choices = hasPermission(authorization.grant.permissions, "connections:read")
1507
1610
  ? (await listConnectionsMetadata(tx, workspaceId, scope.subjectId))
@@ -1595,14 +1698,6 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
1595
1698
  "fiken-token",
1596
1699
  ].includes(input.providerId)
1597
1700
  ) {
1598
- if (input.providerId === "slack-personal" && input.ownership !== "personal")
1599
- throw new HTTPException(422, {
1600
- message: "Hosted Slack MCP requires personal ownership",
1601
- });
1602
- if (input.providerId === "gmail" && input.ownership !== "personal")
1603
- throw new HTTPException(422, {
1604
- message: "Gmail requires personal ownership; each user connects their own account",
1605
- });
1606
1701
  if (input.providerId === "fiken-token" && input.ownership !== "workspace")
1607
1702
  throw new HTTPException(422, { message: "Fiken is workspace-owned" });
1608
1703
  requireEnvironmentEncryption(deps.settings);
@@ -1633,7 +1728,7 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
1633
1728
  (existing.subjectId === null ? "workspace" : "personal") !== input.ownership)
1634
1729
  )
1635
1730
  throw new HTTPException(404, { message: "MCP account not found for this ownership" });
1636
- if (input.ownership === "personal" && !isPersonalConnectionOwnerPrincipal(authorization))
1731
+ if (input.ownership === "personal" && !scope.personalOwnerVerified)
1637
1732
  throw new HTTPException(403, { message: "personal ownership unavailable" });
1638
1733
  return beginConnectAttempt(tx, scope, {
1639
1734
  ...(continuation ? { externalContinuation: continuation } : {}),
@@ -1649,7 +1744,8 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
1649
1744
  state: "credential_input",
1650
1745
  credentialsCommitted: false,
1651
1746
  integrationInstalled: false,
1652
- completionRequirement: "connection",
1747
+ completionRequirement: input.mcpSetup ? "integration" : "connection",
1748
+ ...(input.mcpSetup ? { mcpSetup: input.mcpSetup } : {}),
1653
1749
  ...(existing
1654
1750
  ? {
1655
1751
  account: {
@@ -1664,50 +1760,57 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
1664
1760
  : {}),
1665
1761
  nextAction: {
1666
1762
  type: "credentials",
1667
- fields: ["slack-personal", "gmail"].includes(input.providerId)
1668
- ? []
1669
- : input.providerId === "fiken-token"
1670
- ? [
1671
- {
1672
- name: "apiToken",
1673
- label: "Fiken API token",
1674
- required: true,
1675
- secret: true,
1676
- },
1677
- {
1678
- name: "defaultCompanySlug",
1679
- label: "Default company slug (optional)",
1680
- required: false,
1681
- secret: false,
1682
- },
1683
- ]
1684
- : [
1685
- {
1686
- name: "mcpUrl",
1687
- label: "MCP server URL",
1688
- required: true,
1689
- secret: false,
1690
- },
1691
- ...(input.providerId === "mcp-bearer"
1692
- ? [
1693
- {
1694
- name: "token",
1695
- label: "Bearer credential",
1696
- required: true,
1697
- secret: true,
1698
- },
1699
- ]
1700
- : input.providerId === "mcp-headers"
1763
+ fields: input.mcpSetup
1764
+ ? input.mcpSetup.secretFields.map((field) => ({
1765
+ name: field.id,
1766
+ label: field.label,
1767
+ required: true,
1768
+ secret: true,
1769
+ }))
1770
+ : ["slack-personal", "gmail"].includes(input.providerId)
1771
+ ? []
1772
+ : input.providerId === "fiken-token"
1773
+ ? [
1774
+ {
1775
+ name: "apiToken",
1776
+ label: "Fiken API token",
1777
+ required: true,
1778
+ secret: true,
1779
+ },
1780
+ {
1781
+ name: "defaultCompanySlug",
1782
+ label: "Default company slug (optional)",
1783
+ required: false,
1784
+ secret: false,
1785
+ },
1786
+ ]
1787
+ : [
1788
+ {
1789
+ name: "mcpUrl",
1790
+ label: "MCP server URL",
1791
+ required: true,
1792
+ secret: false,
1793
+ },
1794
+ ...(input.providerId === "mcp-bearer"
1701
1795
  ? [
1702
1796
  {
1703
- name: "headers",
1704
- label: "Credential headers (JSON)",
1797
+ name: "token",
1798
+ label: "Bearer credential",
1705
1799
  required: true,
1706
1800
  secret: true,
1707
1801
  },
1708
1802
  ]
1709
- : []),
1710
- ],
1803
+ : input.providerId === "mcp-headers"
1804
+ ? [
1805
+ {
1806
+ name: "headers",
1807
+ label: "Credential headers (JSON)",
1808
+ required: true,
1809
+ secret: true,
1810
+ },
1811
+ ]
1812
+ : []),
1813
+ ],
1711
1814
  },
1712
1815
  expiresAt: new Date(Date.now() + 15 * 60_000).toISOString(),
1713
1816
  },
@@ -1867,30 +1970,29 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
1867
1970
  expiresAt: started.expiresAt,
1868
1971
  },
1869
1972
  });
1870
- }),
1973
+ })(),
1871
1974
  );
1872
1975
  });
1873
1976
  app.get("/v1/workspaces/:workspaceId/connect/attempts", async (c) => {
1874
1977
  const workspaceId = c.req.param("workspaceId");
1875
- const { grant } = await requireAccessGrantAuthorization(c, deps, workspaceId);
1978
+ const authorization = await requireAccessGrantAuthorization(c, deps, workspaceId);
1979
+ const actor = await connectRequestActor(deps, authorization);
1980
+ const { grant } = actor;
1876
1981
  return c.json(
1877
- (
1878
- await listPendingConnectAttempts(deps.db, {
1879
- accountId: grant.accountId,
1880
- workspaceId,
1881
- subjectId: grant.subjectId,
1882
- })
1883
- ).filter((attempt) => canReadAttempt(grant.permissions, attempt.providerId)),
1982
+ (await listPendingConnectAttempts(deps.db, actor.scope)).filter(
1983
+ (attempt) =>
1984
+ canReadAttempt(grant.permissions, attempt.providerId) &&
1985
+ (!actor.preparedOnly || (attempt.providerId === "mcp-headers" && attempt.mcpSetup)),
1986
+ ),
1884
1987
  );
1885
1988
  });
1886
1989
  app.get("/v1/workspaces/:workspaceId/connect/attempts/:attemptId", async (c) => {
1887
1990
  const workspaceId = c.req.param("workspaceId");
1888
- const { grant } = await requireAccessGrantAuthorization(c, deps, workspaceId);
1889
- const { attempt } = await getConnectAttempt(
1890
- deps.db,
1891
- { accountId: grant.accountId, workspaceId, subjectId: grant.subjectId },
1892
- c.req.param("attemptId"),
1893
- );
1991
+ const authorization = await requireAccessGrantAuthorization(c, deps, workspaceId);
1992
+ const actor = await connectRequestActor(deps, authorization);
1993
+ const { grant } = actor;
1994
+ const { attempt } = await getConnectAttempt(deps.db, actor.scope, c.req.param("attemptId"));
1995
+ assertAgentPreparedConnect(actor, attempt);
1894
1996
  if (!canReadAttempt(grant.permissions, attempt.providerId))
1895
1997
  throw new HTTPException(403, { message: "Connect read permission required" });
1896
1998
  return c.json(attempt);