@opengeni/api-router 3.0.1 → 3.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. package/dist/access-grant-rls.d.ts +8 -1
  2. package/dist/admission-trace.d.ts +8 -0
  3. package/dist/app.d.ts +50 -3
  4. package/dist/app.js +10 -1
  5. package/dist/artifact-catalog-cursor.d.ts +1 -0
  6. package/dist/attached-browser-viewer.d.ts +11 -0
  7. package/dist/auth/managed-auth-attempt-context.d.ts +2 -0
  8. package/dist/auth/managed-auth-rate-limits.d.ts +167 -0
  9. package/dist/auth/managed-auth-session-adapter.d.ts +9 -1
  10. package/dist/auth/managed-auth.d.ts +72 -5
  11. package/dist/auth/managed-sign-in-notifications.d.ts +4 -0
  12. package/dist/auth/new-signups-gate.d.ts +23 -0
  13. package/dist/auth/signup-funnel-metrics.d.ts +44 -0
  14. package/dist/azure-live.d.ts +28 -0
  15. package/dist/browser-action-fences.d.ts +13 -0
  16. package/dist/browser-controller-authority.d.ts +1 -61
  17. package/dist/browser-ephemeral.d.ts +5 -0
  18. package/dist/browser-lost-runtime-end.d.ts +24 -0
  19. package/dist/browser-state-authority.d.ts +1 -27
  20. package/dist/chunk-OGQDXVXY.js +18 -0
  21. package/dist/chunk-OGQDXVXY.js.map +1 -0
  22. package/dist/{chunk-AJ62T5QN.js → chunk-OT56OY4V.js} +80503 -39869
  23. package/dist/chunk-OT56OY4V.js.map +1 -0
  24. package/dist/claude-default-models.d.ts +19 -0
  25. package/dist/claude-subscription-core.d.ts +50 -0
  26. package/dist/claude-subscription-oauth.d.ts +36 -0
  27. package/dist/claude-subscription-profile.d.ts +9 -0
  28. package/dist/claude-subscription-usage.d.ts +6 -0
  29. package/dist/claude-workspace-connection.d.ts +15 -0
  30. package/dist/codemode.d.ts +40 -5
  31. package/dist/codex-realtime.d.ts +29 -3
  32. package/dist/codex-session-pointers.d.ts +19 -0
  33. package/dist/connection-ownership.d.ts +6 -3
  34. package/dist/controller-data-plane.d.ts +16 -0
  35. package/dist/credit-promotion-snapshot.d.ts +6 -0
  36. package/dist/editable-artifact-source-session.d.ts +3 -0
  37. package/dist/editable-artifact-websocket.d.ts +5 -3
  38. package/dist/fatal-process-boundary.d.ts +9 -1
  39. package/dist/github-access.d.ts +7 -1
  40. package/dist/github-browser-flow.d.ts +1 -1
  41. package/dist/http/acting-person.d.ts +36 -0
  42. package/dist/http/api-contract-compat.d.ts +19 -0
  43. package/dist/http/api-error.d.ts +50 -1
  44. package/dist/http/auth.d.ts +8 -1
  45. package/dist/http/cors.d.ts +12 -0
  46. package/dist/http/deprecation.d.ts +42 -0
  47. package/dist/http/keyed-admission.d.ts +12 -0
  48. package/dist/http/local-browser-boundary.d.ts +72 -0
  49. package/dist/http/metrics-listener.d.ts +22 -0
  50. package/dist/http/path-identifier.d.ts +17 -0
  51. package/dist/http/registered-route-label.d.ts +16 -0
  52. package/dist/http/rejection-telemetry.d.ts +34 -0
  53. package/dist/http/request-body.d.ts +27 -0
  54. package/dist/http/request-source.d.ts +41 -3
  55. package/dist/http/sse.d.ts +12 -1
  56. package/dist/http/unmatched-route.d.ts +18 -0
  57. package/dist/http/user-content.d.ts +36 -0
  58. package/dist/http/variable-sets-removed.d.ts +41 -0
  59. package/dist/http/websocket-upgrade-dispatch.d.ts +18 -0
  60. package/dist/index.js +1279 -108
  61. package/dist/index.js.map +1 -1
  62. package/dist/integration-connect-metrics.d.ts +35 -0
  63. package/dist/integration-endpoint-test.d.ts +20 -0
  64. package/dist/integrations/api-integrations.d.ts +2 -2
  65. package/dist/integrations/atlassian.d.ts +8 -3
  66. package/dist/integrations/fiken.d.ts +3 -1
  67. package/dist/integrations/github-lens-connect.d.ts +37 -66
  68. package/dist/integrations/google-drive.d.ts +2 -0
  69. package/dist/integrations/integration-commit-authority.d.ts +13 -0
  70. package/dist/integrations/marketplace-plugin.d.ts +43 -43
  71. package/dist/integrations/oauth-client.d.ts +171 -12
  72. package/dist/integrations/oauth-profiles.d.ts +42 -13
  73. package/dist/integrations/onepassword-vault-provider.d.ts +9 -0
  74. package/dist/integrations/slack-bot.d.ts +285 -7
  75. package/dist/integrations/slack-file-upload-flow.d.ts +62 -0
  76. package/dist/integrations/slack-interactions.d.ts +89 -10
  77. package/dist/integrations/slack-mrkdwn.d.ts +41 -0
  78. package/dist/integrations/slack-routing.d.ts +1 -1
  79. package/dist/integrations/slack-session-defaults.d.ts +58 -0
  80. package/dist/integrations/slack-task-file-upload.d.ts +36 -0
  81. package/dist/integrations/slack-tool-review.d.ts +5 -0
  82. package/dist/interaction-agent-access.d.ts +13 -8
  83. package/dist/interaction-agent-version.d.ts +21 -0
  84. package/dist/interaction-holder-heartbeat.d.ts +5 -0
  85. package/dist/interaction-metrics.d.ts +27 -2
  86. package/dist/interaction-route-stages.d.ts +25 -0
  87. package/dist/interaction-secrets-vault.d.ts +20 -0
  88. package/dist/interaction-secrets.d.ts +103 -0
  89. package/dist/mcp/action-catalog-types.d.ts +14 -0
  90. package/dist/mcp/action-catalog.gen.d.ts +2 -0
  91. package/dist/mcp/action-descriptions.d.ts +4 -0
  92. package/dist/mcp/action-schema-imports.gen.d.ts +1 -0
  93. package/dist/mcp/capability-account-readiness.d.ts +7 -0
  94. package/dist/mcp/child-read-evidence.d.ts +9 -0
  95. package/dist/mcp/company-profile-agent-admin.d.ts +12 -0
  96. package/dist/mcp/contract-input.d.ts +13 -0
  97. package/dist/mcp/documents.d.ts +2 -0
  98. package/dist/mcp/first-party-tool-permissions.d.ts +3 -606
  99. package/dist/mcp/notification-tools.d.ts +26 -0
  100. package/dist/mcp/orchestration-failure-diagnostic.d.ts +43 -0
  101. package/dist/mcp/scheduled-task-input.d.ts +1309 -0
  102. package/dist/mcp/scheduled-task-view.d.ts +217 -3
  103. package/dist/mcp/secret-tools.d.ts +14 -0
  104. package/dist/mcp/server.d.ts +108 -5
  105. package/dist/mcp/session-admin-access-tools.d.ts +33 -0
  106. package/dist/mcp/session-event-errors.d.ts +28 -0
  107. package/dist/mcp/session-event-view.d.ts +62 -0
  108. package/dist/mcp/session-view.d.ts +15 -0
  109. package/dist/mcp/session-wait.d.ts +18 -0
  110. package/dist/mcp/site-agent-clamp-tools.d.ts +38 -0
  111. package/dist/mcp/site-data-tools.d.ts +22 -0
  112. package/dist/mcp/site-publication-tools.d.ts +19 -0
  113. package/dist/mcp/site-sql-tools.d.ts +27 -0
  114. package/dist/mcp-oauth.d.ts +37 -4
  115. package/dist/model-calls/chat-completions.d.ts +87 -0
  116. package/dist/model-calls/pending-usage-settlements.d.ts +57 -0
  117. package/dist/model-calls/service.d.ts +36 -0
  118. package/dist/model-catalog.d.ts +9 -3
  119. package/dist/native-push-dispatch.d.ts +69 -0
  120. package/dist/observability.d.ts +3 -1
  121. package/dist/organization-mcp.d.ts +82 -0
  122. package/dist/prepared-mcp-actor.d.ts +77 -0
  123. package/dist/prepared-mcp-permissions.d.ts +8 -0
  124. package/dist/routes/analytics-consent.d.ts +26 -0
  125. package/dist/routes/api-integrations.d.ts +11 -0
  126. package/dist/routes/api-keys.d.ts +7 -7
  127. package/dist/routes/automations.d.ts +2 -0
  128. package/dist/routes/billing.d.ts +59 -0
  129. package/dist/routes/browser-sessions.d.ts +65 -2
  130. package/dist/routes/chat-completions.d.ts +11 -0
  131. package/dist/routes/claude-core-usage.d.ts +20 -0
  132. package/dist/routes/claude-subscription-accounts.d.ts +3 -0
  133. package/dist/routes/claude-subscription-oauth.d.ts +3 -0
  134. package/dist/routes/client-errors.d.ts +182 -0
  135. package/dist/routes/codex-core.d.ts +401 -0
  136. package/dist/routes/codex.d.ts +64 -2
  137. package/dist/routes/computer-sessions.d.ts +6 -1
  138. package/dist/routes/desktop-distribution.d.ts +32 -0
  139. package/dist/routes/github-browser-fonts.gen.d.ts +2 -0
  140. package/dist/routes/github-browser-pages.d.ts +27 -0
  141. package/dist/routes/inbox.d.ts +13 -0
  142. package/dist/routes/insights-response-cache.d.ts +10 -0
  143. package/dist/routes/insights-usage.d.ts +12 -0
  144. package/dist/routes/insights.d.ts +28 -0
  145. package/dist/routes/interaction-placement-message.d.ts +7 -0
  146. package/dist/routes/managed-sign-in-methods.d.ts +6 -0
  147. package/dist/routes/model-account-choice.d.ts +13 -0
  148. package/dist/routes/model-account-settings.d.ts +19 -0
  149. package/dist/routes/native-app-auth.d.ts +12 -0
  150. package/dist/routes/organization-integration-policy.d.ts +8 -0
  151. package/dist/routes/organization-integrations.d.ts +6 -0
  152. package/dist/routes/organization-mcp-connections.d.ts +3 -0
  153. package/dist/routes/organization-model-defaults.d.ts +9 -0
  154. package/dist/routes/organization-service-accounts.d.ts +3 -0
  155. package/dist/routes/personal-api-keys.d.ts +3 -0
  156. package/dist/routes/session-admin-access.d.ts +3 -0
  157. package/dist/routes/session-artifact-associations.d.ts +4 -0
  158. package/dist/routes/session-history-imports.d.ts +20 -0
  159. package/dist/routes/sessions.d.ts +38 -2
  160. package/dist/routes/site-data.d.ts +18 -0
  161. package/dist/routes/site-publishing.d.ts +5 -0
  162. package/dist/routes/site-runtime.d.ts +31 -0
  163. package/dist/routes/site-sql.d.ts +16 -0
  164. package/dist/routes/slack-bot-access.d.ts +3 -0
  165. package/dist/routes/subscription-account-pools.d.ts +21 -0
  166. package/dist/routes/subscription-core-http.d.ts +5 -0
  167. package/dist/routes/subscription-pool-access.d.ts +37 -0
  168. package/dist/routes/subscription-pool-core.d.ts +153 -0
  169. package/dist/routes/supergrok.d.ts +6 -6
  170. package/dist/routes/usage-allowances.d.ts +12 -0
  171. package/dist/routes/variable-sets-removed.d.ts +2 -0
  172. package/dist/routes/vault-providers.d.ts +34 -0
  173. package/dist/routes/vaults.d.ts +3 -0
  174. package/dist/routes/workspace-integrations.d.ts +35 -0
  175. package/dist/routes/workspace-model-providers.d.ts +4 -0
  176. package/dist/routes/workspaces.d.ts +11 -2
  177. package/dist/sandbox/agent-update.d.ts +64 -0
  178. package/dist/sandbox/auth-callout.d.ts +8 -0
  179. package/dist/sandbox/channel-a.d.ts +15 -1
  180. package/dist/sandbox/enrollment.d.ts +26 -4
  181. package/dist/sandbox/machine-audience.d.ts +29 -0
  182. package/dist/sandbox/machines.d.ts +15 -2
  183. package/dist/sandbox/metrics-ingestion.d.ts +6 -2
  184. package/dist/sandbox/screen-control.d.ts +85 -0
  185. package/dist/sandbox/viewer.d.ts +5 -1
  186. package/dist/sandbox-file-artifacts.d.ts +17 -1
  187. package/dist/scheduled-task-blockers.d.ts +39 -0
  188. package/dist/scheduled-task-deletion.d.ts +3 -4
  189. package/dist/scheduled-task-lifecycle.d.ts +14 -0
  190. package/dist/secret-answers.d.ts +40 -0
  191. package/dist/session-create-observability.d.ts +5 -0
  192. package/dist/session-event-view-36GO3IL7.js +528 -0
  193. package/dist/session-event-view-36GO3IL7.js.map +1 -0
  194. package/dist/signed-state-secret.d.ts +18 -0
  195. package/dist/site-agent-guard.d.ts +53 -0
  196. package/dist/site-data/operations.d.ts +103 -0
  197. package/dist/site-data/service.d.ts +203 -0
  198. package/dist/site-frame-guard.d.ts +32 -0
  199. package/dist/site-publishing/agent-data-tools.d.ts +84 -0
  200. package/dist/site-publishing/agent-model.d.ts +58 -0
  201. package/dist/site-publishing/agent-session.d.ts +16 -0
  202. package/dist/site-publishing/content-scanner.d.ts +31 -0
  203. package/dist/site-publishing/edge-sync.d.ts +48 -0
  204. package/dist/site-publishing/gateway-signature.d.ts +56 -0
  205. package/dist/site-publishing/limits.d.ts +63 -0
  206. package/dist/site-publishing/page-tool-authority.d.ts +30 -0
  207. package/dist/site-publishing/platform-usage.d.ts +113 -0
  208. package/dist/site-publishing/platform.d.ts +21 -0
  209. package/dist/site-publishing/readiness.d.ts +62 -0
  210. package/dist/site-publishing/runtime.d.ts +179 -0
  211. package/dist/site-publishing/service.d.ts +264 -0
  212. package/dist/site-publishing/session-events.d.ts +22 -0
  213. package/dist/site-publishing/session-views.d.ts +36 -0
  214. package/dist/site-publishing/viewer.d.ts +40 -0
  215. package/dist/site-session-origin.d.ts +31 -6
  216. package/dist/site-sql/format.d.ts +47 -0
  217. package/dist/site-sql/gateway.d.ts +50 -0
  218. package/dist/site-sql/service.d.ts +213 -0
  219. package/dist/temporal-schedule-sync.d.ts +26 -0
  220. package/dist/transcription/billing-refusal.d.ts +8 -0
  221. package/dist/transcription/normalize.d.ts +23 -0
  222. package/dist/transcription/providers/azure-mai.d.ts +12 -0
  223. package/dist/transcription/providers/azure-openai.d.ts +4 -0
  224. package/dist/transcription/providers/openai.d.ts +16 -0
  225. package/dist/transcription/providers/subscription-core.d.ts +39 -0
  226. package/dist/transcription/service.d.ts +10 -1
  227. package/dist/transcription/wav-duration.d.ts +8 -0
  228. package/dist/workspace-tool-gateway-attestations.d.ts +37 -0
  229. package/dist/workspace-tool-gateway-observability.d.ts +16 -0
  230. package/dist/workspace-tool-gateway-secrets.d.ts +27 -0
  231. package/dist/workspace-tool-gateway.d.ts +102 -6
  232. package/dist/workspace-tool-target-fence.d.ts +116 -0
  233. package/dist/workspace-tool-target.d.ts +225 -0
  234. package/dist/workspace-webhook-dispatch.d.ts +26 -0
  235. package/dist/xai-subscription-core.d.ts +60 -0
  236. package/package.json +25 -20
  237. package/src/access-grant-rls.ts +64 -14
  238. package/src/admission-trace.ts +14 -0
  239. package/src/app.ts +1684 -252
  240. package/src/artifact-catalog-cursor.ts +1 -0
  241. package/src/attached-browser-viewer.ts +26 -0
  242. package/src/auth/managed-auth-attempt-context.ts +9 -0
  243. package/src/auth/managed-auth-rate-limits.ts +252 -0
  244. package/src/auth/managed-auth-session-adapter.ts +64 -29
  245. package/src/auth/managed-auth.ts +303 -35
  246. package/src/auth/managed-email.ts +18 -1
  247. package/src/auth/managed-sign-in-notifications.ts +81 -0
  248. package/src/auth/new-signups-gate.ts +49 -0
  249. package/src/auth/organization-user-setup.ts +3 -3
  250. package/src/auth/signup-funnel-metrics.ts +164 -0
  251. package/src/azure-live.ts +103 -0
  252. package/src/browser-action-fences.ts +45 -0
  253. package/src/browser-controller-authority.ts +1 -186
  254. package/src/browser-ephemeral.ts +39 -0
  255. package/src/browser-lost-runtime-end.ts +71 -0
  256. package/src/browser-state-authority.ts +1 -236
  257. package/src/claude-default-models.ts +37 -0
  258. package/src/claude-subscription-core.ts +154 -0
  259. package/src/claude-subscription-oauth.ts +352 -0
  260. package/src/claude-subscription-profile.ts +73 -0
  261. package/src/claude-subscription-usage.ts +51 -0
  262. package/src/claude-workspace-connection.ts +82 -0
  263. package/src/codemode.ts +236 -39
  264. package/src/codex-realtime.ts +181 -53
  265. package/src/codex-session-pointers.ts +80 -0
  266. package/src/company-brain-okf.ts +1 -1
  267. package/src/connected-machine-computer-access.ts +2 -1
  268. package/src/connection-ownership.ts +19 -13
  269. package/src/controller-data-plane.ts +34 -0
  270. package/src/credit-promotion-snapshot.ts +36 -0
  271. package/src/editable-artifact-production.ts +10 -0
  272. package/src/editable-artifact-source-session.ts +123 -0
  273. package/src/editable-artifact-websocket.ts +16 -3
  274. package/src/fatal-process-boundary.ts +67 -3
  275. package/src/gateway-realtime.ts +12 -8
  276. package/src/github-access.ts +31 -5
  277. package/src/github-browser-flow.ts +1 -1
  278. package/src/http/acting-person.ts +105 -0
  279. package/src/http/api-contract-compat.ts +49 -0
  280. package/src/http/api-error.ts +210 -2
  281. package/src/http/auth.ts +68 -4
  282. package/src/http/cors.ts +37 -5
  283. package/src/http/deprecation.ts +118 -0
  284. package/src/http/keyed-admission.ts +29 -0
  285. package/src/http/local-browser-boundary.ts +343 -0
  286. package/src/http/metrics-listener.ts +57 -0
  287. package/src/http/path-identifier.ts +54 -0
  288. package/src/http/registered-route-label.ts +34 -0
  289. package/src/http/rejection-telemetry.ts +120 -0
  290. package/src/http/request-body.ts +127 -0
  291. package/src/http/request-source.ts +154 -13
  292. package/src/http/sse.ts +88 -28
  293. package/src/http/unmatched-route.ts +60 -0
  294. package/src/http/user-content.ts +158 -0
  295. package/src/http/variable-sets-removed.ts +122 -0
  296. package/src/http/websocket-upgrade-dispatch.ts +29 -0
  297. package/src/index.ts +107 -57
  298. package/src/integration-connect-metrics.ts +228 -0
  299. package/src/integration-endpoint-test.ts +291 -0
  300. package/src/integrations/api-integrations.ts +81 -7
  301. package/src/integrations/atlassian.ts +202 -83
  302. package/src/integrations/fiken.ts +66 -38
  303. package/src/integrations/github-app-connect.ts +64 -18
  304. package/src/integrations/github-lens-connect.ts +8 -29
  305. package/src/integrations/google-drive.ts +448 -152
  306. package/src/integrations/integration-commit-authority.ts +69 -0
  307. package/src/integrations/marketplace-plugin.ts +1 -1
  308. package/src/integrations/oauth-client.ts +733 -193
  309. package/src/integrations/oauth-profiles.ts +116 -45
  310. package/src/integrations/onepassword-vault-provider.ts +16 -0
  311. package/src/integrations/personal-github-repositories.ts +1 -1
  312. package/src/integrations/personal-github.ts +61 -35
  313. package/src/integrations/provider-oauth.ts +67 -85
  314. package/src/integrations/slack-app-home.ts +5 -5
  315. package/src/integrations/slack-bot.ts +893 -201
  316. package/src/integrations/slack-file-upload-flow.ts +147 -0
  317. package/src/integrations/slack-install.ts +7 -7
  318. package/src/integrations/slack-interactions.ts +1589 -299
  319. package/src/integrations/slack-mrkdwn.ts +193 -0
  320. package/src/integrations/slack-routing.ts +2 -2
  321. package/src/integrations/slack-session-defaults.ts +224 -0
  322. package/src/integrations/slack-task-file-upload.ts +323 -0
  323. package/src/integrations/slack-tool-review.ts +65 -0
  324. package/src/integrations/social-oauth.ts +90 -58
  325. package/src/interaction-agent-access.ts +40 -20
  326. package/src/interaction-agent-version.ts +85 -0
  327. package/src/interaction-holder-heartbeat.ts +24 -8
  328. package/src/interaction-metrics.ts +164 -2
  329. package/src/interaction-route-stages.ts +94 -0
  330. package/src/interaction-secrets-vault.ts +213 -0
  331. package/src/interaction-secrets.ts +426 -0
  332. package/src/mcp/action-catalog-types.ts +14 -0
  333. package/src/mcp/action-catalog.gen.ts +8014 -0
  334. package/src/mcp/action-descriptions.ts +299 -0
  335. package/src/mcp/action-schema-imports.gen.ts +304 -0
  336. package/src/mcp/capability-account-readiness.ts +17 -0
  337. package/src/mcp/child-read-evidence.ts +19 -0
  338. package/src/mcp/company-profile-agent-admin.ts +13 -0
  339. package/src/mcp/contract-input.ts +165 -0
  340. package/src/mcp/documents.ts +9 -2
  341. package/src/mcp/editable-artifacts.ts +29 -11
  342. package/src/mcp/files.ts +5 -1
  343. package/src/mcp/first-party-tool-permissions.ts +7 -285
  344. package/src/mcp/knowledge-entries.ts +108 -34
  345. package/src/mcp/notification-tools.ts +480 -0
  346. package/src/mcp/orchestration-failure-diagnostic.ts +43 -0
  347. package/src/mcp/scheduled-task-input.ts +89 -0
  348. package/src/mcp/scheduled-task-view.ts +63 -3
  349. package/src/mcp/secret-tools.ts +185 -0
  350. package/src/mcp/server.ts +2213 -1116
  351. package/src/mcp/session-admin-access-tools.ts +163 -0
  352. package/src/mcp/session-event-errors.ts +123 -0
  353. package/src/mcp/session-event-view.ts +395 -13
  354. package/src/mcp/session-view.ts +3 -0
  355. package/src/mcp/session-wait.ts +67 -7
  356. package/src/mcp/site-agent-clamp-tools.ts +140 -0
  357. package/src/mcp/site-data-tools.ts +339 -0
  358. package/src/mcp/site-publication-tools.ts +201 -0
  359. package/src/mcp/site-sql-tools.ts +427 -0
  360. package/src/mcp-oauth.ts +635 -45
  361. package/src/model-calls/chat-completions.ts +352 -0
  362. package/src/model-calls/pending-usage-settlements.ts +125 -0
  363. package/src/model-calls/service.ts +694 -0
  364. package/src/model-catalog.ts +68 -17
  365. package/src/native-push-dispatch.ts +457 -0
  366. package/src/observability.ts +15 -1
  367. package/src/organization-mcp.ts +485 -0
  368. package/src/prepared-mcp-actor.ts +154 -0
  369. package/src/prepared-mcp-permissions.ts +38 -0
  370. package/src/routes/analytics-consent.ts +123 -0
  371. package/src/routes/api-integrations.ts +268 -9
  372. package/src/routes/api-keys.ts +164 -25
  373. package/src/routes/artifact-catalog.ts +111 -0
  374. package/src/routes/automations.ts +163 -90
  375. package/src/routes/billing.ts +535 -59
  376. package/src/routes/browser-sessions.ts +966 -342
  377. package/src/routes/canonical-human-identities.ts +61 -0
  378. package/src/routes/capabilities.ts +112 -5
  379. package/src/routes/channels.ts +4 -3
  380. package/src/routes/chat-completions.ts +235 -0
  381. package/src/routes/claude-core-usage.ts +147 -0
  382. package/src/routes/claude-subscription-accounts.ts +233 -0
  383. package/src/routes/claude-subscription-oauth.ts +175 -0
  384. package/src/routes/client-errors.ts +394 -0
  385. package/src/routes/codex-core.ts +687 -0
  386. package/src/routes/codex.ts +1277 -1119
  387. package/src/routes/company-brain.ts +4 -0
  388. package/src/routes/computer-sessions.ts +319 -85
  389. package/src/routes/connect.ts +277 -175
  390. package/src/routes/connections.ts +690 -363
  391. package/src/routes/desktop-distribution.ts +217 -0
  392. package/src/routes/documents.ts +13 -7
  393. package/src/routes/editable-artifacts.ts +74 -4
  394. package/src/routes/enrollments.ts +110 -16
  395. package/src/routes/external-identity-links.ts +13 -12
  396. package/src/routes/files.ts +41 -16
  397. package/src/routes/github-browser-fonts.gen.ts +12 -0
  398. package/src/routes/github-browser-pages.ts +258 -0
  399. package/src/routes/github.ts +200 -75
  400. package/src/routes/inbox.ts +353 -0
  401. package/src/routes/insights-response-cache.ts +83 -0
  402. package/src/routes/insights-usage.ts +345 -0
  403. package/src/routes/insights.ts +103 -8
  404. package/src/routes/install.ts +51 -10
  405. package/src/routes/integration-facets.ts +70 -28
  406. package/src/routes/interaction-placement-message.ts +12 -0
  407. package/src/routes/knowledge.ts +136 -27
  408. package/src/routes/machines.ts +189 -135
  409. package/src/routes/managed-auth-session-sets.ts +43 -10
  410. package/src/routes/managed-onboarding.ts +39 -19
  411. package/src/routes/managed-sign-in-methods.ts +433 -0
  412. package/src/routes/memory-slack-publications.ts +3 -2
  413. package/src/routes/model-account-choice.ts +194 -0
  414. package/src/routes/model-account-settings.ts +235 -0
  415. package/src/routes/model-connection-access.ts +210 -48
  416. package/src/routes/native-app-auth.ts +296 -0
  417. package/src/routes/organization-integration-policy.ts +116 -0
  418. package/src/routes/organization-integrations.ts +326 -0
  419. package/src/routes/organization-mcp-connections.ts +183 -0
  420. package/src/routes/organization-memberships.ts +205 -19
  421. package/src/routes/organization-model-defaults.ts +110 -0
  422. package/src/routes/organization-model-providers.ts +74 -3
  423. package/src/routes/organization-service-accounts.ts +128 -0
  424. package/src/routes/organization-sessions.ts +21 -5
  425. package/src/routes/personal-api-keys.ts +184 -0
  426. package/src/routes/personal-github-git-broker.ts +2 -2
  427. package/src/routes/personal-github.ts +9 -4
  428. package/src/routes/plugins.ts +46 -7
  429. package/src/routes/pr-review-github.ts +105 -118
  430. package/src/routes/pr-review.ts +88 -82
  431. package/src/routes/preference-registry.ts +18 -0
  432. package/src/routes/rigs.ts +48 -13
  433. package/src/routes/scheduled-tasks.ts +347 -27
  434. package/src/routes/session-admin-access.ts +271 -0
  435. package/src/routes/session-artifact-associations.ts +164 -0
  436. package/src/routes/session-history-imports.ts +305 -0
  437. package/src/routes/sessions.ts +1682 -363
  438. package/src/routes/site-data.ts +340 -0
  439. package/src/routes/site-publishing.ts +584 -0
  440. package/src/routes/site-runtime.ts +1944 -0
  441. package/src/routes/site-sql.ts +263 -0
  442. package/src/routes/skill-content.ts +72 -7
  443. package/src/routes/skills.ts +5 -4
  444. package/src/routes/slack-bot-access.ts +108 -0
  445. package/src/routes/social.ts +27 -15
  446. package/src/routes/subscription-account-pools.ts +209 -0
  447. package/src/routes/subscription-core-http.ts +18 -0
  448. package/src/routes/subscription-pool-access.ts +180 -0
  449. package/src/routes/subscription-pool-core.ts +552 -0
  450. package/src/routes/supergrok.ts +174 -655
  451. package/src/routes/transcription-recordings.ts +71 -4
  452. package/src/routes/transcriptions.ts +26 -2
  453. package/src/routes/usage-allowances.ts +381 -0
  454. package/src/routes/variable-sets-removed.ts +19 -0
  455. package/src/routes/vault-providers.ts +782 -0
  456. package/src/routes/vaults.ts +421 -0
  457. package/src/routes/video-generation.ts +30 -12
  458. package/src/routes/workspace-artifacts.ts +165 -53
  459. package/src/routes/workspace-integrations.ts +576 -0
  460. package/src/routes/workspace-model-providers.ts +148 -0
  461. package/src/routes/workspace-state.ts +4 -0
  462. package/src/routes/workspaces.ts +625 -117
  463. package/src/sandbox/agent-update.ts +315 -0
  464. package/src/sandbox/auth-callout.ts +104 -21
  465. package/src/sandbox/channel-a.ts +165 -55
  466. package/src/sandbox/enrollment.ts +131 -22
  467. package/src/sandbox/machine-audience.ts +192 -0
  468. package/src/sandbox/machines.ts +75 -31
  469. package/src/sandbox/metrics-ingestion.ts +133 -2
  470. package/src/sandbox/rematerialize.ts +51 -21
  471. package/src/sandbox/screen-control.ts +289 -0
  472. package/src/sandbox/viewer.ts +33 -58
  473. package/src/sandbox-file-artifacts.ts +53 -27
  474. package/src/scheduled-task-blockers.ts +293 -0
  475. package/src/scheduled-task-deletion.ts +13 -3
  476. package/src/scheduled-task-lifecycle.ts +84 -0
  477. package/src/secret-answers.ts +119 -0
  478. package/src/session-create-observability.ts +46 -0
  479. package/src/session-realtime-context.ts +26 -4
  480. package/src/signed-state-secret.ts +58 -0
  481. package/src/site-agent-guard.ts +261 -0
  482. package/src/site-data/operations.ts +777 -0
  483. package/src/site-data/service.ts +1043 -0
  484. package/src/site-frame-guard.ts +107 -0
  485. package/src/site-publishing/agent-data-tools.ts +250 -0
  486. package/src/site-publishing/agent-model.ts +127 -0
  487. package/src/site-publishing/agent-session.ts +148 -0
  488. package/src/site-publishing/content-scanner.ts +93 -0
  489. package/src/site-publishing/edge-sync.ts +148 -0
  490. package/src/site-publishing/gateway-signature.ts +198 -0
  491. package/src/site-publishing/limits.ts +315 -0
  492. package/src/site-publishing/page-tool-authority.ts +111 -0
  493. package/src/site-publishing/platform-usage.ts +479 -0
  494. package/src/site-publishing/platform.ts +98 -0
  495. package/src/site-publishing/readiness.ts +330 -0
  496. package/src/site-publishing/runtime.ts +831 -0
  497. package/src/site-publishing/service.ts +1282 -0
  498. package/src/site-publishing/session-events.ts +262 -0
  499. package/src/site-publishing/session-views.ts +262 -0
  500. package/src/site-publishing/viewer.ts +75 -0
  501. package/src/site-session-origin.ts +91 -6
  502. package/src/site-sql/format.ts +134 -0
  503. package/src/site-sql/gateway.ts +168 -0
  504. package/src/site-sql/service.ts +1636 -0
  505. package/src/site-uploads.ts +27 -5
  506. package/src/temporal-schedule-sync.ts +74 -0
  507. package/src/transcription/billing-refusal.ts +14 -0
  508. package/src/transcription/normalize.ts +77 -0
  509. package/src/transcription/providers/azure-mai.ts +98 -0
  510. package/src/transcription/providers/azure-openai.ts +16 -7
  511. package/src/transcription/providers/codex-subscription.ts +190 -67
  512. package/src/transcription/providers/openai.ts +79 -5
  513. package/src/transcription/providers/subscription-core.ts +125 -0
  514. package/src/transcription/providers/xai-subscription.ts +81 -83
  515. package/src/transcription/segmenter.ts +7 -1
  516. package/src/transcription/service.ts +239 -10
  517. package/src/transcription/wav-duration.ts +39 -0
  518. package/src/workspace-deletion.ts +25 -1
  519. package/src/workspace-tool-gateway-attestations.ts +133 -0
  520. package/src/workspace-tool-gateway-observability.ts +64 -0
  521. package/src/workspace-tool-gateway-secrets.ts +104 -0
  522. package/src/workspace-tool-gateway.ts +921 -103
  523. package/src/workspace-tool-target-fence.ts +380 -0
  524. package/src/workspace-tool-target.ts +554 -0
  525. package/src/workspace-webhook-dispatch.ts +225 -0
  526. package/src/xai-realtime.ts +85 -81
  527. package/src/xai-subscription-core.ts +172 -0
  528. package/dist/browser-auth-broker.d.ts +0 -20
  529. package/dist/chunk-AJ62T5QN.js.map +0 -1
  530. package/dist/connection-authority-owner.d.ts +0 -59
  531. package/dist/routes/connection-authorities.d.ts +0 -3
  532. package/dist/routes/environments.d.ts +0 -5
  533. package/dist/routes/host-mcp-bindings.d.ts +0 -5
  534. package/dist/routes/host-mcp-resolvers.d.ts +0 -3
  535. package/dist/routes/packs.d.ts +0 -3
  536. package/dist/session-event-view-MU3HMNV3.js +0 -264
  537. package/dist/session-event-view-MU3HMNV3.js.map +0 -1
  538. package/dist/xai-subscription-auth.d.ts +0 -23
  539. package/src/browser-auth-broker.ts +0 -155
  540. package/src/connection-authority-owner.ts +0 -61
  541. package/src/routes/connection-authorities.ts +0 -139
  542. package/src/routes/environments.ts +0 -388
  543. package/src/routes/host-mcp-bindings.ts +0 -122
  544. package/src/routes/host-mcp-resolvers.ts +0 -41
  545. package/src/routes/packs.ts +0 -784
  546. package/src/xai-subscription-auth.ts +0 -139
