@opengeni/api-router 3.0.1 → 3.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. package/dist/access-grant-rls.d.ts +8 -1
  2. package/dist/admission-trace.d.ts +8 -0
  3. package/dist/app.d.ts +50 -3
  4. package/dist/app.js +10 -1
  5. package/dist/artifact-catalog-cursor.d.ts +1 -0
  6. package/dist/attached-browser-viewer.d.ts +11 -0
  7. package/dist/auth/managed-auth-attempt-context.d.ts +2 -0
  8. package/dist/auth/managed-auth-rate-limits.d.ts +167 -0
  9. package/dist/auth/managed-auth-session-adapter.d.ts +9 -1
  10. package/dist/auth/managed-auth.d.ts +72 -5
  11. package/dist/auth/managed-sign-in-notifications.d.ts +4 -0
  12. package/dist/auth/new-signups-gate.d.ts +23 -0
  13. package/dist/auth/signup-funnel-metrics.d.ts +44 -0
  14. package/dist/azure-live.d.ts +28 -0
  15. package/dist/browser-action-fences.d.ts +13 -0
  16. package/dist/browser-controller-authority.d.ts +1 -61
  17. package/dist/browser-ephemeral.d.ts +5 -0
  18. package/dist/browser-lost-runtime-end.d.ts +24 -0
  19. package/dist/browser-state-authority.d.ts +1 -27
  20. package/dist/chunk-OGQDXVXY.js +18 -0
  21. package/dist/chunk-OGQDXVXY.js.map +1 -0
  22. package/dist/{chunk-AJ62T5QN.js → chunk-OT56OY4V.js} +80503 -39869
  23. package/dist/chunk-OT56OY4V.js.map +1 -0
  24. package/dist/claude-default-models.d.ts +19 -0
  25. package/dist/claude-subscription-core.d.ts +50 -0
  26. package/dist/claude-subscription-oauth.d.ts +36 -0
  27. package/dist/claude-subscription-profile.d.ts +9 -0
  28. package/dist/claude-subscription-usage.d.ts +6 -0
  29. package/dist/claude-workspace-connection.d.ts +15 -0
  30. package/dist/codemode.d.ts +40 -5
  31. package/dist/codex-realtime.d.ts +29 -3
  32. package/dist/codex-session-pointers.d.ts +19 -0
  33. package/dist/connection-ownership.d.ts +6 -3
  34. package/dist/controller-data-plane.d.ts +16 -0
  35. package/dist/credit-promotion-snapshot.d.ts +6 -0
  36. package/dist/editable-artifact-source-session.d.ts +3 -0
  37. package/dist/editable-artifact-websocket.d.ts +5 -3
  38. package/dist/fatal-process-boundary.d.ts +9 -1
  39. package/dist/github-access.d.ts +7 -1
  40. package/dist/github-browser-flow.d.ts +1 -1
  41. package/dist/http/acting-person.d.ts +36 -0
  42. package/dist/http/api-contract-compat.d.ts +19 -0
  43. package/dist/http/api-error.d.ts +50 -1
  44. package/dist/http/auth.d.ts +8 -1
  45. package/dist/http/cors.d.ts +12 -0
  46. package/dist/http/deprecation.d.ts +42 -0
  47. package/dist/http/keyed-admission.d.ts +12 -0
  48. package/dist/http/local-browser-boundary.d.ts +72 -0
  49. package/dist/http/metrics-listener.d.ts +22 -0
  50. package/dist/http/path-identifier.d.ts +17 -0
  51. package/dist/http/registered-route-label.d.ts +16 -0
  52. package/dist/http/rejection-telemetry.d.ts +34 -0
  53. package/dist/http/request-body.d.ts +27 -0
  54. package/dist/http/request-source.d.ts +41 -3
  55. package/dist/http/sse.d.ts +12 -1
  56. package/dist/http/unmatched-route.d.ts +18 -0
  57. package/dist/http/user-content.d.ts +36 -0
  58. package/dist/http/variable-sets-removed.d.ts +41 -0
  59. package/dist/http/websocket-upgrade-dispatch.d.ts +18 -0
  60. package/dist/index.js +1279 -108
  61. package/dist/index.js.map +1 -1
  62. package/dist/integration-connect-metrics.d.ts +35 -0
  63. package/dist/integration-endpoint-test.d.ts +20 -0
  64. package/dist/integrations/api-integrations.d.ts +2 -2
  65. package/dist/integrations/atlassian.d.ts +8 -3
  66. package/dist/integrations/fiken.d.ts +3 -1
  67. package/dist/integrations/github-lens-connect.d.ts +37 -66
  68. package/dist/integrations/google-drive.d.ts +2 -0
  69. package/dist/integrations/integration-commit-authority.d.ts +13 -0
  70. package/dist/integrations/marketplace-plugin.d.ts +43 -43
  71. package/dist/integrations/oauth-client.d.ts +171 -12
  72. package/dist/integrations/oauth-profiles.d.ts +42 -13
  73. package/dist/integrations/onepassword-vault-provider.d.ts +9 -0
  74. package/dist/integrations/slack-bot.d.ts +285 -7
  75. package/dist/integrations/slack-file-upload-flow.d.ts +62 -0
  76. package/dist/integrations/slack-interactions.d.ts +89 -10
  77. package/dist/integrations/slack-mrkdwn.d.ts +41 -0
  78. package/dist/integrations/slack-routing.d.ts +1 -1
  79. package/dist/integrations/slack-session-defaults.d.ts +58 -0
  80. package/dist/integrations/slack-task-file-upload.d.ts +36 -0
  81. package/dist/integrations/slack-tool-review.d.ts +5 -0
  82. package/dist/interaction-agent-access.d.ts +13 -8
  83. package/dist/interaction-agent-version.d.ts +21 -0
  84. package/dist/interaction-holder-heartbeat.d.ts +5 -0
  85. package/dist/interaction-metrics.d.ts +27 -2
  86. package/dist/interaction-route-stages.d.ts +25 -0
  87. package/dist/interaction-secrets-vault.d.ts +20 -0
  88. package/dist/interaction-secrets.d.ts +103 -0
  89. package/dist/mcp/action-catalog-types.d.ts +14 -0
  90. package/dist/mcp/action-catalog.gen.d.ts +2 -0
  91. package/dist/mcp/action-descriptions.d.ts +4 -0
  92. package/dist/mcp/action-schema-imports.gen.d.ts +1 -0
  93. package/dist/mcp/capability-account-readiness.d.ts +7 -0
  94. package/dist/mcp/child-read-evidence.d.ts +9 -0
  95. package/dist/mcp/company-profile-agent-admin.d.ts +12 -0
  96. package/dist/mcp/contract-input.d.ts +13 -0
  97. package/dist/mcp/documents.d.ts +2 -0
  98. package/dist/mcp/first-party-tool-permissions.d.ts +3 -606
  99. package/dist/mcp/notification-tools.d.ts +26 -0
  100. package/dist/mcp/orchestration-failure-diagnostic.d.ts +43 -0
  101. package/dist/mcp/scheduled-task-input.d.ts +1309 -0
  102. package/dist/mcp/scheduled-task-view.d.ts +217 -3
  103. package/dist/mcp/secret-tools.d.ts +14 -0
  104. package/dist/mcp/server.d.ts +108 -5
  105. package/dist/mcp/session-admin-access-tools.d.ts +33 -0
  106. package/dist/mcp/session-event-errors.d.ts +28 -0
  107. package/dist/mcp/session-event-view.d.ts +62 -0
  108. package/dist/mcp/session-view.d.ts +15 -0
  109. package/dist/mcp/session-wait.d.ts +18 -0
  110. package/dist/mcp/site-agent-clamp-tools.d.ts +38 -0
  111. package/dist/mcp/site-data-tools.d.ts +22 -0
  112. package/dist/mcp/site-publication-tools.d.ts +19 -0
  113. package/dist/mcp/site-sql-tools.d.ts +27 -0
  114. package/dist/mcp-oauth.d.ts +37 -4
  115. package/dist/model-calls/chat-completions.d.ts +87 -0
  116. package/dist/model-calls/pending-usage-settlements.d.ts +57 -0
  117. package/dist/model-calls/service.d.ts +36 -0
  118. package/dist/model-catalog.d.ts +9 -3
  119. package/dist/native-push-dispatch.d.ts +69 -0
  120. package/dist/observability.d.ts +3 -1
  121. package/dist/organization-mcp.d.ts +82 -0
  122. package/dist/prepared-mcp-actor.d.ts +77 -0
  123. package/dist/prepared-mcp-permissions.d.ts +8 -0
  124. package/dist/routes/analytics-consent.d.ts +26 -0
  125. package/dist/routes/api-integrations.d.ts +11 -0
  126. package/dist/routes/api-keys.d.ts +7 -7
  127. package/dist/routes/automations.d.ts +2 -0
  128. package/dist/routes/billing.d.ts +59 -0
  129. package/dist/routes/browser-sessions.d.ts +65 -2
  130. package/dist/routes/chat-completions.d.ts +11 -0
  131. package/dist/routes/claude-core-usage.d.ts +20 -0
  132. package/dist/routes/claude-subscription-accounts.d.ts +3 -0
  133. package/dist/routes/claude-subscription-oauth.d.ts +3 -0
  134. package/dist/routes/client-errors.d.ts +182 -0
  135. package/dist/routes/codex-core.d.ts +401 -0
  136. package/dist/routes/codex.d.ts +64 -2
  137. package/dist/routes/computer-sessions.d.ts +6 -1
  138. package/dist/routes/desktop-distribution.d.ts +32 -0
  139. package/dist/routes/github-browser-fonts.gen.d.ts +2 -0
  140. package/dist/routes/github-browser-pages.d.ts +27 -0
  141. package/dist/routes/inbox.d.ts +13 -0
  142. package/dist/routes/insights-response-cache.d.ts +10 -0
  143. package/dist/routes/insights-usage.d.ts +12 -0
  144. package/dist/routes/insights.d.ts +28 -0
  145. package/dist/routes/interaction-placement-message.d.ts +7 -0
  146. package/dist/routes/managed-sign-in-methods.d.ts +6 -0
  147. package/dist/routes/model-account-choice.d.ts +13 -0
  148. package/dist/routes/model-account-settings.d.ts +19 -0
  149. package/dist/routes/native-app-auth.d.ts +12 -0
  150. package/dist/routes/organization-integration-policy.d.ts +8 -0
  151. package/dist/routes/organization-integrations.d.ts +6 -0
  152. package/dist/routes/organization-mcp-connections.d.ts +3 -0
  153. package/dist/routes/organization-model-defaults.d.ts +9 -0
  154. package/dist/routes/organization-service-accounts.d.ts +3 -0
  155. package/dist/routes/personal-api-keys.d.ts +3 -0
  156. package/dist/routes/session-admin-access.d.ts +3 -0
  157. package/dist/routes/session-artifact-associations.d.ts +4 -0
  158. package/dist/routes/session-history-imports.d.ts +20 -0
  159. package/dist/routes/sessions.d.ts +38 -2
  160. package/dist/routes/site-data.d.ts +18 -0
  161. package/dist/routes/site-publishing.d.ts +5 -0
  162. package/dist/routes/site-runtime.d.ts +31 -0
  163. package/dist/routes/site-sql.d.ts +16 -0
  164. package/dist/routes/slack-bot-access.d.ts +3 -0
  165. package/dist/routes/subscription-account-pools.d.ts +21 -0
  166. package/dist/routes/subscription-core-http.d.ts +5 -0
  167. package/dist/routes/subscription-pool-access.d.ts +37 -0
  168. package/dist/routes/subscription-pool-core.d.ts +153 -0
  169. package/dist/routes/supergrok.d.ts +6 -6
  170. package/dist/routes/usage-allowances.d.ts +12 -0
  171. package/dist/routes/variable-sets-removed.d.ts +2 -0
  172. package/dist/routes/vault-providers.d.ts +34 -0
  173. package/dist/routes/vaults.d.ts +3 -0
  174. package/dist/routes/workspace-integrations.d.ts +35 -0
  175. package/dist/routes/workspace-model-providers.d.ts +4 -0
  176. package/dist/routes/workspaces.d.ts +11 -2
  177. package/dist/sandbox/agent-update.d.ts +64 -0
  178. package/dist/sandbox/auth-callout.d.ts +8 -0
  179. package/dist/sandbox/channel-a.d.ts +15 -1
  180. package/dist/sandbox/enrollment.d.ts +26 -4
  181. package/dist/sandbox/machine-audience.d.ts +29 -0
  182. package/dist/sandbox/machines.d.ts +15 -2
  183. package/dist/sandbox/metrics-ingestion.d.ts +6 -2
  184. package/dist/sandbox/screen-control.d.ts +85 -0
  185. package/dist/sandbox/viewer.d.ts +5 -1
  186. package/dist/sandbox-file-artifacts.d.ts +17 -1
  187. package/dist/scheduled-task-blockers.d.ts +39 -0
  188. package/dist/scheduled-task-deletion.d.ts +3 -4
  189. package/dist/scheduled-task-lifecycle.d.ts +14 -0
  190. package/dist/secret-answers.d.ts +40 -0
  191. package/dist/session-create-observability.d.ts +5 -0
  192. package/dist/session-event-view-36GO3IL7.js +528 -0
  193. package/dist/session-event-view-36GO3IL7.js.map +1 -0
  194. package/dist/signed-state-secret.d.ts +18 -0
  195. package/dist/site-agent-guard.d.ts +53 -0
  196. package/dist/site-data/operations.d.ts +103 -0
  197. package/dist/site-data/service.d.ts +203 -0
  198. package/dist/site-frame-guard.d.ts +32 -0
  199. package/dist/site-publishing/agent-data-tools.d.ts +84 -0
  200. package/dist/site-publishing/agent-model.d.ts +58 -0
  201. package/dist/site-publishing/agent-session.d.ts +16 -0
  202. package/dist/site-publishing/content-scanner.d.ts +31 -0
  203. package/dist/site-publishing/edge-sync.d.ts +48 -0
  204. package/dist/site-publishing/gateway-signature.d.ts +56 -0
  205. package/dist/site-publishing/limits.d.ts +63 -0
  206. package/dist/site-publishing/page-tool-authority.d.ts +30 -0
  207. package/dist/site-publishing/platform-usage.d.ts +113 -0
  208. package/dist/site-publishing/platform.d.ts +21 -0
  209. package/dist/site-publishing/readiness.d.ts +62 -0
  210. package/dist/site-publishing/runtime.d.ts +179 -0
  211. package/dist/site-publishing/service.d.ts +264 -0
  212. package/dist/site-publishing/session-events.d.ts +22 -0
  213. package/dist/site-publishing/session-views.d.ts +36 -0
  214. package/dist/site-publishing/viewer.d.ts +40 -0
  215. package/dist/site-session-origin.d.ts +31 -6
  216. package/dist/site-sql/format.d.ts +47 -0
  217. package/dist/site-sql/gateway.d.ts +50 -0
  218. package/dist/site-sql/service.d.ts +213 -0
  219. package/dist/temporal-schedule-sync.d.ts +26 -0
  220. package/dist/transcription/billing-refusal.d.ts +8 -0
  221. package/dist/transcription/normalize.d.ts +23 -0
  222. package/dist/transcription/providers/azure-mai.d.ts +12 -0
  223. package/dist/transcription/providers/azure-openai.d.ts +4 -0
  224. package/dist/transcription/providers/openai.d.ts +16 -0
  225. package/dist/transcription/providers/subscription-core.d.ts +39 -0
  226. package/dist/transcription/service.d.ts +10 -1
  227. package/dist/transcription/wav-duration.d.ts +8 -0
  228. package/dist/workspace-tool-gateway-attestations.d.ts +37 -0
  229. package/dist/workspace-tool-gateway-observability.d.ts +16 -0
  230. package/dist/workspace-tool-gateway-secrets.d.ts +27 -0
  231. package/dist/workspace-tool-gateway.d.ts +102 -6
  232. package/dist/workspace-tool-target-fence.d.ts +116 -0
  233. package/dist/workspace-tool-target.d.ts +225 -0
  234. package/dist/workspace-webhook-dispatch.d.ts +26 -0
  235. package/dist/xai-subscription-core.d.ts +60 -0
  236. package/package.json +25 -20
  237. package/src/access-grant-rls.ts +64 -14
  238. package/src/admission-trace.ts +14 -0
  239. package/src/app.ts +1684 -252
  240. package/src/artifact-catalog-cursor.ts +1 -0
  241. package/src/attached-browser-viewer.ts +26 -0
  242. package/src/auth/managed-auth-attempt-context.ts +9 -0
  243. package/src/auth/managed-auth-rate-limits.ts +252 -0
  244. package/src/auth/managed-auth-session-adapter.ts +64 -29
  245. package/src/auth/managed-auth.ts +303 -35
  246. package/src/auth/managed-email.ts +18 -1
  247. package/src/auth/managed-sign-in-notifications.ts +81 -0
  248. package/src/auth/new-signups-gate.ts +49 -0
  249. package/src/auth/organization-user-setup.ts +3 -3
  250. package/src/auth/signup-funnel-metrics.ts +164 -0
  251. package/src/azure-live.ts +103 -0
  252. package/src/browser-action-fences.ts +45 -0
  253. package/src/browser-controller-authority.ts +1 -186
  254. package/src/browser-ephemeral.ts +39 -0
  255. package/src/browser-lost-runtime-end.ts +71 -0
  256. package/src/browser-state-authority.ts +1 -236
  257. package/src/claude-default-models.ts +37 -0
  258. package/src/claude-subscription-core.ts +154 -0
  259. package/src/claude-subscription-oauth.ts +352 -0
  260. package/src/claude-subscription-profile.ts +73 -0
  261. package/src/claude-subscription-usage.ts +51 -0
  262. package/src/claude-workspace-connection.ts +82 -0
  263. package/src/codemode.ts +236 -39
  264. package/src/codex-realtime.ts +181 -53
  265. package/src/codex-session-pointers.ts +80 -0
  266. package/src/company-brain-okf.ts +1 -1
  267. package/src/connected-machine-computer-access.ts +2 -1
  268. package/src/connection-ownership.ts +19 -13
  269. package/src/controller-data-plane.ts +34 -0
  270. package/src/credit-promotion-snapshot.ts +36 -0
  271. package/src/editable-artifact-production.ts +10 -0
  272. package/src/editable-artifact-source-session.ts +123 -0
  273. package/src/editable-artifact-websocket.ts +16 -3
  274. package/src/fatal-process-boundary.ts +67 -3
  275. package/src/gateway-realtime.ts +12 -8
  276. package/src/github-access.ts +31 -5
  277. package/src/github-browser-flow.ts +1 -1
  278. package/src/http/acting-person.ts +105 -0
  279. package/src/http/api-contract-compat.ts +49 -0
  280. package/src/http/api-error.ts +210 -2
  281. package/src/http/auth.ts +68 -4
  282. package/src/http/cors.ts +37 -5
  283. package/src/http/deprecation.ts +118 -0
  284. package/src/http/keyed-admission.ts +29 -0
  285. package/src/http/local-browser-boundary.ts +343 -0
  286. package/src/http/metrics-listener.ts +57 -0
  287. package/src/http/path-identifier.ts +54 -0
  288. package/src/http/registered-route-label.ts +34 -0
  289. package/src/http/rejection-telemetry.ts +120 -0
  290. package/src/http/request-body.ts +127 -0
  291. package/src/http/request-source.ts +154 -13
  292. package/src/http/sse.ts +88 -28
  293. package/src/http/unmatched-route.ts +60 -0
  294. package/src/http/user-content.ts +158 -0
  295. package/src/http/variable-sets-removed.ts +122 -0
  296. package/src/http/websocket-upgrade-dispatch.ts +29 -0
  297. package/src/index.ts +107 -57
  298. package/src/integration-connect-metrics.ts +228 -0
  299. package/src/integration-endpoint-test.ts +291 -0
  300. package/src/integrations/api-integrations.ts +81 -7
  301. package/src/integrations/atlassian.ts +202 -83
  302. package/src/integrations/fiken.ts +66 -38
  303. package/src/integrations/github-app-connect.ts +64 -18
  304. package/src/integrations/github-lens-connect.ts +8 -29
  305. package/src/integrations/google-drive.ts +448 -152
  306. package/src/integrations/integration-commit-authority.ts +69 -0
  307. package/src/integrations/marketplace-plugin.ts +1 -1
  308. package/src/integrations/oauth-client.ts +733 -193
  309. package/src/integrations/oauth-profiles.ts +116 -45
  310. package/src/integrations/onepassword-vault-provider.ts +16 -0
  311. package/src/integrations/personal-github-repositories.ts +1 -1
  312. package/src/integrations/personal-github.ts +61 -35
  313. package/src/integrations/provider-oauth.ts +67 -85
  314. package/src/integrations/slack-app-home.ts +5 -5
  315. package/src/integrations/slack-bot.ts +893 -201
  316. package/src/integrations/slack-file-upload-flow.ts +147 -0
  317. package/src/integrations/slack-install.ts +7 -7
  318. package/src/integrations/slack-interactions.ts +1589 -299
  319. package/src/integrations/slack-mrkdwn.ts +193 -0
  320. package/src/integrations/slack-routing.ts +2 -2
  321. package/src/integrations/slack-session-defaults.ts +224 -0
  322. package/src/integrations/slack-task-file-upload.ts +323 -0
  323. package/src/integrations/slack-tool-review.ts +65 -0
  324. package/src/integrations/social-oauth.ts +90 -58
  325. package/src/interaction-agent-access.ts +40 -20
  326. package/src/interaction-agent-version.ts +85 -0
  327. package/src/interaction-holder-heartbeat.ts +24 -8
  328. package/src/interaction-metrics.ts +164 -2
  329. package/src/interaction-route-stages.ts +94 -0
  330. package/src/interaction-secrets-vault.ts +213 -0
  331. package/src/interaction-secrets.ts +426 -0
  332. package/src/mcp/action-catalog-types.ts +14 -0
  333. package/src/mcp/action-catalog.gen.ts +8014 -0
  334. package/src/mcp/action-descriptions.ts +299 -0
  335. package/src/mcp/action-schema-imports.gen.ts +304 -0
  336. package/src/mcp/capability-account-readiness.ts +17 -0
  337. package/src/mcp/child-read-evidence.ts +19 -0
  338. package/src/mcp/company-profile-agent-admin.ts +13 -0
  339. package/src/mcp/contract-input.ts +165 -0
  340. package/src/mcp/documents.ts +9 -2
  341. package/src/mcp/editable-artifacts.ts +29 -11
  342. package/src/mcp/files.ts +5 -1
  343. package/src/mcp/first-party-tool-permissions.ts +7 -285
  344. package/src/mcp/knowledge-entries.ts +108 -34
  345. package/src/mcp/notification-tools.ts +480 -0
  346. package/src/mcp/orchestration-failure-diagnostic.ts +43 -0
  347. package/src/mcp/scheduled-task-input.ts +89 -0
  348. package/src/mcp/scheduled-task-view.ts +63 -3
  349. package/src/mcp/secret-tools.ts +185 -0
  350. package/src/mcp/server.ts +2213 -1116
  351. package/src/mcp/session-admin-access-tools.ts +163 -0
  352. package/src/mcp/session-event-errors.ts +123 -0
  353. package/src/mcp/session-event-view.ts +395 -13
  354. package/src/mcp/session-view.ts +3 -0
  355. package/src/mcp/session-wait.ts +67 -7
  356. package/src/mcp/site-agent-clamp-tools.ts +140 -0
  357. package/src/mcp/site-data-tools.ts +339 -0
  358. package/src/mcp/site-publication-tools.ts +201 -0
  359. package/src/mcp/site-sql-tools.ts +427 -0
  360. package/src/mcp-oauth.ts +635 -45
  361. package/src/model-calls/chat-completions.ts +352 -0
  362. package/src/model-calls/pending-usage-settlements.ts +125 -0
  363. package/src/model-calls/service.ts +694 -0
  364. package/src/model-catalog.ts +68 -17
  365. package/src/native-push-dispatch.ts +457 -0
  366. package/src/observability.ts +15 -1
  367. package/src/organization-mcp.ts +485 -0
  368. package/src/prepared-mcp-actor.ts +154 -0
  369. package/src/prepared-mcp-permissions.ts +38 -0
  370. package/src/routes/analytics-consent.ts +123 -0
  371. package/src/routes/api-integrations.ts +268 -9
  372. package/src/routes/api-keys.ts +164 -25
  373. package/src/routes/artifact-catalog.ts +111 -0
  374. package/src/routes/automations.ts +163 -90
  375. package/src/routes/billing.ts +535 -59
  376. package/src/routes/browser-sessions.ts +966 -342
  377. package/src/routes/canonical-human-identities.ts +61 -0
  378. package/src/routes/capabilities.ts +112 -5
  379. package/src/routes/channels.ts +4 -3
  380. package/src/routes/chat-completions.ts +235 -0
  381. package/src/routes/claude-core-usage.ts +147 -0
  382. package/src/routes/claude-subscription-accounts.ts +233 -0
  383. package/src/routes/claude-subscription-oauth.ts +175 -0
  384. package/src/routes/client-errors.ts +394 -0
  385. package/src/routes/codex-core.ts +687 -0
  386. package/src/routes/codex.ts +1277 -1119
  387. package/src/routes/company-brain.ts +4 -0
  388. package/src/routes/computer-sessions.ts +319 -85
  389. package/src/routes/connect.ts +277 -175
  390. package/src/routes/connections.ts +690 -363
  391. package/src/routes/desktop-distribution.ts +217 -0
  392. package/src/routes/documents.ts +13 -7
  393. package/src/routes/editable-artifacts.ts +74 -4
  394. package/src/routes/enrollments.ts +110 -16
  395. package/src/routes/external-identity-links.ts +13 -12
  396. package/src/routes/files.ts +41 -16
  397. package/src/routes/github-browser-fonts.gen.ts +12 -0
  398. package/src/routes/github-browser-pages.ts +258 -0
  399. package/src/routes/github.ts +200 -75
  400. package/src/routes/inbox.ts +353 -0
  401. package/src/routes/insights-response-cache.ts +83 -0
  402. package/src/routes/insights-usage.ts +345 -0
  403. package/src/routes/insights.ts +103 -8
  404. package/src/routes/install.ts +51 -10
  405. package/src/routes/integration-facets.ts +70 -28
  406. package/src/routes/interaction-placement-message.ts +12 -0
  407. package/src/routes/knowledge.ts +136 -27
  408. package/src/routes/machines.ts +189 -135
  409. package/src/routes/managed-auth-session-sets.ts +43 -10
  410. package/src/routes/managed-onboarding.ts +39 -19
  411. package/src/routes/managed-sign-in-methods.ts +433 -0
  412. package/src/routes/memory-slack-publications.ts +3 -2
  413. package/src/routes/model-account-choice.ts +194 -0
  414. package/src/routes/model-account-settings.ts +235 -0
  415. package/src/routes/model-connection-access.ts +210 -48
  416. package/src/routes/native-app-auth.ts +296 -0
  417. package/src/routes/organization-integration-policy.ts +116 -0
  418. package/src/routes/organization-integrations.ts +326 -0
  419. package/src/routes/organization-mcp-connections.ts +183 -0
  420. package/src/routes/organization-memberships.ts +205 -19
  421. package/src/routes/organization-model-defaults.ts +110 -0
  422. package/src/routes/organization-model-providers.ts +74 -3
  423. package/src/routes/organization-service-accounts.ts +128 -0
  424. package/src/routes/organization-sessions.ts +21 -5
  425. package/src/routes/personal-api-keys.ts +184 -0
  426. package/src/routes/personal-github-git-broker.ts +2 -2
  427. package/src/routes/personal-github.ts +9 -4
  428. package/src/routes/plugins.ts +46 -7
  429. package/src/routes/pr-review-github.ts +105 -118
  430. package/src/routes/pr-review.ts +88 -82
  431. package/src/routes/preference-registry.ts +18 -0
  432. package/src/routes/rigs.ts +48 -13
  433. package/src/routes/scheduled-tasks.ts +347 -27
  434. package/src/routes/session-admin-access.ts +271 -0
  435. package/src/routes/session-artifact-associations.ts +164 -0
  436. package/src/routes/session-history-imports.ts +305 -0
  437. package/src/routes/sessions.ts +1682 -363
  438. package/src/routes/site-data.ts +340 -0
  439. package/src/routes/site-publishing.ts +584 -0
  440. package/src/routes/site-runtime.ts +1944 -0
  441. package/src/routes/site-sql.ts +263 -0
  442. package/src/routes/skill-content.ts +72 -7
  443. package/src/routes/skills.ts +5 -4
  444. package/src/routes/slack-bot-access.ts +108 -0
  445. package/src/routes/social.ts +27 -15
  446. package/src/routes/subscription-account-pools.ts +209 -0
  447. package/src/routes/subscription-core-http.ts +18 -0
  448. package/src/routes/subscription-pool-access.ts +180 -0
  449. package/src/routes/subscription-pool-core.ts +552 -0
  450. package/src/routes/supergrok.ts +174 -655
  451. package/src/routes/transcription-recordings.ts +71 -4
  452. package/src/routes/transcriptions.ts +26 -2
  453. package/src/routes/usage-allowances.ts +381 -0
  454. package/src/routes/variable-sets-removed.ts +19 -0
  455. package/src/routes/vault-providers.ts +782 -0
  456. package/src/routes/vaults.ts +421 -0
  457. package/src/routes/video-generation.ts +30 -12
  458. package/src/routes/workspace-artifacts.ts +165 -53
  459. package/src/routes/workspace-integrations.ts +576 -0
  460. package/src/routes/workspace-model-providers.ts +148 -0
  461. package/src/routes/workspace-state.ts +4 -0
  462. package/src/routes/workspaces.ts +625 -117
  463. package/src/sandbox/agent-update.ts +315 -0
  464. package/src/sandbox/auth-callout.ts +104 -21
  465. package/src/sandbox/channel-a.ts +165 -55
  466. package/src/sandbox/enrollment.ts +131 -22
  467. package/src/sandbox/machine-audience.ts +192 -0
  468. package/src/sandbox/machines.ts +75 -31
  469. package/src/sandbox/metrics-ingestion.ts +133 -2
  470. package/src/sandbox/rematerialize.ts +51 -21
  471. package/src/sandbox/screen-control.ts +289 -0
  472. package/src/sandbox/viewer.ts +33 -58
  473. package/src/sandbox-file-artifacts.ts +53 -27
  474. package/src/scheduled-task-blockers.ts +293 -0
  475. package/src/scheduled-task-deletion.ts +13 -3
  476. package/src/scheduled-task-lifecycle.ts +84 -0
  477. package/src/secret-answers.ts +119 -0
  478. package/src/session-create-observability.ts +46 -0
  479. package/src/session-realtime-context.ts +26 -4
  480. package/src/signed-state-secret.ts +58 -0
  481. package/src/site-agent-guard.ts +261 -0
  482. package/src/site-data/operations.ts +777 -0
  483. package/src/site-data/service.ts +1043 -0
  484. package/src/site-frame-guard.ts +107 -0
  485. package/src/site-publishing/agent-data-tools.ts +250 -0
  486. package/src/site-publishing/agent-model.ts +127 -0
  487. package/src/site-publishing/agent-session.ts +148 -0
  488. package/src/site-publishing/content-scanner.ts +93 -0
  489. package/src/site-publishing/edge-sync.ts +148 -0
  490. package/src/site-publishing/gateway-signature.ts +198 -0
  491. package/src/site-publishing/limits.ts +315 -0
  492. package/src/site-publishing/page-tool-authority.ts +111 -0
  493. package/src/site-publishing/platform-usage.ts +479 -0
  494. package/src/site-publishing/platform.ts +98 -0
  495. package/src/site-publishing/readiness.ts +330 -0
  496. package/src/site-publishing/runtime.ts +831 -0
  497. package/src/site-publishing/service.ts +1282 -0
  498. package/src/site-publishing/session-events.ts +262 -0
  499. package/src/site-publishing/session-views.ts +262 -0
  500. package/src/site-publishing/viewer.ts +75 -0
  501. package/src/site-session-origin.ts +91 -6
  502. package/src/site-sql/format.ts +134 -0
  503. package/src/site-sql/gateway.ts +168 -0
  504. package/src/site-sql/service.ts +1636 -0
  505. package/src/site-uploads.ts +27 -5
  506. package/src/temporal-schedule-sync.ts +74 -0
  507. package/src/transcription/billing-refusal.ts +14 -0
  508. package/src/transcription/normalize.ts +77 -0
  509. package/src/transcription/providers/azure-mai.ts +98 -0
  510. package/src/transcription/providers/azure-openai.ts +16 -7
  511. package/src/transcription/providers/codex-subscription.ts +190 -67
  512. package/src/transcription/providers/openai.ts +79 -5
  513. package/src/transcription/providers/subscription-core.ts +125 -0
  514. package/src/transcription/providers/xai-subscription.ts +81 -83
  515. package/src/transcription/segmenter.ts +7 -1
  516. package/src/transcription/service.ts +239 -10
  517. package/src/transcription/wav-duration.ts +39 -0
  518. package/src/workspace-deletion.ts +25 -1
  519. package/src/workspace-tool-gateway-attestations.ts +133 -0
  520. package/src/workspace-tool-gateway-observability.ts +64 -0
  521. package/src/workspace-tool-gateway-secrets.ts +104 -0
  522. package/src/workspace-tool-gateway.ts +921 -103
  523. package/src/workspace-tool-target-fence.ts +380 -0
  524. package/src/workspace-tool-target.ts +554 -0
  525. package/src/workspace-webhook-dispatch.ts +225 -0
  526. package/src/xai-realtime.ts +85 -81
  527. package/src/xai-subscription-core.ts +172 -0
  528. package/dist/browser-auth-broker.d.ts +0 -20
  529. package/dist/chunk-AJ62T5QN.js.map +0 -1
  530. package/dist/connection-authority-owner.d.ts +0 -59
  531. package/dist/routes/connection-authorities.d.ts +0 -3
  532. package/dist/routes/environments.d.ts +0 -5
  533. package/dist/routes/host-mcp-bindings.d.ts +0 -5
  534. package/dist/routes/host-mcp-resolvers.d.ts +0 -3
  535. package/dist/routes/packs.d.ts +0 -3
  536. package/dist/session-event-view-MU3HMNV3.js +0 -264
  537. package/dist/session-event-view-MU3HMNV3.js.map +0 -1
  538. package/dist/xai-subscription-auth.d.ts +0 -23
  539. package/src/browser-auth-broker.ts +0 -155
  540. package/src/connection-authority-owner.ts +0 -61
  541. package/src/routes/connection-authorities.ts +0 -139
  542. package/src/routes/environments.ts +0 -388
  543. package/src/routes/host-mcp-bindings.ts +0 -122
  544. package/src/routes/host-mcp-resolvers.ts +0 -41
  545. package/src/routes/packs.ts +0 -784
  546. package/src/xai-subscription-auth.ts +0 -139
