@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
|
@@ -139,9 +139,9 @@ export function renderOrganizationUserSetupEmail(input: OrganizationUserSetupEma
|
|
|
139
139
|
return {
|
|
140
140
|
from: input.senderEmail,
|
|
141
141
|
to: input.recipientEmail,
|
|
142
|
-
subject: `You're invited to join ${input.organizationName} on
|
|
143
|
-
text: `${greeting}\n\nYou've been invited to join ${input.organizationName} on
|
|
144
|
-
html: `<p>${escapeHtml(greeting)}</p><p>You've been invited to join <strong>${escapeHtml(input.organizationName)}</strong> on
|
|
142
|
+
subject: `You're invited to join ${input.organizationName} on Opengeni`,
|
|
143
|
+
text: `${greeting}\n\nYou've been invited to join ${input.organizationName} on Opengeni as ${role}.\n\n${workspaceSummary}\n\nThis invitation grants only the organization role and shared workspace access listed above. It never shares anyone's Personal workspace.\n\nAccept invitation to ${input.organizationName}: ${input.setupUrl}\n\nYou'll sign in or create an account before joining. Already use Opengeni? Open this invitation and choose Sign in as ${input.recipientEmail}. Opengeni will show the invitation immediately after you sign in.`,
|
|
144
|
+
html: `<p>${escapeHtml(greeting)}</p><p>You've been invited to join <strong>${escapeHtml(input.organizationName)}</strong> on Opengeni as ${escapeHtml(role)}.</p>${workspaceHtml}<p>This invitation grants only the organization role and shared workspace access listed above. It never shares anyone's Personal workspace.</p><p><a href="${escapeHtml(input.setupUrl)}">Accept invitation to ${escapeHtml(input.organizationName)}</a></p><p>You'll sign in or create an account before joining. Already use Opengeni? Open this invitation and choose <strong>Sign in as ${escapeHtml(input.recipientEmail)}</strong>. Opengeni will show the invitation immediately after you sign in.</p>`,
|
|
145
145
|
};
|
|
146
146
|
}
|
|
147
147
|
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import {
|
|
2
|
+
SIGNUP_ACQUISITION_SOURCES,
|
|
3
|
+
signupAcquisitionSource,
|
|
4
|
+
type SignupAcquisitionSource,
|
|
5
|
+
} from "@opengeni/contracts";
|
|
6
|
+
import type { Observability } from "@opengeni/observability";
|
|
7
|
+
import { getOAuthState } from "better-auth/api";
|
|
8
|
+
|
|
9
|
+
import {
|
|
10
|
+
currentManagedAuthProviderId,
|
|
11
|
+
shouldDiscardCurrentManagedAuthProviderSession,
|
|
12
|
+
} from "./managed-auth-attempt-context";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Content-free sign-up funnel counters. Every label is a closed set: no user,
|
|
16
|
+
* email, organization, workspace, or campaign value ever becomes a label.
|
|
17
|
+
*/
|
|
18
|
+
export const AUTH_FUNNEL_EVENTS = ["sign_up", "email_verified", "sign_in"] as const;
|
|
19
|
+
export type AuthFunnelEvent = (typeof AUTH_FUNNEL_EVENTS)[number];
|
|
20
|
+
export const AUTH_FUNNEL_METHODS = ["email", "google", "github", "other"] as const;
|
|
21
|
+
export type AuthFunnelMethod = (typeof AUTH_FUNNEL_METHODS)[number];
|
|
22
|
+
export const ORGANIZATION_SETUP_OUTCOMES = ["created", "failed"] as const;
|
|
23
|
+
export type OrganizationSetupOutcome = (typeof ORGANIZATION_SETUP_OUTCOMES)[number];
|
|
24
|
+
|
|
25
|
+
const AUTH_EVENTS_METRIC = {
|
|
26
|
+
name: "opengeni_auth_events_total",
|
|
27
|
+
help: "Managed authentication funnel events (sign-up, email verification, sign-in) by closed method.",
|
|
28
|
+
} as const;
|
|
29
|
+
const ORGANIZATION_SETUP_METRIC = {
|
|
30
|
+
name: "opengeni_organization_setup_total",
|
|
31
|
+
help: "Self-service post-sign-in organization setup outcomes.",
|
|
32
|
+
} as const;
|
|
33
|
+
const SIGNUP_ACQUISITION_METRIC = {
|
|
34
|
+
name: "opengeni_signup_acquisition_total",
|
|
35
|
+
help: "New managed users by normalized first-touch acquisition source.",
|
|
36
|
+
} as const;
|
|
37
|
+
|
|
38
|
+
/** The only observability surface funnel telemetry uses. */
|
|
39
|
+
export type SignupFunnelObservability = Pick<Observability, "incrementCounter">;
|
|
40
|
+
|
|
41
|
+
/** Better Auth request-body / OAuth-state key that carries first-touch attribution. */
|
|
42
|
+
export const SIGNUP_ATTRIBUTION_AUTH_FIELD = "opengeniAttribution";
|
|
43
|
+
|
|
44
|
+
export type SignupFunnelMetrics = {
|
|
45
|
+
/** A managed auth user was created (Better Auth `user.create.after`). */
|
|
46
|
+
recordSignUp(authContext: unknown): Promise<void>;
|
|
47
|
+
/** A managed user verified their email address. */
|
|
48
|
+
recordEmailVerified(): void;
|
|
49
|
+
/**
|
|
50
|
+
* A provider session was created that is not an internally discarded one.
|
|
51
|
+
* In the legacy session-set mode this includes the session the first
|
|
52
|
+
* successful email-verification click creates: that is the new user's first
|
|
53
|
+
* sign-in, so it is counted rather than folded into `email_verified`.
|
|
54
|
+
*/
|
|
55
|
+
recordSignIn(): void;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export function authFunnelMethod(providerId: string | null | undefined): AuthFunnelMethod {
|
|
59
|
+
if (providerId === "credential") return "email";
|
|
60
|
+
if (providerId === "google" || providerId === "github") return providerId;
|
|
61
|
+
return "other";
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Publish every closed series at zero so dashboards and alerts can tell a quiet
|
|
66
|
+
* funnel from missing instrumentation. Never throws: a metric-registry failure
|
|
67
|
+
* must not stop managed auth (and with it API startup) from composing.
|
|
68
|
+
*/
|
|
69
|
+
export function registerSignupFunnelMetricBaselines(
|
|
70
|
+
observability: SignupFunnelObservability,
|
|
71
|
+
): void {
|
|
72
|
+
const baseline = (
|
|
73
|
+
metric: { name: string; help: string },
|
|
74
|
+
labels: Record<string, string>,
|
|
75
|
+
): void => {
|
|
76
|
+
try {
|
|
77
|
+
observability.incrementCounter({ ...metric, labels, amount: 0 });
|
|
78
|
+
} catch {
|
|
79
|
+
// Telemetry only; the series appears on its first real increment.
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
for (const event of AUTH_FUNNEL_EVENTS) {
|
|
83
|
+
for (const method of AUTH_FUNNEL_METHODS) baseline(AUTH_EVENTS_METRIC, { event, method });
|
|
84
|
+
}
|
|
85
|
+
for (const outcome of ORGANIZATION_SETUP_OUTCOMES) {
|
|
86
|
+
baseline(ORGANIZATION_SETUP_METRIC, { outcome });
|
|
87
|
+
}
|
|
88
|
+
for (const source of SIGNUP_ACQUISITION_SOURCES) baseline(SIGNUP_ACQUISITION_METRIC, { source });
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export function createSignupFunnelMetrics(
|
|
92
|
+
observability: SignupFunnelObservability,
|
|
93
|
+
): SignupFunnelMetrics {
|
|
94
|
+
registerSignupFunnelMetricBaselines(observability);
|
|
95
|
+
const authEvent = (event: AuthFunnelEvent, method: AuthFunnelMethod) => {
|
|
96
|
+
observability.incrementCounter({ ...AUTH_EVENTS_METRIC, labels: { event, method } });
|
|
97
|
+
};
|
|
98
|
+
return {
|
|
99
|
+
recordSignUp: async (authContext) => {
|
|
100
|
+
try {
|
|
101
|
+
authEvent("sign_up", authFunnelMethod(currentManagedAuthProviderId()));
|
|
102
|
+
const source: SignupAcquisitionSource = signupAcquisitionSource(
|
|
103
|
+
await signupAttributionFromAuthContext(authContext),
|
|
104
|
+
);
|
|
105
|
+
observability.incrementCounter({ ...SIGNUP_ACQUISITION_METRIC, labels: { source } });
|
|
106
|
+
} catch {
|
|
107
|
+
// Funnel telemetry must never fail account creation.
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
recordEmailVerified: () => {
|
|
111
|
+
try {
|
|
112
|
+
authEvent("email_verified", "email");
|
|
113
|
+
} catch {
|
|
114
|
+
/* Telemetry only. */
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
recordSignIn: () => {
|
|
118
|
+
try {
|
|
119
|
+
// Session-set mode discards the provider session of a non-callback
|
|
120
|
+
// Better Auth call; the product transaction then creates the real one.
|
|
121
|
+
if (shouldDiscardCurrentManagedAuthProviderSession()) return;
|
|
122
|
+
authEvent("sign_in", authFunnelMethod(currentManagedAuthProviderId()));
|
|
123
|
+
} catch {
|
|
124
|
+
/* Telemetry only. */
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/** Count one self-service organization setup request outcome. */
|
|
131
|
+
export function recordOrganizationSetupOutcome(
|
|
132
|
+
observability: SignupFunnelObservability | undefined,
|
|
133
|
+
outcome: OrganizationSetupOutcome,
|
|
134
|
+
): void {
|
|
135
|
+
try {
|
|
136
|
+
observability?.incrementCounter({ ...ORGANIZATION_SETUP_METRIC, labels: { outcome } });
|
|
137
|
+
} catch {
|
|
138
|
+
// Telemetry must never change the setup response.
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Read untrusted first-touch attribution from the Better Auth endpoint that is
|
|
144
|
+
* creating the user: the email sign-up body, or the server-side OAuth state
|
|
145
|
+
* (`additionalData`) that the social start stored for its callback.
|
|
146
|
+
*/
|
|
147
|
+
export async function signupAttributionFromAuthContext(authContext: unknown): Promise<unknown> {
|
|
148
|
+
const body =
|
|
149
|
+
authContext && typeof authContext === "object"
|
|
150
|
+
? (authContext as { body?: unknown }).body
|
|
151
|
+
: undefined;
|
|
152
|
+
if (body && typeof body === "object" && SIGNUP_ATTRIBUTION_AUTH_FIELD in body) {
|
|
153
|
+
return (body as Record<string, unknown>)[SIGNUP_ATTRIBUTION_AUTH_FIELD];
|
|
154
|
+
}
|
|
155
|
+
try {
|
|
156
|
+
const state: unknown = await getOAuthState();
|
|
157
|
+
if (state && typeof state === "object" && SIGNUP_ATTRIBUTION_AUTH_FIELD in state) {
|
|
158
|
+
return (state as Record<string, unknown>)[SIGNUP_ATTRIBUTION_AUTH_FIELD];
|
|
159
|
+
}
|
|
160
|
+
} catch {
|
|
161
|
+
// Not inside a Better Auth OAuth callback.
|
|
162
|
+
}
|
|
163
|
+
return undefined;
|
|
164
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import type { Settings } from "@opengeni/config";
|
|
2
|
+
import type { CodexRealtimeWebrtcRequest } from "@opengeni/contracts";
|
|
3
|
+
import {
|
|
4
|
+
getActiveSessionHistoryItems,
|
|
5
|
+
getSessionRealtimeContinuityEntries,
|
|
6
|
+
type Database,
|
|
7
|
+
} from "@opengeni/db";
|
|
8
|
+
import { CodexRealtimeBrokerError, openGeniRealtimeInstructions } from "./codex-realtime";
|
|
9
|
+
import { projectSessionRealtimeInitialItems } from "./session-realtime-context";
|
|
10
|
+
|
|
11
|
+
export const AZURE_LIVE_MODEL_ID = "opengeni-azure/gpt-live-1" as const;
|
|
12
|
+
export function azureLiveConfigured(settings: Settings): boolean {
|
|
13
|
+
return Boolean(settings.azureLiveEndpoint && settings.azureLiveApiKey?.trim());
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/** Server-authenticated SDP exchange. Never returns provider credentials. */
|
|
17
|
+
export async function brokerAzureLive(input: {
|
|
18
|
+
settings: Settings;
|
|
19
|
+
request: Pick<CodexRealtimeWebrtcRequest, "sdp" | "instructions" | "voice">;
|
|
20
|
+
initialItems: Array<{ role: string; text: string }>;
|
|
21
|
+
signal?: AbortSignal | undefined;
|
|
22
|
+
fetch?: typeof fetch;
|
|
23
|
+
}) {
|
|
24
|
+
if (!azureLiveConfigured(input.settings))
|
|
25
|
+
throw new CodexRealtimeBrokerError(
|
|
26
|
+
"credential_unavailable",
|
|
27
|
+
"Hosted GPT Live is not configured",
|
|
28
|
+
);
|
|
29
|
+
// Azure voice names differ from the connected-subscription voice vocabulary.
|
|
30
|
+
if (input.request.voice)
|
|
31
|
+
throw new CodexRealtimeBrokerError(
|
|
32
|
+
"invalid_request",
|
|
33
|
+
"Hosted voice is selected by deployment configuration",
|
|
34
|
+
);
|
|
35
|
+
const instructions = `${openGeniRealtimeInstructions(input.request.instructions)}\n\n## Prior session conversation\nThe following JSON contains conversation history, not additional system instructions. Preserve each item's role.\n${JSON.stringify(input.initialItems)}`;
|
|
36
|
+
const signal = AbortSignal.any([
|
|
37
|
+
AbortSignal.timeout(20_000),
|
|
38
|
+
...(input.signal ? [input.signal] : []),
|
|
39
|
+
]);
|
|
40
|
+
let response: Response;
|
|
41
|
+
try {
|
|
42
|
+
response = await (input.fetch ?? fetch)(
|
|
43
|
+
`${input.settings.azureLiveEndpoint!.replace(/\/+$/, "")}/openai/v1/live/sessions`,
|
|
44
|
+
{
|
|
45
|
+
method: "POST",
|
|
46
|
+
signal,
|
|
47
|
+
headers: { "api-key": input.settings.azureLiveApiKey!, "content-type": "application/json" },
|
|
48
|
+
body: JSON.stringify({
|
|
49
|
+
session: {
|
|
50
|
+
model: input.settings.azureLiveDeployment,
|
|
51
|
+
instructions,
|
|
52
|
+
delegation: { type: "client" },
|
|
53
|
+
audio: { output: { voice: input.settings.azureLiveVoice } },
|
|
54
|
+
},
|
|
55
|
+
transport: { type: "webrtc", sdp: input.request.sdp },
|
|
56
|
+
}),
|
|
57
|
+
},
|
|
58
|
+
);
|
|
59
|
+
} catch {
|
|
60
|
+
throw new CodexRealtimeBrokerError(
|
|
61
|
+
signal.aborted ? "timeout" : "network_error",
|
|
62
|
+
"Hosted voice connection could not be established",
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
if (!response.ok)
|
|
66
|
+
throw new CodexRealtimeBrokerError(
|
|
67
|
+
response.status === 429 ? "rate_limited" : "provider_error",
|
|
68
|
+
"Hosted voice connection was rejected",
|
|
69
|
+
response.status,
|
|
70
|
+
);
|
|
71
|
+
const body = await response.json().catch(() => null);
|
|
72
|
+
const sdp = body?.transport?.sdp;
|
|
73
|
+
if (typeof sdp !== "string" || !sdp || sdp.length > 1_048_576)
|
|
74
|
+
throw new CodexRealtimeBrokerError(
|
|
75
|
+
"invalid_provider_response",
|
|
76
|
+
"Hosted voice returned an invalid connection answer",
|
|
77
|
+
);
|
|
78
|
+
return { sdp, version: "v3" as const, model: AZURE_LIVE_MODEL_ID };
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export function buildSessionAzureLiveBroker(
|
|
82
|
+
db: Database,
|
|
83
|
+
settings: Settings,
|
|
84
|
+
workspaceId: string,
|
|
85
|
+
sessionId: string,
|
|
86
|
+
fetchImpl?: typeof fetch,
|
|
87
|
+
) {
|
|
88
|
+
return async (input: {
|
|
89
|
+
request: Pick<CodexRealtimeWebrtcRequest, "sdp" | "instructions" | "voice">;
|
|
90
|
+
signal?: AbortSignal | undefined;
|
|
91
|
+
}) => {
|
|
92
|
+
const [history, continuity] = await Promise.all([
|
|
93
|
+
getActiveSessionHistoryItems(db, workspaceId, sessionId),
|
|
94
|
+
getSessionRealtimeContinuityEntries(db, workspaceId, sessionId),
|
|
95
|
+
]);
|
|
96
|
+
return brokerAzureLive({
|
|
97
|
+
settings,
|
|
98
|
+
...input,
|
|
99
|
+
initialItems: projectSessionRealtimeInitialItems(history, continuity),
|
|
100
|
+
...(fetchImpl ? { fetch: fetchImpl } : {}),
|
|
101
|
+
});
|
|
102
|
+
};
|
|
103
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { BrowserActionRequest, BrowserTargetState } from "@opengeni/contracts";
|
|
2
|
+
|
|
3
|
+
export type BrowserActionFences = {
|
|
4
|
+
expectedTargetGeneration: string;
|
|
5
|
+
expectedDocumentGeneration: string | null;
|
|
6
|
+
expectedFrameId: string | null;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Complete a browser action's causal fences. Supplied fences are kept exactly;
|
|
11
|
+
* any omitted one is the target's current value, read from the live controller
|
|
12
|
+
* only when needed. This keeps the "act on the current document" request to
|
|
13
|
+
* one API round trip instead of a separate target-state request before it.
|
|
14
|
+
*/
|
|
15
|
+
export async function resolveBrowserActionFences(
|
|
16
|
+
request: Pick<
|
|
17
|
+
BrowserActionRequest,
|
|
18
|
+
"expectedTargetGeneration" | "expectedDocumentGeneration" | "expectedFrameId"
|
|
19
|
+
>,
|
|
20
|
+
readTargetState: () => Promise<
|
|
21
|
+
Pick<BrowserTargetState, "targetGeneration" | "documentGeneration" | "frameId">
|
|
22
|
+
>,
|
|
23
|
+
): Promise<BrowserActionFences> {
|
|
24
|
+
if (
|
|
25
|
+
request.expectedTargetGeneration !== undefined &&
|
|
26
|
+
request.expectedDocumentGeneration !== undefined &&
|
|
27
|
+
request.expectedFrameId !== undefined
|
|
28
|
+
) {
|
|
29
|
+
return {
|
|
30
|
+
expectedTargetGeneration: request.expectedTargetGeneration,
|
|
31
|
+
expectedDocumentGeneration: request.expectedDocumentGeneration,
|
|
32
|
+
expectedFrameId: request.expectedFrameId,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
const current = await readTargetState();
|
|
36
|
+
return {
|
|
37
|
+
expectedTargetGeneration: request.expectedTargetGeneration ?? current.targetGeneration,
|
|
38
|
+
expectedDocumentGeneration:
|
|
39
|
+
request.expectedDocumentGeneration === undefined
|
|
40
|
+
? current.documentGeneration
|
|
41
|
+
: request.expectedDocumentGeneration,
|
|
42
|
+
expectedFrameId:
|
|
43
|
+
request.expectedFrameId === undefined ? current.frameId : request.expectedFrameId,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
@@ -1,186 +1 @@
|
|
|
1
|
-
|
|
2
|
-
import type {
|
|
3
|
-
InteractionPlacement,
|
|
4
|
-
NetworkRouteConfiguration,
|
|
5
|
-
NetworkRouteConsistency,
|
|
6
|
-
} from "@opengeni/contracts";
|
|
7
|
-
|
|
8
|
-
type BrowserControllerAuthorityScope = {
|
|
9
|
-
rootSecret: string;
|
|
10
|
-
accountId: string;
|
|
11
|
-
workspaceId: string;
|
|
12
|
-
placement: InteractionPlacement;
|
|
13
|
-
placementInstanceId: string;
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
type BrowserSessionAuthorityScope = BrowserControllerAuthorityScope & {
|
|
17
|
-
browserSessionId: string;
|
|
18
|
-
controllerGeneration: string;
|
|
19
|
-
tokenGeneration: number;
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
type ComputerSessionAuthorityScope = BrowserControllerAuthorityScope & {
|
|
23
|
-
computerSessionId: string;
|
|
24
|
-
controllerGeneration: string;
|
|
25
|
-
tokenGeneration: number;
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
/** Stable placement-admin authority. This token is installed owner-only inside
|
|
29
|
-
* the exact placement and is never persisted or returned by the public API. */
|
|
30
|
-
export function deriveBrowserControllerAdminToken(scope: BrowserControllerAuthorityScope): string {
|
|
31
|
-
return derive(scope.rootSecret, "placement-admin.v1", [
|
|
32
|
-
scope.accountId,
|
|
33
|
-
scope.workspaceId,
|
|
34
|
-
placementKey(scope.placement),
|
|
35
|
-
scope.placementInstanceId,
|
|
36
|
-
]);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/** Deterministic controller credentials. The durable generations are the only
|
|
40
|
-
* stored authority; plaintext tokens can be reconstructed only by API replicas
|
|
41
|
-
* holding the deployment HMAC root. */
|
|
42
|
-
export function deriveBrowserSessionControllerTokens(scope: BrowserSessionAuthorityScope): {
|
|
43
|
-
controlToken: string;
|
|
44
|
-
viewToken: string;
|
|
45
|
-
} {
|
|
46
|
-
const fields = [
|
|
47
|
-
scope.accountId,
|
|
48
|
-
scope.workspaceId,
|
|
49
|
-
placementKey(scope.placement),
|
|
50
|
-
scope.placementInstanceId,
|
|
51
|
-
scope.browserSessionId,
|
|
52
|
-
scope.controllerGeneration,
|
|
53
|
-
scope.tokenGeneration,
|
|
54
|
-
] as const;
|
|
55
|
-
return {
|
|
56
|
-
controlToken: derive(scope.rootSecret, "session-control.v1", fields),
|
|
57
|
-
viewToken: derive(scope.rootSecret, "session-view.v1", fields),
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/** Secret-safe durable identity for one exact route launch. The digest binds
|
|
62
|
-
* the route snapshot and proxy credential without making a password-verifier
|
|
63
|
-
* hash available to database readers. */
|
|
64
|
-
export function deriveBrowserNetworkRouteAuthorityDigest(scope: {
|
|
65
|
-
rootSecret: string;
|
|
66
|
-
accountId: string;
|
|
67
|
-
workspaceId: string;
|
|
68
|
-
browserSessionId: string;
|
|
69
|
-
routeId: string;
|
|
70
|
-
routeVersion: number;
|
|
71
|
-
credentialVersion: number | null;
|
|
72
|
-
configuration: NetworkRouteConfiguration;
|
|
73
|
-
consistency: NetworkRouteConsistency;
|
|
74
|
-
proxyCredential: { username: string; password: string } | null;
|
|
75
|
-
}): string {
|
|
76
|
-
return derive(scope.rootSecret, "network-route-launch.v1", [
|
|
77
|
-
scope.accountId,
|
|
78
|
-
scope.workspaceId,
|
|
79
|
-
scope.browserSessionId,
|
|
80
|
-
scope.routeId,
|
|
81
|
-
scope.routeVersion,
|
|
82
|
-
scope.credentialVersion ?? "none",
|
|
83
|
-
canonicalJson(scope.configuration),
|
|
84
|
-
canonicalJson(scope.consistency),
|
|
85
|
-
scope.proxyCredential?.username ?? "none",
|
|
86
|
-
scope.proxyCredential?.password ?? "none",
|
|
87
|
-
]).replace(/^ogb\./u, "ogr.");
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
export function deriveBrowserViewGrantToken(
|
|
91
|
-
scope: BrowserSessionAuthorityScope & { grantId: string; expiresAt: string },
|
|
92
|
-
): string {
|
|
93
|
-
return derive(scope.rootSecret, "frame-view-grant.v1", [
|
|
94
|
-
scope.accountId,
|
|
95
|
-
scope.workspaceId,
|
|
96
|
-
placementKey(scope.placement),
|
|
97
|
-
scope.placementInstanceId,
|
|
98
|
-
scope.browserSessionId,
|
|
99
|
-
scope.controllerGeneration,
|
|
100
|
-
scope.tokenGeneration,
|
|
101
|
-
scope.grantId,
|
|
102
|
-
scope.expiresAt,
|
|
103
|
-
]);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/** ComputerSession credentials share the placement controller root while using
|
|
107
|
-
* resource-specific domains. Browser and computer authority cannot collide. */
|
|
108
|
-
export function deriveComputerSessionControllerTokens(scope: ComputerSessionAuthorityScope): {
|
|
109
|
-
controlToken: string;
|
|
110
|
-
viewToken: string;
|
|
111
|
-
} {
|
|
112
|
-
const fields = [
|
|
113
|
-
scope.accountId,
|
|
114
|
-
scope.workspaceId,
|
|
115
|
-
placementKey(scope.placement),
|
|
116
|
-
scope.placementInstanceId,
|
|
117
|
-
scope.computerSessionId,
|
|
118
|
-
scope.controllerGeneration,
|
|
119
|
-
scope.tokenGeneration,
|
|
120
|
-
] as const;
|
|
121
|
-
return {
|
|
122
|
-
controlToken: derive(scope.rootSecret, "computer-session-control.v1", fields),
|
|
123
|
-
viewToken: derive(scope.rootSecret, "computer-session-view.v1", fields),
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
export function deriveComputerViewGrantToken(
|
|
128
|
-
scope: ComputerSessionAuthorityScope & { grantId: string; expiresAt: string },
|
|
129
|
-
): string {
|
|
130
|
-
return derive(scope.rootSecret, "computer-frame-view-grant.v1", [
|
|
131
|
-
scope.accountId,
|
|
132
|
-
scope.workspaceId,
|
|
133
|
-
placementKey(scope.placement),
|
|
134
|
-
scope.placementInstanceId,
|
|
135
|
-
scope.computerSessionId,
|
|
136
|
-
scope.controllerGeneration,
|
|
137
|
-
scope.tokenGeneration,
|
|
138
|
-
scope.grantId,
|
|
139
|
-
scope.expiresAt,
|
|
140
|
-
]);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
function derive(rootSecret: string, domain: string, fields: readonly (string | number)[]): string {
|
|
144
|
-
if (!rootSecret) throw new Error("browser controller authority root is unavailable");
|
|
145
|
-
const hmac = createHmac("sha256", rootSecret);
|
|
146
|
-
hmac.update("opengeni.browser-controller-authority\0", "utf8");
|
|
147
|
-
writeField(hmac, domain);
|
|
148
|
-
for (const field of fields) writeField(hmac, String(field));
|
|
149
|
-
return `ogb.${hmac.digest("base64url")}`;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
function writeField(hmac: ReturnType<typeof createHmac>, value: string): void {
|
|
153
|
-
const bytes = Buffer.from(value, "utf8");
|
|
154
|
-
hmac.update(String(bytes.byteLength), "utf8");
|
|
155
|
-
hmac.update(":", "utf8");
|
|
156
|
-
hmac.update(bytes);
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
function canonicalJson(value: unknown): string {
|
|
160
|
-
return JSON.stringify(canonicalJsonValue(value));
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
function canonicalJsonValue(value: unknown): unknown {
|
|
164
|
-
if (Array.isArray(value)) return value.map(canonicalJsonValue);
|
|
165
|
-
if (value && typeof value === "object") {
|
|
166
|
-
return Object.fromEntries(
|
|
167
|
-
Object.entries(value as Record<string, unknown>)
|
|
168
|
-
.sort(([left], [right]) => left.localeCompare(right))
|
|
169
|
-
.map(([key, entry]) => [key, canonicalJsonValue(entry)]),
|
|
170
|
-
);
|
|
171
|
-
}
|
|
172
|
-
return value;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
function placementKey(placement: InteractionPlacement): string {
|
|
176
|
-
switch (placement.kind) {
|
|
177
|
-
case "sandbox_group":
|
|
178
|
-
return `sandbox_group:${placement.sandboxGroupId}`;
|
|
179
|
-
case "connected_machine":
|
|
180
|
-
return `connected_machine:${placement.sandboxId}`;
|
|
181
|
-
case "attached_device":
|
|
182
|
-
return `attached_device:${placement.deviceId}`;
|
|
183
|
-
case "external_provider":
|
|
184
|
-
return `external_provider:${placement.providerId}:${placement.placementId}`;
|
|
185
|
-
}
|
|
186
|
-
}
|
|
1
|
+
export * from "@opengeni/interaction/browser-controller-authority";
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { createHmac } from "node:crypto";
|
|
2
|
+
import type { BrowserSession, CreateBrowserSessionRequest } from "@opengeni/contracts";
|
|
3
|
+
import { BrowserControlUnsupportedError } from "@opengeni/runtime/sandbox";
|
|
4
|
+
|
|
5
|
+
export function assertEphemeralBrowserCreateEnabled(
|
|
6
|
+
request: CreateBrowserSessionRequest,
|
|
7
|
+
enabled: boolean,
|
|
8
|
+
): void {
|
|
9
|
+
if (request.storageMode === "ephemeral_context" && !enabled) {
|
|
10
|
+
throw new BrowserControlUnsupportedError(
|
|
11
|
+
"Ephemeral Chromium contexts are disabled by the operator",
|
|
12
|
+
);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/** Only persisted session identity and server-resolved physical placement enter
|
|
17
|
+
* this private controller partition. Public callers never supply a pool key. */
|
|
18
|
+
export function ephemeralBrowserPartition(
|
|
19
|
+
session: BrowserSession,
|
|
20
|
+
placementInstanceId: string,
|
|
21
|
+
rootSecret: string,
|
|
22
|
+
): string {
|
|
23
|
+
if (session.placement.kind !== "sandbox_group")
|
|
24
|
+
throw new BrowserControlUnsupportedError(
|
|
25
|
+
"Ephemeral contexts require a managed sandbox placement",
|
|
26
|
+
);
|
|
27
|
+
return createHmac("sha256", rootSecret)
|
|
28
|
+
.update(
|
|
29
|
+
JSON.stringify({
|
|
30
|
+
version: "ephemeral-chromium-headless-default-egress-v1",
|
|
31
|
+
accountId: session.accountId,
|
|
32
|
+
workspaceId: session.workspaceId,
|
|
33
|
+
ownerSubjectId: session.createdBySubjectId,
|
|
34
|
+
sandboxGroupId: session.placement.sandboxGroupId,
|
|
35
|
+
placementInstanceId,
|
|
36
|
+
}),
|
|
37
|
+
)
|
|
38
|
+
.digest("hex");
|
|
39
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { BrowserControlRequestError, type BrowserControlClient } from "@opengeni/runtime/sandbox";
|
|
2
|
+
|
|
3
|
+
type BrowserEndClient = Pick<BrowserControlClient, "endSession">;
|
|
4
|
+
|
|
5
|
+
/** A person ending a browser. When the browser's controller lost the running
|
|
6
|
+
* browser (it restarted, or the runtime vanished) it preserves the working
|
|
7
|
+
* runtime and refuses a plain end; the person's explicit end then discards
|
|
8
|
+
* it. Cleanup after a failed or expired resume never takes this path, so a
|
|
9
|
+
* possibly accepted launch stays preserved there. Controllers older than the
|
|
10
|
+
* discard flag reject it as an unknown field and keep their original refusal. */
|
|
11
|
+
export async function endBrowserDiscardingLostRuntime(
|
|
12
|
+
client: BrowserEndClient,
|
|
13
|
+
reference: { browserSessionId: string; controllerGeneration: string },
|
|
14
|
+
): Promise<void> {
|
|
15
|
+
try {
|
|
16
|
+
await client.endSession(reference, { removeState: true });
|
|
17
|
+
return;
|
|
18
|
+
} catch (error) {
|
|
19
|
+
if (!isPreservedLostBrowserRuntime(error)) throw error;
|
|
20
|
+
try {
|
|
21
|
+
await client.endSession(reference, { removeState: true, discardWorkingRuntime: true });
|
|
22
|
+
} catch (discardError) {
|
|
23
|
+
if (discardError instanceof BrowserControlRequestError && discardError.status === 400) {
|
|
24
|
+
throw error;
|
|
25
|
+
}
|
|
26
|
+
throw discardError;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Return an expired resume to its checkpoint. A plain end of the expired
|
|
32
|
+
* generation succeeds when its launch provably never happened (or is already
|
|
33
|
+
* gone). When the controller instead preserves an interrupted launch (one that
|
|
34
|
+
* never recorded completion, so it can't be adopted), it is asked to move that
|
|
35
|
+
* launch's directory aside intact; nothing is discarded, and a launch that did
|
|
36
|
+
* complete, or whose profile may still be in use, keeps refusing. Controllers
|
|
37
|
+
* older than the set-aside flag reject it and keep their original refusal. */
|
|
38
|
+
export async function endExpiredResumeSettingAsideInterruptedLaunch(
|
|
39
|
+
client: BrowserEndClient,
|
|
40
|
+
reference: { browserSessionId: string; controllerGeneration: string },
|
|
41
|
+
): Promise<void> {
|
|
42
|
+
try {
|
|
43
|
+
await client.endSession(reference, { removeState: true });
|
|
44
|
+
return;
|
|
45
|
+
} catch (error) {
|
|
46
|
+
if (isMissingControllerSession(error)) return;
|
|
47
|
+
if (!isPreservedLostBrowserRuntime(error)) throw error;
|
|
48
|
+
try {
|
|
49
|
+
await client.endSession(reference, { removeState: true, setAsideInterruptedLaunch: true });
|
|
50
|
+
} catch (setAsideError) {
|
|
51
|
+
if (isMissingControllerSession(setAsideError)) return;
|
|
52
|
+
if (setAsideError instanceof BrowserControlRequestError && setAsideError.status === 400) {
|
|
53
|
+
throw error;
|
|
54
|
+
}
|
|
55
|
+
throw setAsideError;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function isMissingControllerSession(error: unknown): boolean {
|
|
61
|
+
return error instanceof BrowserControlRequestError && error.status === 404;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function isPreservedLostBrowserRuntime(error: unknown): boolean {
|
|
65
|
+
return (
|
|
66
|
+
error instanceof BrowserControlRequestError &&
|
|
67
|
+
error.status === 409 &&
|
|
68
|
+
error.error.code === "resource_unavailable" &&
|
|
69
|
+
!error.retryable
|
|
70
|
+
);
|
|
71
|
+
}
|