@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,263 @@
1
+ import { SITE_FRAME_HEADER } from "@opengeni/contracts/site-session-http";
2
+ import {
3
+ SITE_SQL_ERROR_STATUS,
4
+ SITE_SQL_EXPORT_NEXT_CURSOR_HEADER,
5
+ SiteSqlExportFormat,
6
+ SiteSqlImportRequest,
7
+ SiteSqlMigrationRequest,
8
+ SiteSqlResetRequest,
9
+ SiteSqlStatementRequest,
10
+ SiteSqlQueryDefinitionRequest,
11
+ SiteSqlRunRequest,
12
+ SiteSqlSettingsRequest,
13
+ type ErrorCode,
14
+ type SiteSqlErrorCode,
15
+ } from "@opengeni/contracts";
16
+ import { requireAccessGrant, type ApiRouteDeps } from "@opengeni/core";
17
+ import type { Context, Hono } from "hono";
18
+ import { z } from "zod";
19
+ import { ApiHttpError } from "../http/api-error";
20
+ import { USER_CONTENT_SECURITY_HEADERS } from "../http/user-content";
21
+ import type { SiteDataSurface } from "../site-data/service";
22
+ import {
23
+ defineSiteSqlQuery,
24
+ describeSiteSql,
25
+ exportSiteSql,
26
+ importSiteSql,
27
+ inspectSiteSql,
28
+ migrateSiteSql,
29
+ resetSiteSql,
30
+ runSiteSqlQuery,
31
+ runSiteSqlStatement,
32
+ setSiteSqlSettings,
33
+ SiteSqlError,
34
+ } from "../site-sql/service";
35
+
36
+ const SiteId = z.string().uuid();
37
+
38
+ const PUBLIC_CODE: Record<SiteSqlErrorCode, ErrorCode> = {
39
+ validation: "validation_failed",
40
+ sql_error: "validation_failed",
41
+ conflict: "conflict",
42
+ disabled: "conflict",
43
+ not_found: "not_found",
44
+ forbidden: "forbidden",
45
+ quota_exceeded: "limit_exceeded",
46
+ rate_limited: "limit_exceeded",
47
+ unavailable: "upstream_unavailable",
48
+ };
49
+
50
+ /** Typed Site SQL errors in the public envelope; `details.code` is the Site SQL code. */
51
+ export function siteSqlHttpError(error: SiteSqlError): ApiHttpError {
52
+ return new ApiHttpError(SITE_SQL_ERROR_STATUS[error.code], {
53
+ code: PUBLIC_CODE[error.code],
54
+ message: error.message,
55
+ retryable: error.code === "rate_limited" || error.details.retryable === true,
56
+ outcomeUnknown: error.details.outcomeUnknown === true,
57
+ details: { ...error.details, code: error.code },
58
+ });
59
+ }
60
+
61
+ export async function runSiteSqlRoute<T>(fn: () => Promise<T>): Promise<T> {
62
+ try {
63
+ return await fn();
64
+ } catch (error) {
65
+ if (error instanceof SiteSqlError) throw siteSqlHttpError(error);
66
+ throw error;
67
+ }
68
+ }
69
+
70
+ export async function siteSqlBody<S extends z.ZodType>(
71
+ context: Context,
72
+ schema: S,
73
+ ): Promise<z.infer<S>> {
74
+ const parsed = schema.safeParse(await context.req.json().catch(() => null));
75
+ if (!parsed.success)
76
+ throw siteSqlHttpError(
77
+ new SiteSqlError(
78
+ "validation",
79
+ parsed.error.issues
80
+ .slice(0, 3)
81
+ .map((issue) => `${issue.path.join(".") || "request"}: ${issue.message}`)
82
+ .join("; "),
83
+ ),
84
+ );
85
+ return parsed.data;
86
+ }
87
+
88
+ function siteId(context: Context): string {
89
+ const parsed = SiteId.safeParse(context.req.param("artifactId"));
90
+ if (!parsed.success) throw siteSqlHttpError(new SiteSqlError("not_found", "Site not found"));
91
+ return parsed.data;
92
+ }
93
+
94
+ /** Like Site Data: the frame marker or pinned Site id makes a request framed. */
95
+ function surface(context: Context): SiteDataSurface {
96
+ const frame = context.req.header("x-opengeni-site-id");
97
+ const marked = context.req.header(SITE_FRAME_HEADER) !== undefined;
98
+ if (!frame && !marked) return {};
99
+ return { frameSiteId: frame ?? "" };
100
+ }
101
+
102
+ function refuseFramed(context: Context, what: string): void {
103
+ if (surface(context).frameSiteId !== undefined)
104
+ throw siteSqlHttpError(new SiteSqlError("forbidden", `A Site cannot ${what}`));
105
+ }
106
+
107
+ /**
108
+ * Site SQL routes. Running a named query needs Site access (`artifacts:read`
109
+ * and the viewer's audience); the query's audience decides the rest. Everything
110
+ * else is management: a manager of the Site outside any Site frame, with
111
+ * `artifacts:read` to look and `artifacts:publish` to change.
112
+ */
113
+ export function registerSiteSqlRoutes(app: Hono, deps: ApiRouteDeps): void {
114
+ const base = "/v1/workspaces/:workspaceId/published-artifacts/:artifactId/sql";
115
+ const grantFor = (context: Context, permission: "artifacts:read" | "artifacts:publish") =>
116
+ requireAccessGrant(context, deps, context.req.param("workspaceId")!, permission);
117
+
118
+ app.get(base, async (context) => {
119
+ const grant = await grantFor(context, "artifacts:read");
120
+ refuseFramed(context, "manage its database");
121
+ return context.json(await runSiteSqlRoute(() => describeSiteSql(deps, grant, siteId(context))));
122
+ });
123
+
124
+ app.put(`${base}/settings`, async (context) => {
125
+ const grant = await grantFor(context, "artifacts:publish");
126
+ const request = await siteSqlBody(context, SiteSqlSettingsRequest);
127
+ refuseFramed(context, "manage its database");
128
+ return context.json(
129
+ await runSiteSqlRoute(() => setSiteSqlSettings(deps, grant, siteId(context), request)),
130
+ );
131
+ });
132
+
133
+ app.post(`${base}/queries/:name`, async (context) => {
134
+ const grant = await grantFor(context, "artifacts:read");
135
+ const request = await siteSqlBody(context, SiteSqlRunRequest);
136
+ return context.json(
137
+ await runSiteSqlRoute(() =>
138
+ runSiteSqlQuery(
139
+ deps,
140
+ grant,
141
+ siteId(context),
142
+ context.req.param("name")!,
143
+ request.params ?? {},
144
+ surface(context),
145
+ ),
146
+ ),
147
+ );
148
+ });
149
+
150
+ app.put(`${base}/queries/:name`, async (context) => {
151
+ const grant = await grantFor(context, "artifacts:publish");
152
+ const request = await siteSqlBody(context, SiteSqlQueryDefinitionRequest);
153
+ refuseFramed(context, "define queries");
154
+ const result = await runSiteSqlRoute(() =>
155
+ defineSiteSqlQuery(deps, grant, siteId(context), context.req.param("name")!, request),
156
+ );
157
+ return context.json(result.query, result.created ? 201 : 200);
158
+ });
159
+
160
+ app.delete(`${base}/queries/:name`, async (context) => {
161
+ const grant = await grantFor(context, "artifacts:publish");
162
+ refuseFramed(context, "delete queries");
163
+ await runSiteSqlRoute(() =>
164
+ defineSiteSqlQuery(deps, grant, siteId(context), context.req.param("name")!, null),
165
+ );
166
+ return context.json({ deleted: true });
167
+ });
168
+
169
+ app.post(`${base}/migrations`, async (context) => {
170
+ const grant = await grantFor(context, "artifacts:publish");
171
+ const request = await siteSqlBody(context, SiteSqlMigrationRequest);
172
+ refuseFramed(context, "change its database schema");
173
+ return context.json(
174
+ await runSiteSqlRoute(() => migrateSiteSql(deps, grant, siteId(context), request)),
175
+ 201,
176
+ );
177
+ });
178
+
179
+ app.post(`${base}/query`, async (context) => {
180
+ const grant = await grantFor(context, "artifacts:read");
181
+ const request = await siteSqlBody(context, SiteSqlStatementRequest);
182
+ refuseFramed(context, "run ad hoc SQL");
183
+ return context.json(
184
+ await runSiteSqlRoute(() =>
185
+ runSiteSqlStatement(deps, grant, siteId(context), request, "read"),
186
+ ),
187
+ );
188
+ });
189
+
190
+ app.post(`${base}/execute`, async (context) => {
191
+ const grant = await grantFor(context, "artifacts:publish");
192
+ const request = await siteSqlBody(context, SiteSqlStatementRequest);
193
+ refuseFramed(context, "run ad hoc SQL");
194
+ return context.json(
195
+ await runSiteSqlRoute(() =>
196
+ runSiteSqlStatement(deps, grant, siteId(context), request, "write"),
197
+ ),
198
+ );
199
+ });
200
+
201
+ app.get(`${base}/inspect`, async (context) => {
202
+ const grant = await grantFor(context, "artifacts:read");
203
+ refuseFramed(context, "inspect its database");
204
+ return context.json(await runSiteSqlRoute(() => inspectSiteSql(deps, grant, siteId(context))));
205
+ });
206
+
207
+ app.get(`${base}/export`, async (context) => {
208
+ const grant = await grantFor(context, "artifacts:read");
209
+ refuseFramed(context, "export its database");
210
+ const format = SiteSqlExportFormat.safeParse(context.req.query("format") ?? "sql");
211
+ if (!format.success)
212
+ throw siteSqlHttpError(new SiteSqlError("validation", "format is sql, csv or json"));
213
+ const table = context.req.query("table");
214
+ const cursor = context.req.query("cursor");
215
+ if (cursor !== undefined && (cursor.length === 0 || cursor.length > 4096))
216
+ throw siteSqlHttpError(
217
+ new SiteSqlError("validation", "cursor is a nextCursor from an export"),
218
+ );
219
+ const maxBytesText = context.req.query("maxBytes");
220
+ const maxBytes = maxBytesText === undefined ? undefined : Number(maxBytesText);
221
+ if (maxBytes !== undefined && (!Number.isSafeInteger(maxBytes) || maxBytes < 1024))
222
+ throw siteSqlHttpError(
223
+ new SiteSqlError("validation", "maxBytes is a whole number of bytes, at least 1024"),
224
+ );
225
+ const exported = await runSiteSqlRoute(() =>
226
+ exportSiteSql(deps, grant, siteId(context), {
227
+ format: format.data,
228
+ ...(table ? { table } : {}),
229
+ ...(cursor ? { cursor } : {}),
230
+ ...(maxBytes !== undefined ? { maxBytes } : {}),
231
+ }),
232
+ );
233
+ return new Response(exported.content, {
234
+ headers: {
235
+ "Content-Type": exported.contentType,
236
+ "Content-Disposition": `attachment; filename="${exported.filename}"`,
237
+ ...USER_CONTENT_SECURITY_HEADERS,
238
+ "X-OpenGeni-Export-Truncated": exported.truncated ? "true" : "false",
239
+ ...(exported.nextCursor
240
+ ? { [SITE_SQL_EXPORT_NEXT_CURSOR_HEADER]: exported.nextCursor }
241
+ : {}),
242
+ },
243
+ });
244
+ });
245
+
246
+ app.post(`${base}/import`, async (context) => {
247
+ const grant = await grantFor(context, "artifacts:publish");
248
+ const request = await siteSqlBody(context, SiteSqlImportRequest);
249
+ refuseFramed(context, "import data");
250
+ return context.json(
251
+ await runSiteSqlRoute(() => importSiteSql(deps, grant, siteId(context), request)),
252
+ );
253
+ });
254
+
255
+ app.post(`${base}/reset`, async (context) => {
256
+ const grant = await grantFor(context, "artifacts:publish");
257
+ const request = await siteSqlBody(context, SiteSqlResetRequest);
258
+ refuseFramed(context, "reset its database");
259
+ return context.json(
260
+ await runSiteSqlRoute(() => resetSiteSql(deps, grant, siteId(context), request)),
261
+ );
262
+ });
263
+ }
@@ -1,10 +1,12 @@
1
1
  import { z } from "zod";