@@ -0,0 +1,296 @@
1
+ import { createHash, randomBytes, timingSafeEqual } from "node:crypto";
2
+ import {
3
+ getNativeAppManagedSession,
4
+ NATIVE_APP_CREDENTIAL_PREFIX,
5
+ type ApiRouteDeps,
6
+ } from "@opengeni/core";
7
+ import { requireCanonicalHumanRequestIdentity } from "@opengeni/core/canonical-human-identities";
8
+ import { getCanonicalHumanIdentityProjection } from "@opengeni/db/canonical-human-identities";
9
+ import {
10
+ getNativePushDevice,
11
+ NATIVE_PUSH_RULES,
12
+ registerNativePushDevice,
13
+ unregisterNativePushDevice,
14
+ } from "@opengeni/db";
15
+ import { sql } from "drizzle-orm";
16
+ import type { Hono } from "hono";
17
+ import { HTTPException } from "hono/http-exception";
18
+ import { z } from "zod";
19
+ import { runManagedAuthProvider } from "../auth/managed-auth-attempt-context";
20
+ import { managedAuthSessionCookieHeaders } from "../auth/managed-auth-session-adapter";
21
+ import { admitManagedSignInMutation } from "./managed-sign-in-methods";
22
+
23
+ // Native app sign-in (RFC 8252 shape: authorization code + PKCE over a custom
24
+ // scheme). The app opens `/native-sign-in` in the system auth browser; the
25
+ // person signs in there with any web method and approves the device. The
26
+ // signed-in browser asks for a one-time code bound to the app's PKCE challenge
27
+ // and is redirected to `<scheme>://auth/callback`. The app exchanges the code
28
+ // for its own Better Auth session, presented as `Bearer ogapp_<token>`: the
29
+ // person's own authority on that device, revocable on its own.
30
+
31
+ export const NATIVE_APP_CODE_TTL_MS = 2 * 60 * 1_000;
32
+ const CODE_IDENTIFIER_PREFIX = "opengeni-native-app-code:";
33
+ const PKCE_VERIFIER = /^[A-Za-z0-9._~-]{43,128}$/u;
34
+ const PKCE_CHALLENGE = /^[A-Za-z0-9_-]{43}$/u;
35
+ const MANAGED_PROVIDERS = ["credential", "google", "github"] as const;
36
+ export const NATIVE_APP_PLATFORMS = ["ios", "android", "macos", "windows", "linux"] as const;
37
+ type NativeAppPlatform = (typeof NATIVE_APP_PLATFORMS)[number];
38
+ const PLATFORM_LABELS: Record<NativeAppPlatform, string> = {
39
+ ios: "iOS",
40
+ android: "Android",
41
+ macos: "macOS",
42
+ windows: "Windows",
43
+ linux: "Linux",
44
+ };
45
+
46
+ /** The device label shown in the person's signed-in sessions. */
47
+ export function nativeAppSessionUserAgent(
48
+ platform: NativeAppPlatform,
49
+ deviceName: string | null,
50
+ ): string {
51
+ return `Opengeni app (${PLATFORM_LABELS[platform]}${deviceName ? `; ${deviceName}` : ""})`;
52
+ }
53
+
54
+ const AuthorizeBody = z.object({
55
+ redirectUri: z.string().min(1).max(512),
56
+ codeChallenge: z.string().regex(PKCE_CHALLENGE),
57
+ codeChallengeMethod: z.literal("S256"),
58
+ state: z.string().min(8).max(256).optional(),
59
+ platform: z.enum(NATIVE_APP_PLATFORMS),
60
+ deviceName: z.string().trim().min(1).max(80).optional(),
61
+ });
62
+
63
+ const TokenBody = z.object({
64
+ code: z.string().regex(/^[A-Za-z0-9_-]{43}$/u),
65
+ codeVerifier: z.string().regex(PKCE_VERIFIER),
66
+ redirectUri: z.string().min(1).max(512),
67
+ });
68
+
69
+ const PushDeviceBody = z.object({
70
+ platform: z.enum(["ios", "android"]),
71
+ appId: z.string().regex(/^[A-Za-z0-9._-]{1,255}$/u),
72
+ environment: z.enum(["development", "production"]),
73
+ token: z.string().min(8).max(4096),
74
+ rules: z.array(z.enum(NATIVE_PUSH_RULES)).max(NATIVE_PUSH_RULES.length),
75
+ });
76
+
77
+ const StoredGrant = z.object({
78
+ userId: z.string().min(1),
79
+ providerId: z.enum(MANAGED_PROVIDERS),
80
+ redirectUri: z.string(),
81
+ codeChallenge: z.string().regex(PKCE_CHALLENGE),
82
+ platform: z.enum(NATIVE_APP_PLATFORMS),
83
+ deviceName: z.string().nullable(),
84
+ });
85
+
86
+ /** A registered native callback: exactly `<allowed scheme>://auth/callback`. */
87
+ export function nativeAppRedirectAllowed(redirectUri: string, schemes: readonly string[]): boolean {
88
+ return schemes.some((scheme) => redirectUri === `${scheme}://auth/callback`);
89
+ }
90
+
91
+ export function pkceS256Challenge(verifier: string): string {
92
+ return createHash("sha256").update(verifier, "ascii").digest("base64url");
93
+ }
94
+
95
+ function codeIdentifier(code: string): string {
96
+ return `${CODE_IDENTIFIER_PREFIX}${createHash("sha256").update(code, "utf8").digest("hex")}`;
97
+ }
98
+
99
+ function sameText(left: string, right: string): boolean {
100
+ const a = Buffer.from(left, "utf8");
101
+ const b = Buffer.from(right, "utf8");
102
+ return a.length === b.length && timingSafeEqual(a, b);
103
+ }
104
+
105
+ function bearer(header: string | undefined): string | null {
106
+ return header?.startsWith("Bearer ") ? header.slice("Bearer ".length) : null;
107
+ }
108
+
109
+ async function rows<T>(deps: ApiRouteDeps, query: ReturnType<typeof sql>): Promise<T[]> {
110
+ const result = await deps.db.execute(query);
111
+ return (Array.isArray(result) ? result : (result as { rows: T[] }).rows) as T[];
112
+ }
113
+
114
+ export function registerNativeAppAuthRoutes(app: Hono, deps: ApiRouteDeps): void {
115
+ const base = "/v1/native-app";
116
+ app.use(`${base}/*`, async (context, next) => {
117
+ context.header("cache-control", "no-store");
118
+ await next();
119
+ });
120
+
121
+ // The signed-in browser approves one device: same-origin, cookie-authenticated.
122
+ app.post(`${base}/authorize`, async (context) => {
123
+ const auth = deps.managedAuth;
124
+ if (!auth) throw new HTTPException(404);
125
+ await admitManagedSignInMutation(context, deps);
126
+ const actor = await requireCanonicalHumanRequestIdentity(context, {
127
+ db: deps.db,
128
+ managedAuth: auth,
129
+ managedAuthSessionAdapter: deps.managedAuthSessionAdapter,
130
+ managedAuthSessionSetMode: deps.settings.managedAuthSessionSetMode,
131
+ });
132
+ const parsed = AuthorizeBody.safeParse(await context.req.json().catch(() => null));
133
+ if (!parsed.success)
134
+ throw new HTTPException(400, { message: "Invalid native sign-in request" });
135
+ const body = parsed.data;
136
+ if (!nativeAppRedirectAllowed(body.redirectUri, deps.settings.nativeAppSchemes)) {
137
+ throw new HTTPException(400, { message: "Unregistered native app redirect" });
138
+ }
139
+ // The device session is bound to the same sign-in method as the approving
140
+ // browser session, so the canonical identity checks treat them alike.
141
+ const [approving] = await rows<{ loginBindingId: string | null }>(
142
+ deps,
143
+ sql`select login_binding_id as "loginBindingId" from auth_sessions
144
+ where id = ${actor.authSessionId} and user_id = ${actor.authUserId}`,
145
+ );
146
+ const projection = await getCanonicalHumanIdentityProjection(deps.db, actor.authUserId);
147
+ const binding = projection.loginBindings.find(
148
+ (candidate) => candidate.id === approving?.loginBindingId && candidate.status === "active",
149
+ );
150
+ const providerId = MANAGED_PROVIDERS.find((provider) => provider === binding?.providerId);
151
+ if (!providerId) throw new HTTPException(409, { message: "Sign-in method unavailable" });
152
+ const code = randomBytes(32).toString("base64url");
153
+ const context_ = await auth.$context;
154
+ await context_.internalAdapter.createVerificationValue({
155
+ identifier: codeIdentifier(code),
156
+ value: JSON.stringify(
157
+ StoredGrant.parse({
158
+ userId: actor.authUserId,
159
+ providerId,
160
+ redirectUri: body.redirectUri,
161
+ codeChallenge: body.codeChallenge,
162
+ platform: body.platform,
163
+ deviceName: body.deviceName ?? null,
164
+ }),
165
+ ),
166
+ expiresAt: new Date(Date.now() + NATIVE_APP_CODE_TTL_MS),
167
+ });
168
+ const redirect = new URL(body.redirectUri);
169
+ redirect.searchParams.set("code", code);
170
+ if (body.state) redirect.searchParams.set("state", body.state);
171
+ return context.json({ redirectUrl: redirect.toString() });
172
+ });
173
+
174
+ // The app redeems its single-use code with the PKCE verifier.
175
+ app.post(`${base}/token`, async (context) => {
176
+ const auth = deps.managedAuth;
177
+ if (!auth) throw new HTTPException(404);
178
+ const parsed = TokenBody.safeParse(await context.req.json().catch(() => null));
179
+ if (!parsed.success) return context.json({ error: "invalid_request" }, 400);
180
+ const body = parsed.data;
181
+ const authContext = await auth.$context;
182
+ const stored = await authContext.internalAdapter.consumeVerificationValue(
183
+ codeIdentifier(body.code),
184
+ );
185
+ if (!stored) return context.json({ error: "invalid_grant" }, 400);
186
+ let grant: z.infer<typeof StoredGrant>;
187
+ try {
188
+ grant = StoredGrant.parse(JSON.parse(stored.value));
189
+ } catch {
190
+ return context.json({ error: "invalid_grant" }, 400);
191
+ }
192
+ if (
193
+ !sameText(grant.redirectUri, body.redirectUri) ||
194
+ !sameText(grant.codeChallenge, pkceS256Challenge(body.codeVerifier))
195
+ ) {
196
+ return context.json({ error: "invalid_grant" }, 400);
197
+ }
198
+ const session = await runManagedAuthProvider(grant.providerId, () =>
199
+ authContext.internalAdapter.createSession(grant.userId, false, {
200
+ userAgent: nativeAppSessionUserAgent(grant.platform, grant.deviceName),
201
+ }),
202
+ );
203
+ if (!session?.token || new Date(session.expiresAt).getTime() <= Date.now()) {
204
+ return context.json({ error: "access_denied" }, 403);
205
+ }
206
+ return context.json({
207
+ accessToken: `${NATIVE_APP_CREDENTIAL_PREFIX}${session.token}`,
208
+ tokenType: "Bearer",
209
+ expiresAt: new Date(session.expiresAt).toISOString(),
210
+ });
211
+ });
212
+
213
+ // Sign the device out: revoke its own session only. Idempotent.
214
+ app.post(`${base}/sign-out`, async (context) => {
215
+ const auth = deps.managedAuth;
216
+ if (!auth) throw new HTTPException(404);
217
+ const credential = bearer(context.req.header("authorization"));
218
+ if (!credential?.startsWith(NATIVE_APP_CREDENTIAL_PREFIX)) {
219
+ throw new HTTPException(401, { message: "Native app credential required" });
220
+ }
221
+ const session = await getNativeAppManagedSession(auth, credential, deps.db).catch(() => null);
222
+ const authSessionId = session?.session?.id;
223
+ if (typeof authSessionId === "string") {
224
+ await deps.db.execute(sql`delete from auth_sessions where id = ${authSessionId}`);
225
+ }
226
+ return context.json({ signedOut: true });
227
+ });
228
+
229
+ // A desktop app shows the deployment's own web app. It signs that window in
230
+ // with the same device session, so the window is an ordinary first-party web
231
+ // session and signing the device out ends both. The bearer is required: an
232
+ // ambient browser request can never mint this cookie.
233
+ app.post(`${base}/web-session`, async (context) => {
234
+ const auth = deps.managedAuth;
235
+ if (!auth) throw new HTTPException(404);
236
+ if (deps.settings.managedAuthSessionSetMode === "broker") {
237
+ throw new HTTPException(409, {
238
+ message: "This deployment signs browser windows in through login session sets",
239
+ });
240
+ }
241
+ const credential = bearer(context.req.header("authorization"));
242
+ if (!credential?.startsWith(NATIVE_APP_CREDENTIAL_PREFIX)) {
243
+ throw new HTTPException(401, { message: "Native app credential required" });
244
+ }
245
+ const session = await getNativeAppManagedSession(auth, credential, deps.db).catch(() => null);
246
+ if (typeof session?.session?.id !== "string") {
247
+ throw new HTTPException(401, { message: "Sign in again" });
248
+ }
249
+ for (const cookie of await managedAuthSessionCookieHeaders(
250
+ auth,
251
+ credential.slice(NATIVE_APP_CREDENTIAL_PREFIX.length),
252
+ context.req.header("cookie") ?? null,
253
+ )) {
254
+ context.header("set-cookie", cookie, { append: true });
255
+ }
256
+ return context.json({ signedIn: true });
257
+ });
258
+
259
+ // Push registration belongs to the app session that registered it: signing
260
+ // the app out, or revoking its session anywhere, removes it.
261
+ const appSessionId = async (authorization: string | undefined): Promise<string> => {
262
+ const auth = deps.managedAuth;
263
+ if (!auth) throw new HTTPException(404);
264
+ const credential = bearer(authorization);
265
+ if (!credential?.startsWith(NATIVE_APP_CREDENTIAL_PREFIX)) {
266
+ throw new HTTPException(401, { message: "Native app credential required" });
267
+ }
268
+ const session = await getNativeAppManagedSession(auth, credential, deps.db).catch(() => null);
269
+ const id = session?.session?.id;
270
+ if (typeof id !== "string") throw new HTTPException(401, { message: "Sign in again" });
271
+ return id;
272
+ };
273
+
274
+ app.get(`${base}/push-device`, async (context) => {
275
+ const id = await appSessionId(context.req.header("authorization"));
276
+ return context.json({ device: await getNativePushDevice(deps.db, id) });
277
+ });
278
+
279
+ app.put(`${base}/push-device`, async (context) => {
280
+ const id = await appSessionId(context.req.header("authorization"));
281
+ const parsed = PushDeviceBody.safeParse(await context.req.json().catch(() => null));
282
+ if (!parsed.success) throw new HTTPException(400, { message: "Invalid push registration" });
283
+ if (!deps.settings.nativeAppIds.includes(parsed.data.appId)) {
284
+ throw new HTTPException(400, { message: "Unregistered native app" });
285
+ }
286
+ return context.json({
287
+ device: await registerNativePushDevice(deps.db, { authSessionId: id, ...parsed.data }),
288
+ });
289
+ });
290
+
291
+ app.delete(`${base}/push-device`, async (context) => {
292
+ const id = await appSessionId(context.req.header("authorization"));
293
+ await unregisterNativePushDevice(deps.db, id);
294
+ return context.json({ device: null });
295
+ });
296
+ }
@@ -0,0 +1,116 @@
1
+ import { UpdateOrganizationIntegrationPolicyRequest } from "@opengeni/contracts";
2
+ import {
3
+ accountScopedApiKeyWorkspaceAuthority,
4
+ organizationIntegrationCatalog,
5
+ requireAccessContext,
6
+ requireCanonicalLocalAccountAdministrator,
7
+ type ApiRouteDeps,
8
+ } from "@opengeni/core";
9
+ import {
10
+ getOrganizationIntegrationPolicy,
11
+ updateOrganizationIntegrationPolicy,
12
+ } from "@opengeni/db/organization-integration-policy";
13
+ import { nestedPostgresSqlState } from "@opengeni/db";
14
+ import type { Context, Hono } from "hono";
15
+ import { HTTPException } from "hono/http-exception";
16
+ import { z } from "zod";
17
+ import { agentActingAsPerson } from "../http/acting-person";
18
+ import { requireSameOriginBrowserMutation } from "./codex";
19
+ import { managedCookieHuman } from "./supergrok";
20
+
21
+ /** The database rechecks current organization membership/key authority at commit. */
22
+ export async function authorizeOrganizationIntegrationAdministration(
23
+ context: Context,
24
+ deps: ApiRouteDeps,
25
+ accountId: string,
26
+ mutation: boolean,
27
+ ): Promise<{ accountId: string; subjectId: string }> {
28
+ const access = await requireAccessContext(context, deps);
29
+ const service = accountScopedApiKeyWorkspaceAuthority(access);
30
+ if (service) {
31
+ if (service.accountId !== accountId || !service.permissions.includes("workspace:admin")) {
32
+ throw new HTTPException(403, { message: "Organization administration required" });
33
+ }
34
+ return { accountId, subjectId: access.subjectId };
35
+ }
36
+ if (deps.settings.productAccessMode === "local") {
37
+ const local = await requireCanonicalLocalAccountAdministrator(context, deps, accountId);
38
+ if (mutation) requireSameOriginBrowserMutation(context, deps);
39
+ return { accountId, subjectId: local.subjectId };
40
+ }
41
+ const human =
42
+ agentActingAsPerson(context, accountId, mutation ? "account:admin" : "account:read") ??
43
+ (await managedCookieHuman(context, deps));
44
+ if (!human || human.subjectId !== access.subjectId) {
45
+ throw new HTTPException(403, { message: "Organization administration required" });
46
+ }
47
+ if (mutation) requireSameOriginBrowserMutation(context, deps);
48
+ return { accountId, subjectId: human.subjectId };
49
+ }
50
+
51
+ async function policyResponse<T>(readOrWrite: () => Promise<T>): Promise<T> {
52
+ try {
53
+ return await readOrWrite();
54
+ } catch (error) {
55
+ if (error instanceof HTTPException) throw error;
56
+ const state = nestedPostgresSqlState(error);
57
+ if (state === "42501") {
58
+ throw new HTTPException(403, { message: "Organization administration required" });
59
+ }
60
+ if (state === "40001" || state === "23505") {
61
+ throw new HTTPException(409, {
62
+ message: "Integration policy changed; refresh before saving",
63
+ });
64
+ }
65
+ if (state === "22023") {
66
+ throw new HTTPException(422, { message: "Invalid integration policy" });
67
+ }
68
+ throw new HTTPException(503, { message: "Integration policy is temporarily unavailable" });
69
+ }
70
+ }
71
+
72
+ export function registerOrganizationIntegrationPolicyRoutes(app: Hono, deps: ApiRouteDeps): void {
73
+ const path = "/v1/organizations/:organizationId/integration-policy";
74
+ const organizationId = (context: Context) => {
75
+ const parsed = z.string().uuid().safeParse(context.req.param("organizationId"));
76
+ if (!parsed.success) throw new HTTPException(422, { message: "Invalid organization identity" });
77
+ return parsed.data.toLowerCase();
78
+ };
79
+ app.get(`${path}/catalog`, async (context) => {
80
+ const accountId = organizationId(context);
81
+ // The same live administration check as policy reads, including workspace-free service access.
82
+ await policyResponse(() =>
83
+ getOrganizationIntegrationPolicy(deps.db, { accountId }, () =>
84
+ authorizeOrganizationIntegrationAdministration(context, deps, accountId, false),
85
+ ),
86
+ );
87
+ context.header("cache-control", "private, no-store");
88
+ return context.json(organizationIntegrationCatalog());
89
+ });
90
+ app.get(path, async (context) => {
91
+ context.header("cache-control", "private, no-store");
92
+ const accountId = organizationId(context);
93
+ return context.json(
94
+ await policyResponse(() =>
95
+ getOrganizationIntegrationPolicy(deps.db, { accountId }, () =>
96
+ authorizeOrganizationIntegrationAdministration(context, deps, accountId, false),
97
+ ),
98
+ ),
99
+ );
100
+ });
101
+ app.put(path, async (context) => {
102
+ context.header("cache-control", "private, no-store");
103
+ const accountId = organizationId(context);
104
+ const parsed = UpdateOrganizationIntegrationPolicyRequest.safeParse(
105
+ await context.req.json().catch(() => null),
106
+ );
107
+ if (!parsed.success) throw new HTTPException(422, { message: "Invalid integration policy" });
108
+ return context.json(
109
+ await policyResponse(() =>
110
+ updateOrganizationIntegrationPolicy(deps.db, { accountId }, parsed.data, () =>
111
+ authorizeOrganizationIntegrationAdministration(context, deps, accountId, true),
112
+ ),
113
+ ),
114
+ );
115
+ });
116
+ }