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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. package/dist/access-grant-rls.d.ts +8 -1
  2. package/dist/admission-trace.d.ts +8 -0
  3. package/dist/app.d.ts +50 -3
  4. package/dist/app.js +10 -1
  5. package/dist/artifact-catalog-cursor.d.ts +1 -0
  6. package/dist/attached-browser-viewer.d.ts +11 -0
  7. package/dist/auth/managed-auth-attempt-context.d.ts +2 -0
  8. package/dist/auth/managed-auth-rate-limits.d.ts +167 -0
  9. package/dist/auth/managed-auth-session-adapter.d.ts +9 -1
  10. package/dist/auth/managed-auth.d.ts +72 -5
  11. package/dist/auth/managed-sign-in-notifications.d.ts +4 -0
  12. package/dist/auth/new-signups-gate.d.ts +23 -0
  13. package/dist/auth/signup-funnel-metrics.d.ts +44 -0
  14. package/dist/azure-live.d.ts +28 -0
  15. package/dist/browser-action-fences.d.ts +13 -0
  16. package/dist/browser-controller-authority.d.ts +1 -61
  17. package/dist/browser-ephemeral.d.ts +5 -0
  18. package/dist/browser-lost-runtime-end.d.ts +24 -0
  19. package/dist/browser-state-authority.d.ts +1 -27
  20. package/dist/{chunk-AJ62T5QN.js → chunk-GBUJ2DYZ.js} +80507 -39878
  21. package/dist/chunk-GBUJ2DYZ.js.map +1 -0
  22. package/dist/chunk-OGQDXVXY.js +18 -0
  23. package/dist/chunk-OGQDXVXY.js.map +1 -0
  24. package/dist/claude-default-models.d.ts +19 -0
  25. package/dist/claude-subscription-core.d.ts +50 -0
  26. package/dist/claude-subscription-oauth.d.ts +36 -0
  27. package/dist/claude-subscription-profile.d.ts +9 -0
  28. package/dist/claude-subscription-usage.d.ts +6 -0
  29. package/dist/claude-workspace-connection.d.ts +15 -0
  30. package/dist/codemode.d.ts +40 -5
  31. package/dist/codex-realtime.d.ts +29 -3
  32. package/dist/codex-session-pointers.d.ts +19 -0
  33. package/dist/connection-ownership.d.ts +6 -3
  34. package/dist/controller-data-plane.d.ts +16 -0
  35. package/dist/credit-promotion-snapshot.d.ts +6 -0
  36. package/dist/editable-artifact-source-session.d.ts +3 -0
  37. package/dist/editable-artifact-websocket.d.ts +5 -3
  38. package/dist/fatal-process-boundary.d.ts +9 -1
  39. package/dist/github-access.d.ts +7 -1
  40. package/dist/github-browser-flow.d.ts +1 -1
  41. package/dist/http/acting-person.d.ts +36 -0
  42. package/dist/http/api-contract-compat.d.ts +19 -0
  43. package/dist/http/api-error.d.ts +50 -1
  44. package/dist/http/auth.d.ts +8 -1
  45. package/dist/http/cors.d.ts +12 -0
  46. package/dist/http/deprecation.d.ts +42 -0
  47. package/dist/http/keyed-admission.d.ts +12 -0
  48. package/dist/http/local-browser-boundary.d.ts +72 -0
  49. package/dist/http/metrics-listener.d.ts +22 -0
  50. package/dist/http/path-identifier.d.ts +17 -0
  51. package/dist/http/registered-route-label.d.ts +16 -0
  52. package/dist/http/rejection-telemetry.d.ts +34 -0
  53. package/dist/http/request-body.d.ts +27 -0
  54. package/dist/http/request-source.d.ts +41 -3
  55. package/dist/http/sse.d.ts +12 -1
  56. package/dist/http/unmatched-route.d.ts +18 -0
  57. package/dist/http/user-content.d.ts +36 -0
  58. package/dist/http/variable-sets-removed.d.ts +41 -0
  59. package/dist/http/websocket-upgrade-dispatch.d.ts +18 -0
  60. package/dist/index.js +1279 -108
  61. package/dist/index.js.map +1 -1
  62. package/dist/integration-connect-metrics.d.ts +35 -0
  63. package/dist/integration-endpoint-test.d.ts +20 -0
  64. package/dist/integrations/api-integrations.d.ts +2 -2
  65. package/dist/integrations/atlassian.d.ts +8 -3
  66. package/dist/integrations/fiken.d.ts +3 -1
  67. package/dist/integrations/github-lens-connect.d.ts +37 -66
  68. package/dist/integrations/google-drive.d.ts +2 -0
  69. package/dist/integrations/integration-commit-authority.d.ts +13 -0
  70. package/dist/integrations/marketplace-plugin.d.ts +43 -43
  71. package/dist/integrations/oauth-client.d.ts +171 -12
  72. package/dist/integrations/oauth-profiles.d.ts +42 -13
  73. package/dist/integrations/onepassword-vault-provider.d.ts +9 -0
  74. package/dist/integrations/slack-bot.d.ts +285 -7
  75. package/dist/integrations/slack-file-upload-flow.d.ts +62 -0
  76. package/dist/integrations/slack-interactions.d.ts +89 -10
  77. package/dist/integrations/slack-mrkdwn.d.ts +41 -0
  78. package/dist/integrations/slack-routing.d.ts +1 -1
  79. package/dist/integrations/slack-session-defaults.d.ts +58 -0
  80. package/dist/integrations/slack-task-file-upload.d.ts +36 -0
  81. package/dist/integrations/slack-tool-review.d.ts +5 -0
  82. package/dist/interaction-agent-access.d.ts +13 -8
  83. package/dist/interaction-agent-version.d.ts +21 -0
  84. package/dist/interaction-holder-heartbeat.d.ts +5 -0
  85. package/dist/interaction-metrics.d.ts +27 -2
  86. package/dist/interaction-route-stages.d.ts +25 -0
  87. package/dist/interaction-secrets-vault.d.ts +20 -0
  88. package/dist/interaction-secrets.d.ts +103 -0
  89. package/dist/mcp/action-catalog-types.d.ts +14 -0
  90. package/dist/mcp/action-catalog.gen.d.ts +2 -0
  91. package/dist/mcp/action-descriptions.d.ts +4 -0
  92. package/dist/mcp/action-schema-imports.gen.d.ts +1 -0
  93. package/dist/mcp/capability-account-readiness.d.ts +7 -0
  94. package/dist/mcp/child-read-evidence.d.ts +9 -0
  95. package/dist/mcp/company-profile-agent-admin.d.ts +12 -0
  96. package/dist/mcp/contract-input.d.ts +13 -0
  97. package/dist/mcp/documents.d.ts +2 -0
  98. package/dist/mcp/first-party-tool-permissions.d.ts +3 -606
  99. package/dist/mcp/notification-tools.d.ts +26 -0
  100. package/dist/mcp/orchestration-failure-diagnostic.d.ts +43 -0
  101. package/dist/mcp/scheduled-task-input.d.ts +1309 -0
  102. package/dist/mcp/scheduled-task-view.d.ts +217 -3
  103. package/dist/mcp/secret-tools.d.ts +14 -0
  104. package/dist/mcp/server.d.ts +108 -5
  105. package/dist/mcp/session-admin-access-tools.d.ts +33 -0
  106. package/dist/mcp/session-event-errors.d.ts +28 -0
  107. package/dist/mcp/session-event-view.d.ts +62 -0
  108. package/dist/mcp/session-view.d.ts +15 -0
  109. package/dist/mcp/session-wait.d.ts +18 -0
  110. package/dist/mcp/site-agent-clamp-tools.d.ts +38 -0
  111. package/dist/mcp/site-data-tools.d.ts +22 -0
  112. package/dist/mcp/site-publication-tools.d.ts +19 -0
  113. package/dist/mcp/site-sql-tools.d.ts +27 -0
  114. package/dist/mcp-oauth.d.ts +37 -4
  115. package/dist/model-calls/chat-completions.d.ts +87 -0
  116. package/dist/model-calls/pending-usage-settlements.d.ts +57 -0
  117. package/dist/model-calls/service.d.ts +36 -0
  118. package/dist/model-catalog.d.ts +9 -3
  119. package/dist/native-push-dispatch.d.ts +69 -0
  120. package/dist/observability.d.ts +3 -1
  121. package/dist/organization-mcp.d.ts +82 -0
  122. package/dist/prepared-mcp-actor.d.ts +77 -0
  123. package/dist/prepared-mcp-permissions.d.ts +8 -0
  124. package/dist/routes/analytics-consent.d.ts +26 -0
  125. package/dist/routes/api-integrations.d.ts +11 -0
  126. package/dist/routes/api-keys.d.ts +7 -7
  127. package/dist/routes/automations.d.ts +2 -0
  128. package/dist/routes/billing.d.ts +59 -0
  129. package/dist/routes/browser-sessions.d.ts +65 -2
  130. package/dist/routes/chat-completions.d.ts +11 -0
  131. package/dist/routes/claude-core-usage.d.ts +20 -0
  132. package/dist/routes/claude-subscription-accounts.d.ts +3 -0
  133. package/dist/routes/claude-subscription-oauth.d.ts +3 -0
  134. package/dist/routes/client-errors.d.ts +182 -0
  135. package/dist/routes/codex-core.d.ts +401 -0
  136. package/dist/routes/codex.d.ts +64 -2
  137. package/dist/routes/computer-sessions.d.ts +6 -1
  138. package/dist/routes/desktop-distribution.d.ts +32 -0
  139. package/dist/routes/github-browser-fonts.gen.d.ts +2 -0
  140. package/dist/routes/github-browser-pages.d.ts +27 -0
  141. package/dist/routes/inbox.d.ts +13 -0
  142. package/dist/routes/insights-response-cache.d.ts +10 -0
  143. package/dist/routes/insights-usage.d.ts +12 -0
  144. package/dist/routes/insights.d.ts +28 -0
  145. package/dist/routes/interaction-placement-message.d.ts +7 -0
  146. package/dist/routes/managed-sign-in-methods.d.ts +6 -0
  147. package/dist/routes/model-account-choice.d.ts +13 -0
  148. package/dist/routes/model-account-settings.d.ts +19 -0
  149. package/dist/routes/native-app-auth.d.ts +12 -0
  150. package/dist/routes/organization-integration-policy.d.ts +8 -0
  151. package/dist/routes/organization-integrations.d.ts +6 -0
  152. package/dist/routes/organization-mcp-connections.d.ts +3 -0
  153. package/dist/routes/organization-model-defaults.d.ts +9 -0
  154. package/dist/routes/organization-service-accounts.d.ts +3 -0
  155. package/dist/routes/personal-api-keys.d.ts +3 -0
  156. package/dist/routes/session-admin-access.d.ts +3 -0
  157. package/dist/routes/session-artifact-associations.d.ts +4 -0
  158. package/dist/routes/session-history-imports.d.ts +20 -0
  159. package/dist/routes/sessions.d.ts +38 -2
  160. package/dist/routes/site-data.d.ts +18 -0
  161. package/dist/routes/site-publishing.d.ts +5 -0
  162. package/dist/routes/site-runtime.d.ts +31 -0
  163. package/dist/routes/site-sql.d.ts +16 -0
  164. package/dist/routes/slack-bot-access.d.ts +3 -0
  165. package/dist/routes/subscription-account-pools.d.ts +21 -0
  166. package/dist/routes/subscription-core-http.d.ts +5 -0
  167. package/dist/routes/subscription-pool-access.d.ts +37 -0
  168. package/dist/routes/subscription-pool-core.d.ts +153 -0
  169. package/dist/routes/supergrok.d.ts +6 -6
  170. package/dist/routes/usage-allowances.d.ts +12 -0
  171. package/dist/routes/variable-sets-removed.d.ts +2 -0
  172. package/dist/routes/vault-providers.d.ts +34 -0
  173. package/dist/routes/vaults.d.ts +3 -0
  174. package/dist/routes/workspace-integrations.d.ts +35 -0
  175. package/dist/routes/workspace-model-providers.d.ts +4 -0
  176. package/dist/routes/workspaces.d.ts +11 -2
  177. package/dist/sandbox/agent-update.d.ts +64 -0
  178. package/dist/sandbox/auth-callout.d.ts +8 -0
  179. package/dist/sandbox/channel-a.d.ts +15 -1
  180. package/dist/sandbox/enrollment.d.ts +26 -4
  181. package/dist/sandbox/machine-audience.d.ts +29 -0
  182. package/dist/sandbox/machines.d.ts +15 -2
  183. package/dist/sandbox/metrics-ingestion.d.ts +6 -2
  184. package/dist/sandbox/screen-control.d.ts +85 -0
  185. package/dist/sandbox/viewer.d.ts +5 -1
  186. package/dist/sandbox-file-artifacts.d.ts +17 -1
  187. package/dist/scheduled-task-blockers.d.ts +39 -0
  188. package/dist/scheduled-task-deletion.d.ts +3 -4
  189. package/dist/scheduled-task-lifecycle.d.ts +14 -0
  190. package/dist/secret-answers.d.ts +40 -0
  191. package/dist/session-create-observability.d.ts +5 -0
  192. package/dist/session-event-view-36GO3IL7.js +528 -0
  193. package/dist/session-event-view-36GO3IL7.js.map +1 -0
  194. package/dist/signed-state-secret.d.ts +18 -0
  195. package/dist/site-agent-guard.d.ts +53 -0
  196. package/dist/site-data/operations.d.ts +103 -0
  197. package/dist/site-data/service.d.ts +203 -0
  198. package/dist/site-frame-guard.d.ts +32 -0
  199. package/dist/site-publishing/agent-data-tools.d.ts +84 -0
  200. package/dist/site-publishing/agent-model.d.ts +58 -0
  201. package/dist/site-publishing/agent-session.d.ts +16 -0
  202. package/dist/site-publishing/content-scanner.d.ts +31 -0
  203. package/dist/site-publishing/edge-sync.d.ts +48 -0
  204. package/dist/site-publishing/gateway-signature.d.ts +56 -0
  205. package/dist/site-publishing/limits.d.ts +63 -0
  206. package/dist/site-publishing/page-tool-authority.d.ts +30 -0
  207. package/dist/site-publishing/platform-usage.d.ts +113 -0
  208. package/dist/site-publishing/platform.d.ts +21 -0
  209. package/dist/site-publishing/readiness.d.ts +62 -0
  210. package/dist/site-publishing/runtime.d.ts +179 -0
  211. package/dist/site-publishing/service.d.ts +264 -0
  212. package/dist/site-publishing/session-events.d.ts +22 -0
  213. package/dist/site-publishing/session-views.d.ts +36 -0
  214. package/dist/site-publishing/viewer.d.ts +40 -0
  215. package/dist/site-session-origin.d.ts +31 -6
  216. package/dist/site-sql/format.d.ts +47 -0
  217. package/dist/site-sql/gateway.d.ts +50 -0
  218. package/dist/site-sql/service.d.ts +213 -0
  219. package/dist/temporal-schedule-sync.d.ts +26 -0
  220. package/dist/transcription/billing-refusal.d.ts +8 -0
  221. package/dist/transcription/normalize.d.ts +23 -0
  222. package/dist/transcription/providers/azure-mai.d.ts +12 -0
  223. package/dist/transcription/providers/azure-openai.d.ts +4 -0
  224. package/dist/transcription/providers/openai.d.ts +16 -0
  225. package/dist/transcription/providers/subscription-core.d.ts +39 -0
  226. package/dist/transcription/service.d.ts +10 -1
  227. package/dist/transcription/wav-duration.d.ts +8 -0
  228. package/dist/workspace-tool-gateway-attestations.d.ts +37 -0
  229. package/dist/workspace-tool-gateway-observability.d.ts +16 -0
  230. package/dist/workspace-tool-gateway-secrets.d.ts +27 -0
  231. package/dist/workspace-tool-gateway.d.ts +102 -6
  232. package/dist/workspace-tool-target-fence.d.ts +116 -0
  233. package/dist/workspace-tool-target.d.ts +225 -0
  234. package/dist/workspace-webhook-dispatch.d.ts +26 -0
  235. package/dist/xai-subscription-core.d.ts +60 -0
  236. package/package.json +25 -20
  237. package/src/access-grant-rls.ts +64 -14
  238. package/src/admission-trace.ts +14 -0
  239. package/src/app.ts +1684 -252
  240. package/src/artifact-catalog-cursor.ts +1 -0
  241. package/src/attached-browser-viewer.ts +26 -0
  242. package/src/auth/managed-auth-attempt-context.ts +9 -0
  243. package/src/auth/managed-auth-rate-limits.ts +252 -0
  244. package/src/auth/managed-auth-session-adapter.ts +64 -29
  245. package/src/auth/managed-auth.ts +303 -35
  246. package/src/auth/managed-email.ts +18 -1
  247. package/src/auth/managed-sign-in-notifications.ts +81 -0
  248. package/src/auth/new-signups-gate.ts +49 -0
  249. package/src/auth/organization-user-setup.ts +3 -3
  250. package/src/auth/signup-funnel-metrics.ts +164 -0
  251. package/src/azure-live.ts +103 -0
  252. package/src/browser-action-fences.ts +45 -0
  253. package/src/browser-controller-authority.ts +1 -186
  254. package/src/browser-ephemeral.ts +39 -0
  255. package/src/browser-lost-runtime-end.ts +71 -0
  256. package/src/browser-state-authority.ts +1 -236
  257. package/src/claude-default-models.ts +37 -0
  258. package/src/claude-subscription-core.ts +154 -0
  259. package/src/claude-subscription-oauth.ts +352 -0
  260. package/src/claude-subscription-profile.ts +73 -0
  261. package/src/claude-subscription-usage.ts +51 -0
  262. package/src/claude-workspace-connection.ts +82 -0
  263. package/src/codemode.ts +236 -39
  264. package/src/codex-realtime.ts +181 -53
  265. package/src/codex-session-pointers.ts +80 -0
  266. package/src/company-brain-okf.ts +1 -1
  267. package/src/connected-machine-computer-access.ts +2 -1
  268. package/src/connection-ownership.ts +19 -13
  269. package/src/controller-data-plane.ts +34 -0
  270. package/src/credit-promotion-snapshot.ts +36 -0
  271. package/src/editable-artifact-production.ts +10 -0
  272. package/src/editable-artifact-source-session.ts +123 -0
  273. package/src/editable-artifact-websocket.ts +16 -3
  274. package/src/fatal-process-boundary.ts +67 -3
  275. package/src/gateway-realtime.ts +12 -8
  276. package/src/github-access.ts +31 -5
  277. package/src/github-browser-flow.ts +1 -1
  278. package/src/http/acting-person.ts +105 -0
  279. package/src/http/api-contract-compat.ts +49 -0
  280. package/src/http/api-error.ts +210 -2
  281. package/src/http/auth.ts +68 -4
  282. package/src/http/cors.ts +37 -5
  283. package/src/http/deprecation.ts +118 -0
  284. package/src/http/keyed-admission.ts +29 -0
  285. package/src/http/local-browser-boundary.ts +343 -0
  286. package/src/http/metrics-listener.ts +57 -0
  287. package/src/http/path-identifier.ts +54 -0
  288. package/src/http/registered-route-label.ts +34 -0
  289. package/src/http/rejection-telemetry.ts +120 -0
  290. package/src/http/request-body.ts +127 -0
  291. package/src/http/request-source.ts +154 -13
  292. package/src/http/sse.ts +88 -28
  293. package/src/http/unmatched-route.ts +60 -0
  294. package/src/http/user-content.ts +158 -0
  295. package/src/http/variable-sets-removed.ts +122 -0
  296. package/src/http/websocket-upgrade-dispatch.ts +29 -0
  297. package/src/index.ts +107 -57
  298. package/src/integration-connect-metrics.ts +228 -0
  299. package/src/integration-endpoint-test.ts +291 -0
  300. package/src/integrations/api-integrations.ts +81 -7
  301. package/src/integrations/atlassian.ts +202 -83
  302. package/src/integrations/fiken.ts +66 -38
  303. package/src/integrations/github-app-connect.ts +64 -18
  304. package/src/integrations/github-lens-connect.ts +8 -29
  305. package/src/integrations/google-drive.ts +448 -152
  306. package/src/integrations/integration-commit-authority.ts +69 -0
  307. package/src/integrations/marketplace-plugin.ts +1 -1
  308. package/src/integrations/oauth-client.ts +733 -193
  309. package/src/integrations/oauth-profiles.ts +116 -45
  310. package/src/integrations/onepassword-vault-provider.ts +16 -0
  311. package/src/integrations/personal-github-repositories.ts +1 -1
  312. package/src/integrations/personal-github.ts +61 -35
  313. package/src/integrations/provider-oauth.ts +67 -85
  314. package/src/integrations/slack-app-home.ts +5 -5
  315. package/src/integrations/slack-bot.ts +893 -201
  316. package/src/integrations/slack-file-upload-flow.ts +147 -0
  317. package/src/integrations/slack-install.ts +7 -7
  318. package/src/integrations/slack-interactions.ts +1589 -299
  319. package/src/integrations/slack-mrkdwn.ts +193 -0
  320. package/src/integrations/slack-routing.ts +2 -2
  321. package/src/integrations/slack-session-defaults.ts +224 -0
  322. package/src/integrations/slack-task-file-upload.ts +323 -0
  323. package/src/integrations/slack-tool-review.ts +65 -0
  324. package/src/integrations/social-oauth.ts +90 -58
  325. package/src/interaction-agent-access.ts +40 -20
  326. package/src/interaction-agent-version.ts +85 -0
  327. package/src/interaction-holder-heartbeat.ts +24 -8
  328. package/src/interaction-metrics.ts +164 -2
  329. package/src/interaction-route-stages.ts +94 -0
  330. package/src/interaction-secrets-vault.ts +213 -0
  331. package/src/interaction-secrets.ts +426 -0
  332. package/src/mcp/action-catalog-types.ts +14 -0
  333. package/src/mcp/action-catalog.gen.ts +8014 -0
  334. package/src/mcp/action-descriptions.ts +299 -0
  335. package/src/mcp/action-schema-imports.gen.ts +304 -0
  336. package/src/mcp/capability-account-readiness.ts +17 -0
  337. package/src/mcp/child-read-evidence.ts +19 -0
  338. package/src/mcp/company-profile-agent-admin.ts +13 -0
  339. package/src/mcp/contract-input.ts +165 -0
  340. package/src/mcp/documents.ts +9 -2
  341. package/src/mcp/editable-artifacts.ts +29 -11
  342. package/src/mcp/files.ts +5 -1
  343. package/src/mcp/first-party-tool-permissions.ts +7 -285
  344. package/src/mcp/knowledge-entries.ts +108 -34
  345. package/src/mcp/notification-tools.ts +480 -0
  346. package/src/mcp/orchestration-failure-diagnostic.ts +43 -0
  347. package/src/mcp/scheduled-task-input.ts +89 -0
  348. package/src/mcp/scheduled-task-view.ts +63 -3
  349. package/src/mcp/secret-tools.ts +185 -0
  350. package/src/mcp/server.ts +2213 -1116
  351. package/src/mcp/session-admin-access-tools.ts +163 -0
  352. package/src/mcp/session-event-errors.ts +123 -0
  353. package/src/mcp/session-event-view.ts +395 -13
  354. package/src/mcp/session-view.ts +3 -0
  355. package/src/mcp/session-wait.ts +67 -7
  356. package/src/mcp/site-agent-clamp-tools.ts +140 -0
  357. package/src/mcp/site-data-tools.ts +339 -0
  358. package/src/mcp/site-publication-tools.ts +201 -0
  359. package/src/mcp/site-sql-tools.ts +427 -0
  360. package/src/mcp-oauth.ts +635 -45
  361. package/src/model-calls/chat-completions.ts +352 -0
  362. package/src/model-calls/pending-usage-settlements.ts +125 -0
  363. package/src/model-calls/service.ts +694 -0
  364. package/src/model-catalog.ts +68 -17
  365. package/src/native-push-dispatch.ts +457 -0
  366. package/src/observability.ts +15 -1
  367. package/src/organization-mcp.ts +485 -0
  368. package/src/prepared-mcp-actor.ts +154 -0
  369. package/src/prepared-mcp-permissions.ts +38 -0
  370. package/src/routes/analytics-consent.ts +123 -0
  371. package/src/routes/api-integrations.ts +268 -9
  372. package/src/routes/api-keys.ts +164 -25
  373. package/src/routes/artifact-catalog.ts +111 -0
  374. package/src/routes/automations.ts +163 -90
  375. package/src/routes/billing.ts +535 -59
  376. package/src/routes/browser-sessions.ts +966 -342
  377. package/src/routes/canonical-human-identities.ts +61 -0
  378. package/src/routes/capabilities.ts +112 -5
  379. package/src/routes/channels.ts +4 -3
  380. package/src/routes/chat-completions.ts +235 -0
  381. package/src/routes/claude-core-usage.ts +147 -0
  382. package/src/routes/claude-subscription-accounts.ts +233 -0
  383. package/src/routes/claude-subscription-oauth.ts +175 -0
  384. package/src/routes/client-errors.ts +394 -0
  385. package/src/routes/codex-core.ts +687 -0
  386. package/src/routes/codex.ts +1277 -1119
  387. package/src/routes/company-brain.ts +4 -0
  388. package/src/routes/computer-sessions.ts +319 -85
  389. package/src/routes/connect.ts +277 -175
  390. package/src/routes/connections.ts +690 -363
  391. package/src/routes/desktop-distribution.ts +217 -0
  392. package/src/routes/documents.ts +13 -7
  393. package/src/routes/editable-artifacts.ts +74 -4
  394. package/src/routes/enrollments.ts +110 -16
  395. package/src/routes/external-identity-links.ts +13 -12
  396. package/src/routes/files.ts +41 -16
  397. package/src/routes/github-browser-fonts.gen.ts +12 -0
  398. package/src/routes/github-browser-pages.ts +258 -0
  399. package/src/routes/github.ts +200 -75
  400. package/src/routes/inbox.ts +353 -0
  401. package/src/routes/insights-response-cache.ts +83 -0
  402. package/src/routes/insights-usage.ts +345 -0
  403. package/src/routes/insights.ts +103 -8
  404. package/src/routes/install.ts +51 -10
  405. package/src/routes/integration-facets.ts +70 -28
  406. package/src/routes/interaction-placement-message.ts +12 -0
  407. package/src/routes/knowledge.ts +136 -27
  408. package/src/routes/machines.ts +189 -135
  409. package/src/routes/managed-auth-session-sets.ts +43 -10
  410. package/src/routes/managed-onboarding.ts +39 -19
  411. package/src/routes/managed-sign-in-methods.ts +433 -0
  412. package/src/routes/memory-slack-publications.ts +3 -2
  413. package/src/routes/model-account-choice.ts +194 -0
  414. package/src/routes/model-account-settings.ts +235 -0
  415. package/src/routes/model-connection-access.ts +210 -48
  416. package/src/routes/native-app-auth.ts +296 -0
  417. package/src/routes/organization-integration-policy.ts +116 -0
  418. package/src/routes/organization-integrations.ts +326 -0
  419. package/src/routes/organization-mcp-connections.ts +183 -0
  420. package/src/routes/organization-memberships.ts +205 -19
  421. package/src/routes/organization-model-defaults.ts +110 -0
  422. package/src/routes/organization-model-providers.ts +74 -3
  423. package/src/routes/organization-service-accounts.ts +128 -0
  424. package/src/routes/organization-sessions.ts +21 -5
  425. package/src/routes/personal-api-keys.ts +184 -0
  426. package/src/routes/personal-github-git-broker.ts +2 -2
  427. package/src/routes/personal-github.ts +9 -4
  428. package/src/routes/plugins.ts +46 -7
  429. package/src/routes/pr-review-github.ts +105 -118
  430. package/src/routes/pr-review.ts +88 -82
  431. package/src/routes/preference-registry.ts +18 -0
  432. package/src/routes/rigs.ts +48 -13
  433. package/src/routes/scheduled-tasks.ts +347 -27
  434. package/src/routes/session-admin-access.ts +271 -0
  435. package/src/routes/session-artifact-associations.ts +164 -0
  436. package/src/routes/session-history-imports.ts +305 -0
  437. package/src/routes/sessions.ts +1682 -363
  438. package/src/routes/site-data.ts +340 -0
  439. package/src/routes/site-publishing.ts +584 -0
  440. package/src/routes/site-runtime.ts +1944 -0
  441. package/src/routes/site-sql.ts +263 -0
  442. package/src/routes/skill-content.ts +72 -7
  443. package/src/routes/skills.ts +5 -4
  444. package/src/routes/slack-bot-access.ts +108 -0
  445. package/src/routes/social.ts +27 -15
  446. package/src/routes/subscription-account-pools.ts +209 -0
  447. package/src/routes/subscription-core-http.ts +18 -0
  448. package/src/routes/subscription-pool-access.ts +180 -0
  449. package/src/routes/subscription-pool-core.ts +552 -0
  450. package/src/routes/supergrok.ts +174 -655
  451. package/src/routes/transcription-recordings.ts +71 -4
  452. package/src/routes/transcriptions.ts +26 -2
  453. package/src/routes/usage-allowances.ts +381 -0
  454. package/src/routes/variable-sets-removed.ts +19 -0
  455. package/src/routes/vault-providers.ts +782 -0
  456. package/src/routes/vaults.ts +421 -0
  457. package/src/routes/video-generation.ts +30 -12
  458. package/src/routes/workspace-artifacts.ts +165 -53
  459. package/src/routes/workspace-integrations.ts +576 -0
  460. package/src/routes/workspace-model-providers.ts +148 -0
  461. package/src/routes/workspace-state.ts +4 -0
  462. package/src/routes/workspaces.ts +625 -117
  463. package/src/sandbox/agent-update.ts +315 -0
  464. package/src/sandbox/auth-callout.ts +104 -21
  465. package/src/sandbox/channel-a.ts +150 -49
  466. package/src/sandbox/enrollment.ts +131 -22
  467. package/src/sandbox/machine-audience.ts +192 -0
  468. package/src/sandbox/machines.ts +75 -31
  469. package/src/sandbox/metrics-ingestion.ts +133 -2
  470. package/src/sandbox/rematerialize.ts +51 -21
  471. package/src/sandbox/screen-control.ts +289 -0
  472. package/src/sandbox/viewer.ts +33 -58
  473. package/src/sandbox-file-artifacts.ts +53 -27
  474. package/src/scheduled-task-blockers.ts +293 -0
  475. package/src/scheduled-task-deletion.ts +13 -3
  476. package/src/scheduled-task-lifecycle.ts +84 -0
  477. package/src/secret-answers.ts +119 -0
  478. package/src/session-create-observability.ts +46 -0
  479. package/src/session-realtime-context.ts +26 -4
  480. package/src/signed-state-secret.ts +58 -0
  481. package/src/site-agent-guard.ts +261 -0
  482. package/src/site-data/operations.ts +777 -0
  483. package/src/site-data/service.ts +1043 -0
  484. package/src/site-frame-guard.ts +107 -0
  485. package/src/site-publishing/agent-data-tools.ts +250 -0
  486. package/src/site-publishing/agent-model.ts +127 -0
  487. package/src/site-publishing/agent-session.ts +148 -0
  488. package/src/site-publishing/content-scanner.ts +93 -0
  489. package/src/site-publishing/edge-sync.ts +148 -0
  490. package/src/site-publishing/gateway-signature.ts +198 -0
  491. package/src/site-publishing/limits.ts +315 -0
  492. package/src/site-publishing/page-tool-authority.ts +111 -0
  493. package/src/site-publishing/platform-usage.ts +479 -0
  494. package/src/site-publishing/platform.ts +98 -0
  495. package/src/site-publishing/readiness.ts +330 -0
  496. package/src/site-publishing/runtime.ts +831 -0
  497. package/src/site-publishing/service.ts +1282 -0
  498. package/src/site-publishing/session-events.ts +262 -0
  499. package/src/site-publishing/session-views.ts +262 -0
  500. package/src/site-publishing/viewer.ts +75 -0
  501. package/src/site-session-origin.ts +91 -6
  502. package/src/site-sql/format.ts +134 -0
  503. package/src/site-sql/gateway.ts +168 -0
  504. package/src/site-sql/service.ts +1636 -0
  505. package/src/site-uploads.ts +27 -5
  506. package/src/temporal-schedule-sync.ts +74 -0
  507. package/src/transcription/billing-refusal.ts +14 -0
  508. package/src/transcription/normalize.ts +77 -0
  509. package/src/transcription/providers/azure-mai.ts +98 -0
  510. package/src/transcription/providers/azure-openai.ts +16 -7
  511. package/src/transcription/providers/codex-subscription.ts +190 -67
  512. package/src/transcription/providers/openai.ts +79 -5
  513. package/src/transcription/providers/subscription-core.ts +125 -0
  514. package/src/transcription/providers/xai-subscription.ts +81 -83
  515. package/src/transcription/segmenter.ts +7 -1
  516. package/src/transcription/service.ts +239 -10
  517. package/src/transcription/wav-duration.ts +39 -0
  518. package/src/workspace-deletion.ts +25 -1
  519. package/src/workspace-tool-gateway-attestations.ts +133 -0
  520. package/src/workspace-tool-gateway-observability.ts +64 -0
  521. package/src/workspace-tool-gateway-secrets.ts +104 -0
  522. package/src/workspace-tool-gateway.ts +921 -103
  523. package/src/workspace-tool-target-fence.ts +380 -0
  524. package/src/workspace-tool-target.ts +554 -0
  525. package/src/workspace-webhook-dispatch.ts +225 -0
  526. package/src/xai-realtime.ts +85 -81
  527. package/src/xai-subscription-core.ts +172 -0
  528. package/dist/browser-auth-broker.d.ts +0 -20
  529. package/dist/chunk-AJ62T5QN.js.map +0 -1
  530. package/dist/connection-authority-owner.d.ts +0 -59
  531. package/dist/routes/connection-authorities.d.ts +0 -3
  532. package/dist/routes/environments.d.ts +0 -5
  533. package/dist/routes/host-mcp-bindings.d.ts +0 -5
  534. package/dist/routes/host-mcp-resolvers.d.ts +0 -3
  535. package/dist/routes/packs.d.ts +0 -3
  536. package/dist/session-event-view-MU3HMNV3.js +0 -264
  537. package/dist/session-event-view-MU3HMNV3.js.map +0 -1
  538. package/dist/xai-subscription-auth.d.ts +0 -23
  539. package/src/browser-auth-broker.ts +0 -155
  540. package/src/connection-authority-owner.ts +0 -61
  541. package/src/routes/connection-authorities.ts +0 -139
  542. package/src/routes/environments.ts +0 -388
  543. package/src/routes/host-mcp-bindings.ts +0 -122
  544. package/src/routes/host-mcp-resolvers.ts +0 -41
  545. package/src/routes/packs.ts +0 -784
  546. package/src/xai-subscription-auth.ts +0 -139
