@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,7 +1,21 @@
1
+ type AtlassianRequestAuthority = {
2
+ connectionUseContext?: Omit<AcceptedConnectionUseContext, "physicalRequestId" | "usePhase">;
3
+ };
4
+
5
+ import type { AcceptedConnectionUseContext } from "@opengeni/db";
6
+ import {
7
+ withOrganizationIntegrationAcquisition,
8
+ withOrganizationIntegrationPolicyFence,
9
+ } from "@opengeni/db/organization-integration-policy";
10
+ import {
11
+ claimOAuthAcquisition,
12
+ integrationSourceSelectionRequiresAcquisition,
13
+ } from "./oauth-client";
1
14
  import {
2
15
  scheduledTaskKnowledgeSource,
3
16
  requireScheduledTaskKnowledgeSource,
4
17
  knowledgeSourceAgentConfig,
18
+ assertOrganizationIntegrationAllowed,
5
19
  } from "@opengeni/contracts";
6
20
  import type { Settings } from "@opengeni/config";
7
21
  import { createHash } from "node:crypto";
@@ -44,7 +58,6 @@ import {
44
58
  ConnectionDisconnectGenerationError,
45
59
  ConnectionDisconnectIdempotencyError,
46
60
  consumeIntegrationOAuthStateNonce,
47
- claimConnectOperation,
48
61
  finishConnectOperation,
49
62
  getConnectAttempt,
50
63
  decryptEnvironmentValue,
@@ -70,6 +83,10 @@ import { atlassianKnowledgeSourceIdentity } from "@opengeni/documents/atlassian"
70
83
  import { createSignedState, readSignedState } from "@opengeni/github";
71
84
  import { readResponseJsonBounded, type FetchLike } from "@opengeni/network";
72
85
  import { HTTPException } from "hono/http-exception";
86
+ import {
87
+ ATLASSIAN_NATIVE_RETIRED_MESSAGE,
88
+ ATLASSIAN_NATIVE_RETIRED_REASON,
89
+ } from "@opengeni/contracts/atlassian-native-retirement";
73
90
  import {
74
91
  personalOnlyConnectionPrincipalMessage,
75
92
  personalOwnerStateAccepted,
@@ -78,6 +95,7 @@ import {
78
95
  } from "../connection-ownership";
79
96
  import {
80
97
  integrationBaseUrl,
98
+ oauthStateFailureReturn,
81
99
  oauthStateTtlMs,
82
100
  requireIntegrationsStateSecret,
83
101
  } from "./oauth-client";
@@ -132,6 +150,8 @@ export async function startAtlassianOAuth(
132
150
  externalContinuation?: ExternalActorContinuation;
133
151
  },
134
152
  ): Promise<AtlassianOAuthStartResponse> {
153
+ assertNativeAtlassianAvailable();
154
+ await withOrganizationIntegrationAcquisition(deps.db, input, ["atlassian"], async () => {});
135
155
  const oauth = requireAtlassianSettings(deps.settings);
136
156
  const existing = input.payload.connectionId
137
157
  ? await getConnectionMetadata(
@@ -208,12 +228,19 @@ export async function completeAtlassianOAuthCallback(
208
228
  operationId: `oauth:${state.nonce}`,
209
229
  inputDigest: createHash("sha256").update(input.state!).digest("hex"),
210
230
  };
211
- const claim = await claimConnectOperation(deps.db, state, {
212
- ...operation,
213
- expectedRevision: stored.attempt.revision,
214
- authorize: (tx, _attempt, origin) =>
215
- requireConnectOwnerAuthority(tx, state!, "connections:write", origin),
216
- });
231
+ const claim = await claimOAuthAcquisition(
232
+ deps.db,
233
+ state,
234
+ {
235
+ ...operation,
236
+ expectedRevision: stored.attempt.revision,
237
+ authorize: (tx, _attempt, origin) =>
238
+ requireConnectOwnerAuthority(tx, state!, "connections:write", origin),
239
+ },
240
+ "atlassian",
241
+ // Retirement only settles this attempt; it acquires no integration.
242
+ false,
243
+ );
217
244
  if (claim.status === "replayed") return { redirectTo: exactReturnUrl, exactReturn: true };
218
245
  }
219
246
  await requireCallbackGrant(deps, state);
@@ -225,7 +252,7 @@ export async function completeAtlassianOAuthCallback(
225
252
  expiresAt: new Date(state.iat * 1000 + oauthStateTtlMs),
226
253
  now: new Date(),
227
254
  });
228
- if (!consumed) throw new AtlassianCallbackError("state_reused");
255
+ if (!consumed) throw new AtlassianCallbackError("state_replayed");
229
256
  if (operation && (input.error || !input.code)) {
230
257
  await finishConnectOperation(deps.db, state, {
231
258
  ...operation,
@@ -247,6 +274,30 @@ export async function completeAtlassianOAuthCallback(
247
274
  }
248
275
  if (input.error) throw new AtlassianCallbackError("provider_denied");
249
276
  if (!input.code) throw new AtlassianCallbackError("missing_code");
277
+ // An authorization started on an older release must not exchange or save
278
+ // a native grant after retirement. Preserve exact Connect navigation and
279
+ // settle the pending attempt so it does not remain stuck authorizing.
280
+ if (operation) {
281
+ await finishConnectOperation(deps.db, state, {
282
+ ...operation,
283
+ authorize: (tx, _attempt, origin) =>
284
+ requireConnectOwnerAuthority(tx, state!, "connections:write", origin),
285
+ commit: async (_tx, current) => ({
286
+ ...current,
287
+ revision: current.revision + 1,
288
+ state: "failed",
289
+ nextAction: { type: "none" },
290
+ error: {
291
+ code: ATLASSIAN_NATIVE_RETIRED_REASON,
292
+ message: ATLASSIAN_NATIVE_RETIRED_MESSAGE,
293
+ retryable: false,
294
+ },
295
+ }),
296
+ });
297
+ return { redirectTo: exactReturnUrl!, exactReturn: true };
298
+ }
299
+ assertNativeAtlassianAvailable();
300
+ await withOrganizationIntegrationAcquisition(deps.db, state, ["atlassian"], async () => {});
250
301
 
251
302
  const oauth = requireAtlassianSettings(deps.settings);
252
303
  const redirectUri = `${baseUrl}/v1/integrations/atlassian/callback`;
@@ -359,49 +410,30 @@ export async function completeAtlassianOAuthCallback(
359
410
  createdBySubjectId: state.subjectId,
360
411
  });
361
412
  };
362
- if (operation) {
363
- await finishConnectOperation(deps.db, acceptedState, {
364
- ...operation,
365
- authorize: (tx, _attempt, origin) =>
366
- requireConnectOwnerAuthority(tx, acceptedState, "connections:write", origin),
367
- commit: async (tx, current) => {
368
- const connection = await persist(tx);
369
- if (!connection) throw new AtlassianCallbackError("connection_conflict");
370
- return {
371
- ...current,
372
- revision: current.revision + 1,
373
- state: "complete",
374
- credentialsCommitted: true,
375
- nextAction: { type: "none" },
376
- account: {
377
- id: connection.id,
378
- version: connection.version,
379
- providerId: "atlassian",
380
- label: profile.displayName ?? "Atlassian",
381
- ownership: "personal",
382
- status: "connected",
383
- },
384
- };
385
- },
386
- });
387
- return { redirectTo: exactReturnUrl!, exactReturn: true };
388
- }
389
- const connection = await deps.db.transaction(async (tx) => {
390
- await requireCallbackGrant({ ...deps, db: tx }, acceptedState);
391
- return persist(tx);
392
- });
413
+ const connection = await withOrganizationIntegrationAcquisition(
414
+ deps.db,
415
+ acceptedState,
416
+ ["atlassian"],
417
+ async (tx) => {
418
+ await requireCallbackGrant({ ...deps, db: tx }, acceptedState);
419
+ return persist(tx);
420
+ },
421
+ );
393
422
  if (!connection) throw new AtlassianCallbackError("connection_conflict");
394
423
  return {
395
424
  redirectTo: returnUrl(returnBaseUrl, state.returnPath, "connected", connection.id),
396
425
  };
397
426
  } catch (error) {
398
427
  if (exactReturnUrl) return { redirectTo: exactReturnUrl, exactReturn: true };
428
+ // Reading the state is the first step, so no state means the link itself
429
+ // was unusable: say whether it expired rather than blame configuration.
430
+ const failure = state ? null : oauthStateFailureReturn(deps.settings, input.state);
399
431
  return {
400
432
  redirectTo: returnUrl(
401
433
  returnBaseUrl,
402
- state?.returnPath ?? "/integrations",
434
+ state?.returnPath ?? failure!.returnPath,
403
435
  "error",
404
- errorReason(error),
436
+ failure?.reason ?? errorReason(error),
405
437
  ),
406
438
  };
407
439
  }
@@ -409,8 +441,13 @@ export async function completeAtlassianOAuthCallback(
409
441
 
410
442
  export async function browseAtlassianSources(
411
443
  deps: ApiRouteDeps,
412
- input: { workspaceId: string; subjectId: string; connectionId: string },
444
+ input: AtlassianRequestAuthority & {
445
+ workspaceId: string;
446
+ subjectId: string;
447
+ connectionId: string;
448
+ },
413
449
  ) {
450
+ assertNativeAtlassianAvailable();
414
451
  const connection = await getConnectionMetadata(
415
452
  deps.db,
416
453
  input.workspaceId,
@@ -450,7 +487,7 @@ export async function browseAtlassianSources(
450
487
 
451
488
  export async function searchAtlassianLive(
452
489
  deps: ApiRouteDeps,
453
- input: {
490
+ input: AtlassianRequestAuthority & {
454
491
  workspaceId: string;
455
492
  subjectId: string;
456
493
  connectionId: string;
@@ -459,6 +496,7 @@ export async function searchAtlassianLive(
459
496
  limit: number;
460
497
  },
461
498
  ) {
499
+ assertNativeAtlassianAvailable();
462
500
  const connection = await getConnectionMetadata(
463
501
  deps.db,
464
502
  input.workspaceId,
@@ -553,7 +591,7 @@ export async function searchAtlassianLive(
553
591
 
554
592
  export async function getAtlassianLiveItem(
555
593
  deps: ApiRouteDeps,
556
- input: {
594
+ input: AtlassianRequestAuthority & {
557
595
  workspaceId: string;
558
596
  subjectId: string;
559
597
  connectionId: string;
@@ -561,6 +599,7 @@ export async function getAtlassianLiveItem(
561
599
  id: string;
562
600
  },
563
601
  ) {
602
+ assertNativeAtlassianAvailable();
564
603
  const connection = await getConnectionMetadata(
565
604
  deps.db,
566
605
  input.workspaceId,
@@ -674,6 +713,7 @@ export async function saveAtlassianSources(
674
713
  canManagePersonalDestination: boolean;
675
714
  },
676
715
  ) {
716
+ assertNativeAtlassianAvailable();
677
717
  const parsed = SaveAtlassianSourcesRequest.safeParse(input.payload);
678
718
  if (!parsed.success) {
679
719
  throw new HTTPException(400, { message: "invalid Atlassian source selection" });
@@ -705,9 +745,28 @@ export async function saveAtlassianSources(
705
745
  initiatingSubjectId: input.subjectId,
706
746
  });
707
747
 
708
- const available = (await browseAtlassianSources(deps, input)).items;
748
+ const requestedSelection = parsed.data.sources.map((source) => ({
749
+ ...source,
750
+ destination,
751
+ syncCadence: parsed.data.syncCadence,
752
+ syncEnabled: parsed.data.syncEnabled,
753
+ readPolicy: parsed.data.readPolicy,
754
+ }));
755
+ const acquiring = integrationSourceSelectionRequiresAcquisition(
756
+ metadata.selectedSources,
757
+ requestedSelection,
758
+ );
759
+ if (acquiring) {
760
+ await withOrganizationIntegrationAcquisition(deps.db, input, ["atlassian"], async () => {});
761
+ }
762
+
763
+ const available =
764
+ acquiring && parsed.data.sources.length
765
+ ? (await browseAtlassianSources(deps, input)).items
766
+ : [];
709
767
  const availableById = new Map(available.map((source) => [source.id, source]));
710
768
  const verified = parsed.data.sources.map((source) => {
769
+ if (!acquiring) return source;
711
770
  const current = availableById.get(source.id);
712
771
  if (
713
772
  !current ||
@@ -724,28 +783,39 @@ export async function saveAtlassianSources(
724
783
  return current;
725
784
  });
726
785
  const previousSources = metadata.selectedSources;
727
- const updated = await transitionConnectionState(deps.db, {
728
- workspaceId: input.workspaceId,
729
- connectionId: existing.id,
730
- visibleToSubjectId: input.subjectId,
731
- expectedVersion: existing.version,
732
- metadata: AtlassianConnectionMetadata.parse({
733
- ...metadata,
734
- documentDestination: destination,
735
- selectedSources: verified.map((source) => ({
736
- ...source,
737
- destination,
738
- syncCadence: parsed.data.syncCadence,
739
- syncEnabled: parsed.data.syncEnabled,
740
- configGeneration:
741
- (previousSources.find((previous) => previous.id === source.id)?.configGeneration ?? 0) +
742
- 1,
743
- readPolicy: parsed.data.readPolicy,
744
- selectedAt: new Date().toISOString(),
745
- })),
746
- }),
747
- updatedBySubjectId: input.subjectId,
748
- });
786
+ const updated = await withOrganizationIntegrationPolicyFence(
787
+ deps.db,
788
+ input,
789
+ async (tx, policy) => {
790
+ // The exact generation checked by transitionConnectionState binds this
791
+ // comparison to the row being changed. Provider verification already ended.
792
+ if (integrationSourceSelectionRequiresAcquisition(previousSources, requestedSelection)) {
793
+ assertOrganizationIntegrationAllowed(policy, "atlassian");
794
+ }
795
+ return transitionConnectionState(tx, {
796
+ workspaceId: input.workspaceId,
797
+ connectionId: existing.id,
798
+ visibleToSubjectId: input.subjectId,
799
+ expectedVersion: existing.version,
800
+ metadata: AtlassianConnectionMetadata.parse({
801
+ ...metadata,
802
+ documentDestination: destination,
803
+ selectedSources: verified.map((source) => ({
804
+ ...source,
805
+ destination,
806
+ syncCadence: parsed.data.syncCadence,
807
+ syncEnabled: parsed.data.syncEnabled,
808
+ configGeneration:
809
+ (previousSources.find((previous) => previous.id === source.id)?.configGeneration ??
810
+ 0) + 1,
811
+ readPolicy: parsed.data.readPolicy,
812
+ selectedAt: new Date().toISOString(),
813
+ })),
814
+ }),
815
+ updatedBySubjectId: input.subjectId,
816
+ });
817
+ },
818
+ );
749
819
  if (!updated) throw new HTTPException(409, { message: "Atlassian connection changed" });
750
820
  await materializeSchedules(deps, {
751
821
  ...input,
@@ -765,6 +835,7 @@ export async function transitionAtlassianLifecycle(
765
835
  payload: AtlassianLifecycleActionRequest;
766
836
  },
767
837
  ) {
838
+ if (input.payload.action === "resume") assertNativeAtlassianAvailable();
768
839
  const connection = await getConnectionMetadata(
769
840
  deps.db,
770
841
  input.workspaceId,
@@ -783,14 +854,27 @@ export async function transitionAtlassianLifecycle(
783
854
  if (target === "paused") {
784
855
  await deauthorizeConnectionSources(deps, connection, input.subjectId, "connection_paused");
785
856
  }
786
- const updated = await transitionConnectionState(deps.db, {
787
- workspaceId: input.workspaceId,
788
- connectionId: input.connectionId,
789
- visibleToSubjectId: input.subjectId,
790
- expectedVersion: connection.version,
791
- metadata: AtlassianConnectionMetadata.parse({ ...metadata, lifecycle: lifecycle(target) }),
792
- updatedBySubjectId: input.subjectId,
793
- });
857
+ const persist = (tx: Database) =>
858
+ transitionConnectionState(tx, {
859
+ workspaceId: input.workspaceId,
860
+ connectionId: input.connectionId,
861
+ visibleToSubjectId: input.subjectId,
862
+ expectedVersion: connection.version,
863
+ metadata: AtlassianConnectionMetadata.parse({ ...metadata, lifecycle: lifecycle(target) }),
864
+ updatedBySubjectId: input.subjectId,
865
+ });
866
+ const updated =
867
+ target === "active"
868
+ ? await withOrganizationIntegrationPolicyFence(
869
+ deps.db,
870
+ { accountId: connection.accountId, workspaceId: input.workspaceId },
871
+ (tx, policy) => {
872
+ if ((metadata.lifecycle?.state ?? "active") !== "active")
873
+ assertOrganizationIntegrationAllowed(policy, "atlassian");
874
+ return persist(tx);
875
+ },
876
+ )
877
+ : await persist(deps.db);
794
878
  if (!updated) throw new HTTPException(409, { message: "Atlassian connection changed" });
795
879
  await setSchedulePause(deps, input.workspaceId, input.connectionId, target === "paused");
796
880
  return updated;
@@ -1164,7 +1248,6 @@ async function materializeSchedules(
1164
1248
  action: { kind: "agent_turn" },
1165
1249
  runMode: "new_session_per_run",
1166
1250
  targetSessionId: null,
1167
- connectionAuthorities: [],
1168
1251
  agentConfig: knowledgeSourceAgentConfig(action),
1169
1252
  variableSetId: null,
1170
1253
  environmentId: null,
@@ -1229,7 +1312,11 @@ async function materializeSchedules(
1229
1312
 
1230
1313
  async function browseJiraProjects(
1231
1314
  deps: ApiRouteDeps,
1232
- input: { workspaceId: string; subjectId: string; connectionId: string },
1315
+ input: AtlassianRequestAuthority & {
1316
+ workspaceId: string;
1317
+ subjectId: string;
1318
+ connectionId: string;
1319
+ },
1233
1320
  site: AtlassianSite,
1234
1321
  ): Promise<AtlassianBrowseItem[]> {
1235
1322
  const items: AtlassianBrowseItem[] = [];
@@ -1275,7 +1362,11 @@ async function browseJiraProjects(
1275
1362
 
1276
1363
  async function browseConfluenceSpaces(
1277
1364
  deps: ApiRouteDeps,
1278
- input: { workspaceId: string; subjectId: string; connectionId: string },
1365
+ input: AtlassianRequestAuthority & {
1366
+ workspaceId: string;
1367
+ subjectId: string;
1368
+ connectionId: string;
1369
+ },
1279
1370
  site: AtlassianSite,
1280
1371
  ): Promise<AtlassianBrowseItem[]> {
1281
1372
  const items: AtlassianBrowseItem[] = [];
@@ -1333,7 +1424,7 @@ export function confluenceNextUrl(cloudId: string, next: string): URL {
1333
1424
 
1334
1425
  async function atlassianApiRequest(
1335
1426
  deps: ApiRouteDeps,
1336
- input: {
1427
+ input: AtlassianRequestAuthority & {
1337
1428
  workspaceId: string;
1338
1429
  subjectId: string;
1339
1430
  connectionId: string;
@@ -1341,6 +1432,7 @@ async function atlassianApiRequest(
1341
1432
  label: string;
1342
1433
  },
1343
1434
  ): Promise<unknown> {
1435
+ assertNativeAtlassianAvailable();
1344
1436
  const current = await getConnectionMetadata(
1345
1437
  deps.db,
1346
1438
  input.workspaceId,
@@ -1354,9 +1446,20 @@ async function atlassianApiRequest(
1354
1446
  });
1355
1447
  const resolve = async (forceRefresh: boolean) =>
1356
1448
  await resolver({
1357
- workspaceId: input.workspaceId,
1449
+ workspaceId: input.connectionUseContext?.workspaceId ?? input.workspaceId,
1450
+ ...(input.connectionUseContext
1451
+ ? {
1452
+ connectionUseContext: {
1453
+ ...input.connectionUseContext,
1454
+ physicalRequestId: crypto.randomUUID(),
1455
+ usePhase: "credential_resolution" as const,
1456
+ },
1457
+ }
1458
+ : {}),
1358
1459
  subjectId: input.subjectId,
1359
- serverId: "atlassian-source-browser",
1460
+ serverId: input.connectionUseContext
1461
+ ? `atlassian:${input.connectionId}`
1462
+ : "atlassian-source-browser",
1360
1463
  toolName: input.label,
1361
1464
  connectionRef: {
1362
1465
  providerDomain: ATLASSIAN_PROVIDER_DOMAIN,
@@ -1707,11 +1810,17 @@ function returnUrl(base: string, path: string, status: "connected" | "error", va
1707
1810
  }
1708
1811
 
1709
1812
  function errorReason(error: unknown): string {
1813
+ if (error instanceof HTTPException && error.status === 410)
1814
+ return ATLASSIAN_NATIVE_RETIRED_REASON;
1710
1815
  if (error instanceof AtlassianCallbackError) return error.reason;
1711
1816
  if (error instanceof HTTPException) return `http_${error.status}`;
1712
1817
  return "connection_failed";
1713
1818
  }
1714
1819
 
1820
+ function assertNativeAtlassianAvailable(): void {
1821
+ throw new HTTPException(410, { message: ATLASSIAN_NATIVE_RETIRED_MESSAGE });
1822
+ }
1823
+
1715
1824
  class AtlassianCallbackError extends Error {
1716
1825
  constructor(readonly reason: string) {
1717
1826
  super(reason);
@@ -1763,7 +1872,12 @@ function cqlString(value: string): string {
1763
1872
 
1764
1873
  async function readJiraLiveComments(
1765
1874
  deps: ApiRouteDeps,
1766
- input: { workspaceId: string; subjectId: string; connectionId: string; id: string },
1875
+ input: AtlassianRequestAuthority & {
1876
+ workspaceId: string;
1877
+ subjectId: string;
1878
+ connectionId: string;
1879
+ id: string;
1880
+ },
1767
1881
  cloudId: string,
1768
1882
  ) {
1769
1883
  const comments: Array<{ author: string | null; createdAt: string | null; body: string }> = [];
@@ -1796,7 +1910,12 @@ async function readJiraLiveComments(
1796
1910
 
1797
1911
  async function readConfluenceLiveComments(
1798
1912
  deps: ApiRouteDeps,
1799
- input: { workspaceId: string; subjectId: string; connectionId: string; id: string },
1913
+ input: AtlassianRequestAuthority & {
1914
+ workspaceId: string;
1915
+ subjectId: string;
1916
+ connectionId: string;
1917
+ id: string;
1918
+ },
1800
1919
  cloudId: string,
1801
1920
  ) {
1802
1921
  const comments: Array<{ createdAt: string | null; content: string }> = [];
@@ -1,3 +1,5 @@
1
+ import { withOrganizationIntegrationAcquisition } from "@opengeni/db/organization-integration-policy";
2
+ import { claimOAuthAcquisition, finishOAuthAcquisition } from "./oauth-client";
1
3
  import { safeReturnPath } from "./oauth-return-path";
2
4
  import type { ApiRouteDeps } from "@opengeni/core";
3
5
  import type { Settings } from "@opengeni/config";
@@ -30,7 +32,6 @@ import {
30
32
  encryptEnvironmentValue,
31
33
  decryptEnvironmentValue,
32
34
  getConnectAttempt,
33
- claimConnectOperation,
34
35
  finishConnectOperation,
35
36
  getConnectionMetadata,
36
37
  listConnectionsMetadata,
@@ -45,8 +46,10 @@ import { readResponseJsonBounded, type FetchLike } from "@opengeni/network";
45
46
  import { HTTPException } from "hono/http-exception";
46
47
  import {
47
48
  integrationBaseUrl,
49
+ oauthStateFailureReturn,
48
50
  oauthStateTtlMs,
49
51
  requireIntegrationsStateSecret,
52
+ workspaceIntegrationsPath,
50
53
  } from "./oauth-client";
51
54
 
52
55
  const FIKEN_API_BASE = "https://api.fiken.no/api/v2";
@@ -63,7 +66,9 @@ const MAX_DRAFT_LINES = 100;
63
66
  const COMPANY_SLUG_PATTERN = /^[a-z0-9][a-z0-9-]{0,127}$/;
64
67
 
65
68
  /** Shared native/embedded token adapter. Provider verification happens before
66
- * persistence; the caller reauthorizes inside its durable commit transaction. */
69
+ * persistence; the caller reauthorizes inside its durable commit transaction.
70
+ * That caller must acquire the organization policy fence for `fiken` BEFORE
71
+ * owner/tenancy locks and invoke the returned writer with that exact tx. */
67
72
  export async function prepareFikenTokenInstall(
68
73
  deps: ApiRouteDeps,
69
74
  grant: Pick<AccessGrant, "accountId" | "workspaceId" | "subjectId">,
@@ -71,6 +76,7 @@ export async function prepareFikenTokenInstall(
71
76
  expectedVersion?: number,
72
77
  ): Promise<(tx: Database) => Promise<ConnectionMetadata>> {
73
78
  const payload = FikenInstallRequest.parse(raw);
79
+ await withOrganizationIntegrationAcquisition(deps.db, grant, ["fiken"], async () => {});
74
80
  const key = requireEnvironmentEncryption(deps.settings);
75
81
  const existing = payload.connectionId
76
82
  ? await getConnectionMetadata(deps.db, grant.workspaceId, payload.connectionId, null)
@@ -1102,6 +1108,7 @@ export async function startFikenOAuth(
1102
1108
  connectAttemptId?: string;
1103
1109
  },
1104
1110
  ): Promise<FikenOAuthStartResponse> {
1111
+ await withOrganizationIntegrationAcquisition(deps.db, input, ["fiken"], async () => {});
1105
1112
  const fiken = requireFikenOAuthSettings(deps.settings);
1106
1113
  const existing = input.payload.connectionId
1107
1114
  ? await getConnectionMetadata(deps.db, input.workspaceId, input.payload.connectionId, null)
@@ -1118,7 +1125,7 @@ export async function startFikenOAuth(
1118
1125
  workspaceId: input.workspaceId,
1119
1126
  subjectId: input.subjectId,
1120
1127
  returnPath: safeReturnPath(
1121
- input.payload.returnPath ?? `/workspaces/${input.workspaceId}/capabilities`,
1128
+ input.payload.returnPath ?? workspaceIntegrationsPath(input.workspaceId),
1122
1129
  ),
1123
1130
  ...(input.connectAttemptId ? { connectAttemptId: input.connectAttemptId } : {}),
1124
1131
  ...(input.externalContinuation
@@ -1168,12 +1175,18 @@ export async function completeFikenOAuthCallback(
1168
1175
  operationId: `oauth:${state.nonce}`,
1169
1176
  inputDigest: createHash("sha256").update(input.state!).digest("hex"),
1170
1177
  };
1171
- const claim = await claimConnectOperation(deps.db, state, {
1172
- ...operation,
1173
- expectedRevision: stored.attempt.revision,
1174
- authorize: (tx, _attempt, origin) =>
1175
- requireConnectOwnerAuthority(tx, state!, "connections:write", origin),
1176
- });
1178
+ const claim = await claimOAuthAcquisition(
1179
+ deps.db,
1180
+ state,
1181
+ {
1182
+ ...operation,
1183
+ expectedRevision: stored.attempt.revision,
1184
+ authorize: (tx, _attempt, origin) =>
1185
+ requireConnectOwnerAuthority(tx, state!, "connections:write", origin),
1186
+ },
1187
+ "fiken",
1188
+ Boolean(input.code && !input.error),
1189
+ );
1177
1190
  if (claim.status === "replayed") return { redirectTo: exactReturnUrl, exactReturn: true };
1178
1191
  }
1179
1192
  await requireFikenCallbackGrant(deps.db, state);
@@ -1217,6 +1230,7 @@ export async function completeFikenOAuthCallback(
1217
1230
  if (!input.code) {
1218
1231
  throw new FikenOAuthCallbackError("missing_code");
1219
1232
  }
1233
+ await withOrganizationIntegrationAcquisition(deps.db, state, ["fiken"], async () => {});
1220
1234
  const fiken = requireFikenOAuthSettings(deps.settings);
1221
1235
  const key = requireEnvironmentEncryption(deps.settings);
1222
1236
  const fetchImpl = deps.fikenFetch ?? fetch;
@@ -1303,36 +1317,46 @@ export async function completeFikenOAuthCallback(
1303
1317
  createdBySubjectId: state!.subjectId,
1304
1318
  });
1305
1319
  if (operation) {
1306
- await finishConnectOperation(deps.db, state, {
1307
- ...operation,
1308
- authorize: (tx, _attempt, origin) =>
1309
- requireConnectOwnerAuthority(tx, state!, "connections:write", origin),
1310
- commit: async (tx, current) => {
1311
- const connection = await persist(tx);
1312
- if (!connection) throw new FikenOAuthCallbackError("connection_conflict");
1313
- return {
1314
- ...current,
1315
- revision: current.revision + 1,
1316
- state: "complete",
1317
- credentialsCommitted: true,
1318
- nextAction: { type: "none" },
1319
- account: {
1320
- id: connection.id,
1321
- version: connection.version,
1322
- providerId: "fiken-oauth",
1323
- label: "Fiken",
1324
- ownership: "workspace",
1325
- status: "connected",
1326
- },
1327
- };
1320
+ await finishOAuthAcquisition(
1321
+ deps.db,
1322
+ state,
1323
+ {
1324
+ ...operation,
1325
+ authorize: (tx, _attempt, origin) =>
1326
+ requireConnectOwnerAuthority(tx, state!, "connections:write", origin),
1327
+ commit: async (tx, current) => {
1328
+ const connection = await persist(tx);
1329
+ if (!connection) throw new FikenOAuthCallbackError("connection_conflict");
1330
+ return {
1331
+ ...current,
1332
+ revision: current.revision + 1,
1333
+ state: "complete",
1334
+ credentialsCommitted: true,
1335
+ nextAction: { type: "none" },
1336
+ account: {
1337
+ id: connection.id,
1338
+ version: connection.version,
1339
+ providerId: "fiken-oauth",
1340
+ label: "Fiken",
1341
+ ownership: "workspace",
1342
+ status: "connected",
1343
+ },
1344
+ };
1345
+ },
1328
1346
  },
1329
- });
1347
+ "fiken",
1348
+ );
1330
1349
  return { redirectTo: exactReturnUrl!, exactReturn: true };
1331
1350
  }
1332
- const connection = await deps.db.transaction(async (tx) => {
1333
- await requireFikenCallbackGrant(tx, state!);
1334
- return persist(tx);
1335
- });
1351
+ const connection = await withOrganizationIntegrationAcquisition(
1352
+ deps.db,
1353
+ state,
1354
+ ["fiken"],
1355
+ async (tx) => {
1356
+ await requireFikenCallbackGrant(tx, state!);
1357
+ return persist(tx);
1358
+ },
1359
+ );
1336
1360
  if (!connection) {
1337
1361
  throw new FikenOAuthCallbackError("connection_conflict");
1338
1362
  }
@@ -1341,12 +1365,16 @@ export async function completeFikenOAuthCallback(
1341
1365
  };
1342
1366
  } catch (error) {
1343
1367
  if (exactReturnUrl) return { redirectTo: exactReturnUrl, exactReturn: true };
1368
+ // Reading the state is the first step, so no state means the link itself
1369
+ // was unusable: say whether it expired instead of suggesting a token.
1370
+ const failure = state ? null : oauthStateFailureReturn(deps.settings, input.state);
1344
1371
  return {
1345
1372
  redirectTo: fikenReturnUrl(
1346
1373
  returnBaseUrl,
1347
- state?.returnPath ?? "/integrations",
1374
+ state?.returnPath ?? failure!.returnPath,
1348
1375
  "error",
1349
- error instanceof FikenOAuthCallbackError ? error.reason : "callback_failed",
1376
+ failure?.reason ??
1377
+ (error instanceof FikenOAuthCallbackError ? error.reason : "callback_failed"),
1350
1378
  ),
1351
1379
  };
1352
1380
  }