@@ -0,0 +1,128 @@
1
+ import { zValidator } from "@hono/zod-validator";
2
+ import {
3
+ CreateOrganizationServiceAccountRequest,
4
+ ListOrganizationServiceAccountsResponse,
5
+ OrganizationServiceAccount,
6
+ UpdateOrganizationServiceAccountRequest,
7
+ type AccessContext,
8
+ } from "@opengeni/contracts";
9
+ import { requireAccessContext, type ApiRouteDeps } from "@opengeni/core";
10
+ import {
11
+ createOrganizationServiceAccount,
12
+ deleteOrganizationServiceAccount,
13
+ getOrganizationServiceAccount,
14
+ listOrganizationServiceAccounts,
15
+ updateOrganizationServiceAccount,
16
+ } from "@opengeni/db";
17
+ import type { Context, Hono } from "hono";
18
+ import { HTTPException } from "hono/http-exception";
19
+ import { z } from "zod";
20
+
21
+ import { requireOrganizationApiKeyControlPermission, throwServiceAccountError } from "./api-keys";
22
+
23
+ /* ----------------------------------------------------------------------------
24
+ Service accounts: organization identities with no person behind them. They
25
+ hold organization API keys. Whoever may manage the organization's keys may
26
+ manage service accounts; only an organization administrator can make one an
27
+ admin. Deleting one revokes its keys at once.
28
+ -------------------------------------------------------------------------- */
29
+
30
+ const Id = z.string().uuid();
31
+
32
+ export function registerOrganizationServiceAccountRoutes(app: Hono, deps: ApiRouteDeps): void {
33
+ const path = "/v1/organizations/:organizationId/service-accounts";
34
+
35
+ app.get(path, async (c) => {
36
+ const { organizationId } = await requireControl(c, deps);
37
+ c.header("cache-control", "no-store");
38
+ return c.json(
39
+ ListOrganizationServiceAccountsResponse.parse({
40
+ serviceAccounts: await listOrganizationServiceAccounts(deps.db, organizationId),
41
+ }),
42
+ );
43
+ });
44
+
45
+ app.post(path, zValidator("json", CreateOrganizationServiceAccountRequest), async (c) => {
46
+ const { organizationId, context } = await requireControl(c, deps);
47
+ const body = c.req.valid("json");
48
+ if (body.role === "admin") requireOrganizationAdmin(context, organizationId);
49
+ const created = await createOrganizationServiceAccount(deps.db, {
50
+ accountId: organizationId,
51
+ name: body.name,
52
+ description: body.description ?? null,
53
+ role: body.role,
54
+ createdBySubjectId: context.subjectId,
55
+ });
56
+ return c.json(OrganizationServiceAccount.parse(created), 201);
57
+ });
58
+
59
+ app.get(`${path}/:serviceAccountId`, async (c) => {
60
+ const { organizationId } = await requireControl(c, deps);
61
+ const found = await getOrganizationServiceAccount(deps.db, organizationId, serviceAccountId(c));
62
+ if (!found) throw new HTTPException(404, { message: "Service account not found" });
63
+ return c.json(OrganizationServiceAccount.parse(found));
64
+ });
65
+
66
+ app.patch(
67
+ `${path}/:serviceAccountId`,
68
+ zValidator("json", UpdateOrganizationServiceAccountRequest),
69
+ async (c) => {
70
+ const { organizationId, context } = await requireControl(c, deps);
71
+ const body = c.req.valid("json");
72
+ if (body.role === "admin") requireOrganizationAdmin(context, organizationId);
73
+ try {
74
+ return c.json(
75
+ OrganizationServiceAccount.parse(
76
+ await updateOrganizationServiceAccount(
77
+ deps.db,
78
+ organizationId,
79
+ serviceAccountId(c),
80
+ body,
81
+ ),
82
+ ),
83
+ );
84
+ } catch (error) {
85
+ throwServiceAccountError(error);
86
+ throw error;
87
+ }
88
+ },
89
+ );
90
+
91
+ app.delete(`${path}/:serviceAccountId`, async (c) => {
92
+ const { organizationId } = await requireControl(c, deps);
93
+ try {
94
+ await deleteOrganizationServiceAccount(deps.db, organizationId, serviceAccountId(c));
95
+ } catch (error) {
96
+ throwServiceAccountError(error);
97
+ throw error;
98
+ }
99
+ return c.body(null, 204);
100
+ });
101
+ }
102
+
103
+ async function requireControl(
104
+ c: Context,
105
+ deps: ApiRouteDeps,
106
+ ): Promise<{ organizationId: string; context: AccessContext }> {
107
+ const parsed = Id.safeParse(c.req.param("organizationId"));
108
+ if (!parsed.success) throw new HTTPException(404, { message: "organization not found" });
109
+ const organizationId = parsed.data.toLowerCase();
110
+ const context = await requireAccessContext(c, deps);
111
+ requireOrganizationApiKeyControlPermission(context, organizationId);
112
+ return { organizationId, context };
113
+ }
114
+
115
+ function serviceAccountId(c: Context): string {
116
+ const parsed = Id.safeParse(c.req.param("serviceAccountId"));
117
+ if (!parsed.success) throw new HTTPException(404, { message: "Service account not found" });
118
+ return parsed.data.toLowerCase();
119
+ }
120
+
121
+ /** Only an organization administrator can make a service account an admin. */
122
+ function requireOrganizationAdmin(context: AccessContext, organizationId: string): void {
123
+ const grant = context.accountGrants.find((candidate) => candidate.accountId === organizationId);
124
+ if (!grant?.permissions.includes("account:admin"))
125
+ throw new HTTPException(403, {
126
+ message: "Only an organization administrator can make a service account an admin.",
127
+ });
128
+ }
@@ -7,6 +7,7 @@ import {
7
7
  } from "@opengeni/contracts";
