@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
@@ -23,6 +23,9 @@ import {
23
23
  import type { Context, Hono } from "hono";
24
24
  import { HTTPException } from "hono/http-exception";
25
25
  import { z } from "zod";
26
+ import { admitManagedSignInMutation } from "./managed-sign-in-methods";
27
+ import { managedAuthSecretRequestDigest } from "@opengeni/core/managed-auth-session-sets";
28
+ import { deliverManagedSignInNotification } from "../auth/managed-sign-in-notifications";
26
29
 
27
30
  const BindingId = z.string().uuid();
28
31
 
@@ -86,6 +89,7 @@ async function mutate(
86
89
  operationId: string;
87
90
  expectedIdentityRevision: number;
88
91
  reason: string;
92
+ verifiedManagedRecovery?: boolean;
89
93
  },
90
94
  ): Promise<Response> {
91
95
  const identity = await requestIdentity(context, deps);
@@ -104,10 +108,27 @@ async function mutate(
104
108
  ...(input.providerId ? { providerId: input.providerId } : {}),
105
109
  ...(input.providerAccountId ? { providerAccountId: input.providerAccountId } : {}),
106
110
  reason: input.reason,
111
+ ...(input.verifiedManagedRecovery
112
+ ? {
113
+ verifiedRecovery: {
114
+ authSessionId: identity.authSessionId,
115
+ requestDigest: managedAuthSecretRequestDigest(
116
+ deps.settings.betterAuthSecret!,
117
+ input,
118
+ ),
119
+ },
120
+ }
121
+ : {}),
107
122
  ...(actorFence ? { actorFence } : {}),
108
123
  }),
109
124
  );
110
125
  if (actorFence) markManagedAuthRequestActorTransitionApplied(context.req.raw);
126
+ if (input.verifiedManagedRecovery)
127
+ await deliverManagedSignInNotification(
128
+ deps.db,
129
+ deps.managedEmailTransport,
130
+ input.operationId,
131
+ );
111
132
  return context.json(response);
