@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
@@ -36,6 +36,7 @@ import { z } from "zod";
36
36
 
37
37
  import { createCompanyBrainOkfPackage, serializeCompanyBrainOkf } from "../company-brain-okf";
38
38
  import { projectWorkspaceState } from "../workspace-state-projection";
39
+ import { USER_CONTENT_SECURITY_HEADERS } from "../http/user-content";
39
40
 
40
41
  const inspectorQuery = z
41
42
  .object({
@@ -235,6 +236,9 @@ export function registerCompanyBrainRoutes(app: Hono, deps: ApiRouteDeps): void
235
236
  "content-disposition",
236
237
  `attachment; filename="company-brain-${workspaceId}.okf.md"`,
237
238
  );
239
+ for (const [name, value] of Object.entries(USER_CONTENT_SECURITY_HEADERS)) {
240
+ context.header(name, value);
241
+ }
238
242
  return context.body(serializeCompanyBrainOkf(result));
239
243
  });
240
244
 
@@ -1,15 +1,23 @@
1
+ import { attachedBrowserViewer } from "../attached-browser-viewer";
1
2
  import { randomUUID } from "node:crypto";
2
- import { resolveFirstPartyDelegationSecret, resolveStreamTokenSecret } from "@opengeni/config";
3
+ import {
4
+ resolveFirstPartyDelegationSecret,
5
+ resolveStreamTokenSecret,
6
+ sandboxWarmRateMicrosPerSecond,
7
+ } from "@opengeni/config";
3
8
  import {
4
9
  BROWSER_CONTROL_WEBSOCKET_BEARER_PREFIX,
5
10
  BROWSER_CONTROL_PORT,
6
11
  COMPUTER_CONTROL_WEBSOCKET_PROTOCOL,
7
- COMPUTER_RFB_WEBSOCKET_PROTOCOL,
12
+ ComputerNativeCommand,
13
+ ComputerNativeCallRequest,
8
14
  ComputerActionCommand,
15
+ computerActionSecretTexts,
9
16
  ComputerActionRequest,
10
17
  ComputerSessionAttachment,
11
18
  ComputerSessionAttachmentRequest,
12
19
  ComputerSessionHeartbeatResponse,
20
+ ComputerSessionInputPosture,
13
21
  ComputerSessionLifecycleRequest,
14
22
  ComputerSessionListResponse,
15
23
  ComputerSessionMutationResponse,
@@ -32,6 +40,7 @@ import {
32
40
  ComputerSessionNotFoundError,
33
41
  ComputerSessionOperationConflictError,
34
42
  ComputerSessionStateError,
43
+ SandboxPaidComputeAdmissionError,
35
44
  dispatchComputerSessionOperation,
36
45
  failComputerSessionOperation,
37
46
  findComputerSessionControlRecordByOperation,
@@ -52,9 +61,11 @@ import {
52
61
  type LeaseSnapshot,
53
62
  } from "@opengeni/db";
54
63
  import {
64
+ hasPermission,
55
65
  requireAccessGrant,
56
66
  requireSessionAuthorization,
57
67
  relayConfigFromSettings,
68
+ resolveChannelAMachineConnection,
58
69
  resolveSessionSandboxRuntime,
59
70
  SessionAuthorizationDeniedError,
60
71
  SessionAuthorizationUnavailableError,
@@ -97,7 +108,10 @@ import {
97
108
  shouldPersistControllerDataPlaneUrl,
98
109
  withCachedController,
99
110
  } from "../controller-data-plane";
100
- import { filterInteractionSessionsForGrant } from "../interaction-agent-access";
111
+ import {
112
+ filterInteractionSessionsForGrant,
113
+ parseInteractionSessionListQuery,
114
+ } from "../interaction-agent-access";
101
115
  import { withInteractionHolderHeartbeat } from "../interaction-holder-heartbeat";
102
116
  import { validateInteractionRequestOrigin } from "../http/cors";
103
117
  import { ApiHttpError } from "../http/api-error";
@@ -112,12 +126,22 @@ import {
112
126
  observeLifecycleResult,
113
127
  } from "../interaction-metrics";
114
128
  import { withChannelA, withChannelARead, type ChannelAOperation } from "../sandbox/channel-a";
129
+ import { USER_CONTENT_SECURITY_HEADERS } from "../http/user-content";
130
+ import { wrongInteractionPlacementMessage } from "./interaction-placement-message";
131
+ import {
132
+ collectStringsDeep,
133
+ resolveInteractionSecretValues,
134
+ type InteractionSecretsPort,
135
+ } from "../interaction-secrets";
136
+ import { requirePlacementAcceptsSecretValues } from "../interaction-agent-version";
115
137
 
116
138
  type ComputerPlacement = {
117
139
  placement: InteractionPlacement;
118
140
  placementInstanceId: string;
119
141
  session: BrowserControlPlacementSession;
120
142
  lease: LeaseSnapshot | null;
143
+ /** Current placement consent, separate from passive viewing authority. */
144
+ screenControlAllowed?: boolean;
121
145
  };
122
146
 
123
147
  const MODEL_COMPUTER_FRAME_MAX_BYTES = 256 * 1024;
@@ -173,10 +197,32 @@ export async function captureModelComputerFrame(
173
197
  return captured;
174
198
  }
175
199
 
200
+ /** One validated screen frame, served as sandboxed, non-embeddable user content. */
201
+ export function computerScreenshotResponse(
202
+ frame: Pick<ComputerControlFrame, "data" | "mediaType" | "metadataHeader">,
203
+ ): Response {
204
+ // Copy exactly the image bytes: a Node Buffer view may share a larger
205
+ // backing allocation, which `.slice().buffer` would expose whole.
206
+ return new Response(Uint8Array.from(frame.data).buffer, {
207
+ status: 200,
208
+ headers: {
209
+ "cache-control": "no-store",
210
+ "content-type": frame.mediaType,
211
+ "x-opengeni-computer-frame": frame.metadataHeader,
212
+ ...USER_CONTENT_SECURITY_HEADERS,
213
+ },
214
+ });
215
+ }
216
+
176
217
  /** Public ComputerSession resource surface. Physical app/window authority stays
177
218
  * in the same placement controller used by BrowserSession; this route owns only
178
219
  * durable authorization, placement fencing, lifecycle receipts, and routing. */
179
- export function registerComputerSessionRoutes(app: Hono, deps: ApiRouteDeps): void {
220
+ export function registerComputerSessionRoutes(
221
+ app: Hono,
222
+ deps: ApiRouteDeps,
223
+ options: { interactionSecrets?: InteractionSecretsPort | null } = {},
224
+ ): void {
225
+ const interactionSecrets = options.interactionSecrets ?? null;
180
226
  const channelServices = {
181
227
  db: deps.db,
182
228
  settings: deps.settings,
@@ -190,6 +236,7 @@ export function registerComputerSessionRoutes(app: Hono, deps: ApiRouteDeps): vo
190
236
  const listed = await listComputerSessions(deps.db, {
191
237
  accountId: grant.accountId,
192
238
  workspaceId,
239
+ ...parseInteractionSessionListQuery(context.req.query()),
193
240
  });
194
241
  return context.json(
195
242
  ComputerSessionListResponse.parse({
@@ -224,6 +271,7 @@ export function registerComputerSessionRoutes(app: Hono, deps: ApiRouteDeps): vo
224
271
  await authorizeSourceSession(deps, grant, request.sessionId, "session.control");
225
272
  const origin = requestOrigin(context, deps.settings);
226
273
  const authority = controllerAuthorityRoot(deps);
274
+ let prepared: Awaited<ReturnType<typeof prepareComputerSessionCreate>> | null = null;
227
275
 
228
276
  try {
229
277
  const existing = await findComputerSessionControlRecordByOperation(deps.db, {
@@ -237,7 +285,7 @@ export function registerComputerSessionRoutes(app: Hono, deps: ApiRouteDeps): vo
237
285
  );
238
286
  }
239
287
  if (existing) assertCreateReplay(request, existing.session);
240
- let prepared = existing
288
+ prepared = existing
241
289
  ? await prepareComputerSessionCreate(
242
290
  deps.db,
243
291
  computerCreateInput(grant, workspaceId, request, existing.session.placement),
@@ -403,10 +451,49 @@ export function registerComputerSessionRoutes(app: Hono, deps: ApiRouteDeps): vo
403
451
  parsed.operation.state === "completed" && !parsed.operation.replayed ? 201 : 200,
404
452
  );
405
453
  } catch (error) {
454
+ if (prepared) {
455
+ // A concurrent dispatch owns its exact binding, even if this request's
456
+ // placement failed. Settle only the still-undispatched create receipt.
457
+ await failComputerSessionOperation(deps.db, {
458
+ accountId: grant.accountId,
459
+ workspaceId,
460
+ operationId: request.operationId,
461
+ computerSessionId: prepared.session.id,
462
+ onlyIfPreparedCreate: true,
463
+ error: interactionFailure(error),
464
+ }).catch(() => undefined);
465
+ }
406
466
  throw computerRouteError(error);
407
467
  }
408
468
  });
409
469
 
470
+ app.get(
471
+ "/v1/workspaces/:workspaceId/computer-sessions/:computerSessionId/input-posture",
472
+ async (context) => {
473
+ const { workspaceId, grant, computerSessionId } = await routePreamble(
474
+ context,
475
+ "sessions:read",
476
+ );
477
+ const result = await withActiveComputerController(
478
+ context,
479
+ grant,
480
+ workspaceId,
481
+ computerSessionId,
482
+ "session.read",
483
+ "computer.read",
484
+ async ({ record, binding, placement }) =>
485
+ ComputerSessionInputPosture.parse({
486
+ computerSessionId,
487
+ controllerGeneration: binding.controllerGeneration,
488
+ inputAllowed: await authorizeHumanFrameInput(grant, record, placement),
489
+ }),
490
+ false,
491
+ );
492
+ context.header("cache-control", "no-store");
493
+ return context.json(result);
494
+ },
495
+ );
496
+
410
497
  app.get(
411
498
  "/v1/workspaces/:workspaceId/computer-sessions/:computerSessionId/targets",
412
499
  async (context) => {
@@ -483,14 +570,7 @@ export function registerComputerSessionRoutes(app: Hono, deps: ApiRouteDeps): vo
483
570
  }
484
571
  },
485
572
  );
486
- return new Response(frame.data.slice().buffer, {
487
- status: 200,
488
- headers: {
489
- "cache-control": "no-store",
490
- "content-type": frame.mediaType,
491
- "x-opengeni-computer-frame": frame.metadataHeader,
492
- },
493
- });
573
+ return computerScreenshotResponse(frame);
494
574
  },
495
575
  );
496
576
 
@@ -514,6 +594,68 @@ export function registerComputerSessionRoutes(app: Hono, deps: ApiRouteDeps): vo
514
594
  },
515
595
  );
516
596
 
597
+ app.post(
598
+ "/v1/workspaces/:workspaceId/computer-sessions/:computerSessionId/native-calls",
599
+ async (context) => {
600
+ const { workspaceId, grant, computerSessionId } = await routePreamble(
601
+ context,
602
+ "sessions:control",
603
+ );
604
+ if (grant.principalKind === "agent_attempt") {
605
+ const selected = grant.metadata?.firstPartyMcpTools;
606
+ if (!Array.isArray(selected) || !selected.includes("computer_act"))
607
+ throw new HTTPException(403, {
608
+ message: "Computer control is not selected for this attempt",
609
+ });
610
+ }
611
+ const request = await parseJsonBody(context, ComputerNativeCallRequest);
612
+ const result = await withActiveComputerController(
613
+ context,
614
+ grant,
615
+ workspaceId,
616
+ computerSessionId,
617
+ "session.control",
618
+ "computer.action",
619
+ async ({ sessionClient, binding, record }) => {
620
+ if (
621
+ record.session.placement.kind === "sandbox_group" &&
622
+ deps.settings.sandboxDesktopInteractive === false &&
623
+ grant.principalKind !== "agent_attempt"
624
+ )
625
+ throw new HTTPException(403, { message: "Human desktop input is disabled" });
626
+ const commandFields = {
627
+ ...request,
628
+ protocolVersion: INTERACTION_PROTOCOL_VERSION,
629
+ computerSessionId,
630
+ controllerGeneration: binding.controllerGeneration,
631
+ targetId: null,
632
+ actor: interactionActorForGrant(grant),
633
+ };
634
+ ComputerNativeCommand.parse(commandFields);
635
+ const secretValues = await resolveInteractionSecretValues({
636
+ port: interactionSecrets,
637
+ grant,
638
+ texts: collectStringsDeep(request.arguments),
639
+ use: { surface: "desktop", toolName: request.tool, operationId: request.operationId },
640
+ beforeResolve: requirePlacementAcceptsSecretValues(
641
+ deps.db,
642
+ grant,
643
+ workspaceId,
644
+ record.session.placement,
645
+ ),
646
+ });
647
+ return await sessionClient.nativeCall(
648
+ ComputerNativeCommand.parse({
649
+ ...commandFields,
650
+ ...(secretValues === undefined ? {} : { secretValues }),
651
+ }),
652
+ );
653
+ },
654
+ );
655
+ return context.json(result);
656
+ },
657
+ );
658
+
517
659
  app.post(
518
660
  "/v1/workspaces/:workspaceId/computer-sessions/:computerSessionId/actions",
519
661
  async (context) => {
@@ -530,21 +672,46 @@ export function registerComputerSessionRoutes(app: Hono, deps: ApiRouteDeps): vo
530
672
  computerSessionId,
531
673
  "session.control",
532
674
  "computer.action",
533
- async ({ sessionClient, binding }) =>
534
- await sessionClient.action(
675
+ async ({ sessionClient, binding, record }) => {
676
+ if (
677
+ record.session.placement.kind === "sandbox_group" &&
678
+ deps.settings.sandboxDesktopInteractive === false &&
679
+ grant.principalKind !== "agent_attempt"
680
+ ) {
681
+ throw new HTTPException(403, { message: "Human desktop input is disabled" });
682
+ }
683
+ const commandFields = {
684
+ protocolVersion: INTERACTION_PROTOCOL_VERSION,
685
+ operationId: request.operationId,
686
+ computerSessionId,
687
+ controllerGeneration: binding.controllerGeneration,
688
+ targetId: request.targetId,
689
+ expectedTargetGeneration: request.expectedTargetGeneration,
690
+ expectedObservationId: request.expectedObservationId,
691
+ expectedFrameId: request.expectedFrameId,
692
+ actor: interactionActorForGrant(grant),
693
+ action: request.action,
694
+ };
695
+ ComputerActionCommand.parse(commandFields);
696
+ const secretValues = await resolveInteractionSecretValues({
697
+ port: interactionSecrets,
698
+ grant,
699
+ texts: computerActionSecretTexts(request.action),
700
+ use: { surface: "desktop", toolName: "computer_act", operationId: request.operationId },
701
+ beforeResolve: requirePlacementAcceptsSecretValues(
702
+ deps.db,
703
+ grant,
704
+ workspaceId,
705
+ record.session.placement,
706
+ ),
707
+ });
708
+ return await sessionClient.action(
535
709
  ComputerActionCommand.parse({
536
- protocolVersion: INTERACTION_PROTOCOL_VERSION,
537
- operationId: request.operationId,
538
- computerSessionId,
539
- controllerGeneration: binding.controllerGeneration,
540
- targetId: request.targetId,
541
- expectedTargetGeneration: request.expectedTargetGeneration,
542
- expectedObservationId: request.expectedObservationId,
543
- expectedFrameId: request.expectedFrameId,
544
- actor: interactionActorForGrant(grant),
545
- action: request.action,
710
+ ...commandFields,
711
+ ...(secretValues === undefined ? {} : { secretValues }),
546
712
  }),
547
- ),
713
+ );
714
+ },
548
715
  );
549
716
  observeComputerActionResult(deps.observability, startedAtMs, request, result);
550
717
  return context.json(result);
@@ -623,11 +790,18 @@ export function registerComputerSessionRoutes(app: Hono, deps: ApiRouteDeps): vo
623
790
  grantId,
624
791
  expiresAt,
625
792
  });
626
- await client.createComputerViewGrant(reference, {
793
+ // Keep the old strict-key request. Human input uses canonical
794
+ // actions; this grant authorizes only the frame producer. An older
795
+ // controller's reusable RFB bearer must stay behind the proxy.
796
+ const viewGrant = await client.createComputerViewGrant(reference, {
627
797
  grantId,
628
798
  token,
629
799
  expiresAt,
630
800
  });
801
+ const managedLinuxPlacement =
802
+ record.session.placement.kind === "sandbox_group" &&
803
+ record.session.platform === "linux";
804
+ const inputAllowed = await authorizeHumanFrameInput(grant, record, placement);
631
805
  const relaySecret = placement.session.openComputerFrames
632
806
  ? resolveStreamTokenSecret(deps.settings)
633
807
  : null;
@@ -695,58 +869,47 @@ export function registerComputerSessionRoutes(app: Hono, deps: ApiRouteDeps): vo
695
869
  };
696
870
  })()