2
2
  import type { Context, Hono } from "hono";
3
3
  import { HTTPException } from "hono/http-exception";
4
- import { SkillFile, type SkillWriteReceipt } from "@opengeni/contracts";
4
+ import { SkillFile, SKILL_MAX_FILES, type SkillWriteReceipt } from "@opengeni/contracts";
5
+ import { getSessionForSubject, readSkillRemovalScope } from "@opengeni/db";
5
6
  import {
6
7
  approveSkill,
7
8
  rejectSkill,
9
+ removeSkill,
8
10
  listSkills,
9
11
  readSkill,
10
12
  requireAccessGrant,
@@ -26,13 +28,14 @@ const saveRequest = z
26
28
  expectedScopeVersion: z.number().int().nonnegative(),
27
29
  scope: scopeSchema.default("workspace"),
28
30
  stableKey: z.string().min(1).max(96),
29
- files: z.array(SkillFile).max(128),
30
- deletions: z.array(z.string().min(1).max(512)).max(128).default([]),
31
+ files: z.array(SkillFile).max(SKILL_MAX_FILES),
32
+ deletions: z.array(z.string().min(1).max(512)).max(SKILL_MAX_FILES).default([]),
31
33
  reason: z.string().min(1).max(2000),
32
34
  })
33
35
  .strict();