@@ -1,7 +1,17 @@
1
+ import {
2
+ normalizeSlackScopes,
3
+ OPENGENI_SLACK_REST_USER_SCOPES,
4
+ slackRestMcpToolsForScopes,
5
+ } from "@opengeni/contracts/slack-rest-mcp";
1
6
  import { OPENGENI_PERSONAL_SLACK_MCP_URL, type ConnectionOwnership } from "@opengeni/contracts";
2
7
  import type { Settings } from "@opengeni/config";
3
8
  import { HTTPException } from "hono/http-exception";
4
9
  import { z } from "zod";
10
+ import {
11
+ GMAIL_REST_MCP_TOOLS,
12
+ gmailToolAvailableOnDeployment,
13
+ gmailToolSupportsScopes,
14
+ } from "@opengeni/runtime/gmail-rest-mcp";
5
15
  import { canonicalProviderDomain } from "./provider-domain";
6
16
 
7
17
  /**
@@ -16,10 +26,9 @@ import { canonicalProviderDomain } from "./provider-domain";
16
26
  *
17
27
  * Profiles come from two layers:
18
28
  *
19
- * 1. Built-in profiles below, for the providers whose fences are security
20
- * invariants (hosted Slack MCP and official Gmail are personal-only, their
21
- * authorization servers are origin-pinned). These live in code as data so
22
- * the fences never depend on catalog import state.
29
+ * 1. Built-in profiles pin known authorization servers and protocol quirks.
30
+ * Ownership defaults guide setup; users may choose personal or workspace.
31
+ * Authorization-server pins never depend on catalog import state.
23
32
  * 2. A validated `oauthProfile` object on a global catalog row (curated
24
33
  * overlay -> importer -> `capability_catalog_items.metadata`). A catalog
25
34
  * profile applies only when no built-in matches, and it can only narrow the
@@ -81,10 +90,10 @@ export type OAuthProviderProfile = {
81
90
  requireExactMcpUrl?: { url: string; message: string };
82
91
  /** Deployment-managed client credentials must be configured (503 otherwise). */
