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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. package/dist/access-grant-rls.d.ts +8 -1
  2. package/dist/admission-trace.d.ts +8 -0
  3. package/dist/app.d.ts +50 -3
  4. package/dist/app.js +10 -1
  5. package/dist/artifact-catalog-cursor.d.ts +1 -0
  6. package/dist/attached-browser-viewer.d.ts +11 -0
  7. package/dist/auth/managed-auth-attempt-context.d.ts +2 -0
  8. package/dist/auth/managed-auth-rate-limits.d.ts +167 -0
  9. package/dist/auth/managed-auth-session-adapter.d.ts +9 -1
  10. package/dist/auth/managed-auth.d.ts +72 -5
  11. package/dist/auth/managed-sign-in-notifications.d.ts +4 -0
  12. package/dist/auth/new-signups-gate.d.ts +23 -0
  13. package/dist/auth/signup-funnel-metrics.d.ts +44 -0
  14. package/dist/azure-live.d.ts +28 -0
  15. package/dist/browser-action-fences.d.ts +13 -0
  16. package/dist/browser-controller-authority.d.ts +1 -61
  17. package/dist/browser-ephemeral.d.ts +5 -0
  18. package/dist/browser-lost-runtime-end.d.ts +24 -0
  19. package/dist/browser-state-authority.d.ts +1 -27
  20. package/dist/{chunk-AJ62T5QN.js → chunk-GBUJ2DYZ.js} +80507 -39878
  21. package/dist/chunk-GBUJ2DYZ.js.map +1 -0
  22. package/dist/chunk-OGQDXVXY.js +18 -0
  23. package/dist/chunk-OGQDXVXY.js.map +1 -0
  24. package/dist/claude-default-models.d.ts +19 -0
  25. package/dist/claude-subscription-core.d.ts +50 -0
  26. package/dist/claude-subscription-oauth.d.ts +36 -0
  27. package/dist/claude-subscription-profile.d.ts +9 -0
  28. package/dist/claude-subscription-usage.d.ts +6 -0
  29. package/dist/claude-workspace-connection.d.ts +15 -0
  30. package/dist/codemode.d.ts +40 -5
  31. package/dist/codex-realtime.d.ts +29 -3
  32. package/dist/codex-session-pointers.d.ts +19 -0
  33. package/dist/connection-ownership.d.ts +6 -3
  34. package/dist/controller-data-plane.d.ts +16 -0
  35. package/dist/credit-promotion-snapshot.d.ts +6 -0
  36. package/dist/editable-artifact-source-session.d.ts +3 -0
  37. package/dist/editable-artifact-websocket.d.ts +5 -3
  38. package/dist/fatal-process-boundary.d.ts +9 -1
  39. package/dist/github-access.d.ts +7 -1
  40. package/dist/github-browser-flow.d.ts +1 -1
  41. package/dist/http/acting-person.d.ts +36 -0
  42. package/dist/http/api-contract-compat.d.ts +19 -0
  43. package/dist/http/api-error.d.ts +50 -1
  44. package/dist/http/auth.d.ts +8 -1
  45. package/dist/http/cors.d.ts +12 -0
  46. package/dist/http/deprecation.d.ts +42 -0
  47. package/dist/http/keyed-admission.d.ts +12 -0
  48. package/dist/http/local-browser-boundary.d.ts +72 -0
  49. package/dist/http/metrics-listener.d.ts +22 -0
  50. package/dist/http/path-identifier.d.ts +17 -0
  51. package/dist/http/registered-route-label.d.ts +16 -0
  52. package/dist/http/rejection-telemetry.d.ts +34 -0
  53. package/dist/http/request-body.d.ts +27 -0
  54. package/dist/http/request-source.d.ts +41 -3
  55. package/dist/http/sse.d.ts +12 -1
  56. package/dist/http/unmatched-route.d.ts +18 -0
  57. package/dist/http/user-content.d.ts +36 -0
  58. package/dist/http/variable-sets-removed.d.ts +41 -0
  59. package/dist/http/websocket-upgrade-dispatch.d.ts +18 -0
  60. package/dist/index.js +1279 -108
  61. package/dist/index.js.map +1 -1
  62. package/dist/integration-connect-metrics.d.ts +35 -0
  63. package/dist/integration-endpoint-test.d.ts +20 -0
  64. package/dist/integrations/api-integrations.d.ts +2 -2
  65. package/dist/integrations/atlassian.d.ts +8 -3
  66. package/dist/integrations/fiken.d.ts +3 -1
  67. package/dist/integrations/github-lens-connect.d.ts +37 -66
  68. package/dist/integrations/google-drive.d.ts +2 -0
  69. package/dist/integrations/integration-commit-authority.d.ts +13 -0
  70. package/dist/integrations/marketplace-plugin.d.ts +43 -43
  71. package/dist/integrations/oauth-client.d.ts +171 -12
  72. package/dist/integrations/oauth-profiles.d.ts +42 -13
  73. package/dist/integrations/onepassword-vault-provider.d.ts +9 -0
  74. package/dist/integrations/slack-bot.d.ts +285 -7
  75. package/dist/integrations/slack-file-upload-flow.d.ts +62 -0
  76. package/dist/integrations/slack-interactions.d.ts +89 -10
  77. package/dist/integrations/slack-mrkdwn.d.ts +41 -0
  78. package/dist/integrations/slack-routing.d.ts +1 -1
  79. package/dist/integrations/slack-session-defaults.d.ts +58 -0
  80. package/dist/integrations/slack-task-file-upload.d.ts +36 -0
  81. package/dist/integrations/slack-tool-review.d.ts +5 -0
  82. package/dist/interaction-agent-access.d.ts +13 -8
  83. package/dist/interaction-agent-version.d.ts +21 -0
  84. package/dist/interaction-holder-heartbeat.d.ts +5 -0
  85. package/dist/interaction-metrics.d.ts +27 -2
  86. package/dist/interaction-route-stages.d.ts +25 -0
  87. package/dist/interaction-secrets-vault.d.ts +20 -0
  88. package/dist/interaction-secrets.d.ts +103 -0
  89. package/dist/mcp/action-catalog-types.d.ts +14 -0
  90. package/dist/mcp/action-catalog.gen.d.ts +2 -0
  91. package/dist/mcp/action-descriptions.d.ts +4 -0
  92. package/dist/mcp/action-schema-imports.gen.d.ts +1 -0
  93. package/dist/mcp/capability-account-readiness.d.ts +7 -0
  94. package/dist/mcp/child-read-evidence.d.ts +9 -0
  95. package/dist/mcp/company-profile-agent-admin.d.ts +12 -0
  96. package/dist/mcp/contract-input.d.ts +13 -0
  97. package/dist/mcp/documents.d.ts +2 -0
  98. package/dist/mcp/first-party-tool-permissions.d.ts +3 -606
  99. package/dist/mcp/notification-tools.d.ts +26 -0
  100. package/dist/mcp/orchestration-failure-diagnostic.d.ts +43 -0
  101. package/dist/mcp/scheduled-task-input.d.ts +1309 -0
  102. package/dist/mcp/scheduled-task-view.d.ts +217 -3
  103. package/dist/mcp/secret-tools.d.ts +14 -0
  104. package/dist/mcp/server.d.ts +108 -5
  105. package/dist/mcp/session-admin-access-tools.d.ts +33 -0
  106. package/dist/mcp/session-event-errors.d.ts +28 -0
  107. package/dist/mcp/session-event-view.d.ts +62 -0
  108. package/dist/mcp/session-view.d.ts +15 -0
  109. package/dist/mcp/session-wait.d.ts +18 -0
  110. package/dist/mcp/site-agent-clamp-tools.d.ts +38 -0
  111. package/dist/mcp/site-data-tools.d.ts +22 -0
  112. package/dist/mcp/site-publication-tools.d.ts +19 -0
  113. package/dist/mcp/site-sql-tools.d.ts +27 -0
  114. package/dist/mcp-oauth.d.ts +37 -4
  115. package/dist/model-calls/chat-completions.d.ts +87 -0
  116. package/dist/model-calls/pending-usage-settlements.d.ts +57 -0
  117. package/dist/model-calls/service.d.ts +36 -0
  118. package/dist/model-catalog.d.ts +9 -3
  119. package/dist/native-push-dispatch.d.ts +69 -0
  120. package/dist/observability.d.ts +3 -1
  121. package/dist/organization-mcp.d.ts +82 -0
  122. package/dist/prepared-mcp-actor.d.ts +77 -0
  123. package/dist/prepared-mcp-permissions.d.ts +8 -0
  124. package/dist/routes/analytics-consent.d.ts +26 -0
  125. package/dist/routes/api-integrations.d.ts +11 -0
  126. package/dist/routes/api-keys.d.ts +7 -7
  127. package/dist/routes/automations.d.ts +2 -0
  128. package/dist/routes/billing.d.ts +59 -0
  129. package/dist/routes/browser-sessions.d.ts +65 -2
  130. package/dist/routes/chat-completions.d.ts +11 -0
  131. package/dist/routes/claude-core-usage.d.ts +20 -0
  132. package/dist/routes/claude-subscription-accounts.d.ts +3 -0
  133. package/dist/routes/claude-subscription-oauth.d.ts +3 -0
  134. package/dist/routes/client-errors.d.ts +182 -0
  135. package/dist/routes/codex-core.d.ts +401 -0
  136. package/dist/routes/codex.d.ts +64 -2
  137. package/dist/routes/computer-sessions.d.ts +6 -1
  138. package/dist/routes/desktop-distribution.d.ts +32 -0
  139. package/dist/routes/github-browser-fonts.gen.d.ts +2 -0
  140. package/dist/routes/github-browser-pages.d.ts +27 -0
  141. package/dist/routes/inbox.d.ts +13 -0
  142. package/dist/routes/insights-response-cache.d.ts +10 -0
  143. package/dist/routes/insights-usage.d.ts +12 -0
  144. package/dist/routes/insights.d.ts +28 -0
  145. package/dist/routes/interaction-placement-message.d.ts +7 -0
  146. package/dist/routes/managed-sign-in-methods.d.ts +6 -0
  147. package/dist/routes/model-account-choice.d.ts +13 -0
  148. package/dist/routes/model-account-settings.d.ts +19 -0
  149. package/dist/routes/native-app-auth.d.ts +12 -0
  150. package/dist/routes/organization-integration-policy.d.ts +8 -0
  151. package/dist/routes/organization-integrations.d.ts +6 -0
  152. package/dist/routes/organization-mcp-connections.d.ts +3 -0
  153. package/dist/routes/organization-model-defaults.d.ts +9 -0
  154. package/dist/routes/organization-service-accounts.d.ts +3 -0
  155. package/dist/routes/personal-api-keys.d.ts +3 -0
  156. package/dist/routes/session-admin-access.d.ts +3 -0
  157. package/dist/routes/session-artifact-associations.d.ts +4 -0
  158. package/dist/routes/session-history-imports.d.ts +20 -0
  159. package/dist/routes/sessions.d.ts +38 -2
  160. package/dist/routes/site-data.d.ts +18 -0
  161. package/dist/routes/site-publishing.d.ts +5 -0
  162. package/dist/routes/site-runtime.d.ts +31 -0
  163. package/dist/routes/site-sql.d.ts +16 -0
  164. package/dist/routes/slack-bot-access.d.ts +3 -0
  165. package/dist/routes/subscription-account-pools.d.ts +21 -0
  166. package/dist/routes/subscription-core-http.d.ts +5 -0
  167. package/dist/routes/subscription-pool-access.d.ts +37 -0
  168. package/dist/routes/subscription-pool-core.d.ts +153 -0
  169. package/dist/routes/supergrok.d.ts +6 -6
  170. package/dist/routes/usage-allowances.d.ts +12 -0
  171. package/dist/routes/variable-sets-removed.d.ts +2 -0
  172. package/dist/routes/vault-providers.d.ts +34 -0
  173. package/dist/routes/vaults.d.ts +3 -0
  174. package/dist/routes/workspace-integrations.d.ts +35 -0
  175. package/dist/routes/workspace-model-providers.d.ts +4 -0
  176. package/dist/routes/workspaces.d.ts +11 -2
  177. package/dist/sandbox/agent-update.d.ts +64 -0
  178. package/dist/sandbox/auth-callout.d.ts +8 -0
  179. package/dist/sandbox/channel-a.d.ts +15 -1
  180. package/dist/sandbox/enrollment.d.ts +26 -4
  181. package/dist/sandbox/machine-audience.d.ts +29 -0
  182. package/dist/sandbox/machines.d.ts +15 -2
  183. package/dist/sandbox/metrics-ingestion.d.ts +6 -2
  184. package/dist/sandbox/screen-control.d.ts +85 -0
  185. package/dist/sandbox/viewer.d.ts +5 -1
  186. package/dist/sandbox-file-artifacts.d.ts +17 -1
  187. package/dist/scheduled-task-blockers.d.ts +39 -0
  188. package/dist/scheduled-task-deletion.d.ts +3 -4
  189. package/dist/scheduled-task-lifecycle.d.ts +14 -0
  190. package/dist/secret-answers.d.ts +40 -0
  191. package/dist/session-create-observability.d.ts +5 -0
  192. package/dist/session-event-view-36GO3IL7.js +528 -0
  193. package/dist/session-event-view-36GO3IL7.js.map +1 -0
  194. package/dist/signed-state-secret.d.ts +18 -0
  195. package/dist/site-agent-guard.d.ts +53 -0
  196. package/dist/site-data/operations.d.ts +103 -0
  197. package/dist/site-data/service.d.ts +203 -0
  198. package/dist/site-frame-guard.d.ts +32 -0
  199. package/dist/site-publishing/agent-data-tools.d.ts +84 -0
  200. package/dist/site-publishing/agent-model.d.ts +58 -0
  201. package/dist/site-publishing/agent-session.d.ts +16 -0
  202. package/dist/site-publishing/content-scanner.d.ts +31 -0
  203. package/dist/site-publishing/edge-sync.d.ts +48 -0
  204. package/dist/site-publishing/gateway-signature.d.ts +56 -0
  205. package/dist/site-publishing/limits.d.ts +63 -0
  206. package/dist/site-publishing/page-tool-authority.d.ts +30 -0
  207. package/dist/site-publishing/platform-usage.d.ts +113 -0
  208. package/dist/site-publishing/platform.d.ts +21 -0
  209. package/dist/site-publishing/readiness.d.ts +62 -0
  210. package/dist/site-publishing/runtime.d.ts +179 -0
  211. package/dist/site-publishing/service.d.ts +264 -0
  212. package/dist/site-publishing/session-events.d.ts +22 -0
  213. package/dist/site-publishing/session-views.d.ts +36 -0
  214. package/dist/site-publishing/viewer.d.ts +40 -0
  215. package/dist/site-session-origin.d.ts +31 -6
  216. package/dist/site-sql/format.d.ts +47 -0
  217. package/dist/site-sql/gateway.d.ts +50 -0
  218. package/dist/site-sql/service.d.ts +213 -0
  219. package/dist/temporal-schedule-sync.d.ts +26 -0
  220. package/dist/transcription/billing-refusal.d.ts +8 -0
  221. package/dist/transcription/normalize.d.ts +23 -0
  222. package/dist/transcription/providers/azure-mai.d.ts +12 -0
  223. package/dist/transcription/providers/azure-openai.d.ts +4 -0
  224. package/dist/transcription/providers/openai.d.ts +16 -0
  225. package/dist/transcription/providers/subscription-core.d.ts +39 -0
  226. package/dist/transcription/service.d.ts +10 -1
  227. package/dist/transcription/wav-duration.d.ts +8 -0
  228. package/dist/workspace-tool-gateway-attestations.d.ts +37 -0
  229. package/dist/workspace-tool-gateway-observability.d.ts +16 -0
  230. package/dist/workspace-tool-gateway-secrets.d.ts +27 -0
  231. package/dist/workspace-tool-gateway.d.ts +102 -6
  232. package/dist/workspace-tool-target-fence.d.ts +116 -0
  233. package/dist/workspace-tool-target.d.ts +225 -0
  234. package/dist/workspace-webhook-dispatch.d.ts +26 -0
  235. package/dist/xai-subscription-core.d.ts +60 -0
  236. package/package.json +25 -20
  237. package/src/access-grant-rls.ts +64 -14
  238. package/src/admission-trace.ts +14 -0
  239. package/src/app.ts +1684 -252
  240. package/src/artifact-catalog-cursor.ts +1 -0
  241. package/src/attached-browser-viewer.ts +26 -0
  242. package/src/auth/managed-auth-attempt-context.ts +9 -0
  243. package/src/auth/managed-auth-rate-limits.ts +252 -0
  244. package/src/auth/managed-auth-session-adapter.ts +64 -29
  245. package/src/auth/managed-auth.ts +303 -35
  246. package/src/auth/managed-email.ts +18 -1
  247. package/src/auth/managed-sign-in-notifications.ts +81 -0
  248. package/src/auth/new-signups-gate.ts +49 -0
  249. package/src/auth/organization-user-setup.ts +3 -3
  250. package/src/auth/signup-funnel-metrics.ts +164 -0
  251. package/src/azure-live.ts +103 -0
  252. package/src/browser-action-fences.ts +45 -0
  253. package/src/browser-controller-authority.ts +1 -186
  254. package/src/browser-ephemeral.ts +39 -0
  255. package/src/browser-lost-runtime-end.ts +71 -0
  256. package/src/browser-state-authority.ts +1 -236
  257. package/src/claude-default-models.ts +37 -0
  258. package/src/claude-subscription-core.ts +154 -0
  259. package/src/claude-subscription-oauth.ts +352 -0
  260. package/src/claude-subscription-profile.ts +73 -0
  261. package/src/claude-subscription-usage.ts +51 -0
  262. package/src/claude-workspace-connection.ts +82 -0
  263. package/src/codemode.ts +236 -39
  264. package/src/codex-realtime.ts +181 -53
  265. package/src/codex-session-pointers.ts +80 -0
  266. package/src/company-brain-okf.ts +1 -1
  267. package/src/connected-machine-computer-access.ts +2 -1
  268. package/src/connection-ownership.ts +19 -13
  269. package/src/controller-data-plane.ts +34 -0
  270. package/src/credit-promotion-snapshot.ts +36 -0
  271. package/src/editable-artifact-production.ts +10 -0
  272. package/src/editable-artifact-source-session.ts +123 -0
  273. package/src/editable-artifact-websocket.ts +16 -3
  274. package/src/fatal-process-boundary.ts +67 -3
  275. package/src/gateway-realtime.ts +12 -8
  276. package/src/github-access.ts +31 -5
  277. package/src/github-browser-flow.ts +1 -1
  278. package/src/http/acting-person.ts +105 -0
  279. package/src/http/api-contract-compat.ts +49 -0
  280. package/src/http/api-error.ts +210 -2
  281. package/src/http/auth.ts +68 -4
  282. package/src/http/cors.ts +37 -5
  283. package/src/http/deprecation.ts +118 -0
  284. package/src/http/keyed-admission.ts +29 -0
  285. package/src/http/local-browser-boundary.ts +343 -0
  286. package/src/http/metrics-listener.ts +57 -0
  287. package/src/http/path-identifier.ts +54 -0
  288. package/src/http/registered-route-label.ts +34 -0
  289. package/src/http/rejection-telemetry.ts +120 -0
  290. package/src/http/request-body.ts +127 -0
  291. package/src/http/request-source.ts +154 -13
  292. package/src/http/sse.ts +88 -28
  293. package/src/http/unmatched-route.ts +60 -0
  294. package/src/http/user-content.ts +158 -0
  295. package/src/http/variable-sets-removed.ts +122 -0
  296. package/src/http/websocket-upgrade-dispatch.ts +29 -0
  297. package/src/index.ts +107 -57
  298. package/src/integration-connect-metrics.ts +228 -0
  299. package/src/integration-endpoint-test.ts +291 -0
  300. package/src/integrations/api-integrations.ts +81 -7
  301. package/src/integrations/atlassian.ts +202 -83
  302. package/src/integrations/fiken.ts +66 -38
  303. package/src/integrations/github-app-connect.ts +64 -18
  304. package/src/integrations/github-lens-connect.ts +8 -29
  305. package/src/integrations/google-drive.ts +448 -152
  306. package/src/integrations/integration-commit-authority.ts +69 -0
  307. package/src/integrations/marketplace-plugin.ts +1 -1
  308. package/src/integrations/oauth-client.ts +733 -193
  309. package/src/integrations/oauth-profiles.ts +116 -45
  310. package/src/integrations/onepassword-vault-provider.ts +16 -0
  311. package/src/integrations/personal-github-repositories.ts +1 -1
  312. package/src/integrations/personal-github.ts +61 -35
  313. package/src/integrations/provider-oauth.ts +67 -85
  314. package/src/integrations/slack-app-home.ts +5 -5
  315. package/src/integrations/slack-bot.ts +893 -201
  316. package/src/integrations/slack-file-upload-flow.ts +147 -0
  317. package/src/integrations/slack-install.ts +7 -7
  318. package/src/integrations/slack-interactions.ts +1589 -299
  319. package/src/integrations/slack-mrkdwn.ts +193 -0
  320. package/src/integrations/slack-routing.ts +2 -2
  321. package/src/integrations/slack-session-defaults.ts +224 -0
  322. package/src/integrations/slack-task-file-upload.ts +323 -0
  323. package/src/integrations/slack-tool-review.ts +65 -0
  324. package/src/integrations/social-oauth.ts +90 -58
  325. package/src/interaction-agent-access.ts +40 -20
  326. package/src/interaction-agent-version.ts +85 -0
  327. package/src/interaction-holder-heartbeat.ts +24 -8
  328. package/src/interaction-metrics.ts +164 -2
  329. package/src/interaction-route-stages.ts +94 -0
  330. package/src/interaction-secrets-vault.ts +213 -0
  331. package/src/interaction-secrets.ts +426 -0
  332. package/src/mcp/action-catalog-types.ts +14 -0
  333. package/src/mcp/action-catalog.gen.ts +8014 -0
  334. package/src/mcp/action-descriptions.ts +299 -0
  335. package/src/mcp/action-schema-imports.gen.ts +304 -0
  336. package/src/mcp/capability-account-readiness.ts +17 -0
  337. package/src/mcp/child-read-evidence.ts +19 -0
  338. package/src/mcp/company-profile-agent-admin.ts +13 -0
  339. package/src/mcp/contract-input.ts +165 -0
  340. package/src/mcp/documents.ts +9 -2
  341. package/src/mcp/editable-artifacts.ts +29 -11
  342. package/src/mcp/files.ts +5 -1
  343. package/src/mcp/first-party-tool-permissions.ts +7 -285
  344. package/src/mcp/knowledge-entries.ts +108 -34
  345. package/src/mcp/notification-tools.ts +480 -0
  346. package/src/mcp/orchestration-failure-diagnostic.ts +43 -0
  347. package/src/mcp/scheduled-task-input.ts +89 -0
  348. package/src/mcp/scheduled-task-view.ts +63 -3
  349. package/src/mcp/secret-tools.ts +185 -0
  350. package/src/mcp/server.ts +2213 -1116
  351. package/src/mcp/session-admin-access-tools.ts +163 -0
  352. package/src/mcp/session-event-errors.ts +123 -0
  353. package/src/mcp/session-event-view.ts +395 -13
  354. package/src/mcp/session-view.ts +3 -0
  355. package/src/mcp/session-wait.ts +67 -7
  356. package/src/mcp/site-agent-clamp-tools.ts +140 -0
  357. package/src/mcp/site-data-tools.ts +339 -0
  358. package/src/mcp/site-publication-tools.ts +201 -0
  359. package/src/mcp/site-sql-tools.ts +427 -0
  360. package/src/mcp-oauth.ts +635 -45
  361. package/src/model-calls/chat-completions.ts +352 -0
  362. package/src/model-calls/pending-usage-settlements.ts +125 -0
  363. package/src/model-calls/service.ts +694 -0
  364. package/src/model-catalog.ts +68 -17
  365. package/src/native-push-dispatch.ts +457 -0
  366. package/src/observability.ts +15 -1
  367. package/src/organization-mcp.ts +485 -0
  368. package/src/prepared-mcp-actor.ts +154 -0
  369. package/src/prepared-mcp-permissions.ts +38 -0
  370. package/src/routes/analytics-consent.ts +123 -0
  371. package/src/routes/api-integrations.ts +268 -9
  372. package/src/routes/api-keys.ts +164 -25
  373. package/src/routes/artifact-catalog.ts +111 -0
  374. package/src/routes/automations.ts +163 -90
  375. package/src/routes/billing.ts +535 -59
  376. package/src/routes/browser-sessions.ts +966 -342
  377. package/src/routes/canonical-human-identities.ts +61 -0
  378. package/src/routes/capabilities.ts +112 -5
  379. package/src/routes/channels.ts +4 -3
  380. package/src/routes/chat-completions.ts +235 -0
  381. package/src/routes/claude-core-usage.ts +147 -0
  382. package/src/routes/claude-subscription-accounts.ts +233 -0
  383. package/src/routes/claude-subscription-oauth.ts +175 -0
  384. package/src/routes/client-errors.ts +394 -0
  385. package/src/routes/codex-core.ts +687 -0
  386. package/src/routes/codex.ts +1277 -1119
  387. package/src/routes/company-brain.ts +4 -0
  388. package/src/routes/computer-sessions.ts +319 -85
  389. package/src/routes/connect.ts +277 -175
  390. package/src/routes/connections.ts +690 -363
  391. package/src/routes/desktop-distribution.ts +217 -0
  392. package/src/routes/documents.ts +13 -7
  393. package/src/routes/editable-artifacts.ts +74 -4
  394. package/src/routes/enrollments.ts +110 -16
  395. package/src/routes/external-identity-links.ts +13 -12
  396. package/src/routes/files.ts +41 -16
  397. package/src/routes/github-browser-fonts.gen.ts +12 -0
  398. package/src/routes/github-browser-pages.ts +258 -0
  399. package/src/routes/github.ts +200 -75
  400. package/src/routes/inbox.ts +353 -0
  401. package/src/routes/insights-response-cache.ts +83 -0
  402. package/src/routes/insights-usage.ts +345 -0
  403. package/src/routes/insights.ts +103 -8
  404. package/src/routes/install.ts +51 -10
  405. package/src/routes/integration-facets.ts +70 -28
  406. package/src/routes/interaction-placement-message.ts +12 -0
  407. package/src/routes/knowledge.ts +136 -27
  408. package/src/routes/machines.ts +189 -135
  409. package/src/routes/managed-auth-session-sets.ts +43 -10
  410. package/src/routes/managed-onboarding.ts +39 -19
  411. package/src/routes/managed-sign-in-methods.ts +433 -0
  412. package/src/routes/memory-slack-publications.ts +3 -2
  413. package/src/routes/model-account-choice.ts +194 -0
  414. package/src/routes/model-account-settings.ts +235 -0
  415. package/src/routes/model-connection-access.ts +210 -48
  416. package/src/routes/native-app-auth.ts +296 -0
  417. package/src/routes/organization-integration-policy.ts +116 -0
  418. package/src/routes/organization-integrations.ts +326 -0
  419. package/src/routes/organization-mcp-connections.ts +183 -0
  420. package/src/routes/organization-memberships.ts +205 -19
  421. package/src/routes/organization-model-defaults.ts +110 -0
  422. package/src/routes/organization-model-providers.ts +74 -3
  423. package/src/routes/organization-service-accounts.ts +128 -0
  424. package/src/routes/organization-sessions.ts +21 -5
  425. package/src/routes/personal-api-keys.ts +184 -0
  426. package/src/routes/personal-github-git-broker.ts +2 -2
  427. package/src/routes/personal-github.ts +9 -4
  428. package/src/routes/plugins.ts +46 -7
  429. package/src/routes/pr-review-github.ts +105 -118
  430. package/src/routes/pr-review.ts +88 -82
  431. package/src/routes/preference-registry.ts +18 -0
  432. package/src/routes/rigs.ts +48 -13
  433. package/src/routes/scheduled-tasks.ts +347 -27
  434. package/src/routes/session-admin-access.ts +271 -0
  435. package/src/routes/session-artifact-associations.ts +164 -0
  436. package/src/routes/session-history-imports.ts +305 -0
  437. package/src/routes/sessions.ts +1682 -363
  438. package/src/routes/site-data.ts +340 -0
  439. package/src/routes/site-publishing.ts +584 -0
  440. package/src/routes/site-runtime.ts +1944 -0
  441. package/src/routes/site-sql.ts +263 -0
  442. package/src/routes/skill-content.ts +72 -7
  443. package/src/routes/skills.ts +5 -4
  444. package/src/routes/slack-bot-access.ts +108 -0
  445. package/src/routes/social.ts +27 -15
  446. package/src/routes/subscription-account-pools.ts +209 -0
  447. package/src/routes/subscription-core-http.ts +18 -0
  448. package/src/routes/subscription-pool-access.ts +180 -0
  449. package/src/routes/subscription-pool-core.ts +552 -0
  450. package/src/routes/supergrok.ts +174 -655
  451. package/src/routes/transcription-recordings.ts +71 -4
  452. package/src/routes/transcriptions.ts +26 -2
  453. package/src/routes/usage-allowances.ts +381 -0
  454. package/src/routes/variable-sets-removed.ts +19 -0
  455. package/src/routes/vault-providers.ts +782 -0
  456. package/src/routes/vaults.ts +421 -0
  457. package/src/routes/video-generation.ts +30 -12
  458. package/src/routes/workspace-artifacts.ts +165 -53
  459. package/src/routes/workspace-integrations.ts +576 -0
  460. package/src/routes/workspace-model-providers.ts +148 -0
  461. package/src/routes/workspace-state.ts +4 -0
  462. package/src/routes/workspaces.ts +625 -117
  463. package/src/sandbox/agent-update.ts +315 -0
  464. package/src/sandbox/auth-callout.ts +104 -21
  465. package/src/sandbox/channel-a.ts +150 -49
  466. package/src/sandbox/enrollment.ts +131 -22
  467. package/src/sandbox/machine-audience.ts +192 -0
  468. package/src/sandbox/machines.ts +75 -31
  469. package/src/sandbox/metrics-ingestion.ts +133 -2
  470. package/src/sandbox/rematerialize.ts +51 -21
  471. package/src/sandbox/screen-control.ts +289 -0
  472. package/src/sandbox/viewer.ts +33 -58
  473. package/src/sandbox-file-artifacts.ts +53 -27
  474. package/src/scheduled-task-blockers.ts +293 -0
  475. package/src/scheduled-task-deletion.ts +13 -3
  476. package/src/scheduled-task-lifecycle.ts +84 -0
  477. package/src/secret-answers.ts +119 -0
  478. package/src/session-create-observability.ts +46 -0
  479. package/src/session-realtime-context.ts +26 -4
  480. package/src/signed-state-secret.ts +58 -0
  481. package/src/site-agent-guard.ts +261 -0
  482. package/src/site-data/operations.ts +777 -0
  483. package/src/site-data/service.ts +1043 -0
  484. package/src/site-frame-guard.ts +107 -0
  485. package/src/site-publishing/agent-data-tools.ts +250 -0
  486. package/src/site-publishing/agent-model.ts +127 -0
  487. package/src/site-publishing/agent-session.ts +148 -0
  488. package/src/site-publishing/content-scanner.ts +93 -0
  489. package/src/site-publishing/edge-sync.ts +148 -0
  490. package/src/site-publishing/gateway-signature.ts +198 -0
  491. package/src/site-publishing/limits.ts +315 -0
  492. package/src/site-publishing/page-tool-authority.ts +111 -0
  493. package/src/site-publishing/platform-usage.ts +479 -0
  494. package/src/site-publishing/platform.ts +98 -0
  495. package/src/site-publishing/readiness.ts +330 -0
  496. package/src/site-publishing/runtime.ts +831 -0
  497. package/src/site-publishing/service.ts +1282 -0
  498. package/src/site-publishing/session-events.ts +262 -0
  499. package/src/site-publishing/session-views.ts +262 -0
  500. package/src/site-publishing/viewer.ts +75 -0
  501. package/src/site-session-origin.ts +91 -6
  502. package/src/site-sql/format.ts +134 -0
  503. package/src/site-sql/gateway.ts +168 -0
  504. package/src/site-sql/service.ts +1636 -0
  505. package/src/site-uploads.ts +27 -5
  506. package/src/temporal-schedule-sync.ts +74 -0
  507. package/src/transcription/billing-refusal.ts +14 -0
  508. package/src/transcription/normalize.ts +77 -0
  509. package/src/transcription/providers/azure-mai.ts +98 -0
  510. package/src/transcription/providers/azure-openai.ts +16 -7
  511. package/src/transcription/providers/codex-subscription.ts +190 -67
  512. package/src/transcription/providers/openai.ts +79 -5
  513. package/src/transcription/providers/subscription-core.ts +125 -0
  514. package/src/transcription/providers/xai-subscription.ts +81 -83
  515. package/src/transcription/segmenter.ts +7 -1
  516. package/src/transcription/service.ts +239 -10
  517. package/src/transcription/wav-duration.ts +39 -0
  518. package/src/workspace-deletion.ts +25 -1
  519. package/src/workspace-tool-gateway-attestations.ts +133 -0
  520. package/src/workspace-tool-gateway-observability.ts +64 -0
  521. package/src/workspace-tool-gateway-secrets.ts +104 -0
  522. package/src/workspace-tool-gateway.ts +921 -103
  523. package/src/workspace-tool-target-fence.ts +380 -0
  524. package/src/workspace-tool-target.ts +554 -0
  525. package/src/workspace-webhook-dispatch.ts +225 -0
  526. package/src/xai-realtime.ts +85 -81
  527. package/src/xai-subscription-core.ts +172 -0
  528. package/dist/browser-auth-broker.d.ts +0 -20
  529. package/dist/chunk-AJ62T5QN.js.map +0 -1
  530. package/dist/connection-authority-owner.d.ts +0 -59
  531. package/dist/routes/connection-authorities.d.ts +0 -3
  532. package/dist/routes/environments.d.ts +0 -5
  533. package/dist/routes/host-mcp-bindings.d.ts +0 -5
  534. package/dist/routes/host-mcp-resolvers.d.ts +0 -3
  535. package/dist/routes/packs.d.ts +0 -3
  536. package/dist/session-event-view-MU3HMNV3.js +0 -264
  537. package/dist/session-event-view-MU3HMNV3.js.map +0 -1
  538. package/dist/xai-subscription-auth.d.ts +0 -23
  539. package/src/browser-auth-broker.ts +0 -155
  540. package/src/connection-authority-owner.ts +0 -61
  541. package/src/routes/connection-authorities.ts +0 -139
  542. package/src/routes/environments.ts +0 -388
  543. package/src/routes/host-mcp-bindings.ts +0 -122
  544. package/src/routes/host-mcp-resolvers.ts +0 -41
  545. package/src/routes/packs.ts +0 -784
  546. package/src/xai-subscription-auth.ts +0 -139
