@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
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import type { XaiSubscriptionAccountMetadata } from "@opengeni/db";
|
|
2
|
+
import { requireAccessGrant, type ApiRouteDeps } from "@opengeni/core";
|
|
3
|
+
import type { Context, Hono } from "hono";
|
|
4
|
+
import { HTTPException } from "hono/http-exception";
|
|
5
|
+
import {
|
|
6
|
+
SubscriptionAccountRenameRequest,
|
|
7
|
+
SubscriptionAccountToggleRequest,
|
|
8
|
+
SubscriptionRotationSettingsRequest,
|
|
9
|
+
} from "@opengeni/contracts";
|
|
10
|
+
import { requireOrganizationCodexHuman } from "./codex";
|
|
11
|
+
import { requireSameOriginBrowserMutation } from "./subscription-pool-access";
|
|
12
|
+
import {
|
|
13
|
+
coreOrganizationAccount,
|
|
14
|
+
coreOrganizationAccounts,
|
|
15
|
+
coreOrganizationSettings,
|
|
16
|
+
coreWorkspaceAccounts,
|
|
17
|
+
coreWorkspaceActivate,
|
|
18
|
+
coreWorkspaceAllocator,
|
|
19
|
+
coreWorkspaceDisconnect,
|
|
20
|
+
coreWorkspaceRename,
|
|
21
|
+
coreWorkspaceSettings,
|
|
22
|
+
requireSubscriptionCoreRoute,
|
|
23
|
+
type SubscriptionPoolCore,
|
|
24
|
+
} from "./subscription-pool-core";
|
|
25
|
+
const allocatorBody = SubscriptionAccountToggleRequest;
|
|
26
|
+
const settingsBody = SubscriptionRotationSettingsRequest;
|
|
27
|
+
const renameBody = SubscriptionAccountRenameRequest;
|
|
28
|
+
|
|
29
|
+
/** The legacy pool repository; only Claude still has one (until its own cutover). */
|
|
30
|
+
|
|
31
|
+
/** The legacy pool account shape SuperGrok and Claude share (SuperGrok's metadata defines it). */
|
|
32
|
+
export type SubscriptionPoolAccount = XaiSubscriptionAccountMetadata;
|
|
33
|
+
/**
|
|
34
|
+
* The repository of a provider whose legacy runtime was deleted after its
|
|
35
|
+
* cutover: its routes serve only the core (`requireSubscriptionCoreRoute`
|
|
36
|
+
* refuses any other route first), so no legacy handler can reach these.
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
/** Account CRUD uses one authority, allocator and wake contract for every pool. */
|
|
40
|
+
export function registerSubscriptionAccountPoolRoutes(
|
|
41
|
+
app: Hono,
|
|
42
|
+
deps: ApiRouteDeps,
|
|
43
|
+
options: {
|
|
44
|
+
provider: "xai" | "claude";
|
|
45
|
+
route: "supergrok" | "claude";
|
|
46
|
+
displayName: "SuperGrok" | "Claude";
|
|
47
|
+
enabled: () => boolean;
|
|
48
|
+
accountJson: (
|
|
49
|
+
account: XaiSubscriptionAccountMetadata,
|
|
50
|
+
activeId: string | null,
|
|
51
|
+
) => Record<string, unknown>;
|
|
52
|
+
core: SubscriptionPoolCore;
|
|
53
|
+
},
|
|
54
|
+
) {
|
|
55
|
+
const core = options.core;
|
|
56
|
+
const coreContext = {
|
|
57
|
+
deps,
|
|
58
|
+
core,
|
|
59
|
+
displayName: options.displayName,
|
|
60
|
+
accountJson: options.accountJson,
|
|
61
|
+
listedAccountJson: core.listedAccountJson ?? options.accountJson,
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* The pool's runtime for this organization: `legacy` without a core
|
|
65
|
+
* binding; a core-only pool (no legacy repository) serves only `core`.
|
|
66
|
+
*/
|
|
67
|
+
const route = (accountId: () => Promise<string>) =>
|
|
68
|
+
requireSubscriptionCoreRoute(deps, options.provider, options.displayName, accountId);
|
|
69
|
+
const workspaceRoute = (c: Context, workspaceId: string) =>
|
|
70
|
+
route(async () => (await requireAccessGrant(c, deps, workspaceId, "workspace:read")).accountId);
|
|
71
|
+
const workspacePath = `/v1/workspaces/:workspaceId/${options.route}`;
|
|
72
|
+
const organizationPath = `/v1/organizations/:organizationId/${options.route}`;
|
|
73
|
+
const requireEnabled = () => {
|
|
74
|
+
if (!options.enabled())
|
|
75
|
+
throw new HTTPException(404, {
|
|
76
|
+
message: options.displayName + " subscriptions are not enabled",
|
|
77
|
+
});
|
|
78
|
+
};
|
|
79
|
+
const organizationActor = async (c: Context, mutation = false) => {
|
|
80
|
+
requireEnabled();
|
|
81
|
+
if (mutation) requireSameOriginBrowserMutation(c, deps);
|
|
82
|
+
const organizationId = c.req.param("organizationId")!;
|
|
83
|
+
const human = await requireOrganizationCodexHuman(c, deps, organizationId);
|
|
84
|
+
return { organizationId, actorSubjectId: human.subjectId };
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
app.get(`${organizationPath}/accounts`, async (c) => {
|
|
88
|
+
const actor = await organizationActor(c);
|
|
89
|
+
await route(async () => actor.organizationId);
|
|
90
|
+
return await coreOrganizationAccounts(c, coreContext!, actor);
|
|
91
|
+
});
|
|
92
|
+
app.patch(`${organizationPath}/settings`, async (c) => {
|
|
93
|
+
const actor = await organizationActor(c, true);
|
|
94
|
+
const parsed = settingsBody.safeParse(await c.req.json().catch(() => null));
|
|
95
|
+
if (!parsed.success) throw new HTTPException(400, { message: "rotationEnabled is required" });
|
|
96
|
+
await route(async () => actor.organizationId);
|
|
97
|
+
return await coreOrganizationSettings(c, coreContext!, actor, parsed.data.rotationEnabled);
|
|
98
|
+
});
|
|
99
|
+
const updateOrganizationAccount = async (
|
|
100
|
+
c: Context,
|
|
101
|
+
changes: {
|
|
102
|
+
activate?: boolean;
|
|
103
|
+
disconnect?: boolean;
|
|
104
|
+
label?: string | null;
|
|
105
|
+
allocatorEnabled?: boolean;
|
|
106
|
+
expectedAllocatorVersion?: number;
|
|
107
|
+
},
|
|
108
|
+
) => {
|
|
109
|
+
const actor = await organizationActor(c, true);
|
|
110
|
+
await route(async () => actor.organizationId);
|
|
111
|
+
return await coreOrganizationAccount(
|
|
112
|
+
c,
|
|
113
|
+
coreContext!,
|
|
114
|
+
actor,
|
|
115
|
+
c.req.param("accountId")!,
|
|
116
|
+
changes.activate
|
|
117
|
+
? { activate: true }
|
|
118
|
+
: changes.disconnect
|
|
119
|
+
? { disconnect: true }
|
|
120
|
+
: changes.label !== undefined
|
|
121
|
+
? { label: changes.label }
|
|
122
|
+
: {
|
|
123
|
+
allocatorEnabled: changes.allocatorEnabled!,
|
|
124
|
+
expectedAllocatorVersion: changes.expectedAllocatorVersion!,
|
|
125
|
+
},
|
|
126
|
+
);
|
|
127
|
+
};
|
|
128
|
+
app.post(`${organizationPath}/accounts/:accountId/activate`, (c) =>
|
|
129
|
+
updateOrganizationAccount(c, { activate: true }),
|
|
130
|
+
);
|
|
131
|
+
app.delete(`${organizationPath}/accounts/:accountId`, (c) =>
|
|
132
|
+
updateOrganizationAccount(c, { disconnect: true }),
|
|
133
|
+
);
|
|
134
|
+
app.patch(`${organizationPath}/accounts/:accountId`, async (c) => {
|
|
135
|
+
const parsed = renameBody.safeParse(await c.req.json().catch(() => null));
|
|
136
|
+
if (!parsed.success) throw new HTTPException(400, { message: "label is invalid" });
|
|
137
|
+
return updateOrganizationAccount(c, { label: parsed.data.label || null });
|
|
138
|
+
});
|
|
139
|
+
app.patch(`${organizationPath}/accounts/:accountId/allocator`, async (c) => {
|
|
140
|
+
const parsed = allocatorBody.safeParse(await c.req.json().catch(() => null));
|
|
141
|
+
if (!parsed.success)
|
|
142
|
+
throw new HTTPException(400, { message: "enabled and expectedVersion are required" });
|
|
143
|
+
return updateOrganizationAccount(c, {
|
|
144
|
+
allocatorEnabled: parsed.data.enabled,
|
|
145
|
+
expectedAllocatorVersion: parsed.data.expectedVersion,
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
app.get(`${workspacePath}/accounts`, async (c) => {
|
|
150
|
+
requireEnabled();
|
|
151
|
+
const workspaceId = c.req.param("workspaceId")!;
|
|
152
|
+
await workspaceRoute(c, workspaceId);
|
|
153
|
+
return await coreWorkspaceAccounts(c, coreContext!, workspaceId);
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
app.post(`${workspacePath}/accounts/:accountId/activate`, async (c) => {
|
|
157
|
+
requireEnabled();
|
|
158
|
+
const workspaceId = c.req.param("workspaceId")!;
|
|
159
|
+
const credentialId = c.req.param("accountId")!;
|
|
160
|
+
await workspaceRoute(c, workspaceId);
|
|
161
|
+
return await coreWorkspaceActivate(c, coreContext!, workspaceId, credentialId);
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
app.patch(`${workspacePath}/settings`, async (c) => {
|
|
165
|
+
requireEnabled();
|
|
166
|
+
const workspaceId = c.req.param("workspaceId")!;
|
|
167
|
+
const parsed = settingsBody.safeParse(await c.req.json().catch(() => null));
|
|
168
|
+
if (!parsed.success) throw new HTTPException(400, { message: "rotationEnabled is required" });
|
|
169
|
+
await workspaceRoute(c, workspaceId);
|
|
170
|
+
return await coreWorkspaceSettings(c, coreContext!, workspaceId, parsed.data.rotationEnabled);
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
app.patch(`${workspacePath}/accounts/:accountId/allocator`, async (c) => {
|
|
174
|
+
requireEnabled();
|
|
175
|
+
const workspaceId = c.req.param("workspaceId")!;
|
|
176
|
+
const credentialId = c.req.param("accountId")!;
|
|
177
|
+
await workspaceRoute(c, workspaceId);
|
|
178
|
+
|
|
179
|
+
const parsed = allocatorBody.safeParse(await c.req.json().catch(() => null));
|
|
180
|
+
if (!parsed.success)
|
|
181
|
+
throw new HTTPException(400, { message: "enabled and expectedVersion are required" });
|
|
182
|
+
return await coreWorkspaceAllocator(c, coreContext!, workspaceId, credentialId, parsed.data);
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
app.patch(`${workspacePath}/accounts/:accountId`, async (c) => {
|
|
186
|
+
requireEnabled();
|
|
187
|
+
const workspaceId = c.req.param("workspaceId")!;
|
|
188
|
+
const credentialId = c.req.param("accountId")!;
|
|
189
|
+
await workspaceRoute(c, workspaceId);
|
|
190
|
+
|
|
191
|
+
const parsed = renameBody.safeParse(await c.req.json().catch(() => null));
|
|
192
|
+
if (!parsed.success) throw new HTTPException(400, { message: "label is invalid" });
|
|
193
|
+
return await coreWorkspaceRename(
|
|
194
|
+
c,
|
|
195
|
+
coreContext!,
|
|
196
|
+
workspaceId,
|
|
197
|
+
credentialId,
|
|
198
|
+
parsed.data.label || null,
|
|
199
|
+
);
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
app.delete(`${workspacePath}/accounts/:accountId`, async (c) => {
|
|
203
|
+
requireEnabled();
|
|
204
|
+
const workspaceId = c.req.param("workspaceId")!;
|
|
205
|
+
const credentialId = c.req.param("accountId")!;
|
|
206
|
+
await workspaceRoute(c, workspaceId);
|
|
207
|
+
return await coreWorkspaceDisconnect(c, coreContext!, workspaceId, credentialId);
|
|
208
|
+
});
|
|
209
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// The typed HTTP answers every provider's routes on the shared subscription
|
|
2
|
+
// core use (design docs/design/subscription-core-2026-10-07.md, 5.3).
|
|
3
|
+
// Provider-neutral.
|
|
4
|
+
import { ApiHttpError } from "../http/api-error";
|
|
5
|
+
|
|
6
|
+
/** `details.reason` of the 503 a provider's route answers while its cutover row is missing or disabled. */
|
|
7
|
+
export const SUBSCRIPTION_CORE_CUTOVER_DISABLED = "subscription_core_cutover_disabled";
|
|
8
|
+
|
|
9
|
+
/** The public error envelope with the core reason in `details.reason`. */
|
|
10
|
+
export function typedHttpError(status: 409 | 503, reason: string, message: string): ApiHttpError {
|
|
11
|
+
return new ApiHttpError(status, {
|
|
12
|
+
code: status === 503 ? "upstream_unavailable" : "conflict",
|
|
13
|
+
message,
|
|
14
|
+
retryable: status === 503,
|
|
15
|
+
outcomeUnknown: false,
|
|
16
|
+
details: { reason },
|
|
17
|
+
});
|
|
18
|
+
}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { getWorkspaceGrant, resolveNamedManagedPersonalWorkspaceGrant } from "@opengeni/db";
|
|
2
|
+
import {
|
|
3
|
+
getManagedSession,
|
|
4
|
+
requireAccessGrant,
|
|
5
|
+
requireAccessGrantAuthorization,
|
|
6
|
+
externalActorContinuationForAuthorization,
|
|
7
|
+
type ApiRouteDeps,
|
|
8
|
+
} from "@opengeni/core";
|
|
9
|
+
import type { Context } from "hono";
|
|
10
|
+
import { HTTPException } from "hono/http-exception";
|
|
11
|
+
import { agentActingAsPersonBeforeGrantCheck, isAgentActingAsPerson } from "../http/acting-person";
|
|
12
|
+
type ManagedCookieHuman = { subjectId: string };
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Where a private (scope `user`) subscription is managed. The legacy pools
|
|
16
|
+
* keep a person's private accounts in an ordinary workspace they are a member
|
|
17
|
+
* of; the shared subscription core keeps a personal connection only in its
|
|
18
|
+
* owner's own Personal workspace (D-03), so on the core the private routes
|
|
19
|
+
* answer there and nowhere else.
|
|
20
|
+
*/
|
|
21
|
+
export type PrivateSubscriptionPlace = "ordinary_workspace" | "personal_workspace";
|
|
22
|
+
|
|
23
|
+
async function requirePrivateSubscriptionPlace(
|
|
24
|
+
deps: ApiRouteDeps,
|
|
25
|
+
place: PrivateSubscriptionPlace,
|
|
26
|
+
input: { accountId: string; workspaceId: string; subjectId: string },
|
|
27
|
+
displayName: string,
|
|
28
|
+
): Promise<void> {
|
|
29
|
+
if (place === "personal_workspace") {
|
|
30
|
+
// The subject's current Personal workspace pointer with a live
|
|
31
|
+
// organization membership; another person's Personal workspace or a
|
|
32
|
+
// shared workspace never qualifies.
|
|
33
|
+
if (!(await resolveNamedManagedPersonalWorkspaceGrant(deps.db, input)))
|
|
34
|
+
throw new HTTPException(409, {
|
|
35
|
+
message: `Private ${displayName} accounts are connected and managed from your Personal workspace`,
|
|
36
|
+
});
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
// The shared user-pool domain requires an ordinary workspace membership,
|
|
40
|
+
// not just the synthetic Personal-workspace owner grant.
|
|
41
|
+
if (!(await getWorkspaceGrant(deps.db, input.subjectId, input.workspaceId)))
|
|
42
|
+
throw new HTTPException(409, {
|
|
43
|
+
message: `Private ${displayName} accounts require membership in an ordinary workspace`,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export async function managedCookieHuman(
|
|
48
|
+
c: Context,
|
|
49
|
+
deps: ApiRouteDeps,
|
|
50
|
+
): Promise<ManagedCookieHuman | null> {
|
|
51
|
+
if (
|
|
52
|
+
deps.settings.productAccessMode !== "managed" ||
|
|
53
|
+
!deps.managedAuth ||
|
|
54
|
+
!c.req.header("cookie") ||
|
|
55
|
+
c.req.header("authorization")
|
|
56
|
+
) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
const session = await getManagedSession(c, deps.managedAuth, {
|
|
60
|
+
db: deps.db,
|
|
61
|
+
sessionAdapter: deps.managedAuthSessionAdapter,
|
|
62
|
+
sessionSetMode: deps.settings.managedAuthSessionSetMode,
|
|
63
|
+
});
|
|
64
|
+
return session?.user?.id ? { subjectId: `user:${session.user.id}` } : null;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function requireSameOriginBrowserMutation(c: Context, deps: ApiRouteDeps): void {
|
|
68
|
+
// Built in process for an agent acting as a person: no browser credentials
|
|
69
|
+
// ride along, so there is no cross-site request to guard against.
|
|
70
|
+
if (isAgentActingAsPerson(c)) return;
|
|
71
|
+
const contentType = c.req.header("content-type")?.split(";", 1)[0]?.trim().toLowerCase();
|
|
72
|
+
if (contentType !== "application/json") {
|
|
73
|
+
throw new HTTPException(403, { message: "JSON browser request required" });
|
|
74
|
+
}
|
|
75
|
+
if (!deps.settings.publicBaseUrl) {
|
|
76
|
+
throw new HTTPException(503, {
|
|
77
|
+
message: "managed browser origin is not configured",
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
const expectedOrigin = new URL(deps.settings.publicBaseUrl).origin;
|
|
81
|
+
if (c.req.header("origin") !== expectedOrigin) {
|
|
82
|
+
throw new HTTPException(403, {
|
|
83
|
+
message: "same-origin browser request required",
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
if (c.req.header("sec-fetch-site")?.toLowerCase() !== "same-origin") {
|
|
87
|
+
throw new HTTPException(403, {
|
|
88
|
+
message: "same-origin fetch metadata required",
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export async function requirePrivateSubscriptionHuman(
|
|
94
|
+
c: Context,
|
|
95
|
+
deps: ApiRouteDeps,
|
|
96
|
+
workspaceId: string,
|
|
97
|
+
displayName: string,
|
|
98
|
+
place: PrivateSubscriptionPlace = "ordinary_workspace",
|
|
99
|
+
): Promise<{ accountId: string; subjectId: string }> {
|
|
100
|
+
if (c.req.header("authorization")) {
|
|
101
|
+
const authorization = await requireAccessGrantAuthorization(
|
|
102
|
+
c,
|
|
103
|
+
deps,
|
|
104
|
+
workspaceId,
|
|
105
|
+
"connections:write",
|
|
106
|
+
);
|
|
107
|
+
const external = externalActorContinuationForAuthorization(authorization);
|
|
108
|
+
if (
|
|
109
|
+
external &&
|
|
110
|
+
authorization.contextIntegrity &&
|
|
111
|
+
external.actor.effectiveSubjectId === authorization.grant.subjectId
|
|
112
|
+
) {
|
|
113
|
+
const owner = {
|
|
114
|
+
accountId: authorization.grant.accountId,
|
|
115
|
+
subjectId: authorization.grant.subjectId,
|
|
116
|
+
};
|
|
117
|
+
await requirePrivateSubscriptionPlace(deps, place, { ...owner, workspaceId }, displayName);
|
|
118
|
+
return owner;
|
|
119
|
+
}
|
|
120
|
+
throw new HTTPException(403, {
|
|
121
|
+
message: `Private ${displayName} accounts require a verified owning user`,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
const human = (await managedCookieHuman(c, deps)) ?? agentActingAsPersonBeforeGrantCheck(c);
|
|
125
|
+
if (!human) {
|
|
126
|
+
throw new HTTPException(401, {
|
|
127
|
+
message: "managed browser session required",
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
const grant = await requireAccessGrant(c, deps, workspaceId, "connections:write");
|
|
131
|
+
if (grant.subjectId !== human.subjectId) {
|
|
132
|
+
throw new HTTPException(403, {
|
|
133
|
+
message: "managed browser identity mismatch",
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
const owner = { accountId: grant.accountId, subjectId: grant.subjectId };
|
|
137
|
+
await requirePrivateSubscriptionPlace(deps, place, { ...owner, workspaceId }, displayName);
|
|
138
|
+
return owner;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export async function requireSubscriptionScopeMutation(
|
|
142
|
+
c: Context,
|
|
143
|
+
deps: ApiRouteDeps,
|
|
144
|
+
workspaceId: string,
|
|
145
|
+
scope: "workspace" | "user" | "organization",
|
|
146
|
+
displayName: string,
|
|
147
|
+
place: PrivateSubscriptionPlace = "ordinary_workspace",
|
|
148
|
+
): Promise<{ accountId: string; subjectId: string }> {
|
|
149
|
+
if (scope === "organization")
|
|
150
|
+
throw new HTTPException(409, { message: "Manage this subscription in organization settings" });
|
|
151
|
+
if (scope === "user") {
|
|
152
|
+
// Server-side external-user assertions do not use browser cookies. Ordinary
|
|
153
|
+
// bearers remain rejected by requirePrivateHuman; native CSRF is unchanged.
|
|
154
|
+
if (!c.req.header("authorization")) requireSameOriginBrowserMutation(c, deps);
|
|
155
|
+
return await requirePrivateSubscriptionHuman(c, deps, workspaceId, displayName, place);
|
|
156
|
+
}
|
|
157
|
+
const grant = await requireAccessGrant(c, deps, workspaceId, "workspace:admin");
|
|
158
|
+
return { accountId: grant.accountId, subjectId: grant.subjectId };
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* The mutation gate of a pool whose legacy repository is deleted (Claude,
|
|
163
|
+
* C4). The account's scope can no longer be read, so every caller gets the
|
|
164
|
+
* workspace-scope gate of `requireSubscriptionScopeMutation` (a browser
|
|
165
|
+
* request must be same-origin, and the caller needs `workspace:admin`)
|
|
166
|
+
* before the route fails closed; nothing is read or written either way.
|
|
167
|
+
* For a former private (user-scope) account this changes two outcomes: an
|
|
168
|
+
* ordinary bearer with `workspace:admin` now reaches the 503 where it got
|
|
169
|
+
* 403 (no verified owning user), and the owner without `workspace:admin` now
|
|
170
|
+
* gets 403 where it passed. C2b restores the per-scope check, including the
|
|
171
|
+
* owner's path, when the core serves these routes.
|
|
172
|
+
*/
|
|
173
|
+
export async function requireDeletedSubscriptionPoolMutation(
|
|
174
|
+
c: Context,
|
|
175
|
+
deps: ApiRouteDeps,
|
|
176
|
+
workspaceId: string,
|
|
177
|
+
): Promise<void> {
|
|
178
|
+
if (!c.req.header("authorization")) requireSameOriginBrowserMutation(c, deps);
|
|
179
|
+
await requireAccessGrant(c, deps, workspaceId, "workspace:admin");
|
|
180
|
+
}
|