697
871
  : await (async () => {
698
- const rfb =
699
- record.session.placement.kind === "sandbox_group" &&
700
- record.session.platform === "linux" &&
701
- target.kind === "screen";
702
- const protocols = rfb
703
- ? [
704
- "binary",
705
- COMPUTER_RFB_WEBSOCKET_PROTOCOL,
706
- `${BROWSER_CONTROL_WEBSOCKET_BEARER_PREFIX}${token}`,
707
- ]
708
- : [
709
- COMPUTER_CONTROL_WEBSOCKET_PROTOCOL,
710
- `${BROWSER_CONTROL_WEBSOCKET_BEARER_PREFIX}${token}`,
711
- ];
712
- const upstreamUrl = rfb
713
- ? await client.computerRfbStreamUrl(reference, request.targetId)
714
- : await client.computerFrameStreamUrl(
715
- reference,
716
- request.targetId,
717
- request.stream,
718
- );
719
- const attachment = placementUsesInteractionFrameProxy(placement.lease?.backend, {
720
- openSandboxSignedEndpoints: deps.settings.openSandboxSignedEndpoints,
721
- ...(typeof deps.settings.openSandboxInteractionFrameProxy === "boolean"
722
- ? {
723
- openSandboxInteractionFrameProxy:
724
- deps.settings.openSandboxInteractionFrameProxy,
725
- }
726
- : {}),
727
- })
728
- ? createInteractionFrameProxyAttachment({
729
- requestUrl: context.req.url,
730
- publicBaseUrl: deps.settings.publicBaseUrl,
731
- webBaseUrl: deps.settings.webBaseUrl,
732
- forwardedProto: context.req.header("x-forwarded-proto"),
733
- forwardedHost:
734
- context.req.header("x-forwarded-host") ?? context.req.header("host"),
735
- rootSecret: controllerAuthorityRoot(deps),
736
- upstreamUrl,
737
- upstreamProtocols: protocols,
738
- origin,
739
- expiresAt,
740
- })
741
- : { url: upstreamUrl, protocols };
742
- return rfb
743
- ? { kind: "direct_rfb" as const, ...attachment }
744
- : { kind: "direct_websocket" as const, ...attachment };
872
+ const protocols = [
873
+ COMPUTER_CONTROL_WEBSOCKET_PROTOCOL,
874
+ `${BROWSER_CONTROL_WEBSOCKET_BEARER_PREFIX}${token}`,
875
+ ];
876
+ const upstreamUrl = await client.computerFrameStreamUrl(
877
+ reference,
878
+ request.targetId,
879
+ request.stream,
880
+ );
881
+ const attachment =
882
+ (!viewGrant.scopedRfbInput && managedLinuxPlacement) ||
883
+ placementUsesInteractionFrameProxy(placement.lease?.backend, {
884
+ openSandboxSignedEndpoints: deps.settings.openSandboxSignedEndpoints,
885
+ ...(typeof deps.settings.openSandboxInteractionFrameProxy === "boolean"
886
+ ? {
887
+ openSandboxInteractionFrameProxy:
888
+ deps.settings.openSandboxInteractionFrameProxy,
889
+ }
890
+ : {}),
891
+ })
892
+ ? createInteractionFrameProxyAttachment({
893
+ requestUrl: context.req.url,
894
+ publicBaseUrl: deps.settings.publicBaseUrl,
895
+ webBaseUrl: deps.settings.webBaseUrl,
896
+ forwardedProto: context.req.header("x-forwarded-proto"),
897
+ forwardedHost:
898
+ context.req.header("x-forwarded-host") ?? context.req.header("host"),
899
+ rootSecret: controllerAuthorityRoot(deps),
900
+ upstreamUrl,
901
+ upstreamProtocols: protocols,
902
+ origin,
903
+ expiresAt,
904
+ })
905
+ : { url: upstreamUrl, protocols };
906
+ return { kind: "direct_websocket" as const, ...attachment };
745
907
  })();