83
92
  requireDeploymentClient?: { key: DeploymentManagedClientKey; message: string };
84
- /** Ownerships a connection may take; a singleton also sets the default. */
85
- allowedOwnership: readonly ConnectionOwnership[];
86
- /** Exact 422 message when an explicit disallowed ownership is requested. */
87
- ownershipMessage?: string;
93
+ /** Suggested ownership; explicit choices remain subject to requiredOwnership. */
94
+ defaultOwnership?: ConnectionOwnership;
95
+ /** Built-in-only ownership restriction, including old reconnect/callback state. */
96
+ requiredOwnership?: { ownership: ConnectionOwnership; message: string };
88
97
  /** Bind reconnect/dedupe to the exact mcpUrl, not just the provider domain. */
89
98
  exactMcpBinding: boolean;
90
99
  /** How an existing connection is chosen for reconnect coalescing. */
@@ -108,12 +117,35 @@ export type OAuthProviderProfile = {
108
117
  extraAuthorizeParams?: Readonly<Record<string, string>>;
109
118
  /** Exact scope override; the caller can never widen past it. */
110
119
  requestedScopes?: readonly string[];
120
+ /** Reviewed local bridge grant normalization and token verification. Catalog profiles cannot supply code. */
121
+ normalizeGrantedScopes?: (scopes: readonly string[] | string) => string[];
122
+ reportedScopesRequired?: boolean;
123
+ /** Built-in durable API bridges may refuse a new grant without offline access. */
124
+ freshRefreshTokenRequired?: boolean;
125
+ /** The reviewed bridge exposes one tool contract, not a partial-scope variant. */
126
+ fullRequestedScopesRequired?: boolean;
127
+ /** Built-in web OAuth clients must use a configured secret and provider-supported authentication. */
128
+ confidentialClientRequired?: boolean;
129
+ /** Built-in API bridge discovery; catalog metadata cannot redirect this seam. */
130
+ providerOAuthDiscovery?: { issuer: string; metadataUrl: string };
131
+ localToolVerification?: {
132
+ url: string;
133
+ method?: "GET" | "POST";
134
+ /** An API bridge may require a verified account before accepting a grant. */
135
+ required?: boolean;
136
+ /** Distinguish a rejected OAuth grant from a temporary verification failure. */
137
+ isRejectedGrant?: (payload: Record<string, unknown>) => boolean;
138
+ validateIdentity: (payload: Record<string, unknown>) => Record<string, string>;
139
+ toolsForScopes: (
140
+ scopes: readonly string[],
141
+ deployment: { gmailWatchTopicName?: string | undefined },
142
+ ) => Array<{ name: string; description?: string }>;
143
+ };
111
144
  };
