@opengeni/api-router 3.0.1 → 3.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. package/dist/access-grant-rls.d.ts +8 -1
  2. package/dist/admission-trace.d.ts +8 -0
  3. package/dist/app.d.ts +50 -3
  4. package/dist/app.js +10 -1
  5. package/dist/artifact-catalog-cursor.d.ts +1 -0
  6. package/dist/attached-browser-viewer.d.ts +11 -0
  7. package/dist/auth/managed-auth-attempt-context.d.ts +2 -0
  8. package/dist/auth/managed-auth-rate-limits.d.ts +167 -0
  9. package/dist/auth/managed-auth-session-adapter.d.ts +9 -1
  10. package/dist/auth/managed-auth.d.ts +72 -5
  11. package/dist/auth/managed-sign-in-notifications.d.ts +4 -0
  12. package/dist/auth/new-signups-gate.d.ts +23 -0
  13. package/dist/auth/signup-funnel-metrics.d.ts +44 -0
  14. package/dist/azure-live.d.ts +28 -0
  15. package/dist/browser-action-fences.d.ts +13 -0
  16. package/dist/browser-controller-authority.d.ts +1 -61
  17. package/dist/browser-ephemeral.d.ts +5 -0
  18. package/dist/browser-lost-runtime-end.d.ts +24 -0
  19. package/dist/browser-state-authority.d.ts +1 -27
  20. package/dist/chunk-OGQDXVXY.js +18 -0
  21. package/dist/chunk-OGQDXVXY.js.map +1 -0
  22. package/dist/{chunk-AJ62T5QN.js → chunk-OT56OY4V.js} +80503 -39869
  23. package/dist/chunk-OT56OY4V.js.map +1 -0
  24. package/dist/claude-default-models.d.ts +19 -0
  25. package/dist/claude-subscription-core.d.ts +50 -0
  26. package/dist/claude-subscription-oauth.d.ts +36 -0
  27. package/dist/claude-subscription-profile.d.ts +9 -0
  28. package/dist/claude-subscription-usage.d.ts +6 -0
  29. package/dist/claude-workspace-connection.d.ts +15 -0
  30. package/dist/codemode.d.ts +40 -5
  31. package/dist/codex-realtime.d.ts +29 -3
  32. package/dist/codex-session-pointers.d.ts +19 -0
  33. package/dist/connection-ownership.d.ts +6 -3
  34. package/dist/controller-data-plane.d.ts +16 -0
  35. package/dist/credit-promotion-snapshot.d.ts +6 -0
  36. package/dist/editable-artifact-source-session.d.ts +3 -0
  37. package/dist/editable-artifact-websocket.d.ts +5 -3
  38. package/dist/fatal-process-boundary.d.ts +9 -1
  39. package/dist/github-access.d.ts +7 -1
  40. package/dist/github-browser-flow.d.ts +1 -1
  41. package/dist/http/acting-person.d.ts +36 -0
  42. package/dist/http/api-contract-compat.d.ts +19 -0
  43. package/dist/http/api-error.d.ts +50 -1
  44. package/dist/http/auth.d.ts +8 -1
  45. package/dist/http/cors.d.ts +12 -0
  46. package/dist/http/deprecation.d.ts +42 -0
  47. package/dist/http/keyed-admission.d.ts +12 -0
  48. package/dist/http/local-browser-boundary.d.ts +72 -0
  49. package/dist/http/metrics-listener.d.ts +22 -0
  50. package/dist/http/path-identifier.d.ts +17 -0
  51. package/dist/http/registered-route-label.d.ts +16 -0
  52. package/dist/http/rejection-telemetry.d.ts +34 -0
  53. package/dist/http/request-body.d.ts +27 -0
  54. package/dist/http/request-source.d.ts +41 -3
  55. package/dist/http/sse.d.ts +12 -1
  56. package/dist/http/unmatched-route.d.ts +18 -0
  57. package/dist/http/user-content.d.ts +36 -0
  58. package/dist/http/variable-sets-removed.d.ts +41 -0
  59. package/dist/http/websocket-upgrade-dispatch.d.ts +18 -0
  60. package/dist/index.js +1279 -108
  61. package/dist/index.js.map +1 -1
  62. package/dist/integration-connect-metrics.d.ts +35 -0
  63. package/dist/integration-endpoint-test.d.ts +20 -0
  64. package/dist/integrations/api-integrations.d.ts +2 -2
  65. package/dist/integrations/atlassian.d.ts +8 -3
  66. package/dist/integrations/fiken.d.ts +3 -1
  67. package/dist/integrations/github-lens-connect.d.ts +37 -66
  68. package/dist/integrations/google-drive.d.ts +2 -0
  69. package/dist/integrations/integration-commit-authority.d.ts +13 -0
  70. package/dist/integrations/marketplace-plugin.d.ts +43 -43
  71. package/dist/integrations/oauth-client.d.ts +171 -12
  72. package/dist/integrations/oauth-profiles.d.ts +42 -13
  73. package/dist/integrations/onepassword-vault-provider.d.ts +9 -0
  74. package/dist/integrations/slack-bot.d.ts +285 -7
  75. package/dist/integrations/slack-file-upload-flow.d.ts +62 -0
  76. package/dist/integrations/slack-interactions.d.ts +89 -10
  77. package/dist/integrations/slack-mrkdwn.d.ts +41 -0
  78. package/dist/integrations/slack-routing.d.ts +1 -1
  79. package/dist/integrations/slack-session-defaults.d.ts +58 -0
  80. package/dist/integrations/slack-task-file-upload.d.ts +36 -0
  81. package/dist/integrations/slack-tool-review.d.ts +5 -0
  82. package/dist/interaction-agent-access.d.ts +13 -8
  83. package/dist/interaction-agent-version.d.ts +21 -0
  84. package/dist/interaction-holder-heartbeat.d.ts +5 -0
  85. package/dist/interaction-metrics.d.ts +27 -2
  86. package/dist/interaction-route-stages.d.ts +25 -0
  87. package/dist/interaction-secrets-vault.d.ts +20 -0
  88. package/dist/interaction-secrets.d.ts +103 -0
  89. package/dist/mcp/action-catalog-types.d.ts +14 -0
  90. package/dist/mcp/action-catalog.gen.d.ts +2 -0
  91. package/dist/mcp/action-descriptions.d.ts +4 -0
  92. package/dist/mcp/action-schema-imports.gen.d.ts +1 -0
  93. package/dist/mcp/capability-account-readiness.d.ts +7 -0
  94. package/dist/mcp/child-read-evidence.d.ts +9 -0
  95. package/dist/mcp/company-profile-agent-admin.d.ts +12 -0
  96. package/dist/mcp/contract-input.d.ts +13 -0
  97. package/dist/mcp/documents.d.ts +2 -0
  98. package/dist/mcp/first-party-tool-permissions.d.ts +3 -606
  99. package/dist/mcp/notification-tools.d.ts +26 -0
  100. package/dist/mcp/orchestration-failure-diagnostic.d.ts +43 -0
  101. package/dist/mcp/scheduled-task-input.d.ts +1309 -0
  102. package/dist/mcp/scheduled-task-view.d.ts +217 -3
  103. package/dist/mcp/secret-tools.d.ts +14 -0
  104. package/dist/mcp/server.d.ts +108 -5
  105. package/dist/mcp/session-admin-access-tools.d.ts +33 -0
  106. package/dist/mcp/session-event-errors.d.ts +28 -0
  107. package/dist/mcp/session-event-view.d.ts +62 -0
  108. package/dist/mcp/session-view.d.ts +15 -0
  109. package/dist/mcp/session-wait.d.ts +18 -0
  110. package/dist/mcp/site-agent-clamp-tools.d.ts +38 -0
  111. package/dist/mcp/site-data-tools.d.ts +22 -0
  112. package/dist/mcp/site-publication-tools.d.ts +19 -0
  113. package/dist/mcp/site-sql-tools.d.ts +27 -0
  114. package/dist/mcp-oauth.d.ts +37 -4
  115. package/dist/model-calls/chat-completions.d.ts +87 -0
  116. package/dist/model-calls/pending-usage-settlements.d.ts +57 -0
  117. package/dist/model-calls/service.d.ts +36 -0
  118. package/dist/model-catalog.d.ts +9 -3
  119. package/dist/native-push-dispatch.d.ts +69 -0
  120. package/dist/observability.d.ts +3 -1
  121. package/dist/organization-mcp.d.ts +82 -0
  122. package/dist/prepared-mcp-actor.d.ts +77 -0
  123. package/dist/prepared-mcp-permissions.d.ts +8 -0
  124. package/dist/routes/analytics-consent.d.ts +26 -0
  125. package/dist/routes/api-integrations.d.ts +11 -0
  126. package/dist/routes/api-keys.d.ts +7 -7
  127. package/dist/routes/automations.d.ts +2 -0
  128. package/dist/routes/billing.d.ts +59 -0
  129. package/dist/routes/browser-sessions.d.ts +65 -2
  130. package/dist/routes/chat-completions.d.ts +11 -0
  131. package/dist/routes/claude-core-usage.d.ts +20 -0
  132. package/dist/routes/claude-subscription-accounts.d.ts +3 -0
  133. package/dist/routes/claude-subscription-oauth.d.ts +3 -0
  134. package/dist/routes/client-errors.d.ts +182 -0
  135. package/dist/routes/codex-core.d.ts +401 -0
  136. package/dist/routes/codex.d.ts +64 -2
  137. package/dist/routes/computer-sessions.d.ts +6 -1
  138. package/dist/routes/desktop-distribution.d.ts +32 -0
  139. package/dist/routes/github-browser-fonts.gen.d.ts +2 -0
  140. package/dist/routes/github-browser-pages.d.ts +27 -0
  141. package/dist/routes/inbox.d.ts +13 -0
  142. package/dist/routes/insights-response-cache.d.ts +10 -0
  143. package/dist/routes/insights-usage.d.ts +12 -0
  144. package/dist/routes/insights.d.ts +28 -0
  145. package/dist/routes/interaction-placement-message.d.ts +7 -0
  146. package/dist/routes/managed-sign-in-methods.d.ts +6 -0
  147. package/dist/routes/model-account-choice.d.ts +13 -0
  148. package/dist/routes/model-account-settings.d.ts +19 -0
  149. package/dist/routes/native-app-auth.d.ts +12 -0
  150. package/dist/routes/organization-integration-policy.d.ts +8 -0
  151. package/dist/routes/organization-integrations.d.ts +6 -0
  152. package/dist/routes/organization-mcp-connections.d.ts +3 -0
  153. package/dist/routes/organization-model-defaults.d.ts +9 -0
  154. package/dist/routes/organization-service-accounts.d.ts +3 -0
  155. package/dist/routes/personal-api-keys.d.ts +3 -0
  156. package/dist/routes/session-admin-access.d.ts +3 -0
  157. package/dist/routes/session-artifact-associations.d.ts +4 -0
  158. package/dist/routes/session-history-imports.d.ts +20 -0
  159. package/dist/routes/sessions.d.ts +38 -2
  160. package/dist/routes/site-data.d.ts +18 -0
  161. package/dist/routes/site-publishing.d.ts +5 -0
  162. package/dist/routes/site-runtime.d.ts +31 -0
  163. package/dist/routes/site-sql.d.ts +16 -0
  164. package/dist/routes/slack-bot-access.d.ts +3 -0
  165. package/dist/routes/subscription-account-pools.d.ts +21 -0
  166. package/dist/routes/subscription-core-http.d.ts +5 -0
  167. package/dist/routes/subscription-pool-access.d.ts +37 -0
  168. package/dist/routes/subscription-pool-core.d.ts +153 -0
  169. package/dist/routes/supergrok.d.ts +6 -6
  170. package/dist/routes/usage-allowances.d.ts +12 -0
  171. package/dist/routes/variable-sets-removed.d.ts +2 -0
  172. package/dist/routes/vault-providers.d.ts +34 -0
  173. package/dist/routes/vaults.d.ts +3 -0
  174. package/dist/routes/workspace-integrations.d.ts +35 -0
  175. package/dist/routes/workspace-model-providers.d.ts +4 -0
  176. package/dist/routes/workspaces.d.ts +11 -2
  177. package/dist/sandbox/agent-update.d.ts +64 -0
  178. package/dist/sandbox/auth-callout.d.ts +8 -0
  179. package/dist/sandbox/channel-a.d.ts +15 -1
  180. package/dist/sandbox/enrollment.d.ts +26 -4
  181. package/dist/sandbox/machine-audience.d.ts +29 -0
  182. package/dist/sandbox/machines.d.ts +15 -2
  183. package/dist/sandbox/metrics-ingestion.d.ts +6 -2
  184. package/dist/sandbox/screen-control.d.ts +85 -0
  185. package/dist/sandbox/viewer.d.ts +5 -1
  186. package/dist/sandbox-file-artifacts.d.ts +17 -1
  187. package/dist/scheduled-task-blockers.d.ts +39 -0
  188. package/dist/scheduled-task-deletion.d.ts +3 -4
  189. package/dist/scheduled-task-lifecycle.d.ts +14 -0
  190. package/dist/secret-answers.d.ts +40 -0
  191. package/dist/session-create-observability.d.ts +5 -0
  192. package/dist/session-event-view-36GO3IL7.js +528 -0
  193. package/dist/session-event-view-36GO3IL7.js.map +1 -0
  194. package/dist/signed-state-secret.d.ts +18 -0
  195. package/dist/site-agent-guard.d.ts +53 -0
  196. package/dist/site-data/operations.d.ts +103 -0
  197. package/dist/site-data/service.d.ts +203 -0
  198. package/dist/site-frame-guard.d.ts +32 -0
  199. package/dist/site-publishing/agent-data-tools.d.ts +84 -0
  200. package/dist/site-publishing/agent-model.d.ts +58 -0
  201. package/dist/site-publishing/agent-session.d.ts +16 -0
  202. package/dist/site-publishing/content-scanner.d.ts +31 -0
  203. package/dist/site-publishing/edge-sync.d.ts +48 -0
  204. package/dist/site-publishing/gateway-signature.d.ts +56 -0
  205. package/dist/site-publishing/limits.d.ts +63 -0
  206. package/dist/site-publishing/page-tool-authority.d.ts +30 -0
  207. package/dist/site-publishing/platform-usage.d.ts +113 -0
  208. package/dist/site-publishing/platform.d.ts +21 -0
  209. package/dist/site-publishing/readiness.d.ts +62 -0
  210. package/dist/site-publishing/runtime.d.ts +179 -0
  211. package/dist/site-publishing/service.d.ts +264 -0
  212. package/dist/site-publishing/session-events.d.ts +22 -0
  213. package/dist/site-publishing/session-views.d.ts +36 -0
  214. package/dist/site-publishing/viewer.d.ts +40 -0
  215. package/dist/site-session-origin.d.ts +31 -6
  216. package/dist/site-sql/format.d.ts +47 -0
  217. package/dist/site-sql/gateway.d.ts +50 -0
  218. package/dist/site-sql/service.d.ts +213 -0
  219. package/dist/temporal-schedule-sync.d.ts +26 -0
  220. package/dist/transcription/billing-refusal.d.ts +8 -0
  221. package/dist/transcription/normalize.d.ts +23 -0
  222. package/dist/transcription/providers/azure-mai.d.ts +12 -0
  223. package/dist/transcription/providers/azure-openai.d.ts +4 -0
  224. package/dist/transcription/providers/openai.d.ts +16 -0
  225. package/dist/transcription/providers/subscription-core.d.ts +39 -0
  226. package/dist/transcription/service.d.ts +10 -1
  227. package/dist/transcription/wav-duration.d.ts +8 -0
  228. package/dist/workspace-tool-gateway-attestations.d.ts +37 -0
  229. package/dist/workspace-tool-gateway-observability.d.ts +16 -0
  230. package/dist/workspace-tool-gateway-secrets.d.ts +27 -0
  231. package/dist/workspace-tool-gateway.d.ts +102 -6
  232. package/dist/workspace-tool-target-fence.d.ts +116 -0
  233. package/dist/workspace-tool-target.d.ts +225 -0
  234. package/dist/workspace-webhook-dispatch.d.ts +26 -0
  235. package/dist/xai-subscription-core.d.ts +60 -0
  236. package/package.json +25 -20
  237. package/src/access-grant-rls.ts +64 -14
  238. package/src/admission-trace.ts +14 -0
  239. package/src/app.ts +1684 -252
  240. package/src/artifact-catalog-cursor.ts +1 -0
  241. package/src/attached-browser-viewer.ts +26 -0
  242. package/src/auth/managed-auth-attempt-context.ts +9 -0
  243. package/src/auth/managed-auth-rate-limits.ts +252 -0
  244. package/src/auth/managed-auth-session-adapter.ts +64 -29
  245. package/src/auth/managed-auth.ts +303 -35
  246. package/src/auth/managed-email.ts +18 -1
  247. package/src/auth/managed-sign-in-notifications.ts +81 -0
  248. package/src/auth/new-signups-gate.ts +49 -0
  249. package/src/auth/organization-user-setup.ts +3 -3
  250. package/src/auth/signup-funnel-metrics.ts +164 -0
  251. package/src/azure-live.ts +103 -0
  252. package/src/browser-action-fences.ts +45 -0
  253. package/src/browser-controller-authority.ts +1 -186
  254. package/src/browser-ephemeral.ts +39 -0
  255. package/src/browser-lost-runtime-end.ts +71 -0
  256. package/src/browser-state-authority.ts +1 -236
  257. package/src/claude-default-models.ts +37 -0
  258. package/src/claude-subscription-core.ts +154 -0
  259. package/src/claude-subscription-oauth.ts +352 -0
  260. package/src/claude-subscription-profile.ts +73 -0
  261. package/src/claude-subscription-usage.ts +51 -0
  262. package/src/claude-workspace-connection.ts +82 -0
  263. package/src/codemode.ts +236 -39
  264. package/src/codex-realtime.ts +181 -53
  265. package/src/codex-session-pointers.ts +80 -0
  266. package/src/company-brain-okf.ts +1 -1
  267. package/src/connected-machine-computer-access.ts +2 -1
  268. package/src/connection-ownership.ts +19 -13
  269. package/src/controller-data-plane.ts +34 -0
  270. package/src/credit-promotion-snapshot.ts +36 -0
  271. package/src/editable-artifact-production.ts +10 -0
  272. package/src/editable-artifact-source-session.ts +123 -0
  273. package/src/editable-artifact-websocket.ts +16 -3
  274. package/src/fatal-process-boundary.ts +67 -3
  275. package/src/gateway-realtime.ts +12 -8
  276. package/src/github-access.ts +31 -5
  277. package/src/github-browser-flow.ts +1 -1
  278. package/src/http/acting-person.ts +105 -0
  279. package/src/http/api-contract-compat.ts +49 -0
  280. package/src/http/api-error.ts +210 -2
  281. package/src/http/auth.ts +68 -4
  282. package/src/http/cors.ts +37 -5
  283. package/src/http/deprecation.ts +118 -0
  284. package/src/http/keyed-admission.ts +29 -0
  285. package/src/http/local-browser-boundary.ts +343 -0
  286. package/src/http/metrics-listener.ts +57 -0
  287. package/src/http/path-identifier.ts +54 -0
  288. package/src/http/registered-route-label.ts +34 -0
  289. package/src/http/rejection-telemetry.ts +120 -0
  290. package/src/http/request-body.ts +127 -0
  291. package/src/http/request-source.ts +154 -13
  292. package/src/http/sse.ts +88 -28
  293. package/src/http/unmatched-route.ts +60 -0
  294. package/src/http/user-content.ts +158 -0
  295. package/src/http/variable-sets-removed.ts +122 -0
  296. package/src/http/websocket-upgrade-dispatch.ts +29 -0
  297. package/src/index.ts +107 -57
  298. package/src/integration-connect-metrics.ts +228 -0
  299. package/src/integration-endpoint-test.ts +291 -0
  300. package/src/integrations/api-integrations.ts +81 -7
  301. package/src/integrations/atlassian.ts +202 -83
  302. package/src/integrations/fiken.ts +66 -38
  303. package/src/integrations/github-app-connect.ts +64 -18
  304. package/src/integrations/github-lens-connect.ts +8 -29
  305. package/src/integrations/google-drive.ts +448 -152
  306. package/src/integrations/integration-commit-authority.ts +69 -0
  307. package/src/integrations/marketplace-plugin.ts +1 -1
  308. package/src/integrations/oauth-client.ts +733 -193
  309. package/src/integrations/oauth-profiles.ts +116 -45
  310. package/src/integrations/onepassword-vault-provider.ts +16 -0
  311. package/src/integrations/personal-github-repositories.ts +1 -1
  312. package/src/integrations/personal-github.ts +61 -35
  313. package/src/integrations/provider-oauth.ts +67 -85
  314. package/src/integrations/slack-app-home.ts +5 -5
  315. package/src/integrations/slack-bot.ts +893 -201
  316. package/src/integrations/slack-file-upload-flow.ts +147 -0
  317. package/src/integrations/slack-install.ts +7 -7
  318. package/src/integrations/slack-interactions.ts +1589 -299
  319. package/src/integrations/slack-mrkdwn.ts +193 -0
  320. package/src/integrations/slack-routing.ts +2 -2
  321. package/src/integrations/slack-session-defaults.ts +224 -0
  322. package/src/integrations/slack-task-file-upload.ts +323 -0
  323. package/src/integrations/slack-tool-review.ts +65 -0
  324. package/src/integrations/social-oauth.ts +90 -58
  325. package/src/interaction-agent-access.ts +40 -20
  326. package/src/interaction-agent-version.ts +85 -0
  327. package/src/interaction-holder-heartbeat.ts +24 -8
  328. package/src/interaction-metrics.ts +164 -2
  329. package/src/interaction-route-stages.ts +94 -0
  330. package/src/interaction-secrets-vault.ts +213 -0
  331. package/src/interaction-secrets.ts +426 -0
  332. package/src/mcp/action-catalog-types.ts +14 -0
  333. package/src/mcp/action-catalog.gen.ts +8014 -0
  334. package/src/mcp/action-descriptions.ts +299 -0
  335. package/src/mcp/action-schema-imports.gen.ts +304 -0
  336. package/src/mcp/capability-account-readiness.ts +17 -0
  337. package/src/mcp/child-read-evidence.ts +19 -0
  338. package/src/mcp/company-profile-agent-admin.ts +13 -0
  339. package/src/mcp/contract-input.ts +165 -0
  340. package/src/mcp/documents.ts +9 -2
  341. package/src/mcp/editable-artifacts.ts +29 -11
  342. package/src/mcp/files.ts +5 -1
  343. package/src/mcp/first-party-tool-permissions.ts +7 -285
  344. package/src/mcp/knowledge-entries.ts +108 -34
  345. package/src/mcp/notification-tools.ts +480 -0
  346. package/src/mcp/orchestration-failure-diagnostic.ts +43 -0
  347. package/src/mcp/scheduled-task-input.ts +89 -0
  348. package/src/mcp/scheduled-task-view.ts +63 -3
  349. package/src/mcp/secret-tools.ts +185 -0
  350. package/src/mcp/server.ts +2213 -1116
  351. package/src/mcp/session-admin-access-tools.ts +163 -0
  352. package/src/mcp/session-event-errors.ts +123 -0
  353. package/src/mcp/session-event-view.ts +395 -13
  354. package/src/mcp/session-view.ts +3 -0
  355. package/src/mcp/session-wait.ts +67 -7
  356. package/src/mcp/site-agent-clamp-tools.ts +140 -0
  357. package/src/mcp/site-data-tools.ts +339 -0
  358. package/src/mcp/site-publication-tools.ts +201 -0
  359. package/src/mcp/site-sql-tools.ts +427 -0
  360. package/src/mcp-oauth.ts +635 -45
  361. package/src/model-calls/chat-completions.ts +352 -0
  362. package/src/model-calls/pending-usage-settlements.ts +125 -0
  363. package/src/model-calls/service.ts +694 -0
  364. package/src/model-catalog.ts +68 -17
  365. package/src/native-push-dispatch.ts +457 -0
  366. package/src/observability.ts +15 -1
  367. package/src/organization-mcp.ts +485 -0
  368. package/src/prepared-mcp-actor.ts +154 -0
  369. package/src/prepared-mcp-permissions.ts +38 -0
  370. package/src/routes/analytics-consent.ts +123 -0
  371. package/src/routes/api-integrations.ts +268 -9
  372. package/src/routes/api-keys.ts +164 -25
  373. package/src/routes/artifact-catalog.ts +111 -0
  374. package/src/routes/automations.ts +163 -90
  375. package/src/routes/billing.ts +535 -59
  376. package/src/routes/browser-sessions.ts +966 -342
  377. package/src/routes/canonical-human-identities.ts +61 -0
  378. package/src/routes/capabilities.ts +112 -5
  379. package/src/routes/channels.ts +4 -3
  380. package/src/routes/chat-completions.ts +235 -0
  381. package/src/routes/claude-core-usage.ts +147 -0
  382. package/src/routes/claude-subscription-accounts.ts +233 -0
  383. package/src/routes/claude-subscription-oauth.ts +175 -0
  384. package/src/routes/client-errors.ts +394 -0
  385. package/src/routes/codex-core.ts +687 -0
  386. package/src/routes/codex.ts +1277 -1119
  387. package/src/routes/company-brain.ts +4 -0
  388. package/src/routes/computer-sessions.ts +319 -85
  389. package/src/routes/connect.ts +277 -175
  390. package/src/routes/connections.ts +690 -363
  391. package/src/routes/desktop-distribution.ts +217 -0
  392. package/src/routes/documents.ts +13 -7
  393. package/src/routes/editable-artifacts.ts +74 -4
  394. package/src/routes/enrollments.ts +110 -16
  395. package/src/routes/external-identity-links.ts +13 -12
  396. package/src/routes/files.ts +41 -16
  397. package/src/routes/github-browser-fonts.gen.ts +12 -0
  398. package/src/routes/github-browser-pages.ts +258 -0
  399. package/src/routes/github.ts +200 -75
  400. package/src/routes/inbox.ts +353 -0
  401. package/src/routes/insights-response-cache.ts +83 -0
  402. package/src/routes/insights-usage.ts +345 -0
  403. package/src/routes/insights.ts +103 -8
  404. package/src/routes/install.ts +51 -10
  405. package/src/routes/integration-facets.ts +70 -28
  406. package/src/routes/interaction-placement-message.ts +12 -0
  407. package/src/routes/knowledge.ts +136 -27
  408. package/src/routes/machines.ts +189 -135
  409. package/src/routes/managed-auth-session-sets.ts +43 -10
  410. package/src/routes/managed-onboarding.ts +39 -19
  411. package/src/routes/managed-sign-in-methods.ts +433 -0
  412. package/src/routes/memory-slack-publications.ts +3 -2
  413. package/src/routes/model-account-choice.ts +194 -0
  414. package/src/routes/model-account-settings.ts +235 -0
  415. package/src/routes/model-connection-access.ts +210 -48
  416. package/src/routes/native-app-auth.ts +296 -0
  417. package/src/routes/organization-integration-policy.ts +116 -0
  418. package/src/routes/organization-integrations.ts +326 -0
  419. package/src/routes/organization-mcp-connections.ts +183 -0
  420. package/src/routes/organization-memberships.ts +205 -19
  421. package/src/routes/organization-model-defaults.ts +110 -0
  422. package/src/routes/organization-model-providers.ts +74 -3
  423. package/src/routes/organization-service-accounts.ts +128 -0
  424. package/src/routes/organization-sessions.ts +21 -5
  425. package/src/routes/personal-api-keys.ts +184 -0
  426. package/src/routes/personal-github-git-broker.ts +2 -2
  427. package/src/routes/personal-github.ts +9 -4
  428. package/src/routes/plugins.ts +46 -7
  429. package/src/routes/pr-review-github.ts +105 -118
  430. package/src/routes/pr-review.ts +88 -82
  431. package/src/routes/preference-registry.ts +18 -0
  432. package/src/routes/rigs.ts +48 -13
  433. package/src/routes/scheduled-tasks.ts +347 -27
  434. package/src/routes/session-admin-access.ts +271 -0
  435. package/src/routes/session-artifact-associations.ts +164 -0
  436. package/src/routes/session-history-imports.ts +305 -0
  437. package/src/routes/sessions.ts +1682 -363
  438. package/src/routes/site-data.ts +340 -0
  439. package/src/routes/site-publishing.ts +584 -0
  440. package/src/routes/site-runtime.ts +1944 -0
  441. package/src/routes/site-sql.ts +263 -0
  442. package/src/routes/skill-content.ts +72 -7
  443. package/src/routes/skills.ts +5 -4
  444. package/src/routes/slack-bot-access.ts +108 -0
  445. package/src/routes/social.ts +27 -15
  446. package/src/routes/subscription-account-pools.ts +209 -0
  447. package/src/routes/subscription-core-http.ts +18 -0
  448. package/src/routes/subscription-pool-access.ts +180 -0
  449. package/src/routes/subscription-pool-core.ts +552 -0
  450. package/src/routes/supergrok.ts +174 -655
  451. package/src/routes/transcription-recordings.ts +71 -4
  452. package/src/routes/transcriptions.ts +26 -2
  453. package/src/routes/usage-allowances.ts +381 -0
  454. package/src/routes/variable-sets-removed.ts +19 -0
  455. package/src/routes/vault-providers.ts +782 -0
  456. package/src/routes/vaults.ts +421 -0
  457. package/src/routes/video-generation.ts +30 -12
  458. package/src/routes/workspace-artifacts.ts +165 -53
  459. package/src/routes/workspace-integrations.ts +576 -0
  460. package/src/routes/workspace-model-providers.ts +148 -0
  461. package/src/routes/workspace-state.ts +4 -0
  462. package/src/routes/workspaces.ts +625 -117
  463. package/src/sandbox/agent-update.ts +315 -0
  464. package/src/sandbox/auth-callout.ts +104 -21
  465. package/src/sandbox/channel-a.ts +165 -55
  466. package/src/sandbox/enrollment.ts +131 -22
  467. package/src/sandbox/machine-audience.ts +192 -0
  468. package/src/sandbox/machines.ts +75 -31
  469. package/src/sandbox/metrics-ingestion.ts +133 -2
  470. package/src/sandbox/rematerialize.ts +51 -21
  471. package/src/sandbox/screen-control.ts +289 -0
  472. package/src/sandbox/viewer.ts +33 -58
  473. package/src/sandbox-file-artifacts.ts +53 -27
  474. package/src/scheduled-task-blockers.ts +293 -0
  475. package/src/scheduled-task-deletion.ts +13 -3
  476. package/src/scheduled-task-lifecycle.ts +84 -0
  477. package/src/secret-answers.ts +119 -0
  478. package/src/session-create-observability.ts +46 -0
  479. package/src/session-realtime-context.ts +26 -4
  480. package/src/signed-state-secret.ts +58 -0
  481. package/src/site-agent-guard.ts +261 -0
  482. package/src/site-data/operations.ts +777 -0
  483. package/src/site-data/service.ts +1043 -0
  484. package/src/site-frame-guard.ts +107 -0
  485. package/src/site-publishing/agent-data-tools.ts +250 -0
  486. package/src/site-publishing/agent-model.ts +127 -0
  487. package/src/site-publishing/agent-session.ts +148 -0
  488. package/src/site-publishing/content-scanner.ts +93 -0
  489. package/src/site-publishing/edge-sync.ts +148 -0
  490. package/src/site-publishing/gateway-signature.ts +198 -0
  491. package/src/site-publishing/limits.ts +315 -0
  492. package/src/site-publishing/page-tool-authority.ts +111 -0
  493. package/src/site-publishing/platform-usage.ts +479 -0
  494. package/src/site-publishing/platform.ts +98 -0
  495. package/src/site-publishing/readiness.ts +330 -0
  496. package/src/site-publishing/runtime.ts +831 -0
  497. package/src/site-publishing/service.ts +1282 -0
  498. package/src/site-publishing/session-events.ts +262 -0
  499. package/src/site-publishing/session-views.ts +262 -0
  500. package/src/site-publishing/viewer.ts +75 -0
  501. package/src/site-session-origin.ts +91 -6
  502. package/src/site-sql/format.ts +134 -0
  503. package/src/site-sql/gateway.ts +168 -0
  504. package/src/site-sql/service.ts +1636 -0
  505. package/src/site-uploads.ts +27 -5
  506. package/src/temporal-schedule-sync.ts +74 -0
  507. package/src/transcription/billing-refusal.ts +14 -0
  508. package/src/transcription/normalize.ts +77 -0
  509. package/src/transcription/providers/azure-mai.ts +98 -0
  510. package/src/transcription/providers/azure-openai.ts +16 -7
  511. package/src/transcription/providers/codex-subscription.ts +190 -67
  512. package/src/transcription/providers/openai.ts +79 -5
  513. package/src/transcription/providers/subscription-core.ts +125 -0
  514. package/src/transcription/providers/xai-subscription.ts +81 -83
  515. package/src/transcription/segmenter.ts +7 -1
  516. package/src/transcription/service.ts +239 -10
  517. package/src/transcription/wav-duration.ts +39 -0
  518. package/src/workspace-deletion.ts +25 -1
  519. package/src/workspace-tool-gateway-attestations.ts +133 -0
  520. package/src/workspace-tool-gateway-observability.ts +64 -0
  521. package/src/workspace-tool-gateway-secrets.ts +104 -0
  522. package/src/workspace-tool-gateway.ts +921 -103
  523. package/src/workspace-tool-target-fence.ts +380 -0
  524. package/src/workspace-tool-target.ts +554 -0
  525. package/src/workspace-webhook-dispatch.ts +225 -0
  526. package/src/xai-realtime.ts +85 -81
  527. package/src/xai-subscription-core.ts +172 -0
  528. package/dist/browser-auth-broker.d.ts +0 -20
  529. package/dist/chunk-AJ62T5QN.js.map +0 -1
  530. package/dist/connection-authority-owner.d.ts +0 -59
  531. package/dist/routes/connection-authorities.d.ts +0 -3
  532. package/dist/routes/environments.d.ts +0 -5
  533. package/dist/routes/host-mcp-bindings.d.ts +0 -5
  534. package/dist/routes/host-mcp-resolvers.d.ts +0 -3
  535. package/dist/routes/packs.d.ts +0 -3
  536. package/dist/session-event-view-MU3HMNV3.js +0 -264
  537. package/dist/session-event-view-MU3HMNV3.js.map +0 -1
  538. package/dist/xai-subscription-auth.d.ts +0 -23
  539. package/src/browser-auth-broker.ts +0 -155
  540. package/src/connection-authority-owner.ts +0 -61
  541. package/src/routes/connection-authorities.ts +0 -139
  542. package/src/routes/environments.ts +0 -388
  543. package/src/routes/host-mcp-bindings.ts +0 -122
  544. package/src/routes/host-mcp-resolvers.ts +0 -41
  545. package/src/routes/packs.ts +0 -784
  546. package/src/xai-subscription-auth.ts +0 -139
