@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.
- package/dist/access-grant-rls.d.ts +8 -1
- package/dist/admission-trace.d.ts +8 -0
- package/dist/app.d.ts +50 -3
- package/dist/app.js +10 -1
- package/dist/artifact-catalog-cursor.d.ts +1 -0
- package/dist/attached-browser-viewer.d.ts +11 -0
- package/dist/auth/managed-auth-attempt-context.d.ts +2 -0
- package/dist/auth/managed-auth-rate-limits.d.ts +167 -0
- package/dist/auth/managed-auth-session-adapter.d.ts +9 -1
- package/dist/auth/managed-auth.d.ts +72 -5
- package/dist/auth/managed-sign-in-notifications.d.ts +4 -0
- package/dist/auth/new-signups-gate.d.ts +23 -0
- package/dist/auth/signup-funnel-metrics.d.ts +44 -0
- package/dist/azure-live.d.ts +28 -0
- package/dist/browser-action-fences.d.ts +13 -0
- package/dist/browser-controller-authority.d.ts +1 -61
- package/dist/browser-ephemeral.d.ts +5 -0
- package/dist/browser-lost-runtime-end.d.ts +24 -0
- package/dist/browser-state-authority.d.ts +1 -27
- package/dist/chunk-OGQDXVXY.js +18 -0
- package/dist/chunk-OGQDXVXY.js.map +1 -0
- package/dist/{chunk-AJ62T5QN.js → chunk-OT56OY4V.js} +80503 -39869
- package/dist/chunk-OT56OY4V.js.map +1 -0
- package/dist/claude-default-models.d.ts +19 -0
- package/dist/claude-subscription-core.d.ts +50 -0
- package/dist/claude-subscription-oauth.d.ts +36 -0
- package/dist/claude-subscription-profile.d.ts +9 -0
- package/dist/claude-subscription-usage.d.ts +6 -0
- package/dist/claude-workspace-connection.d.ts +15 -0
- package/dist/codemode.d.ts +40 -5
- package/dist/codex-realtime.d.ts +29 -3
- package/dist/codex-session-pointers.d.ts +19 -0
- package/dist/connection-ownership.d.ts +6 -3
- package/dist/controller-data-plane.d.ts +16 -0
- package/dist/credit-promotion-snapshot.d.ts +6 -0
- package/dist/editable-artifact-source-session.d.ts +3 -0
- package/dist/editable-artifact-websocket.d.ts +5 -3
- package/dist/fatal-process-boundary.d.ts +9 -1
- package/dist/github-access.d.ts +7 -1
- package/dist/github-browser-flow.d.ts +1 -1
- package/dist/http/acting-person.d.ts +36 -0
- package/dist/http/api-contract-compat.d.ts +19 -0
- package/dist/http/api-error.d.ts +50 -1
- package/dist/http/auth.d.ts +8 -1
- package/dist/http/cors.d.ts +12 -0
- package/dist/http/deprecation.d.ts +42 -0
- package/dist/http/keyed-admission.d.ts +12 -0
- package/dist/http/local-browser-boundary.d.ts +72 -0
- package/dist/http/metrics-listener.d.ts +22 -0
- package/dist/http/path-identifier.d.ts +17 -0
- package/dist/http/registered-route-label.d.ts +16 -0
- package/dist/http/rejection-telemetry.d.ts +34 -0
- package/dist/http/request-body.d.ts +27 -0
- package/dist/http/request-source.d.ts +41 -3
- package/dist/http/sse.d.ts +12 -1
- package/dist/http/unmatched-route.d.ts +18 -0
- package/dist/http/user-content.d.ts +36 -0
- package/dist/http/variable-sets-removed.d.ts +41 -0
- package/dist/http/websocket-upgrade-dispatch.d.ts +18 -0
- package/dist/index.js +1279 -108
- package/dist/index.js.map +1 -1
- package/dist/integration-connect-metrics.d.ts +35 -0
- package/dist/integration-endpoint-test.d.ts +20 -0
- package/dist/integrations/api-integrations.d.ts +2 -2
- package/dist/integrations/atlassian.d.ts +8 -3
- package/dist/integrations/fiken.d.ts +3 -1
- package/dist/integrations/github-lens-connect.d.ts +37 -66
- package/dist/integrations/google-drive.d.ts +2 -0
- package/dist/integrations/integration-commit-authority.d.ts +13 -0
- package/dist/integrations/marketplace-plugin.d.ts +43 -43
- package/dist/integrations/oauth-client.d.ts +171 -12
- package/dist/integrations/oauth-profiles.d.ts +42 -13
- package/dist/integrations/onepassword-vault-provider.d.ts +9 -0
- package/dist/integrations/slack-bot.d.ts +285 -7
- package/dist/integrations/slack-file-upload-flow.d.ts +62 -0
- package/dist/integrations/slack-interactions.d.ts +89 -10
- package/dist/integrations/slack-mrkdwn.d.ts +41 -0
- package/dist/integrations/slack-routing.d.ts +1 -1
- package/dist/integrations/slack-session-defaults.d.ts +58 -0
- package/dist/integrations/slack-task-file-upload.d.ts +36 -0
- package/dist/integrations/slack-tool-review.d.ts +5 -0
- package/dist/interaction-agent-access.d.ts +13 -8
- package/dist/interaction-agent-version.d.ts +21 -0
- package/dist/interaction-holder-heartbeat.d.ts +5 -0
- package/dist/interaction-metrics.d.ts +27 -2
- package/dist/interaction-route-stages.d.ts +25 -0
- package/dist/interaction-secrets-vault.d.ts +20 -0
- package/dist/interaction-secrets.d.ts +103 -0
- package/dist/mcp/action-catalog-types.d.ts +14 -0
- package/dist/mcp/action-catalog.gen.d.ts +2 -0
- package/dist/mcp/action-descriptions.d.ts +4 -0
- package/dist/mcp/action-schema-imports.gen.d.ts +1 -0
- package/dist/mcp/capability-account-readiness.d.ts +7 -0
- package/dist/mcp/child-read-evidence.d.ts +9 -0
- package/dist/mcp/company-profile-agent-admin.d.ts +12 -0
- package/dist/mcp/contract-input.d.ts +13 -0
- package/dist/mcp/documents.d.ts +2 -0
- package/dist/mcp/first-party-tool-permissions.d.ts +3 -606
- package/dist/mcp/notification-tools.d.ts +26 -0
- package/dist/mcp/orchestration-failure-diagnostic.d.ts +43 -0
- package/dist/mcp/scheduled-task-input.d.ts +1309 -0
- package/dist/mcp/scheduled-task-view.d.ts +217 -3
- package/dist/mcp/secret-tools.d.ts +14 -0
- package/dist/mcp/server.d.ts +108 -5
- package/dist/mcp/session-admin-access-tools.d.ts +33 -0
- package/dist/mcp/session-event-errors.d.ts +28 -0
- package/dist/mcp/session-event-view.d.ts +62 -0
- package/dist/mcp/session-view.d.ts +15 -0
- package/dist/mcp/session-wait.d.ts +18 -0
- package/dist/mcp/site-agent-clamp-tools.d.ts +38 -0
- package/dist/mcp/site-data-tools.d.ts +22 -0
- package/dist/mcp/site-publication-tools.d.ts +19 -0
- package/dist/mcp/site-sql-tools.d.ts +27 -0
- package/dist/mcp-oauth.d.ts +37 -4
- package/dist/model-calls/chat-completions.d.ts +87 -0
- package/dist/model-calls/pending-usage-settlements.d.ts +57 -0
- package/dist/model-calls/service.d.ts +36 -0
- package/dist/model-catalog.d.ts +9 -3
- package/dist/native-push-dispatch.d.ts +69 -0
- package/dist/observability.d.ts +3 -1
- package/dist/organization-mcp.d.ts +82 -0
- package/dist/prepared-mcp-actor.d.ts +77 -0
- package/dist/prepared-mcp-permissions.d.ts +8 -0
- package/dist/routes/analytics-consent.d.ts +26 -0
- package/dist/routes/api-integrations.d.ts +11 -0
- package/dist/routes/api-keys.d.ts +7 -7
- package/dist/routes/automations.d.ts +2 -0
- package/dist/routes/billing.d.ts +59 -0
- package/dist/routes/browser-sessions.d.ts +65 -2
- package/dist/routes/chat-completions.d.ts +11 -0
- package/dist/routes/claude-core-usage.d.ts +20 -0
- package/dist/routes/claude-subscription-accounts.d.ts +3 -0
- package/dist/routes/claude-subscription-oauth.d.ts +3 -0
- package/dist/routes/client-errors.d.ts +182 -0
- package/dist/routes/codex-core.d.ts +401 -0
- package/dist/routes/codex.d.ts +64 -2
- package/dist/routes/computer-sessions.d.ts +6 -1
- package/dist/routes/desktop-distribution.d.ts +32 -0
- package/dist/routes/github-browser-fonts.gen.d.ts +2 -0
- package/dist/routes/github-browser-pages.d.ts +27 -0
- package/dist/routes/inbox.d.ts +13 -0
- package/dist/routes/insights-response-cache.d.ts +10 -0
- package/dist/routes/insights-usage.d.ts +12 -0
- package/dist/routes/insights.d.ts +28 -0
- package/dist/routes/interaction-placement-message.d.ts +7 -0
- package/dist/routes/managed-sign-in-methods.d.ts +6 -0
- package/dist/routes/model-account-choice.d.ts +13 -0
- package/dist/routes/model-account-settings.d.ts +19 -0
- package/dist/routes/native-app-auth.d.ts +12 -0
- package/dist/routes/organization-integration-policy.d.ts +8 -0
- package/dist/routes/organization-integrations.d.ts +6 -0
- package/dist/routes/organization-mcp-connections.d.ts +3 -0
- package/dist/routes/organization-model-defaults.d.ts +9 -0
- package/dist/routes/organization-service-accounts.d.ts +3 -0
- package/dist/routes/personal-api-keys.d.ts +3 -0
- package/dist/routes/session-admin-access.d.ts +3 -0
- package/dist/routes/session-artifact-associations.d.ts +4 -0
- package/dist/routes/session-history-imports.d.ts +20 -0
- package/dist/routes/sessions.d.ts +38 -2
- package/dist/routes/site-data.d.ts +18 -0
- package/dist/routes/site-publishing.d.ts +5 -0
- package/dist/routes/site-runtime.d.ts +31 -0
- package/dist/routes/site-sql.d.ts +16 -0
- package/dist/routes/slack-bot-access.d.ts +3 -0
- package/dist/routes/subscription-account-pools.d.ts +21 -0
- package/dist/routes/subscription-core-http.d.ts +5 -0
- package/dist/routes/subscription-pool-access.d.ts +37 -0
- package/dist/routes/subscription-pool-core.d.ts +153 -0
- package/dist/routes/supergrok.d.ts +6 -6
- package/dist/routes/usage-allowances.d.ts +12 -0
- package/dist/routes/variable-sets-removed.d.ts +2 -0
- package/dist/routes/vault-providers.d.ts +34 -0
- package/dist/routes/vaults.d.ts +3 -0
- package/dist/routes/workspace-integrations.d.ts +35 -0
- package/dist/routes/workspace-model-providers.d.ts +4 -0
- package/dist/routes/workspaces.d.ts +11 -2
- package/dist/sandbox/agent-update.d.ts +64 -0
- package/dist/sandbox/auth-callout.d.ts +8 -0
- package/dist/sandbox/channel-a.d.ts +15 -1
- package/dist/sandbox/enrollment.d.ts +26 -4
- package/dist/sandbox/machine-audience.d.ts +29 -0
- package/dist/sandbox/machines.d.ts +15 -2
- package/dist/sandbox/metrics-ingestion.d.ts +6 -2
- package/dist/sandbox/screen-control.d.ts +85 -0
- package/dist/sandbox/viewer.d.ts +5 -1
- package/dist/sandbox-file-artifacts.d.ts +17 -1
- package/dist/scheduled-task-blockers.d.ts +39 -0
- package/dist/scheduled-task-deletion.d.ts +3 -4
- package/dist/scheduled-task-lifecycle.d.ts +14 -0
- package/dist/secret-answers.d.ts +40 -0
- package/dist/session-create-observability.d.ts +5 -0
- package/dist/session-event-view-36GO3IL7.js +528 -0
- package/dist/session-event-view-36GO3IL7.js.map +1 -0
- package/dist/signed-state-secret.d.ts +18 -0
- package/dist/site-agent-guard.d.ts +53 -0
- package/dist/site-data/operations.d.ts +103 -0
- package/dist/site-data/service.d.ts +203 -0
- package/dist/site-frame-guard.d.ts +32 -0
- package/dist/site-publishing/agent-data-tools.d.ts +84 -0
- package/dist/site-publishing/agent-model.d.ts +58 -0
- package/dist/site-publishing/agent-session.d.ts +16 -0
- package/dist/site-publishing/content-scanner.d.ts +31 -0
- package/dist/site-publishing/edge-sync.d.ts +48 -0
- package/dist/site-publishing/gateway-signature.d.ts +56 -0
- package/dist/site-publishing/limits.d.ts +63 -0
- package/dist/site-publishing/page-tool-authority.d.ts +30 -0
- package/dist/site-publishing/platform-usage.d.ts +113 -0
- package/dist/site-publishing/platform.d.ts +21 -0
- package/dist/site-publishing/readiness.d.ts +62 -0
- package/dist/site-publishing/runtime.d.ts +179 -0
- package/dist/site-publishing/service.d.ts +264 -0
- package/dist/site-publishing/session-events.d.ts +22 -0
- package/dist/site-publishing/session-views.d.ts +36 -0
- package/dist/site-publishing/viewer.d.ts +40 -0
- package/dist/site-session-origin.d.ts +31 -6
- package/dist/site-sql/format.d.ts +47 -0
- package/dist/site-sql/gateway.d.ts +50 -0
- package/dist/site-sql/service.d.ts +213 -0
- package/dist/temporal-schedule-sync.d.ts +26 -0
- package/dist/transcription/billing-refusal.d.ts +8 -0
- package/dist/transcription/normalize.d.ts +23 -0
- package/dist/transcription/providers/azure-mai.d.ts +12 -0
- package/dist/transcription/providers/azure-openai.d.ts +4 -0
- package/dist/transcription/providers/openai.d.ts +16 -0
- package/dist/transcription/providers/subscription-core.d.ts +39 -0
- package/dist/transcription/service.d.ts +10 -1
- package/dist/transcription/wav-duration.d.ts +8 -0
- package/dist/workspace-tool-gateway-attestations.d.ts +37 -0
- package/dist/workspace-tool-gateway-observability.d.ts +16 -0
- package/dist/workspace-tool-gateway-secrets.d.ts +27 -0
- package/dist/workspace-tool-gateway.d.ts +102 -6
- package/dist/workspace-tool-target-fence.d.ts +116 -0
- package/dist/workspace-tool-target.d.ts +225 -0
- package/dist/workspace-webhook-dispatch.d.ts +26 -0
- package/dist/xai-subscription-core.d.ts +60 -0
- package/package.json +25 -20
- package/src/access-grant-rls.ts +64 -14
- package/src/admission-trace.ts +14 -0
- package/src/app.ts +1684 -252
- package/src/artifact-catalog-cursor.ts +1 -0
- package/src/attached-browser-viewer.ts +26 -0
- package/src/auth/managed-auth-attempt-context.ts +9 -0
- package/src/auth/managed-auth-rate-limits.ts +252 -0
- package/src/auth/managed-auth-session-adapter.ts +64 -29
- package/src/auth/managed-auth.ts +303 -35
- package/src/auth/managed-email.ts +18 -1
- package/src/auth/managed-sign-in-notifications.ts +81 -0
- package/src/auth/new-signups-gate.ts +49 -0
- package/src/auth/organization-user-setup.ts +3 -3
- package/src/auth/signup-funnel-metrics.ts +164 -0
- package/src/azure-live.ts +103 -0
- package/src/browser-action-fences.ts +45 -0
- package/src/browser-controller-authority.ts +1 -186
- package/src/browser-ephemeral.ts +39 -0
- package/src/browser-lost-runtime-end.ts +71 -0
- package/src/browser-state-authority.ts +1 -236
- package/src/claude-default-models.ts +37 -0
- package/src/claude-subscription-core.ts +154 -0
- package/src/claude-subscription-oauth.ts +352 -0
- package/src/claude-subscription-profile.ts +73 -0
- package/src/claude-subscription-usage.ts +51 -0
- package/src/claude-workspace-connection.ts +82 -0
- package/src/codemode.ts +236 -39
- package/src/codex-realtime.ts +181 -53
- package/src/codex-session-pointers.ts +80 -0
- package/src/company-brain-okf.ts +1 -1
- package/src/connected-machine-computer-access.ts +2 -1
- package/src/connection-ownership.ts +19 -13
- package/src/controller-data-plane.ts +34 -0
- package/src/credit-promotion-snapshot.ts +36 -0
- package/src/editable-artifact-production.ts +10 -0
- package/src/editable-artifact-source-session.ts +123 -0
- package/src/editable-artifact-websocket.ts +16 -3
- package/src/fatal-process-boundary.ts +67 -3
- package/src/gateway-realtime.ts +12 -8
- package/src/github-access.ts +31 -5
- package/src/github-browser-flow.ts +1 -1
- package/src/http/acting-person.ts +105 -0
- package/src/http/api-contract-compat.ts +49 -0
- package/src/http/api-error.ts +210 -2
- package/src/http/auth.ts +68 -4
- package/src/http/cors.ts +37 -5
- package/src/http/deprecation.ts +118 -0
- package/src/http/keyed-admission.ts +29 -0
- package/src/http/local-browser-boundary.ts +343 -0
- package/src/http/metrics-listener.ts +57 -0
- package/src/http/path-identifier.ts +54 -0
- package/src/http/registered-route-label.ts +34 -0
- package/src/http/rejection-telemetry.ts +120 -0
- package/src/http/request-body.ts +127 -0
- package/src/http/request-source.ts +154 -13
- package/src/http/sse.ts +88 -28
- package/src/http/unmatched-route.ts +60 -0
- package/src/http/user-content.ts +158 -0
- package/src/http/variable-sets-removed.ts +122 -0
- package/src/http/websocket-upgrade-dispatch.ts +29 -0
- package/src/index.ts +107 -57
- package/src/integration-connect-metrics.ts +228 -0
- package/src/integration-endpoint-test.ts +291 -0
- package/src/integrations/api-integrations.ts +81 -7
- package/src/integrations/atlassian.ts +202 -83
- package/src/integrations/fiken.ts +66 -38
- package/src/integrations/github-app-connect.ts +64 -18
- package/src/integrations/github-lens-connect.ts +8 -29
- package/src/integrations/google-drive.ts +448 -152
- package/src/integrations/integration-commit-authority.ts +69 -0
- package/src/integrations/marketplace-plugin.ts +1 -1
- package/src/integrations/oauth-client.ts +733 -193
- package/src/integrations/oauth-profiles.ts +116 -45
- package/src/integrations/onepassword-vault-provider.ts +16 -0
- package/src/integrations/personal-github-repositories.ts +1 -1
- package/src/integrations/personal-github.ts +61 -35
- package/src/integrations/provider-oauth.ts +67 -85
- package/src/integrations/slack-app-home.ts +5 -5
- package/src/integrations/slack-bot.ts +893 -201
- package/src/integrations/slack-file-upload-flow.ts +147 -0
- package/src/integrations/slack-install.ts +7 -7
- package/src/integrations/slack-interactions.ts +1589 -299
- package/src/integrations/slack-mrkdwn.ts +193 -0
- package/src/integrations/slack-routing.ts +2 -2
- package/src/integrations/slack-session-defaults.ts +224 -0
- package/src/integrations/slack-task-file-upload.ts +323 -0
- package/src/integrations/slack-tool-review.ts +65 -0
- package/src/integrations/social-oauth.ts +90 -58
- package/src/interaction-agent-access.ts +40 -20
- package/src/interaction-agent-version.ts +85 -0
- package/src/interaction-holder-heartbeat.ts +24 -8
- package/src/interaction-metrics.ts +164 -2
- package/src/interaction-route-stages.ts +94 -0
- package/src/interaction-secrets-vault.ts +213 -0
- package/src/interaction-secrets.ts +426 -0
- package/src/mcp/action-catalog-types.ts +14 -0
- package/src/mcp/action-catalog.gen.ts +8014 -0
- package/src/mcp/action-descriptions.ts +299 -0
- package/src/mcp/action-schema-imports.gen.ts +304 -0
- package/src/mcp/capability-account-readiness.ts +17 -0
- package/src/mcp/child-read-evidence.ts +19 -0
- package/src/mcp/company-profile-agent-admin.ts +13 -0
- package/src/mcp/contract-input.ts +165 -0
- package/src/mcp/documents.ts +9 -2
- package/src/mcp/editable-artifacts.ts +29 -11
- package/src/mcp/files.ts +5 -1
- package/src/mcp/first-party-tool-permissions.ts +7 -285
- package/src/mcp/knowledge-entries.ts +108 -34
- package/src/mcp/notification-tools.ts +480 -0
- package/src/mcp/orchestration-failure-diagnostic.ts +43 -0
- package/src/mcp/scheduled-task-input.ts +89 -0
- package/src/mcp/scheduled-task-view.ts +63 -3
- package/src/mcp/secret-tools.ts +185 -0
- package/src/mcp/server.ts +2213 -1116
- package/src/mcp/session-admin-access-tools.ts +163 -0
- package/src/mcp/session-event-errors.ts +123 -0
- package/src/mcp/session-event-view.ts +395 -13
- package/src/mcp/session-view.ts +3 -0
- package/src/mcp/session-wait.ts +67 -7
- package/src/mcp/site-agent-clamp-tools.ts +140 -0
- package/src/mcp/site-data-tools.ts +339 -0
- package/src/mcp/site-publication-tools.ts +201 -0
- package/src/mcp/site-sql-tools.ts +427 -0
- package/src/mcp-oauth.ts +635 -45
- package/src/model-calls/chat-completions.ts +352 -0
- package/src/model-calls/pending-usage-settlements.ts +125 -0
- package/src/model-calls/service.ts +694 -0
- package/src/model-catalog.ts +68 -17
- package/src/native-push-dispatch.ts +457 -0
- package/src/observability.ts +15 -1
- package/src/organization-mcp.ts +485 -0
- package/src/prepared-mcp-actor.ts +154 -0
- package/src/prepared-mcp-permissions.ts +38 -0
- package/src/routes/analytics-consent.ts +123 -0
- package/src/routes/api-integrations.ts +268 -9
- package/src/routes/api-keys.ts +164 -25
- package/src/routes/artifact-catalog.ts +111 -0
- package/src/routes/automations.ts +163 -90
- package/src/routes/billing.ts +535 -59
- package/src/routes/browser-sessions.ts +966 -342
- package/src/routes/canonical-human-identities.ts +61 -0
- package/src/routes/capabilities.ts +112 -5
- package/src/routes/channels.ts +4 -3
- package/src/routes/chat-completions.ts +235 -0
- package/src/routes/claude-core-usage.ts +147 -0
- package/src/routes/claude-subscription-accounts.ts +233 -0
- package/src/routes/claude-subscription-oauth.ts +175 -0
- package/src/routes/client-errors.ts +394 -0
- package/src/routes/codex-core.ts +687 -0
- package/src/routes/codex.ts +1277 -1119
- package/src/routes/company-brain.ts +4 -0
- package/src/routes/computer-sessions.ts +319 -85
- package/src/routes/connect.ts +277 -175
- package/src/routes/connections.ts +690 -363
- package/src/routes/desktop-distribution.ts +217 -0
- package/src/routes/documents.ts +13 -7
- package/src/routes/editable-artifacts.ts +74 -4
- package/src/routes/enrollments.ts +110 -16
- package/src/routes/external-identity-links.ts +13 -12
- package/src/routes/files.ts +41 -16
- package/src/routes/github-browser-fonts.gen.ts +12 -0
- package/src/routes/github-browser-pages.ts +258 -0
- package/src/routes/github.ts +200 -75
- package/src/routes/inbox.ts +353 -0
- package/src/routes/insights-response-cache.ts +83 -0
- package/src/routes/insights-usage.ts +345 -0
- package/src/routes/insights.ts +103 -8
- package/src/routes/install.ts +51 -10
- package/src/routes/integration-facets.ts +70 -28
- package/src/routes/interaction-placement-message.ts +12 -0
- package/src/routes/knowledge.ts +136 -27
- package/src/routes/machines.ts +189 -135
- package/src/routes/managed-auth-session-sets.ts +43 -10
- package/src/routes/managed-onboarding.ts +39 -19
- package/src/routes/managed-sign-in-methods.ts +433 -0
- package/src/routes/memory-slack-publications.ts +3 -2
- package/src/routes/model-account-choice.ts +194 -0
- package/src/routes/model-account-settings.ts +235 -0
- package/src/routes/model-connection-access.ts +210 -48
- package/src/routes/native-app-auth.ts +296 -0
- package/src/routes/organization-integration-policy.ts +116 -0
- package/src/routes/organization-integrations.ts +326 -0
- package/src/routes/organization-mcp-connections.ts +183 -0
- package/src/routes/organization-memberships.ts +205 -19
- package/src/routes/organization-model-defaults.ts +110 -0
- package/src/routes/organization-model-providers.ts +74 -3
- package/src/routes/organization-service-accounts.ts +128 -0
- package/src/routes/organization-sessions.ts +21 -5
- package/src/routes/personal-api-keys.ts +184 -0
- package/src/routes/personal-github-git-broker.ts +2 -2
- package/src/routes/personal-github.ts +9 -4
- package/src/routes/plugins.ts +46 -7
- package/src/routes/pr-review-github.ts +105 -118
- package/src/routes/pr-review.ts +88 -82
- package/src/routes/preference-registry.ts +18 -0
- package/src/routes/rigs.ts +48 -13
- package/src/routes/scheduled-tasks.ts +347 -27
- package/src/routes/session-admin-access.ts +271 -0
- package/src/routes/session-artifact-associations.ts +164 -0
- package/src/routes/session-history-imports.ts +305 -0
- package/src/routes/sessions.ts +1682 -363
- package/src/routes/site-data.ts +340 -0
- package/src/routes/site-publishing.ts +584 -0
- package/src/routes/site-runtime.ts +1944 -0
- package/src/routes/site-sql.ts +263 -0
- package/src/routes/skill-content.ts +72 -7
- package/src/routes/skills.ts +5 -4
- package/src/routes/slack-bot-access.ts +108 -0
- package/src/routes/social.ts +27 -15
- package/src/routes/subscription-account-pools.ts +209 -0
- package/src/routes/subscription-core-http.ts +18 -0
- package/src/routes/subscription-pool-access.ts +180 -0
- package/src/routes/subscription-pool-core.ts +552 -0
- package/src/routes/supergrok.ts +174 -655
- package/src/routes/transcription-recordings.ts +71 -4
- package/src/routes/transcriptions.ts +26 -2
- package/src/routes/usage-allowances.ts +381 -0
- package/src/routes/variable-sets-removed.ts +19 -0
- package/src/routes/vault-providers.ts +782 -0
- package/src/routes/vaults.ts +421 -0
- package/src/routes/video-generation.ts +30 -12
- package/src/routes/workspace-artifacts.ts +165 -53
- package/src/routes/workspace-integrations.ts +576 -0
- package/src/routes/workspace-model-providers.ts +148 -0
- package/src/routes/workspace-state.ts +4 -0
- package/src/routes/workspaces.ts +625 -117
- package/src/sandbox/agent-update.ts +315 -0
- package/src/sandbox/auth-callout.ts +104 -21
- package/src/sandbox/channel-a.ts +165 -55
- package/src/sandbox/enrollment.ts +131 -22
- package/src/sandbox/machine-audience.ts +192 -0
- package/src/sandbox/machines.ts +75 -31
- package/src/sandbox/metrics-ingestion.ts +133 -2
- package/src/sandbox/rematerialize.ts +51 -21
- package/src/sandbox/screen-control.ts +289 -0
- package/src/sandbox/viewer.ts +33 -58
- package/src/sandbox-file-artifacts.ts +53 -27
- package/src/scheduled-task-blockers.ts +293 -0
- package/src/scheduled-task-deletion.ts +13 -3
- package/src/scheduled-task-lifecycle.ts +84 -0
- package/src/secret-answers.ts +119 -0
- package/src/session-create-observability.ts +46 -0
- package/src/session-realtime-context.ts +26 -4
- package/src/signed-state-secret.ts +58 -0
- package/src/site-agent-guard.ts +261 -0
- package/src/site-data/operations.ts +777 -0
- package/src/site-data/service.ts +1043 -0
- package/src/site-frame-guard.ts +107 -0
- package/src/site-publishing/agent-data-tools.ts +250 -0
- package/src/site-publishing/agent-model.ts +127 -0
- package/src/site-publishing/agent-session.ts +148 -0
- package/src/site-publishing/content-scanner.ts +93 -0
- package/src/site-publishing/edge-sync.ts +148 -0
- package/src/site-publishing/gateway-signature.ts +198 -0
- package/src/site-publishing/limits.ts +315 -0
- package/src/site-publishing/page-tool-authority.ts +111 -0
- package/src/site-publishing/platform-usage.ts +479 -0
- package/src/site-publishing/platform.ts +98 -0
- package/src/site-publishing/readiness.ts +330 -0
- package/src/site-publishing/runtime.ts +831 -0
- package/src/site-publishing/service.ts +1282 -0
- package/src/site-publishing/session-events.ts +262 -0
- package/src/site-publishing/session-views.ts +262 -0
- package/src/site-publishing/viewer.ts +75 -0
- package/src/site-session-origin.ts +91 -6
- package/src/site-sql/format.ts +134 -0
- package/src/site-sql/gateway.ts +168 -0
- package/src/site-sql/service.ts +1636 -0
- package/src/site-uploads.ts +27 -5
- package/src/temporal-schedule-sync.ts +74 -0
- package/src/transcription/billing-refusal.ts +14 -0
- package/src/transcription/normalize.ts +77 -0
- package/src/transcription/providers/azure-mai.ts +98 -0
- package/src/transcription/providers/azure-openai.ts +16 -7
- package/src/transcription/providers/codex-subscription.ts +190 -67
- package/src/transcription/providers/openai.ts +79 -5
- package/src/transcription/providers/subscription-core.ts +125 -0
- package/src/transcription/providers/xai-subscription.ts +81 -83
- package/src/transcription/segmenter.ts +7 -1
- package/src/transcription/service.ts +239 -10
- package/src/transcription/wav-duration.ts +39 -0
- package/src/workspace-deletion.ts +25 -1
- package/src/workspace-tool-gateway-attestations.ts +133 -0
- package/src/workspace-tool-gateway-observability.ts +64 -0
- package/src/workspace-tool-gateway-secrets.ts +104 -0
- package/src/workspace-tool-gateway.ts +921 -103
- package/src/workspace-tool-target-fence.ts +380 -0
- package/src/workspace-tool-target.ts +554 -0
- package/src/workspace-webhook-dispatch.ts +225 -0
- package/src/xai-realtime.ts +85 -81
- package/src/xai-subscription-core.ts +172 -0
- package/dist/browser-auth-broker.d.ts +0 -20
- package/dist/chunk-AJ62T5QN.js.map +0 -1
- package/dist/connection-authority-owner.d.ts +0 -59
- package/dist/routes/connection-authorities.d.ts +0 -3
- package/dist/routes/environments.d.ts +0 -5
- package/dist/routes/host-mcp-bindings.d.ts +0 -5
- package/dist/routes/host-mcp-resolvers.d.ts +0 -3
- package/dist/routes/packs.d.ts +0 -3
- package/dist/session-event-view-MU3HMNV3.js +0 -264
- package/dist/session-event-view-MU3HMNV3.js.map +0 -1
- package/dist/xai-subscription-auth.d.ts +0 -23
- package/src/browser-auth-broker.ts +0 -155
- package/src/connection-authority-owner.ts +0 -61
- package/src/routes/connection-authorities.ts +0 -139
- package/src/routes/environments.ts +0 -388
- package/src/routes/host-mcp-bindings.ts +0 -122
- package/src/routes/host-mcp-resolvers.ts +0 -41
- package/src/routes/packs.ts +0 -784
- 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 {
|
|
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
|
-
|
|
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 {
|
|
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(
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
537
|
-
|
|
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
|
-
|
|
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
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
const
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
1256
|
+
const enrollment = await resolveChannelAMachineConnection(
|
|
1045
1257
|
deps.db,
|
|
1046
|
-
|
|
1047
|
-
|
|
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
|
}
|