746
908
  return ComputerSessionAttachment.parse({
747
909
  computerSessionId,
748
910
  controllerGeneration: binding.controllerGeneration,
749
911
  targetId: request.targetId,
912
+ inputAllowed,
750
913
  stream,
751
914
  expiresAt,
752
915
  });
@@ -756,6 +919,40 @@ export function registerComputerSessionRoutes(app: Hono, deps: ApiRouteDeps): vo
756
919
  },
757
920
  );
758
921
 
922
+ async function authorizeHumanFrameInput(
923
+ grant: AccessGrant,
924
+ record: ComputerSessionControlRecord,
925
+ placement: ComputerPlacement,
926
+ ): Promise<boolean> {
927
+ if (
928
+ ((record.session.placement.kind === "connected_machine" ||
929
+ record.session.placement.kind === "attached_device") &&
930
+ placement.screenControlAllowed !== true) ||
931
+ (record.session.placement.kind === "sandbox_group" &&
932
+ deps.settings.sandboxDesktopInteractive === false) ||
933
+ grant.principalKind === "agent_attempt" ||
934
+ !hasPermission(grant.permissions, "sessions:control")
935
+ )
936
+ return false;
937
+ try {
938
+ await requireSessionAuthorization(deps, grant, {
939
+ sessionId: record.sourceSessionId,
940
+ operation: "session.control",
941
+ surface: "http",
942
+ });
943
+ return true;
944
+ } catch (error) {
945
+ // Input availability cannot invalidate an independently authorized view.
946
+ // Every action reauthorizes the live source instead of trusting this hint.
947
+ if (
948
+ error instanceof SessionAuthorizationDeniedError ||
949
+ error instanceof SessionAuthorizationUnavailableError
950
+ )
951
+ return false;
952
+ throw error;
953
+ }
954
+ }
955
+
759
956
  app.post(
760
957
  "/v1/workspaces/:workspaceId/computer-sessions/:computerSessionId/heartbeat",
761
958
  async (context) => {
@@ -936,19 +1133,16 @@ export function registerComputerSessionRoutes(app: Hono, deps: ApiRouteDeps): vo
936
1133
  }
937
1134
  if (expectedPlacement?.kind === "attached_device") {
938
1135
  waitSignal.throwIfAborted();
1136
+ // Personal machines are controlled only for their owner, as everywhere else.
1137
+ const viewer = await attachedBrowserViewer(deps, grant, sourceSession.workspaceId);
939
1138
  const device = await getAttachedBrowserDevice(deps.db, {
940
- accountId: grant.accountId,
941
- workspaceId: sourceSession.workspaceId,
1139
+ ...viewer,
942
1140
  deviceId: expectedPlacement.deviceId,
943
1141
  });
944
1142
  if (device.state !== "connected") {
945
1143
  throw new ComputerSessionStateError("Attached browser machine is disconnected");
946
1144
  }
947
- const enrollment = await getLiveEnrollmentConnection(
948
- deps.db,
949
- sourceSession.workspaceId,
950
- device.enrollmentId,
951
- );
1145
+ const enrollment = await getLiveEnrollmentConnection(deps.db, viewer, device.enrollmentId);
952
1146
  if (!enrollment || enrollment.status !== "active" || !enrollment.connectionInstanceId) {
953
1147
  throw new ComputerSessionStateError("Attached browser machine is unavailable");
954
1148
  }
@@ -998,6 +1192,7 @@ export function registerComputerSessionRoutes(app: Hono, deps: ApiRouteDeps): vo
998
1192
  placementInstanceId,
999
1193
  session: built.session as unknown as BrowserControlPlacementSession,
1000
1194
  lease: null,
1195
+ screenControlAllowed: enrollment.allowScreenControl === true,
1001
1196
  });