@@ -1,8 +1,15 @@
1
+ import { signupCreditModelIds } from "@opengeni/config";
1
2
  import {
2
3
  lookupExternalIdentityForRequest,
3
4
  cancelExternalWorkspaceMemberGrantForRequest,
5
+ updateExternalWorkspaceMemberForRequest,
6
+ getOrganizationPrivacySettings,
7
+ OrganizationPrivacyLockedError,
8
+ privacyDeploymentLimits,
9
+ updateOrganizationPrivacySettings,
4
10
  } from "@opengeni/core";
5
11
  import {
12
+ type Permission,
6
13
  AcceptOrganizationInvitationRequest,
7
14
  CreateAdditionalOrganizationRequest,
8
15
  CreateAdditionalOrganizationResponse,
@@ -18,6 +25,7 @@ import {
18
25
  OrganizationInvitation,
19
26
  OrganizationUserSetupDelivery,
20
27
  OrganizationMember,
28
+ OrganizationPrivacySettings,
21
29
  OrganizationPrivateSessionSettings,
22
30
  OrganizationRetentionPolicy,
23
31
  OrganizationSummary,
@@ -30,6 +38,7 @@ import {
30
38
  RevokeOrganizationWorkspaceMemberResponse,
31
39
  UpdateOrganizationMemberRequest,
32
40
  UpdateOrganizationNameRequest,
41
+ UpdateOrganizationPrivacySettingsRequest,
33
42
  UpdateOrganizationPrivateSessionSettingsRequest,
34
43
  UpdateOrganizationRetentionPolicyRequest,
35
44
  UpdateOrganizationWorkspaceRequest,
@@ -38,6 +47,10 @@ import {
38
47
  } from "@opengeni/contracts";
39
48
  import {
40
49
  getManagedSession,
50
+ accountScopedApiKeyWorkspaceAuthority,
51
+ organizationWorkspaceInScope,
52
+ hasPermission,
53
+ requireAccessContext,
41
54
  organizationMembershipHttpStatus,
42
55
  requireCanonicalLocalAccountAdministrator,
43
56
  updateExternalIdentityMembershipForRequest,
@@ -57,6 +70,7 @@ import {
57
70
  getOrganizationPrivateSessionSettings,
58
71
  getSelfOrganizationInvitation,
59
72
  getOrganizationRetentionPolicy,
73
+ requireWorkspace,
60
74
  listOrganizationAdministrationMembers,
61
75
  listOrganizationInvitations,
62
76
  listSelfOrganizationInvitations,
@@ -77,17 +91,82 @@ import type { Context, Hono } from "hono";
77
91
  import { HTTPException } from "hono/http-exception";
78
92
  import { z } from "zod";
79
93
  import { deleteWorkspaceForRequest } from "../workspace-deletion";
94
+ import { agentActingAsPerson, organizationSettingsPermission } from "../http/acting-person";
80
95
 
81
96
  import {
82
97
  assertOrganizationUserSetupDeliveryConfigured,
83
98
  resolveOrganizationUserSetupDeliveryEmail,
84
99
  } from "../auth/organization-user-setup";
100
+ import { readRequestJson } from "../http/request-body";
85
101
 
86
102
  const OrganizationId = z.string().uuid();
87
103
  const WorkspaceId = z.string().uuid();
88
104
  const MembershipId = z.string().uuid();
89
105
  const InvitationId = z.string().uuid();
90
106
 
107
+ // Organization keys administer settings, not another person's session contents.
108
+ // The database independently fences current key authority, including on replay.
109
+ async function requirePrivateSessionAdministrator(
110
+ context: Context,
111
+ deps: ApiRouteDeps,
112
+ organizationId: string,
113
+ ): Promise<{ subjectId: string }> {
114
+ const agent = agentActingAsPerson(
115
+ context,
116
+ organizationId,
117
+ organizationSettingsPermission(context),
118
+ );
119
+ if (agent) return agent;
120
+ if (!context.req.header("authorization")) return requireManagedHuman(context, deps);
121
+ const access = await requireAccessContext(context, deps);
122
+ const key = accountScopedApiKeyWorkspaceAuthority(access);
123
+ if (!key || key.accountId !== organizationId || !key.permissions.includes("workspace:admin")) {
124
+ throw new HTTPException(403, {
125
+ message: "organization administration required",
126
+ });
127
+ }
128
+ if (
129
+ key.permissionMode === "explicit" &&
130
+ !access.accountGrants.some(
131
+ (grant) => grant.accountId === organizationId && grant.permissions.includes("account:admin"),
132
+ )
133
+ ) {
134
+ throw new HTTPException(403, { message: "organization administration requires account:admin" });
135
+ }
136
+ return { subjectId: access.subjectId };
137
+ }
138
+
139
+ async function requireOrganizationKeyWorkspaceDeletion(
140
+ context: Context,
141
+ deps: ApiRouteDeps,
142
+ organizationId: string,
143
+ workspaceId: string,
144
+ ): Promise<void> {
145
+ const access = await requireAccessContext(context, deps);
146
+ const key = accountScopedApiKeyWorkspaceAuthority(access);
147
+ if (
148
+ !key ||
149
+ key.accountId !== organizationId ||
150
+ !hasPermission(key.permissions, "workspace:admin")
151
+ ) {
152
+ throw new HTTPException(403, {
153
+ message:
154
+ "deleting an organization workspace requires an organization owner session or an organization API key with workspace:admin",
155
+ });
156
+ }
157
+ const workspace = await requireWorkspace(deps.db, workspaceId).catch(() => null);
158
+ if (!workspace || workspace.accountId !== organizationId) {
159
+ throw new HTTPException(404, { message: "workspace not found" });
160
+ }
161
+ if (workspace.kind !== "shared") {
162
+ throw new HTTPException(403, {
163
+ message: "organization API keys cannot delete a Personal workspace",
164
+ });
165
+ }
166
+ if (!organizationWorkspaceInScope(key.workspaceScope, workspaceId))
167
+ throw new HTTPException(403, { message: "workspace is outside organization key scope" });
168
+ }
169
+
91
170
  async function requireManagedHuman(context: Context, deps: ApiRouteDeps) {
92
171
  if (
93
172
  deps.settings.productAccessMode !== "managed" ||
@@ -108,11 +187,32 @@ async function requireManagedHuman(context: Context, deps: ApiRouteDeps) {
108
187
  return { session, subjectId: `user:${session.user.id}` };
109
188
  }
110
189
 
190
+ /**
191
+ * A person acting in this organization: in their browser, or through an agent
192
+ * acting as them whose access setting includes `permission`. The database
193
+ * still checks the person's own role on every call.
194
+ */
195
+ async function requireOrganizationPerson(
196
+ context: Context,
197
+ deps: ApiRouteDeps,
198
+ permission: Permission,
199
+ ): Promise<{ subjectId: string }> {
200
+ const agent = agentActingAsPerson(context, context.req.param("organizationId") ?? "", permission);
201
+ if (agent) return agent;
202
+ return await requireManagedHuman(context, deps);
203
+ }
204
+
111
205
  async function requireOrganizationAdministrator(
112
206
  context: Context,
113
207
  deps: ApiRouteDeps,
114
208
  organizationId: string,
115
209
  ): Promise<{ subjectId: string }> {
210
+ const agent = agentActingAsPerson(
211
+ context,
212
+ organizationId,
213
+ organizationSettingsPermission(context),
214
+ );
215
+ if (agent) return agent;
116
216
  if (deps.settings.productAccessMode === "managed") {
117
217
  return await requireManagedHuman(context, deps);
118
218
  }
@@ -217,6 +317,10 @@ export function registerOrganizationMembershipRoutes(app: Hono, deps: ApiRouteDe
217
317
  subjectId,
218
318
  subjectLabel: session.user.email || session.user.name,
219
319
  ...payload,
320
+ trialCreditModelIds: signupCreditModelIds(deps.settings),
321
+ trialCreditsEnabled:
322
+ deps.settings.productAccessMode === "managed" &&
323
+ deps.settings.verifiedSignupTrialCreditsEnabled,
220
324
  }),
221
325
  ),
222
326
  201,
@@ -406,6 +510,18 @@ export function registerOrganizationMembershipRoutes(app: Hono, deps: ApiRouteDe
406
510
  context.req.param("organizationId"),
407
511
  "organization id",
408
512
  );
513
+ if (context.req.header("authorization")) {
514
+ // An integrating backend deletes the organization workspaces it
515
+ // provisions (tenant offboarding, test cleanup) with its organization
516
+ // key. This is exactly the authority `DELETE /v1/workspaces/:id` already
517
+ // grants that key - an organization workspace (never a Personal one) in
518
+ // the key's own organization, with `workspace:admin` - under the same
519
+ // quiescence rules. It confers no organization-administrator identity.
520
+ const workspaceId = parseId(WorkspaceId, context.req.param("workspaceId"), "workspace id");
521
+ await requireOrganizationKeyWorkspaceDeletion(context, deps, organizationId, workspaceId);
522
+ await deleteWorkspaceForRequest(deps, { accountId: organizationId, workspaceId });
523
+ return context.body(null, 204);
524
+ }
409
525
  const { subjectId } = await requireOrganizationAdministrator(context, deps, organizationId);
410
526
  const workspaceId = parseId(WorkspaceId, context.req.param("workspaceId"), "workspace id");
411
527
  await deleteWorkspaceForRequest(deps, {
@@ -447,7 +563,7 @@ export function registerOrganizationMembershipRoutes(app: Hono, deps: ApiRouteDe
447
563
  app.put(
448
564
  "/v1/organizations/:organizationId/workspaces/:workspaceId/members/:membershipId",
449
565
  async (context) => {
450
- const { subjectId } = await requireManagedHuman(context, deps);
566
+ const { subjectId } = await requireOrganizationPerson(context, deps, "members:manage");
451
567
  const organizationId = parseId(
452
568
  OrganizationId,
453
569
  context.req.param("organizationId"),
@@ -478,6 +594,23 @@ export function registerOrganizationMembershipRoutes(app: Hono, deps: ApiRouteDe
478
594
  },
479
595
  );
480
596
 
597
+ // Organization service key: replace an existing external member's
598
+ // permissions in one shared workspace (keyed, idempotent, non-destructive).
599
+ app.patch(
600
+ "/v1/organizations/:organizationId/workspaces/:workspaceId/external-members/:membershipId",
601
+ async (context) =>
602
+ context.json(
603
+ await updateExternalWorkspaceMemberForRequest(
604
+ context,
605
+ deps,
606
+ parseId(OrganizationId, context.req.param("organizationId"), "organization id"),
607
+ parseId(WorkspaceId, context.req.param("workspaceId"), "workspace id"),
608
+ parseId(MembershipId, context.req.param("membershipId"), "membership id"),
609
+ await readRequestJson(context),
610
+ ),
611
+ ),
612
+ );
613
+
481
614
  app.post(
482
615
  "/v1/organizations/:organizationId/workspaces/:workspaceId/members/:membershipId/revoke",
483
616
  async (context) => {
@@ -494,7 +627,7 @@ export function registerOrganizationMembershipRoutes(app: Hono, deps: ApiRouteDe
494
627
  ),
495
628
  );
496
629
  }
497
- const { subjectId } = await requireManagedHuman(context, deps);
630
+ const { subjectId } = await requireOrganizationPerson(context, deps, "members:manage");
498
631
  const organizationId = parseId(
499
632
  OrganizationId,
500
633
  context.req.param("organizationId"),
@@ -527,20 +660,23 @@ export function registerOrganizationMembershipRoutes(app: Hono, deps: ApiRouteDe
527
660
  );
528
661
 
529
662
  app.get("/v1/organizations/:organizationId/private-session-settings", async (context) => {
530
- const { subjectId } = await requireManagedHuman(context, deps);
531
663
  const organizationId = parseId(
532
664
  OrganizationId,
533
665
  context.req.param("organizationId"),
534
666
  "organization id",
535
667
  );
668
+ const { subjectId } = await requirePrivateSessionAdministrator(context, deps, organizationId);
536
669
  try {
670
+ const value = await getOrganizationPrivateSessionSettings(deps.db, {
671
+ organizationId,
672
+ actorSubjectId: subjectId,
673
+ });
674
+ // A deployment that turns Only me off makes it unavailable everywhere.
537
675
  return context.json(
538
- OrganizationPrivateSessionSettings.parse(
539
- await getOrganizationPrivateSessionSettings(deps.db, {
540
- organizationId,
541
- actorSubjectId: subjectId,
542
- }),
543
- ),
676
+ OrganizationPrivateSessionSettings.parse({
677
+ ...value,
678
+ available: value.available && privacyDeploymentLimits(deps.settings).onlyMeAllowed,
679
+ }),
544
680
  );
545
681
  } catch (error) {
546
682
  rethrowMembershipError(error);
@@ -548,13 +684,16 @@ export function registerOrganizationMembershipRoutes(app: Hono, deps: ApiRouteDe
548
684
  });
549
685
 
550
686
  app.patch("/v1/organizations/:organizationId/private-session-settings", async (context) => {
551
- const { subjectId } = await requireManagedHuman(context, deps);
552
687
  const organizationId = parseId(
553
688
  OrganizationId,
554
689
  context.req.param("organizationId"),
555
690
  "organization id",
556
691
  );
692
+ const { subjectId } = await requirePrivateSessionAdministrator(context, deps, organizationId);
557
693
  const payload = await parseBody(context, UpdateOrganizationPrivateSessionSettingsRequest);
694
+ if (payload.enabled && !privacyDeploymentLimits(deps.settings).onlyMeAllowed) {
695
+ throw new HTTPException(409, { message: "Only me is turned off for this app." });
696
+ }
558
697
  try {
559
698
  return context.json(
560
699
  OrganizationPrivateSessionSettings.parse(
@@ -566,17 +705,64 @@ export function registerOrganizationMembershipRoutes(app: Hono, deps: ApiRouteDe
566
705
  ),
567
706
  );
568
707
  } catch (error) {
569
- if (nestedPostgresSqlState(error) === "55000") {
570
- throw new HTTPException(409, {
571
- message: "private-session readiness is not activated for this organization",
572
- });
708
+ rethrowMembershipError(error);
709
+ }
710
+ });
711
+
712
+ // The organization's privacy choices: the default audience for new chats and
713
+ // schedules, and whether admins see that other people's Only me schedules
714
+ // exist. `limits` reports what this deployment fixes.
715
+ app.get("/v1/organizations/:organizationId/privacy-settings", async (context) => {
716
+ const organizationId = parseId(
717
+ OrganizationId,
718
+ context.req.param("organizationId"),
719
+ "organization id",
720
+ );
721
+ const { subjectId } = await requirePrivateSessionAdministrator(context, deps, organizationId);
722
+ try {
723
+ // The same owner/admin check the private session settings read makes.
724
+ await getOrganizationPrivateSessionSettings(deps.db, {
725
+ organizationId,
726
+ actorSubjectId: subjectId,
727
+ });
728
+ return context.json(
729
+ OrganizationPrivacySettings.parse(
730
+ await getOrganizationPrivacySettings(deps, organizationId),
731
+ ),
732
+ );
733
+ } catch (error) {
734
+ rethrowMembershipError(error);
735
+ }
736
+ });
737
+
738
+ app.patch("/v1/organizations/:organizationId/privacy-settings", async (context) => {
739
+ const organizationId = parseId(
740
+ OrganizationId,
741
+ context.req.param("organizationId"),
742
+ "organization id",
743
+ );
744
+ const { subjectId } = await requirePrivateSessionAdministrator(context, deps, organizationId);
745
+ const request = await parseBody(context, UpdateOrganizationPrivacySettingsRequest);
746
+ try {
747
+ return context.json(
748
+ OrganizationPrivacySettings.parse(
749
+ await updateOrganizationPrivacySettings(deps, {
750
+ organizationId,
751
+ actorSubjectId: subjectId,
752
+ request,
753
+ }),
754
+ ),
755
+ );
756
+ } catch (error) {
757
+ if (error instanceof OrganizationPrivacyLockedError) {
758
+ throw new HTTPException(409, { message: error.message });
573
759
  }
574
760
  rethrowMembershipError(error);
575
761
  }
576
762
  });
577
763
 
578
764
  app.post("/v1/organizations/:organizationId/invitations", async (context) => {
579
- const { subjectId } = await requireManagedHuman(context, deps);
765
+ const { subjectId } = await requireOrganizationPerson(context, deps, "members:manage");
580
766
  const organizationId = parseId(
581
767
  OrganizationId,
582
768
  context.req.param("organizationId"),
@@ -630,7 +816,7 @@ export function registerOrganizationMembershipRoutes(app: Hono, deps: ApiRouteDe
630
816
  });
631
817
 
632
818
  app.get("/v1/organizations/:organizationId/invitations", async (context) => {
633
- const { subjectId } = await requireManagedHuman(context, deps);
819
+ const { subjectId } = await requireOrganizationPerson(context, deps, "account:read");
634
820
  const organizationId = parseId(
635
821
  OrganizationId,
636
822
  context.req.param("organizationId"),
@@ -661,7 +847,7 @@ export function registerOrganizationMembershipRoutes(app: Hono, deps: ApiRouteDe
661
847
  app.post(
662
848
  "/v1/organizations/:organizationId/invitations/:invitationId/delivery/retry",
663
849
  async (context) => {
664
- const { subjectId } = await requireManagedHuman(context, deps);
850
+ const { subjectId } = await requireOrganizationPerson(context, deps, "members:manage");
665
851
  const organizationId = parseId(
666
852
  OrganizationId,
667
853
  context.req.param("organizationId"),
@@ -732,7 +918,7 @@ export function registerOrganizationMembershipRoutes(app: Hono, deps: ApiRouteDe
732
918
  app.post(
733
919
  "/v1/organizations/:organizationId/invitations/:invitationId/revoke",
734
920
  async (context) => {
735
- const { subjectId } = await requireManagedHuman(context, deps);
921
+ const { subjectId } = await requireOrganizationPerson(context, deps, "members:manage");
736
922
  const organizationId = parseId(
737
923
  OrganizationId,
738
924
  context.req.param("organizationId"),
@@ -784,7 +970,7 @@ export function registerOrganizationMembershipRoutes(app: Hono, deps: ApiRouteDe
784
970
  });
785
971
 
786
972
  app.patch("/v1/organizations/:organizationId/members/:membershipId", async (context) => {
787
- const { subjectId } = await requireManagedHuman(context, deps);
973
+ const { subjectId } = await requireOrganizationPerson(context, deps, "members:manage");
788
974
  const organizationId = parseId(
789
975
  OrganizationId,
790
976
  context.req.param("organizationId"),
@@ -0,0 +1,110 @@
1
+ import { canonicalizeConfiguredModelId } from "@opengeni/config";
2
+ import {
3
+ OrganizationModelDefaults,
4
+ UpdateOrganizationModelDefaultsRequest,
5
+ } from "@opengeni/contracts";
6
+ import type { ApiRouteDeps } from "@opengeni/core";
7
+ import {
8
+ getOrganizationModelDefaultsForAdministrator,
9
+ nestedPostgresSqlState,
10
+ updateOrganizationModelDefaults,
11
+ } from "@opengeni/db";
12
+ import type { Hono } from "hono";
13
+ import { HTTPException } from "hono/http-exception";
14
+ import { z } from "zod";
15
+
16
+ import { requireOrganizationCodexHuman, requireSameOriginBrowserMutation } from "./codex";
17
+
18
+ const OrganizationId = z.string().uuid();
19
+
20
+ function parseOrganizationId(value: string | undefined): string {
21
+ const parsed = OrganizationId.safeParse(value);
22
+ if (!parsed.success) throw new HTTPException(404, { message: "organization not found" });
23
+ return parsed.data;
24
+ }
25
+
26
+ function refused(error: unknown): never {
27
+ if (nestedPostgresSqlState(error) === "42501") {
28
+ throw new HTTPException(403, {
29
+ message: "Only organization owners and admins can change model defaults",
30
+ });
31
+ }
32
+ if (error instanceof RangeError) throw new HTTPException(422, { message: error.message });
33
+ throw error;
34
+ }
35
+
36
+ /**
37
+ * Organization model defaults: what every workspace follows until it saves
38
+ * its own default model, allowed models or compaction trigger. Owners and
39
+ * admins read and change them; workspaces read them through their own model
40
+ * routes, which report where each value comes from.
41
+ */
42
+ export function registerOrganizationModelDefaultsRoutes(app: Hono, deps: ApiRouteDeps): void {
43
+ const path = "/v1/organizations/:organizationId/model-defaults";
44
+ app.get(path, async (c) => {
45
+ c.header("cache-control", "private, no-store");
46
+ const organizationId = parseOrganizationId(c.req.param("organizationId"));
47
+ const human = await requireOrganizationCodexHuman(c, deps, organizationId);
48
+ try {
49
+ return c.json(
50
+ OrganizationModelDefaults.parse(
51
+ await getOrganizationModelDefaultsForAdministrator(deps.db, {
52
+ organizationId,
53
+ actorSubjectId: human.subjectId,
54
+ }),
55
+ ),
56
+ );
57
+ } catch (error) {
58
+ refused(error);
59
+ }
60
+ });
61
+
62
+ app.patch(path, async (c) => {
63
+ requireSameOriginBrowserMutation(c, deps);
64
+ const organizationId = parseOrganizationId(c.req.param("organizationId"));
65
+ const human = await requireOrganizationCodexHuman(c, deps, organizationId);
66
+ const parsed = UpdateOrganizationModelDefaultsRequest.safeParse(
67
+ await c.req.json().catch(() => null),
68
+ );
69
+ if (!parsed.success) {
70
+ throw new HTTPException(422, { message: "invalid organization model defaults" });
71
+ }
72
+ const { settings } = await deps.resolveCatalogSettings();
73
+ const canonical = (id: string) => canonicalizeConfiguredModelId(settings, id);
74
+ const patch = parsed.data;
75
+ try {
76
+ return c.json(
77
+ OrganizationModelDefaults.parse(
78
+ await updateOrganizationModelDefaults(deps.db, {
79
+ organizationId,
80
+ actorSubjectId: human.subjectId,
81
+ patch: {
82
+ ...(patch.sessionDefaults === undefined
83
+ ? {}
84
+ : {
85
+ sessionDefaults: patch.sessionDefaults
86
+ ? { ...patch.sessionDefaults, model: canonical(patch.sessionDefaults.model) }
87
+ : null,
88
+ }),
89
+ ...(patch.modelPolicy === undefined
90
+ ? {}
91
+ : {
92
+ modelPolicy: {
93
+ allowedProviders: patch.modelPolicy?.allowedProviders ?? null,
94
+ allowedModels: patch.modelPolicy?.allowedModels
95
+ ? [...new Set(patch.modelPolicy.allowedModels.map(canonical))]
96
+ : null,
97
+ },
98
+ }),
99
+ ...(patch.modelCompactionThresholds === undefined
100
+ ? {}
101
+ : { modelCompactionThresholds: patch.modelCompactionThresholds }),
102
+ },
103
+ }),
104
+ ),
105
+ );
106
+ } catch (error) {
107
+ refused(error);
108
+ }
109
+ });
110
+ }
@@ -1,3 +1,4 @@
1
+ import { claudeProviderId, opperCredentialProblem } from "@opengeni/config";
1
2
  import {
2
3
  CreateOrganizationProviderCustomModelRequest,
3
4
  DeleteOrganizationProviderCustomModelRequest,
@@ -25,6 +26,7 @@ import type { Context, Hono } from "hono";
25
26
  import { HTTPException } from "hono/http-exception";
26
27
  import { z } from "zod";
27
28
 
29
+ import { offerClaudeDefaultModels } from "../claude-default-models";
28
30
  import { requireOrganizationCodexHuman, requireSameOriginBrowserMutation } from "./codex";
29
31
 
30
32
  const OrganizationId = z.string().uuid();
@@ -48,7 +50,7 @@ function providerKind(value: string) {
48
50
  }
49
51
 
50
52
  function connectionJson(connection: {
51
- providerKind: "vercel_gateway" | "openrouter";
53
+ providerKind: "vercel_gateway" | "openrouter" | "anthropic" | "claude_subscription" | "opper";
52
54
  status: "active" | "revoked";
53
55
  version: number;
54
56
  createdAt: Date;
@@ -87,10 +89,28 @@ function conflict(error: unknown): never {
87
89
  }
88
90
 
89
91
  export function registerOrganizationModelProviderRoutes(app: Hono, deps: ApiRouteDeps): void {
92
+ app.use("/v1/organizations/:organizationId/model-providers/:providerKind", async (c, next) => {
93
+ if (
94
+ c.req.param("providerKind") === "claude_subscription" &&
95
+ !deps.settings.claudeSubscriptionEnabled
96
+ )
97
+ throw new HTTPException(404, { message: "Claude subscriptions are not enabled" });
98
+ await next();
99
+ });
100
+ app.use("/v1/organizations/:organizationId/model-providers/:providerKind/*", async (c, next) => {
101
+ if (
102
+ c.req.param("providerKind") === "claude_subscription" &&
103
+ !deps.settings.claudeSubscriptionEnabled
104
+ )
105
+ throw new HTTPException(404, { message: "Claude subscriptions are not enabled" });
106
+ await next();
107
+ });
90
108
  app.get("/v1/organizations/:organizationId/model-providers/:providerKind", async (c) => {
91
109
  c.header("cache-control", "private, no-store");
92
110
  const organizationId = parseOrganizationId(c.req.param("organizationId"));
93
111
  const human = await requireOrganizationCodexHuman(c, deps, organizationId);
112
+ if (c.req.param("providerKind") === "claude_subscription")
113
+ throw new HTTPException(410, { message: "Claude subscriptions use individual accounts." });
94
114
  const connection = await getOrganizationModelProviderConnection(deps.db, {
95
115
  organizationId,
96
116
  actorSubjectId: human.subjectId,
@@ -98,6 +118,29 @@ export function registerOrganizationModelProviderRoutes(app: Hono, deps: ApiRout
98
118
  });
99
119
  return connection ? c.json(connectionJson(connection)) : c.json(null);
100
120
  });
121
+ const usagePath = "/v1/organizations/:organizationId/model-providers/:providerKind/usage";
122
+ async function usageScope(c: Context) {
123
+ c.header("cache-control", "private, no-store");
124
+ if (providerKind(c.req.param("providerKind")!) !== "claude_subscription")
125
+ throw new HTTPException(404, { message: "Usage not available for this provider" });
126
+ const organizationId = parseOrganizationId(c.req.param("organizationId")!);
127
+ const human = await requireOrganizationCodexHuman(c, deps, organizationId);
128
+ return {
129
+ accountId: organizationId,
130
+ workspaceId: null,
131
+ scope: "organization" as const,
132
+ actorSubjectId: human.subjectId,
133
+ };
134
+ }
135
+ app.get(usagePath, async (c) => {
136
+ await usageScope(c);
137
+ throw new HTTPException(410, { message: "Check usage on the individual Claude account." });
138
+ });
139
+ app.post(`${usagePath}/refresh`, async (c) => {
140
+ requireSameOriginBrowserMutation(c, deps);
141
+ await usageScope(c);
142
+ throw new HTTPException(410, { message: "Check usage on the individual Claude account." });
143
+ });
101
144
 
102
145
  app.put("/v1/organizations/:organizationId/model-providers/:providerKind", async (c) => {
103
146
  c.header("cache-control", "private, no-store");
@@ -109,6 +152,20 @@ export function registerOrganizationModelProviderRoutes(app: Hono, deps: ApiRout
109
152
  UpsertOrganizationModelProviderConnectionRequest,
110
153
  "invalid organization model provider connection",
111
154
  );
155
+ const kind = providerKind(c.req.param("providerKind"));
156
+ if (kind === "claude_subscription")
157
+ throw new HTTPException(410, { message: "Claude subscriptions use individual accounts." });
158
+ if (kind === "anthropic" && !/^sk-ant-api[0-9]+-\S+$/.test(payload.apiKey))
159
+ throw new HTTPException(422, {
160
+ message: "Enter an Anthropic API key. Use Claude subscription for setup tokens.",
161
+ });
162
+ const opperProblem = kind === "opper" ? opperCredentialProblem(payload.apiKey) : null;
163
+ if (opperProblem) throw new HTTPException(422, { message: opperProblem });
164
+ if (payload.claudeIdentity)
165
+ throw new HTTPException(422, {
166
+ message: "Claude identity is only valid for subscription connections.",
167
+ });
168
+ const credential = payload.apiKey;
112
169
  try {
113
170
  const connection = await upsertOrganizationModelProviderConnection(deps.db, {
114
171
  organizationId,
@@ -116,14 +173,20 @@ export function registerOrganizationModelProviderRoutes(app: Hono, deps: ApiRout
116
173
  providerKind: providerKind(c.req.param("providerKind")),
117
174
  credentialEncrypted: encryptEnvironmentValue(
118
175
  requireEnvironmentEncryption(deps.settings),
119
- payload.apiKey,
176
+ credential,
120
177
  ),
121
- credentialDigest: organizationModelProviderCredentialDigest(payload.apiKey),
178
+ credentialDigest: organizationModelProviderCredentialDigest(credential),
122
179
  operationId: payload.operationId,
123
180
  ...(payload.expectedVersion === undefined
124
181
  ? {}
125
182
  : { expectedVersion: payload.expectedVersion }),
126
183
  });
184
+ if (kind === "anthropic")
185
+ await offerClaudeDefaultModels(deps, {
186
+ organizationId,
187
+ actorSubjectId: human.subjectId,
188
+ providerKind: kind,
189
+ });
127
190
  return c.json(connectionJson(connection));
128
191
  } catch (error) {
129
192
  conflict(error);
@@ -141,6 +204,8 @@ export function registerOrganizationModelProviderRoutes(app: Hono, deps: ApiRout
141
204
  "invalid organization model provider disconnect",
142
205
  );
143
206
  try {
207
+ if (c.req.param("providerKind") === "claude_subscription")
208
+ throw new HTTPException(410, { message: "Claude subscriptions use individual accounts." });
144
209
  const connection = await revokeOrganizationModelProviderConnection(deps.db, {
145
210
  organizationId,
146
211
  actorSubjectId: human.subjectId,
@@ -182,6 +247,12 @@ export function registerOrganizationModelProviderRoutes(app: Hono, deps: ApiRout
182
247
  CreateOrganizationProviderCustomModelRequest,
183
248
  "invalid organization custom model",
184
249
  );
250
+ const kind = providerKind(c.req.param("providerKind"));
251
+ if (
252
+ (kind === "anthropic" || kind === "claude_subscription") &&
253
+ `${claudeProviderId(kind)}/${payload.upstreamModelId}`.length > 256
254
+ )
255
+ throw new HTTPException(422, { message: "Claude model ID is too long" });
185
256
  try {
186
257
  const model = await createOrganizationModelProviderCustomModel(deps.db, {
187
258
  organizationId,