34
36
  const revisionRequest = z
35
37
  .object({
38
+ removalOperationId: z.uuid().optional(),
36
39
  operationId: z.uuid(),
37
40
  revisionId: z.uuid(),
38
41
  expectedRevisionId: z.uuid().nullable(),
@@ -41,6 +44,8 @@ const revisionRequest = z
41
44
  })
42
45
  .strict();
43
46
 
47
+ const removeRequest = revisionRequest.omit({ revisionId: true, removalOperationId: true });
48
+
44
49
  async function parseSkillRequest<S extends z.ZodType>(c: Context, schema: S): Promise<z.infer<S>> {
45
50
  const parsed = schema.safeParse(await c.req.json().catch(() => null));
46
51
  if (!parsed.success) throw new HTTPException(422, { message: "Invalid Skill request" });
@@ -64,9 +69,20 @@ export function registerSkillContentRoutes(app: Hono, deps: ApiRouteDeps): void
64
69
  .object({
65
70
  limit: z.coerce.number().int().min(1).max(250).default(100),
66
71
  cursor: z.string().max(2048).optional(),
72
+ sessionId: z.uuid().optional(),
67
73
  })
68
74
  .safeParse(c.req.query());
69
75
  if (!query.success) throw new HTTPException(422, { message: "Invalid Skill list query" });
76
+ if (query.data.sessionId) {
77
+ await requireAccessGrant(c, deps, workspaceId, "sessions:read");
78
+ const session = await getSessionForSubject(
79
+ deps.db,
80
+ workspaceId,
81
+ query.data.sessionId,
82
+ grant.subjectId,
83
+ );
84
+ if (!session) throw new HTTPException(404, { message: "Session not found" });
85
+ }
70
86
  let after: { stableKey: string; id: string } | undefined;
71
87
  if (query.data.cursor !== undefined) {
72
88
  try {
@@ -81,7 +97,12 @@ export function registerSkillContentRoutes(app: Hono, deps: ApiRouteDeps): void
81
97
  const rows = await listSkills(
82
98
  deps.db,
83
99
  { accountId: grant.accountId, workspaceId, subjectId: grant.subjectId },
84
- { limit: query.data.limit + 1, metadataOnly: true, ...(after ? { after } : {}) },
100
+ {
101
+ limit: query.data.limit + 1,
102
+ metadataOnly: true,
103
+ ...(after ? { after } : {}),
104
+ ...(query.data.sessionId ? { sessionId: query.data.sessionId } : {}),
105
+ },
85
106
  );
86
107
  const page = rows.slice(0, query.data.limit);
87
108
  const last = page.at(-1);
@@ -169,6 +190,36 @@ export function registerSkillContentRoutes(app: Hono, deps: ApiRouteDeps): void
169
190
  );
170
191
  return c.json(receipt);
171
192
  });