1002
1197
  }
1003
1198
  const runWithChannelA =
@@ -1014,9 +1209,13 @@ export function registerComputerSessionRoutes(app: Hono, deps: ApiRouteDeps): vo
1014
1209
  workspaceId: sourceSession.workspaceId,
1015
1210
  session: sourceSession,
1016
1211
  subjectId: grant.subjectId,
1212
+ grant,
1017
1213
  waitSignal,
1018
1214
  operation,
1019
1215
  retryControllerTransport: operation === "computer.read" || operation === "computer.action",
1216
+ ...(expectedPlacementInstanceId && expectedPlacement?.kind === "sandbox_group"
1217
+ ? { retainedInstanceId: expectedPlacementInstanceId }
1218
+ : {}),
1020
1219
  },
1021
1220
  async (handle) => {
1022
1221
  if (expectedPlacement?.kind === "sandbox_group") {
@@ -1036,26 +1235,51 @@ export function registerComputerSessionRoutes(app: Hono, deps: ApiRouteDeps): vo
1036
1235
  }
1037
1236
 
1038
1237
  const resolved = await handle.routingSession.prime();
1238
+ let screenControlAllowed = false;
1039
1239
  if (operation !== "computer.end" && resolved.kind === "selfhosted" && resolved.sandboxId) {
1040
- const sandbox = await getSandbox(deps.db, grant, resolved.sandboxId);
1240
+ // Look the routed machine up as the routing did: an agent acts for
1241
+ // the person who started its turn, so a personal (Only me) machine
1242
+ // stays reachable, subject to that attempt's per-chat permission.
1243
+ const machineAuthority = await handle.machineAuthority();
1244
+ const sandbox = await getSandbox(
1245
+ deps.db,
1246
+ {
1247
+ accountId: grant.accountId,
1248
+ workspaceId: sourceSession.workspaceId,
1249
+ subjectId: machineAuthority.subjectId,
1250
+ },
1251
+ resolved.sandboxId,
1252
+ );
1041
1253
  if (sandbox?.kind !== "selfhosted" || !sandbox.enrollmentId) {
1042
1254
  throw new ComputerSessionStateError("Connected Machine placement is unavailable");
1043
1255
  }
1044
- const enrollment = await getLiveEnrollmentConnection(
1256
+ const enrollment = await resolveChannelAMachineConnection(
1045
1257
  deps.db,
1046
- grant,
1047
- sandbox.enrollmentId,
1258
+ {
1259
+ accountId: grant.accountId,
1260
+ workspaceId: sourceSession.workspaceId,
1261
+ sessionId: sourceSession.id,
1262
+ machineWorkspaceId: sandbox.workspaceId,
1263
+ enrollmentId: sandbox.enrollmentId,
1264
+ },
1265
+ machineAuthority,
1048
1266
  );
1049
1267
  if (!enrollment?.connectionInstanceId) {
1050
1268
  throw new ComputerSessionStateError("Connected Machine is unavailable");
1051
1269
  }
1052
1270
  assertConnectedMachineComputerAccess(enrollment, operation);
1271
+ screenControlAllowed = enrollment.allowScreenControl === true;
1053
1272
  }
1054
1273
  if (expectedPlacement?.kind === "connected_machine") {
1055
1274
  if (
1056
1275
  resolved.kind !== "selfhosted" ||
1057
1276
  resolved.sandboxId !== expectedPlacement.sandboxId
1058
1277
  ) {
1278
+ if (operation === "computer.create") {
1279
+ throw new HTTPException(422, {
1280
+ message: wrongInteractionPlacementMessage(expectedPlacement.sandboxId),
1281
+ });
1282
+ }
1059
1283
  return await throwComputerSourcePlacementChanged(
1060
1284
  grant,
1061
1285
  sourceSession.id,
@@ -1069,6 +1293,7 @@ export function registerComputerSessionRoutes(app: Hono, deps: ApiRouteDeps): vo
1069
1293
  placementInstanceId,
1070
1294
  session: resolved.session as unknown as BrowserControlPlacementSession,
1071
1295
  lease: null,
1296
+ screenControlAllowed,
1072
1297
  });
1073
1298
  }
1074
1299
  if (resolved.sandboxId === null) {
@@ -1100,6 +1325,7 @@ export function registerComputerSessionRoutes(app: Hono, deps: ApiRouteDeps): vo
1100
1325
  placementInstanceId: resolved.providerInstanceId ?? resolved.sandboxId,
1101
1326
  session: resolved.session as unknown as BrowserControlPlacementSession,
1102
1327
  lease: null,
1328
+ screenControlAllowed,
1103
1329
  });
1104
1330
  }