@@ -0,0 +1,123 @@
1
+ // Content-free analytics consent beacon.
2
+ //
3
+ // When a person answers the web console's optional-analytics banner, the
4
+ // browser reports only the closed decision (`granted` or `denied`). Each
5
+ // accepted report increments `opengeni_analytics_consent_total{decision}`, so
6
+ // product reports can state how much of the audience the consent-gated
7
+ // analytics providers never see. The body carries no identifier, URL, cookie,
8
+ // or user content, the browser sends it with `credentials: "omit"`, and the
9
+ // route writes no log line. It admits anonymous callers because the banner is
10
+ // answered before sign-in too. Any HTTP client that omits `Origin` can still
11
+ // send reports up to the admission ceiling, so read the counter as a ratio of
12
+ // decisions, not as a count of people.
13
+ import type { Settings } from "@opengeni/config";
14
+ import {
15
+ ANALYTICS_CONSENT_DECISIONS,
16
+ ANALYTICS_CONSENT_PATH,
17
+ ANALYTICS_CONSENT_REPORT_MAX_BYTES,
18
+ type AnalyticsConsentDecision,
19
+ } from "@opengeni/contracts/analytics-consent-report";
20
+ import type { Observability } from "@opengeni/observability";
21
+ import type { Context, Hono } from "hono";
22
+ import { bodyLimit } from "hono/body-limit";
23
+ import { z } from "zod";
24
+
25
+ import { isAllowedBrowserOrigin } from "../http/cors";
26
+ import { createKeyedAdmission, type KeyedAdmission } from "../http/keyed-admission";
27
+
28
+ export { ANALYTICS_CONSENT_DECISIONS, ANALYTICS_CONSENT_PATH, type AnalyticsConsentDecision };
29
+
30
+ const REJECTION_REASONS = ["invalid", "too_large", "origin", "rate_limited"] as const;
31
+ type RejectionReason = (typeof REJECTION_REASONS)[number];
32
+
33
+ export const AnalyticsConsentReport = z
34
+ .object({ decision: z.enum(ANALYTICS_CONSENT_DECISIONS) })
35
+ .strict();
36
+ export type AnalyticsConsentReport = z.infer<typeof AnalyticsConsentReport>;
37
+
38
+ const CONSENT_METRIC = {
39
+ name: "opengeni_analytics_consent_total",
40
+ help: "Answers to the web console's optional-analytics banner, by closed decision. Admission is bounded per API process, so this is a lower bound.",
41
+ } as const;
42
+ const REJECTIONS_METRIC = {
43
+ name: "opengeni_analytics_consent_reports_rejected_total",
44
+ help: "Analytics consent reports the API refused, by closed reason.",
45
+ } as const;
46
+
47
+ export type AnalyticsConsentAdmission = KeyedAdmission<AnalyticsConsentDecision>;
48
+
49
+ export function parseAnalyticsConsentReport(body: string | null): AnalyticsConsentReport | null {
50
+ if (
51
+ body === null ||
52
+ new TextEncoder().encode(body).byteLength > ANALYTICS_CONSENT_REPORT_MAX_BYTES
53
+ ) {
54
+ return null;
55
+ }
56
+ let value: unknown;
57
+ try {
58
+ value = JSON.parse(body);
59
+ } catch {
60
+ return null;
61
+ }
62
+ const parsed = AnalyticsConsentReport.safeParse(value);
63
+ return parsed.success ? parsed.data : null;
64
+ }
65
+
66
+ /**
67
+ * The exact beacon request. The app-wide request-body limit skips it because
68
+ * the route enforces its own small limit on the streamed body.
69
+ */
70
+ export function isAnalyticsConsentReportRequest(method: string, pathname: string): boolean {
71
+ return method === "POST" && pathname === ANALYTICS_CONSENT_PATH;
72
+ }
73
+
74
+ export function registerAnalyticsConsentRoutes(
75
+ app: Hono,
76
+ deps: {
77
+ observability: Observability;
78
+ settings: Pick<Settings, "corsAllowOriginRegex" | "publicBaseUrl" | "webBaseUrl">;
79
+ admission?: AnalyticsConsentAdmission;
80
+ },
81
+ ): void {
82
+ const { observability, settings } = deps;
83
+ // Consent answers are rare (once per browser), so a small burst and a slow
84
+ // refill still cover a launch-day spike on each API process.
85
+ const admission =
86
+ deps.admission ??
87
+ createKeyedAdmission<AnalyticsConsentDecision>({ capacity: 60, refillPerSecond: 1 });
88
+ // Publish every finite series at zero so the first answer after a deploy is
89
+ // an increase from a baseline rather than a series appearing from nothing.
90
+ for (const decision of ANALYTICS_CONSENT_DECISIONS) {
91
+ observability.incrementCounter({ ...CONSENT_METRIC, labels: { decision }, amount: 0 });
92
+ }
93
+ for (const reason of REJECTION_REASONS) {
94
+ observability.incrementCounter({ ...REJECTIONS_METRIC, labels: { reason }, amount: 0 });
95
+ }
96
+ const reject = (c: Context, reason: RejectionReason, status: 400 | 403 | 413 | 429) => {
97
+ observability.incrementCounter({ ...REJECTIONS_METRIC, labels: { reason } });
98
+ c.header("cache-control", "no-store");
99
+ return c.body(null, status);
100
+ };
101
+
102
+ app.post(
103
+ ANALYTICS_CONSENT_PATH,
104
+ bodyLimit({
105
+ maxSize: ANALYTICS_CONSENT_REPORT_MAX_BYTES,
106
+ onError: (c) => reject(c, "too_large", 413),
107
+ }),
108
+ async (c) => {
109
+ c.header("cache-control", "no-store");
110
+ // Browsers always send Origin on this POST, so a foreign page cannot
111
+ // inflate the counter through its visitors' browsers.
112
+ const origin = c.req.header("origin");
113
+ if (origin !== undefined && !isAllowedBrowserOrigin(origin, settings)) {
114
+ return reject(c, "origin", 403);
115
+ }
116
+ const report = parseAnalyticsConsentReport(await c.req.text().catch(() => null));
117
+ if (!report) return reject(c, "invalid", 400);
118
+ if (!admission.admit(report.decision)) return reject(c, "rate_limited", 429);
119
+ observability.incrementCounter({ ...CONSENT_METRIC, labels: { decision: report.decision } });
120
+ return c.body(null, 204);
121
+ },
122
+ );
123
+ }
@@ -7,6 +7,7 @@ import {
7
7
  } from "@opengeni/capabilities";
