@opengeni/api-router 3.0.1 → 3.0.2-canary.38894290271001

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-AJ62T5QN.js → chunk-GBUJ2DYZ.js} +80507 -39878
  21. package/dist/chunk-GBUJ2DYZ.js.map +1 -0
  22. package/dist/chunk-OGQDXVXY.js +18 -0
  23. package/dist/chunk-OGQDXVXY.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 +150 -49
  466. package/src/sandbox/enrollment.ts +131 -22
  467. package/src/sandbox/machine-audience.ts +192 -0
  468. package/src/sandbox/machines.ts +75 -31
  469. package/src/sandbox/metrics-ingestion.ts +133 -2
  470. package/src/sandbox/rematerialize.ts +51 -21
  471. package/src/sandbox/screen-control.ts +289 -0
  472. package/src/sandbox/viewer.ts +33 -58
  473. package/src/sandbox-file-artifacts.ts +53 -27
  474. package/src/scheduled-task-blockers.ts +293 -0
  475. package/src/scheduled-task-deletion.ts +13 -3
  476. package/src/scheduled-task-lifecycle.ts +84 -0
  477. package/src/secret-answers.ts +119 -0
  478. package/src/session-create-observability.ts +46 -0
  479. package/src/session-realtime-context.ts +26 -4
  480. package/src/signed-state-secret.ts +58 -0
  481. package/src/site-agent-guard.ts +261 -0
  482. package/src/site-data/operations.ts +777 -0
  483. package/src/site-data/service.ts +1043 -0
  484. package/src/site-frame-guard.ts +107 -0
  485. package/src/site-publishing/agent-data-tools.ts +250 -0
  486. package/src/site-publishing/agent-model.ts +127 -0
  487. package/src/site-publishing/agent-session.ts +148 -0
  488. package/src/site-publishing/content-scanner.ts +93 -0
  489. package/src/site-publishing/edge-sync.ts +148 -0
  490. package/src/site-publishing/gateway-signature.ts +198 -0
  491. package/src/site-publishing/limits.ts +315 -0
  492. package/src/site-publishing/page-tool-authority.ts +111 -0
  493. package/src/site-publishing/platform-usage.ts +479 -0
  494. package/src/site-publishing/platform.ts +98 -0
  495. package/src/site-publishing/readiness.ts +330 -0
  496. package/src/site-publishing/runtime.ts +831 -0
  497. package/src/site-publishing/service.ts +1282 -0
  498. package/src/site-publishing/session-events.ts +262 -0
  499. package/src/site-publishing/session-views.ts +262 -0
  500. package/src/site-publishing/viewer.ts +75 -0
  501. package/src/site-session-origin.ts +91 -6
  502. package/src/site-sql/format.ts +134 -0
  503. package/src/site-sql/gateway.ts +168 -0
  504. package/src/site-sql/service.ts +1636 -0
  505. package/src/site-uploads.ts +27 -5
  506. package/src/temporal-schedule-sync.ts +74 -0
  507. package/src/transcription/billing-refusal.ts +14 -0
  508. package/src/transcription/normalize.ts +77 -0
  509. package/src/transcription/providers/azure-mai.ts +98 -0
  510. package/src/transcription/providers/azure-openai.ts +16 -7
  511. package/src/transcription/providers/codex-subscription.ts +190 -67
  512. package/src/transcription/providers/openai.ts +79 -5
  513. package/src/transcription/providers/subscription-core.ts +125 -0
  514. package/src/transcription/providers/xai-subscription.ts +81 -83
  515. package/src/transcription/segmenter.ts +7 -1
  516. package/src/transcription/service.ts +239 -10
  517. package/src/transcription/wav-duration.ts +39 -0
  518. package/src/workspace-deletion.ts +25 -1
  519. package/src/workspace-tool-gateway-attestations.ts +133 -0
  520. package/src/workspace-tool-gateway-observability.ts +64 -0
  521. package/src/workspace-tool-gateway-secrets.ts +104 -0
  522. package/src/workspace-tool-gateway.ts +921 -103
  523. package/src/workspace-tool-target-fence.ts +380 -0
  524. package/src/workspace-tool-target.ts +554 -0
  525. package/src/workspace-webhook-dispatch.ts +225 -0
  526. package/src/xai-realtime.ts +85 -81
  527. package/src/xai-subscription-core.ts +172 -0
  528. package/dist/browser-auth-broker.d.ts +0 -20
  529. package/dist/chunk-AJ62T5QN.js.map +0 -1
  530. package/dist/connection-authority-owner.d.ts +0 -59
  531. package/dist/routes/connection-authorities.d.ts +0 -3
  532. package/dist/routes/environments.d.ts +0 -5
  533. package/dist/routes/host-mcp-bindings.d.ts +0 -5
  534. package/dist/routes/host-mcp-resolvers.d.ts +0 -3
  535. package/dist/routes/packs.d.ts +0 -3
  536. package/dist/session-event-view-MU3HMNV3.js +0 -264
  537. package/dist/session-event-view-MU3HMNV3.js.map +0 -1
  538. package/dist/xai-subscription-auth.d.ts +0 -23
  539. package/src/browser-auth-broker.ts +0 -155
  540. package/src/connection-authority-owner.ts +0 -61
  541. package/src/routes/connection-authorities.ts +0 -139
  542. package/src/routes/environments.ts +0 -388
  543. package/src/routes/host-mcp-bindings.ts +0 -122
  544. package/src/routes/host-mcp-resolvers.ts +0 -41
  545. package/src/routes/packs.ts +0 -784
  546. package/src/xai-subscription-auth.ts +0 -139