193
+ app.post(`${base}/:skillId/remove`, async (c) => {
194
+ const workspaceId = c.req.param("workspaceId");
195
+ const access = await requireAccessGrantAuthorization(c, deps, workspaceId, "workspace:read");
196
+ const skillId = skillIdentifier(c.req.param("skillId"));
197
+ const request = await parseSkillRequest(c, removeRequest);
198
+ const context = {
199
+ accountId: access.grant.accountId,
200
+ workspaceId,
201
+ subjectId: access.grant.subjectId,
202
+ };
203
+ const current = await readSkill(deps.db, context, skillId);
204
+ const scope =
205
+ current?.scope ??
206
+ (await readSkillRemovalScope(deps.db, context, skillId, request.operationId));
207
+ if (!scope) throw new HTTPException(404, { message: "Skill not found" });
208
+ authorizePreferenceRegistryScopeMutation(access, scope);
209
+ if (scope === "organization")
210
+ throw new HTTPException(403, { message: "Organization skills cannot be removed here." });
211
+ return c.json(
212
+ await skillMutation(() =>
213
+ removeSkill(deps.db, {
214
+ ...request,
215
+ skillId,
216
+ accountId: context.accountId,
217
+ workspaceId,
218
+ actor: { kind: "human", principalKind: "human_session", subjectId: context.subjectId },
219
+ }),
220
+ ),
221
+ );
222
+ });
172
223
  for (const operation of ["approve", "reject", "restore"] as const) {
173
224
  app.post(`${base}/:skillId/${operation}`, async (c) => {
174
225
  const workspaceId = c.req.param("workspaceId");
@@ -180,8 +231,22 @@ export function registerSkillContentRoutes(app: Hono, deps: ApiRouteDeps): void
180
231
  { accountId: access.grant.accountId, workspaceId, subjectId: access.grant.subjectId },
181
232
  skillId,
182
233
  );
183
- if (!current) throw new HTTPException(404, { message: "Skill not found" });
184
- authorizePreferenceRegistryScopeMutation(access, current.scope);
234
+ const scope =
235
+ current?.scope ??
236
+ (operation === "approve" && request.removalOperationId
237
+ ? await readSkillRemovalScope(
238
+ deps.db,
239
+ {
240
+ accountId: access.grant.accountId,
241
+ workspaceId,
242
+ subjectId: access.grant.subjectId,
243
+ },
244
+ skillId,
245
+ request.operationId,
246
+ )
247
+ : null);
248
+ if (!scope) throw new HTTPException(404, { message: "Skill not found" });
249
+ authorizePreferenceRegistryScopeMutation(access, scope);
185
250
  const apply =
186
251
  operation === "approve"
187
252
  ? approveSkill
@@ -214,7 +279,7 @@ async function skillMutation(run: () => Promise<SkillWriteReceipt>): Promise<Ski
214
279
  let current: unknown = error;
215
280
  for (let depth = 0; depth < 4 && current && typeof current === "object"; depth++) {
216
281
  const candidate = current as { code?: unknown; cause?: unknown };
217
- if (candidate.code === "23505" || candidate.code === "40001")
282
+ if (candidate.code === "23505" || candidate.code === "40001" || candidate.code === "55P03")
218
283
  throw new HTTPException(409, {
219
284
  message:
220
285
  "Skill changed or this operation key was reused. Reload and reconcile the change.",
@@ -38,6 +38,7 @@ import type { Hono } from "hono";
38
38
  import { createGitHubSkillSourceClient } from "../integrations/github-skill-source";
39
39
  import { registerSkillContentRoutes } from "./skill-content";
40
40
  import { skillInstallerActor, skillRemovalActor } from "./skill-install-authority";
41
+ import { parseRequestJson } from "../http/request-body";
41
42
 
42
43
  export type SkillRouteOverrides = Readonly<{
43
44
  github?: GitHubSkillSourceClient;
@@ -88,7 +89,7 @@ export function registerSkillRoutes(
88
89
  const { grant } = access;
89
90
  const skillActor = skillInstallerActor(access);
90
91
  const libraryId = decodeURIComponent(c.req.param("libraryId"));
91
- const payload = InstallLibrarySkillRequest.parse(await c.req.json());
92
+ const payload = await parseRequestJson(c, InstallLibrarySkillRequest);
92
93
  let loaded: ReturnType<typeof loadSkillLibrarySkill>;
93
94
  try {
94
95
  loaded = loadSkillLibrarySkill(libraryId, payload.expectedVersion);
@@ -150,7 +151,7 @@ export function registerSkillRoutes(
150
151
  app.post("/v1/workspaces/:workspaceId/skills/preview", async (c) => {
151
152
  const workspaceId = c.req.param("workspaceId");
152
153
  await requireAccessGrant(c, deps, workspaceId, "workspace:read");
153
- const payload = PreviewSkillImportRequest.parse(await c.req.json());
154
+ const payload = await parseRequestJson(c, PreviewSkillImportRequest);
154
155
  const resolved = await resolveForRoute(payload.url, github);
155
156
  const installed = await getPortableSkillUninstallPreview(
156
157
  deps.db,
@@ -176,7 +177,7 @@ export function registerSkillRoutes(
176
177
  );
177
178
  const { grant } = access;
178
179
  const skillActor = skillInstallerActor(access);
179
- const payload = InstallSkillRequest.parse(await c.req.json());
180
+ const payload = await parseRequestJson(c, InstallSkillRequest);
180
181
  const resolved = await resolveForRoute(payload.url, github);
181
182
  if (
182
183
  resolved.preview.sourceCommit !== payload.expectedSourceCommit ||
@@ -252,7 +253,7 @@ export function registerSkillRoutes(
252
253
  const { grant } = access;
253
254
  const skillActor = skillRemovalActor(access);
254
255
  const capabilityId = decodeURIComponent(c.req.param("capabilityId"));
255
- const payload = UninstallSkillRequest.parse(await c.req.json());
256
+ const payload = await parseRequestJson(c, UninstallSkillRequest);
256
257
  try {
257
258
  return c.json(
258
259
  UninstallSkillResult.parse(
@@ -0,0 +1,108 @@
1
+ import {
2
+ AvailableOpenGeniSlackBots,
3
+ OpenGeniSlackBotOrganizationAccess,
4
+ UpdateOpenGeniSlackBotOrganizationAccess,
5
+ } from "@opengeni/contracts";
6
+ import {
7
+ isOpenGeniSlackBotConnection,
8
+ requireAccessGrant,
9
+ type ApiRouteDeps,
10
+ } from "@opengeni/core";
11
+ import {
12
+ availableSlackBotConnectionMetadata,
13
+ nestedPostgresSqlState,
14
+ readOrganizationSlackBotAccess,
15
+ setOrganizationSlackBotAccess,
16
+ sharedOrganizationSlackBots,
17
+ } from "@opengeni/db";
18
+ import type { Hono } from "hono";
19
+ import { HTTPException } from "hono/http-exception";
20
+ import { z } from "zod";
21
+ import { authorizeOrganizationIntegrationAdministration } from "./organization-integration-policy";
22
+
23
+ export function registerSlackBotAccessRoutes(app: Hono, deps: ApiRouteDeps): void {
24
+ const base = "/v1/workspaces/:workspaceId/connections";
25
+ app.get(`${base}/:connectionId/slack-bot/organization-access`, async (context) => {
26
+ const grant = await requireAccessGrant(
27
+ context,
28
+ deps,
29
+ context.req.param("workspaceId"),
30
+ "connections:read",
31
+ );
32
+ const connectionId = z.string().uuid().safeParse(context.req.param("connectionId"));
33
+ if (!connectionId.success) throw new HTTPException(422, { message: "Invalid bot connection" });
34
+ context.header("cache-control", "private, no-store");
35
+ try {
36
+ return context.json(
37
+ OpenGeniSlackBotOrganizationAccess.parse(
38
+ await readOrganizationSlackBotAccess(deps.db, {
39
+ accountId: grant.accountId,
40
+ workspaceId: grant.workspaceId,
41
+ connectionId: connectionId.data,
42
+ }),
43
+ ),
44
+ );
45
+ } catch (error) {
46
+ if (nestedPostgresSqlState(error) === "42501")
47
+ throw new HTTPException(404, { message: "Local bot installation unavailable" });
48
+ throw error;
49
+ }
50
+ });
51
+ app.get(`${base}/slack-bot/available`, async (context) => {
52
+ const grant = await requireAccessGrant(
53
+ context,
54
+ deps,
55
+ context.req.param("workspaceId"),
56
+ "connections:read",
57
+ );
58
+ context.header("cache-control", "private, no-store");
59
+ const [connections, shares] = await Promise.all([
60
+ availableSlackBotConnectionMetadata(deps.db, grant),
61
+ sharedOrganizationSlackBots(deps.db, grant),
62
+ ]);
63
+ return context.json(
64
+ AvailableOpenGeniSlackBots.parse({
65
+ connections: connections.filter(
66
+ (connection) =>
67
+ connection.status === "active" && isOpenGeniSlackBotConnection(connection),
68
+ ),
69
+ organizationSharedConnectionIds: shares.map((share) => share.connectionId),
70
+ }),
71
+ );
72
+ });
73
+ app.put(`${base}/:connectionId/slack-bot/organization-access`, async (context) => {
74
+ const grant = await requireAccessGrant(
75
+ context,
76
+ deps,
77
+ context.req.param("workspaceId"),
78
+ "connections:write",
79
+ );
80
+ const connectionId = z.string().uuid().safeParse(context.req.param("connectionId"));
81
+ const request = UpdateOpenGeniSlackBotOrganizationAccess.safeParse(
82
+ await context.req.json().catch(() => null),
83
+ );
84
+ if (!connectionId.success || !request.success)
85
+ throw new HTTPException(422, { message: "Invalid bot access setting" });
86
+ context.header("cache-control", "private, no-store");
87
+ try {
88
+ const result = await setOrganizationSlackBotAccess(
89
+ deps.db,
90
+ {
91
+ accountId: grant.accountId,
92
+ workspaceId: grant.workspaceId,
93
+ connectionId: connectionId.data,
94
+ enabled: request.data.enabled,
95
+ },
96
+ () => authorizeOrganizationIntegrationAdministration(context, deps, grant.accountId, true),
97
+ );
98
+ return context.json(OpenGeniSlackBotOrganizationAccess.parse(result));
99
+ } catch (error) {
100
+ if (error instanceof HTTPException) throw error;
101
+ if (nestedPostgresSqlState(error) === "42501")
102
+ throw new HTTPException(403, {
103
+ message: "Organization administrator and a verified local bot installation required",
104
+ });
105
+ throw error;
106
+ }
107
+ });
108
+ }
@@ -2,8 +2,10 @@ import {
2
2
  CreateSocialConnectionRequest,
3
3
  CreateSocialPostRequest,
4
4
  OAuthStartResponse,
5
+ OrganizationIntegrationDeniedError,
5
6
  SocialOAuthStartRequest,
6
7
  } from "@opengeni/contracts";
8
+ import { withOrganizationIntegrationAcquisition } from "@opengeni/db/organization-integration-policy";
7
9
  import {
8
10
  createSocialConnection,
9
11
  createSocialPost,
@@ -24,6 +26,7 @@ import {
24
26
  import type { ApiRouteDeps } from "@opengeni/core";
25
27
  import { boundedLimit } from "../http/common";
26
28
  import { completeSocialOAuthCallback, startSocialOAuth } from "../integrations/social-oauth";
29
+ import { parseRequestJson } from "../http/request-body";
27
30
 
28
31
  export function registerSocialRoutes(app: Hono, deps: ApiRouteDeps): void {
29
32
  const { db, settings, observability } = deps;
@@ -44,22 +47,28 @@ export function registerSocialRoutes(app: Hono, deps: ApiRouteDeps): void {
44
47
  app.post("/v1/workspaces/:workspaceId/social/connections", async (c) => {
45
48
  const workspaceId = c.req.param("workspaceId");
46
49
  const grant = await requireAccessGrant(c, deps, workspaceId, "workspace:admin");
47
- const payload = CreateSocialConnectionRequest.parse(await c.req.json());
50
+ const payload = await parseRequestJson(c, CreateSocialConnectionRequest);
48
51
  try {
49
52
  return c.json(
50
- await createSocialConnection(db, {
51
- accountId: grant.accountId,
52
- workspaceId,
53
- provider: payload.provider,
54
- accountHandle: payload.accountHandle,
55
- accountName: payload.accountName ?? null,
56
- externalAccountId: payload.externalAccountId ?? null,
57
- status: payload.status,
58
- scopes: payload.scopes,
59
- credentialRef: payload.credentialRef ?? null,
60
- tokenMetadata: payload.tokenMetadata,
61
- metadata: payload.metadata,
62
- }),
53
+ await withOrganizationIntegrationAcquisition(
54
+ db,
55
+ { accountId: grant.accountId, workspaceId },
56
+ [payload.provider === "x" || payload.provider === "reddit" ? payload.provider : null],
57
+ (tx) =>
58
+ createSocialConnection(tx, {
59
+ accountId: grant.accountId,
60
+ workspaceId,
61
+ provider: payload.provider,
62
+ accountHandle: payload.accountHandle,
63
+ accountName: payload.accountName ?? null,
64
+ externalAccountId: payload.externalAccountId ?? null,
65
+ status: payload.status,
66
+ scopes: payload.scopes,
67
+ credentialRef: payload.credentialRef ?? null,
68
+ tokenMetadata: payload.tokenMetadata,
69
+ metadata: payload.metadata,
70
+ }),
71
+ ),
63
72
  201,
64
73
  );
65
74
  } catch (error) {
@@ -168,7 +177,7 @@ export function registerSocialRoutes(app: Hono, deps: ApiRouteDeps): void {
168
177
  app.post("/v1/workspaces/:workspaceId/social/posts", async (c) => {
169
178
  const workspaceId = c.req.param("workspaceId");
170
179
  const grant = await requireAccessGrant(c, deps, workspaceId, "workspace:admin");
171
- const payload = CreateSocialPostRequest.parse(await c.req.json());
180
+ const payload = await parseRequestJson(c, CreateSocialPostRequest);
172
181
  try {
173
182
  return c.json(
174
183
  await createSocialPost(db, {
@@ -222,6 +231,9 @@ function parseConnectionIds(raw: string | undefined): string[] | undefined {
222
231
  }
223
232
 
224
233
  function socialHttpException(error: unknown): HTTPException {
234
+ if (error instanceof OrganizationIntegrationDeniedError) {
235
+ return new HTTPException(403, { message: error.message });
236
+ }
225
237
  const message = error instanceof Error ? error.message : String(error);
226
238
  if (message.includes("not found")) {
227
239
  return new HTTPException(404, { message });