@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,60 @@
1
+ import type { Context, Hono } from "hono";
2
+ import { matchedRoutes } from "hono/route";
3
+
4
+ type RegisteredRoute = { method: string; path: string; handler: unknown };
5
+
6
+ const PROBED_METHODS = ["GET", "POST", "PUT", "PATCH", "DELETE"] as const;
7
+
8
+ /**
9
+ * Whether a matched Hono route is a terminal handler rather than middleware.
10
+ *
11
+ * Method-specific registrations (`app.get`, `app.put`, `app.on([...])`) always
12
+ * belong to a real route. `app.use` and `app.all` both register the `ALL`
13
+ * method; Hono itself tells them apart by arity - middleware takes
14
+ * `(context, next)` - so the same rule is applied here.
15
+ */
16
+ function isTerminalRoute(route: RegisteredRoute): boolean {
17
+ if (route.method.toUpperCase() !== "ALL") return true;
18
+ return typeof route.handler === "function" && route.handler.length < 2;
19
+ }
20
+
21
+ function routesFor(app: Hono, method: string, path: string): RegisteredRoute[] {
22
+ // Every Hono router returns `[[ [handler, route], params ][], stash?]`.
23
+ const result = app.router.match(method, path) as unknown as [
24
+ Array<[[unknown, RegisteredRoute], unknown]>,
25
+ ...unknown[],
26
+ ];
27
+ return result[0].map(([[, route]]) => route);
28
+ }
29
+
30
+ export type UnmatchedRoute = { status: 404 } | { status: 405; allow: string[] };
31
+
32
+ /**
33
+ * Classify a request no registered handler can answer, BEFORE authentication
34
+ * or authorization middleware runs. Those layers otherwise turn a request for a
35
+ * route that does not exist into an authorization-shaped failure (for example
36
+ * the fail-closed session operation classifier answering a retryable 503), so
37
+ * a client probing an unknown method or path would be told to retry forever.
38
+ *
39
+ * Returns null when the request has a handler, or when classification itself
40
+ * fails (fail open: the request keeps its previous routing behavior).
41
+ */
42
+ export function unmatchedRoute(app: Hono, c: Context): UnmatchedRoute | null {
43
+ const method = c.req.method.toUpperCase();
44
+ // CORS preflights are answered by middleware and have no route handlers.
45
+ if (method === "OPTIONS") return null;
46
+ try {
47
+ if (matchedRoutes(c).some((route) => isTerminalRoute(route as RegisteredRoute))) {
48
+ return null;
49
+ }
50
+ const effectiveMethod = method === "HEAD" ? "GET" : method;
51
+ const allow = PROBED_METHODS.filter(
52
+ (candidate) =>
53
+ candidate !== effectiveMethod &&
54
+ routesFor(app, candidate, c.req.path).some(isTerminalRoute),
55
+ );
56
+ return allow.length > 0 ? { status: 405, allow } : { status: 404 };
57
+ } catch {
58
+ return null;
59
+ }
60
+ }
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Response headers for user-controlled bytes served from the API origin.
3
+ *
4
+ * Retained files, screenshots, exports, and live frames carry bytes and, for
5
+ * uploads, a content type chosen by a user or agent. The API shares its origin
6
+ * with the web console in the default deployment, so a stored `text/html` file
7
+ * opened by top-level navigation would otherwise run as that origin.
8
+ *
9
+ * Every such response therefore:
10
+ * - is a sandboxed document with no script, form, popup, plugin, or network
11
+ * capability (`sandbox` plus `default-src 'none'`). Raster images and text
12
+ * still render when a URL is opened directly;
13
+ * - cannot be embedded by another site as a no-cors subresource (CORP);
14
+ * - is never re-sniffed into a different type (`nosniff`).
15
+ *
16
+ * Audio and video keep their real origin (`sandbox allow-same-origin`, still
17
+ * without `allow-scripts`): the browser's synthesized media document re-fetches
18
+ * its own URL, and from an opaque origin that same-origin-only request would be
19
+ * refused. With scripts disabled and `nosniff`, such a response can only ever
20
+ * be a media player, never attacker markup.
21
+ *
22
+ * Markup types that a browser would render as an active document (HTML, XML,
23
+ * SVG, multipart) are additionally served as attachments, so a direct
24
+ * navigation downloads the bytes instead of showing attacker-authored markup on
25
+ * the app origin. The console never navigates to these routes: it reads bytes
26
+ * through the SDK and renders them in app-owned elements, so neither header
27
+ * changes an in-app preview. Signed object-storage GET URLs for active markup
28
+ * carry the same attachment as a signed response override
29
+ * (`userContentSignedGetUrlOptions`), because the storage endpoint is not
30
+ * always a separate site.
31
+ */
32
+ const USER_CONTENT_FETCH_DIRECTIVES =
33
+ "default-src 'none'; img-src 'self' data: blob:; media-src 'self' data: blob:; style-src 'unsafe-inline'";
34
+
35
+ export const USER_CONTENT_SECURITY_POLICY = `${USER_CONTENT_FETCH_DIRECTIVES}; sandbox`;
36
+
37
+ /** Media players only; scripts stay disabled (see the module comment). */
38
+ export const USER_MEDIA_CONTENT_SECURITY_POLICY = `${USER_CONTENT_FETCH_DIRECTIVES}; sandbox allow-same-origin`;
39
+
40
+ export const USER_CONTENT_SECURITY_HEADERS = Object.freeze({
41
+ "Content-Security-Policy": USER_CONTENT_SECURITY_POLICY,
42
+ "Cross-Origin-Resource-Policy": "same-origin",
43
+ "X-Content-Type-Options": "nosniff",
44
+ } as const);
45
+
46
+ const ACTIVE_DOCUMENT_TYPES = new Set(["text/html", "text/xml", "text/xsl", "application/xml"]);
47
+
48
+ /** Media type essence (no parameters), lowercased. */
49
+ function mediaTypeEssence(contentType: string): string {
50
+ return (contentType.split(";", 1)[0] ?? "").trim().toLowerCase();
51
+ }
52
+
53
+ /**
54
+ * True when a browser would render this type as an active document (HTML,
55
+ * XHTML, SVG, any XML dialect, or multipart replacement streams). Anything that
56
+ * is not a clean `type/subtype` token is treated as active too.
57
+ */
58
+ export function isActiveUserContentType(contentType: string): boolean {
59
+ const essence = mediaTypeEssence(contentType);
60
+ if (!/^[a-z0-9][a-z0-9!#$&^_.+-]*\/[a-z0-9][a-z0-9!#$&^_.+-]*$/.test(essence)) return true;
61
+ return (
62
+ ACTIVE_DOCUMENT_TYPES.has(essence) ||
63
+ essence.endsWith("+xml") ||
64
+ essence.startsWith("multipart/")
65
+ );
66
+ }
67
+
68
+ const DISPOSITION_FILENAME_MAX_CHARS = 200;
69
+
70
+ /** RFC 8187 `attr-char` percent-encoding (stricter than `encodeURIComponent`). */
71
+ function encodeExtendedParameterValue(value: string): string {
72
+ return encodeURIComponent(value).replace(
73
+ /['()*]/g,
74
+ (character) => `%${character.charCodeAt(0).toString(16).toUpperCase()}`,
75
+ );
76
+ }
77
+
78
+ /**
79
+ * RFC 6266 filename parameters: an ASCII-only quoted `filename` that cannot
80
+ * break out of the header, plus an RFC 8187 `filename*` carrying the original
81
+ * name (for example non-Latin names) whenever the ASCII form had to change it.
82
+ */
83
+ function dispositionFilenameParameters(filename: string): string {
84
+ const cleaned = Array.from(
85
+ filename
86
+ .replace(/[\u0000-\u001f\u007f/\\]+/g, "_")
87
+ // Lone surrogates cannot be percent-encoded as UTF-8.
88
+ .replace(/[\ud800-\udbff](?![\udc00-\udfff])|(?<![\ud800-\udbff])[\udc00-\udfff]/g, "_")
89
+ .trim(),
90
+ )
91
+ .slice(0, DISPOSITION_FILENAME_MAX_CHARS)
92
+ .join("");
93
+ const ascii =
94
+ cleaned
95
+ .replace(/[^A-Za-z0-9._ -]+/g, "_")
96
+ .replace(/\s+/g, " ")
97
+ .trim()
98
+ .slice(0, DISPOSITION_FILENAME_MAX_CHARS) || "download";
99
+ if (!cleaned || ascii === cleaned) return `filename="${ascii}"`;
100
+ return `filename="${ascii}"; filename*=UTF-8''${encodeExtendedParameterValue(cleaned)}`;
101
+ }
102
+
103
+ /** `Content-Disposition: attachment` for active markup; inline types are unchanged. */
104
+ export function userContentDispositionHeaders(
105
+ contentType: string,
106
+ filename?: string | null,
107
+ ): { "Content-Disposition": string } | Record<string, never> {
108
+ if (!isActiveUserContentType(contentType)) return {};
109
+ return {
110
+ "Content-Disposition": filename
111
+ ? `attachment; ${dispositionFilenameParameters(filename)}`
112
+ : "attachment",
113
+ };
114
+ }
115
+
116
+ /**
117
+ * Signed object-storage GET options for one stored object: active markup gets
118
+ * a signed `attachment` response override, so a browser that opens the URL
119
+ * downloads the bytes instead of rendering them with their stored type. The
120
+ * storage endpoint is not always a separate site (local development serves it
121
+ * from loopback, and a preview may route the bucket path on the app origin),
122
+ * so a signed URL follows the same rule as the API routes. Spread into
123
+ * `createGetUrl`; inline types add nothing.
124
+ */
125
+ export function userContentSignedGetUrlOptions(
126
+ contentType: string,
127
+ filename?: string | null,
128
+ ): { responseContentDisposition: string } | Record<string, never> {
129
+ const headers = userContentDispositionHeaders(contentType, filename);
130
+ return "Content-Disposition" in headers
131
+ ? { responseContentDisposition: headers["Content-Disposition"] }
132
+ : {};
133
+ }
134
+
135
+ /** True for audio and video types the browser plays in a synthesized media document. */
136
+ export function isPlayableMediaUserContentType(contentType: string): boolean {
137
+ const essence = mediaTypeEssence(contentType);
138
+ return !isActiveUserContentType(essence) && /^(audio|video)\//.test(essence);
139
+ }
140
+
141
+ /** Sandbox policy for one response; only playable media keeps its origin. */
142
+ export function userContentSecurityPolicy(contentType: string): string {
143
+ return isPlayableMediaUserContentType(contentType)
144
+ ? USER_MEDIA_CONTENT_SECURITY_POLICY
145
+ : USER_CONTENT_SECURITY_POLICY;
146
+ }
147
+
148
+ /** Full header set for one user-content response with the given content type. */
149
+ export function userContentResponseHeaders(
150
+ contentType: string,
151
+ filename?: string | null,
152
+ ): Record<string, string> {
153
+ return {
154
+ ...USER_CONTENT_SECURITY_HEADERS,
155
+ "Content-Security-Policy": userContentSecurityPolicy(contentType),
156
+ ...userContentDispositionHeaders(contentType, filename),
157
+ };
158
+ }
@@ -0,0 +1,122 @@
1
+ import type { VaultApiError } from "@opengeni/contracts";
2
+ import type { Context } from "hono";
3
+ import { HTTPException } from "hono/http-exception";
4
+
5
+ const VARIABLE_SETS_REMOVED_MESSAGE =
6
+ "Variable Sets were replaced by vaults. Save secrets with /v1/workspaces/{workspaceId}/vaults and choose a session's vaults with PUT /sessions/{sessionId}/vault-policy.";
7
+
8
+ /** The RM-1 answer for legacy Variable Set routes (410) and fields (422). */
9
+ export function variableSetsRemovedResponse(
10
+ c: Context,
11
+ status: 410 | 422,
12
+ fields?: readonly string[],
13
+ ): Response {
14
+ const body: VaultApiError = {
15
+ error: "variable_sets_removed",
16
+ message: VARIABLE_SETS_REMOVED_MESSAGE,
17
+ details: { vaultsPath: "/vaults", ...(fields?.length ? { fields: [...fields] } : {}) },
18
+ };
19
+ return c.json(body, status);
20
+ }
21
+
22
+ /** Thrown where a route cannot return directly; `app.onError` renders it. */
23
+ export class VariableSetsRemovedError extends Error {
24
+ override readonly name = "VariableSetsRemovedError";
25
+ constructor(readonly fields: readonly string[]) {
26
+ super(`variable_sets_removed: ${fields.join(", ")}`);
27
+ }
28
+ }
29
+
30
+ const CORE_VARIABLE_SETS_REMOVED = /^variable_sets_removed: (\S+) /;
31
+
32
+ /**
33
+ * The RM-1 body for a removed-field error from a route or from core's
34
+ * `variableSetsRemovedError`, or null for any other error.
35
+ */
36
+ export function variableSetsRemovedErrorResponse(c: Context, error: unknown): Response | null {
37
+ if (error instanceof VariableSetsRemovedError) {
38
+ return variableSetsRemovedResponse(c, 422, error.fields);
39
+ }
40
+ if (error instanceof HTTPException && error.status === 422) {
41
+ const field = CORE_VARIABLE_SETS_REMOVED.exec(error.message)?.[1];
42
+ if (field) return variableSetsRemovedResponse(c, 422, [field]);
43
+ }
44
+ return null;
45
+ }
46
+
47
+ /**
48
+ * Legacy selection fields that still carry a choice. Empty arrays and null
49
+ * mean "no Variable Sets" and stay accepted so old clients keep working.
50
+ */
51
+ export function legacyVariableSetFields(payload: unknown): string[] {
52
+ if (!payload || typeof payload !== "object" || Array.isArray(payload)) return [];
53
+ const record = payload as Record<string, unknown>;
54
+ const fields: string[] = [];
55
+ for (const field of ["variableSetIds", "defaultVariableSetIds"] as const) {
56
+ const ids = record[field];
57
+ if (ids !== undefined && ids !== null && !(Array.isArray(ids) && ids.length === 0)) {
58
+ fields.push(field);
59
+ }
60
+ }
61
+ for (const field of ["variableSetId", "environmentId"] as const) {
62
+ if (record[field] !== undefined && record[field] !== null) fields.push(field);
63
+ }
64
+ return fields;
65
+ }
66
+
67
+ /** True when the body explicitly clears a legacy selection (`null` or `[]`). */
68
+ export function clearsLegacyVariableSet(payload: unknown): boolean {
69
+ if (!payload || typeof payload !== "object" || Array.isArray(payload)) return false;
70
+ const record = payload as Record<string, unknown>;
71
+ return (
72
+ (Object.hasOwn(record, "variableSetId") && record.variableSetId === null) ||
73
+ (Object.hasOwn(record, "environmentId") && record.environmentId === null) ||
74
+ (Array.isArray(record.variableSetIds) && record.variableSetIds.length === 0)
75
+ );
76
+ }
77
+
78
+ const LEGACY_VARIABLE_SET_FIELDS = [
79
+ "variableSetIds",
80
+ "variableSetId",
81
+ "environmentId",
82
+ "defaultVariableSetIds",
83
+ ] as const;
84
+
85
+ /**
86
+ * Drops every (empty) legacy Variable Set field so nothing downstream can act
87
+ * on one. Call after {@link legacyVariableSetFields} found none set.
88
+ */
89
+ export function withoutLegacyVariableSetFields(payload: unknown): unknown {
90
+ if (!payload || typeof payload !== "object" || Array.isArray(payload)) return payload;
91
+ const rest: Record<string, unknown> = { ...(payload as Record<string, unknown>) };
92
+ for (const field of LEGACY_VARIABLE_SET_FIELDS) delete rest[field];
93
+ return rest;
94
+ }
95
+
96
+ /**
97
+ * The RM-1 boundary for one JSON body: a 422 `variable_sets_removed` response
98
+ * when a legacy field still carries a choice, otherwise the body without them.
99
+ */
100
+ export function rejectLegacyVariableSetFields(
101
+ c: Context,
102
+ payload: unknown,
103
+ ): { response: Response } | { payload: unknown } {
104
+ const fields = legacyVariableSetFields(payload);
105
+ if (fields.length > 0) return { response: variableSetsRemovedResponse(c, 422, fields) };
106
+ return { payload: withoutLegacyVariableSetFields(payload) };
107
+ }
108
+
109
+ /**
110
+ * Old clients send `variableSetId: null` / `environmentId: null` to mean "no
111
+ * Variable Sets". The create schema only takes the array form, so translate the
112
+ * accepted empty legacy fields to it. Call after {@link legacyVariableSetFields}.
113
+ */
114
+ export function withoutEmptyLegacyVariableSetFields(payload: unknown): unknown {
115
+ if (!payload || typeof payload !== "object" || Array.isArray(payload)) return payload;
116
+ const record = payload as Record<string, unknown>;
117
+ if (!Object.hasOwn(record, "variableSetId") && !Object.hasOwn(record, "environmentId")) {
118
+ return payload;
119
+ }
120
+ const { variableSetId: _variableSetId, environmentId: _environmentId, ...rest } = record;
121
+ return { ...rest, variableSetIds: rest.variableSetIds ?? [] };
122
+ }
@@ -0,0 +1,29 @@
1
+ import { localBrowserBoundaryResponse, type LocalBrowserBoundary } from "./local-browser-boundary";
2
+
3
+ export type ApiWebSocketUpgradeRoute<Server> = {
4
+ handles(request: Request): boolean;
5
+ upgrade(request: Request, server: Server): Response | undefined;
6
+ };
7
+
8
+ export type ApiWebSocketUpgradeDispatch =
9
+ | { handled: false }
10
+ | { handled: true; response: Response | undefined };
11
+
12
+ /**
13
+ * WebSocket upgrades bypass the Hono app, so the local-mode browser boundary
14
+ * (./local-browser-boundary.ts) is applied here before a transport upgrades.
15
+ * Returns `{ handled: false }` when no transport claims the request, so the
16
+ * caller dispatches it to the app, where the boundary runs as middleware.
17
+ */
18
+ export function dispatchApiWebSocketUpgrade<Server>(
19
+ request: Request,
20
+ server: Server,
21
+ routes: ReadonlyArray<ApiWebSocketUpgradeRoute<Server>>,
22
+ localBrowserBoundary: LocalBrowserBoundary | null,
23
+ ): ApiWebSocketUpgradeDispatch {
24
+ const route = routes.find((candidate) => candidate.handles(request));
25
+ if (!route) return { handled: false };
26
+ const rejection = localBrowserBoundary?.rejection(request);
27
+ if (rejection) return { handled: true, response: localBrowserBoundaryResponse(rejection) };
28
+ return { handled: true, response: route.upgrade(request, server) };
29
+ }