@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,584 @@
|
|
|
1
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
2
|
+
import {
|
|
3
|
+
parseSiteHostname,
|
|
4
|
+
SiteAuthAuthorizeRequest,
|
|
5
|
+
SiteLimitProfile,
|
|
6
|
+
SitePublishWarningFix,
|
|
7
|
+
siteHostname,
|
|
8
|
+
SiteTakedownRequest,
|
|
9
|
+
SITE_GATEWAY_CALLBACK_PATH,
|
|
10
|
+
UpsertSitePublicationRequest,
|
|
11
|
+
type SiteAbuseReport,
|
|
12
|
+
type SiteAuthAuthorizeResponse,
|
|
13
|
+
} from "@opengeni/contracts";
|
|
14
|
+
import {
|
|
15
|
+
getManagedSession,
|
|
16
|
+
hasLiteralPermission,
|
|
17
|
+
requireAccessContext,
|
|
18
|
+
requireAccessGrant,
|
|
19
|
+
type ApiRouteDeps,
|
|
20
|
+
} from "@opengeni/core";
|
|
21
|
+
import {
|
|
22
|
+
actionOpenSiteAbuseReports,
|
|
23
|
+
consumeSiteRuntimeRate,
|
|
24
|
+
createSiteAuthCode,
|
|
25
|
+
findSiteHostname,
|
|
26
|
+
getPublishedSite,
|
|
27
|
+
getSitePublication,
|
|
28
|
+
getWorkspaceSiteLimitProfile,
|
|
29
|
+
isSiteWorkspaceMember,
|
|
30
|
+
listSiteAbuseReports,
|
|
31
|
+
putWorkspaceSiteLimitProfile,
|
|
32
|
+
recordAuditEvent,
|
|
33
|
+
restoreSitePublication,
|
|
34
|
+
suspendSitePublication,
|
|
35
|
+
updateSiteAbuseReportStatus,
|
|
36
|
+
upsertSitePublication,
|
|
37
|
+
type SiteAbuseReportRecord,
|
|
38
|
+
} from "@opengeni/db";
|
|
39
|
+
import type { Context, Hono } from "hono";
|
|
40
|
+
import { z } from "zod";
|
|
41
|
+
import { isAgentActingAsPerson } from "../http/acting-person";
|
|
42
|
+
import {
|
|
43
|
+
effectiveSiteLimits,
|
|
44
|
+
siteLimitOverrides,
|
|
45
|
+
sourceSiteLimitProfile,
|
|
46
|
+
storedSiteLimitProfileKind,
|
|
47
|
+
} from "../site-publishing/limits";
|
|
48
|
+
import { readSitePlatformUsageView } from "../site-publishing/platform-usage";
|
|
49
|
+
import { applySitePublishWarningFix, SiteFixTargetMissing } from "../site-publishing/readiness";
|
|
50
|
+
import { SiteDataError } from "@opengeni/db";
|
|
51
|
+
import { SiteSqlError } from "../site-sql/service";
|
|
52
|
+
import { siteDataHttpError } from "./site-data";
|
|
53
|
+
import { siteSqlHttpError } from "./site-sql";
|
|
54
|
+
import {
|
|
55
|
+
requireSiteManager,
|
|
56
|
+
requireSitesDomain,
|
|
57
|
+
resolveSiteManagement,
|
|
58
|
+
runSitePublishing,
|
|
59
|
+
requireSitePublicationWriter,
|
|
60
|
+
scheduleSiteEdgeSync,
|
|
61
|
+
siteHostnameAvailability,
|
|
62
|
+
sitePublicationView,
|
|
63
|
+
sitePublishingError,
|
|
64
|
+
siteServable,
|
|
65
|
+
stopSiteViewers,
|
|
66
|
+
upsertSitePublicationForManager,
|
|
67
|
+
} from "../site-publishing/service";
|
|
68
|
+
import { effectiveSiteAccess, signedInSiteViewerKind } from "../site-publishing/viewer";
|
|
69
|
+
import { requireSameOriginBrowserMutation } from "./subscription-pool-access";
|
|
70
|
+
|
|
71
|
+
/** A one-time sign-in code lives this long. */
|
|
72
|
+
export const SITE_AUTH_CODE_TTL_SECONDS = 60;
|
|
73
|
+
/** Sign-in codes a person may mint per minute (per Site). */
|
|
74
|
+
const SIGN_IN_PER_MINUTE = 30;
|
|
75
|
+
|
|
76
|
+
const SiteIdParam = z.string().uuid();
|
|
77
|
+
const ReportIdParam = z.string().uuid();
|
|
78
|
+
const ReportStatusRequest = z.object({ status: z.enum(["open", "dismissed", "actioned"]) });
|
|
79
|
+
|
|
80
|
+
function invalid(message: string) {
|
|
81
|
+
return sitePublishingError(400, "validation_failed", "site_invalid_request", message);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
async function body<S extends z.ZodType>(context: Context, schema: S): Promise<z.infer<S>> {
|
|
85
|
+
const parsed = schema.safeParse(await context.req.json().catch(() => null));
|
|
86
|
+
if (!parsed.success)
|
|
87
|
+
throw invalid(
|
|
88
|
+
parsed.error.issues
|
|
89
|
+
.slice(0, 3)
|
|
90
|
+
.map((issue) => `${issue.path.join(".") || "request"}: ${issue.message}`)
|
|
91
|
+
.join("; "),
|
|
92
|
+
);
|
|
93
|
+
return parsed.data;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function siteIdParam(context: Context): string {
|
|
97
|
+
const parsed = SiteIdParam.safeParse(context.req.param("artifactId"));
|
|
98
|
+
if (!parsed.success)
|
|
99
|
+
throw sitePublishingError(404, "not_found", "site_not_found", "Site not found");
|
|
100
|
+
return parsed.data;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function reportView(report: SiteAbuseReportRecord): SiteAbuseReport {
|
|
104
|
+
return {
|
|
105
|
+
id: report.id,
|
|
106
|
+
siteId: report.siteId,
|
|
107
|
+
hostname: report.hostname,
|
|
108
|
+
category: report.category as SiteAbuseReport["category"],
|
|
109
|
+
message: report.message,
|
|
110
|
+
contactEmail: report.contactEmail,
|
|
111
|
+
status: report.status,
|
|
112
|
+
createdAt: report.createdAt.toISOString(),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** Machine and key principals never sign in to a Site; only people do. */
|
|
117
|
+
const NON_PERSON_SUBJECT = /^(site|agent|service|configured|schedule|guest):/u;
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* The person asking to sign in to a Site: the signed-in console user (a
|
|
121
|
+
* managed browser session, same-origin), or on deployments without managed
|
|
122
|
+
* sign-in a human context (an external user acting through the host). API
|
|
123
|
+
* keys, agents and service principals are refused. Only a verified email
|
|
124
|
+
* counts for invitations.
|
|
125
|
+
*/
|
|
126
|
+
async function siteAuthPerson(
|
|
127
|
+
context: Context,
|
|
128
|
+
deps: ApiRouteDeps,
|
|
129
|
+
): Promise<{ subjectId: string; email: string | null; name: string | null }> {
|
|
130
|
+
if (
|
|
131
|
+
deps.settings.productAccessMode === "managed" &&
|
|
132
|
+
deps.managedAuth &&
|
|
133
|
+
context.req.header("cookie") &&
|
|
134
|
+
!context.req.header("authorization")
|
|
135
|
+
) {
|
|
136
|
+
requireSameOriginBrowserMutation(context, deps);
|
|
137
|
+
const session = await getManagedSession(context, deps.managedAuth, {
|
|
138
|
+
db: deps.db,
|
|
139
|
+
sessionAdapter: deps.managedAuthSessionAdapter,
|
|
140
|
+
sessionSetMode: deps.settings.managedAuthSessionSetMode,
|
|
141
|
+
});
|
|
142
|
+
if (!session?.user?.id)
|
|
143
|
+
throw sitePublishingError(401, "unauthenticated", "site_sign_in_required", "Sign in first");
|
|
144
|
+
const user = session.user as {
|
|
145
|
+
id: string;
|
|
146
|
+
email?: string;
|
|
147
|
+
emailVerified?: boolean;
|
|
148
|
+
name?: string;
|
|
149
|
+
};
|
|
150
|
+
return {
|
|
151
|
+
subjectId: `user:${user.id}`,
|
|
152
|
+
email: user.emailVerified === true && user.email ? user.email.toLowerCase() : null,
|
|
153
|
+
name: user.name?.trim() || null,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
const access = await requireAccessContext(context, deps);
|
|
157
|
+
if (
|
|
158
|
+
access.credential !== undefined ||
|
|
159
|
+
isAgentActingAsPerson(context) ||
|
|
160
|
+
NON_PERSON_SUBJECT.test(access.subjectId) ||
|
|
161
|
+
access.workspaceGrants.some(
|
|
162
|
+
(grant) => grant.principalKind !== undefined && grant.principalKind !== "human_session",
|
|
163
|
+
)
|
|
164
|
+
)
|
|
165
|
+
throw sitePublishingError(
|
|
166
|
+
403,
|
|
167
|
+
"forbidden",
|
|
168
|
+
"site_person_required",
|
|
169
|
+
"Only a signed-in person can sign in to a Site",
|
|
170
|
+
);
|
|
171
|
+
return { subjectId: access.subjectId, email: null, name: access.subjectLabel?.trim() || null };
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
export function registerSitePublishingRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
175
|
+
const base = "/v1/workspaces/:workspaceId/published-artifacts/:artifactId/publication";
|
|
176
|
+
const grantFor = (context: Context, permission: "artifacts:read" | "artifacts:publish") =>
|
|
177
|
+
requireAccessGrant(context, deps, context.req.param("workspaceId")!, permission);
|
|
178
|
+
|
|
179
|
+
app.get(base, async (context) => {
|
|
180
|
+
requireSitesDomain(deps.settings);
|
|
181
|
+
const grant = await grantFor(context, "artifacts:read");
|
|
182
|
+
const management = await resolveSiteManagement(deps, grant, siteIdParam(context));
|
|
183
|
+
requireSiteManager(management);
|
|
184
|
+
const publication = await getSitePublication(deps.db, management.scope, management.record.id);
|
|
185
|
+
if (!publication)
|
|
186
|
+
throw sitePublishingError(
|
|
187
|
+
404,
|
|
188
|
+
"not_found",
|
|
189
|
+
"site_not_published",
|
|
190
|
+
"This Site is not published",
|
|
191
|
+
);
|
|
192
|
+
return context.json(await sitePublicationView(deps, management.scope, publication));
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
app.put(base, async (context) => {
|
|
196
|
+
requireSitesDomain(deps.settings);
|
|
197
|
+
const grant = await grantFor(context, "artifacts:publish");
|
|
198
|
+
const request = await body(context, UpsertSitePublicationRequest);
|
|
199
|
+
const management = await resolveSiteManagement(deps, grant, siteIdParam(context), {
|
|
200
|
+
mutate: true,
|
|
201
|
+
});
|
|
202
|
+
const result = await runSitePublishing(() =>
|
|
203
|
+
upsertSitePublicationForManager(deps, grant, management, request),
|
|
204
|
+
);
|
|
205
|
+
return context.json(result.publication, result.created ? 201 : 200);
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Apply a readiness warning's safe fix (a collection's guest access or a
|
|
210
|
+
* query's audience), then answer the publication with fresh warnings.
|
|
211
|
+
*/
|
|
212
|
+
app.post(`${base}/fixes`, async (context) => {
|
|
213
|
+
requireSitesDomain(deps.settings);
|
|
214
|
+
const grant = await grantFor(context, "artifacts:publish");
|
|
215
|
+
const fix = await body(context, SitePublishWarningFix);
|
|
216
|
+
const management = await resolveSiteManagement(deps, grant, siteIdParam(context), {
|
|
217
|
+
mutate: true,
|
|
218
|
+
});
|
|
219
|
+
requireSiteManager(management);
|
|
220
|
+
const publication = await getSitePublication(deps.db, management.scope, management.record.id);
|
|
221
|
+
if (!publication)
|
|
222
|
+
throw sitePublishingError(
|
|
223
|
+
404,
|
|
224
|
+
"not_found",
|
|
225
|
+
"site_not_published",
|
|
226
|
+
"This Site is not published",
|
|
227
|
+
);
|
|
228
|
+
try {
|
|
229
|
+
await applySitePublishWarningFix(deps, grant, management.scope, management.record.id, fix);
|
|
230
|
+
} catch (error) {
|
|
231
|
+
if (error instanceof SiteFixTargetMissing)
|
|
232
|
+
throw sitePublishingError(404, "not_found", "site_fix_target_missing", error.message);
|
|
233
|
+
if (error instanceof SiteDataError) throw siteDataHttpError(error);
|
|
234
|
+
if (error instanceof SiteSqlError) throw siteSqlHttpError(error);
|
|
235
|
+
throw error;
|
|
236
|
+
}
|
|
237
|
+
return context.json(await sitePublicationView(deps, management.scope, publication));
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
// Unpublish: the Site stops being served; its hostname stays with it.
|
|
241
|
+
app.delete(base, async (context) => {
|
|
242
|
+
requireSitesDomain(deps.settings);
|
|
243
|
+
const grant = await grantFor(context, "artifacts:publish");
|
|
244
|
+
const management = await resolveSiteManagement(deps, grant, siteIdParam(context), {
|
|
245
|
+
mutate: true,
|
|
246
|
+
});
|
|
247
|
+
requireSiteManager(management);
|
|
248
|
+
const existing = await getSitePublication(deps.db, management.scope, management.record.id);
|
|
249
|
+
if (!existing)
|
|
250
|
+
throw sitePublishingError(
|
|
251
|
+
404,
|
|
252
|
+
"not_found",
|
|
253
|
+
"site_not_published",
|
|
254
|
+
"This Site is not published",
|
|
255
|
+
);
|
|
256
|
+
if (existing.status === "suspended")
|
|
257
|
+
throw sitePublishingError(
|
|
258
|
+
409,
|
|
259
|
+
"conflict",
|
|
260
|
+
"site_suspended",
|
|
261
|
+
"This Site was taken down; restore it first",
|
|
262
|
+
);
|
|
263
|
+
const result = await runSitePublishing(() =>
|
|
264
|
+
upsertSitePublication(deps.db, management.scope, {
|
|
265
|
+
siteId: management.record.id,
|
|
266
|
+
defaultLabel: existing.label,
|
|
267
|
+
changes: { status: "unpublished" },
|
|
268
|
+
actor: grant.subjectId,
|
|
269
|
+
holdDays: deps.settings.sitesHostnameHoldDays,
|
|
270
|
+
defaults: { access: existing.access, noindex: existing.noindex },
|
|
271
|
+
}),
|
|
272
|
+
);
|
|
273
|
+
if (existing.status === "active")
|
|
274
|
+
await stopSiteViewers(deps, management.scope, management.record.id, {
|
|
275
|
+
reason: "unpublished",
|
|
276
|
+
});
|
|
277
|
+
scheduleSiteEdgeSync(deps, [result.publication.label], {
|
|
278
|
+
siteIdHint: management.record.id,
|
|
279
|
+
purge: true,
|
|
280
|
+
});
|
|
281
|
+
return context.json(await sitePublicationView(deps, management.scope, result.publication));
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
// Take a Site down at once: the Site's owner or a workspace admin.
|
|
285
|
+
app.post(`${base}/takedown`, async (context) => {
|
|
286
|
+
requireSitesDomain(deps.settings);
|
|
287
|
+
const grant = await grantFor(context, "artifacts:publish");
|
|
288
|
+
const request = await body(context, SiteTakedownRequest);
|
|
289
|
+
const management = await resolveSiteManagement(deps, grant, siteIdParam(context), {
|
|
290
|
+
mutate: true,
|
|
291
|
+
});
|
|
292
|
+
if (!management.owner && !management.admin)
|
|
293
|
+
throw sitePublishingError(
|
|
294
|
+
403,
|
|
295
|
+
"forbidden",
|
|
296
|
+
"site_owner_or_admin_required",
|
|
297
|
+
"Only the Site's owner or a workspace admin can take it down",
|
|
298
|
+
);
|
|
299
|
+
// An admin's takedown (even of their own Site) is one only an admin restores.
|
|
300
|
+
const by = management.admin ? "admin" : "owner";
|
|
301
|
+
const publication = await runSitePublishing(() =>
|
|
302
|
+
suspendSitePublication(deps.db, management.scope, management.record.id, {
|
|
303
|
+
by,
|
|
304
|
+
reason: request.reason,
|
|
305
|
+
subject: grant.subjectId,
|
|
306
|
+
}),
|
|
307
|
+
);
|
|
308
|
+
await actionOpenSiteAbuseReports(deps.db, management.scope, {
|
|
309
|
+
siteId: management.record.id,
|
|
310
|
+
actor: grant.subjectId,
|
|
311
|
+
});
|
|
312
|
+
await recordAuditEvent(deps.db, {
|
|
313
|
+
accountId: grant.accountId,
|
|
314
|
+
workspaceId: grant.workspaceId,
|
|
315
|
+
subjectId: grant.subjectId,
|
|
316
|
+
action: "site.publication.takedown",
|
|
317
|
+
targetType: "site",
|
|
318
|
+
targetId: management.record.id,
|
|
319
|
+
metadata: { by, label: publication.label, reason: request.reason.slice(0, 2000) },
|
|
320
|
+
});
|
|
321
|
+
await stopSiteViewers(deps, management.scope, management.record.id, { reason: "takedown" });
|
|
322
|
+
scheduleSiteEdgeSync(deps, [publication.label], {
|
|
323
|
+
siteIdHint: management.record.id,
|
|
324
|
+
purge: true,
|
|
325
|
+
});
|
|
326
|
+
return context.json(await sitePublicationView(deps, management.scope, publication));
|
|
327
|
+
});
|
|
328
|
+
|
|
329
|
+
app.post(`${base}/restore`, async (context) => {
|
|
330
|
+
requireSitesDomain(deps.settings);
|
|
331
|
+
const grant = await grantFor(context, "artifacts:publish");
|
|
332
|
+
const management = await resolveSiteManagement(deps, grant, siteIdParam(context), {
|
|
333
|
+
mutate: true,
|
|
334
|
+
});
|
|
335
|
+
if (!management.owner && !management.admin)
|
|
336
|
+
throw sitePublishingError(
|
|
337
|
+
403,
|
|
338
|
+
"forbidden",
|
|
339
|
+
"site_owner_or_admin_required",
|
|
340
|
+
"Only the Site's owner or a workspace admin can restore it",
|
|
341
|
+
);
|
|
342
|
+
// An owner cannot lift an admin's takedown (the database refuses it too).
|
|
343
|
+
const by = management.admin ? "admin" : "owner";
|
|
344
|
+
const publication = await runSitePublishing(() =>
|
|
345
|
+
restoreSitePublication(deps.db, management.scope, management.record.id, {
|
|
346
|
+
by,
|
|
347
|
+
subject: grant.subjectId,
|
|
348
|
+
}),
|
|
349
|
+
);
|
|
350
|
+
await recordAuditEvent(deps.db, {
|
|
351
|
+
accountId: grant.accountId,
|
|
352
|
+
workspaceId: grant.workspaceId,
|
|
353
|
+
subjectId: grant.subjectId,
|
|
354
|
+
action: "site.publication.restore",
|
|
355
|
+
targetType: "site",
|
|
356
|
+
targetId: management.record.id,
|
|
357
|
+
metadata: { by, label: publication.label },
|
|
358
|
+
});
|
|
359
|
+
scheduleSiteEdgeSync(deps, [publication.label], {
|
|
360
|
+
siteIdHint: management.record.id,
|
|
361
|
+
purge: true,
|
|
362
|
+
});
|
|
363
|
+
return context.json(await sitePublicationView(deps, management.scope, publication));
|
|
364
|
+
});
|
|
365
|
+
|
|
366
|
+
app.get(`${base}/reports`, async (context) => {
|
|
367
|
+
requireSitesDomain(deps.settings);
|
|
368
|
+
const grant = await grantFor(context, "artifacts:read");
|
|
369
|
+
const management = await resolveSiteManagement(deps, grant, siteIdParam(context));
|
|
370
|
+
requireSiteManager(management);
|
|
371
|
+
const status = z
|
|
372
|
+
.enum(["open", "dismissed", "actioned"])
|
|
373
|
+
.optional()
|
|
374
|
+
.safeParse(context.req.query("status") || undefined);
|
|
375
|
+
if (!status.success) throw invalid("status must be open, dismissed or actioned");
|
|
376
|
+
const reports = await listSiteAbuseReports(deps.db, management.scope, {
|
|
377
|
+
siteId: management.record.id,
|
|
378
|
+
...(status.data ? { status: status.data } : {}),
|
|
379
|
+
limit: 100,
|
|
380
|
+
});
|
|
381
|
+
return context.json({ reports: reports.map(reportView) });
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
app.patch(`${base}/reports/:reportId`, async (context) => {
|
|
385
|
+
requireSitesDomain(deps.settings);
|
|
386
|
+
const grant = await grantFor(context, "artifacts:publish");
|
|
387
|
+
const request = await body(context, ReportStatusRequest);
|
|
388
|
+
const management = await resolveSiteManagement(deps, grant, siteIdParam(context), {
|
|
389
|
+
mutate: true,
|
|
390
|
+
});
|
|
391
|
+
requireSiteManager(management);
|
|
392
|
+
const reportId = ReportIdParam.safeParse(context.req.param("reportId"));
|
|
393
|
+
const report = reportId.success
|
|
394
|
+
? await updateSiteAbuseReportStatus(deps.db, management.scope, {
|
|
395
|
+
siteId: management.record.id,
|
|
396
|
+
reportId: reportId.data,
|
|
397
|
+
status: request.status,
|
|
398
|
+
actor: grant.subjectId,
|
|
399
|
+
})
|
|
400
|
+
: null;
|
|
401
|
+
if (!report)
|
|
402
|
+
throw sitePublishingError(404, "not_found", "site_report_not_found", "Report not found");
|
|
403
|
+
return context.json(reportView(report));
|
|
404
|
+
});
|
|
405
|
+
|
|
406
|
+
app.get("/v1/workspaces/:workspaceId/site-hostnames/:label", async (context) => {
|
|
407
|
+
requireSitesDomain(deps.settings);
|
|
408
|
+
const grant = await grantFor(context, "artifacts:read");
|
|
409
|
+
const siteId = context.req.query("siteId");
|
|
410
|
+
if (siteId !== undefined && !SiteIdParam.safeParse(siteId).success)
|
|
411
|
+
throw invalid("siteId must be a Site id");
|
|
412
|
+
const label = (context.req.param("label") ?? "").toLowerCase();
|
|
413
|
+
return context.json(
|
|
414
|
+
await siteHostnameAvailability(
|
|
415
|
+
deps,
|
|
416
|
+
{ accountId: grant.accountId, workspaceId: grant.workspaceId },
|
|
417
|
+
label,
|
|
418
|
+
siteId ?? null,
|
|
419
|
+
),
|
|
420
|
+
);
|
|
421
|
+
});
|
|
422
|
+
|
|
423
|
+
/**
|
|
424
|
+
* This month's Site platform usage of the workspace (gateway requests,
|
|
425
|
+
* Site SQL rows and storage, Site Data storage) against its allowance, and
|
|
426
|
+
* the Opengeni-wide brake state.
|
|
427
|
+
*/
|
|
428
|
+
app.get("/v1/workspaces/:workspaceId/site-platform-usage", async (context) => {
|
|
429
|
+
requireSitesDomain(deps.settings);
|
|
430
|
+
const grant = await requireAccessGrant(
|
|
431
|
+
context,
|
|
432
|
+
deps,
|
|
433
|
+
context.req.param("workspaceId")!,
|
|
434
|
+
"workspace:read",
|
|
435
|
+
);
|
|
436
|
+
return context.json(
|
|
437
|
+
await readSitePlatformUsageView(deps, {
|
|
438
|
+
accountId: grant.accountId,
|
|
439
|
+
workspaceId: grant.workspaceId,
|
|
440
|
+
}),
|
|
441
|
+
);
|
|
442
|
+
});
|
|
443
|
+
|
|
444
|
+
// The workspace's default limit profile for its published Sites.
|
|
445
|
+
app.get("/v1/workspaces/:workspaceId/site-limit-profile", async (context) => {
|
|
446
|
+
requireSitesDomain(deps.settings);
|
|
447
|
+
const grant = await requireAccessGrant(
|
|
448
|
+
context,
|
|
449
|
+
deps,
|
|
450
|
+
context.req.param("workspaceId")!,
|
|
451
|
+
"workspace:read",
|
|
452
|
+
);
|
|
453
|
+
const stored = await getWorkspaceSiteLimitProfile(deps.db, {
|
|
454
|
+
accountId: grant.accountId,
|
|
455
|
+
workspaceId: grant.workspaceId,
|
|
456
|
+
});
|
|
457
|
+
return context.json({
|
|
458
|
+
profile: sourceSiteLimitProfile(null, stored),
|
|
459
|
+
effectiveLimits: effectiveSiteLimits(deps.settings, null, stored),
|
|
460
|
+
});
|
|
461
|
+
});
|
|
462
|
+
|
|
463
|
+
app.put("/v1/workspaces/:workspaceId/site-limit-profile", async (context) => {
|
|
464
|
+
requireSitesDomain(deps.settings);
|
|
465
|
+
const grant = await requireAccessGrant(
|
|
466
|
+
context,
|
|
467
|
+
deps,
|
|
468
|
+
context.req.param("workspaceId")!,
|
|
469
|
+
"workspace:admin",
|
|
470
|
+
);
|
|
471
|
+
if (!hasLiteralPermission(grant.permissions, "workspace:admin"))
|
|
472
|
+
throw sitePublishingError(
|
|
473
|
+
403,
|
|
474
|
+
"forbidden",
|
|
475
|
+
"site_admin_required",
|
|
476
|
+
"Only a workspace admin can change Site limits",
|
|
477
|
+
);
|
|
478
|
+
await requireSitePublicationWriter(deps, grant);
|
|
479
|
+
const request = await body(context, SiteLimitProfile);
|
|
480
|
+
const stored = await putWorkspaceSiteLimitProfile(
|
|
481
|
+
deps.db,
|
|
482
|
+
{ accountId: grant.accountId, workspaceId: grant.workspaceId },
|
|
483
|
+
{
|
|
484
|
+
kind: storedSiteLimitProfileKind(request.kind),
|
|
485
|
+
overrides:
|
|
486
|
+
request.kind === "custom"
|
|
487
|
+
? (siteLimitOverrides(request.overrides as Record<string, unknown> | null) as Record<
|
|
488
|
+
string,
|
|
489
|
+
unknown
|
|
490
|
+
>)
|
|
491
|
+
: null,
|
|
492
|
+
},
|
|
493
|
+
grant.subjectId,
|
|
494
|
+
);
|
|
495
|
+
await recordAuditEvent(deps.db, {
|
|
496
|
+
accountId: grant.accountId,
|
|
497
|
+
workspaceId: grant.workspaceId,
|
|
498
|
+
subjectId: grant.subjectId,
|
|
499
|
+
action: "site.limit_profile.update",
|
|
500
|
+
targetType: "workspace",
|
|
501
|
+
targetId: grant.workspaceId,
|
|
502
|
+
metadata: { kind: stored.kind },
|
|
503
|
+
});
|
|
504
|
+
return context.json({
|
|
505
|
+
profile: sourceSiteLimitProfile(null, stored),
|
|
506
|
+
effectiveLimits: effectiveSiteLimits(deps.settings, null, stored),
|
|
507
|
+
});
|
|
508
|
+
});
|
|
509
|
+
|
|
510
|
+
/**
|
|
511
|
+
* Viewer sign-in, step one: the signed-in person on the console's
|
|
512
|
+
* `/site-auth/authorize` page asks for a one-time code for a Site host. The
|
|
513
|
+
* API checks the Site admits them, then binds a 60 s single-use code to the
|
|
514
|
+
* host, the PKCE challenge, the exact redirect and the person.
|
|
515
|
+
*/
|
|
516
|
+
app.post("/v1/site-auth/authorize", async (context) => {
|
|
517
|
+
const domain = requireSitesDomain(deps.settings);
|
|
518
|
+
const request = await body(context, SiteAuthAuthorizeRequest);
|
|
519
|
+
const person = await siteAuthPerson(context, deps);
|
|
520
|
+
const notFound = () =>
|
|
521
|
+
sitePublishingError(404, "not_found", "site_not_found", "This Site is not available");
|
|
522
|
+
const label = parseSiteHostname(request.host, domain);
|
|
523
|
+
if (!label) throw notFound();
|
|
524
|
+
const hostname = siteHostname(label, domain);
|
|
525
|
+
const record = await findSiteHostname(deps.db, label);
|
|
526
|
+
if (!record || record.releasedAt !== null) throw notFound();
|
|
527
|
+
const scope = { accountId: record.accountId, workspaceId: record.workspaceId };
|
|
528
|
+
const [publication, site] = await Promise.all([
|
|
529
|
+
getSitePublication(deps.db, scope, record.siteId),
|
|
530
|
+
getPublishedSite(deps.db, scope, record.siteId),
|
|
531
|
+
]);
|
|
532
|
+
if (!publication || !site || publication.status !== "active" || !siteServable(site))
|
|
533
|
+
throw notFound();
|
|
534
|
+
if (request.redirectUri !== `https://${hostname}${SITE_GATEWAY_CALLBACK_PATH}`)
|
|
535
|
+
throw invalid("redirectUri must be this Site's sign-in callback");
|
|
536
|
+
const kind = signedInSiteViewerKind({
|
|
537
|
+
access: effectiveSiteAccess(publication.access, deps.settings),
|
|
538
|
+
member: await isSiteWorkspaceMember(deps.db, scope, person.subjectId),
|
|
539
|
+
email: person.email,
|
|
540
|
+
invitedEmails: publication.invitedEmails,
|
|
541
|
+
});
|
|
542
|
+
if (!kind)
|
|
543
|
+
throw sitePublishingError(
|
|
544
|
+
403,
|
|
545
|
+
"forbidden",
|
|
546
|
+
"site_access_denied",
|
|
547
|
+
"You do not have access to this Site",
|
|
548
|
+
);
|
|
549
|
+
const rate = await consumeSiteRuntimeRate(deps.db, scope, {
|
|
550
|
+
siteId: site.id,
|
|
551
|
+
principal: person.subjectId,
|
|
552
|
+
bucket: "sign_in",
|
|
553
|
+
limit: SIGN_IN_PER_MINUTE,
|
|
554
|
+
});
|
|
555
|
+
if (!rate.allowed) {
|
|
556
|
+
context.header("retry-after", String(rate.retryAfterSeconds));
|
|
557
|
+
throw sitePublishingError(429, "limit_exceeded", "site_rate_limited", "Try again shortly", {
|
|
558
|
+
retryAfterSeconds: rate.retryAfterSeconds,
|
|
559
|
+
});
|
|
560
|
+
}
|
|
561
|
+
const code = randomBytes(32).toString("base64url");
|
|
562
|
+
await createSiteAuthCode(deps.db, scope, {
|
|
563
|
+
siteId: site.id,
|
|
564
|
+
codeHash: createHash("sha256").update(code).digest("hex"),
|
|
565
|
+
hostname,
|
|
566
|
+
codeChallenge: request.codeChallenge,
|
|
567
|
+
redirectUri: request.redirectUri,
|
|
568
|
+
subjectId: person.subjectId,
|
|
569
|
+
kind,
|
|
570
|
+
email: person.email,
|
|
571
|
+
displayName: person.name,
|
|
572
|
+
ttlSeconds: SITE_AUTH_CODE_TTL_SECONDS,
|
|
573
|
+
});
|
|
574
|
+
const redirect = new URL(request.redirectUri);
|
|
575
|
+
redirect.searchParams.set("code", code);
|
|
576
|
+
redirect.searchParams.set("state", request.state);
|
|
577
|
+
context.header("cache-control", "no-store");
|
|
578
|
+
const response: SiteAuthAuthorizeResponse = {
|
|
579
|
+
redirectTo: redirect.toString(),
|
|
580
|
+
site: { title: site.title, hostname },
|
|
581
|
+
};
|
|
582
|
+
return context.json(response);
|
|
583
|
+
});
|
|
584
|
+
}
|