8
8
  import {
9
9
  ApiIntegrationPreview,
10
+ OrganizationIntegrationDeniedError,
10
11
  ListIntegrationDefinitionsResponse,
11
12
  ApiIntegrationUninstallPreview,
12
13
  InstallApiIntegrationRequest,
@@ -17,12 +18,19 @@ import {
17
18
  UninstallApiIntegrationResult,
18
19
  type AccessGrant,
19
20
  } from "@opengeni/contracts";
20
- import { requireAccessGrant, type ApiRouteDeps } from "@opengeni/core";
21
21
  import {
22
+ requireAccessGrant,
23
+ integrationSourceForOrganizationPolicy,
24
+ type ApiRouteDeps,
25
+ } from "@opengeni/core";
26
+ import { withOrganizationIntegrationPolicyFence } from "@opengeni/db/organization-integration-policy";
27
+ import {
28
+ ApiIntegrationConnectionReferenceError,
22
29
  ApiIntegrationInstallationVersionConflictError,
23
30
  buildConnectionTokenResolver,
24
31
  getApiIntegrationUninstallPreview,
25
32
  getConnectionMetadata,
33
+ getApiIntegrationReconciliationSnapshot,
26
34
  installApiIntegration,
27
35
  IntegrationFacetBindingOwnershipConflictError,
28
36
  IntegrationFacetBindingVersionConflictError,
@@ -40,6 +48,8 @@ import {
40
48
  type ApiIntegrationConnectionDescriptor,
41
49
  type ResolvedApiIntegrationPreview,
42
50
  } from "../integrations/api-integrations";
51
+ import { ApiHttpError } from "../http/api-error";
52
+ import { parseRequestJson } from "../http/request-body";
43
53
 
44
54
  export type ApiIntegrationRouteOverrides = Readonly<{ fetchImpl?: FetchLike }>;
45
55
 
@@ -81,6 +91,14 @@ export function validatedIntegrationInstallInput(
81
91
  throw new HTTPException(422, {
82
92
  message: "Choose a Personal Connection before installing for yourself.",
83
93
  });
94
+ if (payload.autoApprovedTools?.length) {
95
+ const selected = new Set(payload.allowedTools ?? resolved.preview.tools.map((tool) => tool.id));
96
+ const outside = payload.autoApprovedTools.find((tool) => !selected.has(tool));
97
+ if (outside)
98
+ throw new HTTPException(422, {
99
+ message: `autoApprovedTools must name selected Integration tools: ${outside.slice(0, 200)}`,
100
+ });
101
+ }
84
102
  return {
85
103
  accountId: grant.accountId,
86
104
  workspaceId,
@@ -108,12 +126,63 @@ export function validatedIntegrationInstallInput(
108
126
  : {}),
109
127
  requiredScopes: resolved.requiredScopes,
110
128
  ownership: resolved.preview.connectionOwnership === "personal" ? "subject" : "workspace",
111
- ...(payload.allowedTools ? { allowedTools: payload.allowedTools } : {}),
129
+ ...(payload.allowedTools
130
+ ? { allowedTools: validatedAllowedToolIds(payload.allowedTools, resolved.revision.tools) }
131
+ : {}),
132
+ ...(payload.autoApprovedTools ? { autoApprovedTools: payload.autoApprovedTools } : {}),
112
133
  facetDefinitions: integrationFacetDefinitions(resolved.preview.definitionId),
113
134
  revision: resolved.revision,
114
135
  };
115
136
  }
116
137
 
138
+ const MAX_REPORTED_TOOL_IDS = 50;
139
+
140
+ /**
141
+ * `allowedTools` names tools by their preview `id`, the stable identity the
142
+ * install persists. Reject anything else as a client error that lists the
143
+ * valid ids; a caller that sent a preview `operationKey` is told which id it
144
+ * maps to rather than having it silently reinterpreted.
145
+ */
146
+ export function validatedAllowedToolIds(
147
+ allowedTools: readonly string[],
148
+ tools: readonly { id: string; operationKey: string }[],
149
+ ): string[] {
150
+ const ids = new Set(tools.map((tool) => tool.id));
151
+ const unknown = [
152
+ ...new Set(allowedTools.map((tool) => tool.trim()).filter((tool) => !ids.has(tool))),
153
+ ];
154
+ if (unknown.length === 0) return [...allowedTools];
155
+ const operationKeyMatches = unknown.flatMap((value) => {
156
+ const tool = tools.find((candidate) => candidate.operationKey === value);
157
+ return tool ? [{ operationKey: value, id: tool.id }] : [];
158
+ });
159
+ const validToolIds = tools.map((tool) => tool.id);
160
+ const shownUnknown = unknown.slice(0, 10);
161
+ const hint =
162
+ operationKeyMatches.length > 0
163
+ ? ` allowedTools takes tool ids, not operationKeys: ${operationKeyMatches
164
+ .slice(0, 5)
165
+ .map((match) => `${match.operationKey} -> ${match.id}`)
166
+ .join(", ")}.`
167
+ : "";
168
+ throw new ApiHttpError(422, {
169
+ code: "validation_failed",
170
+ message: `allowedTools contains unknown tool ids: ${shownUnknown.join(", ")}${
171
+ unknown.length > shownUnknown.length
172
+ ? `, and ${unknown.length - shownUnknown.length} more`
173
+ : ""
174
+ }. Use the \`id\` of each tool in the Integration preview.${hint}`,
175
+ retryable: false,
176
+ details: {
177
+ code: "unknown_integration_tools",
178
+ unknownTools: shownUnknown,
179
+ operationKeyMatches: operationKeyMatches.slice(0, MAX_REPORTED_TOOL_IDS),
180
+ validToolIds: validToolIds.slice(0, MAX_REPORTED_TOOL_IDS),
181
+ validToolIdCount: validToolIds.length,
182
+ },
183
+ });
184
+ }
185
+
117
186
  export function registerApiIntegrationRoutes(
118
187
  app: Hono,
119
188
  deps: ApiRouteDeps,
@@ -205,24 +274,37 @@ export function registerApiIntegrationRoutes(
205
274
  app.post("/v1/workspaces/:workspaceId/integrations/preview", async (c) => {
206
275
  const workspaceId = c.req.param("workspaceId");
207
276
  const grant = await requireAccessGrant(c, deps, workspaceId, "workspace:read");
208
- const payload = PreviewApiIntegrationRequest.parse(await c.req.json());
277
+ const payload = await parseRequestJson(c, PreviewApiIntegrationRequest);
209
278
  const resolved = await resolveForRoute({
210
279
  deps,
211
280
  transport,
281
+ accountId: grant.accountId,
212
282
  workspaceId,
213
283
  subjectId: grant.subjectId,
214
284
  payload,
215
285
  });
216
- return c.json(ApiIntegrationPreview.parse(resolved.preview));
286
+ const credentialWarnings = await connectionCredentialPlacementWarnings(
287
+ deps,
288
+ workspaceId,
289
+ grant.subjectId,
290
+ resolved.preview,
291
+ );
292
+ return c.json(
293
+ ApiIntegrationPreview.parse({
294
+ ...resolved.preview,
295
+ warnings: [...resolved.preview.warnings, ...credentialWarnings].slice(0, 32),
296
+ }),
297
+ );
217
298
  });
218
299
 
219
300
  app.post("/v1/workspaces/:workspaceId/integrations/install", async (c) => {
220
301
  const workspaceId = c.req.param("workspaceId");
221
302
  const grant = await requireAccessGrant(c, deps, workspaceId, "capabilities:manage");
222
- const payload = InstallApiIntegrationRequest.parse(await c.req.json());
303
+ const payload = await parseRequestJson(c, InstallApiIntegrationRequest);
223
304
  const resolved = await resolveForRoute({
224
305
  deps,
225
306
  transport,
307
+ accountId: grant.accountId,
226
308
  workspaceId,
227
309
  subjectId: grant.subjectId,
228
310
  payload,
@@ -234,6 +316,11 @@ export function registerApiIntegrationRoutes(
234
316
  payload.expectedInstanceVersion === undefined ? 201 : 200,
235
317
  );
236
318
  } catch (error) {
319
+ if (error instanceof ApiIntegrationConnectionReferenceError) {
320
+ throw new HTTPException(error.reason === "not_found" ? 404 : 422, {
321
+ message: error.reason === "not_found" ? "connection not found" : error.message,
322
+ });
323
+ }
237
324
  if (
238
325
  error instanceof IntegrationFacetBindingVersionConflictError ||
239
326
  error instanceof IntegrationFacetBindingVersionRequiredError ||
@@ -274,7 +361,7 @@ export function registerApiIntegrationRoutes(
274
361
  const grant = await requireAccessGrant(c, deps, workspaceId, "capabilities:manage");
275
362
  const capabilityId = decodeURIComponent(c.req.param("capabilityId"));
276
363
  const instanceKey = decodeURIComponent(c.req.param("instanceKey"));
277
- const payload = UninstallApiIntegrationRequest.parse(await c.req.json());
364
+ const payload = await parseRequestJson(c, UninstallApiIntegrationRequest);
278
365
  try {
279
366
  return c.json(
280
367
  UninstallApiIntegrationResult.parse(
@@ -308,21 +395,45 @@ export function registerApiIntegrationRoutes(
308
395
  export async function resolveForRoute(input: {
309
396
  deps: ApiRouteDeps;
310
397
  transport: ReturnType<typeof createPinnedIntegrationTransport>;
398
+ accountId: string;
311
399
  workspaceId: string;
312
400
  subjectId: string;
313
401
  payload: PreviewApiIntegrationRequest | InstallApiIntegrationRequest;
314
402
  }): ReturnType<typeof resolveApiIntegrationPreview> {
403
+ const payload = structuredClone(input.payload);
404
+ const preparation = await withOrganizationIntegrationPolicyFence(
405
+ input.deps.db,
406
+ input,
407
+ async (tx, policy) => {
408
+ try {
409
+ return { source: integrationSourceForOrganizationPolicy(policy, payload.source) };
410
+ } catch (error) {
411
+ if (!(error instanceof OrganizationIntegrationDeniedError)) throw error;
412
+ const install = InstallApiIntegrationRequest.safeParse(payload);
413
+ if (install.success) {
414
+ const resolved = await storedReconciliationPreview(
415
+ { ...input, deps: { ...input.deps, db: tx } },
416
+ install.data,
417
+ );
418
+ if (resolved) return { resolved };
419
+ }
420
+ throw error;
421
+ }
422
+ },
423
+ );
424
+ if (preparation.resolved) return preparation.resolved;
425
+ const source = preparation.source!;
315
426
  try {
316
- const connection = input.payload.connectionId
427
+ const connection = payload.connectionId
317
428
  ? await requireVisibleConnection(
318
429
  input.deps,
319
430
  input.workspaceId,
320
431
  input.subjectId,
321
- input.payload.connectionId,
432
+ payload.connectionId,
322
433
  )
323
434
  : null;
324
435
  return await resolveApiIntegrationPreview({
325
- source: input.payload.source,
436
+ source,
326
437
  connection: connectionDescriptor(connection),
327
438
  transport: input.transport,
328
439
  authority: {
@@ -353,6 +464,154 @@ export async function resolveForRoute(input: {
353
464
  }
354
465
  }
355
466
 
467
+ async function storedReconciliationPreview(
468
+ input: { deps: ApiRouteDeps; accountId: string; workspaceId: string; subjectId: string },
469
+ payload: InstallApiIntegrationRequest,
470
+ ): Promise<ResolvedApiIntegrationPreview | null> {
471
+ const snapshot = await getApiIntegrationReconciliationSnapshot(input.deps.db, {
472
+ accountId: input.accountId,
473
+ workspaceId: input.workspaceId,
474
+ subjectId: input.subjectId,
475
+ source: payload.source,
476
+ expectedRevisionId: payload.expectedRevisionId,
477
+ expectedContentSha256: payload.expectedContentSha256,
478
+ ...(payload.connectionId !== undefined ? { connectionId: payload.connectionId } : {}),
479
+ ...(payload.instanceKey !== undefined ? { instanceKey: payload.instanceKey } : {}),
480
+ ...(payload.allowedTools !== undefined ? { allowedTools: payload.allowedTools } : {}),
481
+ });
482
+ if (!snapshot) return null;
483
+ const { runtime, baseServerId, name, provider, requiredScopes } = snapshot;
484
+ const connection = payload.connectionId
485
+ ? await requireVisibleConnection(
486
+ input.deps,
487
+ input.workspaceId,
488
+ input.subjectId,
489
+ payload.connectionId,
490
+ )
491
+ : null;
492
+ const scheme = runtime.authScheme;
493
+ const auth = !apiIntegrationRequiresConnection(scheme)
494
+ ? { kind: "none" }
495
+ : scheme.kind === "oauth2"
496
+ ? { kind: "oauth2", providerDomain: runtime.providerDomain, scopes: requiredScopes }
497
+ : scheme.kind === "api_key"
498
+ ? {
499
+ kind: "api_key",
500
+ providerDomain: runtime.providerDomain,
501
+ carrier: scheme.carrier,
502
+ name: scheme.name,
503
+ }
504
+ : scheme.kind === "http"
505
+ ? { kind: "http", providerDomain: runtime.providerDomain, scheme: scheme.scheme }
506
+ : null;
507
+ if (!auth) return null;
508
+ return {
509
+ preview: ApiIntegrationPreview.parse({
510
+ source: payload.source,
511
+ definitionId: runtime.definitionId,
512
+ definitionProvenance: runtime.definitionProvenance,
513
+ protocol: runtime.protocol,
514
+ capabilityId: runtime.capabilityId,
515
+ pluginKey: runtime.pluginKey,
516
+ serverId: baseServerId,
517
+ name,
518
+ description: runtime.description,
519
+ provider,
520
+ providerDomain: runtime.providerDomain,
521
+ baseUrl: runtime.baseUrl,
522
+ sourceUrl: runtime.sourceUrl,
523
+ revisionId: runtime.revision.id,
524
+ contentSha256: runtime.revision.contentSha256,
525
+ auth,
526
+ connectionId: connection?.id ?? null,
527
+ connectionOwnership: connection ? (connection.subjectId ? "personal" : "workspace") : null,
528
+ tools: runtime.revision.tools.map((tool) => ({
529
+ id: tool.id,
530
+ operationKey: tool.operationKey,
531
+ name: tool.name,
532
+ description: tool.description,
533
+ safety: tool.safety,
534
+ approvalMode: tool.approvalMode,
535
+ deprecated: tool.deprecated,
536
+ })),
537
+ warnings: [],
538
+ }),
539
+ revision: runtime.revision,
540
+ provider,
541
+ requiredScopes,
542
+ authScheme: runtime.authScheme,
543
+ };
544
+ }
545
+
546
+ /**
547
+ * Advisory preview check that the selected credential Connection delivers
548
+ * its secret where the API description says the provider reads it. Compares
549
+ * carrier and name only; never returns or logs a credential value. Install is
550
+ * unchanged: descriptions are often imprecise, so a mismatch warns instead of
551
+ * refusing a Connection the provider may actually accept.
552
+ */
553
+ async function connectionCredentialPlacementWarnings(
554
+ deps: ApiRouteDeps,
555
+ workspaceId: string,
556
+ subjectId: string,
557
+ preview: ApiIntegrationPreview,
558
+ ): Promise<string[]> {
559
+ if (!preview.connectionId || (preview.auth.kind !== "api_key" && preview.auth.kind !== "http")) {
560
+ return [];
561
+ }
562
+ const connection = await getConnectionMetadata(
563
+ deps.db,
564
+ workspaceId,
565
+ preview.connectionId,
566
+ subjectId,
567
+ );
568
+ if (!connection || connection.kind === "oauth2") return [];
569
+ let result: Awaited<ReturnType<ReturnType<typeof buildConnectionTokenResolver>>>;
570
+ try {
571
+ result = await buildConnectionTokenResolver(
572
+ deps.db,
573
+ deps.settings,
574
+ )({
575
+ workspaceId,
576
+ ...(connection.subjectId ? { subjectId } : {}),
577
+ serverId: `preview_${connection.id}`,
578
+ connectionRef: {
579
+ connectionId: connection.id,
580
+ providerDomain: connection.providerDomain,
581
+ kind: connection.kind,
582
+ subjectScope: connection.subjectId ? "subject" : "workspace",
583
+ },
584
+ destinationUrl: preview.baseUrl,
585
+ credentialTarget: "http_api",
586
+ });
587
+ } catch {
588
+ return [];
589
+ }
590
+ if (result.status === "auth_needed") return [];
591
+ const expected =
592
+ preview.auth.kind === "api_key"
593
+ ? { carrier: preview.auth.carrier, name: preview.auth.name }
594
+ : { carrier: "header" as const, name: "Authorization" };
595
+ const placements =
596
+ result.placements ??
597
+ Object.keys(result.headers).map((name) => ({ carrier: "header" as const, name }));
598
+ const matches = placements.some(
599
+ (placement) =>
600
+ placement.carrier === expected.carrier &&
601
+ (placement.carrier === "header"
602
+ ? placement.name.toLowerCase() === expected.name.toLowerCase()
603
+ : placement.name === expected.name),
604
+ );
605
+ if (matches) return [];
606
+ const actual = placements
607
+ .slice(0, 3)
608
+ .map((placement) => `${placement.carrier} "${placement.name.slice(0, 64)}"`)
609
+ .join(", ");
610
+ return [
611
+ `The API description expects the credential in ${expected.carrier} "${expected.name.slice(0, 64)}", but the selected Connection sends it in ${actual}. Calls may be rejected as unauthenticated.`,
612
+ ];
613
+ }
614
+
356
615
  async function requireVisibleConnection(
357
616
  deps: ApiRouteDeps,
358
617
  workspaceId: string,