@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,584 @@
1
+ import { createHash, randomBytes } from "node:crypto";
2
+ import {
3
+ parseSiteHostname,
4
+ SiteAuthAuthorizeRequest,
5
+ SiteLimitProfile,
6
+ SitePublishWarningFix,
7
+ siteHostname,
8
+ SiteTakedownRequest,
9
+ SITE_GATEWAY_CALLBACK_PATH,
10
+ UpsertSitePublicationRequest,
11
+ type SiteAbuseReport,
12
+ type SiteAuthAuthorizeResponse,
13
+ } from "@opengeni/contracts";
14
+ import {
15
+ getManagedSession,
16
+ hasLiteralPermission,
17
+ requireAccessContext,
18
+ requireAccessGrant,
19
+ type ApiRouteDeps,
20
+ } from "@opengeni/core";
21
+ import {
22
+ actionOpenSiteAbuseReports,
23
+ consumeSiteRuntimeRate,
24
+ createSiteAuthCode,
25
+ findSiteHostname,
26
+ getPublishedSite,
27
+ getSitePublication,
28
+ getWorkspaceSiteLimitProfile,
29
+ isSiteWorkspaceMember,
30
+ listSiteAbuseReports,
31
+ putWorkspaceSiteLimitProfile,
32
+ recordAuditEvent,
33
+ restoreSitePublication,
34
+ suspendSitePublication,
35
+ updateSiteAbuseReportStatus,
36
+ upsertSitePublication,
37
+ type SiteAbuseReportRecord,
38
+ } from "@opengeni/db";
39
+ import type { Context, Hono } from "hono";
40
+ import { z } from "zod";
41
+ import { isAgentActingAsPerson } from "../http/acting-person";
42
+ import {
43
+ effectiveSiteLimits,
44
+ siteLimitOverrides,
45
+ sourceSiteLimitProfile,
46
+ storedSiteLimitProfileKind,
47
+ } from "../site-publishing/limits";
48
+ import { readSitePlatformUsageView } from "../site-publishing/platform-usage";
49
+ import { applySitePublishWarningFix, SiteFixTargetMissing } from "../site-publishing/readiness";
50
+ import { SiteDataError } from "@opengeni/db";
51
+ import { SiteSqlError } from "../site-sql/service";
52
+ import { siteDataHttpError } from "./site-data";
53
+ import { siteSqlHttpError } from "./site-sql";
54
+ import {
55
+ requireSiteManager,
56
+ requireSitesDomain,
57
+ resolveSiteManagement,
58
+ runSitePublishing,
59
+ requireSitePublicationWriter,
60
+ scheduleSiteEdgeSync,
61
+ siteHostnameAvailability,
62
+ sitePublicationView,
63
+ sitePublishingError,
64
+ siteServable,
65
+ stopSiteViewers,
66
+ upsertSitePublicationForManager,
67
+ } from "../site-publishing/service";
68
+ import { effectiveSiteAccess, signedInSiteViewerKind } from "../site-publishing/viewer";
69
+ import { requireSameOriginBrowserMutation } from "./subscription-pool-access";
70
+
71
+ /** A one-time sign-in code lives this long. */
72
+ export const SITE_AUTH_CODE_TTL_SECONDS = 60;
73
+ /** Sign-in codes a person may mint per minute (per Site). */
74
+ const SIGN_IN_PER_MINUTE = 30;
75
+
76
+ const SiteIdParam = z.string().uuid();
77
+ const ReportIdParam = z.string().uuid();
78
+ const ReportStatusRequest = z.object({ status: z.enum(["open", "dismissed", "actioned"]) });
79
+
80
+ function invalid(message: string) {
81
+ return sitePublishingError(400, "validation_failed", "site_invalid_request", message);
82
+ }
83
+
84
+ async function body<S extends z.ZodType>(context: Context, schema: S): Promise<z.infer<S>> {
85
+ const parsed = schema.safeParse(await context.req.json().catch(() => null));
86
+ if (!parsed.success)
87
+ throw invalid(
88
+ parsed.error.issues
89
+ .slice(0, 3)
90
+ .map((issue) => `${issue.path.join(".") || "request"}: ${issue.message}`)
91
+ .join("; "),
92
+ );
93
+ return parsed.data;
94
+ }
95
+
96
+ function siteIdParam(context: Context): string {
97
+ const parsed = SiteIdParam.safeParse(context.req.param("artifactId"));
98
+ if (!parsed.success)
99
+ throw sitePublishingError(404, "not_found", "site_not_found", "Site not found");
100
+ return parsed.data;
101
+ }
102
+
103
+ function reportView(report: SiteAbuseReportRecord): SiteAbuseReport {
104
+ return {
105
+ id: report.id,
106
+ siteId: report.siteId,
107
+ hostname: report.hostname,
108
+ category: report.category as SiteAbuseReport["category"],
109
+ message: report.message,
110
+ contactEmail: report.contactEmail,
111
+ status: report.status,
112
+ createdAt: report.createdAt.toISOString(),
113
+ };
114
+ }
115
+
116
+ /** Machine and key principals never sign in to a Site; only people do. */
117
+ const NON_PERSON_SUBJECT = /^(site|agent|service|configured|schedule|guest):/u;
118
+
119
+ /**
120
+ * The person asking to sign in to a Site: the signed-in console user (a
121
+ * managed browser session, same-origin), or on deployments without managed
122
+ * sign-in a human context (an external user acting through the host). API
123
+ * keys, agents and service principals are refused. Only a verified email
124
+ * counts for invitations.
125
+ */
126
+ async function siteAuthPerson(
127
+ context: Context,
128
+ deps: ApiRouteDeps,
129
+ ): Promise<{ subjectId: string; email: string | null; name: string | null }> {
130
+ if (
131
+ deps.settings.productAccessMode === "managed" &&
132
+ deps.managedAuth &&
133
+ context.req.header("cookie") &&
134
+ !context.req.header("authorization")
135
+ ) {
136
+ requireSameOriginBrowserMutation(context, deps);
137
+ const session = await getManagedSession(context, deps.managedAuth, {
138
+ db: deps.db,
139
+ sessionAdapter: deps.managedAuthSessionAdapter,
140
+ sessionSetMode: deps.settings.managedAuthSessionSetMode,
141
+ });
142
+ if (!session?.user?.id)
143
+ throw sitePublishingError(401, "unauthenticated", "site_sign_in_required", "Sign in first");
144
+ const user = session.user as {
145
+ id: string;
146
+ email?: string;
147
+ emailVerified?: boolean;
148
+ name?: string;
149
+ };
150
+ return {
151
+ subjectId: `user:${user.id}`,
152
+ email: user.emailVerified === true && user.email ? user.email.toLowerCase() : null,
153
+ name: user.name?.trim() || null,
154
+ };
155
+ }
156
+ const access = await requireAccessContext(context, deps);
157
+ if (
158
+ access.credential !== undefined ||
159
+ isAgentActingAsPerson(context) ||
160
+ NON_PERSON_SUBJECT.test(access.subjectId) ||
161
+ access.workspaceGrants.some(
162
+ (grant) => grant.principalKind !== undefined && grant.principalKind !== "human_session",
163
+ )
164
+ )
165
+ throw sitePublishingError(
166
+ 403,
167
+ "forbidden",
168
+ "site_person_required",
169
+ "Only a signed-in person can sign in to a Site",
170
+ );
171
+ return { subjectId: access.subjectId, email: null, name: access.subjectLabel?.trim() || null };
172
+ }
173
+
174
+ export function registerSitePublishingRoutes(app: Hono, deps: ApiRouteDeps): void {
175
+ const base = "/v1/workspaces/:workspaceId/published-artifacts/:artifactId/publication";
176
+ const grantFor = (context: Context, permission: "artifacts:read" | "artifacts:publish") =>
177
+ requireAccessGrant(context, deps, context.req.param("workspaceId")!, permission);
178
+
179
+ app.get(base, async (context) => {
180
+ requireSitesDomain(deps.settings);
181
+ const grant = await grantFor(context, "artifacts:read");
182
+ const management = await resolveSiteManagement(deps, grant, siteIdParam(context));
183
+ requireSiteManager(management);
184
+ const publication = await getSitePublication(deps.db, management.scope, management.record.id);
185
+ if (!publication)
186
+ throw sitePublishingError(
187
+ 404,
188
+ "not_found",
189
+ "site_not_published",
190
+ "This Site is not published",
191
+ );
192
+ return context.json(await sitePublicationView(deps, management.scope, publication));
193
+ });
194
+
195
+ app.put(base, async (context) => {
196
+ requireSitesDomain(deps.settings);
197
+ const grant = await grantFor(context, "artifacts:publish");
198
+ const request = await body(context, UpsertSitePublicationRequest);
199
+ const management = await resolveSiteManagement(deps, grant, siteIdParam(context), {
200
+ mutate: true,
201
+ });
202
+ const result = await runSitePublishing(() =>
203
+ upsertSitePublicationForManager(deps, grant, management, request),
204
+ );
205
+ return context.json(result.publication, result.created ? 201 : 200);
206
+ });
207
+
208
+ /**
209
+ * Apply a readiness warning's safe fix (a collection's guest access or a
210
+ * query's audience), then answer the publication with fresh warnings.
211
+ */
212
+ app.post(`${base}/fixes`, async (context) => {
213
+ requireSitesDomain(deps.settings);
214
+ const grant = await grantFor(context, "artifacts:publish");
215
+ const fix = await body(context, SitePublishWarningFix);
216
+ const management = await resolveSiteManagement(deps, grant, siteIdParam(context), {
217
+ mutate: true,
218
+ });
219
+ requireSiteManager(management);
220
+ const publication = await getSitePublication(deps.db, management.scope, management.record.id);
221
+ if (!publication)
222
+ throw sitePublishingError(
223
+ 404,
224
+ "not_found",
225
+ "site_not_published",
226
+ "This Site is not published",
227
+ );
228
+ try {
229
+ await applySitePublishWarningFix(deps, grant, management.scope, management.record.id, fix);
230
+ } catch (error) {
231
+ if (error instanceof SiteFixTargetMissing)
232
+ throw sitePublishingError(404, "not_found", "site_fix_target_missing", error.message);
233
+ if (error instanceof SiteDataError) throw siteDataHttpError(error);
234
+ if (error instanceof SiteSqlError) throw siteSqlHttpError(error);
235
+ throw error;
236
+ }
237
+ return context.json(await sitePublicationView(deps, management.scope, publication));
238
+ });
239
+
240
+ // Unpublish: the Site stops being served; its hostname stays with it.
241
+ app.delete(base, async (context) => {
242
+ requireSitesDomain(deps.settings);
243
+ const grant = await grantFor(context, "artifacts:publish");
244
+ const management = await resolveSiteManagement(deps, grant, siteIdParam(context), {
245
+ mutate: true,
246
+ });
247
+ requireSiteManager(management);
248
+ const existing = await getSitePublication(deps.db, management.scope, management.record.id);
249
+ if (!existing)
250
+ throw sitePublishingError(
251
+ 404,
252
+ "not_found",
253
+ "site_not_published",
254
+ "This Site is not published",
255
+ );
256
+ if (existing.status === "suspended")
257
+ throw sitePublishingError(
258
+ 409,
259
+ "conflict",
260
+ "site_suspended",
261
+ "This Site was taken down; restore it first",
262
+ );
263
+ const result = await runSitePublishing(() =>
264
+ upsertSitePublication(deps.db, management.scope, {
265
+ siteId: management.record.id,
266
+ defaultLabel: existing.label,
267
+ changes: { status: "unpublished" },
268
+ actor: grant.subjectId,
269
+ holdDays: deps.settings.sitesHostnameHoldDays,
270
+ defaults: { access: existing.access, noindex: existing.noindex },
271
+ }),
272
+ );
273
+ if (existing.status === "active")
274
+ await stopSiteViewers(deps, management.scope, management.record.id, {
275
+ reason: "unpublished",
276
+ });
277
+ scheduleSiteEdgeSync(deps, [result.publication.label], {
278
+ siteIdHint: management.record.id,
279
+ purge: true,
280
+ });
281
+ return context.json(await sitePublicationView(deps, management.scope, result.publication));
282
+ });
283
+
284
+ // Take a Site down at once: the Site's owner or a workspace admin.
285
+ app.post(`${base}/takedown`, async (context) => {
286
+ requireSitesDomain(deps.settings);
287
+ const grant = await grantFor(context, "artifacts:publish");
288
+ const request = await body(context, SiteTakedownRequest);
289
+ const management = await resolveSiteManagement(deps, grant, siteIdParam(context), {
290
+ mutate: true,
291
+ });
292
+ if (!management.owner && !management.admin)
293
+ throw sitePublishingError(
294
+ 403,
295
+ "forbidden",
296
+ "site_owner_or_admin_required",
297
+ "Only the Site's owner or a workspace admin can take it down",
298
+ );
299
+ // An admin's takedown (even of their own Site) is one only an admin restores.
300
+ const by = management.admin ? "admin" : "owner";
301
+ const publication = await runSitePublishing(() =>
302
+ suspendSitePublication(deps.db, management.scope, management.record.id, {
303
+ by,
304
+ reason: request.reason,
305
+ subject: grant.subjectId,
306
+ }),
307
+ );
308
+ await actionOpenSiteAbuseReports(deps.db, management.scope, {
309
+ siteId: management.record.id,
310
+ actor: grant.subjectId,
311
+ });
312
+ await recordAuditEvent(deps.db, {
313
+ accountId: grant.accountId,
314
+ workspaceId: grant.workspaceId,
315
+ subjectId: grant.subjectId,
316
+ action: "site.publication.takedown",
317
+ targetType: "site",
318
+ targetId: management.record.id,
319
+ metadata: { by, label: publication.label, reason: request.reason.slice(0, 2000) },
320
+ });
321
+ await stopSiteViewers(deps, management.scope, management.record.id, { reason: "takedown" });
322
+ scheduleSiteEdgeSync(deps, [publication.label], {
323
+ siteIdHint: management.record.id,
324
+ purge: true,
325
+ });
326
+ return context.json(await sitePublicationView(deps, management.scope, publication));
327
+ });
328
+
329
+ app.post(`${base}/restore`, async (context) => {
330
+ requireSitesDomain(deps.settings);
331
+ const grant = await grantFor(context, "artifacts:publish");
332
+ const management = await resolveSiteManagement(deps, grant, siteIdParam(context), {
333
+ mutate: true,
334
+ });
335
+ if (!management.owner && !management.admin)
336
+ throw sitePublishingError(
337
+ 403,
338
+ "forbidden",
339
+ "site_owner_or_admin_required",
340
+ "Only the Site's owner or a workspace admin can restore it",
341
+ );
342
+ // An owner cannot lift an admin's takedown (the database refuses it too).
343
+ const by = management.admin ? "admin" : "owner";
344
+ const publication = await runSitePublishing(() =>
345
+ restoreSitePublication(deps.db, management.scope, management.record.id, {
346
+ by,
347
+ subject: grant.subjectId,
348
+ }),
349
+ );
350
+ await recordAuditEvent(deps.db, {
351
+ accountId: grant.accountId,
352
+ workspaceId: grant.workspaceId,
353
+ subjectId: grant.subjectId,
354
+ action: "site.publication.restore",
355
+ targetType: "site",
356
+ targetId: management.record.id,
357
+ metadata: { by, label: publication.label },
358
+ });
359
+ scheduleSiteEdgeSync(deps, [publication.label], {
360
+ siteIdHint: management.record.id,
361
+ purge: true,
362
+ });
363
+ return context.json(await sitePublicationView(deps, management.scope, publication));
364
+ });
365
+
366
+ app.get(`${base}/reports`, async (context) => {
367
+ requireSitesDomain(deps.settings);
368
+ const grant = await grantFor(context, "artifacts:read");
369
+ const management = await resolveSiteManagement(deps, grant, siteIdParam(context));
370
+ requireSiteManager(management);
371
+ const status = z
372
+ .enum(["open", "dismissed", "actioned"])
373
+ .optional()
374
+ .safeParse(context.req.query("status") || undefined);
375
+ if (!status.success) throw invalid("status must be open, dismissed or actioned");
376
+ const reports = await listSiteAbuseReports(deps.db, management.scope, {
377
+ siteId: management.record.id,
378
+ ...(status.data ? { status: status.data } : {}),
379
+ limit: 100,
380
+ });
381
+ return context.json({ reports: reports.map(reportView) });
382
+ });
383
+
384
+ app.patch(`${base}/reports/:reportId`, async (context) => {
385
+ requireSitesDomain(deps.settings);
386
+ const grant = await grantFor(context, "artifacts:publish");
387
+ const request = await body(context, ReportStatusRequest);
388
+ const management = await resolveSiteManagement(deps, grant, siteIdParam(context), {
389
+ mutate: true,
390
+ });
391
+ requireSiteManager(management);
392
+ const reportId = ReportIdParam.safeParse(context.req.param("reportId"));
393
+ const report = reportId.success
394
+ ? await updateSiteAbuseReportStatus(deps.db, management.scope, {
395
+ siteId: management.record.id,
396
+ reportId: reportId.data,
397
+ status: request.status,
398
+ actor: grant.subjectId,
399
+ })
400
+ : null;
401
+ if (!report)
402
+ throw sitePublishingError(404, "not_found", "site_report_not_found", "Report not found");
403
+ return context.json(reportView(report));
404
+ });
405
+
406
+ app.get("/v1/workspaces/:workspaceId/site-hostnames/:label", async (context) => {
407
+ requireSitesDomain(deps.settings);
408
+ const grant = await grantFor(context, "artifacts:read");
409
+ const siteId = context.req.query("siteId");
410
+ if (siteId !== undefined && !SiteIdParam.safeParse(siteId).success)
411
+ throw invalid("siteId must be a Site id");
412
+ const label = (context.req.param("label") ?? "").toLowerCase();
413
+ return context.json(
414
+ await siteHostnameAvailability(
415
+ deps,
416
+ { accountId: grant.accountId, workspaceId: grant.workspaceId },
417
+ label,
418
+ siteId ?? null,
419
+ ),
420
+ );
421
+ });
422
+
423
+ /**
424
+ * This month's Site platform usage of the workspace (gateway requests,
425
+ * Site SQL rows and storage, Site Data storage) against its allowance, and
426
+ * the Opengeni-wide brake state.
427
+ */
428
+ app.get("/v1/workspaces/:workspaceId/site-platform-usage", async (context) => {
429
+ requireSitesDomain(deps.settings);
430
+ const grant = await requireAccessGrant(
431
+ context,
432
+ deps,
433
+ context.req.param("workspaceId")!,
434
+ "workspace:read",
435
+ );
436
+ return context.json(
437
+ await readSitePlatformUsageView(deps, {
438
+ accountId: grant.accountId,
439
+ workspaceId: grant.workspaceId,
440
+ }),
441
+ );
442
+ });
443
+
444
+ // The workspace's default limit profile for its published Sites.
445
+ app.get("/v1/workspaces/:workspaceId/site-limit-profile", async (context) => {
446
+ requireSitesDomain(deps.settings);
447
+ const grant = await requireAccessGrant(
448
+ context,
449
+ deps,
450
+ context.req.param("workspaceId")!,
451
+ "workspace:read",
452
+ );
453
+ const stored = await getWorkspaceSiteLimitProfile(deps.db, {
454
+ accountId: grant.accountId,
455
+ workspaceId: grant.workspaceId,
456
+ });
457
+ return context.json({
458
+ profile: sourceSiteLimitProfile(null, stored),
459
+ effectiveLimits: effectiveSiteLimits(deps.settings, null, stored),
460
+ });
461
+ });
462
+
463
+ app.put("/v1/workspaces/:workspaceId/site-limit-profile", async (context) => {
464
+ requireSitesDomain(deps.settings);
465
+ const grant = await requireAccessGrant(
466
+ context,
467
+ deps,
468
+ context.req.param("workspaceId")!,
469
+ "workspace:admin",
470
+ );
471
+ if (!hasLiteralPermission(grant.permissions, "workspace:admin"))
472
+ throw sitePublishingError(
473
+ 403,
474
+ "forbidden",
475
+ "site_admin_required",
476
+ "Only a workspace admin can change Site limits",
477
+ );
478
+ await requireSitePublicationWriter(deps, grant);
479
+ const request = await body(context, SiteLimitProfile);
480
+ const stored = await putWorkspaceSiteLimitProfile(
481
+ deps.db,
482
+ { accountId: grant.accountId, workspaceId: grant.workspaceId },
483
+ {
484
+ kind: storedSiteLimitProfileKind(request.kind),
485
+ overrides:
486
+ request.kind === "custom"
487
+ ? (siteLimitOverrides(request.overrides as Record<string, unknown> | null) as Record<
488
+ string,
489
+ unknown
490
+ >)
491
+ : null,
492
+ },
493
+ grant.subjectId,
494
+ );
495
+ await recordAuditEvent(deps.db, {
496
+ accountId: grant.accountId,
497
+ workspaceId: grant.workspaceId,
498
+ subjectId: grant.subjectId,
499
+ action: "site.limit_profile.update",
500
+ targetType: "workspace",
501
+ targetId: grant.workspaceId,
502
+ metadata: { kind: stored.kind },
503
+ });
504
+ return context.json({
505
+ profile: sourceSiteLimitProfile(null, stored),
506
+ effectiveLimits: effectiveSiteLimits(deps.settings, null, stored),
507
+ });
508
+ });
509
+
510
+ /**
511
+ * Viewer sign-in, step one: the signed-in person on the console's
512
+ * `/site-auth/authorize` page asks for a one-time code for a Site host. The
513
+ * API checks the Site admits them, then binds a 60 s single-use code to the
514
+ * host, the PKCE challenge, the exact redirect and the person.
515
+ */
516
+ app.post("/v1/site-auth/authorize", async (context) => {
517
+ const domain = requireSitesDomain(deps.settings);
518
+ const request = await body(context, SiteAuthAuthorizeRequest);
519
+ const person = await siteAuthPerson(context, deps);
520
+ const notFound = () =>
521
+ sitePublishingError(404, "not_found", "site_not_found", "This Site is not available");
522
+ const label = parseSiteHostname(request.host, domain);
523
+ if (!label) throw notFound();
524
+ const hostname = siteHostname(label, domain);
525
+ const record = await findSiteHostname(deps.db, label);
526
+ if (!record || record.releasedAt !== null) throw notFound();
527
+ const scope = { accountId: record.accountId, workspaceId: record.workspaceId };
528
+ const [publication, site] = await Promise.all([
529
+ getSitePublication(deps.db, scope, record.siteId),
530
+ getPublishedSite(deps.db, scope, record.siteId),
531
+ ]);
532
+ if (!publication || !site || publication.status !== "active" || !siteServable(site))
533
+ throw notFound();
534
+ if (request.redirectUri !== `https://${hostname}${SITE_GATEWAY_CALLBACK_PATH}`)
535
+ throw invalid("redirectUri must be this Site's sign-in callback");
536
+ const kind = signedInSiteViewerKind({
537
+ access: effectiveSiteAccess(publication.access, deps.settings),
538
+ member: await isSiteWorkspaceMember(deps.db, scope, person.subjectId),
539
+ email: person.email,
540
+ invitedEmails: publication.invitedEmails,
541
+ });
542
+ if (!kind)
543
+ throw sitePublishingError(
544
+ 403,
545
+ "forbidden",
546
+ "site_access_denied",
547
+ "You do not have access to this Site",
548
+ );
549
+ const rate = await consumeSiteRuntimeRate(deps.db, scope, {
550
+ siteId: site.id,
551
+ principal: person.subjectId,
552
+ bucket: "sign_in",
553
+ limit: SIGN_IN_PER_MINUTE,
554
+ });
555
+ if (!rate.allowed) {
556
+ context.header("retry-after", String(rate.retryAfterSeconds));
557
+ throw sitePublishingError(429, "limit_exceeded", "site_rate_limited", "Try again shortly", {
558
+ retryAfterSeconds: rate.retryAfterSeconds,
559
+ });
560
+ }
561
+ const code = randomBytes(32).toString("base64url");
562
+ await createSiteAuthCode(deps.db, scope, {
563
+ siteId: site.id,
564
+ codeHash: createHash("sha256").update(code).digest("hex"),
565
+ hostname,
566
+ codeChallenge: request.codeChallenge,
567
+ redirectUri: request.redirectUri,
568
+ subjectId: person.subjectId,
569
+ kind,
570
+ email: person.email,
571
+ displayName: person.name,
572
+ ttlSeconds: SITE_AUTH_CODE_TTL_SECONDS,
573
+ });
574
+ const redirect = new URL(request.redirectUri);
575
+ redirect.searchParams.set("code", code);
576
+ redirect.searchParams.set("state", request.state);
577
+ context.header("cache-control", "no-store");
578
+ const response: SiteAuthAuthorizeResponse = {
579
+ redirectTo: redirect.toString(),
580
+ site: { title: site.title, hostname },
581
+ };
582
+ return context.json(response);
583
+ });
584
+ }