1105
1331
  throw new BrowserControlUnsupportedError(
@@ -1411,6 +1637,7 @@ export function registerComputerSessionRoutes(app: Hono, deps: ApiRouteDeps): vo
1411
1637
  deps.db,
1412
1638
  deps.settings,
1413
1639
  sourceSession,
1640
+ { grant },
1414
1641
  );
1415
1642
  const acquired = await acquireLease(deps.db, {
1416
1643
  accountId: grant.accountId,
@@ -1420,8 +1647,13 @@ export function registerComputerSessionRoutes(app: Hono, deps: ApiRouteDeps): vo
1420
1647
  holderId: interactionHolderId(computerSessionId),
1421
1648
  subjectId: sourceSession.id,
1422
1649
  backend: placement.lease.backend,
1650
+ warmBilling: {
1651
+ mode: deps.settings.sandboxWarmBillingMode,
1652
+ rateMicrosPerSecond: sandboxWarmRateMicrosPerSecond(deps.settings, placement.lease.backend),
1653
+ },
1423
1654
  os: placement.lease.os,
1424
1655
  image: sandboxRuntime.image,
1656
+ imagePolicy: "new_creates_only",
1425
1657
  rigVersionId: sourceSession.rigVersionId,
1426
1658
  leaseTtlMs: deps.settings.sandboxLeaseTtlMs,
1427
1659
  expectedEpoch: placement.lease.leaseEpoch,
@@ -1875,6 +2107,8 @@ function computerRouteError(error: unknown): HTTPException {
1875
2107
  const connectedMachineError = interactionControlApiError(error, "computer");
1876
2108
  if (connectedMachineError) return connectedMachineError;
1877
2109
  if (error instanceof HTTPException) return error;
2110
+ if (error instanceof SandboxPaidComputeAdmissionError)
2111
+ return new HTTPException(402, { message: error.message, cause: error });
1878
2112
  if (error instanceof ComputerSessionNotFoundError) {
1879
2113
  return new HTTPException(404, { message: error.message, cause: error });
1880
2114
  }