112
145
 
113
146
  export const DEFAULT_OAUTH_PROFILE: OAuthProviderProfile = {
114
147
  key: "default",
115
148
  match: {},
116
- allowedOwnership: ["workspace", "personal"],
117
149
  exactMcpBinding: false,
118
150
  connectionSelection: "first_active",
119
151
  sendResourceParameter: true,
@@ -138,9 +170,6 @@ const HOSTED_SLACK_PROFILE: OAuthProviderProfile = {
138
170
  key: "slack",
139
171
  message: "Slack MCP OAuth requires OPENGENI_SLACK_CLIENT_ID and OPENGENI_SLACK_CLIENT_SECRET",
140
172
  },
141
- allowedOwnership: ["personal"],
142
- ownershipMessage:
143
- "Slack's hosted MCP connection is personal only; install the OpenGeni Slack bot for workspace access",
144
173
  exactMcpBinding: true,
145
174
  connectionSelection: "canonical_personal",
146
175
  authorizationServer: {
@@ -151,14 +180,51 @@ const HOSTED_SLACK_PROFILE: OAuthProviderProfile = {
151
180
  skipInLocalTest: true,
152
181
  },
153
182
  sendResourceParameter: true,
183
+ requestedScopes: OPENGENI_SLACK_REST_USER_SCOPES,
184
+ normalizeGrantedScopes: normalizeSlackScopes,
185
+ reportedScopesRequired: true,
186
+ localToolVerification: {
187
+ url: "https://slack.com/api/auth.test",
188
+ isRejectedGrant: (payload) =>
189
+ payload.ok === false &&
190
+ ["invalid_auth", "not_authed", "token_revoked", "account_inactive", "token_expired"].includes(
191
+ typeof payload.error === "string" ? payload.error : "",
192
+ ),
193
+ validateIdentity: (payload) => {
194
+ if (
195
+ payload.ok !== true ||
196
+ typeof payload.team_id !== "string" ||
197
+ !payload.team_id ||
198
+ typeof payload.user_id !== "string" ||
199
+ !payload.user_id ||
200
+ payload.bot_id
201
+ ) {
202
+ throw new Error("Slack account verification failed");
203
+ }
204
+ return {
205
+ slackTeamId: payload.team_id,
206
+ slackUserId: payload.user_id,
207
+ ...(typeof payload.team === "string" && payload.team.trim()
208
+ ? { slackTeamName: payload.team }
209
+ : {}),
210
+ ...(typeof payload.user === "string" && payload.user.trim()
211
+ ? { slackUserName: payload.user }
212
+ : {}),
213
+ };
214
+ },
215
+ toolsForScopes: slackRestMcpToolsForScopes,
216
+ },
154
217
  };
155
218
 
156
219
  const OFFICIAL_GMAIL_PROFILE: OAuthProviderProfile = {
157
220
  key: "official-gmail",
158
221
  match: { mcpUrls: [OFFICIAL_GMAIL_MCP_URL] },
159
- allowedOwnership: ["personal"],
160
- ownershipMessage:
161
- "Gmail connections are personal only; each workspace member must connect their own mailbox",
222
+ requireExactMcpUrl: {
223
+ url: OFFICIAL_GMAIL_MCP_URL,
224
+ message: `Gmail OAuth must use ${OFFICIAL_GMAIL_MCP_URL}`,
225
+ },
226
+ defaultOwnership: "personal",
227
+ requiredOwnership: { ownership: "personal", message: "Gmail connections must be personal-owned" },
162
228
  exactMcpBinding: true,
163
229
  connectionSelection: "first_active",
164
230
  authorizationServer: {
@@ -185,6 +251,37 @@ const OFFICIAL_GMAIL_PROFILE: OAuthProviderProfile = {
185
251
  // The Gmail PRM advertises broader grants, including full-mail access. The
186
252
  // reviewed connector never lets a caller widen the capability contract.
187
253
  requestedScopes: OFFICIAL_GMAIL_MCP_SCOPES,
254
+ reportedScopesRequired: true,
255
+ freshRefreshTokenRequired: true,
256
+ fullRequestedScopesRequired: true,
257
+ confidentialClientRequired: true,
258
+ providerOAuthDiscovery: {
259
+ issuer: GOOGLE_OAUTH_ISSUER_ORIGIN,
260
+ metadataUrl: `${GOOGLE_OAUTH_ISSUER_ORIGIN}/.well-known/openid-configuration`,
261
+ },
262
+ localToolVerification: {
263
+ url: "https://gmail.googleapis.com/gmail/v1/users/me/profile",
264
+ method: "GET",
265
+ required: true,
266
+ validateIdentity: (payload) => {
267
+ if (
268
+ typeof payload.emailAddress !== "string" ||
269
+ !/^[^\s@]+@[^\s@]+$/u.test(payload.emailAddress)
270
+ ) {
271
+ throw new Error("Gmail account verification failed");
272
+ }
273
+ return { gmailEmail: payload.emailAddress };
274
+ },
275
+ toolsForScopes: (scopes, deployment) => {
276
+ return GMAIL_REST_MCP_TOOLS.filter(
277
+ (tool) =>
278
+ gmailToolSupportsScopes(tool.name, scopes) &&
279
+ gmailToolAvailableOnDeployment(tool.name, {
280
+ watchTopicName: deployment.gmailWatchTopicName,
281
+ }),
282
+ ).map(({ name, description }) => ({ name, ...(description ? { description } : {}) }));
283
+ },
284
+ },
188
285
  };
189
286
 
190
287
  const BUILT_IN_OAUTH_PROFILES: readonly OAuthProviderProfile[] = [
@@ -285,24 +382,7 @@ export function builtInOAuthProfileFor(input: {
285
382
 
286
383
  /** Ownership an omitted request defaults to under a profile. */
287
384
  export function defaultOwnershipFor(profile: OAuthProviderProfile): ConnectionOwnership {
288
- return profile.allowedOwnership.length === 1 && profile.allowedOwnership[0] === "personal"
289
- ? "personal"
290
- : "workspace";
291
- }
292
-
293
- /** Rejects an ownership outside the profile's allowed set with its exact message. */
294
- export function assertOwnershipAllowed(
295
- profile: OAuthProviderProfile,
296
- ownership: ConnectionOwnership,
297
- ): void {
298
- if (profile.allowedOwnership.includes(ownership)) {
299
- return;
300
- }
301
- throw new HTTPException(422, {
302
- message:
303
- profile.ownershipMessage ??
304
- `this integration allows only ${profile.allowedOwnership.join(" or ")} connections`,
305
- });
385
+ return profile.defaultOwnership ?? "workspace";
306
386
  }
307
387
 
308
388
  /** Enforces a profile's authorization-server origin pins with its exact message. */
@@ -375,10 +455,7 @@ export const catalogOAuthProfileSchema = z
375
455
  pinnedIssuerOrigins: z.array(z.string().url()).min(1).optional(),
376
456
  pinnedEndpointOrigins: z.array(z.string().url()).min(1).optional(),
377
457
  sendResourceParameter: z.boolean().optional(),
378
- allowedOwnership: z
379
- .array(z.enum(["personal", "workspace"]))
380
- .min(1)
381
- .optional(),
458
+ defaultOwnership: z.enum(["personal", "workspace"]).optional(),
382
459
  requestedScopes: z.array(z.string().min(1)).min(1).optional(),
383
460
  extraAuthorizeParams: z
384
461
  .record(z.string(), z.string())
@@ -425,7 +502,7 @@ export function catalogMcpUrlKey(value: string): string {
425
502
  *
426
503
  * A present-but-invalid profile fails closed with a 422: the row's operator
427
504
  * declared constraints, and silently degrading to the default profile would
428
- * drop an ownership fence or origin pin on a JSON typo.
505
+ * drop an origin pin on a JSON typo.
429
506
  */
430
507
  export function oauthProfileFromCatalog(mcpUrl: string, raw: unknown): OAuthProviderProfile {
431
508
  const parsed = catalogOAuthProfileSchema.safeParse(raw);
@@ -451,13 +528,7 @@ export function oauthProfileFromCatalog(mcpUrl: string, raw: unknown): OAuthProv
451
528
  return {
452
529
  key: `catalog:${mcpUrl}`,
453
530
  match: { mcpUrls: [mcpUrl] },
454
- allowedOwnership: data.allowedOwnership ?? DEFAULT_OAUTH_PROFILE.allowedOwnership,
455
- ...(data.allowedOwnership && !data.allowedOwnership.includes("workspace")
456
- ? {
457
- ownershipMessage:
458
- "this integration allows only personal connections; each workspace member must connect their own account",
459
- }
460
- : {}),
531
+ ...(data.defaultOwnership ? { defaultOwnership: data.defaultOwnership } : {}),
461
532
  exactMcpBinding: Boolean(data.exactMcpUrl),
462
533
  ...(data.exactMcpUrl
463
534
  ? {
@@ -0,0 +1,16 @@
1
+ import type { OnePasswordVaultProviderFactory } from "@opengeni/core";
2
+
3
+ /**
4
+ * Loads the 1Password adapter (and its ~14 MB WASM SDK) only when a request
5
+ * first touches 1Password. The only allowed import edge, besides apps/worker,
6
+ * is this dynamic one (OP-5, packages/vaults-onepassword/test/import-guard.test.ts).
7
+ */
8
+ export const loadOnePasswordVaultProvider: OnePasswordVaultProviderFactory = async (input) => {
9
+ const { vaultProviderForOnePasswordConnection } = await import("@opengeni/vaults-onepassword");
10
+ return vaultProviderForOnePasswordConnection(input);
11
+ };
12
+
13
+ /** The offline token check and connection-scoped provider used by the install route. */
14
+ export async function loadOnePasswordModule() {
15
+ return await import("@opengeni/vaults-onepassword");
16
+ }
@@ -592,7 +592,7 @@ async function personalGitHubProviderFetch(
592
592
  headers: {
593
593
  accept: "application/vnd.github+json",
594
594
  authorization,
595
- "user-agent": "OpenGeni",
595
+ "user-agent": "Opengeni",
596
596
  "x-github-api-version": GITHUB_API_VERSION,
597
597
  },
598
598
  signal: AbortSignal.timeout(GITHUB_REQUEST_TIMEOUT_MS),
@@ -1,3 +1,5 @@
1
+ import { withOrganizationIntegrationAcquisition } from "@opengeni/db/organization-integration-policy";
2
+ import { claimOAuthAcquisition, finishOAuthAcquisition } from "./oauth-client";
1
3
  import { createHash, randomBytes, randomUUID } from "node:crypto";
2
4
  import { ExternalActorContinuation } from "@opengeni/contracts/external-identities";
3
5
  import { requireConnectOwnerAuthority } from "./connect-authority";
@@ -23,7 +25,6 @@ import {
23
25
  } from "@opengeni/core";
24
26
  import {
25
27
  consumeIntegrationOAuthStateNonce,
26
- claimConnectOperation,
27
28
  finishConnectOperation,
28
29
  getConnectAttempt,
29
30
  type Database,
@@ -47,8 +48,10 @@ import {
47
48
  } from "../connection-ownership";
48
49
  import {
49
50
  integrationBaseUrl,
51
+ oauthStateFailureReturn,
50
52
  oauthStateTtlMs,
51
53
  requireIntegrationsStateSecret,
54
+ workspaceIntegrationsPath,
52
55
  } from "./oauth-client";
53
56
 
54
57
  const PERSONAL_GITHUB_OAUTH_STATE_KIND = "personal_github_oauth";
@@ -216,6 +219,7 @@ export async function startPersonalGitHubOAuth(
216
219
  ) {
217
220
  const oauth = requirePersonalGitHubOAuthSettings(deps.settings);
218
221
  const { grant } = input.access;
222
+ await withOrganizationIntegrationAcquisition(deps.db, grant, ["github-personal"], async () => {});
219
223
  const existing = input.connectionId
220
224
  ? await getConnectionMetadata(deps.db, input.workspaceId, input.connectionId, grant.subjectId)
221
225
  : null;
@@ -301,12 +305,18 @@ export async function completePersonalGitHubOAuthCallback(
301
305
  operationId: `oauth:${state.nonce}`,
302
306
  inputDigest: createHash("sha256").update(input.state!).digest("hex"),
303
307
  };
304
- const claim = await claimConnectOperation(deps.db, state, {
305
- ...operation,
306
- expectedRevision: stored.attempt.revision,
307
- authorize: (tx, _attempt, origin) =>
308
- requireConnectOwnerAuthority(tx, state!, "connections:write", origin),
309
- });
308
+ const claim = await claimOAuthAcquisition(
309
+ deps.db,
310
+ state,
311
+ {
312
+ ...operation,
313
+ expectedRevision: stored.attempt.revision,
314
+ authorize: (tx, _attempt, origin) =>
315
+ requireConnectOwnerAuthority(tx, state!, "connections:write", origin),
316
+ },
317
+ "github-personal",
318
+ Boolean(input.code && !input.error),
319
+ );
310
320
  if (claim.status === "replayed") return { redirectTo: exactReturnUrl, exactReturn: true };
311
321
  }
312
322
  await requirePersonalGitHubCallbackGrant(deps, state);
@@ -340,6 +350,12 @@ export async function completePersonalGitHubOAuthCallback(
340
350
  }
341
351
  if (input.error) throw new PersonalGitHubCallbackError("provider_denied");
342
352
  if (!input.code) throw new PersonalGitHubCallbackError("missing_code");
353
+ await withOrganizationIntegrationAcquisition(
354
+ deps.db,
355
+ state,
356
+ ["github-personal"],
357
+ async () => {},
358
+ );
343
359
 
344
360
  const oauth = requirePersonalGitHubOAuthSettings(deps.settings);
345
361
  if (
@@ -474,33 +490,43 @@ export async function completePersonalGitHubOAuthCallback(
474
490
  });
475
491
  };
476
492
  if (operation) {
477
- await finishConnectOperation(deps.db, acceptedState, {
478
- ...operation,
479
- authorize: (tx, _attempt, origin) =>
480
- requireConnectOwnerAuthority(tx, acceptedState, "connections:write", origin),
481
- commit: async (tx, current) => {
482
- const connection = await persist(tx);
483
- if (!connection) throw new PersonalGitHubCallbackError("connection_conflict");
484
- return {
485
- ...current,
486
- revision: current.revision + 1,
487
- state: "complete",
488
- credentialsCommitted: true,
489
- nextAction: { type: "none" },
490
- account: {
491
- id: connection.id,
492
- version: connection.version,
493
- providerId: "github-personal",
494
- label: identity.login,
495
- ownership: "personal",
496
- status: "connected",
497
- },
498
- };
493
+ await finishOAuthAcquisition(
494
+ deps.db,
495
+ acceptedState,
496
+ {
497
+ ...operation,
498
+ authorize: (tx, _attempt, origin) =>
499
+ requireConnectOwnerAuthority(tx, acceptedState, "connections:write", origin),
500
+ commit: async (tx, current) => {
501
+ const connection = await persist(tx);
502
+ if (!connection) throw new PersonalGitHubCallbackError("connection_conflict");
503
+ return {
504
+ ...current,
505
+ revision: current.revision + 1,
506
+ state: "complete",
507
+ credentialsCommitted: true,
508
+ nextAction: { type: "none" },
509
+ account: {
510
+ id: connection.id,
511
+ version: connection.version,
512
+ providerId: "github-personal",
513
+ label: identity.login,
514
+ ownership: "personal",
515
+ status: "connected",
516
+ },
517
+ };
518
+ },
499
519
  },
500
- });
520
+ "github-personal",
521
+ );
501
522
  return { redirectTo: exactReturnUrl!, exactReturn: true };
502
523
  }
503
- const connection = await persist(deps.db);
524
+ const connection = await withOrganizationIntegrationAcquisition(
525
+ deps.db,
526
+ acceptedState,
527
+ ["github-personal"],
528
+ persist,
529
+ );
504
530
  if (!connection) throw new PersonalGitHubCallbackError("connection_conflict");
505
531
  return {
506
532
  redirectTo: personalGitHubCallbackReturnUrl(returnBaseUrl, state.returnPath, "success", {
@@ -512,7 +538,7 @@ export async function completePersonalGitHubOAuthCallback(
512
538
  return {
513
539
  redirectTo: personalGitHubCallbackReturnUrl(
514
540
  returnBaseUrl,
515
- state?.returnPath ?? "/integrations",
541
+ state?.returnPath ?? oauthStateFailureReturn(deps.settings, input.state).returnPath,
516
542
  "error",
517
543
  { reason: personalGitHubFailureReason(error) },
518
544
  ),
@@ -620,7 +646,7 @@ async function exchangePersonalGitHubAuthorizationCode(
620
646
  headers: {
621
647
  accept: "application/json",
622
648
  "content-type": "application/x-www-form-urlencoded",
623
- "user-agent": "OpenGeni",
649
+ "user-agent": "Opengeni",
624
650
  },
625
651
  body: new URLSearchParams({
626
652
  client_id: oauth.clientId,
@@ -679,7 +705,7 @@ async function fetchPersonalGitHubIdentity(
679
705
  headers: {
680
706
  accept: "application/vnd.github+json",
681
707
  authorization: `Bearer ${accessToken}`,
682
- "user-agent": "OpenGeni",
708
+ "user-agent": "Opengeni",
683
709
  "x-github-api-version": GITHUB_API_VERSION,
684
710
  },
685
711
  signal: AbortSignal.timeout(GITHUB_REQUEST_TIMEOUT_MS),
@@ -728,7 +754,7 @@ function parseGitHubScopes(raw: string | null): string[] {
728
754
  }
729
755
 
730
756
  function personalGitHubReturnPath(workspaceId: string, raw?: string): string {
731
- const fallback = `/workspaces/${workspaceId}/capabilities`;
757
+ const fallback = workspaceIntegrationsPath(workspaceId);
732
758
  if (!raw) return fallback;
733
759
  let parsed: URL;
734
760
  try {