@@ -1,16 +1,39 @@
1
+ import type { AccessGrant } from "@opengeni/contracts";
2
+ import { SITE_PREVIEW_FRAME, type SiteFrameHeaders } from "@opengeni/contracts/site-session-http";
1
3
  import { getWorkspaceSiteSessionOrigin, WorkspaceArtifactNotFoundError } from "@opengeni/db";
2
- import type { ApiRouteDeps } from "@opengeni/core";
4
+ import {
5
+ currentSiteSessionOrigin,
6
+ siteViewerForGrant,
7
+ withSiteSessionOrigin,
8
+ type ApiRouteDeps,
9
+ type SiteSessionOrigin,
10
+ } from "@opengeni/core";
3
11
  import { HTTPException } from "hono/http-exception";
4
12
  import { z } from "zod";
5
13
 
6
- /** Validates a caller-asserted Site association, not browser execution or authority. */
14
+ const FRAME_ID = /^[A-Za-z0-9_-]{1,64}$/u;
15
+
16
+ /** The host-set frame marker and per-frame id a Site request carried. */
17
+ export type SiteFrameMarker = {
18
+ marker?: string | null | undefined;
19
+ frameId?: string | null | undefined;
20
+ };
21
+
22
+ /**
23
+ * Validates a host-asserted Site association, not browser execution or
24
+ * authority. A published Site (id and version) must be visible to the caller.
25
+ * A request carrying only the host's frame marker came from a frame without a
26
+ * published Site (inline HTML, a Codemode preview): it is recorded as that
27
+ * frame (`siteId: null`, `frame`, `frameId`), never as a published Site.
28
+ */
7
29
  export async function resolveSiteSessionOrigin(
8
30
  db: ApiRouteDeps["db"],
9
- workspaceId: string,
31
+ grant: AccessGrant,
10
32
  siteId?: string,
11
33
  versionId?: string,
12
- ) {
13
- if (!siteId && !versionId) return null;
34
+ frame?: SiteFrameMarker,
35
+ ): Promise<SiteSessionOrigin | null> {
36
+ if (!siteId && !versionId) return frameOnlyOrigin(frame);
14
37
  if (
15
38
  !z.string().uuid().safeParse(siteId).success ||
16
39
  !z.string().uuid().safeParse(versionId).success
@@ -19,10 +42,72 @@ export async function resolveSiteSessionOrigin(
19
42
  try {
20
43
  // Provenance is not a live-version fence: a response-loss retry still belongs
21
44
  // to the same Site after it publishes a new version or is archived.
22
- return await getWorkspaceSiteSessionOrigin(db, workspaceId, siteId!, versionId!);
45
+ const origin = await getWorkspaceSiteSessionOrigin(
46
+ db,
47
+ grant.workspaceId,
48
+ await siteViewerForGrant(db, grant),
49
+ siteId!,
50
+ versionId!,
51
+ );
52
+ // Absence is reported by the not-found error; a fixture database may answer null.
53
+ return origin ? { siteId: origin.siteId, title: origin.title, versionId: versionId! } : null;
23
54
  } catch (error) {
24
55
  if (error instanceof WorkspaceArtifactNotFoundError)
25
56
  throw new HTTPException(404, { message: "Site origin not found" });
26
57
  throw error;
27
58
  }
28
59
  }
60
+
61
+ function frameOnlyOrigin(frame: SiteFrameMarker | undefined): SiteSessionOrigin | null {
62
+ if (!frame?.marker) return null;
63
+ const frameId = frame.frameId && FRAME_ID.test(frame.frameId) ? frame.frameId : undefined;
64
+ return {
65
+ siteId: null,
66
+ title: "",
67
+ frame: frame.marker === SITE_PREVIEW_FRAME ? "preview" : "inline",
68
+ ...(frameId ? { frameId } : {}),
69
+ };
70
+ }
71
+
72
+ /**
73
+ * The strict origin of a request a host marked as coming from a Site frame:
74
+ * an unverifiable published Site fails the request (400/404) instead of
75
+ * running it without provenance.
76
+ */
77
+ export async function resolveSiteRequestOrigin(
78
+ db: ApiRouteDeps["db"],
79
+ grant: AccessGrant,
80
+ frame: SiteFrameHeaders,
81
+ ): Promise<SiteSessionOrigin> {
82
+ const origin = await resolveSiteSessionOrigin(
83
+ db,
84
+ grant,
85
+ frame.siteId ?? undefined,
86
+ frame.versionId ?? undefined,
87
+ { marker: frame.marker ?? "1", frameId: frame.frameId },
88
+ );
89
+ // Unreachable: a frame always resolves to a published Site or a frame origin.
90
+ if (!origin) throw new HTTPException(400, { message: "Invalid Site origin" });
91
+ return origin;
92
+ }
93
+
94
+ /**
95
+ * Run a follow-up command (Send or Steer) inside the request's Site scope when
96
+ * the published Site bridge supplied a valid origin, so its turn records the
97
+ * `site` surface. Provenance only: a missing or unverifiable origin leaves the
98
+ * command unscoped instead of rejecting a message that is otherwise valid.
99
+ * Requests a host marked as Site frames already run inside their validated
100
+ * origin (apps/api/src/site-frame-guard.ts), which this keeps.
101
+ */
102
+ export async function withOptionalSiteCommandOrigin<T>(
103
+ db: ApiRouteDeps["db"],
104
+ grant: AccessGrant,
105
+ siteId: string | undefined,
106
+ versionId: string | undefined,
107
+ run: () => Promise<T>,
108
+ ): Promise<T> {
109
+ if (currentSiteSessionOrigin()) return await run();
110
+ if (!siteId && !versionId) return await run();
111
+ const origin = await resolveSiteSessionOrigin(db, grant, siteId, versionId).catch(() => null);
112
+ return origin ? await withSiteSessionOrigin(origin, run) : await run();
113
+ }
@@ -0,0 +1,134 @@
1
+ import {
2
+ quoteSiteSqlIdentifier,
3
+ type SiteDbSchemaEntry,
4
+ type SiteSqlValue,
5
+ } from "@opengeni/contracts";
6
+ import { siteDataCsvCell } from "../site-data/operations";
7
+
8
+ /**
9
+ * Site SQL export and import formats, so a Site's data can always leave
10
+ * Cloudflare: a SQL dump (schema, then INSERT statements), CSV for one table,
11
+ * and JSON rows per table. Blobs travel as `{ "$base64": "..." }` in JSON,
12
+ * X'..' literals in SQL and base64 text in CSV. SQL and JSON keep every value
13
+ * as stored; CSV turns every value into text (an empty cell is NULL on
14
+ * import) and blobs into base64.
15
+ */
16
+
17
+ export type SiteSqlExportTable = { name: string; columns: string[]; rows: unknown[][] };
18
+
19
+ /** Rows per INSERT statement of a SQL dump. */
20
+ export const SITE_SQL_INSERT_ROWS = 500;
21
+ /**
22
+ * Most bytes per INSERT statement of a SQL dump: Durable Object SQLite
23
+ * refuses statements over 100 KB. A single row past this still gets its own
24
+ * statement (and needs a JSON import to load back).
25
+ */
26
+ export const SITE_SQL_INSERT_BYTES = 90_000;
27
+
28
+ function isBlob(value: unknown): value is { $base64: string } {
29
+ return (
30
+ typeof value === "object" &&
31
+ value !== null &&
32
+ typeof (value as { $base64?: unknown }).$base64 === "string"
33
+ );
34
+ }
35
+
36
+ /** One value as a SQLite literal. */
37
+ export function siteSqlLiteral(value: unknown): string {
38
+ if (value === null || value === undefined) return "NULL";
39
+ if (typeof value === "number") return Number.isFinite(value) ? String(value) : "NULL";
40
+ if (typeof value === "bigint") return value.toString();
41
+ if (typeof value === "boolean") return value ? "1" : "0";
42
+ if (isBlob(value)) return `X'${Buffer.from(value.$base64, "base64").toString("hex")}'`;
43
+ const text = typeof value === "string" ? value : JSON.stringify(value);
44
+ return `'${text.replaceAll("'", "''")}'`;
45
+ }
46
+
47
+ /** Schema entries that belong to one table (its own entry, its indexes and triggers), or all. */
48
+ export function siteSqlSchemaEntries(
49
+ schema: readonly SiteDbSchemaEntry[],
50
+ table?: string,
51
+ ): SiteDbSchemaEntry[] {
52
+ return table === undefined ? [...schema] : schema.filter((entry) => entry.table === table);
53
+ }
54
+
55
+ /** The schema statements of a dump, tables first, each ending with a semicolon. */
56
+ export function siteSqlSchemaStatements(schema: readonly SiteDbSchemaEntry[]): string[] {
57
+ const order = { table: 0, view: 1, index: 2, trigger: 3 } as const;
58
+ return [...schema]
59
+ .filter((entry) => entry.sql)
60
+ .sort((a, b) => order[a.type] - order[b.type])
61
+ .map((entry) => `${entry.sql!.trim().replace(/;+$/u, "")};`);
62
+ }
63
+
64
+ /**
65
+ * INSERT statements for one exported page of a table: up to
66
+ * SITE_SQL_INSERT_ROWS rows and SITE_SQL_INSERT_BYTES bytes each, one
67
+ * statement per line.
68
+ */
69
+ export function siteSqlInsertStatements(table: SiteSqlExportTable): string[] {
70
+ if (table.rows.length === 0) return [];
71
+ const columns = table.columns.map(quoteSiteSqlIdentifier).join(", ");
72
+ const head = `INSERT INTO ${quoteSiteSqlIdentifier(table.name)} (${columns}) VALUES `;
73
+ const headBytes = Buffer.byteLength(head, "utf8") + 1;
74
+ const statements: string[] = [];
75
+ let tuples: string[] = [];
76
+ let bytes = headBytes;
77
+ for (const row of table.rows) {
78
+ const tuple = `(${row.map(siteSqlLiteral).join(", ")})`;
79
+ const size = Buffer.byteLength(tuple, "utf8") + 2;
80
+ if (
81
+ tuples.length > 0 &&
82
+ (tuples.length >= SITE_SQL_INSERT_ROWS || bytes + size > SITE_SQL_INSERT_BYTES)
83
+ ) {
84
+ statements.push(`${head}${tuples.join(", ")};`);
85
+ tuples = [];
86
+ bytes = headBytes;
87
+ }
88
+ tuples.push(tuple);
89
+ bytes += size;
90
+ }
91
+ if (tuples.length > 0) statements.push(`${head}${tuples.join(", ")};`);
92
+ return statements;
93
+ }
94
+
95
+ /** A CSV cell for an exported value (formula-safe, like Site Data exports). */
96
+ export function siteSqlCsvCell(value: unknown): string {
97
+ if (isBlob(value)) return siteDataCsvCell(value.$base64);
98
+ return siteDataCsvCell(value);
99
+ }
100
+
101
+ export function siteSqlCsvLine(values: readonly unknown[]): string {
102
+ return values.map(siteSqlCsvCell).join(",");
103
+ }
104
+
105
+ /** Rows as objects keyed by column, for JSON exports. */
106
+ export function siteSqlRowObjects(table: SiteSqlExportTable): Array<Record<string, unknown>> {
107
+ return table.rows.map((row) =>
108
+ Object.fromEntries(table.columns.map((column, index) => [column, row[index] ?? null])),
109
+ );
110
+ }
111
+
112
+ /**
113
+ * Rows of a JSON import as column lists and value rows: the columns are every
114
+ * key any row uses, in first-seen order; a missing key is NULL.
115
+ */
116
+ export function siteSqlImportRows(rows: ReadonlyArray<Record<string, SiteSqlValue>>): {
117
+ columns: string[];
118
+ values: SiteSqlValue[][];
119
+ } {
120
+ const columns: string[] = [];
121
+ const seen = new Set<string>();
122
+ for (const row of rows)
123
+ for (const key of Object.keys(row))
124
+ if (!seen.has(key)) {
125
+ seen.add(key);
126
+ columns.push(key);
127
+ }
128
+ return {
129
+ columns,
130
+ values: rows.map((row) =>
131
+ columns.map((column) => (Object.hasOwn(row, column) ? (row[column] ?? null) : null)),
132
+ ),
133
+ };
134
+ }
@@ -0,0 +1,168 @@
1
+ import { createHash, createHmac } from "node:crypto";
2
+ import {
3
+ SITE_GATEWAY_SIGNATURE_HEADER,
4
+ SITE_GATEWAY_SIGNATURE_VERSION,
5
+ SITE_GATEWAY_TIMESTAMP_HEADER,
6
+ siteDbInternalPath,
7
+ siteGatewayCanonicalString,
8
+ type SiteDbErrorBody,
9
+ type SiteDbOperation,
10
+ } from "@opengeni/contracts";
11
+ import type { Settings } from "@opengeni/config";
12
+
13
+ /**
14
+ * The API's client for a Site's Durable Object, through the Site gateway's
15
+ * internal route (`POST <origin>/_og/internal/site-db/<siteId>/<operation>`).
16
+ * Requests are signed like gateway -> API requests, in the other direction:
17
+ * HMAC-SHA256 with the shared gateway secret over `siteGatewayCanonicalString`
18
+ * (the internal path, the gateway's host, the body digest and the time; no
19
+ * viewer fields). Every request names a fresh id the Durable Object refuses
20
+ * to see twice. Nothing here decides who may do what: the service does that
21
+ * before calling.
22
+ */
23
+
24
+ export type SiteSqlGatewayConfig = {
25
+ origin: string;
26
+ secret: string;
27
+ timeoutMs: number;
28
+ };
29
+
30
+ export type SiteSqlGatewaySettings = Pick<
31
+ Settings,
32
+ | "sitesCloudflareStorageEnabled"
33
+ | "sitesGatewayInternalOrigin"
34
+ | "sitesGatewaySecret"
35
+ | "sitesSqlTimeoutMs"
36
+ >;
37
+
38
+ /**
39
+ * The gateway to call, or null when no gateway origin and secret are
40
+ * configured. This alone lets the API reach Durable Objects that already
41
+ * exist (export, inspect, dropping data); offering Site SQL also needs the
42
+ * flag (siteSqlOffered).
43
+ */
44
+ export function siteSqlGatewayConfig(
45
+ settings: SiteSqlGatewaySettings,
46
+ ): SiteSqlGatewayConfig | null {
47
+ if (!settings.sitesGatewayInternalOrigin || !settings.sitesGatewaySecret) return null;
48
+ return {
49
+ origin: new URL(settings.sitesGatewayInternalOrigin).origin,
50
+ secret: settings.sitesGatewaySecret,
51
+ timeoutMs: settings.sitesSqlTimeoutMs,
52
+ };
53
+ }
54
+
55
+ /**
56
+ * Whether this deployment offers Site SQL: the flag is on and the gateway is
57
+ * configured. Turning it on, migrating, rebuilding, importing and running
58
+ * SQL need this; export, inspect and dropping a database only need the
59
+ * gateway.
60
+ */
61
+ export function siteSqlOffered(settings: SiteSqlGatewaySettings): boolean {
62
+ return settings.sitesCloudflareStorageEnabled && siteSqlGatewayConfig(settings) !== null;
63
+ }
64
+
65
+ /** A refusal or failure from the gateway or the Durable Object. */
66
+ export class SiteDbCallError extends Error {
67
+ constructor(
68
+ readonly status: number,
69
+ readonly code: string,
70
+ message: string,
71
+ /** True when the operation may have run (a timeout or lost response). */
72
+ readonly outcomeUnknown = false,
73
+ ) {
74
+ super(message);
75
+ this.name = "SiteDbCallError";
76
+ }
77
+ }
78
+
79
+ export type SiteDbFetch = (input: string, init: RequestInit) => Promise<Response>;
80
+
81
+ /** Sign one internal request. Exported for tests. */
82
+ export function signSiteDbRequest(
83
+ config: Pick<SiteSqlGatewayConfig, "origin" | "secret">,
84
+ siteId: string,
85
+ operation: SiteDbOperation,
86
+ body: string,
87
+ nowSeconds = Math.floor(Date.now() / 1000),
88
+ ): { url: string; headers: Record<string, string> } {
89
+ const path = siteDbInternalPath(siteId, operation);
90
+ const url = new URL(path, config.origin);
91
+ const canonical = siteGatewayCanonicalString({
92
+ method: "POST",
93
+ host: url.host,
94
+ pathWithQuery: url.pathname,
95
+ timestamp: nowSeconds,
96
+ bodySha256: createHash("sha256").update(body).digest("hex"),
97
+ session: "",
98
+ visitor: "",
99
+ clientIp: "",
100
+ human: "",
101
+ });
102
+ const mac = createHmac("sha256", config.secret).update(canonical).digest("base64url");
103
+ return {
104
+ url: url.toString(),
105
+ headers: {
106
+ "content-type": "application/json",
107
+ [SITE_GATEWAY_TIMESTAMP_HEADER]: String(nowSeconds),
108
+ [SITE_GATEWAY_SIGNATURE_HEADER]: `${SITE_GATEWAY_SIGNATURE_VERSION}=${mac}`,
109
+ },
110
+ };
111
+ }
112
+
113
+ /** Read-only operations: a lost response cannot have changed anything. */
114
+ const READ_ONLY: ReadonlySet<SiteDbOperation> = new Set(["inspect", "export"]);
115
+
116
+ /** Call one Durable Object operation and return its JSON. */
117
+ export async function callSiteDb<T>(
118
+ config: SiteSqlGatewayConfig,
119
+ siteId: string,
120
+ operation: SiteDbOperation,
121
+ payload: Record<string, unknown>,
122
+ fetchImpl: SiteDbFetch = fetch,
123
+ ): Promise<T> {
124
+ const body = JSON.stringify({ requestId: crypto.randomUUID(), ...payload });
125
+ const signed = signSiteDbRequest(config, siteId, operation, body);
126
+ let response: Response;
127
+ try {
128
+ response = await fetchImpl(signed.url, {
129
+ method: "POST",
130
+ headers: signed.headers,
131
+ body,
132
+ redirect: "manual",
133
+ signal: AbortSignal.timeout(config.timeoutMs),
134
+ });
135
+ } catch (error) {
136
+ const timedOut = error instanceof DOMException && error.name === "TimeoutError";
137
+ throw new SiteDbCallError(
138
+ 503,
139
+ "unavailable",
140
+ timedOut
141
+ ? "The Site database did not answer in time"
142
+ : "The Site database is temporarily unavailable",
143
+ !READ_ONLY.has(operation),
144
+ );
145
+ }
146
+ const text = await response.text();
147
+ let parsed: unknown = null;
148
+ try {
149
+ parsed = text ? JSON.parse(text) : null;
150
+ } catch {
151
+ parsed = null;
152
+ }
153
+ if (response.ok && parsed !== null && typeof parsed === "object") return parsed as T;
154
+ const error = (parsed as Partial<SiteDbErrorBody> | null)?.error;
155
+ const code = typeof error?.code === "string" ? error.code : "unavailable";
156
+ const message =
157
+ typeof error?.message === "string" ? error.message : "The Site database request failed";
158
+ // The gateway's own refusals (signature, missing binding) are configuration
159
+ // problems, not the caller's: report them as unavailable.
160
+ if (response.status === 401 || response.status === 404 || response.status >= 500)
161
+ throw new SiteDbCallError(
162
+ 503,
163
+ "unavailable",
164
+ response.status >= 500 ? message : "Site SQL is not reachable on this deployment",
165
+ response.status >= 500 && !READ_ONLY.has(operation),
166
+ );
167
+ throw new SiteDbCallError(response.status, code, message);
168
+ }