8
8
  import {
9
9
  accountScopedApiKeyWorkspaceAuthority,
10
+ organizationWorkspaceInScope,
10
11
  hasPermission,
11
12
  requireAccessContext,
12
13
  requireAccessGrantAuthorization,
@@ -14,6 +15,7 @@ import {
14
15
  SessionAuthorizationDeniedError,
15
16
  SessionAuthorizationUnavailableError,
16
17
  type ApiRouteDeps,
18
+ isVerifiedDelegatedHumanAuthorization,
17
19
  } from "@opengeni/core";
18
20
  import {
19
21
  decodeSessionListCursor,
@@ -26,6 +28,7 @@ import {
26
28
  import type { Context, Hono } from "hono";
27
29
  import { HTTPException } from "hono/http-exception";
28
30
  import { z } from "zod";
31
+ import { loadCodexSessionPointerProjection } from "../codex-session-pointers";
29
32
 
30
33
  /**
31
34
  * Upper bound on the workspace page reads one request performs. The
@@ -161,9 +164,13 @@ export function registerOrganizationSessionRoutes(app: Hono, deps: ApiRouteDeps)
161
164
  // Personal workspaces are excluded by the inventory itself; the stable id
162
165
  // order is what makes the `{ workspaceId, cursor }` continuation resumable
163
166
  // even when a workspace is created or deleted between pages.
164
- const workspaces = (await listSharedWorkspacesForAccount(deps.db, organizationId)).sort(
165
- compareWorkspaceIds,
166
- );
167
+ const authority = accountScopedApiKeyWorkspaceAuthority(context);
168
+ const workspaces = (await listSharedWorkspacesForAccount(deps.db, organizationId))
169
+ .filter(
170
+ (workspace) =>
171
+ !authority || organizationWorkspaceInScope(authority.workspaceScope, workspace.id),
172
+ )
173
+ .sort(compareWorkspaceIds);
167
174
  let index = 0;
168
175
  let innerCursor: string | null = null;
169
176
  let pinnedOffset = 0;
@@ -201,7 +208,14 @@ export function registerOrganizationSessionRoutes(app: Hono, deps: ApiRouteDeps)
201
208
  pinnedOffset = 0;
202
209
  continue;
203
210
  }
204
- sessions.push(...page.sessions);
211
+ // The Codex pointers by the organization's cutover disposition, exactly
212
+ // as the workspace session routes show them.
213
+ const codexPointers = await loadCodexSessionPointerProjection(
214
+ deps.db,
215
+ workspace.id,
216
+ page.sessions,
217
+ );
218
+ sessions.push(...page.sessions.map(codexPointers));
205
219
  if (page.nextPinnedOffset !== null) {
206
220
  // The page ended inside this workspace's pinned prefix.
207
221
  innerCursor = null;
@@ -298,7 +312,9 @@ async function listWorkspaceSessionPage(
298
312
  ? { scopeSubjectId: input.query.scopeSubjectId }
299
313
  : {}),
300
314
  ...(authorizationScope ? { authorizationScope } : {}),
301
- personalWorkspaceOwnerException: authorization.canonicalManagedHumanSession,
315
+ personalWorkspaceOwnerException:
316
+ authorization.canonicalManagedHumanSession ||
317
+ isVerifiedDelegatedHumanAuthorization(authorization),
302
318
  });
303
319
  const withStatus = (rows: Session[]) =>
304
320
  input.query.status ? rows.filter((session) => session.status === input.query.status) : rows;
@@ -0,0 +1,184 @@
1
+ import {
2
+ CreatePersonalApiKeyRequest,
3
+ CreatePersonalApiKeyResponse,
4
+ ListPersonalApiKeysResponse,
5
+ PersonalApiKey,
6
+ type AccessContext,
7
+ } from "@opengeni/contracts";
8
+ import {
9
+ createPersonalApiKey,
10
+ getManagedUserProfilesByIds,
11
+ listPersonalApiKeys,
12
+ PersonalApiKeyLimitExceededError,
13
+ PersonalApiKeyWorkspaceScopeError,
14
+ revokePersonalApiKey,
15
+ type PersonalApiKeyRecord,
16
+ } from "@opengeni/db";
17
+ import {
18
+ hasPermission,
19
+ PERSONAL_API_KEY_TOKEN_PREFIX,
20
+ requireAccessContext,
21
+ type ApiRouteDeps,
22
+ } from "@opengeni/core";
23
+ import type { Context, Hono } from "hono";
24
+ import { HTTPException } from "hono/http-exception";
25
+ import { z } from "zod";
26
+
27
+ import { isAgentActingAsPerson, requireFullAccessIfAgent } from "../http/acting-person";
28
+ import { requireSameOriginBrowserMutation } from "./codex";
29
+
30
+ /* ----------------------------------------------------------------------------
31
+ Personal API keys: keys that act as the person who created them. A script
32
+ or agent holding one does what that person can do in this organization,
33
+ capped by the key's access setting, and shows up as them. Every request
34
+ rechecks the person's live access, so a removed or narrowed role applies at
35
+ once; leaving the organization revokes the keys.
36
+
37
+ Everyone manages their own; owners and admins also see everyone's and can
38
+ revoke them. An agent acting as the person can do this only with their full
39
+ access, so a limited agent or key can never mint a broader one.
40
+ -------------------------------------------------------------------------- */
41
+
42
+ export function registerPersonalApiKeyRoutes(app: Hono, deps: ApiRouteDeps): void {
43
+ app.get("/v1/organizations/:organizationId/personal-api-keys", async (c) => {
44
+ const { context, organizationId, admin } = await requireOrganizationPerson(c, deps, false);
45
+ const keys = await listPersonalApiKeys(deps.db, {
46
+ accountId: organizationId,
47
+ ...(admin ? {} : { ownerSubjectId: context.subjectId }),
48
+ });
49
+ c.header("cache-control", "no-store");
50
+ return c.json(
51
+ ListPersonalApiKeysResponse.parse({
52
+ apiKeys: await projectKeys(deps, keys),
53
+ canManageAll: admin,
54
+ }),
55
+ );
56
+ });
57
+
58
+ app.post("/v1/organizations/:organizationId/personal-api-keys", async (c) => {
59
+ requireSameOriginBrowserMutation(c, deps);
60
+ const { context, organizationId } = await requireOrganizationPerson(c, deps, true);
61
+ const parsed = CreatePersonalApiKeyRequest.safeParse(await c.req.json().catch(() => null));
62
+ if (!parsed.success) {
63
+ throw new HTTPException(400, {
64
+ message: parsed.error.issues[0]?.message ?? "invalid personal API key",
65
+ });
66
+ }
67
+ const body = parsed.data;
68
+ const expiresAt = body.expiresAt ? new Date(body.expiresAt) : null;
69
+ if (expiresAt && expiresAt.getTime() <= Date.now()) {
70
+ throw new HTTPException(400, { message: "Choose an expiry date in the future." });
71
+ }
72
+ const token = generatePersonalApiKeyToken();
73
+ try {
74
+ const apiKey = await createPersonalApiKey(deps.db, {
75
+ accountId: organizationId,
76
+ ownerSubjectId: context.subjectId,
77
+ name: body.name,
78
+ description: body.description ?? null,
79
+ prefix: token.slice(0, 14),
80
+ keyHash: await sha256Hex(token),
81
+ access: body.access,
82
+ expiresAt,
83
+ });
84
+ const [projected] = await projectKeys(deps, [apiKey]);
85
+ c.header("cache-control", "no-store");
86
+ return c.json(CreatePersonalApiKeyResponse.parse({ apiKey: projected, token }), 201);
87
+ } catch (error) {
88
+ if (error instanceof PersonalApiKeyWorkspaceScopeError)
89
+ throw new HTTPException(400, { message: error.message });
90
+ if (error instanceof PersonalApiKeyLimitExceededError)
91
+ throw new HTTPException(429, { message: error.message });
92
+ throw error;
93
+ }
94
+ });
95
+
96
+ app.delete("/v1/organizations/:organizationId/personal-api-keys/:apiKeyId", async (c) => {
97
+ requireSameOriginBrowserMutation(c, deps);
98
+ const { context, organizationId, admin } = await requireOrganizationPerson(c, deps, true);
99
+ const apiKeyId = c.req.param("apiKeyId");
100
+ if (!z.string().uuid().safeParse(apiKeyId).success) {
101
+ throw new HTTPException(404, { message: "API key not found" });
102
+ }
103
+ const [existing] = await listPersonalApiKeys(deps.db, { accountId: organizationId, apiKeyId });
104
+ if (!existing || (existing.ownerSubjectId !== context.subjectId && !admin)) {
105
+ throw new HTTPException(404, { message: "API key not found" });
106
+ }
107
+ await revokePersonalApiKey(deps.db, { accountId: organizationId, apiKeyId });
108
+ return c.body(null, 204);
109
+ });
110
+ }
111
+
112
+ /**
113
+ * A member of the organization signed in in this browser, or an agent (or
114
+ * personal key) acting as them. Changes need the person's full access.
115
+ */
116
+ async function requireOrganizationPerson(
117
+ c: Context,
118
+ deps: ApiRouteDeps,
119
+ mutation: boolean,
120
+ ): Promise<{ context: AccessContext; organizationId: string; admin: boolean }> {
121
+ if (deps.settings.productAccessMode !== "managed") {
122
+ throw new HTTPException(404, { message: "Personal API keys need Opengeni sign-in." });
123
+ }
124
+ if (isAgentActingAsPerson(c)) {
125
+ if (mutation) requireFullAccessIfAgent(c, "Managing personal API keys");
126
+ } else if (!c.req.header("cookie") || c.req.header("authorization")) {
127
+ throw new HTTPException(403, {
128
+ message: "Manage personal API keys in the Opengeni app in your browser.",
129
+ });
130
+ }
131
+ const context = await requireAccessContext(c, deps);
132
+ const organizationId = c.req.param("organizationId") ?? "";
133
+ const grant = context.accountGrants.find((each) => each.accountId === organizationId);
134
+ if (context.mode !== "managed" || !context.subjectId.startsWith("user:") || !grant) {
135
+ throw new HTTPException(404, { message: "organization not found" });
136
+ }
137
+ return { context, organizationId, admin: hasPermission(grant.permissions, "account:admin") };
138
+ }
139
+
140
+ async function projectKeys(
141
+ deps: ApiRouteDeps,
142
+ keys: PersonalApiKeyRecord[],
143
+ ): Promise<PersonalApiKey[]> {
144
+ const userIds = [...new Set(keys.map((key) => key.ownerSubjectId.slice("user:".length)))];
145
+ const profiles = new Map(
146
+ (await getManagedUserProfilesByIds(deps.db, userIds)).map((profile) => [
147
+ `user:${profile.id}`,
148
+ profile,
149
+ ]),
150
+ );
151
+ return keys.map((key) => {
152
+ const profile = profiles.get(key.ownerSubjectId);
153
+ return PersonalApiKey.parse({
154
+ id: key.id,
155
+ organizationId: key.accountId,
156
+ name: key.name,
157
+ description: key.description,
158
+ prefix: key.prefix,
159
+ access: key.access,
160
+ owner: {
161
+ subjectId: key.ownerSubjectId,
162
+ name: profile?.name?.trim() || profile?.email || "Someone",
163
+ },
164
+ expiresAt: key.expiresAt?.toISOString() ?? null,
165
+ lastUsedAt: key.lastUsedAt?.toISOString() ?? null,
166
+ createdAt: key.createdAt.toISOString(),
167
+ });
168
+ });
169
+ }
170
+
171
+ function generatePersonalApiKeyToken(): string {
172
+ const bytes = new Uint8Array(32);
173
+ crypto.getRandomValues(bytes);
174
+ return `${PERSONAL_API_KEY_TOKEN_PREFIX}${Array.from(bytes)
175
+ .map((byte) => byte.toString(16).padStart(2, "0"))
176
+ .join("")}`;
177
+ }
178
+
179
+ async function sha256Hex(value: string): Promise<string> {
180
+ const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(value));
181
+ return Array.from(new Uint8Array(digest))
182
+ .map((byte) => byte.toString(16).padStart(2, "0"))
183
+ .join("");
184
+ }
@@ -549,7 +549,7 @@ async function fetchLiveGitHubJson(
549
549
  headers: {
550
550
  accept: "application/vnd.github+json",
551
551
  authorization,
552
- "user-agent": "OpenGeni",
552
+ "user-agent": "Opengeni",
553
553
  "x-github-api-version": GITHUB_API_VERSION,
554
554
  },
555
555
  signal: AbortSignal.timeout(10_000),
@@ -776,7 +776,7 @@ function brokerError(status: 401 | 403 | 404 | 502, message: string): Response {
776
776
  "x-content-type-options": "nosniff",
777
777
  });
778
778
  if (status === 401) {
779
- headers.set("www-authenticate", 'Basic realm="OpenGeni Git broker", charset="UTF-8"');
779
+ headers.set("www-authenticate", 'Basic realm="Opengeni Git broker", charset="UTF-8"');
780
780
  }
781
781
  return new Response(`${message}\n`, {
782
782
  status,
@@ -46,6 +46,7 @@ import {
46
46
  requirePersonalGitHubRepositoryConnection,
47
47
  verifyLivePersonalGitHubRepositories,
48
48
  } from "../integrations/personal-github-repositories";
49
+ import { parseRequestBody, parseRequestJson } from "../http/request-body";
49
50
 
50
51
  export function registerPersonalGitHubRoutes(app: Hono, deps: ApiRouteDeps): void {
51
52
  app.get("/v1/workspaces/:workspaceId/connections/github", async (c) => {
@@ -69,7 +70,10 @@ export function registerPersonalGitHubRoutes(app: Hono, deps: ApiRouteDeps): voi
69
70
  const access = await requireAccessGrantAuthorization(c, deps, workspaceId, "connections:write");
70
71
  requireLegacyOAuthActor(access);
71
72
  assertPersonalConnectionOwnerPrincipal(access, "My GitHub account");
72
- const payload = PersonalGitHubOAuthStartRequest.parse(await c.req.json().catch(() => ({})));
73
+ const payload = parseRequestBody(
74
+ PersonalGitHubOAuthStartRequest,
75
+ await c.req.json().catch(() => ({})),
76
+ );
73
77
  return c.json(
74
78
  await startPersonalGitHubOAuth(deps, {
75
79
  access,
@@ -85,7 +89,8 @@ export function registerPersonalGitHubRoutes(app: Hono, deps: ApiRouteDeps): voi
85
89
  const access = await requireAccessGrantAuthorization(c, deps, workspaceId, "connections:write");
86
90
  requireLegacyOAuthActor(access);
87
91
  assertPersonalConnectionOwnerPrincipal(access, "My GitHub account");
88
- const payload = PersonalGitHubOAuthStartRequest.omit({ connectionId: true }).parse(
92
+ const payload = parseRequestBody(
93
+ PersonalGitHubOAuthStartRequest.omit({ connectionId: true }),
89
94
  await c.req.json().catch(() => ({})),
90
95
  );
91
96
  return c.json(
@@ -168,7 +173,7 @@ export function registerPersonalGitHubRoutes(app: Hono, deps: ApiRouteDeps): voi
168
173
  subjectId: access.grant.subjectId,
169
174
  connectionId,
170
175
  });
171
- const request = ReplacePersonalGitHubRepositorySelectionsRequest.parse(await c.req.json());
176
+ const request = await parseRequestJson(c, ReplacePersonalGitHubRepositorySelectionsRequest);
172
177
  try {
173
178
  const current = await loadRepositorySelectionState(deps, access.grant, connection);
174
179
  assertRepositoryConnectionAuthorityFence(current, request);
@@ -249,7 +254,7 @@ export function registerPersonalGitHubRoutes(app: Hono, deps: ApiRouteDeps): voi
249
254
  subjectId: access.grant.subjectId,
250
255
  connectionId,
251
256
  });
252
- const request = VerifyPersonalGitHubRepositorySelectionsRequest.parse(await c.req.json());
257
+ const request = await parseRequestJson(c, VerifyPersonalGitHubRepositorySelectionsRequest);
253
258
  try {
254
259
  const current = await loadRepositorySelectionState(deps, access.grant, connection);
255
260
  assertRepositoryConnectionAuthorityFence(current, request);
@@ -1,7 +1,12 @@
1
1
  import pluginSnapshot from "../../../../data/catalog/plugins-snapshot.json";
2
2
  import { marketplacePlugin } from "../integrations/marketplace-plugin";
3
3
  import { mcpEndpointIdentity } from "@opengeni/contracts";
4
- import { buildCapabilityCatalog, createCatalogItem } from "@opengeni/core";
4
+ import {
5
+ buildCapabilityCatalog,
6
+ createCatalogItem,
7
+ integrationSourceForOrganizationPolicy,
8
+ } from "@opengeni/core";
9
+ import { withOrganizationIntegrationPolicyFence } from "@opengeni/db/organization-integration-policy";
5
10
  import { createHash } from "node:crypto";
6
11
 
7
12
  import {
@@ -43,6 +48,7 @@ import {
43
48
  getConnectionMetadata,
44
49
  getInstalledPluginPackage,
45
50
  getPluginPackageUninstallPreview,
51
+ PluginUninstallPreviewChangedError,
46
52
  integrationBindingKey,
47
53
  installApiIntegration,
48
54
  installPluginMcpReference,
@@ -66,6 +72,7 @@ import {
66
72
  type ResolvedApiIntegrationPreview,
67
73
  } from "../integrations/api-integrations";
68
74
  import { createGitHubSkillSourceClient } from "../integrations/github-skill-source";
75
+ import { parseRequestJson } from "../http/request-body";
69
76
 
70
77
  const MAX_PLUGIN_MANIFEST_BYTES = 1024 * 1024;
71
78
 
@@ -182,7 +189,7 @@ export function registerPluginRoutes(
182
189
  app.post("/v1/workspaces/:workspaceId/plugins/preview", async (c) => {
183
190
  const workspaceId = c.req.param("workspaceId");
184
191
  const grant = await requireAccessGrant(c, deps, workspaceId, "workspace:read");
185
- const payload = PreviewPluginRequest.parse(await c.req.json());
192
+ const payload = await parseRequestJson(c, PreviewPluginRequest);
186
193
  const resolved = await resolvePluginPackage({
187
194
  deps,
188
195
  github,
@@ -205,7 +212,7 @@ export function registerPluginRoutes(
205
212
  "capabilities:manage",
206
213
  );
207
214
  const { grant } = access;
208
- const payload = InstallPluginRequest.parse(await c.req.json());
215
+ const payload = await parseRequestJson(c, InstallPluginRequest);
209
216
  const resolved = await resolvePluginPackage({
210
217
  skillActor: () => skillInstallerActor(access),
211
218
  deps,
@@ -344,9 +351,14 @@ export function registerPluginRoutes(
344
351
 
345
352
  app.get("/v1/workspaces/:workspaceId/plugins/:pluginKey/uninstall-preview", async (c) => {
346
353
  const workspaceId = c.req.param("workspaceId");
347
- await requireAccessGrant(c, deps, workspaceId, "workspace:read");
354
+ const grant = await requireAccessGrant(c, deps, workspaceId, "workspace:read");
348
355
  const pluginKey = decodeURIComponent(c.req.param("pluginKey"));
349
- const preview = await getPluginPackageUninstallPreview(deps.db, workspaceId, pluginKey);
356
+ const preview = await getPluginPackageUninstallPreview(
357
+ deps.db,
358
+ workspaceId,
359
+ pluginKey,
360
+ grant.subjectId,
361
+ );
350
362
  return c.json(PluginUninstallPreview.parse({ pluginKey, ...preview }));
351
363
  });
352
364
 
@@ -361,7 +373,7 @@ export function registerPluginRoutes(
361
373
  const { grant } = access;
362
374
  const skillActor = skillRemovalActor(access);
363
375
  const pluginKey = decodeURIComponent(c.req.param("pluginKey"));
364
- const payload = UninstallPluginRequest.parse(await c.req.json());
376
+ const payload = await parseRequestJson(c, UninstallPluginRequest);
365
377
  try {
366
378
  return c.json(
367
379
  UninstallPluginResult.parse({
@@ -373,11 +385,33 @@ export function registerPluginRoutes(
373
385
  subjectId: grant.subjectId,
374
386
  pluginKey,
375
387
  expectedInstallationVersion: payload.expectedInstallationVersion,
388
+ ...(payload.expectedPreviewToken
389
+ ? { expectedPreviewToken: payload.expectedPreviewToken }
390
+ : {}),
376
391
  idempotencyKey: payload.idempotencyKey,
377
392
  })),
378
393
  }),
379
394
  );
380
395
  } catch (error) {
396
+ if (error instanceof PluginUninstallPreviewChangedError) {
397
+ const preview = error.preview ?? {
398
+ pluginKey,
399
+ ...(await getPluginPackageUninstallPreview(
400
+ deps.db,
401
+ workspaceId,
402
+ pluginKey,
403
+ grant.subjectId,
404
+ )),
405
+ };
406
+ return c.json(
407
+ {
408
+ code: error.code,
409
+ message: error.message,
410
+ preview: PluginUninstallPreview.parse(preview),
411
+ },
412
+ 409,
413
+ );
414
+ }
381
415
  throw pluginMutationHttpError(error);
382
416
  }
383
417
  });
@@ -499,6 +533,11 @@ async function resolvePluginPackage(input: {
499
533
  continue;
500
534
  }
501
535
  if (component.kind === "integration") {
536
+ const source = await withOrganizationIntegrationPolicyFence(
537
+ input.deps.db,
538
+ input,
539
+ async (_tx, policy) => integrationSourceForOrganizationPolicy(policy, component.source),
540
+ );
502
541
  const requestedBinding = input.bindings[component.key];
503
542
  const connection = await optionalConnection(
504
543
  input.deps,
@@ -507,7 +546,7 @@ async function resolvePluginPackage(input: {
507
546
  requestedBinding?.connectionId,
508
547
  );
509
548
  const resolved = await resolveApiIntegrationPreview({
510
- source: component.source,
549
+ source,
511
550
  connection: connectionDescriptor(connection),
512
551
  transport: input.transport,
513
552
  authority: {