112
133
  } catch (error) {
113
134
  return identityError(context, error);
@@ -132,6 +153,11 @@ export function registerCanonicalHumanIdentityRoutes(app: Hono, deps: ApiRouteDe
132
153
 
133
154
  app.post(`${base}/login-bindings`, async (context) => {
134
155
  const request = await parseBody(context, LinkCanonicalHumanLoginBindingRequest);
156
+ if (["google", "github", "credential"].includes(request.providerId.trim().toLowerCase())) {
157
+ throw new HTTPException(403, {
158
+ message: "Use personal sign-in method settings with fresh provider proof",
159
+ });
160
+ }
135
161
  return await mutate(context, deps, {
136
162
  operationType: "link",
137
163
  ...request,
@@ -141,6 +167,19 @@ export function registerCanonicalHumanIdentityRoutes(app: Hono, deps: ApiRouteDe
141
167
 
142
168
  app.delete(`${base}/login-bindings/:bindingId`, async (context) => {
143
169
  const request = await parseBody(context, CanonicalHumanBindingOperationRequest);
170
+ const actor = await requestIdentity(context, deps);
171
+ const projection = await getCanonicalHumanIdentityProjection(deps.db, actor.authUserId);
172
+ if (
173
+ projection.loginBindings.some(
174
+ (binding) =>
175
+ binding.id === bindingId(context) &&
176
+ ["google", "github", "credential"].includes(binding.providerId),
177
+ )
178
+ ) {
179
+ throw new HTTPException(403, {
180
+ message: "Use personal sign-in method settings with last-method protection",
181
+ });
182
+ }
144
183
  return await mutate(context, deps, {
145
184
  operationType: "unlink",
146
185
  bindingId: bindingId(context),
@@ -151,6 +190,19 @@ export function registerCanonicalHumanIdentityRoutes(app: Hono, deps: ApiRouteDe
151
190
 
152
191
  app.post(`${base}/login-bindings/:bindingId/recovery`, async (context) => {
153
192
  const request = await parseBody(context, CanonicalHumanBindingOperationRequest);
193
+ const actor = await requestIdentity(context, deps);
194
+ const projection = await getCanonicalHumanIdentityProjection(deps.db, actor.authUserId);
195
+ if (
196
+ projection.loginBindings.some(
197
+ (binding) =>
198
+ binding.id === bindingId(context) &&
199
+ ["google", "github", "credential"].includes(binding.providerId),
200
+ )
201
+ ) {
202
+ throw new HTTPException(403, {
203
+ message: "Managed-provider recovery cannot be initiated through raw binding management",
204
+ });
205
+ }
154
206
  return await mutate(context, deps, {
155
207
  operationType: "begin_recovery",
156
208
  bindingId: bindingId(context),
@@ -161,11 +213,20 @@ export function registerCanonicalHumanIdentityRoutes(app: Hono, deps: ApiRouteDe
161
213
 
162
214
  app.post(`${base}/login-bindings/:bindingId/recovery/complete`, async (context) => {
163
215
  const request = await parseBody(context, CanonicalHumanBindingOperationRequest);
216
+ const actor = await requestIdentity(context, deps);
217
+ const projection = await getCanonicalHumanIdentityProjection(deps.db, actor.authUserId);
218
+ const managed = projection.loginBindings.some(
219
+ (binding) =>
220
+ binding.id === bindingId(context) &&
221
+ ["google", "github", "credential"].includes(binding.providerId),
222
+ );
223
+ if (managed) await admitManagedSignInMutation(context, deps);
164
224
  return await mutate(context, deps, {
165
225
  operationType: "recover",
166
226
  bindingId: bindingId(context),
167
227
  ...request,
168
228
  operationId: request.operationId ?? randomUUID(),
229
+ ...(managed ? { verifiedManagedRecovery: true } : {}),
169
230
  });
170
231
  });
171
232
  }
@@ -3,9 +3,21 @@ import {
3
3
  CreateCapabilityCatalogItemRequest,
4
4
  DiscoverMcpCapabilitiesResponse,
5
5
  EnableCapabilityRequest,
6
+ ConnectorToolPermissionsResponse,
7
+ UpdateConnectorToolPermissionsRequest,
8
+ SessionMcpToolPermissionsQuery,
9
+ SessionMcpToolPermissionsResponse,
10
+ UpdateSessionMcpToolPermissionsRequest,
6
11
  } from "@opengeni/contracts";
7
12
  import type { Hono } from "hono";
8
- import { requireAccessGrant } from "@opengeni/core";
13
+ import {
14
+ requireAccessGrant,
15
+ requireAccessGrantAuthorization,
16
+ getConnectorToolPermissions,
17
+ updateConnectorToolPermissions,
18
+ getSessionMcpToolPermissions,
19
+ updateSessionMcpToolPermissions,
20
+ } from "@opengeni/core";
9
21
  import type { ApiRouteDeps } from "@opengeni/core";
10
22
  import {
11
23
  buildCapabilityCatalog,
@@ -15,6 +27,7 @@ import {
15
27
  enableCapability,
16
28
  officialMcpRegistryUrl,
17
29
  } from "@opengeni/core";
30
+ import { isPersonalConnectionOwnerPrincipal } from "../connection-ownership";
18
31
  import { boundedLimit } from "../http/common";
19
32
  import { z } from "zod";
20
33
  import pluginSnapshot from "../../../../data/catalog/plugins-snapshot.json";
@@ -22,6 +35,7 @@ const discoverablePlugins = pluginSnapshot.sources
22
35
  .flatMap((source) => source.entries.map((entry) => ({ ...entry, provider: source.provider })))
23
36
  .sort((a, b) => a.displayName.localeCompare(b.displayName) || a.id.localeCompare(b.id));
24
37
  import { inspectMcpAuthentication } from "../integrations/oauth-client";
38
+ import { parseRequestJson } from "../http/request-body";
25
39
 
26
40
  export function registerCapabilityRoutes(app: Hono, deps: ApiRouteDeps): void {
27
41
  const { db, settings } = deps;
@@ -66,7 +80,7 @@ export function registerCapabilityRoutes(app: Hono, deps: ApiRouteDeps): void {
66
80
  });
67
81
  app.post("/v1/workspaces/:workspaceId/capabilities/discovery/mcp-auth", async (c) => {
68
82
  await requireAccessGrant(c, deps, c.req.param("workspaceId"), "workspace:read");
69
- const { url } = z.object({ url: z.string().url().max(2048) }).parse(await c.req.json());
83
+ const { url } = await parseRequestJson(c, z.object({ url: z.string().url().max(2048) }));
70
84
  return c.json(await inspectMcpAuthentication(url, settings));
71
85
  });
72
86
 
@@ -75,7 +89,13 @@ export function registerCapabilityRoutes(app: Hono, deps: ApiRouteDeps): void {
75
89
  const grant = await requireAccessGrant(c, deps, workspaceId, "workspace:read");
76
90
  return c.json(
77
91
  CapabilityCatalogResponse.parse(
78
- await buildCapabilityCatalog({ db, workspaceId, settings, subjectId: grant.subjectId }),
92
+ await buildCapabilityCatalog({
93
+ db,
94
+ workspaceId,
95
+ settings,
96
+ subjectId: grant.subjectId,
97
+ accountId: grant.accountId,
98
+ }),
79
99
  ),
80
100
  );
81
101
  });
@@ -83,7 +103,7 @@ export function registerCapabilityRoutes(app: Hono, deps: ApiRouteDeps): void {
83
103
  app.post("/v1/workspaces/:workspaceId/capabilities", async (c) => {
84
104
  const workspaceId = c.req.param("workspaceId");
85
105
  const grant = await requireAccessGrant(c, deps, workspaceId, "capabilities:manage");
86
- const payload = CreateCapabilityCatalogItemRequest.parse(await c.req.json());
106
+ const payload = await parseRequestJson(c, CreateCapabilityCatalogItemRequest);
87
107
  return c.json(
88
108
  await createCatalogItem({ db, accountId: grant.accountId, workspaceId, payload }),
89
109
  201,
@@ -110,10 +130,97 @@ export function registerCapabilityRoutes(app: Hono, deps: ApiRouteDeps): void {
110
130
  );
111
131
  });
112
132
 
133
+ app.get("/v1/workspaces/:workspaceId/capabilities/:capabilityId/tool-permissions", async (c) => {
134
+ const workspaceId = c.req.param("workspaceId");
135
+ const access = await requireAccessGrantAuthorization(c, deps, workspaceId, "workspace:read");
136
+ return c.json(
137
+ ConnectorToolPermissionsResponse.parse(
138
+ await getConnectorToolPermissions({
139
+ db,
140
+ settings,
141
+ workspaceId,
142
+ grant: access.grant,
143
+ capabilityId: decodeURIComponent(c.req.param("capabilityId")),
144
+ personalOwnerVerified: isPersonalConnectionOwnerPrincipal(access),
145
+ ...(c.req.query("connectionId") ? { connectionId: c.req.query("connectionId")! } : {}),
146
+ ...(c.req.query("instanceKey") ? { instanceKey: c.req.query("instanceKey")! } : {}),
147
+ }),
148
+ ),
149
+ );
150
+ });
151
+
152
+ app.patch(
153
+ "/v1/workspaces/:workspaceId/capabilities/:capabilityId/tool-permissions",
154
+ async (c) => {
155
+ const workspaceId = c.req.param("workspaceId");
156
+ const access = await requireAccessGrantAuthorization(
157
+ c,
158
+ deps,
159
+ workspaceId,
160
+ "capabilities:manage",
161
+ );
162
+ const payload = UpdateConnectorToolPermissionsRequest.safeParse(await c.req.json());
163
+ if (!payload.success) return c.json({ error: "Invalid connector permission target" }, 400);
164
+ await updateConnectorToolPermissions({
165
+ db,
166
+ settings,
167
+ workspaceId,
168
+ grant: access.grant,
169
+ capabilityId: decodeURIComponent(c.req.param("capabilityId")),
170
+ personalOwnerVerified: isPersonalConnectionOwnerPrincipal(access),
171
+ payload: payload.data,
172
+ });
173
+ return c.json({ saved: true });
174
+ },
175
+ );
176
+
177
+ // Host-attached session MCP servers: the host names the server id and exact
178
+ // URL it attaches; rules apply to that server in every workspace session.
179
+ app.get("/v1/workspaces/:workspaceId/session-mcp-tool-permissions", async (c) => {
180
+ const workspaceId = c.req.param("workspaceId");
181
+ const access = await requireAccessGrantAuthorization(c, deps, workspaceId, "workspace:read");
182
+ const query = SessionMcpToolPermissionsQuery.safeParse({
183
+ serverId: c.req.query("serverId"),
184
+ url: c.req.query("url"),
185
+ });
186
+ if (!query.success) return c.json({ error: "Invalid session MCP server" }, 400);
187
+ return c.json(
188
+ SessionMcpToolPermissionsResponse.parse(
189
+ await getSessionMcpToolPermissions({
190
+ db,
191
+ workspaceId,
192
+ grant: access.grant,
193
+ query: query.data,
194
+ }),
195
+ ),
196
+ );
197
+ });
198
+
199
+ app.patch("/v1/workspaces/:workspaceId/session-mcp-tool-permissions", async (c) => {
200
+ const workspaceId = c.req.param("workspaceId");
201
+ const access = await requireAccessGrantAuthorization(
202
+ c,
203
+ deps,
204
+ workspaceId,
205
+ "capabilities:manage",
206
+ );
207
+ const payload = UpdateSessionMcpToolPermissionsRequest.safeParse(
208
+ await c.req.json().catch(() => null),
209
+ );
210
+ if (!payload.success) return c.json({ error: "Invalid session MCP permission target" }, 400);
211
+ await updateSessionMcpToolPermissions({
212
+ db,
213
+ workspaceId,
214
+ grant: access.grant,
215
+ payload: payload.data,
216
+ });
217
+ return c.json({ saved: true });
218
+ });
219
+
113
220
  app.post("/v1/workspaces/:workspaceId/capabilities/:capabilityId/enable", async (c) => {
114
221
  const workspaceId = c.req.param("workspaceId");
115
222
  const grant = await requireAccessGrant(c, deps, workspaceId, "capabilities:manage");
116
- const payload = EnableCapabilityRequest.parse(await c.req.json());
223
+ const payload = await parseRequestJson(c, EnableCapabilityRequest);
117
224
  const installation = await enableCapability({
118
225
  db,
119
226
  grant,
@@ -16,6 +16,7 @@ import type { Hono } from "hono";
16
16
  import { HTTPException } from "hono/http-exception";
17
17
  import { requireAccessGrant } from "@opengeni/core";
18
18
  import type { ApiRouteDeps } from "@opengeni/core";
19
+ import { parseRequestJson } from "../http/request-body";
19
20
 
20
21
  // Workspace-shared channels organize root sessions ("workstreams") by work
21
22
  // type in the rail. Deliberately session-permission-gated (not workspace:admin):
@@ -42,7 +43,7 @@ export function registerChannelRoutes(app: Hono, deps: ApiRouteDeps): void {
42
43
  app.post("/v1/workspaces/:workspaceId/channels", async (c) => {
43
44
  const workspaceId = c.req.param("workspaceId");
44
45
  const grant = await requireAccessGrant(c, deps, workspaceId, "sessions:create");
45
- const payload = CreateChannelRequest.parse(await c.req.json());
46
+ const payload = await parseRequestJson(c, CreateChannelRequest);
46
47
  try {
47
48
  const channel = await createChannel(db, {
48
49
  accountId: grant.accountId,
@@ -63,7 +64,7 @@ export function registerChannelRoutes(app: Hono, deps: ApiRouteDeps): void {
63
64
  app.patch("/v1/workspaces/:workspaceId/channels/:channelId", async (c) => {
64
65
  const workspaceId = c.req.param("workspaceId");
65
66
  await requireAccessGrant(c, deps, workspaceId, "sessions:create");
66
- const payload = UpdateChannelRequest.parse(await c.req.json());
67
+ const payload = await parseRequestJson(c, UpdateChannelRequest);
67
68
  try {
68
69
  const channel = await updateChannel(
69
70
  db,
@@ -86,7 +87,7 @@ export function registerChannelRoutes(app: Hono, deps: ApiRouteDeps): void {
86
87
  app.put("/v1/workspaces/:workspaceId/channels/order", async (c) => {
87
88
  const workspaceId = c.req.param("workspaceId");
88
89
  await requireAccessGrant(c, deps, workspaceId, "sessions:create");
89
- const payload = ReorderChannelsRequest.parse(await c.req.json());
90
+ const payload = await parseRequestJson(c, ReorderChannelsRequest);
90
91
  const channels = await reorderChannels(db, workspaceId, payload.channelIds);
91
92
  if (!channels) {
92
93
  throw new HTTPException(409, { message: "projects changed; refresh and try again" });
@@ -0,0 +1,235 @@
1
+ import {
2
+ type ApiRouteDeps,
3
+ ModelCallError,
4
+ type ModelCallOutput,
5
+ type ModelCallService,
6
+ requireAccessGrant,
7
+ } from "@opengeni/core";
8
+ import type { Context, Hono } from "hono";
9
+ import {
10
+ chatCompletionChunk,
11
+ chatCompletionError,
12
+ chatCompletionResponse,
13
+ chatCompletionUsage,
14
+ chatCompletionId,
15
+ parseChatCompletionRequest,
16
+ } from "../model-calls/chat-completions";
17
+ import { isModelCallAbort } from "../model-calls/service";
18
+
19
+ /**
20
+ * OpenAI-compatible stateless model calls. A stock OpenAI SDK works with its
21
+ * base URL set to `/v1/workspaces/{workspaceId}` and an Opengeni API key.
22
+ * Running one costs what the same model call costs inside a session, and
23
+ * requires the same `sessions:create` authority.
24
+ */
25
+ export function registerChatCompletionRoutes(
26
+ app: Hono,
27
+ deps: ApiRouteDeps & { modelCalls: ModelCallService | null },
28
+ ): void {
29
+ /** A public error, or null for a client abort (nothing left to answer). */
30
+ const publicError = (error: unknown, workspaceId: string): ModelCallError | null => {
31
+ if (error instanceof ModelCallError) return error;
32
+ if (isModelCallAbort(error)) return null;
33
+ deps.observability?.warn("chat completion failed unexpectedly", {
34
+ workspaceId,
35
+ errorName: error instanceof Error ? error.name : typeof error,
36
+ });
37
+ return new ModelCallError({
38
+ status: 500,
39
+ type: "api_error",
40
+ code: "internal_error",
41
+ message: "The model call failed.",
42
+ });
43
+ };
44
+
45
+ app.get("/v1/workspaces/:workspaceId/models", async (c) => {
46
+ const workspaceId = c.req.param("workspaceId");
47
+ const grant = await requireAccessGrant(c, deps, workspaceId, "sessions:create");
48
+ if (!deps.modelCalls) return errorResponse(c, unavailable());
49
+ try {
50
+ const models = await deps.modelCalls.listModels({
51
+ grant,
52
+ accountId: grant.accountId,
53
+ workspaceId,
54
+ subjectId: grant.subjectId,
55
+ });
56
+ return c.json({
57
+ object: "list",
58
+ data: models.map((model) => ({
59
+ id: model.id,
60
+ object: "model",
61
+ created: 0,
62
+ owned_by: model.providerLabel,
63
+ name: model.label,
64
+ })),
65
+ });
66
+ } catch (error) {
67
+ return errorResponse(c, publicError(error, workspaceId));
68
+ }
69
+ });
70
+
71
+ app.post("/v1/workspaces/:workspaceId/chat/completions", async (c) => {
72
+ const workspaceId = c.req.param("workspaceId");
73
+ const grant = await requireAccessGrant(c, deps, workspaceId, "sessions:create");
74
+ const service = deps.modelCalls;
75
+ if (!service) return errorResponse(c, unavailable());
76
+ let parsed: ReturnType<typeof parseChatCompletionRequest>;
77
+ try {
78
+ parsed = parseChatCompletionRequest(await c.req.json().catch(() => undefined));
79
+ } catch (error) {
80
+ return errorResponse(c, publicError(error, workspaceId));
81
+ }
82
+ // Server-generated: a client-chosen id would let a reused settlement key
83
+ // make later calls free.
84
+ const requestId = crypto.randomUUID();
85
+ const created = Math.floor(Date.now() / 1000);
86
+ const abort = new AbortController();
87
+ const clientSignal = c.req.raw.signal;
88
+ const onClientAbort = () => abort.abort();
89
+ if (clientSignal.aborted) abort.abort();
90
+ else clientSignal.addEventListener("abort", onClientAbort, { once: true });
91
+ const caller = {
92
+ grant,
93
+ accountId: grant.accountId,
94
+ workspaceId,
95
+ subjectId: grant.subjectId,
96
+ model: parsed.model,
97
+ request: parsed.request,
98
+ requestId,
99
+ signal: abort.signal,
100
+ };
101
+
102
+ if (!parsed.stream) {
103
+ try {
104
+ const output = await service.call(caller);
105
+ return c.json(
106
+ chatCompletionResponse({
107
+ requestId,
108
+ created,
109
+ model: output.model,
110
+ result: output.result,
111
+ }),
112
+ );
113
+ } catch (error) {
114
+ return errorResponse(c, publicError(error, workspaceId));
115
+ } finally {
116
+ clientSignal.removeEventListener("abort", onClientAbort);
117
+ }
118
+ }
119
+
120
+ // Streaming: the status is decided by the first model output. A refusal
121
+ // or failure before any output is an ordinary JSON error response.
122
+ const encoder = new TextEncoder();
123
+ let controller: ReadableStreamDefaultController<Uint8Array> | null = null;
124
+ let closed = false;
125
+ const body = new ReadableStream<Uint8Array>({
126
+ start(streamController) {
127
+ controller = streamController;
128
+ },
129
+ cancel() {
130
+ closed = true;
131
+ abort.abort();
132
+ },
133
+ });
134
+ const send = (payload: unknown) => {
135
+ if (closed || !controller) return;
136
+ const data = typeof payload === "string" ? payload : JSON.stringify(payload);
137
+ controller.enqueue(encoder.encode(`data: ${data}\n\n`));
138
+ };
139
+ const close = () => {
140
+ if (closed || !controller) return;
141
+ closed = true;
142
+ controller.close();
143
+ };
144
+ let model: string | null = null;
145
+ let opened = false;
146
+ let signalOpened!: () => void;
147
+ const firstOutput = new Promise<void>((resolve) => {
148
+ signalOpened = resolve;
149
+ });
150
+ const chunk = (
151
+ delta: { role?: "assistant"; content?: string },
152
+ finishReason: null | ModelCallOutput["result"]["finishReason"],
153
+ ) =>
154
+ chatCompletionChunk({
155
+ requestId,
156
+ created,
157
+ model: model ?? parsed.model ?? "",
158
+ delta,
159
+ finishReason,
160
+ includeUsage: parsed.includeUsage,
161
+ });
162
+ const open = () => {
163
+ if (opened) return;
164
+ opened = true;
165
+ send(chunk({ role: "assistant", content: "" }, null));
166
+ signalOpened();
167
+ };
168
+ const completion = service.call({
169
+ ...caller,
170
+ onTextDelta: (delta) => {
171
+ open();
172
+ send(chunk({ content: delta }, null));
173
+ },
174
+ });
175
+ const first = await Promise.race([
176
+ firstOutput.then(() => ({ kind: "output" as const })),
177
+ completion.then(
178
+ (output) => ({ kind: "done" as const, output }),
179
+ (error: unknown) => ({ kind: "failed" as const, error }),
180
+ ),
181
+ ]);
182
+ if (first.kind === "failed" && !opened) {
183
+ clientSignal.removeEventListener("abort", onClientAbort);
184
+ return errorResponse(c, publicError(first.error, workspaceId));
185
+ }
186
+ open();
187
+ void completion
188
+ .then((output) => {
189
+ model = output.model;
190
+ send(chunk({}, output.result.finishReason));
191
+ if (parsed.includeUsage) {
192
+ send({
193
+ id: chatCompletionId(requestId),
194
+ object: "chat.completion.chunk",
195
+ created,
196
+ model: output.model,
197
+ choices: [],
198
+ usage: chatCompletionUsage(output.result.usage),
199
+ });
200
+ }
201
+ send("[DONE]");
202
+ })
203
+ .catch((error: unknown) => {
204
+ // Headers are already sent; report the failure in-band like OpenAI.
205
+ const failure = publicError(error, workspaceId);
206
+ if (failure) send(chatCompletionError(failure));
207
+ })
208
+ .finally(() => {
209
+ clientSignal.removeEventListener("abort", onClientAbort);
210
+ close();
211
+ });
212
+ return new Response(body, {
213
+ status: 200,
214
+ headers: {
215
+ "content-type": "text/event-stream; charset=utf-8",
216
+ "cache-control": "no-cache, no-transform",
217
+ "x-accel-buffering": "no",
218
+ },
219
+ });
220
+ });
221
+ }
222
+
223
+ function unavailable(): ModelCallError {
224
+ return new ModelCallError({
225
+ status: 503,
226
+ type: "service_unavailable",
227
+ code: "unavailable",
228
+ message: "Model calls are unavailable on this deployment.",
229
+ });
230
+ }
231
+
232
+ function errorResponse(c: Context, error: ModelCallError | null): Response {
233
+ if (!error) return c.body(null, 499 as never);
234
+ return c.json(chatCompletionError(error), error.status as never);
235
+ }