@opengeni/api-router 3.0.1 → 3.0.2-canary.38894290271001
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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-AJ62T5QN.js → chunk-GBUJ2DYZ.js} +80507 -39878
- package/dist/chunk-GBUJ2DYZ.js.map +1 -0
- package/dist/chunk-OGQDXVXY.js +18 -0
- package/dist/chunk-OGQDXVXY.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 +150 -49
- 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
|
@@ -1,16 +1,39 @@
|
|
|
1
|
+
import type { AccessGrant } from "@opengeni/contracts";
|
|
2
|
+
import { SITE_PREVIEW_FRAME, type SiteFrameHeaders } from "@opengeni/contracts/site-session-http";
|
|
1
3
|
import { getWorkspaceSiteSessionOrigin, WorkspaceArtifactNotFoundError } from "@opengeni/db";
|
|
2
|
-
import
|
|
4
|
+
import {
|
|
5
|
+
currentSiteSessionOrigin,
|
|
6
|
+
siteViewerForGrant,
|
|
7
|
+
withSiteSessionOrigin,
|
|
8
|
+
type ApiRouteDeps,
|
|
9
|
+
type SiteSessionOrigin,
|
|
10
|
+
} from "@opengeni/core";
|
|
3
11
|
import { HTTPException } from "hono/http-exception";
|
|
4
12
|
import { z } from "zod";
|
|
5
13
|
|
|
6
|
-
|
|
14
|
+
const FRAME_ID = /^[A-Za-z0-9_-]{1,64}$/u;
|
|
15
|
+
|
|
16
|
+
/** The host-set frame marker and per-frame id a Site request carried. */
|
|
17
|
+
export type SiteFrameMarker = {
|
|
18
|
+
marker?: string | null | undefined;
|
|
19
|
+
frameId?: string | null | undefined;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Validates a host-asserted Site association, not browser execution or
|
|
24
|
+
* authority. A published Site (id and version) must be visible to the caller.
|
|
25
|
+
* A request carrying only the host's frame marker came from a frame without a
|
|
26
|
+
* published Site (inline HTML, a Codemode preview): it is recorded as that
|
|
27
|
+
* frame (`siteId: null`, `frame`, `frameId`), never as a published Site.
|
|
28
|
+
*/
|
|
7
29
|
export async function resolveSiteSessionOrigin(
|
|
8
30
|
db: ApiRouteDeps["db"],
|
|
9
|
-
|
|
31
|
+
grant: AccessGrant,
|
|
10
32
|
siteId?: string,
|
|
11
33
|
versionId?: string,
|
|
12
|
-
|
|
13
|
-
|
|
34
|
+
frame?: SiteFrameMarker,
|
|
35
|
+
): Promise<SiteSessionOrigin | null> {
|
|
36
|
+
if (!siteId && !versionId) return frameOnlyOrigin(frame);
|
|
14
37
|
if (
|
|
15
38
|
!z.string().uuid().safeParse(siteId).success ||
|
|
16
39
|
!z.string().uuid().safeParse(versionId).success
|
|
@@ -19,10 +42,72 @@ export async function resolveSiteSessionOrigin(
|
|
|
19
42
|
try {
|
|
20
43
|
// Provenance is not a live-version fence: a response-loss retry still belongs
|
|
21
44
|
// to the same Site after it publishes a new version or is archived.
|
|
22
|
-
|
|
45
|
+
const origin = await getWorkspaceSiteSessionOrigin(
|
|
46
|
+
db,
|
|
47
|
+
grant.workspaceId,
|
|
48
|
+
await siteViewerForGrant(db, grant),
|
|
49
|
+
siteId!,
|
|
50
|
+
versionId!,
|
|
51
|
+
);
|
|
52
|
+
// Absence is reported by the not-found error; a fixture database may answer null.
|
|
53
|
+
return origin ? { siteId: origin.siteId, title: origin.title, versionId: versionId! } : null;
|
|
23
54
|
} catch (error) {
|
|
24
55
|
if (error instanceof WorkspaceArtifactNotFoundError)
|
|
25
56
|
throw new HTTPException(404, { message: "Site origin not found" });
|
|
26
57
|
throw error;
|
|
27
58
|
}
|
|
28
59
|
}
|
|
60
|
+
|
|
61
|
+
function frameOnlyOrigin(frame: SiteFrameMarker | undefined): SiteSessionOrigin | null {
|
|
62
|
+
if (!frame?.marker) return null;
|
|
63
|
+
const frameId = frame.frameId && FRAME_ID.test(frame.frameId) ? frame.frameId : undefined;
|
|
64
|
+
return {
|
|
65
|
+
siteId: null,
|
|
66
|
+
title: "",
|
|
67
|
+
frame: frame.marker === SITE_PREVIEW_FRAME ? "preview" : "inline",
|
|
68
|
+
...(frameId ? { frameId } : {}),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* The strict origin of a request a host marked as coming from a Site frame:
|
|
74
|
+
* an unverifiable published Site fails the request (400/404) instead of
|
|
75
|
+
* running it without provenance.
|
|
76
|
+
*/
|
|
77
|
+
export async function resolveSiteRequestOrigin(
|
|
78
|
+
db: ApiRouteDeps["db"],
|
|
79
|
+
grant: AccessGrant,
|
|
80
|
+
frame: SiteFrameHeaders,
|
|
81
|
+
): Promise<SiteSessionOrigin> {
|
|
82
|
+
const origin = await resolveSiteSessionOrigin(
|
|
83
|
+
db,
|
|
84
|
+
grant,
|
|
85
|
+
frame.siteId ?? undefined,
|
|
86
|
+
frame.versionId ?? undefined,
|
|
87
|
+
{ marker: frame.marker ?? "1", frameId: frame.frameId },
|
|
88
|
+
);
|
|
89
|
+
// Unreachable: a frame always resolves to a published Site or a frame origin.
|
|
90
|
+
if (!origin) throw new HTTPException(400, { message: "Invalid Site origin" });
|
|
91
|
+
return origin;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Run a follow-up command (Send or Steer) inside the request's Site scope when
|
|
96
|
+
* the published Site bridge supplied a valid origin, so its turn records the
|
|
97
|
+
* `site` surface. Provenance only: a missing or unverifiable origin leaves the
|
|
98
|
+
* command unscoped instead of rejecting a message that is otherwise valid.
|
|
99
|
+
* Requests a host marked as Site frames already run inside their validated
|
|
100
|
+
* origin (apps/api/src/site-frame-guard.ts), which this keeps.
|
|
101
|
+
*/
|
|
102
|
+
export async function withOptionalSiteCommandOrigin<T>(
|
|
103
|
+
db: ApiRouteDeps["db"],
|
|
104
|
+
grant: AccessGrant,
|
|
105
|
+
siteId: string | undefined,
|
|
106
|
+
versionId: string | undefined,
|
|
107
|
+
run: () => Promise<T>,
|
|
108
|
+
): Promise<T> {
|
|
109
|
+
if (currentSiteSessionOrigin()) return await run();
|
|
110
|
+
if (!siteId && !versionId) return await run();
|
|
111
|
+
const origin = await resolveSiteSessionOrigin(db, grant, siteId, versionId).catch(() => null);
|
|
112
|
+
return origin ? await withSiteSessionOrigin(origin, run) : await run();
|
|
113
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import {
|
|
2
|
+
quoteSiteSqlIdentifier,
|
|
3
|
+
type SiteDbSchemaEntry,
|
|
4
|
+
type SiteSqlValue,
|
|
5
|
+
} from "@opengeni/contracts";
|
|
6
|
+
import { siteDataCsvCell } from "../site-data/operations";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Site SQL export and import formats, so a Site's data can always leave
|
|
10
|
+
* Cloudflare: a SQL dump (schema, then INSERT statements), CSV for one table,
|
|
11
|
+
* and JSON rows per table. Blobs travel as `{ "$base64": "..." }` in JSON,
|
|
12
|
+
* X'..' literals in SQL and base64 text in CSV. SQL and JSON keep every value
|
|
13
|
+
* as stored; CSV turns every value into text (an empty cell is NULL on
|
|
14
|
+
* import) and blobs into base64.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
export type SiteSqlExportTable = { name: string; columns: string[]; rows: unknown[][] };
|
|
18
|
+
|
|
19
|
+
/** Rows per INSERT statement of a SQL dump. */
|
|
20
|
+
export const SITE_SQL_INSERT_ROWS = 500;
|
|
21
|
+
/**
|
|
22
|
+
* Most bytes per INSERT statement of a SQL dump: Durable Object SQLite
|
|
23
|
+
* refuses statements over 100 KB. A single row past this still gets its own
|
|
24
|
+
* statement (and needs a JSON import to load back).
|
|
25
|
+
*/
|
|
26
|
+
export const SITE_SQL_INSERT_BYTES = 90_000;
|
|
27
|
+
|
|
28
|
+
function isBlob(value: unknown): value is { $base64: string } {
|
|
29
|
+
return (
|
|
30
|
+
typeof value === "object" &&
|
|
31
|
+
value !== null &&
|
|
32
|
+
typeof (value as { $base64?: unknown }).$base64 === "string"
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** One value as a SQLite literal. */
|
|
37
|
+
export function siteSqlLiteral(value: unknown): string {
|
|
38
|
+
if (value === null || value === undefined) return "NULL";
|
|
39
|
+
if (typeof value === "number") return Number.isFinite(value) ? String(value) : "NULL";
|
|
40
|
+
if (typeof value === "bigint") return value.toString();
|
|
41
|
+
if (typeof value === "boolean") return value ? "1" : "0";
|
|
42
|
+
if (isBlob(value)) return `X'${Buffer.from(value.$base64, "base64").toString("hex")}'`;
|
|
43
|
+
const text = typeof value === "string" ? value : JSON.stringify(value);
|
|
44
|
+
return `'${text.replaceAll("'", "''")}'`;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** Schema entries that belong to one table (its own entry, its indexes and triggers), or all. */
|
|
48
|
+
export function siteSqlSchemaEntries(
|
|
49
|
+
schema: readonly SiteDbSchemaEntry[],
|
|
50
|
+
table?: string,
|
|
51
|
+
): SiteDbSchemaEntry[] {
|
|
52
|
+
return table === undefined ? [...schema] : schema.filter((entry) => entry.table === table);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** The schema statements of a dump, tables first, each ending with a semicolon. */
|
|
56
|
+
export function siteSqlSchemaStatements(schema: readonly SiteDbSchemaEntry[]): string[] {
|
|
57
|
+
const order = { table: 0, view: 1, index: 2, trigger: 3 } as const;
|
|
58
|
+
return [...schema]
|
|
59
|
+
.filter((entry) => entry.sql)
|
|
60
|
+
.sort((a, b) => order[a.type] - order[b.type])
|
|
61
|
+
.map((entry) => `${entry.sql!.trim().replace(/;+$/u, "")};`);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* INSERT statements for one exported page of a table: up to
|
|
66
|
+
* SITE_SQL_INSERT_ROWS rows and SITE_SQL_INSERT_BYTES bytes each, one
|
|
67
|
+
* statement per line.
|
|
68
|
+
*/
|
|
69
|
+
export function siteSqlInsertStatements(table: SiteSqlExportTable): string[] {
|
|
70
|
+
if (table.rows.length === 0) return [];
|
|
71
|
+
const columns = table.columns.map(quoteSiteSqlIdentifier).join(", ");
|
|
72
|
+
const head = `INSERT INTO ${quoteSiteSqlIdentifier(table.name)} (${columns}) VALUES `;
|
|
73
|
+
const headBytes = Buffer.byteLength(head, "utf8") + 1;
|
|
74
|
+
const statements: string[] = [];
|
|
75
|
+
let tuples: string[] = [];
|
|
76
|
+
let bytes = headBytes;
|
|
77
|
+
for (const row of table.rows) {
|
|
78
|
+
const tuple = `(${row.map(siteSqlLiteral).join(", ")})`;
|
|
79
|
+
const size = Buffer.byteLength(tuple, "utf8") + 2;
|
|
80
|
+
if (
|
|
81
|
+
tuples.length > 0 &&
|
|
82
|
+
(tuples.length >= SITE_SQL_INSERT_ROWS || bytes + size > SITE_SQL_INSERT_BYTES)
|
|
83
|
+
) {
|
|
84
|
+
statements.push(`${head}${tuples.join(", ")};`);
|
|
85
|
+
tuples = [];
|
|
86
|
+
bytes = headBytes;
|
|
87
|
+
}
|
|
88
|
+
tuples.push(tuple);
|
|
89
|
+
bytes += size;
|
|
90
|
+
}
|
|
91
|
+
if (tuples.length > 0) statements.push(`${head}${tuples.join(", ")};`);
|
|
92
|
+
return statements;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** A CSV cell for an exported value (formula-safe, like Site Data exports). */
|
|
96
|
+
export function siteSqlCsvCell(value: unknown): string {
|
|
97
|
+
if (isBlob(value)) return siteDataCsvCell(value.$base64);
|
|
98
|
+
return siteDataCsvCell(value);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export function siteSqlCsvLine(values: readonly unknown[]): string {
|
|
102
|
+
return values.map(siteSqlCsvCell).join(",");
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/** Rows as objects keyed by column, for JSON exports. */
|
|
106
|
+
export function siteSqlRowObjects(table: SiteSqlExportTable): Array<Record<string, unknown>> {
|
|
107
|
+
return table.rows.map((row) =>
|
|
108
|
+
Object.fromEntries(table.columns.map((column, index) => [column, row[index] ?? null])),
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Rows of a JSON import as column lists and value rows: the columns are every
|
|
114
|
+
* key any row uses, in first-seen order; a missing key is NULL.
|
|
115
|
+
*/
|
|
116
|
+
export function siteSqlImportRows(rows: ReadonlyArray<Record<string, SiteSqlValue>>): {
|
|
117
|
+
columns: string[];
|
|
118
|
+
values: SiteSqlValue[][];
|
|
119
|
+
} {
|
|
120
|
+
const columns: string[] = [];
|
|
121
|
+
const seen = new Set<string>();
|
|
122
|
+
for (const row of rows)
|
|
123
|
+
for (const key of Object.keys(row))
|
|
124
|
+
if (!seen.has(key)) {
|
|
125
|
+
seen.add(key);
|
|
126
|
+
columns.push(key);
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
columns,
|
|
130
|
+
values: rows.map((row) =>
|
|
131
|
+
columns.map((column) => (Object.hasOwn(row, column) ? (row[column] ?? null) : null)),
|
|
132
|
+
),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { createHash, createHmac } from "node:crypto";
|
|
2
|
+
import {
|
|
3
|
+
SITE_GATEWAY_SIGNATURE_HEADER,
|
|
4
|
+
SITE_GATEWAY_SIGNATURE_VERSION,
|
|
5
|
+
SITE_GATEWAY_TIMESTAMP_HEADER,
|
|
6
|
+
siteDbInternalPath,
|
|
7
|
+
siteGatewayCanonicalString,
|
|
8
|
+
type SiteDbErrorBody,
|
|
9
|
+
type SiteDbOperation,
|
|
10
|
+
} from "@opengeni/contracts";
|
|
11
|
+
import type { Settings } from "@opengeni/config";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* The API's client for a Site's Durable Object, through the Site gateway's
|
|
15
|
+
* internal route (`POST <origin>/_og/internal/site-db/<siteId>/<operation>`).
|
|
16
|
+
* Requests are signed like gateway -> API requests, in the other direction:
|
|
17
|
+
* HMAC-SHA256 with the shared gateway secret over `siteGatewayCanonicalString`
|
|
18
|
+
* (the internal path, the gateway's host, the body digest and the time; no
|
|
19
|
+
* viewer fields). Every request names a fresh id the Durable Object refuses
|
|
20
|
+
* to see twice. Nothing here decides who may do what: the service does that
|
|
21
|
+
* before calling.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
export type SiteSqlGatewayConfig = {
|
|
25
|
+
origin: string;
|
|
26
|
+
secret: string;
|
|
27
|
+
timeoutMs: number;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export type SiteSqlGatewaySettings = Pick<
|
|
31
|
+
Settings,
|
|
32
|
+
| "sitesCloudflareStorageEnabled"
|
|
33
|
+
| "sitesGatewayInternalOrigin"
|
|
34
|
+
| "sitesGatewaySecret"
|
|
35
|
+
| "sitesSqlTimeoutMs"
|
|
36
|
+
>;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* The gateway to call, or null when no gateway origin and secret are
|
|
40
|
+
* configured. This alone lets the API reach Durable Objects that already
|
|
41
|
+
* exist (export, inspect, dropping data); offering Site SQL also needs the
|
|
42
|
+
* flag (siteSqlOffered).
|
|
43
|
+
*/
|
|
44
|
+
export function siteSqlGatewayConfig(
|
|
45
|
+
settings: SiteSqlGatewaySettings,
|
|
46
|
+
): SiteSqlGatewayConfig | null {
|
|
47
|
+
if (!settings.sitesGatewayInternalOrigin || !settings.sitesGatewaySecret) return null;
|
|
48
|
+
return {
|
|
49
|
+
origin: new URL(settings.sitesGatewayInternalOrigin).origin,
|
|
50
|
+
secret: settings.sitesGatewaySecret,
|
|
51
|
+
timeoutMs: settings.sitesSqlTimeoutMs,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Whether this deployment offers Site SQL: the flag is on and the gateway is
|
|
57
|
+
* configured. Turning it on, migrating, rebuilding, importing and running
|
|
58
|
+
* SQL need this; export, inspect and dropping a database only need the
|
|
59
|
+
* gateway.
|
|
60
|
+
*/
|
|
61
|
+
export function siteSqlOffered(settings: SiteSqlGatewaySettings): boolean {
|
|
62
|
+
return settings.sitesCloudflareStorageEnabled && siteSqlGatewayConfig(settings) !== null;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** A refusal or failure from the gateway or the Durable Object. */
|
|
66
|
+
export class SiteDbCallError extends Error {
|
|
67
|
+
constructor(
|
|
68
|
+
readonly status: number,
|
|
69
|
+
readonly code: string,
|
|
70
|
+
message: string,
|
|
71
|
+
/** True when the operation may have run (a timeout or lost response). */
|
|
72
|
+
readonly outcomeUnknown = false,
|
|
73
|
+
) {
|
|
74
|
+
super(message);
|
|
75
|
+
this.name = "SiteDbCallError";
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export type SiteDbFetch = (input: string, init: RequestInit) => Promise<Response>;
|
|
80
|
+
|
|
81
|
+
/** Sign one internal request. Exported for tests. */
|
|
82
|
+
export function signSiteDbRequest(
|
|
83
|
+
config: Pick<SiteSqlGatewayConfig, "origin" | "secret">,
|
|
84
|
+
siteId: string,
|
|
85
|
+
operation: SiteDbOperation,
|
|
86
|
+
body: string,
|
|
87
|
+
nowSeconds = Math.floor(Date.now() / 1000),
|
|
88
|
+
): { url: string; headers: Record<string, string> } {
|
|
89
|
+
const path = siteDbInternalPath(siteId, operation);
|
|
90
|
+
const url = new URL(path, config.origin);
|
|
91
|
+
const canonical = siteGatewayCanonicalString({
|
|
92
|
+
method: "POST",
|
|
93
|
+
host: url.host,
|
|
94
|
+
pathWithQuery: url.pathname,
|
|
95
|
+
timestamp: nowSeconds,
|
|
96
|
+
bodySha256: createHash("sha256").update(body).digest("hex"),
|
|
97
|
+
session: "",
|
|
98
|
+
visitor: "",
|
|
99
|
+
clientIp: "",
|
|
100
|
+
human: "",
|
|
101
|
+
});
|
|
102
|
+
const mac = createHmac("sha256", config.secret).update(canonical).digest("base64url");
|
|
103
|
+
return {
|
|
104
|
+
url: url.toString(),
|
|
105
|
+
headers: {
|
|
106
|
+
"content-type": "application/json",
|
|
107
|
+
[SITE_GATEWAY_TIMESTAMP_HEADER]: String(nowSeconds),
|
|
108
|
+
[SITE_GATEWAY_SIGNATURE_HEADER]: `${SITE_GATEWAY_SIGNATURE_VERSION}=${mac}`,
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** Read-only operations: a lost response cannot have changed anything. */
|
|
114
|
+
const READ_ONLY: ReadonlySet<SiteDbOperation> = new Set(["inspect", "export"]);
|
|
115
|
+
|
|
116
|
+
/** Call one Durable Object operation and return its JSON. */
|
|
117
|
+
export async function callSiteDb<T>(
|
|
118
|
+
config: SiteSqlGatewayConfig,
|
|
119
|
+
siteId: string,
|
|
120
|
+
operation: SiteDbOperation,
|
|
121
|
+
payload: Record<string, unknown>,
|
|
122
|
+
fetchImpl: SiteDbFetch = fetch,
|
|
123
|
+
): Promise<T> {
|
|
124
|
+
const body = JSON.stringify({ requestId: crypto.randomUUID(), ...payload });
|
|
125
|
+
const signed = signSiteDbRequest(config, siteId, operation, body);
|
|
126
|
+
let response: Response;
|
|
127
|
+
try {
|
|
128
|
+
response = await fetchImpl(signed.url, {
|
|
129
|
+
method: "POST",
|
|
130
|
+
headers: signed.headers,
|
|
131
|
+
body,
|
|
132
|
+
redirect: "manual",
|
|
133
|
+
signal: AbortSignal.timeout(config.timeoutMs),
|
|
134
|
+
});
|
|
135
|
+
} catch (error) {
|
|
136
|
+
const timedOut = error instanceof DOMException && error.name === "TimeoutError";
|
|
137
|
+
throw new SiteDbCallError(
|
|
138
|
+
503,
|
|
139
|
+
"unavailable",
|
|
140
|
+
timedOut
|
|
141
|
+
? "The Site database did not answer in time"
|
|
142
|
+
: "The Site database is temporarily unavailable",
|
|
143
|
+
!READ_ONLY.has(operation),
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
const text = await response.text();
|
|
147
|
+
let parsed: unknown = null;
|
|
148
|
+
try {
|
|
149
|
+
parsed = text ? JSON.parse(text) : null;
|
|
150
|
+
} catch {
|
|
151
|
+
parsed = null;
|
|
152
|
+
}
|
|
153
|
+
if (response.ok && parsed !== null && typeof parsed === "object") return parsed as T;
|
|
154
|
+
const error = (parsed as Partial<SiteDbErrorBody> | null)?.error;
|
|
155
|
+
const code = typeof error?.code === "string" ? error.code : "unavailable";
|
|
156
|
+
const message =
|
|
157
|
+
typeof error?.message === "string" ? error.message : "The Site database request failed";
|
|
158
|
+
// The gateway's own refusals (signature, missing binding) are configuration
|
|
159
|
+
// problems, not the caller's: report them as unavailable.
|
|
160
|
+
if (response.status === 401 || response.status === 404 || response.status >= 500)
|
|
161
|
+
throw new SiteDbCallError(
|
|
162
|
+
503,
|
|
163
|
+
"unavailable",
|
|
164
|
+
response.status >= 500 ? message : "Site SQL is not reachable on this deployment",
|
|
165
|
+
response.status >= 500 && !READ_ONLY.has(operation),
|
|
166
|
+
);
|
|
167
|
+
throw new SiteDbCallError(response.status, code, message);
|
|
168
|
+
}
|